diff options
Diffstat (limited to 'src/lib/libcrypto/dsa/dsa_vrf.c')
-rw-r--r-- | src/lib/libcrypto/dsa/dsa_vrf.c | 68 |
1 files changed, 1 insertions, 67 deletions
diff --git a/src/lib/libcrypto/dsa/dsa_vrf.c b/src/lib/libcrypto/dsa/dsa_vrf.c index ff552208aa..03277f80fd 100644 --- a/src/lib/libcrypto/dsa/dsa_vrf.c +++ b/src/lib/libcrypto/dsa/dsa_vrf.c | |||
@@ -69,73 +69,7 @@ | |||
69 | int DSA_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, | 69 | int DSA_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, |
70 | DSA *dsa) | 70 | DSA *dsa) |
71 | { | 71 | { |
72 | BN_CTX *ctx; | 72 | return dsa->meth->dsa_do_verify(dgst, dgst_len, sig, dsa); |
73 | BIGNUM u1,u2,t1; | ||
74 | BN_MONT_CTX *mont=NULL; | ||
75 | int ret = -1; | ||
76 | |||
77 | if ((ctx=BN_CTX_new()) == NULL) goto err; | ||
78 | BN_init(&u1); | ||
79 | BN_init(&u2); | ||
80 | BN_init(&t1); | ||
81 | |||
82 | /* Calculate W = inv(S) mod Q | ||
83 | * save W in u2 */ | ||
84 | if ((BN_mod_inverse(&u2,sig->s,dsa->q,ctx)) == NULL) goto err; | ||
85 | |||
86 | /* save M in u1 */ | ||
87 | if (BN_bin2bn(dgst,dgst_len,&u1) == NULL) goto err; | ||
88 | |||
89 | /* u1 = M * w mod q */ | ||
90 | if (!BN_mod_mul(&u1,&u1,&u2,dsa->q,ctx)) goto err; | ||
91 | |||
92 | /* u2 = r * w mod q */ | ||
93 | if (!BN_mod_mul(&u2,sig->r,&u2,dsa->q,ctx)) goto err; | ||
94 | |||
95 | if ((dsa->method_mont_p == NULL) && (dsa->flags & DSA_FLAG_CACHE_MONT_P)) | ||
96 | { | ||
97 | if ((dsa->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL) | ||
98 | if (!BN_MONT_CTX_set((BN_MONT_CTX *)dsa->method_mont_p, | ||
99 | dsa->p,ctx)) goto err; | ||
100 | } | ||
101 | mont=(BN_MONT_CTX *)dsa->method_mont_p; | ||
102 | |||
103 | #if 0 | ||
104 | { | ||
105 | BIGNUM t2; | ||
106 | |||
107 | BN_init(&t2); | ||
108 | /* v = ( g^u1 * y^u2 mod p ) mod q */ | ||
109 | /* let t1 = g ^ u1 mod p */ | ||
110 | if (!BN_mod_exp_mont(&t1,dsa->g,&u1,dsa->p,ctx,mont)) goto err; | ||
111 | /* let t2 = y ^ u2 mod p */ | ||
112 | if (!BN_mod_exp_mont(&t2,dsa->pub_key,&u2,dsa->p,ctx,mont)) goto err; | ||
113 | /* let u1 = t1 * t2 mod p */ | ||
114 | if (!BN_mod_mul(&u1,&t1,&t2,dsa->p,ctx)) goto err_bn; | ||
115 | BN_free(&t2); | ||
116 | } | ||
117 | /* let u1 = u1 mod q */ | ||
118 | if (!BN_mod(&u1,&u1,dsa->q,ctx)) goto err; | ||
119 | #else | ||
120 | { | ||
121 | if (!BN_mod_exp2_mont(&t1,dsa->g,&u1,dsa->pub_key,&u2,dsa->p,ctx,mont)) | ||
122 | goto err; | ||
123 | /* BN_copy(&u1,&t1); */ | ||
124 | /* let u1 = u1 mod q */ | ||
125 | if (!BN_mod(&u1,&t1,dsa->q,ctx)) goto err; | ||
126 | } | ||
127 | #endif | ||
128 | /* V is now in u1. If the signature is correct, it will be | ||
129 | * equal to R. */ | ||
130 | ret=(BN_ucmp(&u1, sig->r) == 0); | ||
131 | |||
132 | err: | ||
133 | if (ret != 1) DSAerr(DSA_F_DSA_DO_VERIFY,ERR_R_BN_LIB); | ||
134 | if (ctx != NULL) BN_CTX_free(ctx); | ||
135 | BN_free(&u1); | ||
136 | BN_free(&u2); | ||
137 | BN_free(&t1); | ||
138 | return(ret); | ||
139 | } | 73 | } |
140 | 74 | ||
141 | /* data has already been hashed (probably with SHA or SHA-1). */ | 75 | /* data has already been hashed (probably with SHA or SHA-1). */ |