Provide RSA_{g,s}et0_factors()
authortb <tb@openbsd.org>
Sun, 18 Feb 2018 12:53:46 +0000 (12:53 +0000)
committertb <tb@openbsd.org>
Sun, 18 Feb 2018 12:53:46 +0000 (12:53 +0000)
ok jsing

lib/libcrypto/Symbols.list
lib/libcrypto/rsa/rsa.h
lib/libcrypto/rsa/rsa_lib.c

index 8f18580..79d82d4 100644 (file)
@@ -2211,6 +2211,7 @@ RSA_flags
 RSA_free
 RSA_generate_key
 RSA_generate_key_ex
+RSA_get0_factors
 RSA_get0_key
 RSA_get_default_method
 RSA_get_ex_data
@@ -2236,6 +2237,7 @@ RSA_private_decrypt
 RSA_private_encrypt
 RSA_public_decrypt
 RSA_public_encrypt
+RSA_set0_factors
 RSA_set0_key
 RSA_set_default_method
 RSA_set_ex_data
index 7e28a87..51b06ba 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: rsa.h,v 1.33 2018/02/18 12:52:13 tb Exp $ */
+/* $OpenBSD: rsa.h,v 1.34 2018/02/18 12:53:46 tb Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -399,6 +399,8 @@ void *RSA_get_ex_data(const RSA *r, int idx);
 int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d);
 void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e,
     const BIGNUM **d);
+void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q);
+int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q);
 
 RSA *RSAPublicKey_dup(RSA *rsa);
 RSA *RSAPrivateKey_dup(RSA *rsa);
index 2a73364..c31aa93 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: rsa_lib.c,v 1.32 2018/02/17 13:47:36 tb Exp $ */
+/* $OpenBSD: rsa_lib.c,v 1.33 2018/02/18 12:53:46 tb Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -289,3 +289,30 @@ RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
        if (d != NULL)
                *d = r->d;
 }
+
+void
+RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q)
+{
+       if (p != NULL)
+               *p = r->p;
+       if (q != NULL)
+               *q = r->q;
+}
+
+int
+RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q)
+{
+       if ((r->p == NULL && p == NULL) || (r->q == NULL && q == NULL))
+               return 0;
+
+       if (p != NULL) {
+               BN_free(r->p);
+               r->p = p;
+       }
+       if (q != NULL) {
+               BN_free(r->q);
+               r->q = q;
+       }
+
+       return 1;
+}