public IdemixSetup(string[] attributeNames) { // Choose attribute names and create an issuer key pair // this.attributeNames = new String[]{"Attribute1", "Attribute2"}; this.attributeNames = attributeNames; key = new IdemixIssuerKey(this.attributeNames); RAND rng = IdemixUtils.GetRand(); // Choose a user secret key and request a credential sk = new BIG(rng.RandModOrder()); issuerNonce = new BIG(rng.RandModOrder()); idemixCredRequest = new IdemixCredRequest(sk, issuerNonce, key.Ipk); //csr // Issue a credential attrs = new BIG[this.attributeNames.Length]; for (int i = 0; i < this.attributeNames.Length; i++) { attrs[i] = new BIG(i); } idemixCredential = new IdemixCredential(key, idemixCredRequest, attrs); //certificate wbbKeyPair = WeakBB.WeakBBKeyGen(); // Generate a revocation key pair revocationKeyPair = RevocationAuthority.GenerateLongTermRevocationKey(); // Check all the generated data CheckSetup(); }
/** * 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)); }
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; }
public IUser GetUser(string id) { IdemixMSPSignerConfig signerConfig = ReadIdemixMSPConfig(Path.Combine(mspId, USER_PATH + id)); KeyPair revocationPk = ReadIdemixRevocationPublicKey(mspId); BIG sk = BIG.FromBytes(signerConfig.Sk.ToByteArray()); IdemixCredential cred = new IdemixCredential(Credential.Parser.ParseFrom(signerConfig.Cred)); CredentialRevocationInformation cri = CredentialRevocationInformation.Parser.ParseFrom(signerConfig.CredentialRevocationInformation); IdemixEnrollment enrollment = new IdemixEnrollment(ipk, revocationPk, mspId, sk, cred, cri, signerConfig.OrganizationalUnitIdentifier, (IdemixRoles)signerConfig.Role); return(new IdemixUser(id, mspId, enrollment)); }
/** * 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()); }
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; }