Пример #1
0
        /**
         * Helper function to create IdemixSigningIdentity from a file generated by idemixgen go tool
         *
         * @param mspId
         * @return IdemixSigningIdentity object
         * @throws IOException
         * @throws InvalidProtocolBufferException
         */
        private IdemixSigningIdentity CreateIdemixSigningIdentity(string mspId)
        {
            IdemixMSPSignerConfig signerConfig;

            signerConfig = ReadIdemixMSPConfig(Path.Combine(TEST_PATH, mspId, USER_PATH).Locate(), SIGNER_CONFIG);
            Assert.IsNotNull(signerConfig);

            IssuerPublicKey       ipkProto = ReadIdemixIssuerPublicKey(Path.Combine(TEST_PATH, mspId, VERIFIER_PATH).Locate(), IPK_CONFIG);
            IdemixIssuerPublicKey ipkt     = new IdemixIssuerPublicKey(ipkProto);

            Assert.IsTrue(ipkt.Check());

            KeyPair revPk = ReadIdemixRevocationPublicKey(Path.Combine(TEST_PATH, mspId, VERIFIER_PATH).Locate(), REVOCATION_PUBLIC_KEY);

            BIG skt = BIG.FromBytes(signerConfig.Sk.ToByteArray());

            Credential credProto = Credential.Parser.ParseFrom(signerConfig.Cred);

            Assert.IsNotNull(credProto);

            IdemixCredential credt = new IdemixCredential(credProto);

            CredentialRevocationInformation crit = CredentialRevocationInformation.Parser.ParseFrom(signerConfig.CredentialRevocationInformation);

            return(new IdemixSigningIdentity(ipkt, revPk, mspId, skt, credt, crit, signerConfig.OrganizationalUnitIdentifier, (IdemixRoles)signerConfig.Role));
        }
Пример #2
0
 public IdemixEnrollment(IdemixIssuerPublicKey ipk, KeyPair revocationPk, string mspId, BIG sk, IdemixCredential cred, CredentialRevocationInformation cri, string ou, IdemixRoles roleMask)
 {
     Ipk          = ipk;
     RevocationPk = revocationPk;
     MspId        = mspId;
     Sk           = sk;
     Cred         = cred;
     Cri          = cri;
     Ou           = ou;
     RoleMask     = roleMask;
 }
Пример #3
0
        public IdemixUserStore(string storePath, string mspId)
        {
            this.storePath = storePath;
            this.mspId     = mspId;
            IssuerPublicKey ipkProto = ReadIdemixIssuerPublicKey(Path.Combine(mspId, VERIFIER_PATH + IPK_CONFIG));

            ipk = new IdemixIssuerPublicKey(ipkProto);
            if (!ipk.Check())
            {
                throw new CryptoException("Failed verifying issuer public key.");
            }
        }
Пример #4
0
        /**
         * Create Idemix Identity from the following inputs:
         *
         * @param mspId is MSP ID sting
         * @param nym   is Identity Mixer Pseudonym
         * @param ou    is OU attribute
         * @param roleMask  is a bitmask that represent all the roles attached to this identity
         * @param proof is Proof
         */
        public IdemixIdentity(string mspId, IdemixIssuerPublicKey ipk, ECP nym, string ou, IdemixRoles roleMask, IdemixSignature proof)
        {
            if (mspId == null)
            {
                throw new ArgumentException("MSP ID must not be null");
            }

            if (string.IsNullOrEmpty(mspId))
            {
                throw new ArgumentException("MSP ID must not be empty");
            }

            if (ipk == null)
            {
                throw new ArgumentException("Issuer Public Key must not be empty");
            }

            if (nym == null)
            {
                throw new ArgumentException("Identity Mixer Pseudonym (nym) must not be null");
            }

            if (ou == null)
            {
                throw new ArgumentException("OU attribute must not be null");
            }

            if (string.IsNullOrEmpty(ou))
            {
                throw new ArgumentException("OU attribute must not be empty");
            }

            if (proof == null)
            {
                throw new ArgumentException("Proof must not be null");
            }


            this.mspId       = mspId;
            ipkHash          = ipk.Hash;
            pseudonym        = nym;
            Ou               = ou;
            RoleMask         = roleMask;
            associationProof = proof;
        }
