summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rsa/rsa_oaep.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_oaep.c')
-rw-r--r--src/lib/libcrypto/rsa/rsa_oaep.c32
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
31int MGF1(unsigned char *mask, long len,
32 const unsigned char *seed, long seedlen);
33
31int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, 34int 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
172int PKCS1_MGF1(unsigned char *mask, long len, 173int 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
208int 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