Hi Lagi Pittas,
Thanks for your time,  the full outcome is to make md5Crypt function. 
Using openSSL this is what I get:
Code: Select all
C:\>openssl passwd -1 -salt salt password
$1$salt$qJH7.N4xYta3aEG/dfqo/0
that actually means encrypt "password" with Salt "salt"  and the result is  ---> $1$salt$qJH7.N4xYta3aEG/dfqo/0
I found a javascript to do just that...
Code: Select all
const ascii64 =
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
function to64(v, n)
{
 var s = "";
 while (--n >= 0) {
  s += ascii64.charAt( v & 0x3f );
  v >>= 6;
 }
 return s;
}
function to64_triplet(str, idx0, idx1, idx2)
{
 var v = (str.charCodeAt(idx0) << 16) |
         (str.charCodeAt(idx1) <<  8) |
         (str.charCodeAt(idx2));
 return to64(v, 4);
}
function to64_single(str, idx0)
{
 var v = str.charCodeAt(idx0);
 return to64(v, 2);
}
function md5crypt(password, salt)
{
 var ctx = password+"$1$"+salt;
 var ctx1 = str_md5( password+salt+password );
 /* "Just as many characters of ctx1" (as there are in the password) */
 for (var pl=password.length; pl>0; pl -= 16)
  ctx += ctx1.slice(0, (pl > 16) ? 16 : pl);
 /* "Then something really weird" */
 for (var i=password.length; i != 0; i >>= 1)
  if (i & 1)
   ctx += "\0";
  else
   ctx += password.charAt(0);
 ctx = str_md5(ctx);
 /* "Just to make sure things don't run too fast" */
 for (i=0; i<1000; i++) {
  ctx1 = "";
  if (i & 1) ctx1 += password;
  else ctx1 += ctx;
  if (i % 3) ctx1 += salt;
  if (i % 7) ctx1 += password;
  if (i & 1) ctx1 += ctx;
  else ctx1 += password;
  ctx = str_md5(ctx1);
 }
 return "$1$" + salt + "$" +
   to64_triplet(ctx, 0,  6, 12) +
   to64_triplet(ctx, 1,  7, 13) +
   to64_triplet(ctx, 2,  8, 14) +
   to64_triplet(ctx, 3,  9, 15) +
   to64_triplet(ctx, 4, 10,  5) +
   to64_single(ctx, 11);
}
I tried to do half but I did not know how to do bit-shit on LC, an you did the rest.... this is what I got mixing with your code
function str_md5 hashtext
    local md5, mdhex
    put md5Digest(hashtext) into md5
    get binaryDecode("H*",md5,mdhex)
    return mdhex
end str_md5
Function to64  v, n
    local lcStr
    put character 1 to n of v into lcStr
    return Base64Encode(lcStr)
end to64
function to64_single v, idx0
       return Base64Encode(character idx0 of v)
end to64_single
function to64_triplet v, idx0, idx1, idx2
       local lcStr
         put character idx0 of v after lcStr
         put character idx1 of v after lcStr
         put character idx2  of v after lcStr
       return Base64Encode(lcStr)
end to64_triplet
function md5crypt pPassword, pSalt
   local ctx, ctx1
   put pPassword & "$1$" & pSalt into ctx
   put str_md5(pPassword & pSalt & pPassword) into ctx1
   put the length of pPassword into pl
   
   
   /* "Just as many characters of ctx1" (as there are in the password) */
   repeat while pl > 0
      if pl > 16 then
         put 16 into tMax
         put char 1 to tMax of ctx1 after ctx
      else
         put  pl into tMax
         put char 1 to tMax of ctx1 after ctx
      end if
      subtract 16 from pl      
   end repeat
   
   
   /* "Then something really weird" */
   put numToChar(the length of pPassword) into i
   if the length of pPassword >0 then
      
   --put numToChar(i) into temp
   --put temp into fld"temp"
   get binaryDecode("b*",i,binary_i) 
   put binary_i into fld "temp"
   repeat for each character tChar in binary_i
      if tChar = 1 then
         put char 1 of pPassword after ctx
      else
         put null after ctx
      end if
      put str_md5(ctx) into ctx
end repeat
   
end if
      
      /* "Just to make sure things don't run too fast" */
put 0 into i
repeat while i<1000
   put "" into ctx1
   
   if (i mod 2) = 1 then
      put pPassword after ctx1
   else
      put ctx after ctx1
   end if
   
   if (i mod 3) <>0 then
      put pSalt after ctx1
   end if
   
   if (i mod 7) <> 0 then
      put pPassword after ctx1
   end if
   
   if (i mod 2) = 0 then
      put ctx after ctx1
   else
      put pPassword after ctx1
   end if
   
   put str_md5(ctx1) into ctx
   add 1 to i
end repeat
put "" into new_ctx
put char 25 to 26 of ctx after new_ctx
put char 13 to 14 of ctx after new_ctx
put char 1 to 2 of ctx after new_ctx
put char 27 to 28 of ctx after new_ctx
put char 15 to 16 of ctx after new_ctx
put char 3 to 4 of ctx after new_ctx
put char 29 to 30 of ctx after new_ctx
put char 17 to 18 of ctx after new_ctx
put char 5 to 6 of ctx after new_ctx
put char 31 to 32 of ctx after new_ctx
put char 19 to 20 of ctx after new_ctx
put char 7 to 8 of ctx after new_ctx
put char 11 to 12 of ctx after new_ctx
put char 21 to 22 of ctx after new_ctx
put char 9 to 10 of ctx after new_ctx
put char 23 to 24 of ctx after new_ctx
   
return "$1$" & pSalt & "$" & \
to64_triplet (ctx, 0,  6, 12)  & \
to64_triplet(ctx, 1,  7, 13) & \
to64_triplet(ctx, 2,  8, 14)& \
to64_triplet(ctx, 3,  9, 15)& \
to64_triplet(ctx, 4, 10,  5) & \
to64_single(ctx, 11)
end md5crypt
I attached the test md5crypt.....  
I also found the algorithm for it on : https : // pythonhosted . org/passlib/lib/passlib.hash.md5_crypt.html#algorithm
Can you check if you can find the problem?