summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortedu <>2014-04-19 15:17:59 +0000
committertedu <>2014-04-19 15:17:59 +0000
commit502d0dcab1eadeb81a1474e4c5c12d8e0254eb2c (patch)
tree79d2458fff3f2ec70314de76a70ca9eda8a00732 /src
parentf36512dcdc0fc940dfad005a50d5a8890515abcc (diff)
downloadopenbsd-502d0dcab1eadeb81a1474e4c5c12d8e0254eb2c.tar.gz
openbsd-502d0dcab1eadeb81a1474e4c5c12d8e0254eb2c.tar.bz2
openbsd-502d0dcab1eadeb81a1474e4c5c12d8e0254eb2c.zip
improved checking for invalid hashes. from solar designer
Diffstat (limited to 'src')
-rw-r--r--src/lib/libc/crypt/bcrypt.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lib/libc/crypt/bcrypt.c b/src/lib/libc/crypt/bcrypt.c
index d7af344b97..a077c99de5 100644
--- a/src/lib/libc/crypt/bcrypt.c
+++ b/src/lib/libc/crypt/bcrypt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bcrypt.c,v 1.37 2014/04/08 20:14:25 tedu Exp $ */ 1/* $OpenBSD: bcrypt.c,v 1.38 2014/04/19 15:17:59 tedu Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2014 Ted Unangst <tedu@openbsd.org> 4 * Copyright (c) 2014 Ted Unangst <tedu@openbsd.org>
@@ -97,11 +97,12 @@ bcrypt_hashpass(const char *key, const char *salt, char *encrypted,
97 char arounds[3]; 97 char arounds[3];
98 98
99 /* Discard "$" identifier */ 99 /* Discard "$" identifier */
100 if (*salt != '$')
101 return -1;
100 salt++; 102 salt++;
101 103
102 if (*salt > BCRYPT_VERSION) { 104 if (*salt != BCRYPT_VERSION)
103 return -1; 105 return -1;
104 }
105 106
106 /* Check for minor versions */ 107 /* Check for minor versions */
107 if (salt[1] != '$') { 108 if (salt[1] != '$') {
@@ -110,6 +111,8 @@ bcrypt_hashpass(const char *key, const char *salt, char *encrypted,
110 case 'b': /* cap input length at 72 bytes */ 111 case 'b': /* cap input length at 72 bytes */
111 minor = salt[1]; 112 minor = salt[1];
112 salt++; 113 salt++;
114 if (salt[1] != '$')
115 return -1;
113 break; 116 break;
114 default: 117 default:
115 return -1; 118 return -1;
@@ -141,7 +144,8 @@ bcrypt_hashpass(const char *key, const char *salt, char *encrypted,
141 return -1; 144 return -1;
142 145
143 /* We dont want the base64 salt but the raw data */ 146 /* We dont want the base64 salt but the raw data */
144 decode_base64(csalt, BCRYPT_MAXSALT, salt); 147 if (decode_base64(csalt, BCRYPT_MAXSALT, salt))
148 return -1;
145 salt_len = BCRYPT_MAXSALT; 149 salt_len = BCRYPT_MAXSALT;
146 if (minor <= 'a') 150 if (minor <= 'a')
147 key_len = (u_int8_t)(strlen(key) + (minor >= 'a' ? 1 : 0)); 151 key_len = (u_int8_t)(strlen(key) + (minor >= 'a' ? 1 : 0));
@@ -284,7 +288,7 @@ decode_base64(u_int8_t *buffer, size_t len, const char *b64data)
284 288
285 c3 = CHAR64(*(p + 2)); 289 c3 = CHAR64(*(p + 2));
286 if (c3 == 255) 290 if (c3 == 255)
287 break; 291 return -1;
288 292
289 *bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); 293 *bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2);
290 if (bp >= buffer + len) 294 if (bp >= buffer + len)
@@ -292,7 +296,7 @@ decode_base64(u_int8_t *buffer, size_t len, const char *b64data)
292 296
293 c4 = CHAR64(*(p + 3)); 297 c4 = CHAR64(*(p + 3));
294 if (c4 == 255) 298 if (c4 == 255)
295 break; 299 return -1;
296 *bp++ = ((c3 & 0x03) << 6) | c4; 300 *bp++ = ((c3 & 0x03) << 6) | c4;
297 301
298 p += 4; 302 p += 4;