diff options
Diffstat (limited to 'src/lib/libc/crypt/bcrypt.c')
| -rw-r--r-- | src/lib/libc/crypt/bcrypt.c | 142 |
1 files changed, 56 insertions, 86 deletions
diff --git a/src/lib/libc/crypt/bcrypt.c b/src/lib/libc/crypt/bcrypt.c index b108cfe04c..2df2508246 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.29 2014/02/24 19:45:43 tedu Exp $ */ | 1 | /* $OpenBSD: bcrypt.c,v 1.30 2014/03/19 02:43:03 tedu Exp $ */ |
| 2 | 2 | ||
| 3 | /* | 3 | /* |
| 4 | * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> | 4 | * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> |
| @@ -72,61 +72,6 @@ static char encrypted[_PASSWORD_LEN]; | |||
| 72 | static char gsalt[7 + (BCRYPT_MAXSALT * 4 + 2) / 3 + 1]; | 72 | static char gsalt[7 + (BCRYPT_MAXSALT * 4 + 2) / 3 + 1]; |
| 73 | static char error[] = ":"; | 73 | static char error[] = ":"; |
| 74 | 74 | ||
| 75 | const static u_int8_t Base64Code[] = | ||
| 76 | "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; | ||
| 77 | |||
| 78 | const static u_int8_t index_64[128] = { | ||
| 79 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 80 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 81 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 82 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 83 | 255, 255, 255, 255, 255, 255, 0, 1, 54, 55, | ||
| 84 | 56, 57, 58, 59, 60, 61, 62, 63, 255, 255, | ||
| 85 | 255, 255, 255, 255, 255, 2, 3, 4, 5, 6, | ||
| 86 | 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, | ||
| 87 | 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, | ||
| 88 | 255, 255, 255, 255, 255, 255, 28, 29, 30, | ||
| 89 | 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, | ||
| 90 | 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, | ||
| 91 | 51, 52, 53, 255, 255, 255, 255, 255 | ||
| 92 | }; | ||
| 93 | #define CHAR64(c) ( (c) > 127 ? 255 : index_64[(c)]) | ||
| 94 | |||
| 95 | static void | ||
| 96 | decode_base64(u_int8_t *buffer, u_int16_t len, u_int8_t *data) | ||
| 97 | { | ||
| 98 | u_int8_t *bp = buffer; | ||
| 99 | u_int8_t *p = data; | ||
| 100 | u_int8_t c1, c2, c3, c4; | ||
| 101 | while (bp < buffer + len) { | ||
| 102 | c1 = CHAR64(*p); | ||
| 103 | c2 = CHAR64(*(p + 1)); | ||
| 104 | |||
| 105 | /* Invalid data */ | ||
| 106 | if (c1 == 255 || c2 == 255) | ||
| 107 | break; | ||
| 108 | |||
| 109 | *bp++ = (c1 << 2) | ((c2 & 0x30) >> 4); | ||
| 110 | if (bp >= buffer + len) | ||
| 111 | break; | ||
| 112 | |||
| 113 | c3 = CHAR64(*(p + 2)); | ||
| 114 | if (c3 == 255) | ||
| 115 | break; | ||
| 116 | |||
| 117 | *bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); | ||
| 118 | if (bp >= buffer + len) | ||
| 119 | break; | ||
| 120 | |||
| 121 | c4 = CHAR64(*(p + 3)); | ||
| 122 | if (c4 == 255) | ||
| 123 | break; | ||
| 124 | *bp++ = ((c3 & 0x03) << 6) | c4; | ||
| 125 | |||
| 126 | p += 4; | ||
| 127 | } | ||
| 128 | } | ||
| 129 | |||
| 130 | static void | 75 | static void |
| 131 | encode_salt(char *salt, u_int8_t *csalt, u_int16_t clen, u_int8_t logr) | 76 | encode_salt(char *salt, u_int8_t *csalt, u_int16_t clen, u_int8_t logr) |
| 132 | { | 77 | { |
| @@ -284,6 +229,61 @@ bcrypt(const char *key, const char *salt) | |||
| 284 | return encrypted; | 229 | return encrypted; |
| 285 | } | 230 | } |
| 286 | 231 | ||
| 232 | const static u_int8_t Base64Code[] = | ||
| 233 | "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; | ||
| 234 | |||
| 235 | const static u_int8_t index_64[128] = { | ||
| 236 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 237 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 238 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 239 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 240 | 255, 255, 255, 255, 255, 255, 0, 1, 54, 55, | ||
| 241 | 56, 57, 58, 59, 60, 61, 62, 63, 255, 255, | ||
| 242 | 255, 255, 255, 255, 255, 2, 3, 4, 5, 6, | ||
| 243 | 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, | ||
| 244 | 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, | ||
| 245 | 255, 255, 255, 255, 255, 255, 28, 29, 30, | ||
| 246 | 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, | ||
| 247 | 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, | ||
| 248 | 51, 52, 53, 255, 255, 255, 255, 255 | ||
| 249 | }; | ||
| 250 | #define CHAR64(c) ( (c) > 127 ? 255 : index_64[(c)]) | ||
| 251 | |||
| 252 | static void | ||
| 253 | decode_base64(u_int8_t *buffer, u_int16_t len, u_int8_t *data) | ||
| 254 | { | ||
| 255 | u_int8_t *bp = buffer; | ||
| 256 | u_int8_t *p = data; | ||
| 257 | u_int8_t c1, c2, c3, c4; | ||
| 258 | while (bp < buffer + len) { | ||
| 259 | c1 = CHAR64(*p); | ||
| 260 | c2 = CHAR64(*(p + 1)); | ||
| 261 | |||
| 262 | /* Invalid data */ | ||
| 263 | if (c1 == 255 || c2 == 255) | ||
| 264 | break; | ||
| 265 | |||
| 266 | *bp++ = (c1 << 2) | ((c2 & 0x30) >> 4); | ||
| 267 | if (bp >= buffer + len) | ||
| 268 | break; | ||
| 269 | |||
| 270 | c3 = CHAR64(*(p + 2)); | ||
| 271 | if (c3 == 255) | ||
| 272 | break; | ||
| 273 | |||
| 274 | *bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); | ||
| 275 | if (bp >= buffer + len) | ||
| 276 | break; | ||
| 277 | |||
| 278 | c4 = CHAR64(*(p + 3)); | ||
| 279 | if (c4 == 255) | ||
| 280 | break; | ||
| 281 | *bp++ = ((c3 & 0x03) << 6) | c4; | ||
| 282 | |||
| 283 | p += 4; | ||
| 284 | } | ||
| 285 | } | ||
| 286 | |||
| 287 | static void | 287 | static void |
| 288 | encode_base64(u_int8_t *buffer, u_int8_t *data, u_int16_t len) | 288 | encode_base64(u_int8_t *buffer, u_int8_t *data, u_int16_t len) |
| 289 | { | 289 | { |
| @@ -313,33 +313,3 @@ encode_base64(u_int8_t *buffer, u_int8_t *data, u_int16_t len) | |||
| 313 | } | 313 | } |
| 314 | *bp = '\0'; | 314 | *bp = '\0'; |
| 315 | } | 315 | } |
| 316 | #if 0 | ||
| 317 | void | ||
| 318 | main() | ||
| 319 | { | ||
| 320 | char blubber[73]; | ||
| 321 | char salt[100]; | ||
| 322 | char *p; | ||
| 323 | salt[0] = '$'; | ||
| 324 | salt[1] = BCRYPT_VERSION; | ||
| 325 | salt[2] = '$'; | ||
| 326 | |||
| 327 | snprintf(salt + 3, 4, "%2.2u$", 5); | ||
| 328 | |||
| 329 | printf("24 bytes of salt: "); | ||
| 330 | fgets(salt + 6, sizeof(salt) - 6, stdin); | ||
| 331 | salt[99] = 0; | ||
| 332 | printf("72 bytes of password: "); | ||
| 333 | fpurge(stdin); | ||
| 334 | fgets(blubber, sizeof(blubber), stdin); | ||
| 335 | blubber[72] = 0; | ||
| 336 | |||
| 337 | p = crypt(blubber, salt); | ||
| 338 | printf("Passwd entry: %s\n\n", p); | ||
| 339 | |||
| 340 | p = bcrypt_gensalt(5); | ||
| 341 | printf("Generated salt: %s\n", p); | ||
| 342 | p = crypt(blubber, p); | ||
| 343 | printf("Passwd entry: %s\n", p); | ||
| 344 | } | ||
| 345 | #endif | ||
