}
}
+
+ [DllImport (BTLS_DYLIB)]
+ extern static IntPtr mono_btls_key_new ();
+
[DllImport (BTLS_DYLIB)]
extern static void mono_btls_key_free (IntPtr handle);
[DllImport (BTLS_DYLIB)]
extern static int mono_btls_key_is_rsa (IntPtr handle);
+ [DllImport (BTLS_DYLIB)]
+ extern static int mono_btls_key_assign_rsa_private_key (IntPtr handle, byte[] der, int der_length);
+
new internal BoringKeyHandle Handle {
get { return (BoringKeyHandle)base.Handle; }
}
CheckError (copy != IntPtr.Zero);
return new MonoBtlsKey (new BoringKeyHandle (copy));
}
+
+ public static MonoBtlsKey CreateFromRSAPrivateKey (System.Security.Cryptography.RSA privateKey)
+ {
+ var keyData = Mono.Security.Cryptography.PKCS8.PrivateKeyInfo.Encode (privateKey);
+ var key = new MonoBtlsKey (new BoringKeyHandle (mono_btls_key_new ()));
+
+ var ret = mono_btls_key_assign_rsa_private_key (key.Handle.DangerousGetHandle (), keyData, keyData.Length);
+ if (ret == 0)
+ throw new MonoBtlsException ("Assigning private key failed.");
+
+ return key;
+ }
}
}
#endif
class X509CertificateImplBtls : X509Certificate2Impl
{
MonoBtlsX509 x509;
- MonoBtlsKey privateKey;
+ MonoBtlsKey nativePrivateKey;
X500DistinguishedName subjectName;
X500DistinguishedName issuerName;
X509CertificateImplCollection intermediateCerts;
{
disallowFallback = other.disallowFallback;
x509 = other.x509 != null ? other.x509.Copy () : null;
- privateKey = other.privateKey != null ? other.privateKey.Copy () : null;
+ nativePrivateKey = other.nativePrivateKey != null ? other.nativePrivateKey.Copy () : null;
+ fallback = other.fallback != null ? (X509Certificate2Impl)other.fallback.Clone () : null;
if (other.intermediateCerts != null)
intermediateCerts = other.intermediateCerts.Clone ();
}
internal MonoBtlsKey NativePrivateKey {
get {
ThrowIfContextInvalid ();
- return privateKey;
+ if (nativePrivateKey == null && FallbackImpl.HasPrivateKey) {
+ var key = FallbackImpl.PrivateKey as RSA;
+ if (key == null)
+ throw new NotSupportedException ("Currently only supports RSA private keys.");
+ nativePrivateKey = MonoBtlsKey.CreateFromRSAPrivateKey (key);
+ }
+ return nativePrivateKey;
}
}
}
public override bool HasPrivateKey {
- get { return privateKey != null; }
+ get { return nativePrivateKey != null || FallbackImpl.HasPrivateKey; }
}
public override X500DistinguishedName IssuerName {
public override AsymmetricAlgorithm PrivateKey {
get {
- if (privateKey == null || !privateKey.IsRsa)
- return null;
- var bytes = privateKey.GetBytes (true);
+ if (nativePrivateKey == null || !nativePrivateKey.IsRsa)
+ return FallbackImpl.PrivateKey;
+ var bytes = nativePrivateKey.GetBytes (true);
return PKCS8.PrivateKeyInfo.DecodeRSA (bytes);
}
- set { FallbackImpl.PrivateKey = value; }
+ set {
+ nativePrivateKey = null;
+ FallbackImpl.PrivateKey = value;
+ }
}
public override PublicKey PublicKey {
x509 = pkcs12.GetCertificate (0);
if (pkcs12.HasPrivateKey)
- privateKey = pkcs12.GetPrivateKey ();
+ nativePrivateKey = pkcs12.GetPrivateKey ();
if (pkcs12.Count > 1) {
intermediateCerts = new X509CertificateImplCollection ();
for (int i = 0; i < pkcs12.Count; i++) {
x509.Dispose ();
x509 = null;
}
- if (privateKey != null) {
- privateKey = null;
- privateKey = null;
+ if (nativePrivateKey != null) {
+ nativePrivateKey = null;
}
subjectName = null;
issuerName = null;
#include <btls-key.h>
+MONO_API EVP_PKEY *
+mono_btls_key_new ()
+{
+ return EVP_PKEY_new ();
+}
+
MONO_API void
mono_btls_key_free (EVP_PKEY *pkey)
{
return pkey->type == EVP_PKEY_RSA;
}
+MONO_API int
+mono_btls_key_assign_rsa_private_key (EVP_PKEY *pkey, uint8_t **der_data, size_t der_length)
+{
+ RSA *rsa;
+ int ret;
+
+ rsa = RSA_private_key_from_bytes (der_data, der_length);
+ if (!rsa)
+ return 0;
+
+ return EVP_PKEY_assign_RSA (pkey, rsa);
+}
+
MONO_API int
mono_btls_key_get_bytes (EVP_PKEY *pkey, uint8_t **buffer, int *size, int include_private_bits)
{