Пример #5
0
        /**
         * Create new Idemix Signing Identity with a fresh pseudonym
         *
         * @param ipk          issuer public key
         * @param revocationPk the issuer's long term revocation public key
         * @param mspId        MSP identifier
         * @param sk           user's secret
         * @param cred         idemix credential
         * @param cri          the credential revocation information
         * @param ou           is OU attribute
         * @param role         is role attribute
         * @throws CryptoException
         * @throws InvalidArgumentException
         */
        public IdemixSigningIdentity(IdemixIssuerPublicKey ipk, KeyPair revocationPk, string mspId, BIG sk, IdemixCredential cred, CredentialRevocationInformation cri, string ou, IdemixRoles role)
        {
            // input checks
            if (ipk == null)
            {
                throw new ArgumentException("Issuer Public Key (IPK) must not be null");
            }
            if (revocationPk == null)
            {
                throw new ArgumentException("Revocation PK must not be null");
            }
            if (mspId == null)
            {
                throw new ArgumentException("MSP ID must not be null");
            }
            if (string.IsNullOrEmpty(mspId))
            {
                throw new ArgumentException("MSP ID must not be empty");
            }
            if (ou == null)
            {
                throw new ArgumentException("OU must not be null");
            }
            if (string.IsNullOrEmpty(ou))
            {
                throw new ArgumentException("OU must not be empty");
            }
            if (sk == null)
            {
                throw new ArgumentException("SK must not be null");
            }
            if (cred == null)
            {
                throw new ArgumentException("Credential must not be null");
            }
            if (cri == null)
            {
                throw new ArgumentException("Credential revocation information must not be null");
            }

            logger.Trace($"Verifying public key with hash: [{BitConverter.ToString(ipk.Hash).Replace("-", "")}] \nAttributes: [{string.Join(",", ipk.AttributeNames)}]");

            if (!ipk.Check())
            {
                CryptoException e = new CryptoException("Issuer public key is not valid");
                logger.Error("", e);
                throw e;
            }

            this.ipk = ipk;
            this.sk  = sk;
            this.cri = cri;

            logger.Trace("Verifying the credential");

            // cryptographically verify credential
            // (check if the issuer's signature is valid)
            if (!cred.Verify(sk, ipk))
            {
                CryptoException e = new CryptoException("Credential is not cryptographically valid");
                logger.Error("", e);
                throw e;
            }

            logger.Trace("Checking attributes");

            // attribute checks
            // 4 attributes are expected:
            // - organization unit (disclosed)
            // - role: admin or member (disclosed)
            // - enrollment id (hidden, for future auditing feature and authorization with CA)
            // - revocation handle (hidden, for future revocation support)
            if (cred.Attrs.Length != 4)
            {
                throw new CryptoException($"Error: There are {cred.Attrs.Length} attributes and the expected are 4");
            }

            byte[] ouBytes   = cred.Attrs[0];
            byte[] roleBytes = cred.Attrs[1];
            byte[] eIdBytes  = cred.Attrs[2];
            byte[] rHBytes   = cred.Attrs[3];

            BIG[] attributes = new BIG[4];
            attributes[0] = BIG.FromBytes(ouBytes);
            attributes[1] = BIG.FromBytes(roleBytes);
            attributes[2] = BIG.FromBytes(eIdBytes);
            attributes[3] = BIG.FromBytes(rHBytes);

            // check that the OU string matches the credential's attribute value
            if (!ou.ToBytes().HashModOrder().ToBytes().SequenceEqual(ouBytes))
            {
                throw new ArgumentException("the OU string does not match the credential");
            }

            // check that the role matches the credential's attribute value
            if (!new BIG((int)role).ToBytes().SequenceEqual(roleBytes))
            {
                throw new ArgumentException("the role does not match the credential");
            }

            logger.Trace("Generating fresh pseudonym and proof");
            // generate a fresh pseudonym
            Pseudonym = new IdemixPseudonym(this.sk, this.ipk);

            // generate a fresh proof of possession of a credential
            // with respect to a freshly generated pseudonym
            Proof = new IdemixSignature(cred, this.sk, Pseudonym, this.ipk, disclosedFlags, msgEmpty, rhIndex, cri);
            logger.Trace("Verifying the proof");
            // verify the proof
            if (!Proof.Verify(disclosedFlags, this.ipk, msgEmpty, attributes, rhIndex, revocationPk, (int)cri.Epoch))
            {
                throw new CryptoException("Generated proof of identity is not valid");
            }

            logger.Trace("Generating the Identity Object");
            // generate a fresh identity with new pseudonym
            idemixIdentity = new IdemixIdentity(mspId, this.ipk, Pseudonym.Nym, ou, role, Proof);
            logger.Trace(idemixIdentity.ToString());
        }
