Coverage report: /home/ellis/comp/ext/ironclad/src/ciphers/threefish.lisp

KindCoveredAll%
expression0535 0.0
branch02 0.0
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
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)))