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  }