RIPEMD-160: Difference between revisions

4,438 bytes removed ,  3 years ago
→‎{{header|Wren}}: Now uses Wren-crypto module.
m (→‎{{header|Phix}}: added syntax colouring the hard way)
(→‎{{header|Wren}}: Now uses Wren-crypto module.)
Line 1,736:
 
=={{header|Wren}}==
{{libheader|Wren-crypto}}
{{libheader|Wren-fmt}}
<lang ecmascript>import "/crypto" for Ripemd160
This is based on the pseudo-code linked to in the task description.
<lang ecmascript>import "/fmt" for Fmt
 
var leftRotate = Fn.new { |x, c| (x << c) | (x >> (32 - c)) }
 
var toBytes = Fn.new { |val|
var bytes = List.filled(4, 0)
bytes[0] = val & 255
bytes[1] = (val >> 8) & 255
bytes[2] = (val >> 16) & 255
bytes[3] = (val >> 24) & 255
return bytes
}
 
var toInt = Fn.new { |bytes| bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24 }
 
var f = [
Fn.new { |x, y, z| x ^ y ^ z },
Fn.new { |x, y, z| (x & y) | ((~x) & z) },
Fn.new { |x, y, z| (x | (~y)) ^ z },
Fn.new { |x, y, z| (x & z) | (y & (~z)) },
Fn.new { |x, y, z| x ^ (y | (~z)) }
]
 
var k = [ 0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e ]
var kk = [ 0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000 ]
 
var r = [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
]
 
var rr = [
5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
]
 
var s = [
11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
]
 
var ss = [
8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
]
 
var ripemd160 = Fn.new { |initMsg|
var h0 = 0x67452301
var h1 = 0xefcdab89
var h2 = 0x98badcfe
var h3 = 0x10325476
var h4 = 0xc3d2e1f0
var initBytes = initMsg.bytes
var initLen = initBytes.count
var newLen = initLen + 1
while (newLen % 64 != 56) newLen = newLen + 1
var msg = List.filled(newLen + 8, 0)
for (i in 0...initLen) msg[i] = initBytes[i]
msg[initLen] = 0x80 // remaining bytes already 0
var lenBits = toBytes.call(initLen * 8)
for (i in newLen...newLen+4) msg[i] = lenBits[i-newLen]
var extraBits = toBytes.call(initLen >> 29)
for (i in newLen+4...newLen+8) msg[i] = extraBits[i-newLen-4]
var offset = 0
var x = List.filled(16, 0)
var mask = 0xffffffff
while (offset < newLen) {
for (i in 0...16) x[i] = toInt.call(msg[offset+i*4...offset + i*4 + 4])
var a = h0
var b = h1
var c = h2
var d = h3
var e = h4
var aa = h0
var bb = h1
var cc = h2
var dd = h3
var ee = h4
for (j in 0..79) {
var i = (j/16).floor
var t = a + f[i].call(b, c, d) + x[r[j]] + k[i]
t = (leftRotate.call(t & mask, s[j]) + e) & mask
a = e
e = d
d = leftRotate.call(c, 10)
c = b
b = t
t = aa + f[4-i].call(bb, cc, dd) + x[rr[j]] + kk[i]
t = (leftRotate.call(t & mask, ss[j]) + ee) & mask
aa = ee
ee = dd
dd = leftRotate.call(cc, 10)
cc = bb
bb = t
}
var temp = (h1 + c + dd) & mask
h1 = (h2 + d + ee) & mask
h2 = (h3 + e + aa) & mask
h3 = (h4 + a + bb) & mask
h4 = (h0 + b + cc) & mask
h0 = temp
offset = offset + 64
}
var digest = List.filled(20, 0)
var dBytes = toBytes.call(h0)
for (i in 0...4) digest[i] = dBytes[i]
dBytes = toBytes.call(h1)
for (i in 0...4) digest[i+4] = dBytes[i]
dBytes = toBytes.call(h2)
for (i in 0...4) digest[i+8] = dBytes[i]
dBytes = toBytes.call(h3)
for (i in 0...4) digest[i+12] = dBytes[i]
dBytes = toBytes.call(h4)
for (i in 0...4) digest[i+16] = dBytes[i]
return digest
}
 
var strings = [
"",
Line 1,879 ⟶ 1,753:
"Rosetta Code"
]
 
for (s in strings) {
var digesthash = ripemd160Ripemd160.calldigest(s)
Fmt.print("$s <== '$0s'", Fmt.v("xz", 2, digest, 0, "", "")hash, s)
}</lang>
 
9,482

edits