#include #include #include #include "md5.h" #include "random.h" #include "externs.h" #include "strings.h" #include "pw-b.h" #define MIN_ROUNDS 32 #define DEF_ROUNDS 256 #define MAX_ROUNDS 65536 /* don't casually change either of these; too many things depend on them */ static const char alphabet[] = "!\"#$%&'()*+,-./0123456789:;<=>?@" "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`" "abcdefghijklmnopqrstuvwxyz{|}~"; #define BASE 94 static unsigned int base_div(unsigned char *v) { unsigned int r; int i; r = 0; for (i=0;i<16;i++) { r = (r << 8) + v[i]; v[i] = r / BASE; r %= BASE; } return(r); } static void base_expand(const unsigned char *res, char *txt) { int i; unsigned char tmp[16]; bcopy(res,&tmp[0],16); for (i=0;i<20;i++) txt[i] = alphabet[base_div(&tmp[0])]; } int pw_b_check(const char *pass, const char *plain) { void *s; char *pp; int r; int i; unsigned char md5res[20]; char text[20]; const void *data; int datalen; r = strtol(pass,&pp,10); if ((r < MIN_ROUNDS) || (r > MAX_ROUNDS)) return(1); if (*pp++ != '.') return(1); if (strlen(pp) != 40) return(1); data = plain; datalen = strlen(plain); for (i=0;i> 8) & 0xff; binsalt[2] = (tv.tv_sec >> 16) & 0xff; binsalt[3] = (tv.tv_sec >> 24) & 0xff; binsalt[4] = tv.tv_usec & 0xff; binsalt[5] = (tv.tv_usec >> 8) & 0xff; binsalt[6] = (tv.tv_usec >> 16) & 0xff; binsalt[7] = (tv.tv_usec >> 24) & 0xff; i = rndint(); binsalt[8] = i & 0xff; binsalt[9] = (i >> 8) & 0xff; binsalt[10] = (i >> 16) & 0xff; binsalt[11] = (i >> 24) & 0xff; s = md5_init(); md5_process_bytes(s,&binsalt[0],12); md5_result(s,&md5res[0]); base_expand(&md5res[0],tp); data = plain; datalen = strlen(plain); for (i=0;i