-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBLOWFISH
More file actions
executable file
·658 lines (658 loc) · 38.2 KB
/
Copy pathBLOWFISH
File metadata and controls
executable file
·658 lines (658 loc) · 38.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
SUBROUTINE BLOWFISH(MODE, SVAL, MAT DTA, ERR)
* ************************************************** *
* ************************************************** *
* Blowfish is a 64 bit symmetric block cipher with a *
* variable length key of up to 448 bits (56 bytes), *
* designed by Bruce Schneier. *
* *
* The algorithm is in the public domain. *
* *
* References: *
* Bruce Schneier, "Section 14.3 Blowfish," *
* Applied Cryptography, 2nd edition *
* John Wiley & Sons, 1996 *
* *
* Bruce Schneier, "Description of a New Variable- *
* Length Key, 64-Bit Cipher (Blowfish)," *
* Fast Software Encryption Cambridge Security *
* Workshop Proceedings, *
* Springer-Verlag, 1004, pp 191-204. *
* *
* Params: MODE - Requested action. One of: *
* 0 = Generate session key and *
* session S-box data using *
* user key passed in 'SVAL' *
* 1 = ECB encrypt of 8 data bytes *
* passed in 'DTA'. Return the *
* encrypted 8 bytes in 'DTA' *
* 2 = ECB decrypt of 8 data bytes *
* passed in 'DTA'. Return the *
* decrypted 8 bytes in 'DTA' *
* 3 = CBC encrypt of the string *
* passed in 'SVAL', using the *
* contents of 'DTA' as the IV *
* data. Return encrypted data *
* string in 'SVAL'. *
* 4 = CBC decrypt of the string *
* passed in 'SVAL', using the *
* contents of 'DTA' as the IV *
* data. Return decrypted data *
* string in 'SVAL'. *
* SVAL - String used for input/output if *
* 'MODE' one of 0, 3 or 4 *
* DTA - Array used to pass data in/out *
* when 'MODE' = 1, or to pass the *
* IV values when 'MODE' = 3 or 4 *
* ERR - Error flag. Set to zero if no *
* error detected, else set to a *
* non-zero code to reflect the *
* error type. Might be one of: *
* 1 = User key too short when *
* 'MODE' = 1 *
* 2 = Invalid value for 'MODE' *
* (ie: unknown action code) *
* *
* NB: As this code assumes 'named common' is valid *
* for the target platform, this code is not suitable *
* for older Pick{like} platforms (eg: R83) (dmm) *
* *
* 9 Sept 2001 - Fixed problem with BITXOR Universe *
* functions working differently on *
* some platforms when input values are *
* large (ie: Bit 31 set) *
* ************************************************** *
* ************************************************** *
*
EQU ROUNDS TO 16 ;* Number of 'rounds'
EQU MIN$KEY$LEN TO 5 ;* Min acceptable key length (in chars)
EQU MAX$KEY$LEN TO 56 ;* Max key length (in chars)
*
EQU MAX32 TO 4294967295 ;* 0xFFFFFFFF
EQU M32P1 TO 4294967296 ;* 0xFFFFFFFF + 1
EQU MAXINT TO 2147483647 ;* 0X7FFFFFFF
EQU P2TO24 TO 16777216 ;* 2^24
EQU P2TO16 TO 65536 ;* 2^16
EQU P2TO8 TO 256 ;* 2^8
*
EQU GENKEY TO 0 ;* Initialise session with key
EQU ENCRYPT TO 1 ;* Encrypt 8 bytes of data
EQU DECRYPT TO 2 ;* Decrypt 8 bytes of data
EQU ENC$CBC TO 3 ;* Encrypt SVAL in CBC mode
EQU DEC$CBC TO 4 ;* Decrypt SVAL in CBC mode
*
EQU NO$ERROR TO 0 ;* Error code for 'no error'
EQU INVALID$KEY TO 1 ;* Error - User key to short
EQU INVALID$MODE TO 2 ;* Error - Invalid value for 'MODE'
*
* Preserve session key & S-boxes in common! Note: 'PBKEY' is
* dimensioned to 'ROUNDS' + 2
COMMON /B$FISH/ PKEY(18), SKEY(1024)
*
DIM DTA(8) ;* Input/Output byte array
*
ERR = NO$ERROR ;* Assume no error!
BEGIN CASE
CASE MODE = ENCRYPT
GOSUB 100
CASE MODE = DECRYPT
GOSUB 100
CASE MODE = ENC$CBC
GOSUB 500
CASE MODE = DEC$CBC
GOSUB 600
CASE MODE = GENKEY
GOSUB 900
CASE 1
* Error - Unknown request!
ERR = INVALID$MODE
END CASE
RETURN
*
* ************************************************************** *
* Convert 8 bytes of input into 2 32 bit values 'LEFT' & 'RIGHT' *
* pass these to either the decrypt or encrypt functions based on *
* the value of 'MODE'. On return, break these values back into 8 *
* byte values representing the encrypted/decrypted input bytes. *
* ************************************************************** *
100*
LEFT = ((DTA(1) * 256 + DTA(2)) * 256 + DTA(3)) * 256 + DTA(4)
RIGHT = ((DTA(5) * 256 + DTA(6)) * 256 + DTA(7)) * 256 + DTA(8)
IF MODE = ENCRYPT THEN
GOSUB 200
END ELSE
GOSUB 300
END
DTA(1) = INT(LEFT / P2TO24)
DTA(2) = MOD(INT(LEFT / P2TO16), P2TO8)
DTA(3) = MOD(INT(LEFT / P2TO8), P2TO8)
DTA(4) = MOD(LEFT, P2TO8)
DTA(5) = INT(RIGHT / P2TO24)
DTA(6) = MOD(INT(RIGHT / P2TO16), P2TO8)
DTA(7) = MOD(INT(RIGHT / P2TO8), P2TO8)
DTA(8) = MOD(RIGHT, P2TO8)
RETURN
*
* ********************************************************* *
* Encryption. Passed to 32 bit blocks in 'LEFT' and 'RIGHT' *
* apply the Blowfish cipher function and return the output *
* as 2 32 bit blocks, in the same variables. *
* ********************************************************* *
200*
R = 1
VAL = LEFT
VAL1 = PKEY(R)
GOSUB 400
LEFT = VAL
LOOP
A = MOD(INT(LEFT / P2TO24), P2TO8) + 1
B = MOD(INT(LEFT / P2TO16), P2TO8) + 257
C = MOD(INT(LEFT / P2TO8), P2TO8) + 513
D = MOD(LEFT, P2TO8) + 769
VAL = SKEY(A) + SKEY(B)
VAL1 = SKEY(C)
GOSUB 400
VAL = VAL + SKEY(D)
R = R + 1
VAL1 = PKEY(R)
GOSUB 400
VAL1 = RIGHT
GOSUB 400
RIGHT = VAL
A = MOD(INT(RIGHT / P2TO24), P2TO8) + 1
B = MOD(INT(RIGHT / P2TO16), P2TO8) + 257
C = MOD(INT(RIGHT / P2TO8), P2TO8) + 513
D = MOD(RIGHT, P2TO8) + 769
VAL = SKEY(A) + SKEY(B)
VAL1 = SKEY(C)
GOSUB 400
VAL = VAL + SKEY(D)
R = R + 1
VAL1 = PKEY(R)
GOSUB 400
VAL1 = LEFT
GOSUB 400
LEFT = VAL
WHILE R < ROUNDS DO REPEAT
VAL = RIGHT
VAL1 = PKEY(R + 1)
GOSUB 400
RIGHT = LEFT
LEFT = VAL
RETURN
*
* ********************************************************* *
* Decryption. Passed to 32 bit blocks in 'LEFT' and 'RIGHT' *
* apply the Blowfish cipher function in reverse order, and *
* return in the same variables the decrypted output. *
* ********************************************************* *
300*
R = ROUNDS + 2
VAL = LEFT
VAL1 = PKEY(R)
GOSUB 400
LEFT = VAL
LOOP
A = MOD(INT(LEFT / P2TO24), P2TO8) + 1
B = MOD(INT(LEFT / P2TO16), P2TO8) + 257
C = MOD(INT(LEFT / P2TO8), P2TO8) + 513
D = MOD(LEFT, P2TO8) + 769
VAL = SKEY(A) + SKEY(B)
VAL1 = SKEY(C)
GOSUB 400
VAL = VAL + SKEY(D)
R = R - 1
VAL1 = PKEY(R)
GOSUB 400
VAL1 = RIGHT
GOSUB 400
RIGHT = VAL
A = MOD(INT(RIGHT / P2TO24), P2TO8) + 1
B = MOD(INT(RIGHT / P2TO16), P2TO8) + 257
C = MOD(INT(RIGHT / P2TO8), P2TO8) + 513
D = MOD(RIGHT, P2TO8) + 769
VAL = SKEY(A) + SKEY(B)
VAL1 = SKEY(C)
GOSUB 400
VAL = VAL + SKEY(D)
R = R - 1
VAL1 = PKEY(R)
GOSUB 400
VAL1 = LEFT
GOSUB 400
LEFT = VAL
WHILE R > 2 DO REPEAT
VAL = RIGHT
VAL1 = PKEY(1)
GOSUB 400
RIGHT = LEFT
LEFT = VAL
RETURN
*
* ********************************************* *
* Logical 'XOR' of two values. Both are assumed *
* to be unsigned 32 bit integers. Passed 'VAL' *
* and 'VAL1', with result returned in 'VAL' *
* NB: 'VAL' can be > 2^32-1 on entry, so result *
* is truncated to 32 bits for return as req'd. *
* ********************************************* *
400*
IF VAL > MAXINT OR VAL1 > MAXINT THEN
VAL3 = BITXOR(MOD(VAL, P2TO16), MOD(VAL1, P2TO16))
VAL4 = BITXOR(INT(VAL / P2TO16), INT(VAL1 / P2TO16))
VAL = (VAL4 * P2TO16) + VAL3
* As VAL can acutally exceed 32 bits, we need the next line!
IF VAL > MAX32 THEN VAL = MOD(VAL, M32P1)
END ELSE
VAL = BITXOR(VAL, VAL1)
END
RETURN
*
* ************************************************ *
* Encrypt a string passed in 'SVAL' using Blowfish *
* in CBC mode. IV data passed in array 'DTA' *
* Note that we pad input to multiple of 8 bytes by *
* adding 0x00 characters as required. *
* ************************************************ *
500*
* Initialise 'LEFT' & 'RIGHT' as IV values from DTA!
LEFT = ((DTA(1) * 256 + DTA(2)) * 256 + DTA(3)) * 256 + DTA(4)
RIGHT = ((DTA(5) * 256 + DTA(6)) * 256 + DTA(7)) * 256 + DTA(8)
*
PAD = "" ; N = LEN(SVAL)
* Pad input string with 0x00 if not multiple of 8!
LOOP UNTIL MOD(N, 8) = 0 DO
PAD = PAD:CHAR(0)
N = N + 1
REPEAT
IF PAD > "" THEN SVAL = SVAL:PAD
*
* Encrypt input string!
*
OUTSTR = ""
FOR PTR = 1 TO N STEP 8
VAL = (SEQ(SVAL[PTR, 1]) * 256 + SEQ(SVAL[PTR+1, 1])) * 256
VAL = (VAL + SEQ(SVAL[PTR+2, 1])) * 256 + SEQ(SVAL[PTR+3, 1])
VAL1 = LEFT
GOSUB 400
LEFT = VAL
VAL = (SEQ(SVAL[PTR+4, 1]) * 256 + SEQ(SVAL[PTR+5, 1])) * 256
VAL = (VAL + SEQ(SVAL[PTR+6, 1])) * 256 + SEQ(SVAL[PTR+7, 1])
VAL1 = RIGHT
GOSUB 400
RIGHT = VAL
GOSUB 200
PAD = CHAR(INT(LEFT / P2TO24)):CHAR(MOD(INT(LEFT / P2TO16), P2TO8))
PAD = PAD:CHAR(MOD(INT(LEFT / P2TO8), P2TO8)):CHAR(MOD(LEFT, P2TO8))
PAD = PAD:CHAR(INT(RIGHT / P2TO24)):CHAR(MOD(INT(RIGHT / P2TO16), P2TO8))
PAD = PAD:CHAR(MOD(INT(RIGHT / P2TO8), P2TO8)):CHAR(MOD(RIGHT, P2TO8))
OUTSTR = OUTSTR:PAD
NEXT PTR
SVAL = OUTSTR
OUTSTR = ""
RETURN
*
* *************************************************** *
* Decrypt a string passed in 'SVAL' using Blowfish in *
* CBC mode. We assume that the string was encrypted *
* using the code in subroutine 500. IV data passed in *
* array 'DTA'. *
* *************************************************** *
600*
* Get inital left & right 32 bit values for IV
IVL = ((DTA(1) * 256 + DTA(2)) * 256 + DTA(3)) * 256 + DTA(4)
IVR = ((DTA(5) * 256 + DTA(6)) * 256 + DTA(7)) * 256 + DTA(8)
*
* Decrypt the input string!
*
OUTSTR = ""
N = LEN(SVAL)
FOR PTR = 1 TO N STEP 8
LEFT = (SEQ(SVAL[PTR, 1]) * 256 + SEQ(SVAL[PTR+1, 1])) * 256
LEFT = (LEFT + SEQ(SVAL[PTR+2, 1])) * 256 + SEQ(SVAL[PTR+3, 1])
RIGHT = (SEQ(SVAL[PTR+4, 1]) * 256 + SEQ(SVAL[PTR+5, 1])) * 256
RIGHT = (RIGHT + SEQ(SVAL[PTR+6, 1])) * 256 + SEQ(SVAL[PTR+7, 1])
* Preserve current values of 'LEFT' and 'RIGHT'
SAVE.LEFT = LEFT
SAVE.RIGHT = RIGHT
* Pass block through Blowfish decryption
GOSUB 300
VAL = LEFT
VAL1 = IVL
GOSUB 400
PAD = CHAR(INT(VAL / P2TO24)):CHAR(MOD(INT(VAL / P2TO16), P2TO8))
PAD = PAD:CHAR(MOD(INT(VAL / P2TO8), P2TO8)):CHAR(MOD(VAL, P2TO8))
VAL = RIGHT
VAL1 = IVR
GOSUB 400
PAD = PAD:CHAR(INT(VAL / P2TO24)):CHAR(MOD(INT(VAL / P2TO16), P2TO8))
PAD = PAD:CHAR(MOD(INT(VAL / P2TO8), P2TO8)):CHAR(MOD(VAL, P2TO8))
OUTSTR = OUTSTR:PAD
IVL = SAVE.LEFT
IVR = SAVE.RIGHT
NEXT PTR
SVAL = OUTSTR
OUTSTR = ""
RETURN
*
* ******************************************************* *
* Expands a user key into a Blowfish session key, and *
* generates the session S-boxes. The key bytes are first *
* extracted from the user key and then used, repeditively *
* if need be, to build the contents of the session key *
* and S-box values. An error is generated if there are no *
* characters in the user key. *
* ******************************************************* *
900*
PKEY(1) =608135816 ; PKEY(2) =2242054355; PKEY(3) =320440878 ; PKEY(4) =57701188
PKEY(5) =2752067618; PKEY(6) =698298832 ; PKEY(7) =137296536 ; PKEY(8) =3964562569
PKEY(9) =1160258022; PKEY(10)=953160567 ; PKEY(11)=3193202383; PKEY(12)=887688300
PKEY(13)=3232508343; PKEY(14)=3380367581; PKEY(15)=1065670069; PKEY(16)=3041331479
PKEY(17)=2450970073; PKEY(18)=2306472731
*
SKEY(1) =3509652390; SKEY(2) =2564797868; SKEY(3) = 805139163; SKEY(4) =3491422135
SKEY(5) =3101798381; SKEY(6) =1780907670; SKEY(7) =3128725573; SKEY(8) =4046225305
SKEY(9) = 614570311; SKEY(10) =3012652279; SKEY(11) = 134345442; SKEY(12) =2240740374
SKEY(13) =1667834072; SKEY(14) =1901547113; SKEY(15) =2757295779; SKEY(16) =4103290238
SKEY(17) = 227898511; SKEY(18) =1921955416; SKEY(19) =1904987480; SKEY(20) =2182433518
SKEY(21) =2069144605; SKEY(22) =3260701109; SKEY(23) =2620446009; SKEY(24) = 720527379
SKEY(25) =3318853667; SKEY(26) = 677414384; SKEY(27) =3393288472; SKEY(28) =3101374703
SKEY(29) =2390351024; SKEY(30) =1614419982; SKEY(31) =1822297739; SKEY(32) =2954791486
SKEY(33) =3608508353; SKEY(34) =3174124327; SKEY(35) =2024746970; SKEY(36) =1432378464
SKEY(37) =3864339955; SKEY(38) =2857741204; SKEY(39) =1464375394; SKEY(40) =1676153920
SKEY(41) =1439316330; SKEY(42) = 715854006; SKEY(43) =3033291828; SKEY(44) = 289532110
SKEY(45) =2706671279; SKEY(46) =2087905683; SKEY(47) =3018724369; SKEY(48) =1668267050
SKEY(49) = 732546397; SKEY(50) =1947742710; SKEY(51) =3462151702; SKEY(52) =2609353502
SKEY(53) =2950085171; SKEY(54) =1814351708; SKEY(55) =2050118529; SKEY(56) = 680887927
SKEY(57) = 999245976; SKEY(58) =1800124847; SKEY(59) =3300911131; SKEY(60) =1713906067
SKEY(61) =1641548236; SKEY(62) =4213287313; SKEY(63) =1216130144; SKEY(64) =1575780402
SKEY(65) =4018429277; SKEY(66) =3917837745; SKEY(67) =3693486850; SKEY(68) =3949271944
SKEY(69) = 596196993; SKEY(70) =3549867205; SKEY(71) = 258830323; SKEY(72) =2213823033
SKEY(73) = 772490370; SKEY(74) =2760122372; SKEY(75) =1774776394; SKEY(76) =2652871518
SKEY(77) = 566650946; SKEY(78) =4142492826; SKEY(79) =1728879713; SKEY(80) =2882767088
SKEY(81) =1783734482; SKEY(82) =3629395816; SKEY(83) =2517608232; SKEY(84) =2874225571
SKEY(85) =1861159788; SKEY(86) = 326777828; SKEY(87) =3124490320; SKEY(88) =2130389656
SKEY(89) =2716951837; SKEY(90) = 967770486; SKEY(91) =1724537150; SKEY(92) =2185432712
SKEY(93) =2364442137; SKEY(94) =1164943284; SKEY(95) =2105845187; SKEY(96) = 998989502
SKEY(97) =3765401048; SKEY(98) =2244026483; SKEY(99) =1075463327; SKEY(100) =1455516326
SKEY(101) =1322494562; SKEY(102) = 910128902; SKEY(103) = 469688178; SKEY(104) =1117454909
SKEY(105) = 936433444; SKEY(106) =3490320968; SKEY(107) =3675253459; SKEY(108) =1240580251
SKEY(109) = 122909385; SKEY(110) =2157517691; SKEY(111) = 634681816; SKEY(112) =4142456567
SKEY(113) =3825094682; SKEY(114) =3061402683; SKEY(115) =2540495037; SKEY(116) = 79693498
SKEY(117) =3249098678; SKEY(118) =1084186820; SKEY(119) =1583128258; SKEY(120) = 426386531
SKEY(121) =1761308591; SKEY(122) =1047286709; SKEY(123) = 322548459; SKEY(124) = 995290223
SKEY(125) =1845252383; SKEY(126) =2603652396; SKEY(127) =3431023940; SKEY(128) =2942221577
SKEY(129) =3202600964; SKEY(130) =3727903485; SKEY(131) =1712269319; SKEY(132) = 422464435
SKEY(133) =3234572375; SKEY(134) =1170764815; SKEY(135) =3523960633; SKEY(136) =3117677531
SKEY(137) =1434042557; SKEY(138) = 442511882; SKEY(139) =3600875718; SKEY(140) =1076654713
SKEY(141) =1738483198; SKEY(142) =4213154764; SKEY(143) =2393238008; SKEY(144) =3677496056
SKEY(145) =1014306527; SKEY(146) =4251020053; SKEY(147) = 793779912; SKEY(148) =2902807211
SKEY(149) = 842905082; SKEY(150) =4246964064; SKEY(151) =1395751752; SKEY(152) =1040244610
SKEY(153) =2656851899; SKEY(154) =3396308128; SKEY(155) = 445077038; SKEY(156) =3742853595
SKEY(157) =3577915638; SKEY(158) = 679411651; SKEY(159) =2892444358; SKEY(160) =2354009459
SKEY(161) =1767581616; SKEY(162) =3150600392; SKEY(163) =3791627101; SKEY(164) =3102740896
SKEY(165) = 284835224; SKEY(166) =4246832056; SKEY(167) =1258075500; SKEY(168) = 768725851
SKEY(169) =2589189241; SKEY(170) =3069724005; SKEY(171) =3532540348; SKEY(172) =1274779536
SKEY(173) =3789419226; SKEY(174) =2764799539; SKEY(175) =1660621633; SKEY(176) =3471099624
SKEY(177) =4011903706; SKEY(178) = 913787905; SKEY(179) =3497959166; SKEY(180) = 737222580
SKEY(181) =2514213453; SKEY(182) =2928710040; SKEY(183) =3937242737; SKEY(184) =1804850592
SKEY(185) =3499020752; SKEY(186) =2949064160; SKEY(187) =2386320175; SKEY(188) =2390070455
SKEY(189) =2415321851; SKEY(190) =4061277028; SKEY(191) =2290661394; SKEY(192) =2416832540
SKEY(193) =1336762016; SKEY(194) =1754252060; SKEY(195) =3520065937; SKEY(196) =3014181293
SKEY(197) = 791618072; SKEY(198) =3188594551; SKEY(199) =3933548030; SKEY(200) =2332172193
SKEY(201) =3852520463; SKEY(202) =3043980520; SKEY(203) = 413987798; SKEY(204) =3465142937
SKEY(205) =3030929376; SKEY(206) =4245938359; SKEY(207) =2093235073; SKEY(208) =3534596313
SKEY(209) = 375366246; SKEY(210) =2157278981; SKEY(211) =2479649556; SKEY(212) = 555357303
SKEY(213) =3870105701; SKEY(214) =2008414854; SKEY(215) =3344188149; SKEY(216) =4221384143
SKEY(217) =3956125452; SKEY(218) =2067696032; SKEY(219) =3594591187; SKEY(220) =2921233993
SKEY(221) = 2428461; SKEY(222) = 544322398; SKEY(223) = 577241275; SKEY(224) =1471733935
SKEY(225) = 610547355; SKEY(226) =4027169054; SKEY(227) =1432588573; SKEY(228) =1507829418
SKEY(229) =2025931657; SKEY(230) =3646575487; SKEY(231) = 545086370; SKEY(232) = 48609733
SKEY(233) =2200306550; SKEY(234) =1653985193; SKEY(235) = 298326376; SKEY(236) =1316178497
SKEY(237) =3007786442; SKEY(238) =2064951626; SKEY(239) = 458293330; SKEY(240) =2589141269
SKEY(241) =3591329599; SKEY(242) =3164325604; SKEY(243) = 727753846; SKEY(244) =2179363840
SKEY(245) = 146436021; SKEY(246) =1461446943; SKEY(247) =4069977195; SKEY(248) = 705550613
SKEY(249) =3059967265; SKEY(250) =3887724982; SKEY(251) =4281599278; SKEY(252) =3313849956
SKEY(253) =1404054877; SKEY(254) =2845806497; SKEY(255) = 146425753; SKEY(256) =1854211946
SKEY(257) =1266315497; SKEY(258) =3048417604; SKEY(259) =3681880366; SKEY(260) =3289982499
SKEY(261) =2909710000; SKEY(262) =1235738493; SKEY(263) =2632868024; SKEY(264) =2414719590
SKEY(265) =3970600049; SKEY(266) =1771706367; SKEY(267) =1449415276; SKEY(268) =3266420449
SKEY(269) = 422970021; SKEY(270) =1963543593; SKEY(271) =2690192192; SKEY(272) =3826793022
SKEY(273) =1062508698; SKEY(274) =1531092325; SKEY(275) =1804592342; SKEY(276) =2583117782
SKEY(277) =2714934279; SKEY(278) =4024971509; SKEY(279) =1294809318; SKEY(280) =4028980673
SKEY(281) =1289560198; SKEY(282) =2221992742; SKEY(283) =1669523910; SKEY(284) = 35572830
SKEY(285) = 157838143; SKEY(286) =1052438473; SKEY(287) =1016535060; SKEY(288) =1802137761
SKEY(289) =1753167236; SKEY(290) =1386275462; SKEY(291) =3080475397; SKEY(292) =2857371447
SKEY(293) =1040679964; SKEY(294) =2145300060; SKEY(295) =2390574316; SKEY(296) =1461121720
SKEY(297) =2956646967; SKEY(298) =4031777805; SKEY(299) =4028374788; SKEY(300) = 33600511
SKEY(301) =2920084762; SKEY(302) =1018524850; SKEY(303) = 629373528; SKEY(304) =3691585981
SKEY(305) =3515945977; SKEY(306) =2091462646; SKEY(307) =2486323059; SKEY(308) = 586499841
SKEY(309) = 988145025; SKEY(310) = 935516892; SKEY(311) =3367335476; SKEY(312) =2599673255
SKEY(313) =2839830854; SKEY(314) = 265290510; SKEY(315) =3972581182; SKEY(316) =2759138881
SKEY(317) =3795373465; SKEY(318) =1005194799; SKEY(319) = 847297441; SKEY(320) = 406762289
SKEY(321) =1314163512; SKEY(322) =1332590856; SKEY(323) =1866599683; SKEY(324) =4127851711
SKEY(325) = 750260880; SKEY(326) = 613907577; SKEY(327) =1450815602; SKEY(328) =3165620655
SKEY(329) =3734664991; SKEY(330) =3650291728; SKEY(331) =3012275730; SKEY(332) =3704569646
SKEY(333) =1427272223; SKEY(334) = 778793252; SKEY(335) =1343938022; SKEY(336) =2676280711
SKEY(337) =2052605720; SKEY(338) =1946737175; SKEY(339) =3164576444; SKEY(340) =3914038668
SKEY(341) =3967478842; SKEY(342) =3682934266; SKEY(343) =1661551462; SKEY(344) =3294938066
SKEY(345) =4011595847; SKEY(346) = 840292616; SKEY(347) =3712170807; SKEY(348) = 616741398
SKEY(349) = 312560963; SKEY(350) = 711312465; SKEY(351) =1351876610; SKEY(352) = 322626781
SKEY(353) =1910503582; SKEY(354) = 271666773; SKEY(355) =2175563734; SKEY(356) =1594956187
SKEY(357) = 70604529; SKEY(358) =3617834859; SKEY(359) =1007753275; SKEY(360) =1495573769
SKEY(361) =4069517037; SKEY(362) =2549218298; SKEY(363) =2663038764; SKEY(364) = 504708206
SKEY(365) =2263041392; SKEY(366) =3941167025; SKEY(367) =2249088522; SKEY(368) =1514023603
SKEY(369) =1998579484; SKEY(370) =1312622330; SKEY(371) = 694541497; SKEY(372) =2582060303
SKEY(373) =2151582166; SKEY(374) =1382467621; SKEY(375) = 776784248; SKEY(376) =2618340202
SKEY(377) =3323268794; SKEY(378) =2497899128; SKEY(379) =2784771155; SKEY(380) = 503983604
SKEY(381) =4076293799; SKEY(382) = 907881277; SKEY(383) = 423175695; SKEY(384) = 432175456
SKEY(385) =1378068232; SKEY(386) =4145222326; SKEY(387) =3954048622; SKEY(388) =3938656102
SKEY(389) =3820766613; SKEY(390) =2793130115; SKEY(391) =2977904593; SKEY(392) = 26017576
SKEY(393) =3274890735; SKEY(394) =3194772133; SKEY(395) =1700274565; SKEY(396) =1756076034
SKEY(397) =4006520079; SKEY(398) =3677328699; SKEY(399) = 720338349; SKEY(400) =1533947780
SKEY(401) = 354530856; SKEY(402) = 688349552; SKEY(403) =3973924725; SKEY(404) =1637815568
SKEY(405) = 332179504; SKEY(406) =3949051286; SKEY(407) = 53804574; SKEY(408) =2852348879
SKEY(409) =3044236432; SKEY(410) =1282449977; SKEY(411) =3583942155; SKEY(412) =3416972820
SKEY(413) =4006381244; SKEY(414) =1617046695; SKEY(415) =2628476075; SKEY(416) =3002303598
SKEY(417) =1686838959; SKEY(418) = 431878346; SKEY(419) =2686675385; SKEY(420) =1700445008
SKEY(421) =1080580658; SKEY(422) =1009431731; SKEY(423) = 832498133; SKEY(424) =3223435511
SKEY(425) =2605976345; SKEY(426) =2271191193; SKEY(427) =2516031870; SKEY(428) =1648197032
SKEY(429) =4164389018; SKEY(430) =2548247927; SKEY(431) = 300782431; SKEY(432) = 375919233
SKEY(433) = 238389289; SKEY(434) =3353747414; SKEY(435) =2531188641; SKEY(436) =2019080857
SKEY(437) =1475708069; SKEY(438) = 455242339; SKEY(439) =2609103871; SKEY(440) = 448939670
SKEY(441) =3451063019; SKEY(442) =1395535956; SKEY(443) =2413381860; SKEY(444) =1841049896
SKEY(445) =1491858159; SKEY(446) = 885456874; SKEY(447) =4264095073; SKEY(448) =4001119347
SKEY(449) =1565136089; SKEY(450) =3898914787; SKEY(451) =1108368660; SKEY(452) = 540939232
SKEY(453) =1173283510; SKEY(454) =2745871338; SKEY(455) =3681308437; SKEY(456) =4207628240
SKEY(457) =3343053890; SKEY(458) =4016749493; SKEY(459) =1699691293; SKEY(460) =1103962373
SKEY(461) =3625875870; SKEY(462) =2256883143; SKEY(463) =3830138730; SKEY(464) =1031889488
SKEY(465) =3479347698; SKEY(466) =1535977030; SKEY(467) =4236805024; SKEY(468) =3251091107
SKEY(469) =2132092099; SKEY(470) =1774941330; SKEY(471) =1199868427; SKEY(472) =1452454533
SKEY(473) = 157007616; SKEY(474) =2904115357; SKEY(475) = 342012276; SKEY(476) = 595725824
SKEY(477) =1480756522; SKEY(478) = 206960106; SKEY(479) = 497939518; SKEY(480) = 591360097
SKEY(481) = 863170706; SKEY(482) =2375253569; SKEY(483) =3596610801; SKEY(484) =1814182875
SKEY(485) =2094937945; SKEY(486) =3421402208; SKEY(487) =1082520231; SKEY(488) =3463918190
SKEY(489) =2785509508; SKEY(490) = 435703966; SKEY(491) =3908032597; SKEY(492) =1641649973
SKEY(493) =2842273706; SKEY(494) =3305899714; SKEY(495) =1510255612; SKEY(496) =2148256476
SKEY(497) =2655287854; SKEY(498) =3276092548; SKEY(499) =4258621189; SKEY(500) = 236887753
SKEY(501) =3681803219; SKEY(502) = 274041037; SKEY(503) =1734335097; SKEY(504) =3815195456
SKEY(505) =3317970021; SKEY(506) =1899903192; SKEY(507) =1026095262; SKEY(508) =4050517792
SKEY(509) = 356393447; SKEY(510) =2410691914; SKEY(511) =3873677099; SKEY(512) =3682840055
SKEY(513) =3913112168; SKEY(514) =2491498743; SKEY(515) =4132185628; SKEY(516) =2489919796
SKEY(517) =1091903735; SKEY(518) =1979897079; SKEY(519) =3170134830; SKEY(520) =3567386728
SKEY(521) =3557303409; SKEY(522) = 857797738; SKEY(523) =1136121015; SKEY(524) =1342202287
SKEY(525) = 507115054; SKEY(526) =2535736646; SKEY(527) = 337727348; SKEY(528) =3213592640
SKEY(529) =1301675037; SKEY(530) =2528481711; SKEY(531) =1895095763; SKEY(532) =1721773893
SKEY(533) =3216771564; SKEY(534) = 62756741; SKEY(535) =2142006736; SKEY(536) = 835421444
SKEY(537) =2531993523; SKEY(538) =1442658625; SKEY(539) =3659876326; SKEY(540) =2882144922
SKEY(541) = 676362277; SKEY(542) =1392781812; SKEY(543) = 170690266; SKEY(544) =3921047035
SKEY(545) =1759253602; SKEY(546) =3611846912; SKEY(547) =1745797284; SKEY(548) = 664899054
SKEY(549) =1329594018; SKEY(550) =3901205900; SKEY(551) =3045908486; SKEY(552) =2062866102
SKEY(553) =2865634940; SKEY(554) =3543621612; SKEY(555) =3464012697; SKEY(556) =1080764994
SKEY(557) = 553557557; SKEY(558) =3656615353; SKEY(559) =3996768171; SKEY(560) = 991055499
SKEY(561) = 499776247; SKEY(562) =1265440854; SKEY(563) = 648242737; SKEY(564) =3940784050
SKEY(565) = 980351604; SKEY(566) =3713745714; SKEY(567) =1749149687; SKEY(568) =3396870395
SKEY(569) =4211799374; SKEY(570) =3640570775; SKEY(571) =1161844396; SKEY(572) =3125318951
SKEY(573) =1431517754; SKEY(574) = 545492359; SKEY(575) =4268468663; SKEY(576) =3499529547
SKEY(577) =1437099964; SKEY(578) =2702547544; SKEY(579) =3433638243; SKEY(580) =2581715763
SKEY(581) =2787789398; SKEY(582) =1060185593; SKEY(583) =1593081372; SKEY(584) =2418618748
SKEY(585) =4260947970; SKEY(586) = 69676912; SKEY(587) =2159744348; SKEY(588) = 86519011
SKEY(589) =2512459080; SKEY(590) =3838209314; SKEY(591) =1220612927; SKEY(592) =3339683548
SKEY(593) = 133810670; SKEY(594) =1090789135; SKEY(595) =1078426020; SKEY(596) =1569222167
SKEY(597) = 845107691; SKEY(598) =3583754449; SKEY(599) =4072456591; SKEY(600) =1091646820
SKEY(601) = 628848692; SKEY(602) =1613405280; SKEY(603) =3757631651; SKEY(604) = 526609435
SKEY(605) = 236106946; SKEY(606) = 48312990; SKEY(607) =2942717905; SKEY(608) =3402727701
SKEY(609) =1797494240; SKEY(610) = 859738849; SKEY(611) = 992217954; SKEY(612) =4005476642
SKEY(613) =2243076622; SKEY(614) =3870952857; SKEY(615) =3732016268; SKEY(616) = 765654824
SKEY(617) =3490871365; SKEY(618) =2511836413; SKEY(619) =1685915746; SKEY(620) =3888969200
SKEY(621) =1414112111; SKEY(622) =2273134842; SKEY(623) =3281911079; SKEY(624) =4080962846
SKEY(625) = 172450625; SKEY(626) =2569994100; SKEY(627) = 980381355; SKEY(628) =4109958455
SKEY(629) =2819808352; SKEY(630) =2716589560; SKEY(631) =2568741196; SKEY(632) =3681446669
SKEY(633) =3329971472; SKEY(634) =1835478071; SKEY(635) = 660984891; SKEY(636) =3704678404
SKEY(637) =4045999559; SKEY(638) =3422617507; SKEY(639) =3040415634; SKEY(640) =1762651403
SKEY(641) =1719377915; SKEY(642) =3470491036; SKEY(643) =2693910283; SKEY(644) =3642056355
SKEY(645) =3138596744; SKEY(646) =1364962596; SKEY(647) =2073328063; SKEY(648) =1983633131
SKEY(649) = 926494387; SKEY(650) =3423689081; SKEY(651) =2150032023; SKEY(652) =4096667949
SKEY(653) =1749200295; SKEY(654) =3328846651; SKEY(655) = 309677260; SKEY(656) =2016342300
SKEY(657) =1779581495; SKEY(658) =3079819751; SKEY(659) = 111262694; SKEY(660) =1274766160
SKEY(661) = 443224088; SKEY(662) = 298511866; SKEY(663) =1025883608; SKEY(664) =3806446537
SKEY(665) =1145181785; SKEY(666) = 168956806; SKEY(667) =3641502830; SKEY(668) =3584813610
SKEY(669) =1689216846; SKEY(670) =3666258015; SKEY(671) =3200248200; SKEY(672) =1692713982
SKEY(673) =2646376535; SKEY(674) =4042768518; SKEY(675) =1618508792; SKEY(676) =1610833997
SKEY(677) =3523052358; SKEY(678) =4130873264; SKEY(679) =2001055236; SKEY(680) =3610705100
SKEY(681) =2202168115; SKEY(682) =4028541809; SKEY(683) =2961195399; SKEY(684) =1006657119
SKEY(685) =2006996926; SKEY(686) =3186142756; SKEY(687) =1430667929; SKEY(688) =3210227297
SKEY(689) =1314452623; SKEY(690) =4074634658; SKEY(691) =4101304120; SKEY(692) =2273951170
SKEY(693) =1399257539; SKEY(694) =3367210612; SKEY(695) =3027628629; SKEY(696) =1190975929
SKEY(697) =2062231137; SKEY(698) =2333990788; SKEY(699) =2221543033; SKEY(700) =2438960610
SKEY(701) =1181637006; SKEY(702) = 548689776; SKEY(703) =2362791313; SKEY(704) =3372408396
SKEY(705) =3104550113; SKEY(706) =3145860560; SKEY(707) = 296247880; SKEY(708) =1970579870
SKEY(709) =3078560182; SKEY(710) =3769228297; SKEY(711) =1714227617; SKEY(712) =3291629107
SKEY(713) =3898220290; SKEY(714) = 166772364; SKEY(715) =1251581989; SKEY(716) = 493813264
SKEY(717) = 448347421; SKEY(718) = 195405023; SKEY(719) =2709975567; SKEY(720) = 677966185
SKEY(721) =3703036547; SKEY(722) =1463355134; SKEY(723) =2715995803; SKEY(724) =1338867538
SKEY(725) =1343315457; SKEY(726) =2802222074; SKEY(727) =2684532164; SKEY(728) = 233230375
SKEY(729) =2599980071; SKEY(730) =2000651841; SKEY(731) =3277868038; SKEY(732) =1638401717
SKEY(733) =4028070440; SKEY(734) =3237316320; SKEY(735) = 6314154; SKEY(736) = 819756386
SKEY(737) = 300326615; SKEY(738) = 590932579; SKEY(739) =1405279636; SKEY(740) =3267499572
SKEY(741) =3150704214; SKEY(742) =2428286686; SKEY(743) =3959192993; SKEY(744) =3461946742
SKEY(745) =1862657033; SKEY(746) =1266418056; SKEY(747) = 963775037; SKEY(748) =2089974820
SKEY(749) =2263052895; SKEY(750) =1917689273; SKEY(751) = 448879540; SKEY(752) =3550394620
SKEY(753) =3981727096; SKEY(754) = 150775221; SKEY(755) =3627908307; SKEY(756) =1303187396
SKEY(757) = 508620638; SKEY(758) =2975983352; SKEY(759) =2726630617; SKEY(760) =1817252668
SKEY(761) =1876281319; SKEY(762) =1457606340; SKEY(763) = 908771278; SKEY(764) =3720792119
SKEY(765) =3617206836; SKEY(766) =2455994898; SKEY(767) =1729034894; SKEY(768) =1080033504
SKEY(769) = 976866871; SKEY(770) =3556439503; SKEY(771) =2881648439; SKEY(772) =1522871579
SKEY(773) =1555064734; SKEY(774) =1336096578; SKEY(775) =3548522304; SKEY(776) =2579274686
SKEY(777) =3574697629; SKEY(778) =3205460757; SKEY(779) =3593280638; SKEY(780) =3338716283
SKEY(781) =3079412587; SKEY(782) = 564236357; SKEY(783) =2993598910; SKEY(784) =1781952180
SKEY(785) =1464380207; SKEY(786) =3163844217; SKEY(787) =3332601554; SKEY(788) =1699332808
SKEY(789) =1393555694; SKEY(790) =1183702653; SKEY(791) =3581086237; SKEY(792) =1288719814
SKEY(793) = 691649499; SKEY(794) =2847557200; SKEY(795) =2895455976; SKEY(796) =3193889540
SKEY(797) =2717570544; SKEY(798) =1781354906; SKEY(799) =1676643554; SKEY(800) =2592534050
SKEY(801) =3230253752; SKEY(802) =1126444790; SKEY(803) =2770207658; SKEY(804) =2633158820
SKEY(805) =2210423226; SKEY(806) =2615765581; SKEY(807) =2414155088; SKEY(808) =3127139286
SKEY(809) = 673620729; SKEY(810) =2805611233; SKEY(811) =1269405062; SKEY(812) =4015350505
SKEY(813) =3341807571; SKEY(814) =4149409754; SKEY(815) =1057255273; SKEY(816) =2012875353
SKEY(817) =2162469141; SKEY(818) =2276492801; SKEY(819) =2601117357; SKEY(820) = 993977747
SKEY(821) =3918593370; SKEY(822) =2654263191; SKEY(823) = 753973209; SKEY(824) = 36408145
SKEY(825) =2530585658; SKEY(826) = 25011837; SKEY(827) =3520020182; SKEY(828) =2088578344
SKEY(829) = 530523599; SKEY(830) =2918365339; SKEY(831) =1524020338; SKEY(832) =1518925132
SKEY(833) =3760827505; SKEY(834) =3759777254; SKEY(835) =1202760957; SKEY(836) =3985898139
SKEY(837) =3906192525; SKEY(838) = 674977740; SKEY(839) =4174734889; SKEY(840) =2031300136
SKEY(841) =2019492241; SKEY(842) =3983892565; SKEY(843) =4153806404; SKEY(844) =3822280332
SKEY(845) = 352677332; SKEY(846) =2297720250; SKEY(847) = 60907813; SKEY(848) = 90501309
SKEY(849) =3286998549; SKEY(850) =1016092578; SKEY(851) =2535922412; SKEY(852) =2839152426
SKEY(853) = 457141659; SKEY(854) = 509813237; SKEY(855) =4120667899; SKEY(856) = 652014361
SKEY(857) =1966332200; SKEY(858) =2975202805; SKEY(859) = 55981186; SKEY(860) =2327461051
SKEY(861) = 676427537; SKEY(862) =3255491064; SKEY(863) =2882294119; SKEY(864) =3433927263
SKEY(865) =1307055953; SKEY(866) = 942726286; SKEY(867) = 933058658; SKEY(868) =2468411793
SKEY(869) =3933900994; SKEY(870) =4215176142; SKEY(871) =1361170020; SKEY(872) =2001714738
SKEY(873) =2830558078; SKEY(874) =3274259782; SKEY(875) =1222529897; SKEY(876) =1679025792
SKEY(877) =2729314320; SKEY(878) =3714953764; SKEY(879) =1770335741; SKEY(880) = 151462246
SKEY(881) =3013232138; SKEY(882) =1682292957; SKEY(883) =1483529935; SKEY(884) = 471910574
SKEY(885) =1539241949; SKEY(886) = 458788160; SKEY(887) =3436315007; SKEY(888) =1807016891
SKEY(889) =3718408830; SKEY(890) = 978976581; SKEY(891) =1043663428; SKEY(892) =3165965781
SKEY(893) =1927990952; SKEY(894) =4200891579; SKEY(895) =2372276910; SKEY(896) =3208408903
SKEY(897) =3533431907; SKEY(898) =1412390302; SKEY(899) =2931980059; SKEY(900) =4132332400
SKEY(901) =1947078029; SKEY(902) =3881505623; SKEY(903) =4168226417; SKEY(904) =2941484381
SKEY(905) =1077988104; SKEY(906) =1320477388; SKEY(907) = 886195818; SKEY(908) = 18198404
SKEY(909) =3786409000; SKEY(910) =2509781533; SKEY(911) = 112762804; SKEY(912) =3463356488
SKEY(913) =1866414978; SKEY(914) = 891333506; SKEY(915) = 18488651; SKEY(916) = 661792760
SKEY(917) =1628790961; SKEY(918) =3885187036; SKEY(919) =3141171499; SKEY(920) = 876946877
SKEY(921) =2693282273; SKEY(922) =1372485963; SKEY(923) = 791857591; SKEY(924) =2686433993
SKEY(925) =3759982718; SKEY(926) =3167212022; SKEY(927) =3472953795; SKEY(928) =2716379847
SKEY(929) = 445679433; SKEY(930) =3561995674; SKEY(931) =3504004811; SKEY(932) =3574258232
SKEY(933) = 54117162; SKEY(934) =3331405415; SKEY(935) =2381918588; SKEY(936) =3769707343
SKEY(937) =4154350007; SKEY(938) =1140177722; SKEY(939) =4074052095; SKEY(940) = 668550556
SKEY(941) =3214352940; SKEY(942) = 367459370; SKEY(943) = 261225585; SKEY(944) =2610173221
SKEY(945) =4209349473; SKEY(946) =3468074219; SKEY(947) =3265815641; SKEY(948) = 314222801
SKEY(949) =3066103646; SKEY(950) =3808782860; SKEY(951) = 282218597; SKEY(952) =3406013506
SKEY(953) =3773591054; SKEY(954) = 379116347; SKEY(955) =1285071038; SKEY(956) = 846784868
SKEY(957) =2669647154; SKEY(958) =3771962079; SKEY(959) =3550491691; SKEY(960) =2305946142
SKEY(961) = 453669953; SKEY(962) =1268987020; SKEY(963) =3317592352; SKEY(964) =3279303384
SKEY(965) =3744833421; SKEY(966) =2610507566; SKEY(967) =3859509063; SKEY(968) = 266596637
SKEY(969) =3847019092; SKEY(970) = 517658769; SKEY(971) =3462560207; SKEY(972) =3443424879
SKEY(973) = 370717030; SKEY(974) =4247526661; SKEY(975) =2224018117; SKEY(976) =4143653529
SKEY(977) =4112773975; SKEY(978) =2788324899; SKEY(979) =2477274417; SKEY(980) =1456262402
SKEY(981) =2901442914; SKEY(982) =1517677493; SKEY(983) =1846949527; SKEY(984) =2295493580
SKEY(985) =3734397586; SKEY(986) =2176403920; SKEY(987) =1280348187; SKEY(988) =1908823572
SKEY(989) =3871786941; SKEY(990) = 846861322; SKEY(991) =1172426758; SKEY(992) =3287448474
SKEY(993) =3383383037; SKEY(994) =1655181056; SKEY(995) =3139813346; SKEY(996) = 901632758
SKEY(997) =1897031941; SKEY(998) =2986607138; SKEY(999) =3066810236; SKEY(1000)=3447102507
SKEY(1001)=1393639104; SKEY(1002)= 373351379; SKEY(1003)= 950779232; SKEY(1004)= 625454576
SKEY(1005)=3124240540; SKEY(1006)=4148612726; SKEY(1007)=2007998917; SKEY(1008)= 544563296
SKEY(1009)=2244738638; SKEY(1010)=2330496472; SKEY(1011)=2058025392; SKEY(1012)=1291430526
SKEY(1013)= 424198748; SKEY(1014)= 50039436; SKEY(1015)= 29584100; SKEY(1016)=3605783033
SKEY(1017)=2429876329; SKEY(1018)=2791104160; SKEY(1019)=1057563949; SKEY(1020)=3255363231
SKEY(1021)=3075367218; SKEY(1022)=3463963227; SKEY(1023)=1469046755; SKEY(1024)= 985887462
*
* We expect the key source to be up to MAX$KEY$LEN chars long, and at least
* MIN$KEY$LEN chars in length.
*
J = LEN(SVAL)
IF J < MIN$KEY$LEN THEN
* Error - User key too short!
ERR = INVALID$KEY
RETURN
END ELSE
IF J > MAX$KEY$LEN THEN
* Truncate user key to too long!
J = MAX$KEY$LEN
END
END
*
* Initialise session key array!
*
L = 1
FOR I = 1 TO ROUNDS + 2
VAL1 = 0
FOR K = 1 TO 4
VAL1 = VAL1 * 256 + SEQ(SVAL[L, 1])
L = L + 1
IF L > J THEN L = 1
NEXT K
VAL = PKEY(I)
GOSUB 400
PKEY(I) = VAL
NEXT I
*
* Generate the session key!
*
LEFT = 0
RIGHT = 0
FOR I = 1 TO ROUNDS + 2 STEP 2
GOSUB 200
PKEY(I) = LEFT
PKEY(I + 1) = RIGHT
NEXT I
*
* Generate the session S-boxes
*
FOR I = 1 TO 1024 STEP 2
GOSUB 200
SKEY(I) = LEFT
SKEY(I + 1) = RIGHT
NEXT I
RETURN
*
END