summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rsa/rsa_oaep.c
diff options
context:
space:
mode:
authorbeck <>2001-08-01 19:51:17 +0000
committerbeck <>2001-08-01 19:51:17 +0000
commit4b790f68539c49ef91f5e82506c2624900c92106 (patch)
treed14ff9f79630cb04ad006cd2730646f44f62d786 /src/lib/libcrypto/rsa/rsa_oaep.c
parentedbfd6c7e91e15e92ef0df548474ac76b6dddca0 (diff)
downloadopenbsd-4b790f68539c49ef91f5e82506c2624900c92106.tar.gz
openbsd-4b790f68539c49ef91f5e82506c2624900c92106.tar.bz2
openbsd-4b790f68539c49ef91f5e82506c2624900c92106.zip
merge openssl 0.9.6b-engine
Note that this is a maintenence release, API's appear *not* to have changed. As such, I have only increased the minor number on these libraries
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_oaep.c')
-rw-r--r--src/lib/libcrypto/rsa/rsa_oaep.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_oaep.c b/src/lib/libcrypto/rsa/rsa_oaep.c
index fd0b7f361f..1849e55cd5 100644
--- a/src/lib/libcrypto/rsa/rsa_oaep.c
+++ b/src/lib/libcrypto/rsa/rsa_oaep.c
@@ -77,14 +77,16 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
77 int i, dblen, mlen = -1; 77 int i, dblen, mlen = -1;
78 unsigned char *maskeddb; 78 unsigned char *maskeddb;
79 int lzero; 79 int lzero;
80 unsigned char *db, seed[SHA_DIGEST_LENGTH], phash[SHA_DIGEST_LENGTH]; 80 unsigned char *db = NULL, seed[SHA_DIGEST_LENGTH], phash[SHA_DIGEST_LENGTH];
81 81
82 if (--num < 2 * SHA_DIGEST_LENGTH + 1) 82 if (--num < 2 * SHA_DIGEST_LENGTH + 1)
83 { 83 goto decoding_err;
84 RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_OAEP_DECODING_ERROR);
85 return (-1);
86 }
87 84
85 lzero = num - flen;
86 if (lzero < 0)
87 goto decoding_err;
88 maskeddb = from - lzero + SHA_DIGEST_LENGTH;
89
88 dblen = num - SHA_DIGEST_LENGTH; 90 dblen = num - SHA_DIGEST_LENGTH;
89 db = OPENSSL_malloc(dblen); 91 db = OPENSSL_malloc(dblen);
90 if (db == NULL) 92 if (db == NULL)
@@ -93,9 +95,6 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
93 return (-1); 95 return (-1);
94 } 96 }
95 97
96 lzero = num - flen;
97 maskeddb = from - lzero + SHA_DIGEST_LENGTH;
98
99 MGF1(seed, SHA_DIGEST_LENGTH, maskeddb, dblen); 98 MGF1(seed, SHA_DIGEST_LENGTH, maskeddb, dblen);
100 for (i = lzero; i < SHA_DIGEST_LENGTH; i++) 99 for (i = lzero; i < SHA_DIGEST_LENGTH; i++)
101 seed[i] ^= from[i - lzero]; 100 seed[i] ^= from[i - lzero];
@@ -107,21 +106,20 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
107 SHA1(param, plen, phash); 106 SHA1(param, plen, phash);
108 107
109 if (memcmp(db, phash, SHA_DIGEST_LENGTH) != 0) 108 if (memcmp(db, phash, SHA_DIGEST_LENGTH) != 0)
110 RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_OAEP_DECODING_ERROR); 109 goto decoding_err;
111 else 110 else
112 { 111 {
113 for (i = SHA_DIGEST_LENGTH; i < dblen; i++) 112 for (i = SHA_DIGEST_LENGTH; i < dblen; i++)
114 if (db[i] != 0x00) 113 if (db[i] != 0x00)
115 break; 114 break;
116 if (db[i] != 0x01 || i++ >= dblen) 115 if (db[i] != 0x01 || i++ >= dblen)
117 RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, 116 goto decoding_err;
118 RSA_R_OAEP_DECODING_ERROR);
119 else 117 else
120 { 118 {
121 mlen = dblen - i; 119 mlen = dblen - i;
122 if (tlen < mlen) 120 if (tlen < mlen)
123 { 121 {
124 RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_OAEP, RSA_R_DATA_TOO_LARGE); 122 RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_DATA_TOO_LARGE);
125 mlen = -1; 123 mlen = -1;
126 } 124 }
127 else 125 else
@@ -130,6 +128,13 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
130 } 128 }
131 OPENSSL_free(db); 129 OPENSSL_free(db);
132 return (mlen); 130 return (mlen);
131
132decoding_err:
133 /* to avoid chosen ciphertext attacks, the error message should not reveal
134 * which kind of decoding error happened */
135 RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP, RSA_R_OAEP_DECODING_ERROR);
136 if (db != NULL) OPENSSL_free(db);
137 return -1;
133 } 138 }
134 139
135int MGF1(unsigned char *mask, long len, unsigned char *seed, long seedlen) 140int MGF1(unsigned char *mask, long len, unsigned char *seed, long seedlen)