1 using System.Diagnostics.Contracts;
4 // Copyright (c) Microsoft Corporation. All rights reserved.
7 // <OWNER>Microsoft</OWNER>
10 namespace System.Security.Cryptography {
11 [System.Runtime.InteropServices.ComVisible(true)]
12 public class RSAOAEPKeyExchangeFormatter : AsymmetricKeyExchangeFormatter {
13 private byte[] ParameterValue;
15 private bool? _rsaOverridesEncrypt;
16 private RandomNumberGenerator RngValue;
19 // public constructors
22 public RSAOAEPKeyExchangeFormatter() {}
23 public RSAOAEPKeyExchangeFormatter(AsymmetricAlgorithm key) {
25 throw new ArgumentNullException("key");
26 Contract.EndContractBlock();
35 public byte[] Parameter {
37 if (ParameterValue != null)
38 return (byte[]) ParameterValue.Clone();
43 ParameterValue = (byte[]) value.Clone();
45 ParameterValue = null;
50 public override String Parameters {
54 public RandomNumberGenerator Rng {
55 get { return RngValue; }
56 set { RngValue = value; }
63 public override void SetKey(AsymmetricAlgorithm key) {
65 throw new ArgumentNullException("key");
66 Contract.EndContractBlock();
68 _rsaOverridesEncrypt = default(bool?);
71 [System.Security.SecuritySafeCritical] // auto-generated
72 public override byte[] CreateKeyExchange(byte[] rgbData) {
74 throw new CryptographicUnexpectedOperationException(Environment.GetResourceString("Cryptography_MissingKey"));
76 if (OverridesEncrypt) {
77 return _rsaKey.Encrypt(rgbData, RSAEncryptionPadding.OaepSHA1);
79 return Utils.RsaOaepEncrypt(_rsaKey, SHA1.Create(), new PKCS1MaskGenerationMethod(), RandomNumberGenerator.Create(), rgbData);
83 public override byte[] CreateKeyExchange(byte[] rgbData, Type symAlgType) {
84 return CreateKeyExchange(rgbData);
87 private bool OverridesEncrypt {
89 if (!_rsaOverridesEncrypt.HasValue) {
90 _rsaOverridesEncrypt = Utils.DoesRsaKeyOverride(_rsaKey, "Encrypt", new Type[] { typeof(byte[]), typeof(RSAEncryptionPadding) });
92 return _rsaOverridesEncrypt.Value;