internal static unsafe bool RsaSign(int type, ReadOnlySpan <byte> m, int m_len, Span <byte> sigret, out int siglen, SafeRsaHandle rsa) { fixed(byte *mPtr = &m.DangerousGetPinnableReference()) fixed(byte *sigretPtr = &sigret.DangerousGetPinnableReference()) { return(RsaSign(type, mPtr, m_len, sigretPtr, out siglen, rsa)); } }
internal static RSAParameters ExportRsaParameters(SafeRsaHandle key, bool includePrivateParameters) { Debug.Assert( key != null && !key.IsInvalid, "Callers should check the key is invalid and throw an exception with a message"); if (key == null || key.IsInvalid) { throw new CryptographicException(); } SafeBignumHandle n, e, d, p, dmp1, q, dmq1, iqmp; if (!GetRsaParameters(key, out n, out e, out d, out p, out dmp1, out q, out dmq1, out iqmp)) { n.Dispose(); e.Dispose(); d.Dispose(); p.Dispose(); dmp1.Dispose(); q.Dispose(); dmq1.Dispose(); iqmp.Dispose(); throw new CryptographicException(); } using (n) using (e) using (d) using (p) using (dmp1) using (q) using (dmq1) using (iqmp) { int modulusSize = RsaSize(key); // RSACryptoServiceProvider expects P, DP, Q, DQ, and InverseQ to all // be padded up to half the modulus size. int halfModulus = modulusSize / 2; RSAParameters rsaParameters = new RSAParameters { Modulus = Crypto.ExtractBignum(n, modulusSize) !, Exponent = Crypto.ExtractBignum(e, 0) !, }; if (includePrivateParameters) { rsaParameters.D = Crypto.ExtractBignum(d, modulusSize); rsaParameters.P = Crypto.ExtractBignum(p, halfModulus); rsaParameters.DP = Crypto.ExtractBignum(dmp1, halfModulus); rsaParameters.Q = Crypto.ExtractBignum(q, halfModulus); rsaParameters.DQ = Crypto.ExtractBignum(dmq1, halfModulus); rsaParameters.InverseQ = Crypto.ExtractBignum(iqmp, halfModulus); } return(rsaParameters); } }
internal static int RsaSignPrimitive( ReadOnlySpan <byte> from, Span <byte> to, SafeRsaHandle rsa) => RsaSignPrimitive(from.Length, ref MemoryMarshal.GetReference(from), ref MemoryMarshal.GetReference(to), rsa);
private static partial int RsaPublicEncrypt( int flen, ref byte from, ref byte to, SafeRsaHandle rsa, RsaPadding padding);
internal static partial int RsaSize(SafeRsaHandle rsa);
internal static extern int RSA_size(SafeRsaHandle rsa);
internal static extern bool RSA_sign(int type, byte[] m, int m_len, byte[] sigret, out int siglen, SafeRsaHandle rsa);
internal static bool RsaVerify(int type, ReadOnlySpan <byte> m, int m_len, ReadOnlySpan <byte> sigbuf, int siglen, SafeRsaHandle rsa) => RsaVerify(type, ref MemoryMarshal.GetReference(m), m_len, ref MemoryMarshal.GetReference(sigbuf), siglen, rsa);
private extern static int RsaPublicEncrypt( int flen, ref byte from, ref byte to, SafeRsaHandle rsa, RsaPadding padding);
internal static bool RsaVerify(int type, ReadOnlySpan <byte> m, int m_len, ReadOnlySpan <byte> sigbuf, int siglen, SafeRsaHandle rsa) => RsaVerify(type, ref m.DangerousGetPinnableReference(), m_len, ref sigbuf.DangerousGetPinnableReference(), siglen, rsa);
internal static extern bool EVP_PKEY_set1_RSA(SafeEvpPKeyHandle pkey, SafeRsaHandle rsa);
internal static bool RsaSign(int type, ReadOnlySpan <byte> m, int m_len, Span <byte> sigret, out int siglen, SafeRsaHandle rsa) => RsaSign(type, ref m.DangerousGetPinnableReference(), m_len, ref sigret.DangerousGetPinnableReference(), out siglen, rsa);
internal static unsafe bool RsaVerify(int type, ReadOnlySpan <byte> m, int m_len, ReadOnlySpan <byte> sigbuf, int siglen, SafeRsaHandle rsa) { fixed(byte *mPtr = &m.DangerousGetPinnableReference()) fixed(byte *sigbufPtr = &sigbuf.DangerousGetPinnableReference()) { return(RsaVerify(type, mPtr, m_len, sigbufPtr, siglen, rsa)); } }
private static extern unsafe bool RsaSign(int type, byte *m, int m_len, byte *sigret, out int siglen, SafeRsaHandle rsa);
internal static extern bool EvpPkeySetRsa(SafeEvpPKeyHandle pkey, SafeRsaHandle rsa);
internal static bool RsaVerify(int type, ReadOnlySpan <byte> m, ReadOnlySpan <byte> sigbuf, SafeRsaHandle rsa) { bool ret = RsaVerify( type, ref MemoryMarshal.GetReference(m), m.Length, ref MemoryMarshal.GetReference(sigbuf), sigbuf.Length, rsa); if (!ret) { ErrClearError(); } return(ret); }
internal extern static int RSA_private_decrypt(int flen, byte[] from, byte[] to, SafeRsaHandle rsa, OpenSslRsaPadding padding);
private static extern bool RsaVerify(int type, ref byte m, int m_len, ref byte sigbuf, int siglen, SafeRsaHandle rsa);
internal static extern int RSA_generate_key_ex(SafeRsaHandle rsa, int bits, SafeBignumHandle e, IntPtr zero);
internal static extern int RsaGenerateKeyEx(SafeRsaHandle rsa, int bits, SafeBignumHandle e);
internal static extern bool RSA_verify(int type, byte[] m, int m_len, byte[] sigbuf, int siglen, SafeRsaHandle rsa);
internal static bool RsaSign(int type, ReadOnlySpan <byte> m, int m_len, Span <byte> sigret, out int siglen, SafeRsaHandle rsa) => RsaSign(type, ref MemoryMarshal.GetReference(m), m_len, ref MemoryMarshal.GetReference(sigret), out siglen, rsa);
private static partial int RsaVerificationPrimitive( int flen, ref byte from, ref byte to, SafeRsaHandle rsa);
private static extern bool RsaSign(int type, ref byte m, int m_len, ref byte sigret, out int siglen, SafeRsaHandle rsa);
internal static partial int RsaGenerateKeyEx(SafeRsaHandle rsa, int bits);
internal static extern int RsaSize(SafeRsaHandle rsa);
private static extern int RsaPrivateDecrypt( int flen, ref byte from, ref byte to, SafeRsaHandle rsa, RsaPadding padding);
internal static extern int RsaGenerateKeyEx(SafeRsaHandle rsa, int bits);
private static extern int RsaSignPrimitive( int flen, ref byte from, ref byte to, SafeRsaHandle rsa);
private extern static unsafe int RsaPrivateDecrypt( int flen, byte *from, byte *to, SafeRsaHandle rsa, RsaPadding padding);