| 1 | // Based on: https://github.com/golang/crypto/blob/master/ripemd160/ripemd160block.go |
| 2 | |
| 3 | // RIPEMD-160 block step. |
| 4 | module ripemd160 |
| 5 | |
| 6 | import math.bits |
| 7 | |
| 8 | // vfmt off |
| 9 | const n__ = [ |
| 10 | u8(0), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
| 11 | 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, |
| 12 | 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, |
| 13 | 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, |
| 14 | 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13, |
| 15 | ]! |
| 16 | |
| 17 | const r__ = [ |
| 18 | u8(11), 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, |
| 19 | 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, |
| 20 | 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, |
| 21 | 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, |
| 22 | 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6, |
| 23 | ]! |
| 24 | |
| 25 | const n_ = [ |
| 26 | u8(5), 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, |
| 27 | 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, |
| 28 | 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, |
| 29 | 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, |
| 30 | 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11, |
| 31 | ]! |
| 32 | |
| 33 | const r_ = [ |
| 34 | u8(8), 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, |
| 35 | 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, |
| 36 | 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, |
| 37 | 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, |
| 38 | 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11, |
| 39 | ]! |
| 40 | // vfmt on |
| 41 | @[direct_array_access] |
| 42 | fn block(mut md Digest, p []u8) int { |
| 43 | mut n := 0 |
| 44 | mut x := []u32{len: 16} |
| 45 | mut alpha := u32(0) |
| 46 | mut beta := u32(0) |
| 47 | |
| 48 | for n + block_size <= p.len { |
| 49 | mut a, mut b, mut c, mut d, mut e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4] |
| 50 | mut aa, mut bb, mut cc, mut dd, mut ee := a, b, c, d, e |
| 51 | |
| 52 | for i := 0; i < 16; i++ { |
| 53 | j := n + i * 4 |
| 54 | x[i] = u32(p[j]) | u32(p[j + 1]) << 8 | u32(p[j + 2]) << 16 | u32(p[j + 3]) << 24 |
| 55 | } |
| 56 | |
| 57 | mut i := 0 |
| 58 | for i < 16 { |
| 59 | alpha = a + (b ^ c ^ d) + x[n__[i]] |
| 60 | alpha = bits.rotate_left_32(alpha, r__[i]) + e |
| 61 | beta = bits.rotate_left_32(c, 10) |
| 62 | a, b, c, d, e = e, alpha, b, beta, d |
| 63 | |
| 64 | alpha = aa + (bb ^ (cc | ~dd)) + x[n_[i]] + 0x50a28be6 |
| 65 | alpha = bits.rotate_left_32(alpha, r_[i]) + ee |
| 66 | beta = bits.rotate_left_32(cc, 10) |
| 67 | aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd |
| 68 | |
| 69 | i++ |
| 70 | } |
| 71 | |
| 72 | for i < 32 { |
| 73 | alpha = a + (b & c | ~b & d) + x[n__[i]] + 0x5a827999 |
| 74 | alpha = bits.rotate_left_32(alpha, r__[i]) + e |
| 75 | beta = bits.rotate_left_32(c, 10) |
| 76 | a, b, c, d, e = e, alpha, b, beta, d |
| 77 | |
| 78 | // parallel line |
| 79 | alpha = aa + (bb & dd | cc & ~dd) + x[n_[i]] + 0x5c4dd124 |
| 80 | alpha = bits.rotate_left_32(alpha, r_[i]) + ee |
| 81 | beta = bits.rotate_left_32(cc, 10) |
| 82 | aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd |
| 83 | |
| 84 | i++ |
| 85 | } |
| 86 | |
| 87 | for i < 48 { |
| 88 | alpha = a + (b | ~c ^ d) + x[n__[i]] + 0x6ed9eba1 |
| 89 | alpha = bits.rotate_left_32(alpha, r__[i]) + e |
| 90 | beta = bits.rotate_left_32(c, 10) |
| 91 | a, b, c, d, e = e, alpha, b, beta, d |
| 92 | |
| 93 | // parallel line |
| 94 | alpha = aa + (bb | ~cc ^ dd) + x[n_[i]] + 0x6d703ef3 |
| 95 | alpha = bits.rotate_left_32(alpha, r_[i]) + ee |
| 96 | beta = bits.rotate_left_32(cc, 10) |
| 97 | aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd |
| 98 | |
| 99 | i++ |
| 100 | } |
| 101 | |
| 102 | for i < 64 { |
| 103 | alpha = a + (b & d | c & ~d) + x[n__[i]] + 0x8f1bbcdc |
| 104 | alpha = bits.rotate_left_32(alpha, r__[i]) + e |
| 105 | beta = bits.rotate_left_32(c, 10) |
| 106 | a, b, c, d, e = e, alpha, b, beta, d |
| 107 | |
| 108 | // parallel line |
| 109 | alpha = aa + (bb & cc | ~bb & dd) + x[n_[i]] + 0x7a6d76e9 |
| 110 | alpha = bits.rotate_left_32(alpha, r_[i]) + ee |
| 111 | beta = bits.rotate_left_32(cc, 10) |
| 112 | aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd |
| 113 | |
| 114 | i++ |
| 115 | } |
| 116 | |
| 117 | for i < 80 { |
| 118 | alpha = a + (b ^ (c | ~d)) + x[n__[i]] + 0xa953fd4e |
| 119 | alpha = bits.rotate_left_32(alpha, r__[i]) + e |
| 120 | beta = bits.rotate_left_32(c, 10) |
| 121 | a, b, c, d, e = e, alpha, b, beta, d |
| 122 | |
| 123 | // parallel line |
| 124 | alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] |
| 125 | alpha = bits.rotate_left_32(alpha, r_[i]) + ee |
| 126 | beta = bits.rotate_left_32(cc, 10) |
| 127 | aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd |
| 128 | |
| 129 | i++ |
| 130 | } |
| 131 | |
| 132 | dd += c + md.s[1] |
| 133 | md.s[1] = md.s[2] + d + ee |
| 134 | md.s[2] = md.s[3] + e + aa |
| 135 | md.s[3] = md.s[4] + a + bb |
| 136 | md.s[4] = md.s[0] + b + cc |
| 137 | md.s[0] = dd |
| 138 | |
| 139 | n += block_size |
| 140 | } |
| 141 | return n |
| 142 | } |
| 143 | |