diff options
| author | miod <> | 2014-07-09 08:20:08 +0000 |
|---|---|---|
| committer | miod <> | 2014-07-09 08:20:08 +0000 |
| commit | 8cbe58f0d357b14b0ce292d336469d0554a567bc (patch) | |
| tree | 07872a7ef59da8cea3b3b4a101fa3580e4d658c0 /src/lib/libcrypto/rsa/rsa_chk.c | |
| parent | bc1209e388500a20f5e75cab35d1b543ce0bbe74 (diff) | |
| download | openbsd-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.c | 145 |
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 | ||
| 56 | int RSA_check_key(const RSA *key) | 56 | int |
| 57 | { | 57 | RSA_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 | } |
