21.03.2013 Views

Problem - Kevin Tafuro

Problem - Kevin Tafuro

Problem - Kevin Tafuro

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

char *spc_pbkdf2_encrypt(const char *key, const char *salt) {<br />

int error;<br />

char *base64_out, *base64_salt, *result, *salt_end, *tmp_string;<br />

size_t length, result_length, salt_length;<br />

unsigned int iterations, tmp_uint;<br />

unsigned char out[16], *raw_salt;<br />

unsigned long tmp_ulong;<br />

raw_salt = 0;<br />

base64_out = base64_salt = result = 0;<br />

if (!salt) {<br />

if (!(raw_salt = (unsigned char *)malloc((salt_length = 8)))) return 0;<br />

spc_rand(raw_salt, salt_length);<br />

if (!(base64_salt = spc_base64_encode(raw_salt, salt_length, 0))) {<br />

free(raw_salt);<br />

return 0;<br />

}<br />

iterations = 10000;<br />

} else {<br />

if (strncmp(salt, "$10$", 4) != 0) return 0;<br />

if (!(salt_end = strchr(salt + 4, '$'))) return 0;<br />

if (!(base64_salt = (char *)malloc(salt_end - (salt + 4) + 1))) return 0;<br />

memcpy(base64_salt, salt + 4, salt_end - (salt + 4));<br />

base64_salt[salt_end - (salt + 4)] = 0;<br />

tmp_ulong = strtoul(salt_end + 1, &tmp_string, 10);<br />

if ((tmp_ulong = = ULONG_MAX && errno = = ERANGE) || tmp_ulong > UINT_MAX ||<br />

!tmp_string || *tmp_string != '$') {<br />

free(base64_salt);<br />

return 0;<br />

}<br />

iterations = (unsigned int)tmp_ulong;<br />

raw_salt = spc_base64_decode(base64_salt, &salt_length, 1, &error);<br />

if (!raw_salt || error) {<br />

free(base64_salt);<br />

return 0;<br />

}<br />

}<br />

spc_pbkdf2((char *)key, strlen(key), raw_salt, salt_length, iterations,<br />

out, sizeof(out));<br />

if (!(base64_out = spc_base64_encode(out, sizeof(out), 0))) goto done;<br />

for (tmp_uint = iterations, length = 1; tmp_uint; length++) tmp_uint /= 10;<br />

result_length = strlen(base64_out) + strlen(base64_salt) + length + 6;<br />

if (!(result = (char *)malloc(result_length + 1))) goto done;<br />

sprintf(result, "$10$%s$%u$%s", base64_salt, iterations, base64_out);<br />

done:<br />

/* cleanup */<br />

if (raw_salt) free(raw_salt);<br />

if (base64_salt) free(base64_salt);<br />

if (base64_out) free(base64_out);<br />

return result;<br />

}<br />

410 | Chapter 8: Authentication and Key Exchange<br />

This is the Title of the Book, eMatter Edition<br />

Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!