public SecondIssuanceMessageComposite getSecondMessage(string[] attributesParam, IssuerParametersComposite ipc, int numberOfTokensParam, FirstIssuanceMessageComposite firstMessage, string sessionID)
    {
      /*
       *  token issuance - generate second message
       */

      cOut.write("Issuing U-Prove tokens - generate second message, prover side");
      VerifySessionId(sessionID);

      try
      {
        string tokenInformationParam = null;
        string proverInformationParam = null;

        // specify the attribute values agreed to by the Issuer and Prover
        int numberOfAttributes = attributesParam.Length;
        byte[][] attributes = new byte[numberOfAttributes][];
        for (int i = 0; i < numberOfAttributes; i++)
        {
          attributes[i] = encoding.GetBytes(attributesParam[i]);
        }

        // specify the special field values
        byte[] tokenInformation = (tokenInformationParam == null) ? new byte[] { } : encoding.GetBytes(tokenInformationParam);
        byte[] proverInformation = (proverInformationParam == null) ? new byte[] { } : encoding.GetBytes(proverInformationParam);

        // specify the number of tokens to issue
        int numberOfTokens = numberOfTokensParam;

        IssuerParameters ip = ConvertUtils.convertIssuerParametersComposite(ipc, sessionDB[sessionID]);

        // Convert serializable FirstIssuanceMessageComposite members to FirstIssuanceMessage
        FirstIssuanceMessage fi = ConvertUtils.convertFirstIssuanceMessageComposite(firstMessage, ip);

        // setup the prover and generate the second issuance message
        Prover prover = new Prover(ip, numberOfTokens, attributes, tokenInformation, proverInformation, sessionDB[sessionID].deviceManager.GetDevice());

        // Store the prover in proversDictionary using the sessionKey as key
        sessionDB[sessionID].prover = prover;

        SecondIssuanceMessage sm = prover.GenerateSecondMessage(fi);

        // Convert SecondIssuanceMessage members to serializable SecondIssuanceMessageComposite
        SecondIssuanceMessageComposite smc = ConvertUtils.convertSecondIssuanceMessage(sm);

        // Add the sessionKey to SecondIssuanceMessageComposite
        smc.SessionKey = sessionID;

        return smc;

      }
      catch (Exception e)
      {
        cOut.write(e.ToString());
        DebugUtils.DebugPrint(e.StackTrace.ToString());
      }

      return null;
    }
    public void completeUProveProtocolTest()
    {
      byte[] attributeEncoding = new byte[] { 0x0, 0x1 };
      IssuerSetupParameters isp = this.getIssuerSetupParameters(attributeEncoding, "foobar");

      // generate the serializable IssuerKeyAndParameters
      IssuerKeyAndParameters ikap = null;
      Assert.DoesNotThrow(delegate { ikap = isp.Generate(true); });
      Assert.DoesNotThrow(delegate { ikap.IssuerParameters.Verify(); });

      byte[] issuerPrivateKey = new byte[] { 187, 133, 215, 21, 39, 178, 240, 67, 170, 4, 148, 139, 213, 36, 164, 114, 146, 228, 243, 140, 61, 76,
                                            174, 136, 137, 65, 238, 59, 7, 198, 34, 129 };



      int numberOfTokens = 10;
      string[] attributesString = new string[] { "foo", "bar" };
      int numberOfAttributes = attributesString.Length;
      byte[][] attributes = new byte[numberOfAttributes][];
      for (int i = 0; i < numberOfAttributes; i++)
      {
        attributes[i] = encoding.GetBytes(attributesString[i]);
      }
      BigInteger bi = new BigInteger(1, issuerPrivateKey);
      IssuerKeyAndParameters ikapFristMessage = new IssuerKeyAndParameters(bi, ikap.IssuerParameters);

 

      GroupElement hdG = ikap.IssuerParameters.Gq.CreateGroupElement(defines.hd);
      Issuer issuer = new Issuer(ikapFristMessage, numberOfTokens, attributes, null, hdG);

      FirstIssuanceMessage fi = issuer.GenerateFirstMessage();

      byte[] attributes2nd = (byte[])attributes.Clone();
      byte[] tokenInformation = new byte[] { };
      byte[] proverInformation = new byte[] { };
      Prover prover = new Prover(ip, numberOfTokens, attributes, tokenInformation, proverInformation, sessionDB[sessionID].deviceManager.GetDevice());


        /*
        * issue steps. creds.               
       *  setupIssuerParams.                
       *                                    
       * setIssuerPrivateKey. {byte[32]} : 		

       * 
       *  getFirstMessage - 		[0]	"42595520544300663591556673075677003532579993719172074290116620403700505383419"	string
   

       * 
       * getSecondMessage - with outputfrom getFristMessage.
       * 
       * getThirdMessage - with output from getSecondMessage.
       * 
       * generateTokens - with output from getThirdMessage
       * 
       * proveToken - commitedIndices 0x00000001 , 
       * messageParms "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<abc:Message xmlns:abc=\"http://abc4trust.eu/wp2/abcschemav1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://abc4trust.eu/wp2/abcschemav1.0 ../../../../../../../../../abc4trust-xml/src/main/resources/xsd/schema.xsd\">\n<abc:Nonce>r9MQ57udpiWRwA==</abc:Nonce>\n</abc:Message>\n"
       * Token, 
       * -		tokenPrivateKeyParam	{byte[0x00000020]}	byte[]
    [0x00000000]	0x37	byte
    [0x00000001]	0xaa	byte
    [0x00000002]	0xb6	byte
    [0x00000003]	0xa9	byte
    [0x00000004]	0xd5	byte
    [0x00000005]	0x56	byte
    [0x00000006]	0xd8	byte
    [0x00000007]	0x21	byte
    [0x00000008]	0x77	byte
    [0x00000009]	0xe1	byte
    [0x0000000a]	0x7b	byte
    [0x0000000b]	0x5a	byte
    [0x0000000c]	0xf3	byte
    [0x0000000d]	0xad	byte
    [0x0000000e]	0xf7	byte
    [0x0000000f]	0x83	byte
    [0x00000010]	0x3c	byte
    [0x00000011]	0x2d	byte
    [0x00000012]	0xcf	byte
    [0x00000013]	0xdd	byte
    [0x00000014]	0x8a	byte
    [0x00000015]	0xbf	byte
    [0x00000016]	0x62	byte
    [0x00000017]	0xae	byte
    [0x00000018]	0xeb	byte
    [0x00000019]	0x44	byte
    [0x0000001a]	0x59	byte
    [0x0000001b]	0x6f	byte
    [0x0000001c]	0x1b	byte
    [0x0000001d]	0x09	byte
    [0x0000001e]	0x6d	byte
    [0x0000001f]	0xf0	byte

       * 
       * verifyTokenProof - proff from proveToken, otherwise same values.
       * 
       * 
       * 
       * */


    }
 private GenerateTokensInfo HandleGenerateTokens(Prover prover, ThirdIssuanceMessage thirdIssuanceMessage)
 {
   GenerateTokensInfo gInfo = new GenerateTokensInfo();
   gInfo.Tokens = prover.GenerateTokens(thirdIssuanceMessage, true);
   return gInfo;
 }
    public GenerateTokensInfo GenerateTokens(GenerateTokensSpec spec)
    {
      // first we will try to lookup the cache value of the prover object.
      Prover prover = null;
      if (spec.ProverInstanceID != null)
      {
        ProverInstanceData proverInstance;
        bool ok = proverInstanceDB.TryGetValue(spec.ProverInstanceID, out proverInstance);
        if (ok)
        {
          prover = proverInstance.Prover;
        }
        else
        {
          //XXX add log about Prover not found in cache.
        }
      }

      if (prover != null)
      {
        return HandleGenerateTokens(prover, spec.ThirdMessage);
      }

      if (spec.SecondMessageState != null && spec.IssuerParameter != null)
      {
        prover = new Prover(spec.IssuerParameter, spec.SecondMessageState);
        proverInstanceDB.TryAdd(spec.ProverInstanceID, new ProverInstanceData(prover));
        return HandleGenerateTokens(prover, spec.ThirdMessage);

      }

      ApiArgumentFault fault = new ApiArgumentFault();
      fault.Details = "Prover with unique ID was found or SecondMessageState and IssuerParameter not provided.";
      fault.Argument = "GenerateTokensSpec.ProverInstanceID/GenerateTokensSpec.SecondMessageState/GenerateTokensSpec.IssuerParameter";
      fault.ArgumentValue = spec.ProverInstanceID.ToString();
      throw new FaultException<ApiArgumentFault>(fault);

    }
        public void TestProver()
        {
            byte[][] A = new byte[][] { };
            byte[] TI = null;
            byte[] PI = null;
            IssuerSetupParameters isp = new IssuerSetupParameters();
            isp.UidP = new byte[] { 0 };
            isp.E = new byte[] { 0 };
            IssuerKeyAndParameters ikap = isp.Generate();
            IssuerProtocolParameters ipp = new IssuerProtocolParameters(ikap);
            ipp.Attributes = A;
            ipp.NumberOfTokens = 1;
            ipp.TokenInformation = TI;
            Issuer issuer = ipp.CreateIssuer();

            FirstIssuanceMessage msg1 = null;
            SecondIssuanceMessage msg2 = null;
            ThirdIssuanceMessage msg3 = null;
    
            msg1 = issuer.GenerateFirstMessage();
            try { new Prover(null, 1, A, TI, PI, null); Assert.Fail(); } catch (ArgumentNullException) { }
            try { new Prover(ikap.IssuerParameters, -1, A, TI, PI, null); Assert.Fail(); } catch (ArgumentException) { }
            try { new Prover(ikap.IssuerParameters, 0, A, TI, PI, null); Assert.Fail(); } catch (ArgumentException) { }
            Prover prover = new Prover(ikap.IssuerParameters, 1, A, TI, PI, null);
            try { prover.GenerateTokens(msg3); Assert.Fail(); } catch (InvalidOperationException) { }
            msg2 = prover.GenerateSecondMessage(msg1);
            try { msg2 = prover.GenerateSecondMessage(msg1); Assert.Fail(); } catch (InvalidOperationException) { }
            msg3 = issuer.GenerateThirdMessage(msg2);
            prover.GenerateTokens(msg3);
            try { prover.GenerateTokens(msg3); Assert.Fail(); } catch (InvalidOperationException) { }
        }
        public void TestProverStateExport()
        {
            IssuerKeyAndParameters ikap;
            IssuerProtocolParameters ipp;
            ProverProtocolParameters ppp;
            StaticTestHelpers.GenerateTestIssuanceParameters("test issuer params", "test spec", 3, true, 6, out ikap, out ipp, out ppp);
            
            // generate test issuer parameters
            Issuer issuer = ipp.CreateIssuer();
            IssuerParameters ip = ikap.IssuerParameters;
            Prover prover = ppp.CreateProver();

            FirstIssuanceMessage msg1 = null;
            SecondIssuanceMessage msg2 = null;
            ThirdIssuanceMessage msg3 = null; 
            
            msg1 = issuer.GenerateFirstMessage();
            msg2 = prover.GenerateSecondMessage(msg1);

            PostSecondMessageState state = prover.ExportPostSecondMessageState();
            string serializedState = ip.Serialize(state);

            // complete the issuance with a new prover instance
            msg3 = issuer.GenerateThirdMessage(msg2);
            Prover prover2 = new Prover(ip, ip.Deserialize<PostSecondMessageState>(serializedState));
            prover2.GenerateTokens(msg3);
            // make sure the original prover is unusable
            try
            {
                prover.GenerateTokens(msg3);
                Assert.Fail();
            }
            catch (Exception)
            {
                // expected
            }
        
        }
 internal ProverInstanceData(Prover issuer)
 {
   this.LastAccessed = DateTime.Now;
   _prover = issuer;
 }