Subject: Adding sha1 hashed passwords
To: None <tech-userlevel@netbsd.org>
From: Simon J. Gerraty <sjg@crufty.net>
List: tech-userlevel
Date: 05/29/2004 00:47:50
I'm adding support for crypt_sha1() 
I've some questions before posting patches...

Backround:

A sha1 hashed passwd looks like:

$sha1$<iterations>$<salt>$<digest>

where 

<iterations> is the number of times hmac_sha1 is applied to the
salt using the password as key.  The value can be controlled via
passwd.conf.

<salt> can be up to 64 random bytes, but pwd_gensalt only uses 8.

<digest> is the final hmac result.  The actual algoritm used is
essentially PBKDF1 from RFC 2898 (though using hmac_sha1 rather than
SHA1 directly), and reflects suggestions from several developers.

Eg. $sha1$8362$DSm2QUfl$O2GMtJPUwCqPDW04wpA.QLbv.kDbVlDb

Questions...

I notice that libcrypt uses __md5crypt() rather than the name
crypt_md5() used in FreeBSD (where I presume the routine originated).
I'm wondering if there's a reason to change the name of crypt_sha1 to
__sha1crypt for NetBSD or wether the current name is ok.

I extracted the static to64 from md5crypt.c and put it in its
own .c file as crypt_to64 and it is now used by __md5crypt, crypt_sha1
and pwd_gensalt.  Again, is there a reason the name should be
different?

Also, should hmac_sha1 be added to libcrypt or libc (or both?)
I've currently added it to both - to make my testing easier.
FWIW the hmac implementation is very simple - based on RFC 2104 and
includes unit tests for hmac_sha1 and hmac_md5.

Finally, does adding crypt_sha1 require bumping the version of
libcrypt.so ?

Thanks
--sjg