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 TPQInnerData Decrypt(RequestReqDHParams requestReqDhParams, out byte[] checksum) { var decryptedResponse = RSAHelper.RsaDecryptWithPrivate(requestReqDhParams.EncryptedDataAsBinary, PrivateKey); var decryptedResponseBuffer = PooledByteBufferAllocator.Default.Buffer(); decryptedResponseBuffer.WriteBytes(decryptedResponse); checksum = new byte[20]; decryptedResponseBuffer.ReadBytes(checksum); return((TPQInnerData)Serializer.Deserialize(decryptedResponseBuffer)); }
private static TPQInnerData DeserializeRequest(RequestReqDHParams reqDhParams, string privateKey) { var encryptedData = reqDhParams.EncryptedDataAsBinary; var innerDataWithHash = RSAHelper.RsaDecryptWithPrivate(encryptedData, privateKey); var shaHashsum = innerDataWithHash.Take(20).ToArray(); var innerData = innerDataWithHash.Skip(20).ToArray(); var hashsum = Sha1Helper.ComputeHashsum(innerData); Guard.That(shaHashsum).IsItemsEquals(hashsum); var innerDataBuffer = PooledByteBufferAllocator.Default.Buffer(innerData.Length); innerDataBuffer.WriteBytes(innerData); return(Serializer.Deserialize(innerDataBuffer).Is <TPQInnerData>()); }