From bf9a97a2f8690ab16520e1e94fb0c38cf853546f Mon Sep 17 00:00:00 2001 From: visor Date: Thu, 1 Oct 2015 00:17:28 +0900 Subject: [PATCH] add hash algorithms of crypt function. --- lib/util_random.cc | 25 ++++++++++++++++++++++--- lib/util_random.h | 1 + lib/util_string.cc | 22 ++++++++++++++++++++-- lib/util_string.h | 8 +++++++- modules/ml-string.cc | 33 +++++++++++++++++++++++++-------- 5 files changed, 75 insertions(+), 14 deletions(-) diff --git a/lib/util_random.cc b/lib/util_random.cc index 7c4db3b..a48eb07 100644 --- a/lib/util_random.cc +++ b/lib/util_random.cc @@ -26,12 +26,10 @@ static void init () { static void enc (unsigned long v, char* b) { int i; -// int n = RChar.size (); int n = SaltChar.size (); for (i = 0; i < 5; i ++) { -// b[i] = RChar[v % n]; - b[i] = SaltChar[v % n]; + *b ++ = SaltChar[v % n]; v /= n; } } @@ -90,6 +88,27 @@ ustring makeSalt () { return ustring (b, 12); } +ustring makeSalt (char digit, size_t len) { + char b[48]; + + if (len > 32) + len = 32; + if (! Inited) + init (); + b[0] = '$'; + b[1] = digit; + b[2] = '$'; + for (int i = 0; i < 35; i += 5) { + if (len > i) { + enc (random (), b + i + 3); + } else { + break; + } + } + b[len + 3] = '$'; + return ustring (b, len + 4); +} + double randDouble () { if (! Inited) init (); diff --git a/lib/util_random.h b/lib/util_random.h index 011aa38..f017b32 100644 --- a/lib/util_random.h +++ b/lib/util_random.h @@ -7,6 +7,7 @@ ustring randomKey (); ustring randomKey (unsigned long n); ustring smallRandomKey (); ustring makeSalt (); +ustring makeSalt (char digit, size_t len); double randDouble (); long random_int (unsigned long n); diff --git a/lib/util_string.cc b/lib/util_string.cc index ef31ebf..a1b2e25 100644 --- a/lib/util_string.cc +++ b/lib/util_string.cc @@ -649,8 +649,26 @@ bool passMatch (const ustring& pass, const ustring& cpass) { return (strcmp (crypt (pass.c_str (), cpass.c_str ()), cpass.c_str ()) == 0); } -ustring passCrypt (const ustring& pass) { - ustring salt = makeSalt (); +ustring passCrypt (const ustring& pass, passCryptFormat format) { + // XXX not thread safe. + ustring salt; + switch (format) { + case FORMAT_MD5: + salt = makeSalt ('1', 8); + break; +// case FORMAT_BF: +// salt = makeSalt ('2', 16); +// break; + case FORMAT_SHA256: + salt = makeSalt ('5', 16); + break; + case FORMAT_SHA512: + salt = makeSalt ('6', 16); + break; + default: + assert (0); + } + std::cerr << salt << ":" << salt.length () << "\n"; return ustring (crypt (pass.c_str (), salt.c_str ())); } diff --git a/lib/util_string.h b/lib/util_string.h index feb6777..b98317a 100644 --- a/lib/util_string.h +++ b/lib/util_string.h @@ -87,7 +87,13 @@ unsigned long strtoul (const uiterator& b); double strtod (const ustring& str); long strtol (const ustring& str); bool passMatch (const ustring& pass, const ustring& cpass); -ustring passCrypt (const ustring& pass); +typedef enum { + FORMAT_MD5, + FORMAT_BF, + FORMAT_SHA256, + FORMAT_SHA512, +} passCryptFormat; +ustring passCrypt (const ustring& pass, passCryptFormat format); size_t strLength (const ustring& src); void substring (const ustring& src, size_t idx, size_t len, int flen, ustring& ans); ustring jsEncode (const ustring& str); diff --git a/modules/ml-string.cc b/modules/ml-string.cc index d2ebad0..5dc961e 100644 --- a/modules/ml-string.cc +++ b/modules/ml-string.cc @@ -707,7 +707,9 @@ MNode* ml_password_match (MNode* cell, MlEnv* mlenv) { /*DOC: ===password-crypt=== - (password-crypt PASSWORD) -> STRING + (password-crypt PASSWORD [#md5 | #sha256 | #sha512]) -> STRING + +deprecated. */ //#AFUNC password-crypt ml_password_crypt @@ -715,15 +717,30 @@ MNode* ml_password_match (MNode* cell, MlEnv* mlenv) { MNode* ml_password_crypt (MNode* cell, MlEnv* mlenv) { MNode* arg = cell->cdr (); ustring pass; + passCryptFormat format; + std::vector params; + std::vector keywords; + static paramList kwlist[] = { + {CharConst ("md5"), true}, + {CharConst ("sha256"), true}, + {CharConst ("sha512"), true}, +// {CharConst ("bf"), true}, + {NULL, 0, 0} + }; - if (! arg) - throw (uErrorWrongNumber); - pass = eval_str (arg->car (), mlenv); - nextNode (arg); - if (arg) - throw (uErrorWrongNumber); + format = FORMAT_MD5; + setParams (arg, 1, ¶ms, kwlist, &keywords, NULL); + pass = eval_str (params[0], mlenv); + if (keywords[0] && eval_bool (keywords[0], mlenv)) + format = FORMAT_MD5; + if (keywords[1] && eval_bool (keywords[1], mlenv)) + format = FORMAT_SHA256; + if (keywords[2] && eval_bool (keywords[2], mlenv)) + format = FORMAT_SHA512; +// if (keywords[3] && eval_bool (keywords[3], mlenv)) +// format = FORMAT_BF; - return newMNode_str (new ustring (passCrypt (pass))); + return newMNode_str (new ustring (passCrypt (pass, format))); } /*DOC: -- 2.11.0