Kind | Covered | All | % |
expression | 0 | 535 | 0.0 |
branch | 0 | 2 | 0.0 |
1
;;;; threefish.lisp -- implementation of the Threefish block cipher
2
(in-package :crypto)
3
4
;;; Constants
5
(defconstant +threefish-key-schedule-constant+ #x1bd11bdaa9fc1a22)
6
7
;;; Functions common to all the block sizes
8
(defun threefish-set-key (cipher key-data)
9
(let* ((key-words (/ (block-length cipher) 8))
10
(key (make-array (1+ key-words)
11
:element-type '(unsigned-byte 64)
12
:initial-element 0))
13
(parity +threefish-key-schedule-constant+))
14
(dotimes (i key-words)
15
(let ((n (ub64ref/le key-data (* 8 i))))
16
(setf (aref key i) n)
17
(setf parity (logxor parity n))))
18
(setf (aref key key-words) parity)
19
(setf (threefish-key cipher) key)
20
(values)))
21
22
(defun threefish-set-tweak (cipher tweak-data)
23
(unless (= (length tweak-data) 16)
24
(error 'ironclad-error :format-control "The tweak size must be 16 bytes."))
25
(let ((tweak (threefish-tweak cipher)))
26
(setf (aref tweak 0) (ub64ref/le tweak-data 0)
27
(aref tweak 1) (ub64ref/le tweak-data 8)
28
(aref tweak 2) (logxor (aref tweak 0) (aref tweak 1)))))
29
30
;;; Implementation for blocks of 256 bits
31
(defclass threefish256 (cipher 32-byte-block-mixin)
32
((key :accessor threefish-key
33
:type (simple-array (unsigned-byte 64) (5)))
34
(tweak :accessor threefish-tweak
35
:initform (make-array 3
36
:element-type '(unsigned-byte 64)
37
:initial-contents '(0 0 0))
38
:type (simple-array (unsigned-byte 64) (3)))))
39
40
(defmethod shared-initialize :after ((cipher threefish256) slot-names
41
&rest initargs
42
&key (tweak nil tweak-p)
43
&allow-other-keys)
44
(declare (ignore initargs tweak-p))
45
(when tweak
46
(threefish-set-tweak cipher tweak))
47
cipher)
48
49
(defmethod schedule-key ((cipher threefish256) key)
50
(threefish-set-key cipher key)
51
cipher)
52
53
(define-block-encryptor threefish256 32
54
(let* ((key (threefish-key context))
55
(tweak (threefish-tweak context))
56
(k0 (aref key 0))
57
(k1 (aref key 1))
58
(k2 (aref key 2))
59
(k3 (aref key 3))
60
(k4 (aref key 4))
61
(t0 (aref tweak 0))
62
(t1 (aref tweak 1))
63
(t2 (aref tweak 2)))
64
(declare (type (simple-array (unsigned-byte 64) (5)) key)
65
(type (simple-array (unsigned-byte 64) (3)) tweak)
66
(type (unsigned-byte 64) k0 k1 k2 k3 k4 t0 t1 t2))
67
(with-words ((b0 b1 b2 b3) plaintext plaintext-start :big-endian nil :size 8)
68
(macrolet ((arx (x0 x1 x2 x3 x4 x5 x6 x7
69
x8 x9 x10 x11 x12 x13 x14 x15)
70
`(setf b1 (mod64+ b1 (mod64+ ,x0 ,x1))
71
b0 (mod64+ b0 (mod64+ ,x2 ,x3))
72
b1 (logxor (rol64 b1 14) b0)
73
b3 (mod64+ b3 (mod64+ ,x4 ,x5))
74
b2 (mod64+ b2 (mod64+ b3 (mod64+ ,x6 ,x7)))
75
b3 (logxor (rol64 b3 16) b2)
76
b0 (mod64+ b0 b3)
77
b3 (logxor (rol64 b3 52) b0)
78
b2 (mod64+ b2 b1)
79
b1 (logxor (rol64 b1 57) b2)
80
b0 (mod64+ b0 b1)
81
b1 (logxor (rol64 b1 23) b0)
82
b2 (mod64+ b2 b3)
83
b3 (logxor (rol64 b3 40) b2)
84
b0 (mod64+ b0 b3)
85
b3 (logxor (rol64 b3 5) b0)
86
b2 (mod64+ b2 b1)
87
b1 (logxor (rol64 b1 37) b2)
88
b1 (mod64+ b1 (mod64+ ,x8 ,x9))
89
b0 (mod64+ b0 (mod64+ ,x10 ,x11))
90
b1 (logxor (rol64 b1 25) b0)
91
b3 (mod64+ b3 (mod64+ ,x12 ,x13))
92
b2 (mod64+ b2 (mod64+ b3 (mod64+ ,x14 ,x15)))
93
b3 (logxor (rol64 b3 33) b2)
94
b0 (mod64+ b0 b3)
95
b3 (logxor (rol64 b3 46) b0)
96
b2 (mod64+ b2 b1)
97
b1 (logxor (rol64 b1 12) b2)
98
b0 (mod64+ b0 b1)
99
b1 (logxor (rol64 b1 58) b0)
100
b2 (mod64+ b2 b3)
101
b3 (logxor (rol64 b3 22) b2)
102
b0 (mod64+ b0 b3)
103
b3 (logxor (rol64 b3 32) b0)
104
b2 (mod64+ b2 b1)
105
b1 (logxor (rol64 b1 32) b2))))
106
(arx k1 t0 b1 k0 k3 0 k2 t1
107
k2 t1 b1 k1 k4 1 k3 t2)
108
(arx k3 t2 b1 k2 k0 2 k4 t0
109
k4 t0 b1 k3 k1 3 k0 t1)
110
(arx k0 t1 b1 k4 k2 4 k1 t2
111
k1 t2 b1 k0 k3 5 k2 t0)
112
(arx k2 t0 b1 k1 k4 6 k3 t1
113
k3 t1 b1 k2 k0 7 k4 t2)
114
(arx k4 t2 b1 k3 k1 8 k0 t0
115
k0 t0 b1 k4 k2 9 k1 t1)
116
(arx k1 t1 b1 k0 k3 10 k2 t2
117
k2 t2 b1 k1 k4 11 k3 t0)
118
(arx k3 t0 b1 k2 k0 12 k4 t1
119
k4 t1 b1 k3 k1 13 k0 t2)
120
(arx k0 t2 b1 k4 k2 14 k1 t0
121
k1 t0 b1 k0 k3 15 k2 t1)
122
(arx k2 t1 b1 k1 k4 16 k3 t2
123
k3 t2 b1 k2 k0 17 k4 t0))
124
(setf b0 (mod64+ b0 k3)
125
b1 (mod64+ b1 (mod64+ k4 t0))
126
b2 (mod64+ b2 (mod64+ k0 t1))
127
b3 (mod64+ b3 (mod64+ k1 18)))
128
(store-words ciphertext ciphertext-start b0 b1 b2 b3)
129
(values))))
130
131
(define-block-decryptor threefish256 32
132
(let* ((key (threefish-key context))
133
(tweak (threefish-tweak context))
134
(k0 (aref key 0))
135
(k1 (aref key 1))
136
(k2 (aref key 2))
137
(k3 (aref key 3))
138
(k4 (aref key 4))
139
(t0 (aref tweak 0))
140
(t1 (aref tweak 1))
141
(t2 (aref tweak 2)))
142
(declare (type (simple-array (unsigned-byte 64) (5)) key)
143
(type (simple-array (unsigned-byte 64) (3)) tweak)
144
(type (unsigned-byte 64) k0 k1 k2 k3 k4 t0 t1 t2))
145
(with-words ((b0 b1 b2 b3) ciphertext ciphertext-start :big-endian nil :size 8)
146
(setf b0 (mod64- b0 k3)
147
b1 (mod64- b1 (mod64+ k4 t0))
148
b2 (mod64- b2 (mod64+ k0 t1))
149
b3 (mod64- b3 (mod64+ k1 18)))
150
(macrolet ((arx (x0 x1 x2 x3 x4 x5 x6
151
x7 x8 x9 x10 x11 x12 x13)
152
`(setf b3 (ror64 (logxor b3 b0) 32)
153
b0 (mod64- b0 b3)
154
b1 (ror64 (logxor b1 b2) 32)
155
b2 (mod64- b2 b1)
156
b1 (ror64 (logxor b1 b0) 58)
157
b0 (mod64- b0 b1)
158
b3 (ror64 (logxor b3 b2) 22)
159
b2 (mod64- b2 b3)
160
b3 (ror64 (logxor b3 b0) 46)
161
b0 (mod64- b0 b3)
162
b1 (ror64 (logxor b1 b2) 12)
163
b2 (mod64- b2 b1)
164
b1 (ror64 (logxor b1 b0) 25)
165
b0 (mod64- b0 (mod64+ b1 ,x0))
166
b1 (mod64- b1 (mod64+ ,x1 ,x2))
167
b3 (ror64 (logxor b3 b2) 33)
168
b2 (mod64- b2 (mod64+ b3 (mod64+ ,x3 ,x4)))
169
b3 (mod64- b3 (mod64+ ,x5 ,x6))
170
b3 (ror64 (logxor b3 b0) 5)
171
b0 (mod64- b0 b3)
172
b1 (ror64 (logxor b1 b2) 37)
173
b2 (mod64- b2 b1)
174
b1 (ror64 (logxor b1 b0) 23)
175
b0 (mod64- b0 b1)
176
b3 (ror64 (logxor b3 b2) 40)
177
b2 (mod64- b2 b3)
178
b3 (ror64 (logxor b3 b0) 52)
179
b0 (mod64- b0 b3)
180
b1 (ror64 (logxor b1 b2) 57)
181
b2 (mod64- b2 b1)
182
b1 (ror64 (logxor b1 b0) 14)
183
b0 (mod64- b0 (mod64+ b1 ,x7))
184
b1 (mod64- b1 (mod64+ ,x8 ,x9))
185
b3 (ror64 (logxor b3 b2) 16)
186
b2 (mod64- b2 (mod64+ b3 (mod64+ ,x10 ,x11)))
187
b3 (mod64- b3 (mod64+ ,x12 ,x13)))))
188
(arx k2 k3 t2 k4 t0 k0 17
189
k1 k2 t1 k3 t2 k4 16)
190
(arx k0 k1 t0 k2 t1 k3 15
191
k4 k0 t2 k1 t0 k2 14)
192
(arx k3 k4 t1 k0 t2 k1 13
193
k2 k3 t0 k4 t1 k0 12)
194
(arx k1 k2 t2 k3 t0 k4 11
195
k0 k1 t1 k2 t2 k3 10)
196
(arx k4 k0 t0 k1 t1 k2 9
197
k3 k4 t2 k0 t0 k1 8)
198
(arx k2 k3 t1 k4 t2 k0 7
199
k1 k2 t0 k3 t1 k4 6)
200
(arx k0 k1 t2 k2 t0 k3 5
201
k4 k0 t1 k1 t2 k2 4)
202
(arx k3 k4 t0 k0 t1 k1 3
203
k2 k3 t2 k4 t0 k0 2)
204
(arx k1 k2 t1 k3 t2 k4 1
205
k0 k1 t0 k2 t1 k3 0))
206
(store-words plaintext plaintext-start b0 b1 b2 b3)
207
(values))))
208
209
(defcipher threefish256
210
(:encrypt-function threefish256-encrypt-block)
211
(:decrypt-function threefish256-decrypt-block)
212
(:block-length 32)
213
(:key-length (:fixed 32)))
214
215
;;; Implementation for blocks of 512 bits
216
(defclass threefish512 (cipher 64-byte-block-mixin)
217
((key :accessor threefish-key
218
:type (simple-array (unsigned-byte 64) (9)))
219
(tweak :accessor threefish-tweak
220
:initform (make-array 3
221
:element-type '(unsigned-byte 64)
222
:initial-contents '(0 0 0))
223
:type (simple-array (unsigned-byte 64) (3)))))
224
225
(defmethod shared-initialize :after ((cipher threefish512) slot-names
226
&rest initargs
227
&key (tweak nil tweak-p)
228
&allow-other-keys)
229
(declare (ignore initargs tweak-p))
230
(when tweak
231
(threefish-set-tweak cipher tweak))
232
cipher)
233
234
(defmethod schedule-key ((cipher threefish512) key)
235
(threefish-set-key cipher key)
236
cipher)
237
238
(define-block-encryptor threefish512 64
239
(let* ((key (threefish-key context))
240
(tweak (threefish-tweak context))
241
(k0 (aref key 0))
242
(k1 (aref key 1))
243
(k2 (aref key 2))
244
(k3 (aref key 3))
245
(k4 (aref key 4))
246
(k5 (aref key 5))
247
(k6 (aref key 6))
248
(k7 (aref key 7))
249
(k8 (aref key 8))
250
(t0 (aref tweak 0))
251
(t1 (aref tweak 1))
252
(t2 (aref tweak 2)))
253
(declare (type (simple-array (unsigned-byte 64) (9)) key)
254
(type (simple-array (unsigned-byte 64) (3)) tweak)
255
(type (unsigned-byte 64) k0 k1 k2 k3 k4 k5 k6 k7 k8 t0 t1 t2))
256
(with-words ((b0 b1 b2 b3 b4 b5 b6 b7) plaintext plaintext-start :big-endian nil :size 8)
257
(macrolet ((arx (x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
258
x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21)
259
`(setf b1 (mod64+ b1 ,x0)
260
b0 (mod64+ b0 (mod64+ b1 ,x1))
261
b1 (logxor (rol64 b1 46) b0)
262
b3 (mod64+ b3 ,x2)
263
b2 (mod64+ b2 (mod64+ b3 ,x3))
264
b3 (logxor (rol64 b3 36) b2)
265
b5 (mod64+ b5 (mod64+ ,x4 ,x5))
266
b4 (mod64+ b4 (mod64+ b5 ,x6))
267
b5 (logxor (rol64 b5 19) b4)
268
b7 (mod64+ b7 (mod64+ ,x7 ,x8))
269
b6 (mod64+ b6 (mod64+ b7 (mod64+ ,x9 ,x10)))
270
b7 (logxor (rol64 b7 37) b6)
271
b2 (mod64+ b2 b1)
272
b1 (logxor (rol64 b1 33) b2)
273
b4 (mod64+ b4 b7)
274
b7 (logxor (rol64 b7 27) b4)
275
b6 (mod64+ b6 b5)
276
b5 (logxor (rol64 b5 14) b6)
277
b0 (mod64+ b0 b3)
278
b3 (logxor (rol64 b3 42) b0)
279
b4 (mod64+ b4 b1)
280
b1 (logxor (rol64 b1 17) b4)
281
b6 (mod64+ b6 b3)
282
b3 (logxor (rol64 b3 49) b6)
283
b0 (mod64+ b0 b5)
284
b5 (logxor (rol64 b5 36) b0)
285
b2 (mod64+ b2 b7)
286
b7 (logxor (rol64 b7 39) b2)
287
b6 (mod64+ b6 b1)
288
b1 (logxor (rol64 b1 44) b6)
289
b0 (mod64+ b0 b7)
290
b7 (logxor (rol64 b7 9) b0)
291
b2 (mod64+ b2 b5)
292
b5 (logxor (rol64 b5 54) b2)
293
b4 (mod64+ b4 b3)
294
b3 (logxor (rol64 b3 56) b4)
295
b1 (mod64+ b1 ,x11)
296
b0 (mod64+ b0 (mod64+ b1 ,x12))
297
b1 (logxor (rol64 b1 39) b0)
298
b3 (mod64+ b3 ,x13)
299
b2 (mod64+ b2 (mod64+ b3 ,x14))
300
b3 (logxor (rol64 b3 30) b2)
301
b5 (mod64+ b5 (mod64+ ,x15 ,x16))
302
b4 (mod64+ b4 (mod64+ b5 ,x17))
303
b5 (logxor (rol64 b5 34) b4)
304
b7 (mod64+ b7 (mod64+ ,x18 ,x19))
305
b6 (mod64+ b6 (mod64+ b7 (mod64+ ,x20 ,x21)))
306
b7 (logxor (rol64 b7 24) b6)
307
b2 (mod64+ b2 b1)
308
b1 (logxor (rol64 b1 13) b2)
309
b4 (mod64+ b4 b7)
310
b7 (logxor (rol64 b7 50) b4)
311
b6 (mod64+ b6 b5)
312
b5 (logxor (rol64 b5 10) b6)
313
b0 (mod64+ b0 b3)
314
b3 (logxor (rol64 b3 17) b0)
315
b4 (mod64+ b4 b1)
316
b1 (logxor (rol64 b1 25) b4)
317
b6 (mod64+ b6 b3)
318
b3 (logxor (rol64 b3 29) b6)
319
b0 (mod64+ b0 b5)
320
b5 (logxor (rol64 b5 39) b0)
321
b2 (mod64+ b2 b7)
322
b7 (logxor (rol64 b7 43) b2)
323
b6 (mod64+ b6 b1)
324
b1 (logxor (rol64 b1 8) b6)
325
b0 (mod64+ b0 b7)
326
b7 (logxor (rol64 b7 35) b0)
327
b2 (mod64+ b2 b5)
328
b5 (logxor (rol64 b5 56) b2)
329
b4 (mod64+ b4 b3)
330
b3 (logxor (rol64 b3 22) b4))))
331
(arx k1 k0 k3 k2 k5 t0 k4 k7 0 k6 t1
332
k2 k1 k4 k3 k6 t1 k5 k8 1 k7 t2)
333
(arx k3 k2 k5 k4 k7 t2 k6 k0 2 k8 t0
334
k4 k3 k6 k5 k8 t0 k7 k1 3 k0 t1)
335
(arx k5 k4 k7 k6 k0 t1 k8 k2 4 k1 t2
336
k6 k5 k8 k7 k1 t2 k0 k3 5 k2 t0)
337
(arx k7 k6 k0 k8 k2 t0 k1 k4 6 k3 t1
338
k8 k7 k1 k0 k3 t1 k2 k5 7 k4 t2)
339
(arx k0 k8 k2 k1 k4 t2 k3 k6 8 k5 t0
340
k1 k0 k3 k2 k5 t0 k4 k7 9 k6 t1)
341
(arx k2 k1 k4 k3 k6 t1 k5 k8 10 k7 t2
342
k3 k2 k5 k4 k7 t2 k6 k0 11 k8 t0)
343
(arx k4 k3 k6 k5 k8 t0 k7 k1 12 k0 t1
344
k5 k4 k7 k6 k0 t1 k8 k2 13 k1 t2)
345
(arx k6 k5 k8 k7 k1 t2 k0 k3 14 k2 t0
346
k7 k6 k0 k8 k2 t0 k1 k4 15 k3 t1)
347
(arx k8 k7 k1 k0 k3 t1 k2 k5 16 k4 t2
348
k0 k8 k2 k1 k4 t2 k3 k6 17 k5 t0))
349
(setf b0 (mod64+ b0 k0)
350
b1 (mod64+ b1 k1)
351
b2 (mod64+ b2 k2)
352
b3 (mod64+ b3 k3)
353
b4 (mod64+ b4 k4)
354
b5 (mod64+ b5 (mod64+ k5 t0))
355
b6 (mod64+ b6 (mod64+ k6 t1))
356
b7 (mod64+ b7 (mod64+ k7 18)))
357
(store-words ciphertext ciphertext-start b0 b1 b2 b3 b4 b5 b6 b7)
358
(values))))
359
360
(define-block-decryptor threefish512 64
361
(let* ((key (threefish-key context))
362
(tweak (threefish-tweak context))
363
(k0 (aref key 0))
364
(k1 (aref key 1))
365
(k2 (aref key 2))
366
(k3 (aref key 3))
367
(k4 (aref key 4))
368
(k5 (aref key 5))
369
(k6 (aref key 6))
370
(k7 (aref key 7))
371
(k8 (aref key 8))
372
(t0 (aref tweak 0))
373
(t1 (aref tweak 1))
374
(t2 (aref tweak 2)))
375
(declare (type (simple-array (unsigned-byte 64) (9)) key)
376
(type (simple-array (unsigned-byte 64) (3)) tweak)
377
(type (unsigned-byte 64) k0 k1 k2 k3 k4 k5 k6 k7 k8 t0 t1 t2))
378
(with-words ((b0 b1 b2 b3 b4 b5 b6 b7) ciphertext ciphertext-start :big-endian nil :size 8)
379
(setf b0 (mod64- b0 k0)
380
b1 (mod64- b1 k1)
381
b2 (mod64- b2 k2)
382
b3 (mod64- b3 k3)
383
b4 (mod64- b4 k4)
384
b5 (mod64- b5 (mod64+ k5 t0))
385
b6 (mod64- b6 (mod64+ k6 t1))
386
b7 (mod64- b7 (mod64+ k7 18)))
387
(macrolet ((arx (x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
388
x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21)
389
`(setf b3 (ror64 (logxor b3 b4) 22)
390
b4 (mod64- b4 b3)
391
b5 (ror64 (logxor b5 b2) 56)
392
b2 (mod64- b2 b5)
393
b7 (ror64 (logxor b7 b0) 35)
394
b0 (mod64- b0 b7)
395
b1 (ror64 (logxor b1 b6) 8)
396
b6 (mod64- b6 b1)
397
b7 (ror64 (logxor b7 b2) 43)
398
b2 (mod64- b2 b7)
399
b5 (ror64 (logxor b5 b0) 39)
400
b0 (mod64- b0 b5)
401
b3 (ror64 (logxor b3 b6) 29)
402
b6 (mod64- b6 b3)
403
b1 (ror64 (logxor b1 b4) 25)
404
b4 (mod64- b4 b1)
405
b3 (ror64 (logxor b3 b0) 17)
406
b0 (mod64- b0 b3)
407
b5 (ror64 (logxor b5 b6) 10)
408
b6 (mod64- b6 b5)
409
b7 (ror64 (logxor b7 b4) 50)
410
b4 (mod64- b4 b7)
411
b1 (ror64 (logxor b1 b2) 13)
412
b2 (mod64- b2 b1)
413
b7 (ror64 (logxor b7 b6) 24)
414
b6 (mod64- b6 (mod64+ b7 (mod64+ ,x0 ,x1)))
415
b7 (mod64- b7 (mod64+ ,x2 ,x3))
416
b5 (ror64 (logxor b5 b4) 34)
417
b4 (mod64- b4 (mod64+ b5 ,x4))
418
b5 (mod64- b5 (mod64+ ,x5 ,x6))
419
b3 (ror64 (logxor b3 b2) 30)
420
b2 (mod64- b2 (mod64+ b3 ,x7))
421
b3 (mod64- b3 ,x8)
422
b1 (ror64 (logxor b1 b0) 39)
423
b0 (mod64- b0 (mod64+ b1 ,x9))
424
b1 (mod64- b1 ,x10)
425
b3 (ror64 (logxor b3 b4) 56)
426
b4 (mod64- b4 b3)
427
b5 (ror64 (logxor b5 b2) 54)
428
b2 (mod64- b2 b5)
429
b7 (ror64 (logxor b7 b0) 9)
430
b0 (mod64- b0 b7)
431
b1 (ror64 (logxor b1 b6) 44)
432
b6 (mod64- b6 b1)
433
b7 (ror64 (logxor b7 b2) 39)
434
b2 (mod64- b2 b7)
435
b5 (ror64 (logxor b5 b0) 36)
436
b0 (mod64- b0 b5)
437
b3 (ror64 (logxor b3 b6) 49)
438
b6 (mod64- b6 b3)
439
b1 (ror64 (logxor b1 b4) 17)
440
b4 (mod64- b4 b1)
441
b3 (ror64 (logxor b3 b0) 42)
442
b0 (mod64- b0 b3)
443
b5 (ror64 (logxor b5 b6) 14)
444
b6 (mod64- b6 b5)
445
b7 (ror64 (logxor b7 b4) 27)
446
b4 (mod64- b4 b7)
447
b1 (ror64 (logxor b1 b2) 33)
448
b2 (mod64- b2 b1)
449
b7 (ror64 (logxor b7 b6) 37)
450
b6 (mod64- b6 (mod64+ b7 (mod64+ ,x11 ,x12)))
451
b7 (mod64- b7 (mod64+ ,x13 ,x14))
452
b5 (ror64 (logxor b5 b4) 19)
453
b4 (mod64- b4 (mod64+ b5 ,x15))
454
b5 (mod64- b5 (mod64+ ,x16 ,x17))
455
b3 (ror64 (logxor b3 b2) 36)
456
b2 (mod64- b2 (mod64+ b3 ,x18))
457
b3 (mod64- b3 ,x19)
458
b1 (ror64 (logxor b1 b0) 46)
459
b0 (mod64- b0 (mod64+ b1 ,x20))
460
b1 (mod64- b1 ,x21))))
461
(arx k5 t0 k6 17 k3 k4 t2 k1 k2 k8 k0
462
k4 t2 k5 16 k2 k3 t1 k0 k1 k7 k8)
463
(arx k3 t1 k4 15 k1 k2 t0 k8 k0 k6 k7
464
k2 t0 k3 14 k0 k1 t2 k7 k8 k5 k6)
465
(arx k1 t2 k2 13 k8 k0 t1 k6 k7 k4 k5
466
k0 t1 k1 12 k7 k8 t0 k5 k6 k3 k4)
467
(arx k8 t0 k0 11 k6 k7 t2 k4 k5 k2 k3
468
k7 t2 k8 10 k5 k6 t1 k3 k4 k1 k2)
469
(arx k6 t1 k7 9 k4 k5 t0 k2 k3 k0 k1
470
k5 t0 k6 8 k3 k4 t2 k1 k2 k8 k0)
471
(arx k4 t2 k5 7 k2 k3 t1 k0 k1 k7 k8
472
k3 t1 k4 6 k1 k2 t0 k8 k0 k6 k7)
473
(arx k2 t0 k3 5 k0 k1 t2 k7 k8 k5 k6
474
k1 t2 k2 4 k8 k0 t1 k6 k7 k4 k5)
475
(arx k0 t1 k1 3 k7 k8 t0 k5 k6 k3 k4
476
k8 t0 k0 2 k6 k7 t2 k4 k5 k2 k3)
477
(arx k7 t2 k8 1 k5 k6 t1 k3 k4 k1 k2
478
k6 t1 k7 0 k4 k5 t0 k2 k3 k0 k1))
479
(store-words plaintext plaintext-start b0 b1 b2 b3 b4 b5 b6 b7)
480
(values))))
481
482
(defcipher threefish512
483
(:encrypt-function threefish512-encrypt-block)
484
(:decrypt-function threefish512-decrypt-block)
485
(:block-length 64)
486
(:key-length (:fixed 64)))
487
488
;;; Implementation for blocks of 1024 bits
489
(defclass threefish1024 (cipher 128-byte-block-mixin)
490
((key :accessor threefish-key
491
:type (simple-array (unsigned-byte 64) (17)))
492
(tweak :accessor threefish-tweak
493
:initform (make-array 3
494
:element-type '(unsigned-byte 64)
495
:initial-contents '(0 0 0))
496
:type (simple-array (unsigned-byte 64) (3)))))
497
498
(defmethod shared-initialize :after ((cipher threefish1024) slot-names
499
&rest initargs
500
&key (tweak nil tweak-p)
501
&allow-other-keys)
502
(declare (ignore initargs tweak-p))
503
(when tweak
504
(threefish-set-tweak cipher tweak))
505
cipher)
506
507
(defmethod schedule-key ((cipher threefish1024) key)
508
(threefish-set-key cipher key)
509
cipher)
510
511
(define-block-encryptor threefish1024 128
512
(let* ((key (threefish-key context))
513
(tweak (threefish-tweak context))
514
(k0 (aref key 0))
515
(k1 (aref key 1))
516
(k2 (aref key 2))
517
(k3 (aref key 3))
518
(k4 (aref key 4))
519
(k5 (aref key 5))
520
(k6 (aref key 6))
521
(k7 (aref key 7))
522
(k8 (aref key 8))
523
(k9 (aref key 9))
524
(k10 (aref key 10))
525
(k11 (aref key 11))
526
(k12 (aref key 12))
527
(k13 (aref key 13))
528
(k14 (aref key 14))
529
(k15 (aref key 15))
530
(k16 (aref key 16))
531
(t0 (aref tweak 0))
532
(t1 (aref tweak 1))
533
(t2 (aref tweak 2)))
534
(declare (type (simple-array (unsigned-byte 64) (17)) key)
535
(type (simple-array (unsigned-byte 64) (3)) tweak)
536
(type (unsigned-byte 64) k0 k1 k2 k3 k4 k5 k6 k7 k8 k9 k10 k11 k12 k13 k14 k15 k16 t0 t1 t2))
537
(with-words ((b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15) plaintext plaintext-start :big-endian nil :size 8)
538
(macrolet ((arx (x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18
539
x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 x32 x33 x34 x35 x36 x37)
540
`(setf b1 (mod64+ b1 ,x0)
541
b0 (mod64+ b0 (mod64+ b1 ,x1))
542
b1 (logxor (rol64 b1 24) b0)
543
b3 (mod64+ b3 ,x2)
544
b2 (mod64+ b2 (mod64+ b3 ,x3))
545
b3 (logxor (rol64 b3 13) b2)
546
b5 (mod64+ b5 ,x4)
547
b4 (mod64+ b4 (mod64+ b5 ,x5))
548
b5 (logxor (rol64 b5 8) b4)
549
b7 (mod64+ b7 ,x6)
550
b6 (mod64+ b6 (mod64+ b7 ,x7))
551
b7 (logxor (rol64 b7 47) b6)
552
b9 (mod64+ b9 ,x8)
553
b8 (mod64+ b8 (mod64+ b9 ,x9))
554
b9 (logxor (rol64 b9 8) b8)
555
b11 (mod64+ b11 ,x10)
556
b10 (mod64+ b10 (mod64+ b11 ,x11))
557
b11 (logxor (rol64 b11 17) b10)
558
b13 (mod64+ b13 (mod64+ ,x12 ,x13))
559
b12 (mod64+ b12 (mod64+ b13 ,x14))
560
b13 (logxor (rol64 b13 22) b12)
561
b15 (mod64+ b15 (mod64+ ,x15 ,x16))
562
b14 (mod64+ b14 (mod64+ b15 (mod64+ ,x17 ,x18)))
563
b15 (logxor (rol64 b15 37) b14)
564
b0 (mod64+ b0 b9)
565
b9 (logxor (rol64 b9 38) b0)
566
b2 (mod64+ b2 b13)
567
b13 (logxor (rol64 b13 19) b2)
568
b6 (mod64+ b6 b11)
569
b11 (logxor (rol64 b11 10) b6)
570
b4 (mod64+ b4 b15)
571
b15 (logxor (rol64 b15 55) b4)
572
b10 (mod64+ b10 b7)
573
b7 (logxor (rol64 b7 49) b10)
574
b12 (mod64+ b12 b3)
575
b3 (logxor (rol64 b3 18) b12)
576
b14 (mod64+ b14 b5)
577
b5 (logxor (rol64 b5 23) b14)
578
b8 (mod64+ b8 b1)
579
b1 (logxor (rol64 b1 52) b8)
580
b0 (mod64+ b0 b7)
581
b7 (logxor (rol64 b7 33) b0)
582
b2 (mod64+ b2 b5)
583
b5 (logxor (rol64 b5 4) b2)
584
b4 (mod64+ b4 b3)
585
b3 (logxor (rol64 b3 51) b4)
586
b6 (mod64+ b6 b1)
587
b1 (logxor (rol64 b1 13) b6)
588
b12 (mod64+ b12 b15)
589
b15 (logxor (rol64 b15 34) b12)
590
b14 (mod64+ b14 b13)
591
b13 (logxor (rol64 b13 41) b14)
592
b8 (mod64+ b8 b11)
593
b11 (logxor (rol64 b11 59) b8)
594
b10 (mod64+ b10 b9)
595
b9 (logxor (rol64 b9 17) b10)
596
b0 (mod64+ b0 b15)
597
b15 (logxor (rol64 b15 5) b0)
598
b2 (mod64+ b2 b11)
599
b11 (logxor (rol64 b11 20) b2)
600
b6 (mod64+ b6 b13)
601
b13 (logxor (rol64 b13 48) b6)
602
b4 (mod64+ b4 b9)
603
b9 (logxor (rol64 b9 41) b4)
604
b14 (mod64+ b14 b1)
605
b1 (logxor (rol64 b1 47) b14)
606
b8 (mod64+ b8 b5)
607
b5 (logxor (rol64 b5 28) b8)
608
b10 (mod64+ b10 b3)
609
b3 (logxor (rol64 b3 16) b10)
610
b12 (mod64+ b12 b7)
611
b7 (logxor (rol64 b7 25) b12)
612
b1 (mod64+ b1 ,x19)
613
b0 (mod64+ b0 (mod64+ b1 ,x20))
614
b1 (logxor (rol64 b1 41) b0)
615
b3 (mod64+ b3 ,x21)
616
b2 (mod64+ b2 (mod64+ b3 ,x22))
617
b3 (logxor (rol64 b3 9) b2)
618
b5 (mod64+ b5 ,x23)
619
b4 (mod64+ b4 (mod64+ b5 ,x24))
620
b5 (logxor (rol64 b5 37) b4)
621
b7 (mod64+ b7 ,x25)
622
b6 (mod64+ b6 (mod64+ b7 ,x26))
623
b7 (logxor (rol64 b7 31) b6)
624
b9 (mod64+ b9 ,x27)
625
b8 (mod64+ b8 (mod64+ b9 ,x28))
626
b9 (logxor (rol64 b9 12) b8)
627
b11 (mod64+ b11 ,x29)
628
b10 (mod64+ b10 (mod64+ b11 ,x30))
629
b11 (logxor (rol64 b11 47) b10)
630
b13 (mod64+ b13 (mod64+ ,x31 ,x32))
631
b12 (mod64+ b12 (mod64+ b13 ,x33))
632
b13 (logxor (rol64 b13 44) b12)
633
b15 (mod64+ b15 (mod64+ ,x34 ,x35))
634
b14 (mod64+ b14 (mod64+ b15 (mod64+ ,x36 ,x37)))
635
b15 (logxor (rol64 b15 30) b14)
636
b0 (mod64+ b0 b9)
637
b9 (logxor (rol64 b9 16) b0)
638
b2 (mod64+ b2 b13)
639
b13 (logxor (rol64 b13 34) b2)
640
b6 (mod64+ b6 b11)
641
b11 (logxor (rol64 b11 56) b6)
642
b4 (mod64+ b4 b15)
643
b15 (logxor (rol64 b15 51) b4)
644
b10 (mod64+ b10 b7)
645
b7 (logxor (rol64 b7 4) b10)
646
b12 (mod64+ b12 b3)
647
b3 (logxor (rol64 b3 53) b12)
648
b14 (mod64+ b14 b5)
649
b5 (logxor (rol64 b5 42) b14)
650
b8 (mod64+ b8 b1)
651
b1 (logxor (rol64 b1 41) b8)
652
b0 (mod64+ b0 b7)
653
b7 (logxor (rol64 b7 31) b0)
654
b2 (mod64+ b2 b5)
655
b5 (logxor (rol64 b5 44) b2)
656
b4 (mod64+ b4 b3)
657
b3 (logxor (rol64 b3 47) b4)
658
b6 (mod64+ b6 b1)
659
b1 (logxor (rol64 b1 46) b6)
660
b12 (mod64+ b12 b15)
661
b15 (logxor (rol64 b15 19) b12)
662
b14 (mod64+ b14 b13)
663
b13 (logxor (rol64 b13 42) b14)
664
b8 (mod64+ b8 b11)
665
b11 (logxor (rol64 b11 44) b8)
666
b10 (mod64+ b10 b9)
667
b9 (logxor (rol64 b9 25) b10)
668
b0 (mod64+ b0 b15)
669
b15 (logxor (rol64 b15 9) b0)
670
b2 (mod64+ b2 b11)
671
b11 (logxor (rol64 b11 48) b2)
672
b6 (mod64+ b6 b13)
673
b13 (logxor (rol64 b13 35) b6)
674
b4 (mod64+ b4 b9)
675
b9 (logxor (rol64 b9 52) b4)
676
b14 (mod64+ b14 b1)
677
b1 (logxor (rol64 b1 23) b14)
678
b8 (mod64+ b8 b5)
679
b5 (logxor (rol64 b5 31) b8)
680
b10 (mod64+ b10 b3)
681
b3 (logxor (rol64 b3 37) b10)
682
b12 (mod64+ b12 b7)
683
b7 (logxor (rol64 b7 20) b12))))
684
(arx k1 k0 k3 k2 k5 k4 k7 k6 k9 k8 k11 k10 k13 t0 k12 k15 0 k14 t1
685
k2 k1 k4 k3 k6 k5 k8 k7 k10 k9 k12 k11 k14 t1 k13 k16 1 k15 t2)
686
(arx k3 k2 k5 k4 k7 k6 k9 k8 k11 k10 k13 k12 k15 t2 k14 k0 2 k16 t0
687
k4 k3 k6 k5 k8 k7 k10 k9 k12 k11 k14 k13 k16 t0 k15 k1 3 k0 t1)
688
(arx k5 k4 k7 k6 k9 k8 k11 k10 k13 k12 k15 k14 k0 t1 k16 k2 4 k1 t2
689
k6 k5 k8 k7 k10 k9 k12 k11 k14 k13 k16 k15 k1 t2 k0 k3 5 k2 t0)
690
(arx k7 k6 k9 k8 k11 k10 k13 k12 k15 k14 k0 k16 k2 t0 k1 k4 6 k3 t1
691
k8 k7 k10 k9 k12 k11 k14 k13 k16 k15 k1 k0 k3 t1 k2 k5 7 k4 t2)
692
(arx k9 k8 k11 k10 k13 k12 k15 k14 k0 k16 k2 k1 k4 t2 k3 k6 8 k5 t0
693
k10 k9 k12 k11 k14 k13 k16 k15 k1 k0 k3 k2 k5 t0 k4 k7 9 k6 t1)
694
(arx k11 k10 k13 k12 k15 k14 k0 k16 k2 k1 k4 k3 k6 t1 k5 k8 10 k7 t2
695
k12 k11 k14 k13 k16 k15 k1 k0 k3 k2 k5 k4 k7 t2 k6 k9 11 k8 t0)
696
(arx k13 k12 k15 k14 k0 k16 k2 k1 k4 k3 k6 k5 k8 t0 k7 k10 12 k9 t1
697
k14 k13 k16 k15 k1 k0 k3 k2 k5 k4 k7 k6 k9 t1 k8 k11 13 k10 t2)
698
(arx k15 k14 k0 k16 k2 k1 k4 k3 k6 k5 k8 k7 k10 t2 k9 k12 14 k11 t0
699
k16 k15 k1 k0 k3 k2 k5 k4 k7 k6 k9 k8 k11 t0 k10 k13 15 k12 t1)
700
(arx k0 k16 k2 k1 k4 k3 k6 k5 k8 k7 k10 k9 k12 t1 k11 k14 16 k13 t2
701
k1 k0 k3 k2 k5 k4 k7 k6 k9 k8 k11 k10 k13 t2 k12 k15 17 k14 t0)
702
(arx k2 k1 k4 k3 k6 k5 k8 k7 k10 k9 k12 k11 k14 t0 k13 k16 18 k15 t1
703
k3 k2 k5 k4 k7 k6 k9 k8 k11 k10 k13 k12 k15 t1 k14 k0 19 k16 t2))
704
(setf b0 (mod64+ b0 k3)
705
b1 (mod64+ b1 k4)
706
b2 (mod64+ b2 k5)
707
b3 (mod64+ b3 k6)
708
b4 (mod64+ b4 k7)
709
b5 (mod64+ b5 k8)
710
b6 (mod64+ b6 k9)
711
b7 (mod64+ b7 k10)
712
b8 (mod64+ b8 k11)
713
b9 (mod64+ b9 k12)
714
b10 (mod64+ b10 k13)
715
b11 (mod64+ b11 k14)
716
b12 (mod64+ b12 k15)
717
b13 (mod64+ b13 (mod64+ k16 t2))
718
b14 (mod64+ b14 (mod64+ k0 t0))
719
b15 (mod64+ b15 (mod64+ k1 20)))
720
(store-words ciphertext ciphertext-start b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15)
721
(values))))
722
723
(define-block-decryptor threefish1024 128
724
(let* ((key (threefish-key context))
725
(tweak (threefish-tweak context))
726
(k0 (aref key 0))
727
(k1 (aref key 1))
728
(k2 (aref key 2))
729
(k3 (aref key 3))
730
(k4 (aref key 4))
731
(k5 (aref key 5))
732
(k6 (aref key 6))
733
(k7 (aref key 7))
734
(k8 (aref key 8))
735
(k9 (aref key 9))
736
(k10 (aref key 10))
737
(k11 (aref key 11))
738
(k12 (aref key 12))
739
(k13 (aref key 13))
740
(k14 (aref key 14))
741
(k15 (aref key 15))
742
(k16 (aref key 16))
743
(t0 (aref tweak 0))
744
(t1 (aref tweak 1))
745
(t2 (aref tweak 2)))
746
(declare (type (simple-array (unsigned-byte 64) (17)) key)
747
(type (simple-array (unsigned-byte 64) (3)) tweak)
748
(type (unsigned-byte 64) k0 k1 k2 k3 k4 k5 k6 k7 k8 k9 k10 k11 k12 k13 k14 k15 k16 t0 t1 t2))
749
(with-words ((b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15) ciphertext ciphertext-start :big-endian nil :size 8)
750
(setf b0 (mod64- b0 k3)
751
b1 (mod64- b1 k4)
752
b2 (mod64- b2 k5)
753
b3 (mod64- b3 k6)
754
b4 (mod64- b4 k7)
755
b5 (mod64- b5 k8)
756
b6 (mod64- b6 k9)
757
b7 (mod64- b7 k10)
758
b8 (mod64- b8 k11)
759
b9 (mod64- b9 k12)
760
b10 (mod64- b10 k13)
761
b11 (mod64- b11 k14)
762
b12 (mod64- b12 k15)
763
b13 (mod64- b13 (mod64+ k16 t2))
764
b14 (mod64- b14 (mod64+ k0 t0))
765
b15 (mod64- b15 (mod64+ k1 20)))
766
(macrolet ((arx (x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18
767
x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 x32 x33 x34 x35 x36 x37)
768
`(setf b7 (ror64 (logxor b7 b12) 20)
769
b12 (mod64- b12 b7)
770
b3 (ror64 (logxor b3 b10) 37)
771
b10 (mod64- b10 b3)
772
b5 (ror64 (logxor b5 b8) 31)
773
b8 (mod64- b8 b5)
774
b1 (ror64 (logxor b1 b14) 23)
775
b14 (mod64- b14 b1)
776
b9 (ror64 (logxor b9 b4) 52)
777
b4 (mod64- b4 b9)
778
b13 (ror64 (logxor b13 b6) 35)
779
b6 (mod64- b6 b13)
780
b11 (ror64 (logxor b11 b2) 48)
781
b2 (mod64- b2 b11)
782
b15 (ror64 (logxor b15 b0) 9)
783
b0 (mod64- b0 b15)
784
b9 (ror64 (logxor b9 b10) 25)
785
b10 (mod64- b10 b9)
786
b11 (ror64 (logxor b11 b8) 44)
787
b8 (mod64- b8 b11)
788
b13 (ror64 (logxor b13 b14) 42)
789
b14 (mod64- b14 b13)
790
b15 (ror64 (logxor b15 b12) 19)
791
b12 (mod64- b12 b15)
792
b1 (ror64 (logxor b1 b6) 46)
793
b6 (mod64- b6 b1)
794
b3 (ror64 (logxor b3 b4) 47)
795
b4 (mod64- b4 b3)
796
b5 (ror64 (logxor b5 b2) 44)
797
b2 (mod64- b2 b5)
798
b7 (ror64 (logxor b7 b0) 31)
799
b0 (mod64- b0 b7)
800
b1 (ror64 (logxor b1 b8) 41)
801
b8 (mod64- b8 b1)
802
b5 (ror64 (logxor b5 b14) 42)
803
b14 (mod64- b14 b5)
804
b3 (ror64 (logxor b3 b12) 53)
805
b12 (mod64- b12 b3)
806
b7 (ror64 (logxor b7 b10) 4)
807
b10 (mod64- b10 b7)
808
b15 (ror64 (logxor b15 b4) 51)
809
b4 (mod64- b4 b15)
810
b11 (ror64 (logxor b11 b6) 56)
811
b6 (mod64- b6 b11)
812
b13 (ror64 (logxor b13 b2) 34)
813
b2 (mod64- b2 b13)
814
b9 (ror64 (logxor b9 b0) 16)
815
b0 (mod64- b0 b9)
816
b15 (ror64 (logxor b15 b14) 30)
817
b14 (mod64- b14 (mod64+ b15 (mod64+ ,x0 ,x1)))
818
b15 (mod64- b15 (mod64+ ,x2 ,x3))
819
b13 (ror64 (logxor b13 b12) 44)
820
b12 (mod64- b12 (mod64+ b13 ,x4))
821
b13 (mod64- b13 (mod64+ ,x5 ,x6))
822
b11 (ror64 (logxor b11 b10) 47)
823
b10 (mod64- b10 (mod64+ b11 ,x7))
824
b11 (mod64- b11 ,x8)
825
b9 (ror64 (logxor b9 b8) 12)
826
b8 (mod64- b8 (mod64+ b9 ,x9))
827
b9 (mod64- b9 ,x10)
828
b7 (ror64 (logxor b7 b6) 31)
829
b6 (mod64- b6 (mod64+ b7 ,x11))
830
b7 (mod64- b7 ,x12)
831
b5 (ror64 (logxor b5 b4) 37)
832
b4 (mod64- b4 (mod64+ b5 ,x13))
833
b5 (mod64- b5 ,x14)
834
b3 (ror64 (logxor b3 b2) 9)
835
b2 (mod64- b2 (mod64+ b3 ,x15))
836
b3 (mod64- b3 ,x16)
837
b1 (ror64 (logxor b1 b0) 41)
838
b0 (mod64- b0 (mod64+ b1 ,x17))
839
b1 (mod64- b1 ,x18)
840
b7 (ror64 (logxor b7 b12) 25)
841
b12 (mod64- b12 b7)
842
b3 (ror64 (logxor b3 b10) 16)
843
b10 (mod64- b10 b3)
844
b5 (ror64 (logxor b5 b8) 28)
845
b8 (mod64- b8 b5)
846
b1 (ror64 (logxor b1 b14) 47)
847
b14 (mod64- b14 b1)
848
b9 (ror64 (logxor b9 b4) 41)
849
b4 (mod64- b4 b9)
850
b13 (ror64 (logxor b13 b6) 48)
851
b6 (mod64- b6 b13)
852
b11 (ror64 (logxor b11 b2) 20)
853
b2 (mod64- b2 b11)
854
b15 (ror64 (logxor b0 b15) 5)
855
b0 (mod64- b0 b15)
856
b9 (ror64 (logxor b9 b10) 17)
857
b10 (mod64- b10 b9)
858
b11 (ror64 (logxor b11 b8) 59)
859
b8 (mod64- b8 b11)
860
b13 (ror64 (logxor b13 b14) 41)
861
b14 (mod64- b14 b13)
862
b15 (ror64 (logxor b15 b12) 34)
863
b12 (mod64- b12 b15)
864
b1 (ror64 (logxor b1 b6) 13)
865
b6 (mod64- b6 b1)
866
b3 (ror64 (logxor b3 b4) 51)
867
b4 (mod64- b4 b3)
868
b5 (ror64 (logxor b5 b2) 4)
869
b2 (mod64- b2 b5)
870
b7 (ror64 (logxor b7 b0) 33)
871
b0 (mod64- b0 b7)
872
b1 (ror64 (logxor b1 b8) 52)
873
b8 (mod64- b8 b1)
874
b5 (ror64 (logxor b5 b14) 23)
875
b14 (mod64- b14 b5)
876
b3 (ror64 (logxor b3 b12) 18)
877
b12 (mod64- b12 b3)
878
b7 (ror64 (logxor b7 b10) 49)
879
b10 (mod64- b10 b7)
880
b15 (ror64 (logxor b15 b4) 55)
881
b4 (mod64- b4 b15)
882
b11 (ror64 (logxor b11 b6) 10)
883
b6 (mod64- b6 b11)
884
b13 (ror64 (logxor b13 b2) 19)
885
b2 (mod64- b2 b13)
886
b9 (ror64 (logxor b9 b0) 38)
887
b0 (mod64- b0 b9)
888
b15 (ror64 (logxor b15 b14) 37)
889
b14 (mod64- b14 (mod64+ b15 (mod64+ ,x19 ,x20)))
890
b15 (mod64- b15 (mod64+ ,x21 ,x22))
891
b13 (ror64 (logxor b13 b12) 22)
892
b12 (mod64- b12 (mod64+ b13 ,x23))
893
b13 (mod64- b13 (mod64+ ,x24 ,x25))
894
b11 (ror64 (logxor b11 b10) 17)
895
b10 (mod64- b10 (mod64+ b11 ,x26))
896
b11 (mod64- b11 ,x27)
897
b9 (ror64 (logxor b9 b8) 8)
898
b8 (mod64- b8 (mod64+ b9 ,x28))
899
b9 (mod64- b9 ,x29)
900
b7 (ror64 (logxor b7 b6) 47)
901
b6 (mod64- b6 (mod64+ b7 ,x30))
902
b7 (mod64- b7 ,x31)
903
b5 (ror64 (logxor b5 b4) 8)
904
b4 (mod64- b4 (mod64+ b5 ,x32))
905
b5 (mod64- b5 ,x33)
906
b3 (ror64 (logxor b3 b2) 13)
907
b2 (mod64- b2 (mod64+ b3 ,x34))
908
b3 (mod64- b3 ,x35)
909
b1 (ror64 (logxor b1 b0) 24)
910
b0 (mod64- b0 (mod64+ b1 ,x36))
911
b1 (mod64- b1 ,x37))))
912
(arx k16 t2 k0 19 k14 k15 t1 k12 k13 k10 k11 k8 k9 k6 k7 k4 k5 k2 k3
913
k15 t1 k16 18 k13 k14 t0 k11 k12 k9 k10 k7 k8 k5 k6 k3 k4 k1 k2)
914
(arx k14 t0 k15 17 k12 k13 t2 k10 k11 k8 k9 k6 k7 k4 k5 k2 k3 k0 k1
915
k13 t2 k14 16 k11 k12 t1 k9 k10 k7 k8 k5 k6 k3 k4 k1 k2 k16 k0)
916
(arx k12 t1 k13 15 k10 k11 t0 k8 k9 k6 k7 k4 k5 k2 k3 k0 k1 k15 k16
917
k11 t0 k12 14 k9 k10 t2 k7 k8 k5 k6 k3 k4 k1 k2 k16 k0 k14 k15)
918
(arx k10 t2 k11 13 k8 k9 t1 k6 k7 k4 k5 k2 k3 k0 k1 k15 k16 k13 k14
919
k9 t1 k10 12 k7 k8 t0 k5 k6 k3 k4 k1 k2 k16 k0 k14 k15 k12 k13)
920
(arx k8 t0 k9 11 k6 k7 t2 k4 k5 k2 k3 k0 k1 k15 k16 k13 k14 k11 k12
921
k7 t2 k8 10 k5 k6 t1 k3 k4 k1 k2 k16 k0 k14 k15 k12 k13 k10 k11)
922
(arx k6 t1 k7 9 k4 k5 t0 k2 k3 k0 k1 k15 k16 k13 k14 k11 k12 k9 k10
923
k5 t0 k6 8 k3 k4 t2 k1 k2 k16 k0 k14 k15 k12 k13 k10 k11 k8 k9)
924
(arx k4 t2 k5 7 k2 k3 t1 k0 k1 k15 k16 k13 k14 k11 k12 k9 k10 k7 k8
925
k3 t1 k4 6 k1 k2 t0 k16 k0 k14 k15 k12 k13 k10 k11 k8 k9 k6 k7)
926
(arx k2 t0 k3 5 k0 k1 t2 k15 k16 k13 k14 k11 k12 k9 k10 k7 k8 k5 k6
927
k1 t2 k2 4 k16 k0 t1 k14 k15 k12 k13 k10 k11 k8 k9 k6 k7 k4 k5)
928
(arx k0 t1 k1 3 k15 k16 t0 k13 k14 k11 k12 k9 k10 k7 k8 k5 k6 k3 k4
929
k16 t0 k0 2 k14 k15 t2 k12 k13 k10 k11 k8 k9 k6 k7 k4 k5 k2 k3)
930
(arx k15 t2 k16 1 k13 k14 t1 k11 k12 k9 k10 k7 k8 k5 k6 k3 k4 k1 k2
931
k14 t1 k15 0 k12 k13 t0 k10 k11 k8 k9 k6 k7 k4 k5 k2 k3 k0 k1))
932
(store-words plaintext plaintext-start b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15)
933
(values))))
934
935
(defcipher threefish1024
936
(:encrypt-function threefish1024-encrypt-block)
937
(:decrypt-function threefish1024-decrypt-block)
938
(:block-length 128)
939
(:key-length (:fixed 128)))