public static async Task Execute() { Console.WriteLine("Wallet sample -> started"); var firstWalletConfig = "{\"id\":\"my_wallet\"}"; var secondWalletConfig = "{\"id\":\"their_wallet\"}"; var firstWalletCredentials = "{\"key\":\"my_wallet_key\"}"; var secondWalletCredentials = "{\"key\":\"their_wallet_key\"}"; try { // Create and Open First Wallet await WalletUtils.CreateWalletAsync(firstWalletConfig, firstWalletCredentials); using (var firstWallet = await Wallet.OpenWalletAsync(firstWalletConfig, firstWalletCredentials)) { // Create a DID that we will retrieve and compare from imported wallet var myDid = await Did.CreateAndStoreMyDidAsync(firstWallet, "{}"); var path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); var exportConfig = JsonConvert.SerializeObject(new { path = path, key = Guid.NewGuid().ToString() }); await firstWallet.ExportAsync(exportConfig); // Import the exported wallet into a new wallet await Wallet.ImportAsync(secondWalletConfig, secondWalletCredentials, exportConfig); // Open the second wallet using (var secondWallet = await Wallet.OpenWalletAsync(secondWalletConfig, secondWalletCredentials)) { // Retrieve stored key var myKey = await Did.KeyForLocalDidAsync(secondWallet, myDid.Did); // Compare the two keys Debug.Assert(myKey == myDid.VerKey); await secondWallet.CloseAsync(); } // Close wallets await firstWallet.CloseAsync(); File.Delete(path); } } finally { // 11. Delete wallets and Pool ledger config await WalletUtils.DeleteWalletAsync(firstWalletConfig, firstWalletCredentials); await WalletUtils.DeleteWalletAsync(secondWalletConfig, secondWalletCredentials); } Console.WriteLine("Wallet sample -> completed"); }
public static async Task Execute() { Console.Write("Executing non-secrets sample... "); var myWalletConfig = "{\"id\":\"my_wallet\"}"; var myWalletCredentials = "{\"key\":\"my_wallet_key\"}"; try { // Create and Open First Wallet await WalletUtils.CreateWalletAsync(myWalletConfig, myWalletCredentials); using (var myWallet = await Wallet.OpenWalletAsync(myWalletConfig, myWalletCredentials)) { var id = "myRecordId"; var value = "myRecordValue"; var type = "record_type"; var tagsJson = JsonConvert.SerializeObject(new { tagName = "tagValue", tagName2 = "tagValue2" }); var queryJson = JsonConvert.SerializeObject(new { tagName = "tagValue" }); // Add a new record to the wallet await NonSecrets.AddRecordAsync(myWallet, type, id, value, tagsJson); // Retrieve the record by type and id var recordJson = await NonSecrets.GetRecordAsync(myWallet, type, id, "{}"); var record = JObject.Parse(recordJson); Debug.Assert(record["id"].ToObject <string>() == id); Debug.Assert(record["value"].ToObject <string>() == value); // Open wallet search inside using statement to properly dispose and close the search handle using (var walletSearch = await NonSecrets.OpenSearchAsync(myWallet, type, queryJson, "{}")) { // Invoke fetch next records var searchJson = await walletSearch.NextAsync(myWallet, 5); var search = JObject.Parse(searchJson); // There should be one record returned Debug.Assert(search["records"].ToObject <JObject[]>().Length == 1); } // Close wallets await myWallet.CloseAsync(); } Console.WriteLine("OK", Color.Green); } catch (Exception e) { Console.WriteLine($"Error: {e.Message}", Color.Red); } finally { // Delete wallets await WalletUtils.DeleteWalletAsync(myWalletConfig, myWalletCredentials); } }
public async Task Cleanup() { await wallet.CloseAsync(); await pool.CloseAsync(); await WalletUtils.DeleteWalletAsync(myWalletName, null); await PoolUtils.DeletePoolLedgerConfigAsync(PoolUtils.DEFAULT_POOL_NAME); }
public static async Task Execute() { Console.WriteLine("Ledger sample -> started"); var myWalletName = "myWallet"; var theirWalletName = "theirWallet"; try { //1. Create and Open Pool await PoolUtils.CreatePoolLedgerConfig(); //2. Create and Open My Wallet await WalletUtils.CreateWalleatAsync(PoolUtils.DEFAULT_POOL_NAME, myWalletName, "default", null, null); // 3. Create and Open Trustee Wallet await WalletUtils.CreateWalleatAsync(PoolUtils.DEFAULT_POOL_NAME, theirWalletName, "default", null, null); //4. Open pool and wallets in using statements to ensure they are closed when finished. using (var pool = await Pool.OpenPoolLedgerAsync(PoolUtils.DEFAULT_POOL_NAME, "{}")) using (var myWallet = await Wallet.OpenWalletAsync(myWalletName, null, null)) using (var theirWallet = await Wallet.OpenWalletAsync(theirWalletName, null, null)) { //5. Create My Did var createMyDidResult = await Signus.CreateAndStoreMyDidAsync(myWallet, "{}"); //6. Create Their Did var createTheirDidResult = await Signus.CreateAndStoreMyDidAsync(theirWallet, "{}"); var theirDid = createTheirDidResult.Did; var theirVerkey = createTheirDidResult.VerKey; //7. Store Their DID var identityJson = string.Format("{{\"did\":\"{0}\", \"verkey\":\"{1}\"}}", theirDid, theirVerkey); await Signus.StoreTheirDidAsync(myWallet, identityJson); //8. Their sign message var msgBytes = Encoding.UTF8.GetBytes("{\n" + " \"reqId\":1495034346617224651,\n" + " \"identifier\":\"GJ1SzoWzavQYfNL9XkaJdrQejfztN4XqdsiV4ct3LXKL\",\n" + " \"operation\":{\n" + " \"type\":\"1\",\n" + " \"dest\":\"4efZu2SXufS556yss7W5k6Po37jt4371RM4whbPKBKdB\"\n" + " }\n" + "}"); var signatureBytes = await Signus.SignAsync(theirWallet, theirDid, msgBytes); //9. Verify message var valid = await Signus.VerifySignatureAsync(myWallet, pool, theirDid, msgBytes, signatureBytes); Debug.Assert(valid == true); //10. Close wallets and pool await myWallet.CloseAsync(); await theirWallet.CloseAsync(); await pool.CloseAsync(); } } finally { // 12. Delete wallets and Pool ledger config await WalletUtils.DeleteWalletAsync(myWalletName, null); await WalletUtils.DeleteWalletAsync(theirWalletName, null); await PoolUtils.DeletePoolLedgerConfigAsync(PoolUtils.DEFAULT_POOL_NAME); } Console.WriteLine("Ledger sample -> completed"); }
public static async Task Execute() { Console.WriteLine("Anoncreds Revocation sample -> started"); var issuerWalletName = "issuerWallet"; var proverWalletName = "proverWallet"; var issuerWalletCredentials = "{\"key\":\"issuer_wallet_key\"}"; var proverWalletCredentials = "{\"key\":\"prover_wallet_key\"}"; var issuerDid = "NcYxiDXkpYi6ov5FcYDi1e"; var proverDid = "VsKV7grR1BUE29mG2Fm2kX"; try { //1. Create and Open Pool await PoolUtils.CreatePoolLedgerConfig(); //2. Issuer Create and Open Wallet await WalletUtils.CreateWalletAsync(PoolUtils.DEFAULT_POOL_NAME, issuerWalletName, "default", null, issuerWalletCredentials); //3. Prover Create and Open Wallet await WalletUtils.CreateWalletAsync(PoolUtils.DEFAULT_POOL_NAME, proverWalletName, "default", null, proverWalletCredentials); // Open pool and wallets in using statements to ensure they are closed when finished. using (var pool = await Pool.OpenPoolLedgerAsync(PoolUtils.DEFAULT_POOL_NAME, "{}")) using (var issuerWallet = await Wallet.OpenWalletAsync(issuerWalletName, null, issuerWalletCredentials)) using (var proverWallet = await Wallet.OpenWalletAsync(proverWalletName, null, proverWalletCredentials)) { //4. Issuer Creates Credential Schema var schemaName = "gvt"; var schemaVersion = "1.0"; var schemaAttributes = "[\"name\", \"age\", \"sex\", \"height\"]"; var createSchemaResult = await AnonCreds.IssuerCreateSchemaAsync(issuerDid, schemaName, schemaVersion, schemaAttributes); var schemaId = createSchemaResult.SchemaId; var schemaJson = createSchemaResult.SchemaJson; //5. Issuer create Credential Definition var credDefTag = "Tag1"; var credDefConfigJson = "{\"support_revocation\":true}"; var createCredDefResult = await AnonCreds.IssuerCreateAndStoreCredentialDefAsync(issuerWallet, issuerDid, schemaJson, credDefTag, null, credDefConfigJson); var credDefId = createCredDefResult.CredDefId; var credDefJson = createCredDefResult.CredDefJson; //6. Issuer create Revocation Registry var revRegDefConfig = "{\"issuance_type\":\"ISSUANCE_ON_DEMAND\",\"max_cred_num\":5}"; var tailsWriterConfig = string.Format("{{\"base_dir\":\"{0}\", \"uri_pattern\":\"\"}}", EnvironmentUtils.GetIndyHomePath("tails")).Replace('\\', '/'); var tailsWriter = await BlobStorage.OpenWriterAsync("default", tailsWriterConfig); var revRegDefTag = "Tag2"; var createRevRegResult = await AnonCreds.IssuerCreateAndStoreRevocRegAsync(issuerWallet, issuerDid, null, revRegDefTag, credDefId, revRegDefConfig, tailsWriter); var revRegId = createRevRegResult.RevRegId; var revRegDefJson = createRevRegResult.RevRegDefJson; //7. Prover create Master Secret var masterSecretId = await AnonCreds.ProverCreateMasterSecretAsync(proverWallet, null); //8. Issuer Creates Credential Offer var credOffer = await AnonCreds.IssuerCreateCredentialOfferAsync(issuerWallet, credDefId); //9. Prover Creates Credential Request var createCredReqResult = await AnonCreds.ProverCreateCredentialReqAsync(proverWallet, proverDid, credOffer, credDefJson, masterSecretId); var credReqJson = createCredReqResult.CredentialRequestJson; var credReqMetadataJson = createCredReqResult.CredentialRequestMetadataJson; //10. Issuer open Tails Reader var blobStorageReaderCfg = await BlobStorage.OpenReaderAsync("default", tailsWriterConfig); //11. Issuer create Credential var credValuesJson = "{\n" + " \"sex\": {\"raw\": \"male\", \"encoded\": \"594465709955896723921094925839488742869205008160769251991705001\"},\n" + " \"name\": {\"raw\": \"Alex\", \"encoded\": \"1139481716457488690172217916278103335\"},\n" + " \"height\": {\"raw\": \"175\", \"encoded\": \"175\"},\n" + " \"age\": {\"raw\": \"28\", \"encoded\": \"28\"}\n" + " }"; var createCredentialResult = await AnonCreds.IssuerCreateCredentialAsync(issuerWallet, credOffer, credReqJson, credValuesJson, revRegId, blobStorageReaderCfg); var credential = createCredentialResult.CredentialJson; var revRegDeltaJson = createCredentialResult.RevocRegDeltaJson; var credRevId = createCredentialResult.RevocId; //12. Prover Stores Credential await AnonCreds.ProverStoreCredentialAsync(proverWallet, null, credReqMetadataJson, credential, credDefJson, revRegDefJson); //13. Prover Gets Credentials for Proof Request var proofRequestJson = "{\n" + " \"nonce\":\"123432421212\",\n" + " \"name\":\"proof_req_1\",\n" + " \"version\":\"0.1\", " + " \"requested_attributes\":{" + " \"attr1_referent\":{\"name\":\"name\"}" + " },\n" + " \"requested_predicates\":{" + " \"predicate1_referent\":{\"name\":\"age\",\"p_type\":\">=\",\"p_value\":18}" + " }" + " }"; var credentialsForProofJson = await AnonCreds.ProverGetCredentialsForProofReqAsync(proverWallet, proofRequestJson); var credentials = JObject.Parse(credentialsForProofJson); var credentialsForAttr1 = (JArray)credentials["attrs"]["attr1_referent"]; var credentialsForPredicate1 = (JArray)credentials["predicates"]["predicate1_referent"]; var credIdForAttr1 = credentialsForAttr1[0]["cred_info"]["referent"].ToObject <string>(); var credIdForPred1 = credentialsForPredicate1[0]["cred_info"]["referent"].ToObject <string>(); //14. Prover create RevocationState long timestamp = 100; var revStateJson = await AnonCreds.CreateRevocationStateAsync(blobStorageReaderCfg, revRegDefJson, revRegDeltaJson, timestamp, credRevId); //15. Prover Creates Proof var requestedCredentialsJson = string.Format("{{" + "\"self_attested_attributes\":{{}}," + "\"requested_attributes\":{{\"attr1_referent\":{{\"cred_id\":\"{0}\", \"revealed\":true, \"timestamp\":{1} }}}}," + "\"requested_predicates\":{{\"predicate1_referent\":{{\"cred_id\":\"{2}\", \"timestamp\":{3}}}}}" + "}}", credIdForAttr1, timestamp, credIdForPred1, timestamp); var schemas = string.Format("{{\"{0}\":{1}}}", schemaId, schemaJson); var credentialDefs = string.Format("{{\"{0}\":{1}}}", credDefId, credDefJson); var revStates = string.Format("{{\"{0}\": {{ \"{1}\":{2} }}}}", revRegId, timestamp, revStateJson); var proofJson = await AnonCreds.ProverCreateProofAsync(proverWallet, proofRequestJson, requestedCredentialsJson, masterSecretId, schemas, credentialDefs, revStates); var proof = JObject.Parse(proofJson); //16. Verifier verify Proof var revealedAttr1 = proof["requested_proof"]["revealed_attrs"]["attr1_referent"]; Debug.Assert("Alex" == revealedAttr1["raw"].ToObject <string>()); var revRegDefs = string.Format("{{\"{0}\":{1}}}", revRegId, revRegDefJson); var revRegs = string.Format("{{\"{0}\": {{ \"{1}\":{2} }}}}", revRegId, timestamp, revRegDeltaJson); var valid = await AnonCreds.VerifierVerifyProofAsync(proofRequestJson, proofJson, schemas, credentialDefs, revRegDefs, revRegs); Debug.Assert(valid); await issuerWallet.CloseAsync(); await proverWallet.CloseAsync(); await pool.CloseAsync(); } } finally { //17. Delete wallets and Pool ledger config await WalletUtils.DeleteWalletAsync(issuerWalletName, issuerWalletCredentials); await WalletUtils.DeleteWalletAsync(proverWalletName, proverWalletCredentials); await PoolUtils.DeletePoolLedgerConfigAsync(PoolUtils.DEFAULT_POOL_NAME); } Console.WriteLine("Anoncreds Revocation sample -> completed"); }
public static async Task Execute() { Console.WriteLine("Ledger sample -> started"); var myWalletName = "myWallet"; var theirWalletName = "theirWallet"; var trusteeSeed = "000000000000000000000000Trustee1"; try { // 1. Create ledger config from genesis txn file await PoolUtils.CreatePoolLedgerConfig(); // 2. Create and Open My Wallet await WalletUtils.CreateWalletAsync(PoolUtils.DEFAULT_POOL_NAME, myWalletName, "default", null, null); // 3. Create and Open Trustee Wallet await WalletUtils.CreateWalletAsync(PoolUtils.DEFAULT_POOL_NAME, theirWalletName, "default", null, null); //4. Open pool and wallets in using statements to ensure they are closed when finished. using (var pool = await Pool.OpenPoolLedgerAsync(PoolUtils.DEFAULT_POOL_NAME, "{}")) using (var myWallet = await Wallet.OpenWalletAsync(myWalletName, null, null)) using (var trusteeWallet = await Wallet.OpenWalletAsync(theirWalletName, null, null)) { //5. Create My Did var createMyDidResult = await Did.CreateAndStoreMyDidAsync(myWallet, "{}"); var myDid = createMyDidResult.Did; var myVerkey = createMyDidResult.VerKey; //6. Create Did from Trustee1 seed var theirDidJson = string.Format("{{\"seed\":\"{0}\"}}", trusteeSeed); var createTheirDidResult = await Did.CreateAndStoreMyDidAsync(trusteeWallet, theirDidJson); var trusteeDid = createTheirDidResult.Did; //7. Build Nym Request var nymRequest = await Ledger.BuildNymRequestAsync(trusteeDid, myDid, myVerkey, null, null); //8. Trustee Sign Nym Request var nymResponseJson = await Ledger.SignAndSubmitRequestAsync(pool, trusteeWallet, trusteeDid, nymRequest); var nymResponse = JObject.Parse(nymResponseJson); Debug.Assert(string.Equals(myDid, nymResponse["result"].Value <string>("dest"))); Debug.Assert(string.Equals(myVerkey, nymResponse["result"].Value <string>("verkey"))); //9. Close wallets and pool await myWallet.CloseAsync(); await trusteeWallet.CloseAsync(); await pool.CloseAsync(); } } finally { //10. Delete wallets and Pool ledger config await WalletUtils.DeleteWalletAsync(myWalletName, null); await WalletUtils.DeleteWalletAsync(theirWalletName, null); await PoolUtils.DeletePoolLedgerConfigAsync(PoolUtils.DEFAULT_POOL_NAME); } Console.WriteLine("Ledger sample -> completed"); }
public static async Task Execute() { Console.WriteLine("Anoncreds sample -> started"); var issuerWalletName = "issuerWallet"; var proverWalletName = "proverWallet"; var issuerWalletCredentials = "{\"key\":\"issuer_wallet_key\"}"; var proverWalletCredentials = "{\"key\":\"prover_wallet_key\"}"; var issuerDid = "NcYxiDXkpYi6ov5FcYDi1e"; var proverDid = "VsKV7grR1BUE29mG2Fm2kX"; try { //1. Create and Open Pool await PoolUtils.CreatePoolLedgerConfig(); //2. Issuer Create and Open Wallet await WalletUtils.CreateWalletAsync(PoolUtils.DEFAULT_POOL_NAME, issuerWalletName, "default", null, issuerWalletCredentials); //3. Prover Create and Open Wallet await WalletUtils.CreateWalletAsync(PoolUtils.DEFAULT_POOL_NAME, proverWalletName, "default", null, proverWalletCredentials); // Open pool and wallets in using statements to ensure they are closed when finished. using (var pool = await Pool.OpenPoolLedgerAsync(PoolUtils.DEFAULT_POOL_NAME, "{}")) using (var issuerWallet = await Wallet.OpenWalletAsync(issuerWalletName, null, issuerWalletCredentials)) using (var proverWallet = await Wallet.OpenWalletAsync(proverWalletName, null, proverWalletCredentials)) { //4. Issuer Creates Credential Schema var schemaName = "gvt"; var schemaVersion = "1.0"; var schemaAttributes = "[\"name\", \"age\", \"sex\", \"height\"]"; var createSchemaResult = await AnonCreds.IssuerCreateSchemaAsync(issuerDid, schemaName, schemaVersion, schemaAttributes); var schemaId = createSchemaResult.SchemaId; var schemaJson = createSchemaResult.SchemaJson; //5. Issuer create Credential Definition var credDefTag = "Tag1"; var credDefConfigJson = "{\"support_revocation\":false}"; var createCredDefResult = await AnonCreds.IssuerCreateAndStoreCredentialDefAsync(issuerWallet, issuerDid, schemaJson, credDefTag, null, credDefConfigJson); var credDefId = createCredDefResult.CredDefId; var credDefJson = createCredDefResult.CredDefJson; //6. Prover create Master Secret var masterSecretId = await AnonCreds.ProverCreateMasterSecretAsync(proverWallet, null); //7. Issuer Creates Credential Offer var credOffer = await AnonCreds.IssuerCreateCredentialOfferAsync(issuerWallet, credDefId); //8. Prover Creates Credential Request var createCredReqResult = await AnonCreds.ProverCreateCredentialReqAsync(proverWallet, proverDid, credOffer, credDefJson, masterSecretId); var credReqJson = createCredReqResult.CredentialRequestJson; var credReqMetadataJson = createCredReqResult.CredentialRequestMetadataJson; //9. Issuer create Credential var credValuesJson = "{\n" + " \"sex\": {\"raw\": \"male\", \"encoded\": \"594465709955896723921094925839488742869205008160769251991705001\"},\n" + " \"name\": {\"raw\": \"Alex\", \"encoded\": \"1139481716457488690172217916278103335\"},\n" + " \"height\": {\"raw\": \"175\", \"encoded\": \"175\"},\n" + " \"age\": {\"raw\": \"28\", \"encoded\": \"28\"}\n" + " }"; var createCredentialResult = await AnonCreds.IssuerCreateCredentialAsync(issuerWallet, credOffer, credReqJson, credValuesJson, null, null); var credential = createCredentialResult.CredentialJson; //10. Prover Stores Credential await AnonCreds.ProverStoreCredentialAsync(proverWallet, null, credReqJson, credReqMetadataJson, credential, credDefJson, null); //11. Prover Gets Credentials for Proof Request var proofRequestJson = "{" + " \"nonce\":\"123432421212\",\n" + " \"name\":\"proof_req_1\",\n" + " \"version\":\"0.1\", " + " \"requested_attributes\": {" + " \"attr1_referent\":{\"name\":\"name\"}," + " \"attr2_referent\":{\"name\":\"sex\"}," + " \"attr3_referent\":{\"name\":\"phone\"}" + " }," + " \"requested_predicates\":{" + " \"predicate1_referent\":{\"name\":\"age\",\"p_type\":\">=\",\"p_value\":18}" + " }" + " }"; var credentialsForProofJson = await AnonCreds.ProverGetCredentialsForProofReqAsync(proverWallet, proofRequestJson); var credentialsForProof = JObject.Parse(credentialsForProofJson); var credentialsForAttribute1 = (JArray)credentialsForProof["attrs"]["attr1_referent"]; var credentialsForAttribute2 = (JArray)credentialsForProof["attrs"]["attr2_referent"]; var credentialsForAttribute3 = (JArray)credentialsForProof["attrs"]["attr3_referent"]; var credentialsForPredicate = (JArray)credentialsForProof["predicates"]["predicate1_referent"]; Debug.Assert(credentialsForAttribute1.Count == 1); Debug.Assert(credentialsForAttribute2.Count == 1); Debug.Assert(credentialsForAttribute3.Count == 0); Debug.Assert(credentialsForPredicate.Count == 1); var credentialId = credentialsForAttribute1[0]["cred_info"]["referent"].ToObject <string>(); //12. Prover Creates Proof var selfAttestedValue = "8-800-300"; var requestedCredentialsJson = string.Format( "{{\n" + " \"self_attested_attributes\":{{\"attr3_referent\":\"{0}\"}},\n" + " \"requested_attributes\":{{\"attr1_referent\":{{\"cred_id\":\"{1}\", \"revealed\":true}},\n" + " \"attr2_referent\":{{\"cred_id\":\"{2}\", \"revealed\":false}}}},\n" + " \"requested_predicates\":{{\"predicate1_referent\":{{\"cred_id\":\"{3}\"}}}}\n" + " }}", selfAttestedValue, credentialId, credentialId, credentialId); var schemas = string.Format("{{\"{0}\":{1}}}", schemaId, schemaJson); var credentialDefs = string.Format("{{\"{0}\":{1}}}", credDefId, credDefJson); var revocStates = "{}"; var proofJson = await AnonCreds.ProverCreateProofAsync(proverWallet, proofRequestJson, requestedCredentialsJson, masterSecretId, schemas, credentialDefs, revocStates); var proof = JObject.Parse(proofJson); //13. Verifier verify Proof var revealedAttr1 = proof["requested_proof"]["revealed_attrs"]["attr1_referent"]; Debug.Assert("Alex" == revealedAttr1["raw"].ToObject <string>()); Debug.Assert(null != proof["requested_proof"]["unrevealed_attrs"]["attr2_referent"]["sub_proof_index"]); Debug.Assert(selfAttestedValue == proof["requested_proof"]["self_attested_attrs"]["attr3_referent"].ToObject <string>()); var revocRegDefs = "{}"; var revocRegs = "{}"; var valid = await AnonCreds.VerifierVerifyProofAsync(proofRequestJson, proofJson, schemas, credentialDefs, revocRegDefs, revocRegs); Debug.Assert(valid); //14. Close wallets and pool await issuerWallet.CloseAsync(); await proverWallet.CloseAsync(); await pool.CloseAsync(); } } finally { //15. Delete wallets and Pool ledger config await WalletUtils.DeleteWalletAsync(issuerWalletName, issuerWalletCredentials); await WalletUtils.DeleteWalletAsync(proverWalletName, proverWalletCredentials); await PoolUtils.DeletePoolLedgerConfigAsync(PoolUtils.DEFAULT_POOL_NAME); } Console.WriteLine("Anoncreds sample -> completed"); }
public static async Task Execute() { var issuerWalletName = "issuerWallet"; var proverWalletName = "proverWallet"; try { //1. Create and Open Pool await PoolUtils.CreatePoolLedgerConfig(); //2. Issuer Create and Open Wallet await WalletUtils.CreateWalleatAsync(PoolUtils.DEFAULT_POOL_NAME, issuerWalletName, "default", null, null); //3. Prover Create and Open Wallet await WalletUtils.CreateWalleatAsync(PoolUtils.DEFAULT_POOL_NAME, proverWalletName, "default", null, null); //4. Open pool and wallets in using statements to ensure they are closed when finished. using (var pool = await Pool.OpenPoolLedgerAsync(PoolUtils.DEFAULT_POOL_NAME, "{}")) using (var issuerWallet = await Wallet.OpenWalletAsync(issuerWalletName, null, null)) using (var proverWallet = await Wallet.OpenWalletAsync(proverWalletName, null, null)) { //5. Issuer create ClaimDef var schemaJson = "{\n" + " \"seqNo\":1,\n" + " \"data\": {\n" + " \"name\":\"gvt\",\n" + " \"version\":\"1.0\",\n" + " \"attr_names\":[\"age\",\"sex\",\"height\",\"name\"]\n" + " }\n" + "}"; var issuerDid = "NcYxiDXkpYi6ov5FcYDi1e"; var claimDef = await AnonCreds.IssuerCreateAndStoreClaimDefAsync(issuerWallet, issuerDid, schemaJson, null, false); //6. Prover create Master Secret var masterSecret = "masterSecretName"; await AnonCreds.ProverCreateMasterSecretAsync(proverWallet, masterSecret); //7. Prover store Claim Offer var claimOffer = string.Format("{{\"issuer_did\":\"{0}\", \"schema_seq_no\":{1}}}", issuerDid, 1); await AnonCreds.ProverStoreClaimOfferAsync(proverWallet, claimOffer); //8. Prover get Claim Offers var claimOfferFilter = string.Format("{{\"issuer_did\":\"{0}\"}}", issuerDid); var claimOffersJson = await AnonCreds.ProverGetClaimOffersAsync(proverWallet, claimOfferFilter); var claimOffersObject = JArray.Parse(claimOffersJson); Debug.Assert(claimOffersObject.Count == 1); var claimOfferObject = (JObject)claimOffersObject[0]; var claimOfferJson = claimOfferObject.ToString(); //9. Prover create ClaimReq var proverDid = "BzfFCYk"; var claimReq = await AnonCreds.ProverCreateAndStoreClaimReqAsync(proverWallet, proverDid, claimOfferJson, claimDef, masterSecret); Debug.Assert(claimReq != null); //10. Issuer create Claim var claimAttributesJson = "{\n" + " \"sex\":[\"male\",\"5944657099558967239210949258394887428692050081607692519917050011144233115103\"],\n" + " \"name\":[\"Alex\",\"1139481716457488690172217916278103335\"],\n" + " \"height\":[\"175\",\"175\"],\n" + " \"age\":[\"28\",\"28\"]\n" + "}"; var createClaimResult = await AnonCreds.IssuerCreateClaimAsync(issuerWallet, claimReq, claimAttributesJson, -1); var claimJson = createClaimResult.ClaimJson; //11. Prover store Claim await AnonCreds.ProverStoreClaimAsync(proverWallet, claimJson); //12. Prover gets Claims for Proof Request var proofRequestJson = "{\n" + " \"nonce\":\"123432421212\",\n" + " \"name\":\"proof_req_1\",\n" + " \"version\":\"0.1\",\n" + " \"requested_attrs\":{\"attr1_uuid\":{\"schema_seq_no\":1,\"name\":\"name\"},\n" + " \"attr2_uuid\":{\"schema_seq_no\":1,\"name\":\"sex\"}},\n" + " \"requested_predicates\":{\"predicate1_uuid\":{\"attr_name\":\"age\",\"p_type\":\"GE\",\"value\":18}}\n" + " }"; var claimsForProofJson = await AnonCreds.ProverGetClaimsForProofReqAsync(proverWallet, proofRequestJson); var claimsForProof = JObject.Parse(claimsForProofJson); var claimsForAttribute1 = (JArray)claimsForProof["attrs"]["attr1_uuid"]; var claimsForAttribute2 = (JArray)claimsForProof["attrs"]["attr1_uuid"]; var claimsForPredicate = (JArray)claimsForProof["predicates"]["predicate1_uuid"]; Debug.Assert(claimsForAttribute1.Count == 1); Debug.Assert(claimsForAttribute2.Count == 1); Debug.Assert(claimsForPredicate.Count == 1); var claimUuid = claimsForAttribute1[0].Value <string>("claim_uuid"); //13. Prover create Proof var selfAttestedValue = "yes"; var requestedClaimsJson = string.Format("{{\n" + " \"self_attested_attributes\":{{\"self1\":\"{0}\"}},\n" + " \"requested_attrs\":{{\"attr1_uuid\":[\"{1}\", true],\n" + " \"attr2_uuid\":[\"{2}\", false]}},\n" + " \"requested_predicates\":{{\"predicate1_uuid\":\"{3}\"}}\n" + "}}", selfAttestedValue, claimUuid, claimUuid, claimUuid); var schemasJson = string.Format("{{\"{0}\":{1}}}", claimUuid, schemaJson); var claimDefsJson = string.Format("{{\"{0}\":{1}}}", claimUuid, claimDef); var revocRegsJson = "{}"; var proofJson = await AnonCreds.ProverCreateProofAsync(proverWallet, proofRequestJson, requestedClaimsJson, schemasJson, masterSecret, claimDefsJson, revocRegsJson); var proof = JObject.Parse(proofJson); //14. Verifier verify Proof Debug.Assert(string.Equals("Alex", proof["requested_proof"]["revealed_attrs"]["attr1_uuid"][1].ToString())); Debug.Assert(proof["requested_proof"]["unrevealed_attrs"].Value <string>("attr2_uuid") != null); Debug.Assert(string.Equals(selfAttestedValue, proof["requested_proof"]["self_attested_attrs"].Value <string>("self1"))); var valid = await AnonCreds.VerifierVerifyProofAsync(proofRequestJson, proofJson, schemasJson, claimDefsJson, revocRegsJson); Debug.Assert(valid == true); //15. Close wallets and pool await issuerWallet.CloseAsync(); await proverWallet.CloseAsync(); await pool.CloseAsync(); } } finally { //16. Delete wallets and Pool ledger config await WalletUtils.DeleteWalletAsync(issuerWalletName, null); await WalletUtils.DeleteWalletAsync(proverWalletName, null); await PoolUtils.DeletePoolLedgerConfigAsync(PoolUtils.DEFAULT_POOL_NAME); } Console.WriteLine("Anoncreds sample -> completed"); }
public static async Task Execute() { Console.Write("Executing ledger sample (requires local pool node)... "); var myWalletConfig = "{\"id\":\"my_wallet\"}"; var theirWalletConfig = "{\"id\":\"their_wallet\"}"; var trusteeSeed = "000000000000000000000000Trustee1"; var myWalletCredentials = "{\"key\":\"issuer_wallet_key\"}"; var theirWalletCredentials = "{\"key\":\"prover_wallet_key\"}"; try { // 1. Create ledger config from genesis txn file await PoolUtils.CreatePoolLedgerConfig(); //2. Create and Open My Wallet await WalletUtils.CreateWalletAsync(myWalletConfig, myWalletCredentials); // 3. Create and Open Trustee Wallet await WalletUtils.CreateWalletAsync(theirWalletConfig, theirWalletCredentials); //4. Open pool and wallets in using statements to ensure they are closed when finished. using (var pool = await Pool.OpenPoolLedgerAsync(PoolUtils.DEFAULT_POOL_NAME, "{}")) using (var myWallet = await Wallet.OpenWalletAsync(myWalletConfig, myWalletCredentials)) using (var trusteeWallet = await Wallet.OpenWalletAsync(theirWalletConfig, theirWalletCredentials)) { //5. Create My Did var createMyDidResult = await Did.CreateAndStoreMyDidAsync(myWallet, "{}"); var myDid = createMyDidResult.Did; var myVerkey = createMyDidResult.VerKey; //6. Create Did from Trustee1 seed var theirDidJson = string.Format("{{\"seed\":\"{0}\"}}", trusteeSeed); var createTheirDidResult = await Did.CreateAndStoreMyDidAsync(trusteeWallet, theirDidJson); var trusteeDid = createTheirDidResult.Did; //7. Build Nym Request var nymRequest = await Ledger.BuildNymRequestAsync(trusteeDid, myDid, myVerkey, null, null); //8. Trustee Sign Nym Request var nymResponseJson = await Ledger.SignAndSubmitRequestAsync(pool, trusteeWallet, trusteeDid, nymRequest); var nymResponse = JObject.Parse(nymResponseJson); Debug.Assert(string.Equals(myDid, nymResponse["result"]["txn"]["data"]["dest"].ToObject <string>())); Debug.Assert(string.Equals(myVerkey, nymResponse["result"]["txn"]["data"]["verkey"].ToObject <string>())); //9. Close wallets and pool await myWallet.CloseAsync(); await trusteeWallet.CloseAsync(); await pool.CloseAsync(); } Console.WriteLine("OK", Color.Green); } catch (Exception e) { Console.WriteLine($"Error: {e.Message}", Color.Red); } finally { //10. Delete wallets and Pool ledger config await WalletUtils.DeleteWalletAsync(myWalletConfig, myWalletCredentials); await WalletUtils.DeleteWalletAsync(theirWalletConfig, theirWalletCredentials); await PoolUtils.DeletePoolLedgerConfigAsync(PoolUtils.DEFAULT_POOL_NAME); } }
public static async Task Execute() { Console.Write("Executing crypto sample... "); var myWalletConfig = "{\"id\":\"my_wallet\"}"; var theirWalletConfig = "{\"id\":\"their_wallet\"}"; var myWalletCredentials = "{\"key\":\"my_wallet_key\"}"; var theirWalletCredentials = "{\"key\":\"their_wallet_key\"}"; try { //1. Create and Open Pool await PoolUtils.CreatePoolLedgerConfig(); //2. Create and Open My Wallet await WalletUtils.CreateWalletAsync(myWalletConfig, myWalletCredentials); // 3. Create and Open Trustee Wallet await WalletUtils.CreateWalletAsync(theirWalletConfig, theirWalletCredentials); //4. Open pool and wallets in using statements to ensure they are closed when finished. using (var myWallet = await Wallet.OpenWalletAsync(myWalletConfig, myWalletCredentials)) using (var theirWallet = await Wallet.OpenWalletAsync(theirWalletConfig, theirWalletCredentials)) { //5. Create My Did var createMyDidResult = await Did.CreateAndStoreMyDidAsync(myWallet, "{}"); //6. Create Their Did var createTheirDidResult = await Did.CreateAndStoreMyDidAsync(theirWallet, "{}"); var theirDid = createTheirDidResult.Did; var theirVerkey = createTheirDidResult.VerKey; //7. Store Their DID var identityJson = string.Format("{{\"did\":\"{0}\", \"verkey\":\"{1}\"}}", theirDid, theirVerkey); await Did.StoreTheirDidAsync(myWallet, identityJson); //8. Their sign message var msgBytes = Encoding.UTF8.GetBytes("{\n" + " \"reqId\":1495034346617224651,\n" + " \"identifier\":\"GJ1SzoWzavQYfNL9XkaJdrQejfztN4XqdsiV4ct3LXKL\",\n" + " \"operation\":{\n" + " \"type\":\"1\",\n" + " \"dest\":\"4efZu2SXufS556yss7W5k6Po37jt4371RM4whbPKBKdB\"\n" + " }\n" + "}"); var signatureBytes = await Crypto.SignAsync(theirWallet, theirVerkey, msgBytes); //9. Verify message var valid = await Crypto.VerifyAsync(theirVerkey, msgBytes, signatureBytes); Debug.Assert(valid == true); //10. Close wallets and pool await myWallet.CloseAsync(); await theirWallet.CloseAsync(); } Console.WriteLine("OK", Color.Green); } catch (Exception e) { Console.WriteLine($"Error: {e.Message}", Color.Red); } finally { // 11. Delete wallets and Pool ledger config await WalletUtils.DeleteWalletAsync(myWalletConfig, myWalletCredentials); await WalletUtils.DeleteWalletAsync(theirWalletConfig, theirWalletCredentials); await PoolUtils.DeletePoolLedgerConfigAsync(PoolUtils.DEFAULT_POOL_NAME); } }
public static async Task Execute() { Console.WriteLine("Agent sample -> started"); var listenerWalletName = "listenerWallet"; var trusteeWalletName = "trusteeWallet"; var endpoint = "127.0.0.1:9801"; var message = "test"; var trusteeSeed = "000000000000000000000000Trustee1"; try { //1. Create Pool await PoolUtils.CreatePoolLedgerConfig(); //2. Create Listener Wallet await WalletUtils.CreateWalleatAsync(PoolUtils.DEFAULT_POOL_NAME, listenerWalletName, "default", null, null); //3. Create Trustee Wallet await WalletUtils.CreateWalleatAsync(PoolUtils.DEFAULT_POOL_NAME, trusteeWalletName, "default", null, null); //4. Open pool and wallets in using statements to ensure they are closed when finished. using (var pool = await Pool.OpenPoolLedgerAsync(PoolUtils.DEFAULT_POOL_NAME, "{}")) using (var listenerWallet = await Wallet.OpenWalletAsync(listenerWalletName, null, null)) using (var trusteeWallet = await Wallet.OpenWalletAsync(trusteeWalletName, null, null)) { var senderWallet = trusteeWallet; //5. Create My Did var createMyDidResult = await Signus.CreateAndStoreMyDidAsync(listenerWallet, "{}"); var listenerDid = createMyDidResult.Did; var listenerVerkey = createMyDidResult.VerKey; var listenerPk = createMyDidResult.Pk; //6. Create Their Did from Trustee seed var trusteeDidJson = string.Format("{{\"seed\":\"{0}\"}}", trusteeSeed); var trusteeDidResult = await Signus.CreateAndStoreMyDidAsync(trusteeWallet, trusteeDidJson); var trusteeDid = trusteeDidResult.Did; var senderDid = trusteeDid; //7. Prepare and Send NYM request with signing var nymRequest = await Ledger.BuildNymRequestAsync(trusteeDid, listenerDid, listenerVerkey, null, null); await Ledger.SignAndSubmitRequestAsync(pool, trusteeWallet, trusteeDid, nymRequest); //8. Prepare and Send Attrib for listener (will be requested from ledger and used by sender at start connection) var rawAttribJson = string.Format("{{\"endpoint\":{{\"ha\":\"{0}\",\"verkey\":\"{1}\"}}}}", endpoint, listenerPk); var attribRequest = await Ledger.BuildAttribRequestAsync(listenerDid, listenerDid, null, rawAttribJson, null); await Ledger.SignAndSubmitRequestAsync(pool, listenerWallet, listenerDid, attribRequest); //9. start listener on endpoint var activeListener = await AgentListener.ListenAsync(endpoint); //10. Allow listener accept incoming connection for specific DID (listener_did) await activeListener.AddIdentityAsync(pool, listenerWallet, listenerDid); //11. Initiate connection from sender to listener var sendingConnection = await AgentConnection.ConnectAsync(pool, senderWallet, senderDid, listenerDid); var connectionEvent = await activeListener.WaitForConnectionAsync(); var receivingConnection = connectionEvent.Connection; //12. Send test message from sender to listener await sendingConnection.SendAsync(message); var messageEvent = await receivingConnection.WaitForMessageAsync(); Debug.Assert(string.Equals(message, messageEvent.Message)); //13. Close connection await sendingConnection.CloseAsync(); //14. Close listener await activeListener.CloseAsync(); //15. Close wallets and pool await listenerWallet.CloseAsync(); await trusteeWallet.CloseAsync(); await pool.CloseAsync(); } } finally { // 16. Delete Pool ledger config and wallets await PoolUtils.DeletePoolLedgerConfigAsync(PoolUtils.DEFAULT_POOL_NAME); await WalletUtils.DeleteWalletAsync(listenerWalletName, null); await WalletUtils.DeleteWalletAsync(trusteeWalletName, null); } Console.WriteLine("Agent sample -> completed"); }
public static async Task Execute() { Console.WriteLine("Agent sample -> started"); Wallet aliceWallet = null; Wallet bobWallet = null; try { // 1. Create and open wallets for Alice and Bob await Wallet.CreateWalletAsync(POOL_NAME, ALICE_WALLET, null, null, null); aliceWallet = await Wallet.OpenWalletAsync(ALICE_WALLET, null, null); await Wallet.CreateWalletAsync(POOL_NAME, BOB_WALLET, null, null, null); bobWallet = await Wallet.OpenWalletAsync(BOB_WALLET, null, null); // 2. Create keys for Alice and Bob var aliceKey = await Crypto.CreateKeyAsync(aliceWallet, "{}"); var bobKey = await Crypto.CreateKeyAsync(bobWallet, "{}"); // 3. Prepare authenticated message from Alice to Bob var encryptedAuthMsg = await Agent.PrepMsgAsync(aliceWallet, aliceKey, bobKey, MESSAGE); // 4. Parse authenticated message on Bob's side { var decryptedAuth = await Agent.ParseMsgAsync(bobWallet, bobKey, encryptedAuthMsg); Debug.Assert(aliceKey.Equals(decryptedAuth.SenderKey)); Debug.Assert(MESSAGE.SequenceEqual(decryptedAuth.Msg)); } // 5. Prepare anonymous message from Bob to Alice var encryptedAnonMsg = await Agent.PrepAnonymousMsgAsync(aliceKey, MESSAGE); // 6. Parse anonymous message on Alice's side { var decryptedAnon = await Agent.ParseMsgAsync(aliceWallet, aliceKey, encryptedAnonMsg); Debug.Assert(decryptedAnon.SenderKey == null); Debug.Assert(MESSAGE.SequenceEqual(decryptedAnon.Msg)); } } finally { //7. Close and delete wallets if (aliceWallet != null) { await aliceWallet.CloseAsync(); } await WalletUtils.DeleteWalletAsync(ALICE_WALLET, null); if (bobWallet != null) { await bobWallet.CloseAsync(); } await WalletUtils.DeleteWalletAsync(BOB_WALLET, null); } Console.WriteLine("Agent sample -> completed"); }