176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#!/usr/bin/perl
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanuse bytes;
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanuse Crypt::PasswdMD5;
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanuse MIME::Base64;
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansub random_bytes($) {
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    my($n) = @_;
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    my($v, $i);
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if ( open(RANDOM, '<', '/dev/random') ||
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 open(RANDOM, '<', '/dev/urandom') ) {
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	read(RANDOM, $v, $n);
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } else {
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	# No real RNG available...
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	srand($$ ^ time);
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	$v = '';
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	for ( $i = 0 ; $i < $n ; $i++ ) {
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    $v .= ord(int(rand() * 256));
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return $v;
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman($pass, $salt) = @ARGV;
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanunless (defined($salt)) {
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    $salt = MIME::Base64::encode(random_bytes(6), '');
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    $salt =~ tr/\+/./;		# . not +
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint unix_md5_crypt($pass, $salt), "\n";
35