summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbeck <>2002-06-11 11:18:44 +0000
committerbeck <>2002-06-11 11:18:44 +0000
commita359633ab5fea6e08cd7f0886274c69a601dee32 (patch)
treeb201817161e0d3bb11ca508d90cd9732132da2ae /src
parent0ece15e0db8691cd0b32d116741d53bd50772910 (diff)
downloadopenbsd-a359633ab5fea6e08cd7f0886274c69a601dee32.tar.gz
openbsd-a359633ab5fea6e08cd7f0886274c69a601dee32.tar.bz2
openbsd-a359633ab5fea6e08cd7f0886274c69a601dee32.zip
Make asymmetric crypto work in userland
this will only be used if you both have a card that supports it with a working driver and you set sysctl kern.userasymcrypto=1
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/engine/hw_cryptodev.c150
-rw-r--r--src/lib/libssl/src/crypto/engine/hw_cryptodev.c150
2 files changed, 228 insertions, 72 deletions
diff --git a/src/lib/libcrypto/engine/hw_cryptodev.c b/src/lib/libcrypto/engine/hw_cryptodev.c
index 0a2279f4e3..8f55798421 100644
--- a/src/lib/libcrypto/engine/hw_cryptodev.c
+++ b/src/lib/libcrypto/engine/hw_cryptodev.c
@@ -42,10 +42,12 @@
42#include <ssl/objects.h> 42#include <ssl/objects.h>
43#include <ssl/engine.h> 43#include <ssl/engine.h>
44#include <ssl/evp.h> 44#include <ssl/evp.h>
45#include <errno.h>
46#include <string.h>
45 47
46static int cryptodev_fd = -1; 48static int cryptodev_fd = -1;
47static int cryptodev_sessions = 0; 49static int cryptodev_sessions = 0;
48static u_int32_t cryptodev_symfeat = 0; 50static u_int32_t cryptodev_asymfeat = 0;
49 51
50static int bn2crparam(const BIGNUM *a, struct crparam *crp); 52static int bn2crparam(const BIGNUM *a, struct crparam *crp);
51static int crparam2bn(struct crparam *crp, BIGNUM *a); 53static int crparam2bn(struct crparam *crp, BIGNUM *a);
@@ -67,6 +69,10 @@ static int cryptodev_dh_compute_key(unsigned char *key,
67 const BIGNUM *pub_key, DH *dh); 69 const BIGNUM *pub_key, DH *dh);
68 70
69static const ENGINE_CMD_DEFN cryptodev_defns[] = { 71static const ENGINE_CMD_DEFN cryptodev_defns[] = {
72 {ENGINE_CMD_BASE,
73 "SO_PATH",
74 "Specifies the path to the some stupid shared library",
75 ENGINE_CMD_FLAG_STRING},
70 { 0, NULL, NULL, 0 } 76 { 0, NULL, NULL, 0 }
71}; 77};
72 78
@@ -124,8 +130,6 @@ check_dev_crypto()
124 return (0); 130 return (0);
125 } 131 }
126 } 132 }
127 ioctl(cryptodev_fd, CIOCSYMFEAT, &cryptodev_symfeat);
128
129 return (1); 133 return (1);
130} 134}
131 135
@@ -260,6 +264,8 @@ get_cryptodev_digests(const int **cnids)
260int 264int
261cryptodev_usable_ciphers(const int **nids) 265cryptodev_usable_ciphers(const int **nids)
262{ 266{
267 struct syslog_data sd = SYSLOG_DATA_INIT;
268
263 if (!check_dev_crypto()) { 269 if (!check_dev_crypto()) {
264 *nids = NULL; 270 *nids = NULL;
265 return (0); 271 return (0);
@@ -270,6 +276,14 @@ cryptodev_usable_ciphers(const int **nids)
270 * yet set up to do them 276 * yet set up to do them
271 */ 277 */
272 return (get_cryptodev_ciphers(nids)); 278 return (get_cryptodev_ciphers(nids));
279
280 /*
281 * find out what asymmetric crypto algorithms we support
282 */
283 if (ioctl(cryptodev_fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) {
284 syslog_r(LOG_ERR, &sd, "CIOCASYMFEAT failed (%m)");
285 }
286
273} 287}
274 288
275int 289int
@@ -652,23 +666,23 @@ cryptodev_sym(struct crypt_kop *kop, int rlen, BIGNUM *r, int slen, BIGNUM *s)
652 int ret = -1; 666 int ret = -1;
653 667
654 if (r) { 668 if (r) {
655 kop->crk_param[kop->crk_iparams].crp_p = malloc(rlen); 669 kop->crk_param[kop->crk_iparams].crp_p = calloc(rlen, sizeof(char));
656 kop->crk_param[kop->crk_iparams].crp_nbits = rlen * 8; 670 kop->crk_param[kop->crk_iparams].crp_nbits = rlen * 8;
657 kop->crk_oparams++; 671 kop->crk_oparams++;
658 } 672 }
659 if (s) { 673 if (s) {
660 kop->crk_param[kop->crk_iparams+1].crp_p = malloc(slen); 674 kop->crk_param[kop->crk_iparams+1].crp_p = calloc(slen, sizeof(char));
661 kop->crk_param[kop->crk_iparams+1].crp_nbits = slen * 8; 675 kop->crk_param[kop->crk_iparams+1].crp_nbits = slen * 8;
662 kop->crk_oparams++; 676 kop->crk_oparams++;
663 } 677 }
664 678
665 if (ioctl(cryptodev_fd, CIOCKEY, &kop) == 0) { 679 if (ioctl(cryptodev_fd, CIOCKEY, kop) == 0) {
666 if (r) 680 if (r)
667 crparam2bn(&kop->crk_param[3], r); 681 crparam2bn(&kop->crk_param[kop->crk_iparams], r);
668 if (s) 682 if (s)
669 crparam2bn(&kop->crk_param[4], s); 683 crparam2bn(&kop->crk_param[kop->crk_iparams+1], s);
670 ret = 0; 684 ret = 0;
671 } 685 }
672 return (ret); 686 return (ret);
673} 687}
674 688
@@ -677,8 +691,17 @@ cryptodev_bn_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
677 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont) 691 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont)
678{ 692{
679 struct crypt_kop kop; 693 struct crypt_kop kop;
680 int ret = 0; 694 int ret = 1;
695
696 /* Currently, we know we can do mod exp iff we can do any
697 * asymmetric operations at all.
698 */
699 if (cryptodev_asymfeat == 0) {
700 ret = BN_mod_exp(r, a, p, m, ctx);
701 return (ret);
702 }
681 703
704
682 memset(&kop, 0, sizeof kop); 705 memset(&kop, 0, sizeof kop);
683 kop.crk_op = CRK_MOD_EXP; 706 kop.crk_op = CRK_MOD_EXP;
684 707
@@ -692,23 +715,35 @@ cryptodev_bn_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
692 kop.crk_iparams = 3; 715 kop.crk_iparams = 3;
693 716
694 if (cryptodev_sym(&kop, BN_num_bytes(m), r, 0, NULL) == -1) { 717 if (cryptodev_sym(&kop, BN_num_bytes(m), r, 0, NULL) == -1) {
695 ret = BN_mod_exp(r, a, p, m, ctx); 718 const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
719 ret = meth->bn_mod_exp(r, a, p, m, ctx, in_mont);
696 } 720 }
697err: 721err:
698 zapparams(&kop); 722 zapparams(&kop);
699 return (ret); 723 return (ret);
700} 724}
701 725
726static int
727cryptodev_rsa_nocrt_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)
728{
729 int r;
730 BN_CTX *ctx;
731
732 ctx = BN_CTX_new();
733 r = cryptodev_bn_mod_exp(r0, I, rsa->d, rsa->n, ctx, NULL);
734 BN_CTX_free(ctx);
735 return (r);
736}
702 737
703static int 738static int
704cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa) 739cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)
705{ 740{
706 struct crypt_kop kop; 741 struct crypt_kop kop;
707 int ret = 0; 742 int ret = 1;
708 743
709 if (!rsa->p || !rsa->q || !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) { 744 if (!rsa->p || !rsa->q || !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) {
710 /* XXX 0 means failure?? */ 745 /* XXX 0 means failure?? */
711 goto err; 746 return (0);
712 } 747 }
713 748
714 memset(&kop, 0, sizeof kop); 749 memset(&kop, 0, sizeof kop);
@@ -730,7 +765,6 @@ cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)
730 765
731 if (cryptodev_sym(&kop, BN_num_bytes(rsa->n), r0, 0, NULL) == -1) { 766 if (cryptodev_sym(&kop, BN_num_bytes(rsa->n), r0, 0, NULL) == -1) {
732 const RSA_METHOD *meth = RSA_PKCS1_SSLeay(); 767 const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
733
734 ret = (*meth->rsa_mod_exp)(r0, I, rsa); 768 ret = (*meth->rsa_mod_exp)(r0, I, rsa);
735 } 769 }
736err: 770err:
@@ -744,8 +778,8 @@ static RSA_METHOD cryptodev_rsa = {
744 NULL, /* rsa_pub_dec */ 778 NULL, /* rsa_pub_dec */
745 NULL, /* rsa_priv_enc */ 779 NULL, /* rsa_priv_enc */
746 NULL, /* rsa_priv_dec */ 780 NULL, /* rsa_priv_dec */
747 cryptodev_rsa_mod_exp, /* rsa_mod_exp */ 781 NULL,
748 cryptodev_bn_mod_exp, /* bn_mod_exp */ 782 NULL,
749 NULL, /* init */ 783 NULL, /* init */
750 NULL, /* finish */ 784 NULL, /* finish */
751 0, /* flags */ 785 0, /* flags */
@@ -798,7 +832,6 @@ cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
798 dsaret->s = s; 832 dsaret->s = s;
799 } else { 833 } else {
800 const DSA_METHOD *meth = DSA_OpenSSL(); 834 const DSA_METHOD *meth = DSA_OpenSSL();
801
802 BN_free(r); 835 BN_free(r);
803 BN_free(s); 836 BN_free(s);
804 dsaret = (meth->dsa_do_sign)(dgst, dlen, dsa); 837 dsaret = (meth->dsa_do_sign)(dgst, dlen, dsa);
@@ -814,7 +847,7 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen,
814 DSA_SIG *sig, DSA *dsa) 847 DSA_SIG *sig, DSA *dsa)
815{ 848{
816 struct crypt_kop kop; 849 struct crypt_kop kop;
817 int dsaret = 0; 850 int dsaret = 1;
818 851
819 memset(&kop, 0, sizeof kop); 852 memset(&kop, 0, sizeof kop);
820 kop.crk_op = CRK_DSA_VERIFY; 853 kop.crk_op = CRK_DSA_VERIFY;
@@ -849,13 +882,14 @@ err:
849 return (dsaret); 882 return (dsaret);
850} 883}
851 884
885
852static DSA_METHOD cryptodev_dsa = { 886static DSA_METHOD cryptodev_dsa = {
853 "cryptodev DSA method", 887 "cryptodev DSA method",
854 cryptodev_dsa_do_sign, 888 NULL,
855 NULL, /* dsa_sign_setup */ 889 NULL, /* dsa_sign_setup */
856 cryptodev_dsa_verify, 890 NULL,
857 NULL, /* dsa_mod_exp */ 891 NULL, /* dsa_mod_exp */
858 cryptodev_dsa_bn_mod_exp, /* bn_mod_exp */ 892 NULL,
859 NULL, /* init */ 893 NULL, /* init */
860 NULL, /* finish */ 894 NULL, /* finish */
861 0, /* flags */ 895 0, /* flags */
@@ -874,7 +908,7 @@ static int
874cryptodev_dh_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) 908cryptodev_dh_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh)
875{ 909{
876 struct crypt_kop kop; 910 struct crypt_kop kop;
877 int dhret = 0; 911 int dhret = 1;
878 int keylen; 912 int keylen;
879 913
880 keylen = BN_num_bits(dh->p); 914 keylen = BN_num_bits(dh->p);
@@ -909,8 +943,8 @@ err:
909static DH_METHOD cryptodev_dh = { 943static DH_METHOD cryptodev_dh = {
910 "cryptodev DH method", 944 "cryptodev DH method",
911 NULL, /* cryptodev_dh_generate_key */ 945 NULL, /* cryptodev_dh_generate_key */
912 cryptodev_dh_compute_key, 946 NULL,
913 cryptodev_mod_exp_dh, 947 NULL,
914 NULL, 948 NULL,
915 NULL, 949 NULL,
916 0, /* flags */ 950 0, /* flags */
@@ -939,12 +973,24 @@ void
939ENGINE_load_cryptodev(void) 973ENGINE_load_cryptodev(void)
940{ 974{
941 ENGINE *engine = ENGINE_new(); 975 ENGINE *engine = ENGINE_new();
942 const RSA_METHOD *rsa_meth; 976 struct syslog_data sd = SYSLOG_DATA_INIT;
943 const DH_METHOD *dh_meth;
944 977
945 if (engine == NULL) 978 if (engine == NULL)
946 return; 979 return;
947 980
981
982 if (!check_dev_crypto()) {
983 return;
984 }
985
986 /*
987 * find out what asymmetric crypto algorithms we support
988 */
989 if (ioctl(cryptodev_fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) {
990 syslog_r(LOG_ERR, &sd, "CIOCASYMFEAT failed (%m)");
991 return;
992 }
993
948 if (!ENGINE_set_id(engine, "cryptodev") || 994 if (!ENGINE_set_id(engine, "cryptodev") ||
949 !ENGINE_set_name(engine, "OpenBSD cryptodev engine") || 995 !ENGINE_set_name(engine, "OpenBSD cryptodev engine") ||
950 !ENGINE_set_ciphers(engine, cryptodev_engine_ciphers) || 996 !ENGINE_set_ciphers(engine, cryptodev_engine_ciphers) ||
@@ -955,26 +1001,58 @@ ENGINE_load_cryptodev(void)
955 return; 1001 return;
956 } 1002 }
957 1003
958 if ((cryptodev_symfeat & CRSFEAT_RSA) && 1004 if (ENGINE_set_RSA(engine, &cryptodev_rsa)) {
959 ENGINE_set_RSA(engine, &cryptodev_rsa)) { 1005 const RSA_METHOD *rsa_meth = RSA_PKCS1_SSLeay();
960 rsa_meth = RSA_PKCS1_SSLeay(); 1006
1007 cryptodev_rsa.bn_mod_exp = rsa_meth->bn_mod_exp;
1008 cryptodev_rsa.rsa_mod_exp = rsa_meth->rsa_mod_exp;
961 cryptodev_rsa.rsa_pub_enc = rsa_meth->rsa_pub_enc; 1009 cryptodev_rsa.rsa_pub_enc = rsa_meth->rsa_pub_enc;
962 cryptodev_rsa.rsa_pub_dec = rsa_meth->rsa_pub_dec; 1010 cryptodev_rsa.rsa_pub_dec = rsa_meth->rsa_pub_dec;
963 cryptodev_rsa.rsa_priv_enc = rsa_meth->rsa_priv_dec; 1011 cryptodev_rsa.rsa_priv_enc = rsa_meth->rsa_priv_enc;
964 cryptodev_rsa.rsa_priv_dec = rsa_meth->rsa_priv_dec; 1012 cryptodev_rsa.rsa_priv_dec = rsa_meth->rsa_priv_dec;
1013 if (cryptodev_asymfeat & CRF_MOD_EXP) {
1014 cryptodev_rsa.bn_mod_exp = cryptodev_bn_mod_exp;
1015 if (cryptodev_asymfeat & CRF_MOD_EXP_CRT)
1016 cryptodev_rsa.rsa_mod_exp =
1017 cryptodev_rsa_mod_exp;
1018 else
1019 cryptodev_rsa.rsa_mod_exp =
1020 cryptodev_rsa_nocrt_mod_exp;
1021 }
965 } 1022 }
966 1023
967 if ((cryptodev_symfeat & CRSFEAT_DSA) && 1024#if 0
968 ENGINE_set_DSA(engine, &cryptodev_dsa)) { 1025 /* dsa is currently busted. */
1026 if (ENGINE_set_DSA(engine, &cryptodev_dsa)) {
1027 const DSA_METHOD *meth = DSA_OpenSSL();
1028
1029 cryptodev_dsa.dsa_do_sign = meth->dsa_do_sign;
1030 cryptodev_dsa.dsa_do_verify = meth->dsa_do_verify;
1031 cryptodev_dsa.bn_mod_exp = meth->bn_mod_exp;
1032 if (cryptodev_asymfeat & CRF_DSA_SIGN)
1033 cryptodev_dsa.dsa_do_sign = cryptodev_dsa_do_sign;
1034 if (cryptodev_asymfeat & CRF_DSA_VERIFY)
1035 cryptodev_dsa.dsa_do_verify = cryptodev_dsa_verify;
1036 if (cryptodev_asymfeat & CRF_MOD_EXP)
1037 cryptodev_dsa.bn_mod_exp = cryptodev_dsa_bn_mod_exp;
969 } 1038 }
1039#endif
1040
1041
1042 if (ENGINE_set_DH(engine, &cryptodev_dh)){
1043 const DH_METHOD *dh_meth = DH_OpenSSL();
970 1044
971 if ((cryptodev_symfeat & CRSFEAT_DH) &&
972 ENGINE_set_DH(engine, &cryptodev_dh)) {
973 dh_meth = DH_OpenSSL();
974 cryptodev_dh.generate_key = dh_meth->generate_key; 1045 cryptodev_dh.generate_key = dh_meth->generate_key;
975 cryptodev_dh.compute_key = dh_meth->compute_key; 1046 cryptodev_dh.compute_key = dh_meth->compute_key;
1047 cryptodev_dh.bn_mod_exp = dh_meth->bn_mod_exp;
1048 if (cryptodev_asymfeat & CRF_MOD_EXP) {
1049 cryptodev_dh.bn_mod_exp = cryptodev_mod_exp_dh;
1050 if (cryptodev_asymfeat & CRF_DH_COMPUTE_KEY)
1051 cryptodev_dh.compute_key =
1052 cryptodev_dh_compute_key;
1053 }
976 } 1054 }
977 1055
978 ENGINE_add(engine); 1056 ENGINE_add(engine);
979 ENGINE_free(engine); 1057 ENGINE_free(engine);
980 ERR_clear_error(); 1058 ERR_clear_error();
diff --git a/src/lib/libssl/src/crypto/engine/hw_cryptodev.c b/src/lib/libssl/src/crypto/engine/hw_cryptodev.c
index 0a2279f4e3..8f55798421 100644
--- a/src/lib/libssl/src/crypto/engine/hw_cryptodev.c
+++ b/src/lib/libssl/src/crypto/engine/hw_cryptodev.c
@@ -42,10 +42,12 @@
42#include <ssl/objects.h> 42#include <ssl/objects.h>
43#include <ssl/engine.h> 43#include <ssl/engine.h>
44#include <ssl/evp.h> 44#include <ssl/evp.h>
45#include <errno.h>
46#include <string.h>
45 47
46static int cryptodev_fd = -1; 48static int cryptodev_fd = -1;
47static int cryptodev_sessions = 0; 49static int cryptodev_sessions = 0;
48static u_int32_t cryptodev_symfeat = 0; 50static u_int32_t cryptodev_asymfeat = 0;
49 51
50static int bn2crparam(const BIGNUM *a, struct crparam *crp); 52static int bn2crparam(const BIGNUM *a, struct crparam *crp);
51static int crparam2bn(struct crparam *crp, BIGNUM *a); 53static int crparam2bn(struct crparam *crp, BIGNUM *a);
@@ -67,6 +69,10 @@ static int cryptodev_dh_compute_key(unsigned char *key,
67 const BIGNUM *pub_key, DH *dh); 69 const BIGNUM *pub_key, DH *dh);
68 70
69static const ENGINE_CMD_DEFN cryptodev_defns[] = { 71static const ENGINE_CMD_DEFN cryptodev_defns[] = {
72 {ENGINE_CMD_BASE,
73 "SO_PATH",
74 "Specifies the path to the some stupid shared library",
75 ENGINE_CMD_FLAG_STRING},
70 { 0, NULL, NULL, 0 } 76 { 0, NULL, NULL, 0 }
71}; 77};
72 78
@@ -124,8 +130,6 @@ check_dev_crypto()
124 return (0); 130 return (0);
125 } 131 }
126 } 132 }
127 ioctl(cryptodev_fd, CIOCSYMFEAT, &cryptodev_symfeat);
128
129 return (1); 133 return (1);
130} 134}
131 135
@@ -260,6 +264,8 @@ get_cryptodev_digests(const int **cnids)
260int 264int
261cryptodev_usable_ciphers(const int **nids) 265cryptodev_usable_ciphers(const int **nids)
262{ 266{
267 struct syslog_data sd = SYSLOG_DATA_INIT;
268
263 if (!check_dev_crypto()) { 269 if (!check_dev_crypto()) {
264 *nids = NULL; 270 *nids = NULL;
265 return (0); 271 return (0);
@@ -270,6 +276,14 @@ cryptodev_usable_ciphers(const int **nids)
270 * yet set up to do them 276 * yet set up to do them
271 */ 277 */
272 return (get_cryptodev_ciphers(nids)); 278 return (get_cryptodev_ciphers(nids));
279
280 /*
281 * find out what asymmetric crypto algorithms we support
282 */
283 if (ioctl(cryptodev_fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) {
284 syslog_r(LOG_ERR, &sd, "CIOCASYMFEAT failed (%m)");
285 }
286
273} 287}
274 288
275int 289int
@@ -652,23 +666,23 @@ cryptodev_sym(struct crypt_kop *kop, int rlen, BIGNUM *r, int slen, BIGNUM *s)
652 int ret = -1; 666 int ret = -1;
653 667
654 if (r) { 668 if (r) {
655 kop->crk_param[kop->crk_iparams].crp_p = malloc(rlen); 669 kop->crk_param[kop->crk_iparams].crp_p = calloc(rlen, sizeof(char));
656 kop->crk_param[kop->crk_iparams].crp_nbits = rlen * 8; 670 kop->crk_param[kop->crk_iparams].crp_nbits = rlen * 8;
657 kop->crk_oparams++; 671 kop->crk_oparams++;
658 } 672 }
659 if (s) { 673 if (s) {
660 kop->crk_param[kop->crk_iparams+1].crp_p = malloc(slen); 674 kop->crk_param[kop->crk_iparams+1].crp_p = calloc(slen, sizeof(char));
661 kop->crk_param[kop->crk_iparams+1].crp_nbits = slen * 8; 675 kop->crk_param[kop->crk_iparams+1].crp_nbits = slen * 8;
662 kop->crk_oparams++; 676 kop->crk_oparams++;
663 } 677 }
664 678
665 if (ioctl(cryptodev_fd, CIOCKEY, &kop) == 0) { 679 if (ioctl(cryptodev_fd, CIOCKEY, kop) == 0) {
666 if (r) 680 if (r)
667 crparam2bn(&kop->crk_param[3], r); 681 crparam2bn(&kop->crk_param[kop->crk_iparams], r);
668 if (s) 682 if (s)
669 crparam2bn(&kop->crk_param[4], s); 683 crparam2bn(&kop->crk_param[kop->crk_iparams+1], s);
670 ret = 0; 684 ret = 0;
671 } 685 }
672 return (ret); 686 return (ret);
673} 687}
674 688
@@ -677,8 +691,17 @@ cryptodev_bn_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
677 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont) 691 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont)
678{ 692{
679 struct crypt_kop kop; 693 struct crypt_kop kop;
680 int ret = 0; 694 int ret = 1;
695
696 /* Currently, we know we can do mod exp iff we can do any
697 * asymmetric operations at all.
698 */
699 if (cryptodev_asymfeat == 0) {
700 ret = BN_mod_exp(r, a, p, m, ctx);
701 return (ret);
702 }
681 703
704
682 memset(&kop, 0, sizeof kop); 705 memset(&kop, 0, sizeof kop);
683 kop.crk_op = CRK_MOD_EXP; 706 kop.crk_op = CRK_MOD_EXP;
684 707
@@ -692,23 +715,35 @@ cryptodev_bn_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
692 kop.crk_iparams = 3; 715 kop.crk_iparams = 3;
693 716
694 if (cryptodev_sym(&kop, BN_num_bytes(m), r, 0, NULL) == -1) { 717 if (cryptodev_sym(&kop, BN_num_bytes(m), r, 0, NULL) == -1) {
695 ret = BN_mod_exp(r, a, p, m, ctx); 718 const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
719 ret = meth->bn_mod_exp(r, a, p, m, ctx, in_mont);
696 } 720 }
697err: 721err:
698 zapparams(&kop); 722 zapparams(&kop);
699 return (ret); 723 return (ret);
700} 724}
701 725
726static int
727cryptodev_rsa_nocrt_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)
728{
729 int r;
730 BN_CTX *ctx;
731
732 ctx = BN_CTX_new();
733 r = cryptodev_bn_mod_exp(r0, I, rsa->d, rsa->n, ctx, NULL);
734 BN_CTX_free(ctx);
735 return (r);
736}
702 737
703static int 738static int
704cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa) 739cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)
705{ 740{
706 struct crypt_kop kop; 741 struct crypt_kop kop;
707 int ret = 0; 742 int ret = 1;
708 743
709 if (!rsa->p || !rsa->q || !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) { 744 if (!rsa->p || !rsa->q || !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) {
710 /* XXX 0 means failure?? */ 745 /* XXX 0 means failure?? */
711 goto err; 746 return (0);
712 } 747 }
713 748
714 memset(&kop, 0, sizeof kop); 749 memset(&kop, 0, sizeof kop);
@@ -730,7 +765,6 @@ cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)
730 765
731 if (cryptodev_sym(&kop, BN_num_bytes(rsa->n), r0, 0, NULL) == -1) { 766 if (cryptodev_sym(&kop, BN_num_bytes(rsa->n), r0, 0, NULL) == -1) {
732 const RSA_METHOD *meth = RSA_PKCS1_SSLeay(); 767 const RSA_METHOD *meth = RSA_PKCS1_SSLeay();
733
734 ret = (*meth->rsa_mod_exp)(r0, I, rsa); 768 ret = (*meth->rsa_mod_exp)(r0, I, rsa);
735 } 769 }
736err: 770err:
@@ -744,8 +778,8 @@ static RSA_METHOD cryptodev_rsa = {
744 NULL, /* rsa_pub_dec */ 778 NULL, /* rsa_pub_dec */
745 NULL, /* rsa_priv_enc */ 779 NULL, /* rsa_priv_enc */
746 NULL, /* rsa_priv_dec */ 780 NULL, /* rsa_priv_dec */
747 cryptodev_rsa_mod_exp, /* rsa_mod_exp */ 781 NULL,
748 cryptodev_bn_mod_exp, /* bn_mod_exp */ 782 NULL,
749 NULL, /* init */ 783 NULL, /* init */
750 NULL, /* finish */ 784 NULL, /* finish */
751 0, /* flags */ 785 0, /* flags */
@@ -798,7 +832,6 @@ cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
798 dsaret->s = s; 832 dsaret->s = s;
799 } else { 833 } else {
800 const DSA_METHOD *meth = DSA_OpenSSL(); 834 const DSA_METHOD *meth = DSA_OpenSSL();
801
802 BN_free(r); 835 BN_free(r);
803 BN_free(s); 836 BN_free(s);
804 dsaret = (meth->dsa_do_sign)(dgst, dlen, dsa); 837 dsaret = (meth->dsa_do_sign)(dgst, dlen, dsa);
@@ -814,7 +847,7 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen,
814 DSA_SIG *sig, DSA *dsa) 847 DSA_SIG *sig, DSA *dsa)
815{ 848{
816 struct crypt_kop kop; 849 struct crypt_kop kop;
817 int dsaret = 0; 850 int dsaret = 1;
818 851
819 memset(&kop, 0, sizeof kop); 852 memset(&kop, 0, sizeof kop);
820 kop.crk_op = CRK_DSA_VERIFY; 853 kop.crk_op = CRK_DSA_VERIFY;
@@ -849,13 +882,14 @@ err:
849 return (dsaret); 882 return (dsaret);
850} 883}
851 884
885
852static DSA_METHOD cryptodev_dsa = { 886static DSA_METHOD cryptodev_dsa = {
853 "cryptodev DSA method", 887 "cryptodev DSA method",
854 cryptodev_dsa_do_sign, 888 NULL,
855 NULL, /* dsa_sign_setup */ 889 NULL, /* dsa_sign_setup */
856 cryptodev_dsa_verify, 890 NULL,
857 NULL, /* dsa_mod_exp */ 891 NULL, /* dsa_mod_exp */
858 cryptodev_dsa_bn_mod_exp, /* bn_mod_exp */ 892 NULL,
859 NULL, /* init */ 893 NULL, /* init */
860 NULL, /* finish */ 894 NULL, /* finish */
861 0, /* flags */ 895 0, /* flags */
@@ -874,7 +908,7 @@ static int
874cryptodev_dh_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) 908cryptodev_dh_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh)
875{ 909{
876 struct crypt_kop kop; 910 struct crypt_kop kop;
877 int dhret = 0; 911 int dhret = 1;
878 int keylen; 912 int keylen;
879 913
880 keylen = BN_num_bits(dh->p); 914 keylen = BN_num_bits(dh->p);
@@ -909,8 +943,8 @@ err:
909static DH_METHOD cryptodev_dh = { 943static DH_METHOD cryptodev_dh = {
910 "cryptodev DH method", 944 "cryptodev DH method",
911 NULL, /* cryptodev_dh_generate_key */ 945 NULL, /* cryptodev_dh_generate_key */
912 cryptodev_dh_compute_key, 946 NULL,
913 cryptodev_mod_exp_dh, 947 NULL,
914 NULL, 948 NULL,
915 NULL, 949 NULL,
916 0, /* flags */ 950 0, /* flags */
@@ -939,12 +973,24 @@ void
939ENGINE_load_cryptodev(void) 973ENGINE_load_cryptodev(void)
940{ 974{
941 ENGINE *engine = ENGINE_new(); 975 ENGINE *engine = ENGINE_new();
942 const RSA_METHOD *rsa_meth; 976 struct syslog_data sd = SYSLOG_DATA_INIT;
943 const DH_METHOD *dh_meth;
944 977
945 if (engine == NULL) 978 if (engine == NULL)
946 return; 979 return;
947 980
981
982 if (!check_dev_crypto()) {
983 return;
984 }
985
986 /*
987 * find out what asymmetric crypto algorithms we support
988 */
989 if (ioctl(cryptodev_fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) {
990 syslog_r(LOG_ERR, &sd, "CIOCASYMFEAT failed (%m)");
991 return;
992 }
993
948 if (!ENGINE_set_id(engine, "cryptodev") || 994 if (!ENGINE_set_id(engine, "cryptodev") ||
949 !ENGINE_set_name(engine, "OpenBSD cryptodev engine") || 995 !ENGINE_set_name(engine, "OpenBSD cryptodev engine") ||
950 !ENGINE_set_ciphers(engine, cryptodev_engine_ciphers) || 996 !ENGINE_set_ciphers(engine, cryptodev_engine_ciphers) ||
@@ -955,26 +1001,58 @@ ENGINE_load_cryptodev(void)
955 return; 1001 return;
956 } 1002 }
957 1003
958 if ((cryptodev_symfeat & CRSFEAT_RSA) && 1004 if (ENGINE_set_RSA(engine, &cryptodev_rsa)) {
959 ENGINE_set_RSA(engine, &cryptodev_rsa)) { 1005 const RSA_METHOD *rsa_meth = RSA_PKCS1_SSLeay();
960 rsa_meth = RSA_PKCS1_SSLeay(); 1006
1007 cryptodev_rsa.bn_mod_exp = rsa_meth->bn_mod_exp;
1008 cryptodev_rsa.rsa_mod_exp = rsa_meth->rsa_mod_exp;
961 cryptodev_rsa.rsa_pub_enc = rsa_meth->rsa_pub_enc; 1009 cryptodev_rsa.rsa_pub_enc = rsa_meth->rsa_pub_enc;
962 cryptodev_rsa.rsa_pub_dec = rsa_meth->rsa_pub_dec; 1010 cryptodev_rsa.rsa_pub_dec = rsa_meth->rsa_pub_dec;
963 cryptodev_rsa.rsa_priv_enc = rsa_meth->rsa_priv_dec; 1011 cryptodev_rsa.rsa_priv_enc = rsa_meth->rsa_priv_enc;
964 cryptodev_rsa.rsa_priv_dec = rsa_meth->rsa_priv_dec; 1012 cryptodev_rsa.rsa_priv_dec = rsa_meth->rsa_priv_dec;
1013 if (cryptodev_asymfeat & CRF_MOD_EXP) {
1014 cryptodev_rsa.bn_mod_exp = cryptodev_bn_mod_exp;
1015 if (cryptodev_asymfeat & CRF_MOD_EXP_CRT)
1016 cryptodev_rsa.rsa_mod_exp =
1017 cryptodev_rsa_mod_exp;
1018 else
1019 cryptodev_rsa.rsa_mod_exp =
1020 cryptodev_rsa_nocrt_mod_exp;
1021 }
965 } 1022 }
966 1023
967 if ((cryptodev_symfeat & CRSFEAT_DSA) && 1024#if 0
968 ENGINE_set_DSA(engine, &cryptodev_dsa)) { 1025 /* dsa is currently busted. */
1026 if (ENGINE_set_DSA(engine, &cryptodev_dsa)) {
1027 const DSA_METHOD *meth = DSA_OpenSSL();
1028
1029 cryptodev_dsa.dsa_do_sign = meth->dsa_do_sign;
1030 cryptodev_dsa.dsa_do_verify = meth->dsa_do_verify;
1031 cryptodev_dsa.bn_mod_exp = meth->bn_mod_exp;
1032 if (cryptodev_asymfeat & CRF_DSA_SIGN)
1033 cryptodev_dsa.dsa_do_sign = cryptodev_dsa_do_sign;
1034 if (cryptodev_asymfeat & CRF_DSA_VERIFY)
1035 cryptodev_dsa.dsa_do_verify = cryptodev_dsa_verify;
1036 if (cryptodev_asymfeat & CRF_MOD_EXP)
1037 cryptodev_dsa.bn_mod_exp = cryptodev_dsa_bn_mod_exp;
969 } 1038 }
1039#endif
1040
1041
1042 if (ENGINE_set_DH(engine, &cryptodev_dh)){
1043 const DH_METHOD *dh_meth = DH_OpenSSL();
970 1044
971 if ((cryptodev_symfeat & CRSFEAT_DH) &&
972 ENGINE_set_DH(engine, &cryptodev_dh)) {
973 dh_meth = DH_OpenSSL();
974 cryptodev_dh.generate_key = dh_meth->generate_key; 1045 cryptodev_dh.generate_key = dh_meth->generate_key;
975 cryptodev_dh.compute_key = dh_meth->compute_key; 1046 cryptodev_dh.compute_key = dh_meth->compute_key;
1047 cryptodev_dh.bn_mod_exp = dh_meth->bn_mod_exp;
1048 if (cryptodev_asymfeat & CRF_MOD_EXP) {
1049 cryptodev_dh.bn_mod_exp = cryptodev_mod_exp_dh;
1050 if (cryptodev_asymfeat & CRF_DH_COMPUTE_KEY)
1051 cryptodev_dh.compute_key =
1052 cryptodev_dh_compute_key;
1053 }
976 } 1054 }
977 1055
978 ENGINE_add(engine); 1056 ENGINE_add(engine);
979 ENGINE_free(engine); 1057 ENGINE_free(engine);
980 ERR_clear_error(); 1058 ERR_clear_error();