LEFT | RIGHT |
1 // Copyright 2010 The Go Authors. All rights reserved. | 1 // Copyright 2010 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 package blowfish | 5 package blowfish |
6 | 6 |
7 func expandKey(key []byte, c *Cipher) { | 7 func expandKey(key []byte, c *Cipher) { |
8 » copy(c.p[0:], p) | 8 » copy(&c.p, &p) |
9 » copy(c.s0[0:], s0) | 9 » copy(&c.s0, &s0) |
10 » copy(c.s1[0:], s1) | 10 » copy(&c.s1, &s1) |
11 » copy(c.s2[0:], s2) | 11 » copy(&c.s2, &s2) |
12 » copy(c.s3[0:], s3) | 12 » copy(&c.s3, &s3) |
13 | 13 |
14 j := 0 | 14 j := 0 |
15 for i := 0; i < 18; i++ { | 15 for i := 0; i < 18; i++ { |
16 var d uint32 | 16 var d uint32 |
17 for k := 0; k < 4; k++ { | 17 for k := 0; k < 4; k++ { |
18 d = d<<8 | uint32(key[j])&0x000000FF | 18 d = d<<8 | uint32(key[j])&0x000000FF |
19 j++ | 19 j++ |
20 if j >= len(key) { | 20 if j >= len(key) { |
21 j = 0 | 21 j = 0 |
22 } | 22 } |
(...skipping 18 matching lines...) Expand all Loading... |
41 for i := 0; i < 256; i += 2 { | 41 for i := 0; i < 256; i += 2 { |
42 l, r = encryptBlock(l, r, c) | 42 l, r = encryptBlock(l, r, c) |
43 c.s2[i], c.s2[i+1] = l, r | 43 c.s2[i], c.s2[i+1] = l, r |
44 } | 44 } |
45 for i := 0; i < 256; i += 2 { | 45 for i := 0; i < 256; i += 2 { |
46 l, r = encryptBlock(l, r, c) | 46 l, r = encryptBlock(l, r, c) |
47 c.s3[i], c.s3[i+1] = l, r | 47 c.s3[i], c.s3[i+1] = l, r |
48 } | 48 } |
49 } | 49 } |
50 | 50 |
51 //func _F(ctx *Cipher, x uint32) uint32 { | |
52 // d := uint(x & 0xFF) | |
53 // c := uint(x >> 8 & 0xFF) | |
54 // b := uint(x >> 16 & 0xFF) | |
55 // a := uint(x >> 24 & 0xFF) | |
56 // result := ctx.s0[a] + ctx.s1[b] | |
57 // result ^= ctx.s2[c] | |
58 // result += ctx.s3[d] | |
59 // return result | |
60 //} | |
61 | |
62 func encryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { | 51 func encryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { |
63 xl, xr := l, r | 52 xl, xr := l, r |
64 // for i := 0; i < 16; i++ { | |
65 // xl ^= c.p[i] | |
66 // xr ^= _F(c, xl) | |
67 // xl, xr = xr, xl | |
68 // } | |
69 // xl ^= c.p[16] | |
70 // xr ^= c.p[17] | |
71 xl ^= c.p[0] | 53 xl ^= c.p[0] |
72 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[1] | 54 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[1] |
73 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[2] | 55 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[2] |
74 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[3] | 56 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[3] |
75 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[4] | 57 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[4] |
76 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[5] | 58 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[5] |
77 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[6] | 59 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[6] |
78 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[7] | 60 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[7] |
79 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[8] | 61 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[8] |
80 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[9] | 62 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[9] |
81 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[10] | 63 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[10] |
82 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[11] | 64 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[11] |
83 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[12] | 65 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[12] |
84 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[13] | 66 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[13] |
85 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[14] | 67 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[14] |
86 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[15] | 68 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[15] |
87 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[16] | 69 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[16] |
88 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[1] | |
89 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[2] | |
90 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[3] | |
91 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[4] | |
92 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[5] | |
93 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[6] | |
94 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[7] | |
95 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[8] | |
96 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[9] | |
97 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[10] | |
98 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[11] | |
99 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[12] | |
100 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[13] | |
101 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[14] | |
102 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[15] | |
103 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[16] | |
104 xr ^= c.p[17] | 70 xr ^= c.p[17] |
105 return xr, xl | 71 return xr, xl |
106 } | 72 } |
107 | 73 |
108 func decryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { | 74 func decryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { |
109 xl, xr := l, r | 75 xl, xr := l, r |
110 // for i := 17; i > 1; i-- { | |
111 // xl ^= c.p[i] | |
112 // xr ^= _F(c, xl) | |
113 // xl, xr = xr, xl | |
114 // } | |
115 // xl ^= c.p[1] | |
116 // xr ^= c.p[0] | |
117 xl ^= c.p[17] | 76 xl ^= c.p[17] |
118 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[16] | 77 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[16] |
119 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[15] | 78 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[15] |
120 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[14] | 79 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[14] |
121 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[13] | 80 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[13] |
122 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[12] | 81 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[12] |
123 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[11] | 82 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[11] |
124 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[10] | 83 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[10] |
125 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[9] | 84 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[9] |
126 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[8] | 85 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[8] |
127 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[7] | 86 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[7] |
128 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[6] | 87 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[6] |
129 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[5] | 88 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[5] |
130 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[4] | 89 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[4] |
131 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[3] | 90 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[3] |
132 » //» xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16&0xFF)]) ^ c.s2[byt
e(xl>>8&0xFF)]) + c.s3[byte(xl&0xFF)] ^ c.p[2] | 91 » xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) +
c.s3[byte(xl)] ^ c.p[2] |
133 » //» xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16&0xFF)]) ^ c.s2[byt
e(xr>>8&0xFF)]) + c.s3[byte(xr&0xFF)] ^ c.p[1] | 92 » xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) +
c.s3[byte(xr)] ^ c.p[1] |
134 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[16] | |
135 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[15] | |
136 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[14] | |
137 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[13] | |
138 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[12] | |
139 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[11] | |
140 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[10] | |
141 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[9] | |
142 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[8] | |
143 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[7] | |
144 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[6] | |
145 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[5] | |
146 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[4] | |
147 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[3] | |
148 » xr ^= ((c.s0[xl>>24] + c.s1[xl>>16&0xFF]) ^ c.s2[xl>>8&0xFF]) + c.s3[xl&
0xFF] ^ c.p[2] | |
149 » xl ^= ((c.s0[xr>>24] + c.s1[xr>>16&0xFF]) ^ c.s2[xr>>8&0xFF]) + c.s3[xr&
0xFF] ^ c.p[1] | |
150 xr ^= c.p[0] | 93 xr ^= c.p[0] |
151 return xr, xl | 94 return xr, xl |
152 } | 95 } |
153 | 96 |
154 func zero(x []uint32) { | 97 func zero(x []uint32) { |
155 for i := range x { | 98 for i := range x { |
156 x[i] = 0 | 99 x[i] = 0 |
157 } | 100 } |
158 } | 101 } |
LEFT | RIGHT |