import { keyGen } from 'mam.ts'; //Testing imports import { expect } from 'chai'; import 'mocha'; import { VCWriter, HolderInformation } from '../src/VerifiableClaim/VCWriter'; import { VCReader } from '../src/VerifiableClaim/VCReader'; import { VCState } from '../src/VerifiableClaim/VCState'; import { Attribute, DIDReader } from '../src'; import { DIDWriter } from '../src/DecentralizedIdentifier/DIDWriter'; import { RsaKeypair } from '../src/RsaKeypair'; const NodeURL = "https://nodes.thetangle.org:443"; //https://nodes.thetangle.org:443 describe('Writing and reading claim', function() { //Variables for this test let writer : VCWriter; let reader : VCReader; let Attributes : Attribute[]; let holderUUID : string; let salt : string = null; let issuerKeys : RsaKeypair; let issuerUUID : string; let issuerSeed : string; let vcSeed : string; before('Should create a DID for the Holder', async function() { //Create the DID this.timeout(30000); //Fill the Attributes Array Attributes = []; Attributes.push( new Attribute("Hello", "Bye")); Attributes.push( new Attribute("Company", "VX Company")); //Create a new holder DID let holderSeed : string = keyGen(81); let holderWriter = await DIDWriter.createDIDWriter(NodeURL,holderSeed); let holderKeys = new RsaKeypair(); holderWriter.CreateNewDID(holderKeys); holderUUID = holderWriter.GetRootofRoots(); await holderWriter.PublishChanges(); }); before('Should create a DID for the Issuer', async function() { //Create a new Issuer DID let TUseed : string = "RNE9XAITMXXNWCR9WNDAGBXSGQES9PLSWOYCO9KMFTJGL9NMQFYYOYGW9VXKQQEXKKQQIAYXZBMELZMAU"; let TURoot : string = "KILHGLDVXEZQVTCZNW9KSAEEBHK9AYWFAG9UFZO9MVCAM9SPSAMZLLPJALUYAMTLPMLZJHNJWFQTZFEVI"; let TUPublic : string = "-----BEGIN RSA PUBLIC KEY-----MIIBCgKCAQEAjtNw9227xT1vM60aclrR/5X5GLbrDjLWzSvBm9IzPErU+AEpLHnrxd+AaeSj+G19lWXkf91iuq7GVrBUwk+oa7qK+QT0yj5ayolkvUNjB90bVTEPQPBSl1t6cOur/Q58h8r+oPDBHjp68ERjcxLMoCvAey4LbmoW0zQWmyXyo5brbJFEDbJAFPAr1TMiO52vBaTV+BC3vOS3iH14HkkzWvj6YE9HATqFgrpOG6AHfpwk+arvrCbDcg0UuATdTv8oXh+Ay08TteKp0Jrkp2At0XCb0PdYYkJQ8ARsx8fXdJE0/ZpV0Z3EjenAw91lWEzSZb7cFC3EtEHjPz6WlrI/RwIDAQAB-----END RSA PUBLIC KEY-----"; let TUPrivate : string = "-----BEGIN RSA PRIVATE KEY-----MIIEpAIBAAKCAQEAjtNw9227xT1vM60aclrR/5X5GLbrDjLWzSvBm9IzPErU+AEpLHnrxd+AaeSj+G19lWXkf91iuq7GVrBUwk+oa7qK+QT0yj5ayolkvUNjB90bVTEPQPBSl1t6cOur/Q58h8r+oPDBHjp68ERjcxLMoCvAey4LbmoW0zQWmyXyo5brbJFEDbJAFPAr1TMiO52vBaTV+BC3vOS3iH14HkkzWvj6YE9HATqFgrpOG6AHfpwk+arvrCbDcg0UuATdTv8oXh+Ay08TteKp0Jrkp2At0XCb0PdYYkJQ8ARsx8fXdJE0/ZpV0Z3EjenAw91lWEzSZb7cFC3EtEHjPz6WlrI/RwIDAQABAoIBAAMzAUjJkHculRsXOYxuNF4BQf8nucQrp1wZKtEOuE8VbgfQHtf8MyfPhdTZZkLeUP3TtnaWwutjltXCRWPE3QTsvMgvMDyHgQkgYr1KkSFP9pjF7I2L1I3HYsq8vLGCbY+tIF8ChZDjxnUzUvb06Nh9omYf9emXPsOkWw1GoFTBt9Q+NbYvrTbnXXNYGyI0aUNiMNFDrCpaUoml9BGGxqXJB4mA6SG+3OtP3da7+mZQYWtRGLlsJbHLf6frTyD6L3J3qHQ2AcpNtJJJXR/F07xrvpDgKFEMv8013gcdCNmo/Jucl556MHxP3Eyn7hu+TNI5GSvgIRb07olMzjNiciECgYEA9nmn8HkIya/LLUQvriq86QaoLFEXH6nIsrZypMJ6eqJubiR0nVO+nsFPTAeUf+uJSyVzbzuZF/JH+4vO/1A26epuvz7zG/oO5+jPag/DBp/RK69kkja1ax/+VLFIXTlF9PtQLZ4gojJkoNyYkSBo2Le1L3nzYteaKVslTdn/MXMCgYEAlFhl2L5F0VLoPvdIFBlT9imh8krQMHwBW1JOMDkhswrofHIvTdXxUn8DkgRh0+ewiw8R07TC1miK8ui6kTcN7LmZ7NGvUw7sXihUTQ2urW2z1/UnJNN5N8gPS4kPLbqf9JHGdGVlmTOzDl/nkrSuKmq9DLG3xcVImWokiC5Jdd0CgYEApBcELn1100hc3MsLb0l2sTDEX5Sw71yKiCgdFQGApwpiuKM+m8s4GdsansRhIfS+V7AcNM6Zsq6TK629Zo6RsJNpnZscIOEOcWi2RacusMdPa2T+cLVJfIM1QE8ynRXXNCzoCSbAFRu1kL6sN9o60yUi0/O9jG17bdMHd9gNJG8CgYEAkR89W2EgyhuSSm79G3R/t/SYkoBv1M6rQRxukyyA9De6omvOLRYcA/lvk7wnu/cPtapjZTmT1c7mB6Z3RbKXM7uKgqvLGbUitSY8+jhlZxJH+v/AcH1VO6XCmMGXkMPe0ZJ+k8XSM6LpCyn1UIbjT2mmUjHVt2s9j5/P501o3h0CgYBYoINWVoweMq4P+cK89Nrp8ujNcU1QBC8++y0L56KNSdo2ZArCthAoBcjPOiNTaqrlPUjZkQOgY2aSB5eM6cF42kwfiBORY8/NhqGofOJYfI0iXM0HyFfHWNOL7NjTmZvWKSjOEsY9h5hRvHlGVvfOVQMDkOrUrmWyRL+qr8fkuw==-----END RSA PRIVATE KEY-----" this.timeout(20000); issuerSeed = TUseed; issuerKeys = new RsaKeypair(TUPublic, TUPrivate); issuerUUID = TURoot; }); before('Should create a VC', async function() { this.timeout(20000); vcSeed = keyGen(81); writer = await VCWriter.createVCWriter(NodeURL, vcSeed, 1); let HolderInfo : HolderInformation = await writer.AddClaim( holderUUID, issuerUUID, issuerKeys.GetPrivateKey(), Attributes ); salt = HolderInfo.salt; expect(HolderInfo).to.not.equal(null); }); it('Should read a valid claim', async function() { this.timeout(200000); reader = new VCReader(NodeURL, writer.GetVerifiableClaimStreamRoot()); expect(await reader.queryVC()).to.be.true; }); it('Should be the correct verified claim', function() { let vcstate : VCState = reader.GetState(); expect(vcstate.getJson()).to.deep.equal(writer.GetVCState().getJson()); }); it('Should have the correct Holderhash', function() { expect(reader.VerifyHolderHash(holderUUID, salt)).to.be.true; }); it('Should have the correct Singature for all revealed attributes', function() { expect(reader.VerifySignature(issuerKeys.GetPublicKey(), Attributes)).to.be.true; }); //TODO it('Should have the correct Singature for hidden attributes', function() { expect(reader.VerifySignature(issuerKeys.GetPublicKey(), Attributes)).to.be.true; }); it('Should pass Issuer verification', async function() { this.timeout(200000); let didReader = new DIDReader(NodeURL,issuerUUID) await didReader.QueryDID(); let IssuerState = didReader.GetState(); expect(await reader.VerifyIssuer(issuerUUID,IssuerState.getServicePoints()[0].serviceEndpoint)).to.not.be.undefined; }); it('Should VerifyAll', async function() { expect(await reader.VerifyClaim(holderUUID, salt, issuerUUID, Attributes, [])).to.not.be.undefined; }); });