Пример #6
0
        public static void Setup(TestContext context)
        {
            // Parse crypto material from files
            IdemixMSPSignerConfig signerConfig = null;

            try
            {
                signerConfig = ReadIdemixMSPConfig(Path.Combine(TEST_PATH, MSP1OU1, USER_PATH).Locate(), SIGNER_CONFIG);
            }
            catch (System.Exception e)
            {
                Assert.Fail("Unexpected exception while reading signerconfig: " + e.Message);
            }

            Assert.IsNotNull(signerConfig);

            try
            {
                revocationPk = ReadIdemixRevocationPublicKey(Path.Combine(TEST_PATH, MSP1OU1, VERIFIER_PATH).Locate(), REVOCATION_PUBLIC_KEY);
            }
            catch (System.Exception e)
            {
                Assert.Fail("Unexpected exception while reading revocation public key: " + e.Message);
            }

            Assert.IsNotNull(revocationPk);

            IssuerPublicKey ipkProto = null;

            try
            {
                ipkProto = ReadIdemixIssuerPublicKey(Path.Combine(TEST_PATH, MSP1OU1, VERIFIER_PATH).Locate(), IPK_CONFIG);
            }
            catch (IOException e1)
            {
                Assert.Fail("Unexpected exception while reading revocation public key" + e1.Message);
            }

            ipk = new IdemixIssuerPublicKey(ipkProto);
            Assert.IsTrue(ipk.Check());

            sk = BIG.FromBytes(signerConfig.Sk.ToByteArray());

            Credential credProto = null;

            try
            {
                credProto = Credential.Parser.ParseFrom(signerConfig.Cred);
            }
            catch (InvalidProtocolBufferException)
            {
                Assert.Fail("Could not parse a credential");
            }

            Assert.IsNotNull(credProto);

            cred = new IdemixCredential(credProto);

            try
            {
                cri = CredentialRevocationInformation.Parser.ParseFrom(signerConfig.CredentialRevocationInformation);
            }
            catch (InvalidProtocolBufferException e)
            {
                Assert.Fail("failed to extract cri from signer config: " + e.Message);
            }

            Assert.IsNotNull(cri);

            try
            {
                signingIdentity = new IdemixSigningIdentity(ipk, revocationPk, MSP1OU1, sk, cred, cri, OU1, IdemixRoles.MEMBER);
            }
            catch (System.Exception e) when(e is CryptoException || e is ArgumentException)
            {
                Assert.Fail("Could not create Idemix Signing Identity" + e.Message);
            }

            Assert.IsNotNull(signingIdentity);

            nym = signingIdentity.Pseudonym;

            nymPublic = nym.Nym;

            proof = signingIdentity.Proof;
        }