diff options
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_oaep.c')
| -rw-r--r-- | src/lib/libcrypto/rsa/rsa_oaep.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_oaep.c b/src/lib/libcrypto/rsa/rsa_oaep.c index 18d307ea9e..e238d10e5c 100644 --- a/src/lib/libcrypto/rsa/rsa_oaep.c +++ b/src/lib/libcrypto/rsa/rsa_oaep.c | |||
| @@ -189,40 +189,34 @@ int PKCS1_MGF1(unsigned char *mask, long len, | |||
| 189 | EVP_MD_CTX c; | 189 | EVP_MD_CTX c; |
| 190 | unsigned char md[EVP_MAX_MD_SIZE]; | 190 | unsigned char md[EVP_MAX_MD_SIZE]; |
| 191 | int mdlen; | 191 | int mdlen; |
| 192 | int rv = -1; | ||
| 193 | 192 | ||
| 194 | EVP_MD_CTX_init(&c); | 193 | EVP_MD_CTX_init(&c); |
| 195 | mdlen = EVP_MD_size(dgst); | 194 | mdlen = EVP_MD_size(dgst); |
| 196 | if (mdlen < 0) | 195 | if (mdlen < 0) |
| 197 | goto err; | 196 | return -1; |
| 198 | for (i = 0; outlen < len; i++) | 197 | for (i = 0; outlen < len; i++) |
| 199 | { | 198 | { |
| 200 | cnt[0] = (unsigned char)((i >> 24) & 255); | 199 | cnt[0] = (unsigned char)((i >> 24) & 255); |
| 201 | cnt[1] = (unsigned char)((i >> 16) & 255); | 200 | cnt[1] = (unsigned char)((i >> 16) & 255); |
| 202 | cnt[2] = (unsigned char)((i >> 8)) & 255; | 201 | cnt[2] = (unsigned char)((i >> 8)) & 255; |
| 203 | cnt[3] = (unsigned char)(i & 255); | 202 | cnt[3] = (unsigned char)(i & 255); |
| 204 | if (!EVP_DigestInit_ex(&c,dgst, NULL) | 203 | EVP_DigestInit_ex(&c,dgst, NULL); |
| 205 | || !EVP_DigestUpdate(&c, seed, seedlen) | 204 | EVP_DigestUpdate(&c, seed, seedlen); |
| 206 | || !EVP_DigestUpdate(&c, cnt, 4)) | 205 | EVP_DigestUpdate(&c, cnt, 4); |
| 207 | goto err; | ||
| 208 | if (outlen + mdlen <= len) | 206 | if (outlen + mdlen <= len) |
| 209 | { | 207 | { |
| 210 | if (!EVP_DigestFinal_ex(&c, mask + outlen, NULL)) | 208 | EVP_DigestFinal_ex(&c, mask + outlen, NULL); |
| 211 | goto err; | ||
| 212 | outlen += mdlen; | 209 | outlen += mdlen; |
| 213 | } | 210 | } |
| 214 | else | 211 | else |
| 215 | { | 212 | { |
| 216 | if (!EVP_DigestFinal_ex(&c, md, NULL)) | 213 | EVP_DigestFinal_ex(&c, md, NULL); |
| 217 | goto err; | ||
| 218 | memcpy(mask + outlen, md, len - outlen); | 214 | memcpy(mask + outlen, md, len - outlen); |
| 219 | outlen = len; | 215 | outlen = len; |
| 220 | } | 216 | } |
| 221 | } | 217 | } |
| 222 | rv = 0; | ||
| 223 | err: | ||
| 224 | EVP_MD_CTX_cleanup(&c); | 218 | EVP_MD_CTX_cleanup(&c); |
| 225 | return rv; | 219 | return 0; |
| 226 | } | 220 | } |
| 227 | 221 | ||
| 228 | static int MGF1(unsigned char *mask, long len, const unsigned char *seed, | 222 | static int MGF1(unsigned char *mask, long len, const unsigned char *seed, |
