diff options
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_oaep.c')
-rw-r--r-- | src/lib/libcrypto/rsa/rsa_oaep.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_oaep.c b/src/lib/libcrypto/rsa/rsa_oaep.c index d43ecaca63..e3f7c608ec 100644 --- a/src/lib/libcrypto/rsa/rsa_oaep.c +++ b/src/lib/libcrypto/rsa/rsa_oaep.c | |||
@@ -28,6 +28,9 @@ | |||
28 | #include <openssl/rand.h> | 28 | #include <openssl/rand.h> |
29 | #include <openssl/sha.h> | 29 | #include <openssl/sha.h> |
30 | 30 | ||
31 | int MGF1(unsigned char *mask, long len, | ||
32 | const unsigned char *seed, long seedlen); | ||
33 | |||
31 | int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, | 34 | int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, |
32 | const unsigned char *from, int flen, | 35 | const unsigned char *from, int flen, |
33 | const unsigned char *param, int plen) | 36 | const unsigned char *param, int plen) |
@@ -73,13 +76,11 @@ int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, | |||
73 | 20); | 76 | 20); |
74 | #endif | 77 | #endif |
75 | 78 | ||
76 | PKCS1_MGF1(dbmask, emlen - SHA_DIGEST_LENGTH, seed, SHA_DIGEST_LENGTH, | 79 | MGF1(dbmask, emlen - SHA_DIGEST_LENGTH, seed, SHA_DIGEST_LENGTH); |
77 | EVP_sha1()); | ||
78 | for (i = 0; i < emlen - SHA_DIGEST_LENGTH; i++) | 80 | for (i = 0; i < emlen - SHA_DIGEST_LENGTH; i++) |
79 | db[i] ^= dbmask[i]; | 81 | db[i] ^= dbmask[i]; |
80 | 82 | ||
81 | PKCS1_MGF1(seedmask, SHA_DIGEST_LENGTH, db, emlen - SHA_DIGEST_LENGTH, | 83 | MGF1(seedmask, SHA_DIGEST_LENGTH, db, emlen - SHA_DIGEST_LENGTH); |
82 | EVP_sha1()); | ||
83 | for (i = 0; i < SHA_DIGEST_LENGTH; i++) | 84 | for (i = 0; i < SHA_DIGEST_LENGTH; i++) |
84 | seed[i] ^= seedmask[i]; | 85 | seed[i] ^= seedmask[i]; |
85 | 86 | ||
@@ -125,11 +126,11 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen, | |||
125 | return -1; | 126 | return -1; |
126 | } | 127 | } |
127 | 128 | ||
128 | PKCS1_MGF1(seed, SHA_DIGEST_LENGTH, maskeddb, dblen, EVP_sha1()); | 129 | MGF1(seed, SHA_DIGEST_LENGTH, maskeddb, dblen); |
129 | for (i = lzero; i < SHA_DIGEST_LENGTH; i++) | 130 | for (i = lzero; i < SHA_DIGEST_LENGTH; i++) |
130 | seed[i] ^= from[i - lzero]; | 131 | seed[i] ^= from[i - lzero]; |
131 | 132 | ||
132 | PKCS1_MGF1(db, dblen, seed, SHA_DIGEST_LENGTH, EVP_sha1()); | 133 | MGF1(db, dblen, seed, SHA_DIGEST_LENGTH); |
133 | for (i = 0; i < dblen; i++) | 134 | for (i = 0; i < dblen; i++) |
134 | db[i] ^= maskeddb[i]; | 135 | db[i] ^= maskeddb[i]; |
135 | 136 | ||
@@ -169,30 +170,28 @@ decoding_err: | |||
169 | return -1; | 170 | return -1; |
170 | } | 171 | } |
171 | 172 | ||
172 | int PKCS1_MGF1(unsigned char *mask, long len, | 173 | int MGF1(unsigned char *mask, long len, |
173 | const unsigned char *seed, long seedlen, const EVP_MD *dgst) | 174 | const unsigned char *seed, long seedlen) |
174 | { | 175 | { |
175 | long i, outlen = 0; | 176 | long i, outlen = 0; |
176 | unsigned char cnt[4]; | 177 | unsigned char cnt[4]; |
177 | EVP_MD_CTX c; | 178 | EVP_MD_CTX c; |
178 | unsigned char md[EVP_MAX_MD_SIZE]; | 179 | unsigned char md[SHA_DIGEST_LENGTH]; |
179 | int mdlen; | ||
180 | 180 | ||
181 | EVP_MD_CTX_init(&c); | 181 | EVP_MD_CTX_init(&c); |
182 | mdlen = EVP_MD_size(dgst); | ||
183 | for (i = 0; outlen < len; i++) | 182 | for (i = 0; outlen < len; i++) |
184 | { | 183 | { |
185 | cnt[0] = (unsigned char)((i >> 24) & 255); | 184 | cnt[0] = (unsigned char)((i >> 24) & 255); |
186 | cnt[1] = (unsigned char)((i >> 16) & 255); | 185 | cnt[1] = (unsigned char)((i >> 16) & 255); |
187 | cnt[2] = (unsigned char)((i >> 8)) & 255; | 186 | cnt[2] = (unsigned char)((i >> 8)) & 255; |
188 | cnt[3] = (unsigned char)(i & 255); | 187 | cnt[3] = (unsigned char)(i & 255); |
189 | EVP_DigestInit_ex(&c,dgst, NULL); | 188 | EVP_DigestInit_ex(&c,EVP_sha1(), NULL); |
190 | EVP_DigestUpdate(&c, seed, seedlen); | 189 | EVP_DigestUpdate(&c, seed, seedlen); |
191 | EVP_DigestUpdate(&c, cnt, 4); | 190 | EVP_DigestUpdate(&c, cnt, 4); |
192 | if (outlen + mdlen <= len) | 191 | if (outlen + SHA_DIGEST_LENGTH <= len) |
193 | { | 192 | { |
194 | EVP_DigestFinal_ex(&c, mask + outlen, NULL); | 193 | EVP_DigestFinal_ex(&c, mask + outlen, NULL); |
195 | outlen += mdlen; | 194 | outlen += SHA_DIGEST_LENGTH; |
196 | } | 195 | } |
197 | else | 196 | else |
198 | { | 197 | { |
@@ -204,9 +203,4 @@ int PKCS1_MGF1(unsigned char *mask, long len, | |||
204 | EVP_MD_CTX_cleanup(&c); | 203 | EVP_MD_CTX_cleanup(&c); |
205 | return 0; | 204 | return 0; |
206 | } | 205 | } |
207 | |||
208 | int MGF1(unsigned char *mask, long len, const unsigned char *seed, long seedlen) | ||
209 | { | ||
210 | return PKCS1_MGF1(mask, len, seed, seedlen, EVP_sha1()); | ||
211 | } | ||
212 | #endif | 206 | #endif |