public static IServerDHParams GetResponse(RequestReqDHParams reqDhParams, string privateKey, out AsymmetricCipherKeyPair serverKeyPair, out byte[] newNonce) { var pqInnerData = DeserializeRequest(reqDhParams, privateKey); GeneratePandG(out var p, out var g); KeyGenerationParameters kgp = new DHKeyGenerationParameters(new SecureRandom(), new DHParameters(p, BigInteger.ValueOf(g))); var keyGen = GeneratorUtilities.GetKeyPairGenerator("DH"); keyGen.Init(kgp); serverKeyPair = keyGen.GenerateKeyPair(); var publicKey = (DHPublicKeyParameters)serverKeyPair.Public; var dhInnerData = new TServerDHInnerData { DhPrimeAsBinary = publicKey.Parameters.P.ToByteArray(), Nonce = pqInnerData.Nonce, ServerNonce = pqInnerData.ServerNonce, G = publicKey.Parameters.G.IntValue, GAAsBinary = publicKey.Y.ToByteArray(), ServerTime = (int)((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds() }; newNonce = pqInnerData.NewNonce; return(SerializeResponse(pqInnerData, dhInnerData)); }
private static TServerDHParamsOk SerializeResponse(TPQInnerData pqInnerData, TServerDHInnerData dhInnerData) { var dhInnerDataBuffer = Serializer.Serialize(dhInnerData); byte[] answer; try { answer = dhInnerDataBuffer.ToArray(); } finally { dhInnerDataBuffer.SafeRelease(); } var hashsum = Sha1Helper.ComputeHashsum(answer); var answerWithHash = hashsum.Concat(answer).ToArray(); AesHelper.ComputeAesParameters(pqInnerData.NewNonce, pqInnerData.ServerNonce, out var aesKeyData); var encryptedAnswer = AES.EncryptAes(aesKeyData, answerWithHash); return(new TServerDHParamsOk { EncryptedAnswerAsBinary = encryptedAnswer, Nonce = pqInnerData.Nonce, ServerNonce = pqInnerData.ServerNonce }); }