summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rsa/rsa_pss.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_pss.c')
-rw-r--r--src/lib/libcrypto/rsa/rsa_pss.c190
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
67static const unsigned char zeroes[] = {0,0,0,0,0,0,0,0}; 67static const unsigned char zeroes[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
68 68
69int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, 69int
70 const EVP_MD *Hash, const unsigned char *EM, int sLen) 70RSA_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
75int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, 76int
76 const EVP_MD *Hash, const EVP_MD *mgf1Hash, 77RSA_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: 174err:
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 } 181int
181 182RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM,
182int 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
189int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, 188int
190 const unsigned char *mHash, 189RSA_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: 282err:
286 free(salt); 283 free(salt);
287 284
288 return ret; 285 return ret;
289 286}
290 }