diff options
author | tedu <> | 2014-04-19 15:17:59 +0000 |
---|---|---|
committer | tedu <> | 2014-04-19 15:17:59 +0000 |
commit | 502d0dcab1eadeb81a1474e4c5c12d8e0254eb2c (patch) | |
tree | 79d2458fff3f2ec70314de76a70ca9eda8a00732 /src | |
parent | f36512dcdc0fc940dfad005a50d5a8890515abcc (diff) | |
download | openbsd-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.c | 16 |
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; |