23 lines
1.2 KiB
Text
23 lines
1.2 KiB
Text
md5( message ) = { my(
|
|
a = 0x67452301, b = 0xefcdab89, c = 0x98badcfe, d = 0x10325476,
|
|
s = [ 7, 12, 17, 22; 5, 9, 14, 20; 4, 11, 16, 23; 6, 10, 15, 21 ],
|
|
msg = concat( Vec( concat(Vecsmall(message), Vecsmall(128)), (#message + 9) \ 64 * 64 + 56 ),
|
|
Vecrev(digits( #message % 2^61 * 8, 256), 8)), \\ little endian !
|
|
leftrotate(x, c) = x << c + x >> (32-c)
|
|
);
|
|
\\*** Process the message in successive 512-bit chunks ***
|
|
forstep( m=1, #msg, 512/8,
|
|
my( \\ break chunk into 32-bit words M[j] - LITTLE ENDIAN !
|
|
M = vector( 16, j, fromdigits( Vecrev(msg[ m + j*4 - 4 .. m + j*4 - 1 ]), 2^8 )),
|
|
A = a, B = b, C = c, D = d);
|
|
for( i = 0 , 63 , [A, D, C, B] = [D, C, B, B + leftrotate( ( A + abs(sin(i+1))\2^-32 +
|
|
if( i < 16 , bitor( bitand(B , C) , bitand( bitneg(B) , D)) + M[ i +1]
|
|
, i < 32 , bitor( bitand(D , B) , bitand( bitneg(D) , C)) + M[ (5*i + 1) % 16 +1]
|
|
, i < 48 , bitxor( bitxor( B , C ) , D ) + M[ (3*i + 5) % 16 +1]
|
|
, bitxor( C , bitor( bitneg(D), B)) + M[ 7*i % 16 +1]
|
|
)) % 2^32, s[i\16+1, i%4+1] )]
|
|
); \\ end for
|
|
[a,b,c,d] = ([a,b,c,d] + [A,B,C,D]) % 2^32 ;
|
|
); \\ end forstep
|
|
Strprintf("%032x",fromdigits(Vecrev(digits(fromdigits([d,c,b,a],2^32),256),16),256))
|
|
}
|