Data update
This commit is contained in:
parent
ed705008a8
commit
0df55f9f24
2196 changed files with 32999 additions and 3075 deletions
|
|
@ -9,10 +9,10 @@
|
|||
init_values = (UInt32(6745'2301), UInt32(EFCD'AB89), UInt32(98BA'DCFE), UInt32(1032'5476))
|
||||
|
||||
[((UInt32, UInt32, UInt32) -> UInt32)] functions
|
||||
functions [+]= (b, c, d) -> (b [&] c) [|] ((-)b [&] d)
|
||||
functions [+]= (b, c, d) -> (d [&] b) [|] ((-)d [&] c)
|
||||
functions [+]= (b, c, d) -> (b [&] c) [|] (~b [&] d)
|
||||
functions [+]= (b, c, d) -> (d [&] b) [|] (~d [&] c)
|
||||
functions [+]= (b, c, d) -> b (+) c (+) d
|
||||
functions [+]= (b, c, d) -> c (+) (b [|] (-)d)
|
||||
functions [+]= (b, c, d) -> c (+) (b [|] ~d)
|
||||
|
||||
[(Int -> Int)] index_functions
|
||||
index_functions [+]= i -> i
|
||||
|
|
|
|||
|
|
@ -1,24 +1,25 @@
|
|||
proto md5($msg) returns Blob is export {*}
|
||||
multi md5(Str $msg) { md5 $msg.encode }
|
||||
multi md5(Blob $msg) {
|
||||
sub rotl(uint32 \x, \n) returns uint32 { (x +< n) +| (x +> (32-n)) }
|
||||
sub little-endian($w, $n, *@v) { (@v X+> flat ($w X* ^$n)) X% (2 ** $w) }
|
||||
my \bits = 8 * $msg.elems;
|
||||
Blob.new: little-endian 8, 4,
|
||||
|reduce -> Blob $blob, blob32 $X {
|
||||
my buf8 $buf .= new;
|
||||
$buf.write-uint32: $buf.elems, $_, LittleEndian for
|
||||
reduce -> Blob $blob, blob32 $X {
|
||||
blob32.new: $blob Z+
|
||||
reduce -> $b, $i {
|
||||
blob32.new:
|
||||
$b[3],
|
||||
$b[1] + rotl(
|
||||
$b[0] + (BEGIN Array.new:
|
||||
$b[1] +
|
||||
-> uint32 \x, \n { (x +< n) +| (x +> (32-n)) }(
|
||||
($b[0] + (BEGIN Array.new:
|
||||
{ ($^x +& $^y) +| (+^$x +& $^z) },
|
||||
{ ($^x +& $^z) +| ($^y +& +^$z) },
|
||||
{ $^x +^ $^y +^ $^z },
|
||||
{ $^y +^ ($^x +| +^$^z) }
|
||||
)[$i div 16](|$b[1..3]) +
|
||||
(BEGIN blob32.new: map &floor ∘ * * 2**32 ∘ &abs ∘ &sin ∘ * + 1, ^64)[$i] +
|
||||
$X[(BEGIN Blob.new: 16 X[R%] flat ($++, 5*$++ + 1, 3*$++ + 5, 7*$++) Xxx 16)[$i]],
|
||||
$X[(BEGIN Blob.new: 16 X[R%] flat ($++, 5*$++ + 1, 3*$++ + 5, 7*$++) Xxx 16)[$i]]
|
||||
) mod 2**32,
|
||||
(BEGIN flat < 7 12 17 22 5 9 14 20 4 11 16 23 6 10 15 21 >.rotor(4) Xxx 4)[$i]
|
||||
),
|
||||
$b[1],
|
||||
|
|
@ -27,10 +28,14 @@ multi md5(Blob $msg) {
|
|||
},
|
||||
(BEGIN blob32.new: 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476),
|
||||
|map { blob32.new: @$_ },
|
||||
blob32.new(flat(@$msg, 0x80, 0x00 xx (-(bits div 8 + 1 + 8) % 64))
|
||||
.rotor(4).map({ :256[@^a.reverse] }), little-endian(32, 2, bits)
|
||||
)
|
||||
{
|
||||
$^b.push(blob8.new(@$_).read-uint32(0)) for (@$msg, 0x80, 0x00 xx (-(bits div 8 + 1 + 8) % 64))
|
||||
.flat.rotor(4);
|
||||
$b.write-uint64: $b.elems, bits, LittleEndian;
|
||||
$b;
|
||||
}(buf32.new)
|
||||
.rotor(16);
|
||||
$buf;
|
||||
}
|
||||
|
||||
CHECK {
|
||||
|
|
|
|||
|
|
@ -1,20 +1,103 @@
|
|||
object MD5 extends App {
|
||||
import java.lang.Math
|
||||
|
||||
def hash(s: String) = {
|
||||
def b = s.getBytes("UTF-8")
|
||||
object MD5 {
|
||||
private val INIT_A = 0x67452301
|
||||
private val INIT_B = 0xEFCDAB89
|
||||
private val INIT_C = 0x98BADCFE
|
||||
private val INIT_D = 0x10325476
|
||||
|
||||
def m = java.security.MessageDigest.getInstance("MD5").digest(b)
|
||||
private val SHIFT_AMTS = Array(
|
||||
7, 12, 17, 22,
|
||||
5, 9, 14, 20,
|
||||
4, 11, 16, 23,
|
||||
6, 10, 15, 21
|
||||
)
|
||||
|
||||
BigInt(1, m).toString(16).reverse.padTo(32, "0").reverse.mkString
|
||||
private val TABLE_T = Array.tabulate(64)(i => (Math.abs(Math.sin(i + 1)) * (1L << 32)).toLong.toInt)
|
||||
|
||||
def computeMD5(message: Array[Byte]): Array[Byte] = {
|
||||
val messageLenBytes = message.length
|
||||
val numBlocks = ((messageLenBytes + 8) >>> 6) + 1
|
||||
val totalLen = numBlocks << 6
|
||||
val paddingBytes = Array.fill[Byte](totalLen - messageLenBytes)(0)
|
||||
paddingBytes(0) = 0x80.toByte
|
||||
|
||||
var messageLenBits = messageLenBytes.toLong << 3
|
||||
for (i <- 0 until 8) {
|
||||
paddingBytes(paddingBytes.length - 8 + i) = messageLenBits.toByte
|
||||
messageLenBits >>>= 8
|
||||
}
|
||||
|
||||
var a = INIT_A
|
||||
var b = INIT_B
|
||||
var c = INIT_C
|
||||
var d = INIT_D
|
||||
val buffer = new Array[Int](16)
|
||||
|
||||
for (i <- 0 until numBlocks) {
|
||||
var index = i << 6
|
||||
for (j <- 0 until 64) {
|
||||
buffer(j >>> 2) = (((if (index < messageLenBytes) message(index) else paddingBytes(index - messageLenBytes)) << 24) | (buffer(j >>> 2) >>> 8)).toInt
|
||||
index += 1
|
||||
}
|
||||
val originalA = a
|
||||
val originalB = b
|
||||
val originalC = c
|
||||
val originalD = d
|
||||
|
||||
for (j <- 0 until 64) {
|
||||
val div16 = j >>> 4
|
||||
val bufferIndex = j match {
|
||||
case j if j < 16 => j
|
||||
case j if j < 32 => (j * 5 + 1) & 0x0F
|
||||
case j if j < 48 => (j * 3 + 5) & 0x0F
|
||||
case j => (j * 7) & 0x0F
|
||||
}
|
||||
|
||||
val f = div16 match {
|
||||
case 0 => (b & c) | (~b & d)
|
||||
case 1 => (b & d) | (c & ~d)
|
||||
case 2 => b ^ c ^ d
|
||||
case 3 => c ^ (b | ~d)
|
||||
}
|
||||
|
||||
val temp = b + Integer.rotateLeft(a + f + buffer(bufferIndex) + TABLE_T(j), SHIFT_AMTS((div16 << 2) | (j & 3)))
|
||||
a = d
|
||||
d = c
|
||||
c = b
|
||||
b = temp
|
||||
}
|
||||
|
||||
a += originalA
|
||||
b += originalB
|
||||
c += originalC
|
||||
d += originalD
|
||||
}
|
||||
|
||||
val md5 = new Array[Byte](16)
|
||||
var count = 0
|
||||
for (i <- 0 until 4) {
|
||||
var n = i match {
|
||||
case 0 => a
|
||||
case 1 => b
|
||||
case 2 => c
|
||||
case 3 => d
|
||||
}
|
||||
for (j <- 0 until 4) {
|
||||
md5(count) = n.toByte
|
||||
n >>>= 8
|
||||
count += 1
|
||||
}
|
||||
}
|
||||
md5
|
||||
}
|
||||
|
||||
assert("d41d8cd98f00b204e9800998ecf8427e" == hash(""))
|
||||
assert("0000045c5e2b3911eb937d9d8c574f09" == hash("iwrupvqb346386"))
|
||||
assert("0cc175b9c0f1b6a831c399e269772661" == hash("a"))
|
||||
assert("900150983cd24fb0d6963f7d28e17f72" == hash("abc"))
|
||||
assert("f96b697d7cb7938d525a2f31aaf161d0" == hash("message digest"))
|
||||
assert("c3fcd3d76192e4007dfb496cca67e13b" == hash("abcdefghijklmnopqrstuvwxyz"))
|
||||
assert("d174ab98d277d9f5a5611c2c9f419d9f" == hash("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"))
|
||||
assert("57edf4a22be3c955ac49da2e2107b67a" == hash("12345678901234567890123456789012345678901234567890123456789012345678901234567890"))
|
||||
def toHexString(b: Array[Byte]): String = b.map(byte => f"$byte%02X").mkString
|
||||
|
||||
def main(args: Array[String]): Unit = {
|
||||
val testStrings = Array("", "a", "abc", "message digest", "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "12345678901234567890123456789012345678901234567890123456789012345678901234567890")
|
||||
testStrings.foreach { s =>
|
||||
println(s"0x${toHexString(computeMD5(s.getBytes))} <== \"$s\"")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import "/fmt" for Fmt
|
||||
import "./fmt" for Fmt
|
||||
|
||||
var k = [
|
||||
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee ,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue