adding full scheme comparison to libcrypt:crypt and pwhash tests

This commit is contained in:
jhigh 2019-10-05 18:06:16 +00:00
parent da97884ede
commit c7ab523edc
6 changed files with 129 additions and 11 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: mi,v 1.821 2019/09/15 16:58:11 christos Exp $
# $NetBSD: mi,v 1.822 2019/10/05 18:06:16 jhigh Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@ -4208,6 +4208,10 @@
./usr/tests/usr.bin/pr/d_basic.in tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/pr/d_basic.out tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/pr/t_basic tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/pwhash tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/pwhash/Atffile tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/pwhash/Kyuafile tests-usr.bin-tests compattestfile,atf,kyua
./usr/tests/usr.bin/pwhash/t_pwhash tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/printf tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/printf/Atffile tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/printf/Kyuafile tests-usr.bin-tests compattestfile,atf,kyua

View File

@ -1,4 +1,4 @@
# $NetBSD: NetBSD.dist.tests,v 1.158 2019/04/04 19:50:47 kamil Exp $
# $NetBSD: NetBSD.dist.tests,v 1.159 2019/10/05 18:06:16 jhigh Exp $
./usr/libdata/debug/usr/tests
./usr/libdata/debug/usr/tests/atf
@ -416,6 +416,7 @@
./usr/tests/usr.bin/pkill
./usr/tests/usr.bin/pr
./usr/tests/usr.bin/printf
./usr/tests/usr.bin/pwhash
./usr/tests/usr.bin/rump_server
./usr/tests/usr.bin/sdiff
./usr/tests/usr.bin/sed

View File

@ -1,4 +1,4 @@
/* $NetBSD: crypt.c,v 1.34 2015/06/17 00:15:26 christos Exp $ */
/* $NetBSD: crypt.c,v 1.35 2019/10/05 18:06:16 jhigh Exp $ */
/*
* Copyright (c) 1989, 1993
@ -37,13 +37,14 @@
#if 0
static char sccsid[] = "@(#)crypt.c 8.1.1.1 (Berkeley) 8/18/93";
#else
__RCSID("$NetBSD: crypt.c,v 1.34 2015/06/17 00:15:26 christos Exp $");
__RCSID("$NetBSD: crypt.c,v 1.35 2019/10/05 18:06:16 jhigh Exp $");
#endif
#endif /* not lint */
#include <limits.h>
#include <pwd.h>
#include <stdlib.h>
#include <string.h> /* for strcmp */
#include <unistd.h>
#if defined(DEBUG) || defined(MAIN) || defined(UNIT_TEST)
#include <stdio.h>
@ -497,6 +498,48 @@ ascii_is_unsafe(char ch)
return !ch || ch == '\n' || ch == ':';
}
/*
* We extract the scheme from setting str to allow for
* full scheme name comparison
* Updated to reflect alc suggestion(s)
*
* retuns boolean 0 on failure, 1 on success,
*/
static int
nondes_scheme_substr(const char * setting,char * scheme, unsigned int len)
{
const char * start;
const char * sep;
/* initialize head pointer */
start = setting;
/* clear out scheme buffer regardless of result */
memset(scheme, 0, len);
/* make sure we are working on non-des scheme string */
if (*start != _PASSWORD_NONDES) {
return 0;
}
/* increment passed initial _PASSWORD_NONDES */
start++;
if ((sep = memchr(start, _PASSWORD_NONDES,len-1)) == NULL) {
return 0;
}
/* if empty string, we are done */
if (sep == start) {
return 1;
}
/* copy scheme substr to buffer */
memcpy(scheme, start, (size_t)(sep - start));
return 1;
}
/*
* Return a pointer to static data consisting of the "setting"
* followed by an encryption produced by the "key" and "setting".
@ -505,24 +548,39 @@ static char *
__crypt(const char *key, const char *setting)
{
char *encp;
char scheme[12];
int32_t i;
int t;
int r;
int32_t salt;
int num_iter, salt_size;
C_block keyblock, rsltblock;
/* Non-DES encryption schemes hook in here. */
if (setting[0] == _PASSWORD_NONDES) {
switch (setting[1]) {
case '2':
r = nondes_scheme_substr(
setting, scheme, sizeof(scheme));
/* return NULL if we are unable to extract substring */
if (!r) {
return NULL;
}
/* $2a$ found in bcrypt.c:encode_salt */
if (strcmp(scheme, "2a") == 0) {
return (__bcrypt(key, setting));
case 's':
} else if (strcmp(scheme, "sha1") == 0) {
/* $sha1$ found in crypt.h:SHA1_MAGIC */
return (__crypt_sha1(key, setting));
case '1':
default:
} else if (strcmp(scheme, "1") == 0) {
/* $1$ found in pw_gensalt.c:__gensalt_md5 */
return (__md5crypt(key, setting));
} else {
/* invalid scheme, including empty string */
return NULL;
}
}
/* End non-DES handling */
for (i = 0; i < 8; i++) {
if ((t = 2*(unsigned char)(*key)) != 0)

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.27 2019/04/04 15:22:13 kamil Exp $
# $NetBSD: Makefile,v 1.28 2019/10/05 18:06:16 jhigh Exp $
#
.include <bsd.own.mk>
@ -8,7 +8,7 @@ TESTSDIR= ${TESTSBASE}/usr.bin
TESTS_SUBDIRS= awk basename bzip2 cc cmp config cut \
diff dirname find gdb grep gzip id indent \
infocmp jot ld m4 make mixerctl mkdep nbperf netpgpverify \
pkill pr printf rump_server shmif_dumpbus sdiff \
pkill pr printf pwhash rump_server shmif_dumpbus sdiff \
sed sort tmux tr unifdef uniq vmstat xlint
.if ${MKCXX} != "no"

View File

@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.1 2019/10/05 18:06:17 jhigh Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/usr.bin/pwhash
TESTS_SH= t_pwhash
.include <bsd.test.mk>

View File

@ -0,0 +1,47 @@
atf_test_case pwhash_blowfish_r12
pwhash_blowfish_r12_head() {
atf_set "descr" "ATF test for pwhash using blowfish 12 rounds"
}
pwhash_blowfish_r12_body() {
atf_check -s exit:0 -o match:"^\\\$2a\\\$" -x \
'echo -n password | pwhash -b 12'
}
atf_test_case pwhash_md5
pwhash_md5_head() {
atf_set "descr" "ATF test for pwhash using MD5"
}
pwhash_md5_body() {
atf_check -s exit:0 -o match:"^\\\$1\\\$" -x \
'echo -n password | pwhash -m'
}
atf_test_case pwhash_sha1
pwhash_sha1_head() {
atf_set "descr" "ATF test for pwhash using SHA1"
}
pwhash_sha1_body() {
atf_check -s exit:0 -o match:"^\\\$sha1\\\$" -x \
'echo -n password | pwhash'
}
atf_test_case pwhash_des
pwhash_des_head() {
atf_set "descr" "ATF test for pwhash using DES"
}
pwhash_des_body() {
atf_check -s exit:0 -o ignore -e ignore -x \
'echo -n password | pwhash -s somesalt'
}
atf_init_test_cases()
{
atf_add_test_case pwhash_blowfish_r12
atf_add_test_case pwhash_md5
atf_add_test_case pwhash_sha1
atf_add_test_case pwhash_des
}