Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}