importorg.trustweave.did.DidMethodimportorg.trustweave.did.DidCreationOptionsimportorg.trustweave.did.identifiers.Didimportorg.trustweave.did.model.DidDocumentimportorg.trustweave.did.resolver.DidResolutionMetadataimportorg.trustweave.did.resolver.DidResolutionResultimportorg.trustweave.kms.KeyManagementServiceclassMyCustomDidMethod(privatevalkms:KeyManagementService,privatevalconfig:MyDidConfig):DidMethod{overridevalmethod:String="mydid"overridesuspendfuncreateDid(options:DidCreationOptions):DidDocument{TODO("See DidKeyMockMethod in testkit for a working createDid implementation")}overridesuspendfunresolveDid(did:Did):DidResolutionResult{valdocument=resolveFromBackend(did)returnif(document!=null){DidResolutionResult.Success(document=document,resolutionMetadata=DidResolutionMetadata(contentType="application/did+json"))}else{DidResolutionResult.Failure.NotFound(did=did)}}overridesuspendfunupdateDid(did:Did,updater:(DidDocument)->DidDocument):DidDocument{valcurrent=when(valr=resolveDid(did)){isDidResolutionResult.Success->r.documentelse->error("DID not found: ${did.value}")}valupdated=updater(current)persistToBackend(did,updated)returnupdated}overridesuspendfundeactivateDid(did:Did):Boolean=deactivateInBackend(did)privatesuspendfunresolveFromBackend(did:Did):DidDocument?=null// your storeprivatesuspendfunpersistToBackend(did:Did,document:DidDocument){/* … */}privatesuspendfundeactivateInBackend(did:Did):Boolean=false}
importorg.trustweave.did.spi.DidMethodProviderimportorg.trustweave.did.*classMyDidMethodProvider:DidMethodProvider{overridevalname:String="my-did-method"overridevalsupportedMethods:List<String>=listOf("mydid")overridefuncreate(method:String,options:DidCreationOptions):DidMethod?{if(method!="mydid")returnnull// Create KMSvalkms=createKms(options)// Create config from optionsvalconfig=MyDidConfig.fromOptions(options)returnMyCustomDidMethod(kms,config)}privatefuncreateKms(options:DidCreationOptions):KeyManagementService{// Create or get KMS instancereturn/* implementation */}}
Registering Provider
Create service file at src/main/resources/META-INF/services/org.trustweave.did.spi.DidMethodProvider:
importorg.trustweave.anchor.*classMyBlockchainAnchorClient(overridevalchainId:String,privatevalconfig:MyBlockchainConfig):BlockchainAnchorClient{overridesuspendfunwritePayload(payload:ByteArray):AnchorResult{// Submit transaction to blockchainvaltxHash=submitTransaction(payload)// Wait for confirmationvalblockHeight=waitForConfirmation(txHash)returnAnchorResult(anchorRef=AnchorRef(chainId=chainId,transactionHash=txHash,metadata=mapOf("blockHeight"toblockHeight,"timestamp"toSystem.currentTimeMillis())),payload=payload)}overridesuspendfunreadPayload(anchorRef:AnchorRef):ByteArray?{// Read transaction from blockchainreturnreadTransaction(anchorRef.transactionHash)}privatesuspendfunsubmitTransaction(payload:ByteArray):String{// Submit to blockchainreturn/* implementation */}privatesuspendfunwaitForConfirmation(txHash:String):Long{// Wait for confirmationreturn/* implementation */}privatesuspendfunreadTransaction(txHash:String):ByteArray?{// Read from blockchainreturn/* implementation */}}
importorg.trustweave.kms.*classMyKeyManagementService(privatevalconfig:MyKmsConfig):KeyManagementService{overridesuspendfungenerateKey(algorithm:Algorithm):Key{// Generate key in your KMSvalkeyId=generateKeyInKms(algorithm)valpublicKey=getPublicKey(keyId)returnKey(id=keyId,algorithm=algorithm,publicKey=publicKey)}overridesuspendfunsign(keyId:String,data:ByteArray):ByteArray{// Sign data using your KMSreturnsignWithKms(keyId,data)}overridesuspendfungetPublicKey(keyId:String):PublicKey{// Get public key from your KMSreturngetPublicKeyFromKms(keyId)}overridesuspendfundeleteKey(keyId:String):Boolean{// Delete key from your KMSreturndeleteKeyFromKms(keyId)}privatesuspendfungenerateKeyInKms(algorithm:Algorithm):String{// Generate in your KMSreturn/* implementation */}privatesuspendfunsignWithKms(keyId:String,data:ByteArray):ByteArray{// Sign with your KMSreturn/* implementation */}privatesuspendfungetPublicKeyFromKms(keyId:String):PublicKey{// Get from your KMSreturn/* implementation */}privatesuspendfundeleteKeyFromKms(keyId:String):Boolean{// Delete from your KMSreturn/* implementation */}}