github.com/zuoyebang/bitalosdb@v1.1.1-0.20240516111551-79a8c4d8ce20/internal/hash/md5block.go (about) 1 // Copyright 2021 The Bitalosdb author(hustxrb@163.com) and other contributors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package hash 16 17 import ( 18 "encoding/binary" 19 "math/bits" 20 ) 21 22 func blockGeneric(dig *digest, p []byte) { 23 // load state 24 a, b, c, d := dig.s[0], dig.s[1], dig.s[2], dig.s[3] 25 26 for i := 0; i <= len(p)-BlockSize; i += BlockSize { 27 // eliminate bounds checks on p 28 q := p[i:] 29 q = q[:BlockSize:BlockSize] 30 31 // save current state 32 aa, bb, cc, dd := a, b, c, d 33 34 // load input block 35 x0 := binary.LittleEndian.Uint32(q[4*0x0:]) 36 x1 := binary.LittleEndian.Uint32(q[4*0x1:]) 37 x2 := binary.LittleEndian.Uint32(q[4*0x2:]) 38 x3 := binary.LittleEndian.Uint32(q[4*0x3:]) 39 x4 := binary.LittleEndian.Uint32(q[4*0x4:]) 40 x5 := binary.LittleEndian.Uint32(q[4*0x5:]) 41 x6 := binary.LittleEndian.Uint32(q[4*0x6:]) 42 x7 := binary.LittleEndian.Uint32(q[4*0x7:]) 43 x8 := binary.LittleEndian.Uint32(q[4*0x8:]) 44 x9 := binary.LittleEndian.Uint32(q[4*0x9:]) 45 xa := binary.LittleEndian.Uint32(q[4*0xa:]) 46 xb := binary.LittleEndian.Uint32(q[4*0xb:]) 47 xc := binary.LittleEndian.Uint32(q[4*0xc:]) 48 xd := binary.LittleEndian.Uint32(q[4*0xd:]) 49 xe := binary.LittleEndian.Uint32(q[4*0xe:]) 50 xf := binary.LittleEndian.Uint32(q[4*0xf:]) 51 52 // round 1 53 a = b + bits.RotateLeft32((((c^d)&b)^d)+a+x0+0xd76aa478, 7) 54 d = a + bits.RotateLeft32((((b^c)&a)^c)+d+x1+0xe8c7b756, 12) 55 c = d + bits.RotateLeft32((((a^b)&d)^b)+c+x2+0x242070db, 17) 56 b = c + bits.RotateLeft32((((d^a)&c)^a)+b+x3+0xc1bdceee, 22) 57 a = b + bits.RotateLeft32((((c^d)&b)^d)+a+x4+0xf57c0faf, 7) 58 d = a + bits.RotateLeft32((((b^c)&a)^c)+d+x5+0x4787c62a, 12) 59 c = d + bits.RotateLeft32((((a^b)&d)^b)+c+x6+0xa8304613, 17) 60 b = c + bits.RotateLeft32((((d^a)&c)^a)+b+x7+0xfd469501, 22) 61 a = b + bits.RotateLeft32((((c^d)&b)^d)+a+x8+0x698098d8, 7) 62 d = a + bits.RotateLeft32((((b^c)&a)^c)+d+x9+0x8b44f7af, 12) 63 c = d + bits.RotateLeft32((((a^b)&d)^b)+c+xa+0xffff5bb1, 17) 64 b = c + bits.RotateLeft32((((d^a)&c)^a)+b+xb+0x895cd7be, 22) 65 a = b + bits.RotateLeft32((((c^d)&b)^d)+a+xc+0x6b901122, 7) 66 d = a + bits.RotateLeft32((((b^c)&a)^c)+d+xd+0xfd987193, 12) 67 c = d + bits.RotateLeft32((((a^b)&d)^b)+c+xe+0xa679438e, 17) 68 b = c + bits.RotateLeft32((((d^a)&c)^a)+b+xf+0x49b40821, 22) 69 70 // round 2 71 a = b + bits.RotateLeft32((((b^c)&d)^c)+a+x1+0xf61e2562, 5) 72 d = a + bits.RotateLeft32((((a^b)&c)^b)+d+x6+0xc040b340, 9) 73 c = d + bits.RotateLeft32((((d^a)&b)^a)+c+xb+0x265e5a51, 14) 74 b = c + bits.RotateLeft32((((c^d)&a)^d)+b+x0+0xe9b6c7aa, 20) 75 a = b + bits.RotateLeft32((((b^c)&d)^c)+a+x5+0xd62f105d, 5) 76 d = a + bits.RotateLeft32((((a^b)&c)^b)+d+xa+0x02441453, 9) 77 c = d + bits.RotateLeft32((((d^a)&b)^a)+c+xf+0xd8a1e681, 14) 78 b = c + bits.RotateLeft32((((c^d)&a)^d)+b+x4+0xe7d3fbc8, 20) 79 a = b + bits.RotateLeft32((((b^c)&d)^c)+a+x9+0x21e1cde6, 5) 80 d = a + bits.RotateLeft32((((a^b)&c)^b)+d+xe+0xc33707d6, 9) 81 c = d + bits.RotateLeft32((((d^a)&b)^a)+c+x3+0xf4d50d87, 14) 82 b = c + bits.RotateLeft32((((c^d)&a)^d)+b+x8+0x455a14ed, 20) 83 a = b + bits.RotateLeft32((((b^c)&d)^c)+a+xd+0xa9e3e905, 5) 84 d = a + bits.RotateLeft32((((a^b)&c)^b)+d+x2+0xfcefa3f8, 9) 85 c = d + bits.RotateLeft32((((d^a)&b)^a)+c+x7+0x676f02d9, 14) 86 b = c + bits.RotateLeft32((((c^d)&a)^d)+b+xc+0x8d2a4c8a, 20) 87 88 // round 3 89 a = b + bits.RotateLeft32((b^c^d)+a+x5+0xfffa3942, 4) 90 d = a + bits.RotateLeft32((a^b^c)+d+x8+0x8771f681, 11) 91 c = d + bits.RotateLeft32((d^a^b)+c+xb+0x6d9d6122, 16) 92 b = c + bits.RotateLeft32((c^d^a)+b+xe+0xfde5380c, 23) 93 a = b + bits.RotateLeft32((b^c^d)+a+x1+0xa4beea44, 4) 94 d = a + bits.RotateLeft32((a^b^c)+d+x4+0x4bdecfa9, 11) 95 c = d + bits.RotateLeft32((d^a^b)+c+x7+0xf6bb4b60, 16) 96 b = c + bits.RotateLeft32((c^d^a)+b+xa+0xbebfbc70, 23) 97 a = b + bits.RotateLeft32((b^c^d)+a+xd+0x289b7ec6, 4) 98 d = a + bits.RotateLeft32((a^b^c)+d+x0+0xeaa127fa, 11) 99 c = d + bits.RotateLeft32((d^a^b)+c+x3+0xd4ef3085, 16) 100 b = c + bits.RotateLeft32((c^d^a)+b+x6+0x04881d05, 23) 101 a = b + bits.RotateLeft32((b^c^d)+a+x9+0xd9d4d039, 4) 102 d = a + bits.RotateLeft32((a^b^c)+d+xc+0xe6db99e5, 11) 103 c = d + bits.RotateLeft32((d^a^b)+c+xf+0x1fa27cf8, 16) 104 b = c + bits.RotateLeft32((c^d^a)+b+x2+0xc4ac5665, 23) 105 106 // round 4 107 a = b + bits.RotateLeft32((c^(b|^d))+a+x0+0xf4292244, 6) 108 d = a + bits.RotateLeft32((b^(a|^c))+d+x7+0x432aff97, 10) 109 c = d + bits.RotateLeft32((a^(d|^b))+c+xe+0xab9423a7, 15) 110 b = c + bits.RotateLeft32((d^(c|^a))+b+x5+0xfc93a039, 21) 111 a = b + bits.RotateLeft32((c^(b|^d))+a+xc+0x655b59c3, 6) 112 d = a + bits.RotateLeft32((b^(a|^c))+d+x3+0x8f0ccc92, 10) 113 c = d + bits.RotateLeft32((a^(d|^b))+c+xa+0xffeff47d, 15) 114 b = c + bits.RotateLeft32((d^(c|^a))+b+x1+0x85845dd1, 21) 115 a = b + bits.RotateLeft32((c^(b|^d))+a+x8+0x6fa87e4f, 6) 116 d = a + bits.RotateLeft32((b^(a|^c))+d+xf+0xfe2ce6e0, 10) 117 c = d + bits.RotateLeft32((a^(d|^b))+c+x6+0xa3014314, 15) 118 b = c + bits.RotateLeft32((d^(c|^a))+b+xd+0x4e0811a1, 21) 119 a = b + bits.RotateLeft32((c^(b|^d))+a+x4+0xf7537e82, 6) 120 d = a + bits.RotateLeft32((b^(a|^c))+d+xb+0xbd3af235, 10) 121 c = d + bits.RotateLeft32((a^(d|^b))+c+x2+0x2ad7d2bb, 15) 122 b = c + bits.RotateLeft32((d^(c|^a))+b+x9+0xeb86d391, 21) 123 124 // add saved state 125 a += aa 126 b += bb 127 c += cc 128 d += dd 129 } 130 131 // save state 132 dig.s[0], dig.s[1], dig.s[2], dig.s[3] = a, b, c, d 133 }