int pbkdf2_check(char *password, char *hash) { static char *sha, *salt, *h_pw; int iterations, saltlen, blen; char *b64; unsigned char key[128]; int match = FALSE; const EVP_MD *evpmd; if (detoken(hash, &sha, &iterations, &salt, &h_pw) != 0) return match; #ifdef PWDEBUG fprintf(stderr, "sha =[%s]\n", sha); fprintf(stderr, "iterations =%d\n", iterations); fprintf(stderr, "salt =[%s]\n", salt); fprintf(stderr, "h_pw =[%s]\n", h_pw); #endif saltlen = strlen((char *)salt); evpmd = EVP_sha256(); if (strcmp(sha, "sha1") == 0) { evpmd = EVP_sha1(); } else if (strcmp(sha, "sha512") == 0) { evpmd = EVP_sha512(); } PKCS5_PBKDF2_HMAC(password, strlen(password), (unsigned char *)salt, saltlen, iterations, evpmd, KEY_LENGTH, key); blen = base64_encode(key, KEY_LENGTH, &b64); if (blen > 0) { int i, diff = 0, hlen = strlen(h_pw); #ifdef PWDEBUG fprintf(stderr, "HMAC b64 =[%s]\n", b64); #endif /* "manual" strcmp() to ensure constant time */ for (i = 0; (i < blen) && (i < hlen); i++) { diff |= h_pw[i] ^ b64[i]; } match = diff == 0; if (hlen != blen) match = 0; free(b64); } free(sha); free(salt); free(h_pw); return match; }
void prg2txt (FILE *in, FILE *out, char *fname, int lowercase) { Addy_type start_addy; Basrec_type rec; char oline [MAXLINE]; int x; if (get_addy (in, &start_addy) == EOF || start_addy.whole_addy != START_ADDY) exit_wrong_fmt (fname); get_rec_len (ADDY_NULL); while (! (x = get_rec (in, &rec))) if (detoken (&rec, oline, MAXLINE, lowercase)) fprintf (out, "%u %s\n", rec.line_num.whole_addy, oline); if (x == EOF) exit_wrong_fmt (fname); return; }
int pbkdf2_check(char *password, char *hash) { static char *sha, *salt, *h_pw; int iterations, saltlen, blen; char *b64, *keybuf; unsigned char *out; int match = FALSE; const EVP_MD *evpmd; int keylen, rc; if (detoken(hash, &sha, &iterations, &salt, &h_pw) != 0) return match; /* Determine key length by decoding base64 */ if ((keybuf = malloc(strlen(h_pw) + 1)) == NULL) { fprintf(stderr, "Out of memory\n"); return FALSE; } keylen = base64_decode(h_pw, keybuf); if (keylen < 1) { free(keybuf); return (FALSE); } free(keybuf); if ((out = malloc(keylen)) == NULL) { fprintf(stderr, "Cannot allocate out; out of memory\n"); return (FALSE); } #ifdef PWDEBUG fprintf(stderr, "sha =[%s]\n", sha); fprintf(stderr, "iterations =%d\n", iterations); fprintf(stderr, "salt =[%s]\n", salt); fprintf(stderr, "h_pw =[%s]\n", h_pw); fprintf(stderr, "kenlen =[%d]\n", keylen); #endif saltlen = strlen((char *)salt); evpmd = EVP_sha256(); if (strcmp(sha, "sha1") == 0) { evpmd = EVP_sha1(); } else if (strcmp(sha, "sha512") == 0) { evpmd = EVP_sha512(); } rc = PKCS5_PBKDF2_HMAC(password, strlen(password), (unsigned char *)salt, saltlen, iterations, evpmd, keylen, out); if (rc != 1) { goto out; } blen = base64_encode(out, keylen, &b64); if (blen > 0) { int i, diff = 0, hlen = strlen(h_pw); #ifdef PWDEBUG fprintf(stderr, "HMAC b64 =[%s]\n", b64); #endif /* "manual" strcmp() to ensure constant time */ for (i = 0; (i < blen) && (i < hlen); i++) { diff |= h_pw[i] ^ b64[i]; } match = diff == 0; if (hlen != blen) match = 0; free(b64); } out: free(sha); free(salt); free(h_pw); free(out); return match; }