OSDN Git Service

add hash algorithms of crypt function.
authorvisor <visor@users.sourceforge.jp>
Wed, 30 Sep 2015 15:17:28 +0000 (00:17 +0900)
committervisor <visor@users.sourceforge.jp>
Wed, 30 Sep 2015 15:17:28 +0000 (00:17 +0900)
lib/util_random.cc
lib/util_random.h
lib/util_string.cc
lib/util_string.h
modules/ml-string.cc

index 7c4db3b..a48eb07 100644 (file)
@@ -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 ();
index 011aa38..f017b32 100644 (file)
@@ -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);
 
index ef31ebf..a1b2e25 100644 (file)
@@ -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 ()));
 }
 
index feb6777..b98317a 100644 (file)
@@ -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);
index d2ebad0..5dc961e 100644 (file)
@@ -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<MNode*>  params;
+    std::vector<MNode*>  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, &params, 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: