summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rsa/rsa_chk.c
diff options
context:
space:
mode:
authormiod <>2014-07-09 08:20:08 +0000
committermiod <>2014-07-09 08:20:08 +0000
commit8cbe58f0d357b14b0ce292d336469d0554a567bc (patch)
tree07872a7ef59da8cea3b3b4a101fa3580e4d658c0 /src/lib/libcrypto/rsa/rsa_chk.c
parentbc1209e388500a20f5e75cab35d1b543ce0bbe74 (diff)
downloadopenbsd-8cbe58f0d357b14b0ce292d336469d0554a567bc.tar.gz
openbsd-8cbe58f0d357b14b0ce292d336469d0554a567bc.tar.bz2
openbsd-8cbe58f0d357b14b0ce292d336469d0554a567bc.zip
KNF
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_chk.c')
-rw-r--r--src/lib/libcrypto/rsa/rsa_chk.c145
1 files changed, 87 insertions, 58 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_chk.c b/src/lib/libcrypto/rsa/rsa_chk.c
index d7e496aab2..54113f89f6 100644
--- a/src/lib/libcrypto/rsa/rsa_chk.c
+++ b/src/lib/libcrypto/rsa/rsa_chk.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: rsa_chk.c,v 1.6 2014/06/12 15:49:30 deraadt Exp $ */ 1/* $OpenBSD: rsa_chk.c,v 1.7 2014/07/09 08:20:08 miod Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
4 * 4 *
@@ -53,18 +53,18 @@
53#include <openssl/rsa.h> 53#include <openssl/rsa.h>
54 54
55 55
56int RSA_check_key(const RSA *key) 56int
57 { 57RSA_check_key(const RSA *key)
58{
58 BIGNUM *i, *j, *k, *l, *m; 59 BIGNUM *i, *j, *k, *l, *m;
59 BN_CTX *ctx; 60 BN_CTX *ctx;
60 int r; 61 int r;
61 int ret=1; 62 int ret = 1;
62 63
63 if (!key->p || !key->q || !key->n || !key->e || !key->d) 64 if (!key->p || !key->q || !key->n || !key->e || !key->d) {
64 {
65 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_VALUE_MISSING); 65 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_VALUE_MISSING);
66 return 0; 66 return 0;
67 } 67 }
68 68
69 i = BN_new(); 69 i = BN_new();
70 j = BN_new(); 70 j = BN_new();
@@ -72,119 +72,148 @@ int RSA_check_key(const RSA *key)
72 l = BN_new(); 72 l = BN_new();
73 m = BN_new(); 73 m = BN_new();
74 ctx = BN_CTX_new(); 74 ctx = BN_CTX_new();
75 if (i == NULL || j == NULL || k == NULL || l == NULL || 75 if (i == NULL || j == NULL || k == NULL || l == NULL || m == NULL ||
76 m == NULL || ctx == NULL) 76 ctx == NULL) {
77 {
78 ret = -1; 77 ret = -1;
79 RSAerr(RSA_F_RSA_CHECK_KEY, ERR_R_MALLOC_FAILURE); 78 RSAerr(RSA_F_RSA_CHECK_KEY, ERR_R_MALLOC_FAILURE);
80 goto err; 79 goto err;
81 } 80 }
82 81
83 /* p prime? */ 82 /* p prime? */
84 r = BN_is_prime_ex(key->p, BN_prime_checks, NULL, NULL); 83 r = BN_is_prime_ex(key->p, BN_prime_checks, NULL, NULL);
85 if (r != 1) 84 if (r != 1) {
86 {
87 ret = r; 85 ret = r;
88 if (r != 0) 86 if (r != 0)
89 goto err; 87 goto err;
90 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_P_NOT_PRIME); 88 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_P_NOT_PRIME);
91 } 89 }
92 90
93 /* q prime? */ 91 /* q prime? */
94 r = BN_is_prime_ex(key->q, BN_prime_checks, NULL, NULL); 92 r = BN_is_prime_ex(key->q, BN_prime_checks, NULL, NULL);
95 if (r != 1) 93 if (r != 1) {
96 {
97 ret = r; 94 ret = r;
98 if (r != 0) 95 if (r != 0)
99 goto err; 96 goto err;
100 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_Q_NOT_PRIME); 97 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_Q_NOT_PRIME);
101 } 98 }
102 99
103 /* n = p*q? */ 100 /* n = p*q? */
104 r = BN_mul(i, key->p, key->q, ctx); 101 r = BN_mul(i, key->p, key->q, ctx);
105 if (!r) { ret = -1; goto err; } 102 if (!r) {
103 ret = -1;
104 goto err;
105 }
106 106
107 if (BN_cmp(i, key->n) != 0) 107 if (BN_cmp(i, key->n) != 0) {
108 {
109 ret = 0; 108 ret = 0;
110 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_N_DOES_NOT_EQUAL_P_Q); 109 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_N_DOES_NOT_EQUAL_P_Q);
111 } 110 }
112 111
113 /* d*e = 1 mod lcm(p-1,q-1)? */ 112 /* d*e = 1 mod lcm(p-1,q-1)? */
114 113
115 r = BN_sub(i, key->p, BN_value_one()); 114 r = BN_sub(i, key->p, BN_value_one());
116 if (!r) { ret = -1; goto err; } 115 if (!r) {
116 ret = -1;
117 goto err;
118 }
117 r = BN_sub(j, key->q, BN_value_one()); 119 r = BN_sub(j, key->q, BN_value_one());
118 if (!r) { ret = -1; goto err; } 120 if (!r) {
121 ret = -1;
122 goto err;
123 }
119 124
120 /* now compute k = lcm(i,j) */ 125 /* now compute k = lcm(i,j) */
121 r = BN_mul(l, i, j, ctx); 126 r = BN_mul(l, i, j, ctx);
122 if (!r) { ret = -1; goto err; } 127 if (!r) {
128 ret = -1;
129 goto err;
130 }
123 r = BN_gcd(m, i, j, ctx); 131 r = BN_gcd(m, i, j, ctx);
124 if (!r) { ret = -1; goto err; } 132 if (!r) {
133 ret = -1;
134 goto err;
135 }
125 r = BN_div(k, NULL, l, m, ctx); /* remainder is 0 */ 136 r = BN_div(k, NULL, l, m, ctx); /* remainder is 0 */
126 if (!r) { ret = -1; goto err; } 137 if (!r) {
138 ret = -1;
139 goto err;
140 }
127 141
128 r = BN_mod_mul(i, key->d, key->e, k, ctx); 142 r = BN_mod_mul(i, key->d, key->e, k, ctx);
129 if (!r) { ret = -1; goto err; } 143 if (!r) {
144 ret = -1;
145 goto err;
146 }
130 147
131 if (!BN_is_one(i)) 148 if (!BN_is_one(i)) {
132 {
133 ret = 0; 149 ret = 0;
134 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_D_E_NOT_CONGRUENT_TO_1); 150 RSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_D_E_NOT_CONGRUENT_TO_1);
135 } 151 }
136 152
137 if (key->dmp1 != NULL && key->dmq1 != NULL && key->iqmp != NULL) 153 if (key->dmp1 != NULL && key->dmq1 != NULL && key->iqmp != NULL) {
138 {
139 /* dmp1 = d mod (p-1)? */ 154 /* dmp1 = d mod (p-1)? */
140 r = BN_sub(i, key->p, BN_value_one()); 155 r = BN_sub(i, key->p, BN_value_one());
141 if (!r) { ret = -1; goto err; } 156 if (!r) {
157 ret = -1;
158 goto err;
159 }
142 160
143 r = BN_mod(j, key->d, i, ctx); 161 r = BN_mod(j, key->d, i, ctx);
144 if (!r) { ret = -1; goto err; } 162 if (!r) {
163 ret = -1;
164 goto err;
165 }
145 166
146 if (BN_cmp(j, key->dmp1) != 0) 167 if (BN_cmp(j, key->dmp1) != 0) {
147 {
148 ret = 0; 168 ret = 0;
149 RSAerr(RSA_F_RSA_CHECK_KEY, 169 RSAerr(RSA_F_RSA_CHECK_KEY,
150 RSA_R_DMP1_NOT_CONGRUENT_TO_D); 170 RSA_R_DMP1_NOT_CONGRUENT_TO_D);
151 } 171 }
152 172
153 /* dmq1 = d mod (q-1)? */ 173 /* dmq1 = d mod (q-1)? */
154 r = BN_sub(i, key->q, BN_value_one()); 174 r = BN_sub(i, key->q, BN_value_one());
155 if (!r) { ret = -1; goto err; } 175 if (!r) {
176 ret = -1;
177 goto err;
178 }
156 179
157 r = BN_mod(j, key->d, i, ctx); 180 r = BN_mod(j, key->d, i, ctx);
158 if (!r) { ret = -1; goto err; } 181 if (!r) {
182 ret = -1;
183 goto err;
184 }
159 185
160 if (BN_cmp(j, key->dmq1) != 0) 186 if (BN_cmp(j, key->dmq1) != 0) {
161 {
162 ret = 0; 187 ret = 0;
163 RSAerr(RSA_F_RSA_CHECK_KEY, 188 RSAerr(RSA_F_RSA_CHECK_KEY,
164 RSA_R_DMQ1_NOT_CONGRUENT_TO_D); 189 RSA_R_DMQ1_NOT_CONGRUENT_TO_D);
165 } 190 }
166 191
167 /* iqmp = q^-1 mod p? */ 192 /* iqmp = q^-1 mod p? */
168 if(!BN_mod_inverse(i, key->q, key->p, ctx)) 193 if (!BN_mod_inverse(i, key->q, key->p, ctx)) {
169 {
170 ret = -1; 194 ret = -1;
171 goto err; 195 goto err;
172 } 196 }
173 197
174 if (BN_cmp(i, key->iqmp) != 0) 198 if (BN_cmp(i, key->iqmp) != 0) {
175 {
176 ret = 0; 199 ret = 0;
177 RSAerr(RSA_F_RSA_CHECK_KEY, 200 RSAerr(RSA_F_RSA_CHECK_KEY,
178 RSA_R_IQMP_NOT_INVERSE_OF_Q); 201 RSA_R_IQMP_NOT_INVERSE_OF_Q);
179 }
180 } 202 }
203 }
181 204
182 err: 205 err:
183 if (i != NULL) BN_free(i); 206 if (i != NULL)
184 if (j != NULL) BN_free(j); 207 BN_free(i);
185 if (k != NULL) BN_free(k); 208 if (j != NULL)
186 if (l != NULL) BN_free(l); 209 BN_free(j);
187 if (m != NULL) BN_free(m); 210 if (k != NULL)
188 if (ctx != NULL) BN_CTX_free(ctx); 211 BN_free(k);
212 if (l != NULL)
213 BN_free(l);
214 if (m != NULL)
215 BN_free(m);
216 if (ctx != NULL)
217 BN_CTX_free(ctx);
189 return (ret); 218 return (ret);
190 } 219}