github.com/hellobchain/newcryptosm@v0.0.0-20221019060107-edb949a317e9/sm4/block-table.go (about)

     1  package sm4
     2  
     3  // Encrypt one block from src into dst, using the expanded key xk.
     4  func encryptBlock(xk []uint32, dst, src []byte) {
     5  	var s0, s1, s2, s3, t0 uint32
     6  
     7  	s0 = uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])
     8  	s1 = uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7])
     9  	s2 = uint32(src[8])<<24 | uint32(src[9])<<16 | uint32(src[10])<<8 | uint32(src[11])
    10  	s3 = uint32(src[12])<<24 | uint32(src[13])<<16 | uint32(src[14])<<8 | uint32(src[15])
    11  
    12  	for r := 0; r < 32; r++ {
    13  		t0 = s1 ^ s2 ^ s3 ^ xk[r]
    14  		t0 = s0 ^ te0[uint8(t0>>24)] ^ te1[uint8(t0>>16)] ^ te2[uint8(t0>>8)] ^ te3[uint8(t0)]
    15  		s0 = s1
    16  		s1 = s2
    17  		s2 = s3
    18  		s3 = t0
    19  	}
    20  
    21  	dst[0], dst[1], dst[2], dst[3] = byte(s3>>24), byte(s3>>16), byte(s3>>8), byte(s3)
    22  	dst[4], dst[5], dst[6], dst[7] = byte(s2>>24), byte(s2>>16), byte(s2>>8), byte(s2)
    23  	dst[8], dst[9], dst[10], dst[11] = byte(s1>>24), byte(s1>>16), byte(s1>>8), byte(s1)
    24  	dst[12], dst[13], dst[14], dst[15] = byte(s0>>24), byte(s0>>16), byte(s0>>8), byte(s0)
    25  }
    26  
    27  // Decrypt one block from src into dst, using the expanded key xk.
    28  func decryptBlock(xk []uint32, dst, src []byte) {
    29  	var s0, s1, s2, s3, t0 uint32
    30  
    31  	s0 = uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])
    32  	s1 = uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7])
    33  	s2 = uint32(src[8])<<24 | uint32(src[9])<<16 | uint32(src[10])<<8 | uint32(src[11])
    34  	s3 = uint32(src[12])<<24 | uint32(src[13])<<16 | uint32(src[14])<<8 | uint32(src[15])
    35  
    36  	for r := 31; r >= 0; r-- {
    37  		t0 = s1 ^ s2 ^ s3 ^ xk[r]
    38  		t0 = s0 ^ te0[uint8(t0>>24)] ^ te1[uint8(t0>>16)] ^ te2[uint8(t0>>8)] ^ te3[uint8(t0)]
    39  		s0 = s1
    40  		s1 = s2
    41  		s2 = s3
    42  		s3 = t0
    43  	}
    44  
    45  	dst[0], dst[1], dst[2], dst[3] = byte(s3>>24), byte(s3>>16), byte(s3>>8), byte(s3)
    46  	dst[4], dst[5], dst[6], dst[7] = byte(s2>>24), byte(s2>>16), byte(s2>>8), byte(s2)
    47  	dst[8], dst[9], dst[10], dst[11] = byte(s1>>24), byte(s1>>16), byte(s1>>8), byte(s1)
    48  	dst[12], dst[13], dst[14], dst[15] = byte(s0>>24), byte(s0>>16), byte(s0>>8), byte(s0)
    49  }
    50  
    51  // Key expansion algorithm.
    52  func (c *sm4Cipher) expandKey(key []byte) {
    53  	var k0, k1, k2, k3, t0, t1, t2, t3 uint32
    54  
    55  	k0 = (uint32(key[0]) << 24) | (uint32(key[1]) << 16) | (uint32(key[2]) << 8) | (uint32(key[3]))
    56  	k1 = (uint32(key[4]) << 24) | (uint32(key[5]) << 16) | (uint32(key[6]) << 8) | (uint32(key[7]))
    57  	k2 = (uint32(key[8]) << 24) | (uint32(key[9]) << 16) | (uint32(key[10]) << 8) | (uint32(key[11]))
    58  	k3 = (uint32(key[12]) << 24) | (uint32(key[13]) << 16) | (uint32(key[14]) << 8) | (uint32(key[15]))
    59  
    60  	k0 = k0 ^ sm4Fk[0]
    61  	k1 = k1 ^ sm4Fk[1]
    62  	k2 = k2 ^ sm4Fk[2]
    63  	k3 = k3 ^ sm4Fk[3]
    64  
    65  	for i := 0; i < 32; i++ {
    66  		t0 = k1 ^ k2 ^ k3 ^ sm4Ck[i]
    67  		t1 = uint32(sbox[uint8(t0>>24)])<<24 ^ uint32(sbox[uint8(t0>>16)])<<16 ^ uint32(sbox[uint8(t0>>8)])<<8 ^ uint32(sbox[uint8(t0)])
    68  		t2 = (t1 << 23) ^ (t1 >> 9)
    69  		t3 = (t1 << 13) ^ (t1 >> 19)
    70  		c.subkeys[i] = k0 ^ t1 ^ t2 ^ t3
    71  		k0 = k1
    72  		k1 = k2
    73  		k2 = k3
    74  		k3 = c.subkeys[i]
    75  	}
    76  }