diff options
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_pss.c')
-rw-r--r-- | src/lib/libcrypto/rsa/rsa_pss.c | 190 |
1 files changed, 93 insertions, 97 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_pss.c b/src/lib/libcrypto/rsa/rsa_pss.c index d26839a5fb..4c6a90c1c7 100644 --- a/src/lib/libcrypto/rsa/rsa_pss.c +++ b/src/lib/libcrypto/rsa/rsa_pss.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: rsa_pss.c,v 1.5 2014/06/12 15:49:30 deraadt Exp $ */ | 1 | /* $OpenBSD: rsa_pss.c,v 1.6 2014/07/09 08:20:08 miod Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2005. | 3 | * project 2005. |
4 | */ | 4 | */ |
@@ -64,18 +64,20 @@ | |||
64 | #include <openssl/rand.h> | 64 | #include <openssl/rand.h> |
65 | #include <openssl/sha.h> | 65 | #include <openssl/sha.h> |
66 | 66 | ||
67 | static const unsigned char zeroes[] = {0,0,0,0,0,0,0,0}; | 67 | static const unsigned char zeroes[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; |
68 | 68 | ||
69 | int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, | 69 | int |
70 | const EVP_MD *Hash, const unsigned char *EM, int sLen) | 70 | RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, const EVP_MD *Hash, |
71 | { | 71 | const unsigned char *EM, int sLen) |
72 | { | ||
72 | return RSA_verify_PKCS1_PSS_mgf1(rsa, mHash, Hash, NULL, EM, sLen); | 73 | return RSA_verify_PKCS1_PSS_mgf1(rsa, mHash, Hash, NULL, EM, sLen); |
73 | } | 74 | } |
74 | 75 | ||
75 | int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, | 76 | int |
76 | const EVP_MD *Hash, const EVP_MD *mgf1Hash, | 77 | RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, |
77 | const unsigned char *EM, int sLen) | 78 | const EVP_MD *Hash, const EVP_MD *mgf1Hash, const unsigned char *EM, |
78 | { | 79 | int sLen) |
80 | { | ||
79 | int i; | 81 | int i; |
80 | int ret = 0; | 82 | int ret = 0; |
81 | int hLen, maskedDBLen, MSBits, emLen; | 83 | int hLen, maskedDBLen, MSBits, emLen; |
@@ -83,6 +85,7 @@ int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, | |||
83 | unsigned char *DB = NULL; | 85 | unsigned char *DB = NULL; |
84 | EVP_MD_CTX ctx; | 86 | EVP_MD_CTX ctx; |
85 | unsigned char H_[EVP_MAX_MD_SIZE]; | 87 | unsigned char H_[EVP_MAX_MD_SIZE]; |
88 | |||
86 | EVP_MD_CTX_init(&ctx); | 89 | EVP_MD_CTX_init(&ctx); |
87 | 90 | ||
88 | if (mgf1Hash == NULL) | 91 | if (mgf1Hash == NULL) |
@@ -97,99 +100,96 @@ int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, | |||
97 | * -2 salt length is autorecovered from signature | 100 | * -2 salt length is autorecovered from signature |
98 | * -N reserved | 101 | * -N reserved |
99 | */ | 102 | */ |
100 | if (sLen == -1) sLen = hLen; | 103 | if (sLen == -1) |
101 | else if (sLen == -2) sLen = -2; | 104 | sLen = hLen; |
102 | else if (sLen < -2) | 105 | else if (sLen == -2) |
103 | { | 106 | sLen = -2; |
104 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, RSA_R_SLEN_CHECK_FAILED); | 107 | else if (sLen < -2) { |
108 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, | ||
109 | RSA_R_SLEN_CHECK_FAILED); | ||
105 | goto err; | 110 | goto err; |
106 | } | 111 | } |
107 | 112 | ||
108 | MSBits = (BN_num_bits(rsa->n) - 1) & 0x7; | 113 | MSBits = (BN_num_bits(rsa->n) - 1) & 0x7; |
109 | emLen = RSA_size(rsa); | 114 | emLen = RSA_size(rsa); |
110 | if (EM[0] & (0xFF << MSBits)) | 115 | if (EM[0] & (0xFF << MSBits)) { |
111 | { | 116 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, |
112 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, RSA_R_FIRST_OCTET_INVALID); | 117 | RSA_R_FIRST_OCTET_INVALID); |
113 | goto err; | 118 | goto err; |
114 | } | 119 | } |
115 | if (MSBits == 0) | 120 | if (MSBits == 0) { |
116 | { | ||
117 | EM++; | 121 | EM++; |
118 | emLen--; | 122 | emLen--; |
119 | } | 123 | } |
120 | if (emLen < (hLen + sLen + 2)) /* sLen can be small negative */ | 124 | if (emLen < (hLen + sLen + 2)) { /* sLen can be small negative */ |
121 | { | ||
122 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, RSA_R_DATA_TOO_LARGE); | 125 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, RSA_R_DATA_TOO_LARGE); |
123 | goto err; | 126 | goto err; |
124 | } | 127 | } |
125 | if (EM[emLen - 1] != 0xbc) | 128 | if (EM[emLen - 1] != 0xbc) { |
126 | { | 129 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, |
127 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, RSA_R_LAST_OCTET_INVALID); | 130 | RSA_R_LAST_OCTET_INVALID); |
128 | goto err; | 131 | goto err; |
129 | } | 132 | } |
130 | maskedDBLen = emLen - hLen - 1; | 133 | maskedDBLen = emLen - hLen - 1; |
131 | H = EM + maskedDBLen; | 134 | H = EM + maskedDBLen; |
132 | DB = malloc(maskedDBLen); | 135 | DB = malloc(maskedDBLen); |
133 | if (!DB) | 136 | if (!DB) { |
134 | { | ||
135 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, ERR_R_MALLOC_FAILURE); | 137 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, ERR_R_MALLOC_FAILURE); |
136 | goto err; | 138 | goto err; |
137 | } | 139 | } |
138 | if (PKCS1_MGF1(DB, maskedDBLen, H, hLen, mgf1Hash) < 0) | 140 | if (PKCS1_MGF1(DB, maskedDBLen, H, hLen, mgf1Hash) < 0) |
139 | goto err; | 141 | goto err; |
140 | for (i = 0; i < maskedDBLen; i++) | 142 | for (i = 0; i < maskedDBLen; i++) |
141 | DB[i] ^= EM[i]; | 143 | DB[i] ^= EM[i]; |
142 | if (MSBits) | 144 | if (MSBits) |
143 | DB[0] &= 0xFF >> (8 - MSBits); | 145 | DB[0] &= 0xFF >> (8 - MSBits); |
144 | for (i = 0; DB[i] == 0 && i < (maskedDBLen-1); i++) ; | 146 | for (i = 0; DB[i] == 0 && i < (maskedDBLen-1); i++) |
145 | if (DB[i++] != 0x1) | 147 | ; |
146 | { | 148 | if (DB[i++] != 0x1) { |
147 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, RSA_R_SLEN_RECOVERY_FAILED); | 149 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, |
150 | RSA_R_SLEN_RECOVERY_FAILED); | ||
148 | goto err; | 151 | goto err; |
149 | } | 152 | } |
150 | if (sLen >= 0 && (maskedDBLen - i) != sLen) | 153 | if (sLen >= 0 && (maskedDBLen - i) != sLen) { |
151 | { | 154 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, |
152 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, RSA_R_SLEN_CHECK_FAILED); | 155 | RSA_R_SLEN_CHECK_FAILED); |
153 | goto err; | 156 | goto err; |
154 | } | 157 | } |
155 | if (!EVP_DigestInit_ex(&ctx, Hash, NULL) | 158 | if (!EVP_DigestInit_ex(&ctx, Hash, NULL) || |
156 | || !EVP_DigestUpdate(&ctx, zeroes, sizeof zeroes) | 159 | !EVP_DigestUpdate(&ctx, zeroes, sizeof zeroes) || |
157 | || !EVP_DigestUpdate(&ctx, mHash, hLen)) | 160 | !EVP_DigestUpdate(&ctx, mHash, hLen)) |
158 | goto err; | 161 | goto err; |
159 | if (maskedDBLen - i) | 162 | if (maskedDBLen - i) { |
160 | { | ||
161 | if (!EVP_DigestUpdate(&ctx, DB + i, maskedDBLen - i)) | 163 | if (!EVP_DigestUpdate(&ctx, DB + i, maskedDBLen - i)) |
162 | goto err; | 164 | goto err; |
163 | } | 165 | } |
164 | if (!EVP_DigestFinal_ex(&ctx, H_, NULL)) | 166 | if (!EVP_DigestFinal_ex(&ctx, H_, NULL)) |
165 | goto err; | 167 | goto err; |
166 | if (memcmp(H_, H, hLen)) | 168 | if (memcmp(H_, H, hLen)) { |
167 | { | ||
168 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, RSA_R_BAD_SIGNATURE); | 169 | RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1, RSA_R_BAD_SIGNATURE); |
169 | ret = 0; | 170 | ret = 0; |
170 | } | 171 | } else |
171 | else | ||
172 | ret = 1; | 172 | ret = 1; |
173 | 173 | ||
174 | err: | 174 | err: |
175 | free(DB); | 175 | free(DB); |
176 | EVP_MD_CTX_cleanup(&ctx); | 176 | EVP_MD_CTX_cleanup(&ctx); |
177 | 177 | ||
178 | return ret; | 178 | return ret; |
179 | } | ||
179 | 180 | ||
180 | } | 181 | int |
181 | 182 | RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, | |
182 | int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, | 183 | const unsigned char *mHash, const EVP_MD *Hash, int sLen) |
183 | const unsigned char *mHash, | 184 | { |
184 | const EVP_MD *Hash, int sLen) | ||
185 | { | ||
186 | return RSA_padding_add_PKCS1_PSS_mgf1(rsa, EM, mHash, Hash, NULL, sLen); | 185 | return RSA_padding_add_PKCS1_PSS_mgf1(rsa, EM, mHash, Hash, NULL, sLen); |
187 | } | 186 | } |
188 | 187 | ||
189 | int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, | 188 | int |
190 | const unsigned char *mHash, | 189 | RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, |
191 | const EVP_MD *Hash, const EVP_MD *mgf1Hash, int sLen) | 190 | const unsigned char *mHash, const EVP_MD *Hash, const EVP_MD *mgf1Hash, |
192 | { | 191 | int sLen) |
192 | { | ||
193 | int i; | 193 | int i; |
194 | int ret = 0; | 194 | int ret = 0; |
195 | int hLen, maskedDBLen, MSBits, emLen; | 195 | int hLen, maskedDBLen, MSBits, emLen; |
@@ -208,47 +208,45 @@ int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, | |||
208 | * -2 salt length is maximized | 208 | * -2 salt length is maximized |
209 | * -N reserved | 209 | * -N reserved |
210 | */ | 210 | */ |
211 | if (sLen == -1) sLen = hLen; | 211 | if (sLen == -1) |
212 | else if (sLen == -2) sLen = -2; | 212 | sLen = hLen; |
213 | else if (sLen < -2) | 213 | else if (sLen == -2) |
214 | { | 214 | sLen = -2; |
215 | RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1, RSA_R_SLEN_CHECK_FAILED); | 215 | else if (sLen < -2) { |
216 | RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1, | ||
217 | RSA_R_SLEN_CHECK_FAILED); | ||
216 | goto err; | 218 | goto err; |
217 | } | 219 | } |
218 | 220 | ||
219 | MSBits = (BN_num_bits(rsa->n) - 1) & 0x7; | 221 | MSBits = (BN_num_bits(rsa->n) - 1) & 0x7; |
220 | emLen = RSA_size(rsa); | 222 | emLen = RSA_size(rsa); |
221 | if (MSBits == 0) | 223 | if (MSBits == 0) { |
222 | { | ||
223 | *EM++ = 0; | 224 | *EM++ = 0; |
224 | emLen--; | 225 | emLen--; |
225 | } | 226 | } |
226 | if (sLen == -2) | 227 | if (sLen == -2) |
227 | { | ||
228 | sLen = emLen - hLen - 2; | 228 | sLen = emLen - hLen - 2; |
229 | } | 229 | else if (emLen < (hLen + sLen + 2)) { |
230 | else if (emLen < (hLen + sLen + 2)) | 230 | RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1, |
231 | { | 231 | RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE); |
232 | RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1,RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE); | ||
233 | goto err; | 232 | goto err; |
234 | } | 233 | } |
235 | if (sLen > 0) | 234 | if (sLen > 0) { |
236 | { | ||
237 | salt = malloc(sLen); | 235 | salt = malloc(sLen); |
238 | if (!salt) | 236 | if (!salt) { |
239 | { | 237 | RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1, |
240 | RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1,ERR_R_MALLOC_FAILURE); | 238 | ERR_R_MALLOC_FAILURE); |
241 | goto err; | 239 | goto err; |
242 | } | 240 | } |
243 | if (RAND_bytes(salt, sLen) <= 0) | 241 | if (RAND_bytes(salt, sLen) <= 0) |
244 | goto err; | 242 | goto err; |
245 | } | 243 | } |
246 | maskedDBLen = emLen - hLen - 1; | 244 | maskedDBLen = emLen - hLen - 1; |
247 | H = EM + maskedDBLen; | 245 | H = EM + maskedDBLen; |
248 | EVP_MD_CTX_init(&ctx); | 246 | EVP_MD_CTX_init(&ctx); |
249 | if (!EVP_DigestInit_ex(&ctx, Hash, NULL) | 247 | if (!EVP_DigestInit_ex(&ctx, Hash, NULL) || |
250 | || !EVP_DigestUpdate(&ctx, zeroes, sizeof zeroes) | 248 | !EVP_DigestUpdate(&ctx, zeroes, sizeof zeroes) || |
251 | || !EVP_DigestUpdate(&ctx, mHash, hLen)) | 249 | !EVP_DigestUpdate(&ctx, mHash, hLen)) |
252 | goto err; | 250 | goto err; |
253 | if (sLen && !EVP_DigestUpdate(&ctx, salt, sLen)) | 251 | if (sLen && !EVP_DigestUpdate(&ctx, salt, sLen)) |
254 | goto err; | 252 | goto err; |
@@ -262,29 +260,27 @@ int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, | |||
262 | 260 | ||
263 | p = EM; | 261 | p = EM; |
264 | 262 | ||
265 | /* Initial PS XORs with all zeroes which is a NOP so just update | 263 | /* |
264 | * Initial PS XORs with all zeroes which is a NOP so just update | ||
266 | * pointer. Note from a test above this value is guaranteed to | 265 | * pointer. Note from a test above this value is guaranteed to |
267 | * be non-negative. | 266 | * be non-negative. |
268 | */ | 267 | */ |
269 | p += emLen - sLen - hLen - 2; | 268 | p += emLen - sLen - hLen - 2; |
270 | *p++ ^= 0x1; | 269 | *p++ ^= 0x1; |
271 | if (sLen > 0) | 270 | if (sLen > 0) { |
272 | { | ||
273 | for (i = 0; i < sLen; i++) | 271 | for (i = 0; i < sLen; i++) |
274 | *p++ ^= salt[i]; | 272 | *p++ ^= salt[i]; |
275 | } | 273 | } |
276 | if (MSBits) | 274 | if (MSBits) |
277 | EM[0] &= 0xFF >> (8 - MSBits); | 275 | EM[0] &= 0xFF >> (8 - MSBits); |
278 | 276 | ||
279 | /* H is already in place so just set final 0xbc */ | 277 | /* H is already in place so just set final 0xbc */ |
280 | |||
281 | EM[emLen - 1] = 0xbc; | 278 | EM[emLen - 1] = 0xbc; |
282 | 279 | ||
283 | ret = 1; | 280 | ret = 1; |
284 | 281 | ||
285 | err: | 282 | err: |
286 | free(salt); | 283 | free(salt); |
287 | 284 | ||
288 | return ret; | 285 | return ret; |
289 | 286 | } | |
290 | } | ||