/// <summary> /// Generates the second issuance message. /// </summary> /// <param name="message">The first issuance message.</param> /// <returns>The second issuance message.</returns> public SecondIssuanceMessage GenerateSecondMessage(FirstIssuanceMessage message) { if (state != State.Initialized) { throw new InvalidOperationException("Prover not initialized properly"); } Group Gq = ip.Gq; this.sigmaZ = message.sigmaZ; sigmaZPrime = new GroupElement[numberOfTokens]; sigmaAPrime = new GroupElement[numberOfTokens]; sigmaBPrime = new GroupElement[numberOfTokens]; sigmaCPrime = new FieldZqElement[numberOfTokens]; FieldZqElement[] sigmaC = new FieldZqElement[numberOfTokens]; for (int i = 0; i < numberOfTokens; i++) { FieldZqElement blindingExponent = alpha[i]; sigmaZPrime[i] = message.sigmaZ.Exponentiate(blindingExponent); sigmaAPrime[i] = t1[i] * message.sigmaA[i]; sigmaBPrime[i] = sigmaZPrime[i].Exponentiate(beta1[i]) * t2[i] * message.sigmaB[i].Exponentiate(blindingExponent); HashFunction hash = ip.HashFunction; hash.Hash(h[i]); hash.Hash(PI); hash.Hash(sigmaZPrime[i]); hash.Hash(sigmaAPrime[i]); hash.Hash(sigmaBPrime[i]); sigmaCPrime[i] = ip.Zq.GetElementFromDigest(hash.Digest); sigmaC[i] = sigmaCPrime[i] + beta1[i]; } state = State.Second; return(new SecondIssuanceMessage(sigmaC)); }
/// <summary> /// Generates the second issuance message. /// </summary> /// <param name="message">The first issuance message.</param> /// <returns>The second issuance message.</returns> public SecondIssuanceMessage GenerateSecondMessage(FirstIssuanceMessage message) { if (state != State.Initialized) { throw new InvalidOperationException("Prover not initialized properly"); } Group Gq = ip.Gq; this.sigmaZ = message.sigmaZ.Exponentiate(beta0Inverse); // remove the blind that was included in gamma (if no blind beta0Inverse = 1) sigmaZPrime = new GroupElement[numberOfTokens]; sigmaAPrime = new GroupElement[numberOfTokens]; sigmaBPrime = new GroupElement[numberOfTokens]; sigmaCPrime = new FieldZqElement[numberOfTokens]; FieldZqElement[] sigmaC = new FieldZqElement[numberOfTokens]; for (int i = 0; i < numberOfTokens; i++) { FieldZqElement sigmaBExponent = alpha[i].Multiply(beta0Inverse); // will remove the collab-issuance blind, if present sigmaZPrime[i] = this.sigmaZ.Exponentiate(alpha[i]); sigmaAPrime[i] = t1[i] * message.sigmaA[i]; sigmaBPrime[i] = Gq.MultiExponentiate(new GroupElement[] { sigmaZPrime[i], h[i], message.sigmaB[i] }, new FieldZqElement[] { beta1[i], beta2[i], sigmaBExponent }); HashFunction hash = ip.HashFunction; hash.Hash(h[i]); hash.Hash(PI); hash.Hash(sigmaZPrime[i]); hash.Hash(sigmaAPrime[i]); hash.Hash(sigmaBPrime[i]); sigmaCPrime[i] = ip.Zq.GetElementFromDigest(hash.Digest); sigmaC[i] = sigmaCPrime[i] + beta1[i]; } state = State.Second; return(new SecondIssuanceMessage(sigmaC)); }
public static FirstIssuanceMessage convertFirstIssuanceMessageComposite(FirstIssuanceMessageComposite fic, IssuerParameters ip) { GroupElement[] geArray1 = new GroupElement[fic.SigmaA.Length]; for (int i = 0; i < fic.SigmaA.Length; i++) { geArray1[i] = ip.Gq.CreateGroupElement(fic.SigmaA[i]); } GroupElement[] geArray2 = new GroupElement[fic.SigmaB.Length]; for (int i = 0; i < fic.SigmaB.Length; i++) { geArray2[i] = ip.Gq.CreateGroupElement(fic.SigmaB[i]); } FirstIssuanceMessage fi = new FirstIssuanceMessage(ip.Gq.CreateGroupElement(fic.SigmaZ), geArray1, geArray2); return fi; }
public static FirstIssuanceMessageComposite convertFirstIssuanceMessage(FirstIssuanceMessage fi) { FirstIssuanceMessageComposite fic = new FirstIssuanceMessageComposite(); byte[][] byteArray1 = new byte[fi.sigmaA.Length][]; for (int i = 0; i < byteArray1.Length; i++) { byteArray1[i] = fi.sigmaA[i].GetEncoded(); } byte[][] byteArray2 = new byte[fi.sigmaB.Length][]; for (int i = 0; i < byteArray2.Length; i++) { byteArray2[i] = fi.sigmaB[i].GetEncoded(); } fic.SigmaA = byteArray1; fic.SigmaB = byteArray2; fic.SigmaZ = fi.sigmaZ.GetEncoded(); return fic; }
/// <summary> /// Generates the second issuance message. /// </summary> /// <param name="message">The first issuance message.</param> /// <returns>The second issuance message.</returns> public SecondIssuanceMessage GenerateSecondMessage(FirstIssuanceMessage message) { if (state != State.Initialized) { throw new InvalidOperationException("Prover not initialized properly"); } Group Gq = ip.Gq; this.sigmaZ = message.sigmaZ; sigmaZPrime = new GroupElement[numberOfTokens]; sigmaAPrime = new GroupElement[numberOfTokens]; sigmaBPrime = new GroupElement[numberOfTokens]; sigmaCPrime = new FieldZqElement[numberOfTokens]; FieldZqElement[] sigmaC = new FieldZqElement[numberOfTokens]; for (int i = 0; i < numberOfTokens; i++) { FieldZqElement blindingExponent = alpha[i]; sigmaZPrime[i] = message.sigmaZ.Exponentiate(blindingExponent); sigmaAPrime[i] = t1[i] * message.sigmaA[i]; sigmaBPrime[i] = sigmaZPrime[i].Exponentiate(beta1[i]) * t2[i] * message.sigmaB[i].Exponentiate(blindingExponent); HashFunction hash = ip.HashFunction; hash.Hash(h[i]); hash.Hash(PI); hash.Hash(sigmaZPrime[i]); hash.Hash(sigmaAPrime[i]); hash.Hash(sigmaBPrime[i]); sigmaCPrime[i] = ip.Zq.GetElementFromDigest(hash.Digest); sigmaC[i] = sigmaCPrime[i] + beta1[i]; } state = State.Second; return new SecondIssuanceMessage(sigmaC); }