diff options
author | beck <> | 2002-06-11 16:07:14 +0000 |
---|---|---|
committer | beck <> | 2002-06-11 16:07:14 +0000 |
commit | 14da1a4449f342ed1a6e07d2c7f91244e782fee6 (patch) | |
tree | a586c6b46fe4b245307978e6b845bc27db34bad5 /src | |
parent | f93ac9817d952baaa63dc9f3008ea7678ccc1697 (diff) | |
download | openbsd-14da1a4449f342ed1a6e07d2c7f91244e782fee6.tar.gz openbsd-14da1a4449f342ed1a6e07d2c7f91244e782fee6.tar.bz2 openbsd-14da1a4449f342ed1a6e07d2c7f91244e782fee6.zip |
add "dsa_dsa_mod_exp" - This mimics the software dsa_mod_exp funtion
using two mod_exp operations - otherwise we use BN_mod_exp2 entirely
in software, which makes dsa verifications glacially slow while
signatures, (which use mod_exp) are fast. This lets cards that can
only do bn_mod_exp decently offload most of dsa.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/engine/hw_cryptodev.c | 40 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/engine/hw_cryptodev.c | 40 |
2 files changed, 74 insertions, 6 deletions
diff --git a/src/lib/libcrypto/engine/hw_cryptodev.c b/src/lib/libcrypto/engine/hw_cryptodev.c index 8eea1935a6..44ac38179f 100644 --- a/src/lib/libcrypto/engine/hw_cryptodev.c +++ b/src/lib/libcrypto/engine/hw_cryptodev.c | |||
@@ -795,6 +795,38 @@ cryptodev_dsa_bn_mod_exp(DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p, | |||
795 | return (cryptodev_bn_mod_exp(r, a, p, m, ctx, m_ctx)); | 795 | return (cryptodev_bn_mod_exp(r, a, p, m, ctx, m_ctx)); |
796 | } | 796 | } |
797 | 797 | ||
798 | static int | ||
799 | cryptodev_dsa_dsa_mod_exp(DSA *dsa, BIGNUM *t1, BIGNUM *g, | ||
800 | BIGNUM *u1, BIGNUM *pub_key, BIGNUM *u2, BIGNUM *p, | ||
801 | BN_CTX *ctx, BN_MONT_CTX *mont) | ||
802 | { | ||
803 | BIGNUM t2; | ||
804 | int ret = 0; | ||
805 | |||
806 | BN_init(&t2); | ||
807 | |||
808 | /* v = ( g^u1 * y^u2 mod p ) mod q */ | ||
809 | /* let t1 = g ^ u1 mod p */ | ||
810 | ret = 0; | ||
811 | |||
812 | if (!dsa->meth->bn_mod_exp(dsa,t1,dsa->g,u1,dsa->p,ctx,mont)) | ||
813 | goto err; | ||
814 | |||
815 | /* let t2 = y ^ u2 mod p */ | ||
816 | if (!dsa->meth->bn_mod_exp(dsa,&t2,dsa->pub_key,u2,dsa->p,ctx,mont)) | ||
817 | goto err; | ||
818 | /* let u1 = t1 * t2 mod p */ | ||
819 | if (!BN_mod_mul(u1,t1,&t2,dsa->p,ctx)) | ||
820 | goto err; | ||
821 | |||
822 | BN_copy(t1,u1); | ||
823 | |||
824 | ret = 1; | ||
825 | err: | ||
826 | BN_free(&t2); | ||
827 | return(ret); | ||
828 | } | ||
829 | |||
798 | static DSA_SIG * | 830 | static DSA_SIG * |
799 | cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | 831 | cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) |
800 | { | 832 | { |
@@ -850,7 +882,6 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen, | |||
850 | struct crypt_kop kop; | 882 | struct crypt_kop kop; |
851 | int dsaret = 1; | 883 | int dsaret = 1; |
852 | 884 | ||
853 | printf("foo\n"); | ||
854 | memset(&kop, 0, sizeof kop); | 885 | memset(&kop, 0, sizeof kop); |
855 | kop.crk_op = CRK_DSA_VERIFY; | 886 | kop.crk_op = CRK_DSA_VERIFY; |
856 | 887 | ||
@@ -1029,10 +1060,12 @@ ENGINE_load_cryptodev(void) | |||
1029 | memcpy(&cryptodev_dsa, meth, sizeof(DSA_METHOD)); | 1060 | memcpy(&cryptodev_dsa, meth, sizeof(DSA_METHOD)); |
1030 | if (cryptodev_asymfeat & CRF_DSA_SIGN) | 1061 | if (cryptodev_asymfeat & CRF_DSA_SIGN) |
1031 | cryptodev_dsa.dsa_do_sign = cryptodev_dsa_do_sign; | 1062 | cryptodev_dsa.dsa_do_sign = cryptodev_dsa_do_sign; |
1063 | if (cryptodev_asymfeat & CRF_MOD_EXP) { | ||
1064 | cryptodev_dsa.bn_mod_exp = cryptodev_dsa_bn_mod_exp; | ||
1065 | cryptodev_dsa.dsa_mod_exp = cryptodev_dsa_dsa_mod_exp; | ||
1066 | } | ||
1032 | if (cryptodev_asymfeat & CRF_DSA_VERIFY) | 1067 | if (cryptodev_asymfeat & CRF_DSA_VERIFY) |
1033 | cryptodev_dsa.dsa_do_verify = cryptodev_dsa_verify; | 1068 | cryptodev_dsa.dsa_do_verify = cryptodev_dsa_verify; |
1034 | if (cryptodev_asymfeat & CRF_MOD_EXP) | ||
1035 | cryptodev_dsa.bn_mod_exp = cryptodev_dsa_bn_mod_exp; | ||
1036 | } | 1069 | } |
1037 | 1070 | ||
1038 | 1071 | ||
@@ -1054,3 +1087,4 @@ ENGINE_load_cryptodev(void) | |||
1054 | ENGINE_free(engine); | 1087 | ENGINE_free(engine); |
1055 | ERR_clear_error(); | 1088 | ERR_clear_error(); |
1056 | } | 1089 | } |
1090 | |||
diff --git a/src/lib/libssl/src/crypto/engine/hw_cryptodev.c b/src/lib/libssl/src/crypto/engine/hw_cryptodev.c index 8eea1935a6..44ac38179f 100644 --- a/src/lib/libssl/src/crypto/engine/hw_cryptodev.c +++ b/src/lib/libssl/src/crypto/engine/hw_cryptodev.c | |||
@@ -795,6 +795,38 @@ cryptodev_dsa_bn_mod_exp(DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p, | |||
795 | return (cryptodev_bn_mod_exp(r, a, p, m, ctx, m_ctx)); | 795 | return (cryptodev_bn_mod_exp(r, a, p, m, ctx, m_ctx)); |
796 | } | 796 | } |
797 | 797 | ||
798 | static int | ||
799 | cryptodev_dsa_dsa_mod_exp(DSA *dsa, BIGNUM *t1, BIGNUM *g, | ||
800 | BIGNUM *u1, BIGNUM *pub_key, BIGNUM *u2, BIGNUM *p, | ||
801 | BN_CTX *ctx, BN_MONT_CTX *mont) | ||
802 | { | ||
803 | BIGNUM t2; | ||
804 | int ret = 0; | ||
805 | |||
806 | BN_init(&t2); | ||
807 | |||
808 | /* v = ( g^u1 * y^u2 mod p ) mod q */ | ||
809 | /* let t1 = g ^ u1 mod p */ | ||
810 | ret = 0; | ||
811 | |||
812 | if (!dsa->meth->bn_mod_exp(dsa,t1,dsa->g,u1,dsa->p,ctx,mont)) | ||
813 | goto err; | ||
814 | |||
815 | /* let t2 = y ^ u2 mod p */ | ||
816 | if (!dsa->meth->bn_mod_exp(dsa,&t2,dsa->pub_key,u2,dsa->p,ctx,mont)) | ||
817 | goto err; | ||
818 | /* let u1 = t1 * t2 mod p */ | ||
819 | if (!BN_mod_mul(u1,t1,&t2,dsa->p,ctx)) | ||
820 | goto err; | ||
821 | |||
822 | BN_copy(t1,u1); | ||
823 | |||
824 | ret = 1; | ||
825 | err: | ||
826 | BN_free(&t2); | ||
827 | return(ret); | ||
828 | } | ||
829 | |||
798 | static DSA_SIG * | 830 | static DSA_SIG * |
799 | cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | 831 | cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) |
800 | { | 832 | { |
@@ -850,7 +882,6 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen, | |||
850 | struct crypt_kop kop; | 882 | struct crypt_kop kop; |
851 | int dsaret = 1; | 883 | int dsaret = 1; |
852 | 884 | ||
853 | printf("foo\n"); | ||
854 | memset(&kop, 0, sizeof kop); | 885 | memset(&kop, 0, sizeof kop); |
855 | kop.crk_op = CRK_DSA_VERIFY; | 886 | kop.crk_op = CRK_DSA_VERIFY; |
856 | 887 | ||
@@ -1029,10 +1060,12 @@ ENGINE_load_cryptodev(void) | |||
1029 | memcpy(&cryptodev_dsa, meth, sizeof(DSA_METHOD)); | 1060 | memcpy(&cryptodev_dsa, meth, sizeof(DSA_METHOD)); |
1030 | if (cryptodev_asymfeat & CRF_DSA_SIGN) | 1061 | if (cryptodev_asymfeat & CRF_DSA_SIGN) |
1031 | cryptodev_dsa.dsa_do_sign = cryptodev_dsa_do_sign; | 1062 | cryptodev_dsa.dsa_do_sign = cryptodev_dsa_do_sign; |
1063 | if (cryptodev_asymfeat & CRF_MOD_EXP) { | ||
1064 | cryptodev_dsa.bn_mod_exp = cryptodev_dsa_bn_mod_exp; | ||
1065 | cryptodev_dsa.dsa_mod_exp = cryptodev_dsa_dsa_mod_exp; | ||
1066 | } | ||
1032 | if (cryptodev_asymfeat & CRF_DSA_VERIFY) | 1067 | if (cryptodev_asymfeat & CRF_DSA_VERIFY) |
1033 | cryptodev_dsa.dsa_do_verify = cryptodev_dsa_verify; | 1068 | cryptodev_dsa.dsa_do_verify = cryptodev_dsa_verify; |
1034 | if (cryptodev_asymfeat & CRF_MOD_EXP) | ||
1035 | cryptodev_dsa.bn_mod_exp = cryptodev_dsa_bn_mod_exp; | ||
1036 | } | 1069 | } |
1037 | 1070 | ||
1038 | 1071 | ||
@@ -1054,3 +1087,4 @@ ENGINE_load_cryptodev(void) | |||
1054 | ENGINE_free(engine); | 1087 | ENGINE_free(engine); |
1055 | ERR_clear_error(); | 1088 | ERR_clear_error(); |
1056 | } | 1089 | } |
1090 | |||