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 }