public byte[] Decrypt(byte[] data, byte[] iv = null) { byte[] paddedData; int unpadded = data.Length % BlockSize; paddedData = unpadded == 0 ? data : Globs.AddZeroToEnd(data, BlockSize - unpadded); #if TSS_USE_BCRYPT paddedData = Key.Decrypt(paddedData, null, iv ?? IV); return(Globs.CopyData(paddedData, 0, data.Length)); #else bool externalIV = iv != null && iv.Length > 0; if (externalIV) { Alg.IV = iv; } var tempOut = new byte[data.Length]; ICryptoTransform dec = Alg.CreateDecryptor(); using (var outStream = new MemoryStream(paddedData)) { var s = new CryptoStream(outStream, dec, CryptoStreamMode.Read); int numPlaintextBytes = s.Read(tempOut, 0, data.Length); Debug.Assert(numPlaintextBytes == data.Length); } if (externalIV) { var src = data; var res = tempOut; if (res.Length > iv.Length) { src = Globs.CopyData(paddedData, src.Length - iv.Length, iv.Length); res = Globs.CopyData(tempOut, res.Length - iv.Length, iv.Length); } switch (Alg.Mode) { case CipherMode.CBC: case CipherMode.CFB: src.CopyTo(iv, 0); break; case CipherMode.OFB: XorEngine.Xor(res, src).CopyTo(iv, 0); break; case CipherMode.ECB: break; case CipherMode.CTS: Globs.Throw <ArgumentException>("Decrypt: Unsupported symmetric mode"); break; } } return(tempOut); #endif }
public byte[] DecryptOaep(byte[] cipherText, byte[] label) { #if TSS_USE_BCRYPT var paddingInfo = new BCryptOaepPaddingInfo(OaepHash, label); byte[] plainText = Key.Decrypt(cipherText, paddingInfo); #elif false var rr = new RawRsa(RsaProvider.ExportParameters(true), RsaProvider.KeySize); byte[] plainText = rr.OaepDecrypt(cipherText, OaepHash, label); #else RSAParameters parms = RsaProvider.ExportParameters(true); var alg = new BCryptAlgorithm(Native.BCRYPT_RSA_ALGORITHM); var key = alg.LoadRSAKey(parms.Exponent, parms.Modulus, parms.P, parms.Q); var paddingInfo = new BCryptOaepPaddingInfo(OaepHash, label); byte[] plainText = key.Decrypt(cipherText, paddingInfo); key.Destroy(); alg.Close(); #endif return(plainText); }
public byte[] Decrypt(byte[] data, byte[] iv = null) { byte[] paddedData; int unpadded = data.Length % BlockSize; paddedData = unpadded == 0 ? data : Globs.AddZeroToEnd(data, BlockSize - unpadded); #if TSS_USE_BCRYPT paddedData = Key.Decrypt(paddedData, null, iv ?? IV); return(Globs.CopyData(paddedData, 0, data.Length)); #else ICryptoTransform dec = Alg.CreateDecryptor(); using (var outStream = new MemoryStream(paddedData)) { var s = new CryptoStream(outStream, dec, CryptoStreamMode.Read); var tempOut = new byte[data.Length]; int numPlaintextBytes = s.Read(tempOut, 0, data.Length); Debug.Assert(numPlaintextBytes == data.Length); return(tempOut); } #endif }