aboutsummaryrefslogtreecommitdiffstats
path: root/src/_cffi_src
diff options
context:
space:
mode:
authorPaul Kehrer <paul.l.kehrer@gmail.com>2016-05-28 22:16:17 -0500
committerAlex Gaynor <alex.gaynor@gmail.com>2016-05-28 23:16:17 -0400
commit698f9ef6e3764441d2a665b33cded8fa0942ea8e (patch)
tree9e5e4972b5c7ec762b23a7ac01985da636cfdaf0 /src/_cffi_src
parent4834ac629851212db07f55db4b9e8f485d32dbcf (diff)
downloadcryptography-698f9ef6e3764441d2a665b33cded8fa0942ea8e.tar.gz
cryptography-698f9ef6e3764441d2a665b33cded8fa0942ea8e.tar.bz2
cryptography-698f9ef6e3764441d2a665b33cded8fa0942ea8e.zip
add functions to handle opaque RSA (#2886)
* add functions to handle opaque RSA A subsequent PR will utilize these new functions. * update to latest C code from github * these can live in functions
Diffstat (limited to 'src/_cffi_src')
-rw-r--r--src/_cffi_src/openssl/rsa.py119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/_cffi_src/openssl/rsa.py b/src/_cffi_src/openssl/rsa.py
index 80aa0c22..c053d44c 100644
--- a/src/_cffi_src/openssl/rsa.py
+++ b/src/_cffi_src/openssl/rsa.py
@@ -60,6 +60,14 @@ int RSA_padding_add_PKCS1_OAEP(unsigned char *, int, const unsigned char *,
int, const unsigned char *, int);
int RSA_padding_check_PKCS1_OAEP(unsigned char *, int, const unsigned char *,
int, int, const unsigned char *, int);
+
+/* added in 1.1.0 when the RSA struct was opaqued */
+int RSA_set0_key(RSA *, BIGNUM *, BIGNUM *, BIGNUM *);
+int RSA_set0_factors(RSA *, BIGNUM *, BIGNUM *);
+int RSA_set0_crt_params(RSA *, BIGNUM *, BIGNUM *, BIGNUM *);
+void RSA_get0_key(const RSA *, BIGNUM **, BIGNUM **, BIGNUM **);
+void RSA_get0_factors(const RSA *, BIGNUM **, BIGNUM **);
+void RSA_get0_crt_params(const RSA *, BIGNUM **, BIGNUM **, BIGNUM **);
"""
MACROS = """
@@ -92,4 +100,115 @@ static const long Cryptography_HAS_RSA_OAEP_MD = 1;
static const long Cryptography_HAS_RSA_OAEP_MD = 0;
int (*EVP_PKEY_CTX_set_rsa_oaep_md)(EVP_PKEY_CTX *, EVP_MD *) = NULL;
#endif
+
+/* These functions were added in OpenSSL 1.1.0-pre5 (beta2) */
+#if OPENSSL_VERSION_NUMBER < 0x10100005 || defined(LIBRESSL_VERSION_NUMBER)
+int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d)
+{
+ /* If the fields in r are NULL, the corresponding input
+ * parameters MUST be non-NULL for n and e. d may be
+ * left NULL (in case only the public key is used).
+ *
+ * It is an error to give the results from get0 on r
+ * as input parameters.
+ */
+ if (n == r->n || e == r->e
+ || (r->d != NULL && d == r->d))
+ return 0;
+
+ if (n != NULL) {
+ BN_free(r->n);
+ r->n = n;
+ }
+ if (e != NULL) {
+ BN_free(r->e);
+ r->e = e;
+ }
+ if (d != NULL) {
+ BN_free(r->d);
+ r->d = d;
+ }
+
+ return 1;
+}
+
+int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q)
+{
+ /* If the fields in r are NULL, the corresponding input
+ * parameters MUST be non-NULL.
+ *
+ * It is an error to give the results from get0 on r
+ * as input parameters.
+ */
+ if (p == r->p || q == r->q)
+ return 0;
+
+ if (p != NULL) {
+ BN_free(r->p);
+ r->p = p;
+ }
+ if (q != NULL) {
+ BN_free(r->q);
+ r->q = q;
+ }
+
+ return 1;
+}
+
+int RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp)
+{
+ /* If the fields in r are NULL, the corresponding input
+ * parameters MUST be non-NULL.
+ *
+ * It is an error to give the results from get0 on r
+ * as input parameters.
+ */
+ if (dmp1 == r->dmp1 || dmq1 == r->dmq1 || iqmp == r->iqmp)
+ return 0;
+
+ if (dmp1 != NULL) {
+ BN_free(r->dmp1);
+ r->dmp1 = dmp1;
+ }
+ if (dmq1 != NULL) {
+ BN_free(r->dmq1);
+ r->dmq1 = dmq1;
+ }
+ if (iqmp != NULL) {
+ BN_free(r->iqmp);
+ r->iqmp = iqmp;
+ }
+
+ return 1;
+}
+
+void RSA_get0_key(const RSA *r, BIGNUM **n, BIGNUM **e, BIGNUM **d)
+{
+ if (n != NULL)
+ *n = r->n;
+ if (e != NULL)
+ *e = r->e;
+ if (d != NULL)
+ *d = r->d;
+}
+
+void RSA_get0_factors(const RSA *r, BIGNUM **p, BIGNUM **q)
+{
+ if (p != NULL)
+ *p = r->p;
+ if (q != NULL)
+ *q = r->q;
+}
+
+void RSA_get0_crt_params(const RSA *r,
+ BIGNUM **dmp1, BIGNUM **dmq1, BIGNUM **iqmp)
+{
+ if (dmp1 != NULL)
+ *dmp1 = r->dmp1;
+ if (dmq1 != NULL)
+ *dmq1 = r->dmq1;
+ if (iqmp != NULL)
+ *iqmp = r->iqmp;
+}
+#endif
"""