...
1
2
3
4
5
11
12 package xtea
13
14
15 const numRounds = 64
16
17
18
19 func blockToUint32(src []byte) (uint32, uint32) {
20 r0 := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])
21 r1 := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7])
22 return r0, r1
23 }
24
25
26
27 func uint32ToBlock(v0, v1 uint32, dst []byte) {
28 dst[0] = byte(v0 >> 24)
29 dst[1] = byte(v0 >> 16)
30 dst[2] = byte(v0 >> 8)
31 dst[3] = byte(v0)
32 dst[4] = byte(v1 >> 24)
33 dst[5] = byte(v1 >> 16)
34 dst[6] = byte(v1 >> 8)
35 dst[7] = byte(v1 >> 0)
36 }
37
38
39 func encryptBlock(c *Cipher, dst, src []byte) {
40 v0, v1 := blockToUint32(src)
41
42
43 for i := 0; i < numRounds; {
44 v0 += ((v1<<4 ^ v1>>5) + v1) ^ c.table[i]
45 i++
46 v1 += ((v0<<4 ^ v0>>5) + v0) ^ c.table[i]
47 i++
48 }
49
50 uint32ToBlock(v0, v1, dst)
51 }
52
53
54 func decryptBlock(c *Cipher, dst, src []byte) {
55 v0, v1 := blockToUint32(src)
56
57
58 for i := numRounds; i > 0; {
59 i--
60 v1 -= ((v0<<4 ^ v0>>5) + v0) ^ c.table[i]
61 i--
62 v0 -= ((v1<<4 ^ v1>>5) + v1) ^ c.table[i]
63 }
64
65 uint32ToBlock(v0, v1, dst)
66 }
67
View as plain text