twofish 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -90,6 +90,17 @@ Aside from this README, rdoc documentation may be built as follows:
90
90
  The documentation will be built in the rdoc subdirectory.
91
91
 
92
92
 
93
+ === Benchmark
94
+
95
+ A simple benchmark can be found in test/benchmark.rb and can be run
96
+ thusly:
97
+
98
+ rake benchmark
99
+
100
+ Ruby 1.9 is approximately three times faster than ruby 1.8.7
101
+ (Ubuntu x86-64).
102
+
103
+
93
104
  === Bugs, omissions and weaknesses
94
105
 
95
106
  Encryption and decryption are (not unexpectedly) slow. If you need a
@@ -97,11 +108,6 @@ faster implementation for Ruby then the BouncyCastle provider
97
108
  (http://www.bouncycastle.org) plays well with JRuby (http://www.jruby.org).
98
109
  See above ("Unit tests") for a sample script.
99
110
 
100
- The original "pure Perl" implementation used Perl's integer pragma.
101
- This implementation uses a private method mask32 to strip off any high
102
- order bits in an effort to prevent (slow) promotion of Fixnums to Bignums.
103
- This is a little clumsy and probably could be quicker.
104
-
105
111
  Ruby >=1.9 introduces string encodings. The current workaround uses
106
112
  #ord and #chr but this is not very satisfactory: it would be preferable
107
113
  to move to byte arrays throughout.
data/Rakefile CHANGED
@@ -1,35 +1,38 @@
1
1
 
2
+ require 'benchmark'
2
3
  require 'rake'
3
4
  require 'rake/clean'
4
- require 'rake/gempackagetask'
5
- require 'rake/rdoctask'
6
5
  require 'rake/testtask'
6
+ require 'rdoc/task'
7
+ require 'rubygems/package_task'
7
8
 
8
9
  desc 'Default task (test)'
9
10
  task :default => [:test]
10
11
 
11
12
  Rake::TestTask.new('test') do |test|
12
- test.pattern = 'test/*.rb'
13
+ test.pattern = 'test/test_*.rb'
13
14
  test.warning = true
14
15
  end
15
16
 
17
+ Rake::TestTask.new('benchmark') do |test|
18
+ test.pattern = 'test/benchmark.rb'
19
+ end
20
+
16
21
  SPECFILE = 'twofish.gemspec'
17
22
  if File.exist?(SPECFILE)
18
23
  spec = eval( File.read(SPECFILE) )
19
- Rake::GemPackageTask.new(spec) do |pkg|
24
+ Gem::PackageTask.new(spec) do |pkg|
20
25
  pkg.need_tar = true
21
26
  end
22
27
  end
23
28
 
24
- Rake::RDocTask.new do |rdoc|
29
+ RDoc::Task.new do |rdoc|
25
30
  rdoc.rdoc_dir = 'rdoc'
26
31
  rdoc.title = 'twofish.rb'
27
- rdoc.options << '--line-numbers' << '--inline-source'
28
- rdoc.options << '-A cattr_accessor=object'
32
+ rdoc.options << '--line-numbers'
29
33
  rdoc.options << '--charset' << 'utf-8'
30
34
  rdoc.options << '--all'
31
35
  rdoc.rdoc_files.include('README.rdoc')
32
- rdoc.rdoc_files.include('lib/twofish.rb')
33
- rdoc.rdoc_files.include('test/test_twofish.rb')
36
+ rdoc.rdoc_files.include(Dir[ 'lib/**/*' ])
34
37
  end
35
38
 
data/lib/string.rb ADDED
@@ -0,0 +1,16 @@
1
+ class String
2
+
3
+ unless method_defined?(:byteslice)
4
+ def byteslice(*args)
5
+ self.dup.force_encoding('ASCII-8BIT').slice!(*args)
6
+ end
7
+ end
8
+
9
+ unless method_defined?(:force_encoding)
10
+ def force_encoding(encoding)
11
+ self # noop
12
+ end
13
+ end
14
+
15
+ end
16
+
data/lib/twofish.rb CHANGED
@@ -8,9 +8,26 @@
8
8
  # encryption algorithm based on original work by Guido Flohr.
9
9
  class Twofish
10
10
 
11
- attr_reader :iv, :key_size, :mode, :padding # setters for iv, mode defined below for validation
11
+ require 'string' # monkey patch for MRI 1.8.7
12
+ require 'twofish/mode'
13
+ require 'twofish/padding'
12
14
 
13
- BLOCK_SIZE = 16 # 16 bytes, 128 bits
15
+ # Setters for iv, mode defined below for validation
16
+
17
+ # Initialization vector for CBC mode.
18
+ attr_reader :iv
19
+
20
+ # The size of the key in bytes (16, 24, 32 bytes).
21
+ attr_reader :key_size
22
+
23
+ # Encryption mode eg Mode::ECB (default) or Mode::CBC.
24
+ attr_reader :mode
25
+
26
+ # Padding algorithm eg Padding::NONE (default) or Padding::ZERO_BYTE.
27
+ attr_reader :padding
28
+
29
+ # The block size in bytes (16).
30
+ BLOCK_SIZE = 16
14
31
 
15
32
  #:stopdoc:
16
33
  Q0 = [
@@ -323,7 +340,7 @@ class Twofish
323
340
  # consists of four equal bytes, each with the value i. The function
324
341
  # h is only applied to words of this type, so we only pass it the
325
342
  # value of i.
326
- k = []
343
+ @k = []
327
344
 
328
345
  # The key-dependent S-boxes used in the g() function are created
329
346
  # below. They are defined by g(X) = h(X, S), where S is the vector
@@ -333,12 +350,11 @@ class Twofish
333
350
  # The relevant lookup tables qN have been precomputed and stored in
334
351
  # tables.h; we also perform full key precomputations incorporating
335
352
  # the MDS matrix multiplications.
336
- xS0, xS1, xS2, xS3 = [], [], [], []
353
+ @xS0, @xS1, @xS2, @xS3 = [], [], [], []
337
354
  case @key_size
338
355
  when 16
339
356
  s7, s6, s5, s4 = *mds_rem(le_longs[0], le_longs[1])
340
357
  s3, s2, s1, s0 = *mds_rem(le_longs[2], le_longs[3])
341
- a, b = 0, 0
342
358
  (0..38).step(2) do |i|
343
359
  j = i + 1
344
360
  a = M0[Q0[Q0[i] ^ key[8]] ^ key[0]] ^
@@ -349,23 +365,22 @@ class Twofish
349
365
  M1[Q0[Q1[j] ^ key[13]] ^ key[5]] ^
350
366
  M2[Q1[Q0[j] ^ key[14]] ^ key[6]] ^
351
367
  M3[Q1[Q1[j] ^ key[15]] ^ key[7]]
352
- b = mask32(b << 8) | (b >> 24)
353
- a = mask32(a+b)
354
- k.push(a)
355
- a = mask32(a+b)
356
- k.push(mask32(a << 9) | a >> 23)
368
+ b = ((b & 0xffffff) << 8) | (b >> 24)
369
+ a = 0xffffffff & (a+b)
370
+ @k.push(a)
371
+ a = 0xffffffff & (a+b)
372
+ @k.push((a & 0x7fffff) << 9 | a >> 23)
357
373
  end
358
374
  (0..255).each do |i|
359
- xS0[i] = M0[Q0[Q0[i] ^ s4] ^ s0]
360
- xS1[i] = M1[Q0[Q1[i] ^ s5] ^ s1]
361
- xS2[i] = M2[Q1[Q0[i] ^ s6] ^ s2]
362
- xS3[i] = M3[Q1[Q1[i] ^ s7] ^ s3]
375
+ @xS0[i] = M0[Q0[Q0[i] ^ s4] ^ s0]
376
+ @xS1[i] = M1[Q0[Q1[i] ^ s5] ^ s1]
377
+ @xS2[i] = M2[Q1[Q0[i] ^ s6] ^ s2]
378
+ @xS3[i] = M3[Q1[Q1[i] ^ s7] ^ s3]
363
379
  end
364
380
  when 24
365
381
  sb, sa, s9, s8 = *mds_rem(le_longs[0], le_longs[1])
366
382
  s7, s6, s5, s4 = *mds_rem(le_longs[2], le_longs[3])
367
383
  s3, s2, s1, s0 = *mds_rem(le_longs[4], le_longs[5])
368
- j = 1
369
384
  (0..38).step(2) do |i|
370
385
  j = i + 1
371
386
  a = M0[Q0[Q0[Q1[i] ^ key[16]] ^ key[8]] ^ key[0]] ^
@@ -376,24 +391,23 @@ class Twofish
376
391
  M1[Q0[Q1[Q1[j] ^ key[21]] ^ key[13]] ^ key[5]] ^
377
392
  M2[Q1[Q0[Q0[j] ^ key[22]] ^ key[14]] ^ key[6]] ^
378
393
  M3[Q1[Q1[Q0[j] ^ key[23]] ^ key[15]] ^ key[7]]
379
- b = mask32(b << 8) | (b >> 24)
380
- a = mask32(a+b)
381
- k.push(a)
382
- a = mask32(a+b)
383
- k.push(mask32(a << 9) | a >> 23)
394
+ b = ((b & 0xffffff) << 8) | (b >> 24)
395
+ a = 0xffffffff & (a+b)
396
+ @k.push(a)
397
+ a = 0xffffffff & (a+b)
398
+ @k.push((a & 0x7fffff) << 9 | a >> 23)
384
399
  end
385
400
  (0..255).each do |i|
386
- xS0[i] = M0[Q0[Q0[Q1[i] ^ s8] ^ s4] ^ s0]
387
- xS1[i] = M1[Q0[Q1[Q1[i] ^ s9] ^ s5] ^ s1]
388
- xS2[i] = M2[Q1[Q0[Q0[i] ^ sa] ^ s6] ^ s2]
389
- xS3[i] = M3[Q1[Q1[Q0[i] ^ sb] ^ s7] ^ s3]
401
+ @xS0[i] = M0[Q0[Q0[Q1[i] ^ s8] ^ s4] ^ s0]
402
+ @xS1[i] = M1[Q0[Q1[Q1[i] ^ s9] ^ s5] ^ s1]
403
+ @xS2[i] = M2[Q1[Q0[Q0[i] ^ sa] ^ s6] ^ s2]
404
+ @xS3[i] = M3[Q1[Q1[Q0[i] ^ sb] ^ s7] ^ s3]
390
405
  end
391
406
  when 32
392
407
  sf, se, sd, sc = *mds_rem(le_longs[0], le_longs[1])
393
408
  sb, sa, s9, s8 = *mds_rem(le_longs[2], le_longs[3])
394
409
  s7, s6, s5, s4 = *mds_rem(le_longs[4], le_longs[5])
395
410
  s3, s2, s1, s0 = *mds_rem(le_longs[6], le_longs[7])
396
- j = 1
397
411
  (0..38).step(2) do |i|
398
412
  j = i + 1
399
413
  a = M0[Q0[Q0[Q1[Q1[i] ^ key[24]] ^ key[16]] ^ key[8]] ^ key[0]] ^
@@ -404,25 +418,22 @@ class Twofish
404
418
  M1[Q0[Q1[Q1[Q0[j] ^ key[29]] ^ key[21]] ^ key[13]] ^ key[5]] ^
405
419
  M2[Q1[Q0[Q0[Q0[j] ^ key[30]] ^ key[22]] ^ key[14]] ^ key[6]] ^
406
420
  M3[Q1[Q1[Q0[Q1[j] ^ key[31]] ^ key[23]] ^ key[15]] ^ key[7]]
407
- b = mask32(b << 8) | (b >> 24)
408
- a = mask32(a+b)
409
- k.push(a)
410
- a = mask32(a+b)
411
- k.push(mask32(a << 9) | a >> 23)
421
+ b = ((b & 0xffffff) << 8) | (b >> 24)
422
+ a = 0xffffffff & (a+b)
423
+ @k.push(a)
424
+ a = 0xffffffff & (a+b)
425
+ @k.push((a & 0x7fffff) << 9 | a >> 23)
412
426
  end
413
427
  (0..255).each do |i|
414
- xS0[i] = M0[Q0[Q0[Q1[Q1[i]^sc]^s8]^s4]^s0]
415
- xS1[i] = M1[Q0[Q1[Q1[Q0[i]^sd]^s9]^s5]^s1]
416
- xS2[i] = M2[Q1[Q0[Q0[Q0[i]^se]^sa]^s6]^s2]
417
- xS3[i] = M3[Q1[Q1[Q0[Q1[i]^sf]^sb]^s7]^s3]
428
+ @xS0[i] = M0[Q0[Q0[Q1[Q1[i]^sc]^s8]^s4]^s0]
429
+ @xS1[i] = M1[Q0[Q1[Q1[Q0[i]^sd]^s9]^s5]^s1]
430
+ @xS2[i] = M2[Q1[Q0[Q0[Q0[i]^se]^sa]^s6]^s2]
431
+ @xS3[i] = M3[Q1[Q1[Q0[Q1[i]^sf]^sb]^s7]^s3]
418
432
  end
419
433
  else
420
434
  raise ArgumentError, "invalid key length #{@key_size} (expecting 16, 24 or 32 bytes)"
421
435
  end
422
436
 
423
- @k = k
424
- @s = [ xS0, xS1, xS2, xS3 ]
425
-
426
437
  end
427
438
 
428
439
  # Assign the initialization vector.
@@ -440,14 +451,14 @@ class Twofish
440
451
  # set to Mode::ECB then the IV will be ignored for any
441
452
  # encrypt/decrypt operations.
442
453
  def mode=(mode)
443
- @mode = Mode::validate(mode)
454
+ @mode = Mode.validate(mode)
444
455
  end
445
456
 
446
457
  # Set the padding scheme for the (CBC mode) cipher
447
458
  # (Padding::NONE == :none or Padding::ZERO_BYTE ==
448
459
  # :zero_byte).
449
460
  def padding=(scheme)
450
- @padding = Padding::validate(scheme)
461
+ @padding = Padding.validate(scheme)
451
462
  end
452
463
 
453
464
  # Return the cipher's block size in bytes.
@@ -458,15 +469,17 @@ class Twofish
458
469
  # Encrypt a plaintext string, chunking as required for
459
470
  # CBC mode.
460
471
  def encrypt(plaintext)
461
- padded_plaintext = Padding::pad(plaintext, BLOCK_SIZE, self.padding)
462
- result = ''
472
+ plaintext = plaintext.dup.force_encoding('ASCII-8BIT')
473
+ padded_plaintext = Padding.pad!(plaintext, BLOCK_SIZE, @padding)
474
+ result = ''.force_encoding('ASCII-8BIT')
463
475
  if @mode == Mode::CBC
464
476
  @iv = generate_iv(BLOCK_SIZE) unless @iv
465
477
  ciphertext_block = @iv
466
478
  end
467
- (0..padded_plaintext.length-1).step(BLOCK_SIZE) do |block_ptr|
468
- (0..BLOCK_SIZE-1).each { |i| padded_plaintext[block_ptr+i] = ( padded_plaintext[block_ptr+i].ord ^ ciphertext_block[i].ord ).chr } if Mode::CBC == @mode
469
- result << ciphertext_block = self.encrypt_block(padded_plaintext[block_ptr, BLOCK_SIZE])
479
+ (0...padded_plaintext.length).step(BLOCK_SIZE) do |block_ptr|
480
+ plaintext_block = padded_plaintext[block_ptr, BLOCK_SIZE]
481
+ xor_block!(plaintext_block, ciphertext_block) if Mode::CBC == @mode
482
+ result << ciphertext_block = encrypt_block(plaintext_block)
470
483
  end
471
484
  result
472
485
  end
@@ -475,8 +488,9 @@ class Twofish
475
488
  # chaining modes. If @iv is not set then we use the first block
476
489
  # as the initialization vector when chaining.
477
490
  def decrypt(ciphertext)
478
- raise ArgumentError, "Ciphertext is not a multiple of #{BLOCK_SIZE} bytes" unless (ciphertext.length % BLOCK_SIZE).zero?
479
- result = ''
491
+ ciphertext = ciphertext.dup.force_encoding('ASCII-8BIT')
492
+ raise ArgumentError, "ciphertext is not a multiple of #{BLOCK_SIZE} bytes" unless (ciphertext.length % BLOCK_SIZE).zero?
493
+ result = ''.force_encoding('ASCII-8BIT')
480
494
  if Mode::CBC == @mode
481
495
  if @iv
482
496
  feedback = @iv
@@ -485,542 +499,542 @@ class Twofish
485
499
  ciphertext = ciphertext[BLOCK_SIZE..-1]
486
500
  end
487
501
  end
488
- (0..ciphertext.length-1).step(BLOCK_SIZE) do |block_ptr|
502
+ (0...ciphertext.length).step(BLOCK_SIZE) do |block_ptr|
489
503
  ciphertext_block = ciphertext[block_ptr, BLOCK_SIZE]
490
- plaintext_block = self.decrypt_block(ciphertext_block)
491
- (0..BLOCK_SIZE-1).each { |i| plaintext_block[i] = (plaintext_block[i].ord ^ feedback[i].ord).chr } if Mode::CBC == @mode
504
+ plaintext_block = decrypt_block(ciphertext_block)
505
+ xor_block!(plaintext_block, feedback) if Mode::CBC == @mode
492
506
  result << plaintext_block
493
507
  feedback = ciphertext_block
494
508
  end
495
- Padding::unpad(result, BLOCK_SIZE, self.padding)
509
+ Padding.unpad!(result, BLOCK_SIZE, @padding)
510
+ end
511
+
512
+ # Exclusive-or two blocks together, byte-by-byte, storing the result
513
+ # in the first block.
514
+ def xor_block!(target, source)
515
+ (0...BLOCK_SIZE).each { |i| target[i] = (target[i].ord ^ source[i].ord).chr }
496
516
  end
497
517
 
498
518
  # Encrypt a single block (16 bytes).
499
519
  def encrypt_block(plain_text)
500
520
 
501
521
  words = plain_text.unpack('V4')
502
- k = @k
503
522
 
504
- r0 = k[0] ^ words[0]
505
- r1 = k[1] ^ words[1]
506
- r2 = k[2] ^ words[2]
507
- r3 = k[3] ^ words[3]
508
-
509
- xS0, xS1, xS2, xS3 = *@s
523
+ r0 = @k[0] ^ words[0]
524
+ r1 = @k[1] ^ words[1]
525
+ r2 = @k[2] ^ words[2]
526
+ r3 = @k[3] ^ words[3]
510
527
 
511
528
  # i = 0
512
- t0 = xS0[r0 & 0xff] ^
513
- xS1[(r0 >> 8) & 0xff] ^
514
- xS2[(r0 >> 16) & 0xff] ^
515
- xS3[(r0 >> 24) & 0xff]
516
- t1 = xS0[(r1 >> 24) & 0xff] ^
517
- xS1[r1 & 0xff] ^
518
- xS2[(r1 >> 8) & 0xff] ^
519
- xS3[(r1 >> 16) & 0xff]
520
-
521
- r2 ^= mask32(t0 + t1 + k[8])
522
- r2 = (r2 >> 1 & 0x7fffffff) | mask32(r2 << 31)
523
-
524
- r3 = ((r3 >> 31) & 1) | mask32(r3 << 1)
525
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[9])
526
-
527
- t0 = xS0[r2 & 0xff] ^
528
- xS1[(r2 >> 8) & 0xff] ^
529
- xS2[(r2 >> 16) & 0xff] ^
530
- xS3[(r2 >> 24) & 0xff]
531
- t1 = xS0[(r3 >> 24) & 0xff] ^
532
- xS1[r3 & 0xff] ^
533
- xS2[(r3 >> 8) & 0xff] ^
534
- xS3[(r3 >> 16) & 0xff]
535
-
536
- r0 ^= mask32(t0 + t1 + k[10])
537
- r0 = (r0 >> 1 & 0x7fffffff) | mask32(r0 << 31)
538
-
539
- r1 = ((r1 >> 31) & 1) | mask32(r1 << 1)
540
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[11])
529
+ t0 = @xS0[r0 & 0xff] ^
530
+ @xS1[(r0 >> 8) & 0xff] ^
531
+ @xS2[(r0 >> 16) & 0xff] ^
532
+ @xS3[(r0 >> 24) & 0xff]
533
+ t1 = @xS0[(r1 >> 24) & 0xff] ^
534
+ @xS1[r1 & 0xff] ^
535
+ @xS2[(r1 >> 8) & 0xff] ^
536
+ @xS3[(r1 >> 16) & 0xff]
537
+
538
+ r2 ^= 0xffffffff & (t0 + t1 + @k[8])
539
+ r2 = (r2 >> 1 & 0x7fffffff) | (r2 & 0x1) << 31
540
+
541
+ r3 = ((r3 >> 31) & 1) | (r3 & 0x7fffffff) << 1
542
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[9])
543
+
544
+ t0 = @xS0[r2 & 0xff] ^
545
+ @xS1[(r2 >> 8) & 0xff] ^
546
+ @xS2[(r2 >> 16) & 0xff] ^
547
+ @xS3[(r2 >> 24) & 0xff]
548
+ t1 = @xS0[(r3 >> 24) & 0xff] ^
549
+ @xS1[r3 & 0xff] ^
550
+ @xS2[(r3 >> 8) & 0xff] ^
551
+ @xS3[(r3 >> 16) & 0xff]
552
+
553
+ r0 ^= 0xffffffff & (t0 + t1 + @k[10])
554
+ r0 = (r0 >> 1 & 0x7fffffff) | (r0 & 0x1) << 31
555
+
556
+ r1 = ((r1 >> 31) & 1) | (r1 & 0x7fffffff) << 1
557
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[11])
541
558
 
542
559
  # i = 1
543
- t0 = xS0[r0 & 0xff] ^
544
- xS1[(r0 >> 8) & 0xff] ^
545
- xS2[(r0 >> 16) & 0xff] ^
546
- xS3[(r0 >> 24) & 0xff]
547
- t1 = xS0[(r1 >> 24) & 0xff] ^
548
- xS1[r1 & 0xff] ^
549
- xS2[(r1 >> 8) & 0xff] ^
550
- xS3[(r1 >> 16) & 0xff]
551
-
552
- r2 ^= mask32(t0 + t1 + k[12])
553
- r2 = (r2 >> 1 & 0x7fffffff) | mask32(r2 << 31)
554
-
555
- r3 = ((r3 >> 31) & 1) | mask32(r3 << 1)
556
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[13])
557
-
558
- t0 = xS0[r2 & 0xff] ^
559
- xS1[(r2 >> 8) & 0xff] ^
560
- xS2[(r2 >> 16) & 0xff] ^
561
- xS3[(r2 >> 24) & 0xff]
562
- t1 = xS0[(r3 >> 24) & 0xff] ^
563
- xS1[r3 & 0xff] ^
564
- xS2[(r3 >> 8) & 0xff] ^
565
- xS3[(r3 >> 16) & 0xff]
566
-
567
- r0 ^= mask32(t0 + t1 + k[14])
568
- r0 = (r0 >> 1 & 0x7fffffff) | mask32(r0 << 31)
569
-
570
- r1 = ((r1 >> 31) & 1) | mask32(r1 << 1)
571
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[15])
560
+ t0 = @xS0[r0 & 0xff] ^
561
+ @xS1[(r0 >> 8) & 0xff] ^
562
+ @xS2[(r0 >> 16) & 0xff] ^
563
+ @xS3[(r0 >> 24) & 0xff]
564
+ t1 = @xS0[(r1 >> 24) & 0xff] ^
565
+ @xS1[r1 & 0xff] ^
566
+ @xS2[(r1 >> 8) & 0xff] ^
567
+ @xS3[(r1 >> 16) & 0xff]
568
+
569
+ r2 ^= 0xffffffff & (t0 + t1 + @k[12])
570
+ r2 = (r2 >> 1 & 0x7fffffff) | (r2 & 0x1) << 31
571
+
572
+ r3 = ((r3 >> 31) & 1) | (r3 & 0x7fffffff) << 1
573
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[13])
574
+
575
+ t0 = @xS0[r2 & 0xff] ^
576
+ @xS1[(r2 >> 8) & 0xff] ^
577
+ @xS2[(r2 >> 16) & 0xff] ^
578
+ @xS3[(r2 >> 24) & 0xff]
579
+ t1 = @xS0[(r3 >> 24) & 0xff] ^
580
+ @xS1[r3 & 0xff] ^
581
+ @xS2[(r3 >> 8) & 0xff] ^
582
+ @xS3[(r3 >> 16) & 0xff]
583
+
584
+ r0 ^= 0xffffffff & (t0 + t1 + @k[14])
585
+ r0 = (r0 >> 1 & 0x7fffffff) | (r0 & 0x1) << 31
586
+
587
+ r1 = ((r1 >> 31) & 1) | (r1 & 0x7fffffff) << 1
588
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[15])
572
589
 
573
590
  # i = 2
574
- t0 = xS0[r0 & 0xff] ^
575
- xS1[(r0 >> 8) & 0xff] ^
576
- xS2[(r0 >> 16) & 0xff] ^
577
- xS3[(r0 >> 24) & 0xff]
578
- t1 = xS0[(r1 >> 24) & 0xff] ^
579
- xS1[r1 & 0xff] ^
580
- xS2[(r1 >> 8) & 0xff] ^
581
- xS3[(r1 >> 16) & 0xff]
582
-
583
- r2 ^= mask32(t0 + t1 + k[16])
584
- r2 = (r2 >> 1 & 0x7fffffff) | mask32(r2 << 31)
585
-
586
- r3 = ((r3 >> 31) & 1) | mask32(r3 << 1)
587
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[17])
588
-
589
- t0 = xS0[r2 & 0xff] ^
590
- xS1[(r2 >> 8) & 0xff] ^
591
- xS2[(r2 >> 16) & 0xff] ^
592
- xS3[(r2 >> 24) & 0xff]
593
- t1 = xS0[(r3 >> 24) & 0xff] ^
594
- xS1[r3 & 0xff] ^
595
- xS2[(r3 >> 8) & 0xff] ^
596
- xS3[(r3 >> 16) & 0xff]
597
-
598
- r0 ^= mask32(t0 + t1 + k[18])
599
- r0 = (r0 >> 1 & 0x7fffffff) | mask32(r0 << 31)
600
-
601
- r1 = ((r1 >> 31) & 1) | mask32(r1 << 1)
602
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[19])
591
+ t0 = @xS0[r0 & 0xff] ^
592
+ @xS1[(r0 >> 8) & 0xff] ^
593
+ @xS2[(r0 >> 16) & 0xff] ^
594
+ @xS3[(r0 >> 24) & 0xff]
595
+ t1 = @xS0[(r1 >> 24) & 0xff] ^
596
+ @xS1[r1 & 0xff] ^
597
+ @xS2[(r1 >> 8) & 0xff] ^
598
+ @xS3[(r1 >> 16) & 0xff]
599
+
600
+ r2 ^= 0xffffffff & (t0 + t1 + @k[16])
601
+ r2 = (r2 >> 1 & 0x7fffffff) | (r2 & 0x1) << 31
602
+
603
+ r3 = ((r3 >> 31) & 1) | (r3 & 0x7fffffff) << 1
604
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[17])
605
+
606
+ t0 = @xS0[r2 & 0xff] ^
607
+ @xS1[(r2 >> 8) & 0xff] ^
608
+ @xS2[(r2 >> 16) & 0xff] ^
609
+ @xS3[(r2 >> 24) & 0xff]
610
+ t1 = @xS0[(r3 >> 24) & 0xff] ^
611
+ @xS1[r3 & 0xff] ^
612
+ @xS2[(r3 >> 8) & 0xff] ^
613
+ @xS3[(r3 >> 16) & 0xff]
614
+
615
+ r0 ^= 0xffffffff & (t0 + t1 + @k[18])
616
+ r0 = (r0 >> 1 & 0x7fffffff) | (r0 & 0x1) << 31
617
+
618
+ r1 = ((r1 >> 31) & 1) | (r1 & 0x7fffffff) << 1
619
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[19])
603
620
 
604
621
  # i = 3
605
- t0 = xS0[r0 & 0xff] ^
606
- xS1[(r0 >> 8) & 0xff] ^
607
- xS2[(r0 >> 16) & 0xff] ^
608
- xS3[(r0 >> 24) & 0xff]
609
- t1 = xS0[(r1 >> 24) & 0xff] ^
610
- xS1[r1 & 0xff] ^
611
- xS2[(r1 >> 8) & 0xff] ^
612
- xS3[(r1 >> 16) & 0xff]
613
-
614
- r2 ^= mask32(t0 + t1 + k[20])
615
- r2 = (r2 >> 1 & 0x7fffffff) | mask32(r2 << 31)
616
-
617
- r3 = ((r3 >> 31) & 1) | mask32(r3 << 1)
618
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[21])
619
-
620
- t0 = xS0[r2 & 0xff] ^
621
- xS1[(r2 >> 8) & 0xff] ^
622
- xS2[(r2 >> 16) & 0xff] ^
623
- xS3[(r2 >> 24) & 0xff]
624
- t1 = xS0[(r3 >> 24) & 0xff] ^
625
- xS1[r3 & 0xff] ^
626
- xS2[(r3 >> 8) & 0xff] ^
627
- xS3[(r3 >> 16) & 0xff]
628
-
629
- r0 ^= mask32(t0 + t1 + k[22])
630
- r0 = (r0 >> 1 & 0x7fffffff) | mask32(r0 << 31)
631
-
632
- r1 = ((r1 >> 31) & 1) | mask32(r1 << 1)
633
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[23])
622
+ t0 = @xS0[r0 & 0xff] ^
623
+ @xS1[(r0 >> 8) & 0xff] ^
624
+ @xS2[(r0 >> 16) & 0xff] ^
625
+ @xS3[(r0 >> 24) & 0xff]
626
+ t1 = @xS0[(r1 >> 24) & 0xff] ^
627
+ @xS1[r1 & 0xff] ^
628
+ @xS2[(r1 >> 8) & 0xff] ^
629
+ @xS3[(r1 >> 16) & 0xff]
630
+
631
+ r2 ^= 0xffffffff & (t0 + t1 + @k[20])
632
+ r2 = (r2 >> 1 & 0x7fffffff) | (r2 & 0x1) << 31
633
+
634
+ r3 = ((r3 >> 31) & 1) | ((r3 & 0x7fffffff) << 1)
635
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[21])
636
+
637
+ t0 = @xS0[r2 & 0xff] ^
638
+ @xS1[(r2 >> 8) & 0xff] ^
639
+ @xS2[(r2 >> 16) & 0xff] ^
640
+ @xS3[(r2 >> 24) & 0xff]
641
+ t1 = @xS0[(r3 >> 24) & 0xff] ^
642
+ @xS1[r3 & 0xff] ^
643
+ @xS2[(r3 >> 8) & 0xff] ^
644
+ @xS3[(r3 >> 16) & 0xff]
645
+
646
+ r0 ^= 0xffffffff & (t0 + t1 + @k[22])
647
+ r0 = (r0 >> 1 & 0x7fffffff) | (r0 & 0x1) << 31
648
+
649
+ r1 = ((r1 >> 31) & 1) | (r1 & 0x7fffffff) << 1
650
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[23])
634
651
 
635
652
  # i = 4
636
- t0 = xS0[r0 & 0xff] ^
637
- xS1[(r0 >> 8) & 0xff] ^
638
- xS2[(r0 >> 16) & 0xff] ^
639
- xS3[(r0 >> 24) & 0xff]
640
- t1 = xS0[(r1 >> 24) & 0xff] ^
641
- xS1[r1 & 0xff] ^
642
- xS2[(r1 >> 8) & 0xff] ^
643
- xS3[(r1 >> 16) & 0xff]
644
-
645
- r2 ^= mask32(t0 + t1 + k[24])
646
- r2 = (r2 >> 1 & 0x7fffffff) | mask32(r2 << 31)
647
-
648
- r3 = ((r3 >> 31) & 1) | mask32(r3 << 1)
649
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[25])
650
-
651
- t0 = xS0[r2 & 0xff] ^
652
- xS1[(r2 >> 8) & 0xff] ^
653
- xS2[(r2 >> 16) & 0xff] ^
654
- xS3[(r2 >> 24) & 0xff]
655
- t1 = xS0[(r3 >> 24) & 0xff] ^
656
- xS1[r3 & 0xff] ^
657
- xS2[(r3 >> 8) & 0xff] ^
658
- xS3[(r3 >> 16) & 0xff]
659
-
660
- r0 ^= mask32(t0 + t1 + k[26])
661
- r0 = (r0 >> 1 & 0x7fffffff) | mask32(r0 << 31);
662
-
663
- r1 = ((r1 >> 31) & 1) | mask32(r1 << 1)
664
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[27])
653
+ t0 = @xS0[r0 & 0xff] ^
654
+ @xS1[(r0 >> 8) & 0xff] ^
655
+ @xS2[(r0 >> 16) & 0xff] ^
656
+ @xS3[(r0 >> 24) & 0xff]
657
+ t1 = @xS0[(r1 >> 24) & 0xff] ^
658
+ @xS1[r1 & 0xff] ^
659
+ @xS2[(r1 >> 8) & 0xff] ^
660
+ @xS3[(r1 >> 16) & 0xff]
661
+
662
+ r2 ^= 0xffffffff & (t0 + t1 + @k[24])
663
+ r2 = (r2 >> 1 & 0x7fffffff) | (r2 & 0x1) << 31
664
+
665
+ r3 = ((r3 >> 31) & 1) | (r3 & 0x7fffffff) << 1
666
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[25])
667
+
668
+ t0 = @xS0[r2 & 0xff] ^
669
+ @xS1[(r2 >> 8) & 0xff] ^
670
+ @xS2[(r2 >> 16) & 0xff] ^
671
+ @xS3[(r2 >> 24) & 0xff]
672
+ t1 = @xS0[(r3 >> 24) & 0xff] ^
673
+ @xS1[r3 & 0xff] ^
674
+ @xS2[(r3 >> 8) & 0xff] ^
675
+ @xS3[(r3 >> 16) & 0xff]
676
+
677
+ r0 ^= 0xffffffff & (t0 + t1 + @k[26])
678
+ r0 = (r0 >> 1 & 0x7fffffff) | (r0 & 0x1) << 31
679
+
680
+ r1 = ((r1 >> 31) & 1) | ((r1 & 0x7fffffff) << 1)
681
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[27])
665
682
 
666
683
  # i = 5
667
- t0 = xS0[r0 & 0xff] ^
668
- xS1[(r0 >> 8) & 0xff] ^
669
- xS2[(r0 >> 16) & 0xff] ^
670
- xS3[(r0 >> 24) & 0xff]
671
- t1 = xS0[(r1 >> 24) & 0xff] ^
672
- xS1[r1 & 0xff] ^
673
- xS2[(r1 >> 8) & 0xff] ^
674
- xS3[(r1 >> 16) & 0xff]
675
-
676
- r2 ^= mask32(t0 + t1 + k[28])
677
- r2 = (r2 >> 1 & 0x7fffffff) | mask32(r2 << 31)
678
-
679
- r3 = ((r3 >> 31) & 1) | mask32(r3 << 1)
680
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[29])
681
-
682
- t0 = xS0[r2 & 0xff] ^
683
- xS1[(r2 >> 8) & 0xff] ^
684
- xS2[(r2 >> 16) & 0xff] ^
685
- xS3[(r2 >> 24) & 0xff]
686
- t1 = xS0[(r3 >> 24) & 0xff] ^
687
- xS1[r3 & 0xff] ^
688
- xS2[(r3 >> 8) & 0xff] ^
689
- xS3[(r3 >> 16) & 0xff]
690
-
691
- r0 ^= mask32(t0 + t1 + k[30])
692
- r0 = (r0 >> 1 & 0x7fffffff) | mask32(r0 << 31)
693
-
694
- r1 = ((r1 >> 31) & 1) | mask32(r1 << 1)
695
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[31])
684
+ t0 = @xS0[r0 & 0xff] ^
685
+ @xS1[(r0 >> 8) & 0xff] ^
686
+ @xS2[(r0 >> 16) & 0xff] ^
687
+ @xS3[(r0 >> 24) & 0xff]
688
+ t1 = @xS0[(r1 >> 24) & 0xff] ^
689
+ @xS1[r1 & 0xff] ^
690
+ @xS2[(r1 >> 8) & 0xff] ^
691
+ @xS3[(r1 >> 16) & 0xff]
692
+
693
+ r2 ^= 0xffffffff & (t0 + t1 + @k[28])
694
+ r2 = (r2 >> 1 & 0x7fffffff) | (r2 & 0x1) << 31
695
+
696
+ r3 = ((r3 >> 31) & 1) | (r3 & 0x7fffffff) << 1
697
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[29])
698
+
699
+ t0 = @xS0[r2 & 0xff] ^
700
+ @xS1[(r2 >> 8) & 0xff] ^
701
+ @xS2[(r2 >> 16) & 0xff] ^
702
+ @xS3[(r2 >> 24) & 0xff]
703
+ t1 = @xS0[(r3 >> 24) & 0xff] ^
704
+ @xS1[r3 & 0xff] ^
705
+ @xS2[(r3 >> 8) & 0xff] ^
706
+ @xS3[(r3 >> 16) & 0xff]
707
+
708
+ r0 ^= 0xffffffff & (t0 + t1 + @k[30])
709
+ r0 = (r0 >> 1 & 0x7fffffff) | (r0 & 0x1) << 31
710
+
711
+ r1 = ((r1 >> 31) & 1) | (r1 & 0x7fffffff) << 1
712
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[31])
696
713
 
697
714
  # i = 6
698
- t0 = xS0[r0 & 0xff] ^
699
- xS1[(r0 >> 8) & 0xff] ^
700
- xS2[(r0 >> 16) & 0xff] ^
701
- xS3[(r0 >> 24) & 0xff]
702
- t1 = xS0[(r1 >> 24) & 0xff] ^
703
- xS1[r1 & 0xff] ^
704
- xS2[(r1 >> 8) & 0xff] ^
705
- xS3[(r1 >> 16) & 0xff]
706
-
707
- r2 ^= mask32(t0 + t1 + k[32])
708
- r2 = (r2 >> 1 & 0x7fffffff) | mask32(r2 << 31)
709
-
710
- r3 = ((r3 >> 31) & 1) | mask32(r3 << 1)
711
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[33])
712
-
713
- t0 = xS0[r2 & 0xff] ^
714
- xS1[(r2 >> 8) & 0xff] ^
715
- xS2[(r2 >> 16) & 0xff] ^
716
- xS3[(r2 >> 24) & 0xff]
717
- t1 = xS0[(r3 >> 24) & 0xff] ^
718
- xS1[r3 & 0xff] ^
719
- xS2[(r3 >> 8) & 0xff] ^
720
- xS3[(r3 >> 16) & 0xff]
721
-
722
- r0 ^= mask32(t0 + t1 + k[34])
723
- r0 = (r0 >> 1 & 0x7fffffff) | mask32(r0 << 31)
724
-
725
- r1 = ((r1 >> 31) & 1) | mask32(r1 << 1)
726
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[35])
715
+ t0 = @xS0[r0 & 0xff] ^
716
+ @xS1[(r0 >> 8) & 0xff] ^
717
+ @xS2[(r0 >> 16) & 0xff] ^
718
+ @xS3[(r0 >> 24) & 0xff]
719
+ t1 = @xS0[(r1 >> 24) & 0xff] ^
720
+ @xS1[r1 & 0xff] ^
721
+ @xS2[(r1 >> 8) & 0xff] ^
722
+ @xS3[(r1 >> 16) & 0xff]
723
+
724
+ r2 ^= 0xffffffff & (t0 + t1 + @k[32])
725
+ r2 = (r2 >> 1 & 0x7fffffff) | (r2 & 0x1) << 31
726
+
727
+ r3 = ((r3 >> 31) & 1) | (r3 & 0x7fffffff) << 1
728
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[33])
729
+
730
+ t0 = @xS0[r2 & 0xff] ^
731
+ @xS1[(r2 >> 8) & 0xff] ^
732
+ @xS2[(r2 >> 16) & 0xff] ^
733
+ @xS3[(r2 >> 24) & 0xff]
734
+ t1 = @xS0[(r3 >> 24) & 0xff] ^
735
+ @xS1[r3 & 0xff] ^
736
+ @xS2[(r3 >> 8) & 0xff] ^
737
+ @xS3[(r3 >> 16) & 0xff]
738
+
739
+ r0 ^= 0xffffffff & (t0 + t1 + @k[34])
740
+ r0 = (r0 >> 1 & 0x7fffffff) | (r0 & 0x1) << 31
741
+
742
+ r1 = ((r1 >> 31) & 1) | (r1 & 0x7fffffff) << 1
743
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[35])
727
744
 
728
745
  # i = 7
729
- t0 = xS0[r0 & 0xff] ^
730
- xS1[(r0 >> 8) & 0xff] ^
731
- xS2[(r0 >> 16) & 0xff] ^
732
- xS3[(r0 >> 24) & 0xff]
733
- t1 = xS0[(r1 >> 24) & 0xff] ^
734
- xS1[r1 & 0xff] ^
735
- xS2[(r1 >> 8) & 0xff] ^
736
- xS3[(r1 >> 16) & 0xff]
737
-
738
- r2 ^= mask32(t0 + t1 + k[36])
739
- r2 = (r2 >> 1 & 0x7fffffff) | mask32(r2 << 31)
740
-
741
- r3 = ((r3 >> 31) & 1) | mask32(r3 << 1)
742
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[37])
743
-
744
- t0 = xS0[r2 & 0xff] ^
745
- xS1[(r2 >> 8) & 0xff] ^
746
- xS2[(r2 >> 16) & 0xff] ^
747
- xS3[(r2 >> 24) & 0xff]
748
- t1 = xS0[(r3 >> 24) & 0xff] ^
749
- xS1[r3 & 0xff] ^
750
- xS2[(r3 >> 8) & 0xff] ^
751
- xS3[(r3 >> 16) & 0xff]
752
-
753
- r0 ^= mask32(t0 + t1 + k[38])
754
- r0 = (r0 >> 1 & 0x7fffffff) | mask32(r0 << 31)
755
-
756
- r1 = ((r1 >> 31) & 1) | mask32(r1 << 1)
757
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[39])
758
-
759
- [k[4] ^ r2, k[5] ^ r3, k[6] ^ r0, k[7] ^ r1].pack("V4")
746
+ t0 = @xS0[r0 & 0xff] ^
747
+ @xS1[(r0 >> 8) & 0xff] ^
748
+ @xS2[(r0 >> 16) & 0xff] ^
749
+ @xS3[(r0 >> 24) & 0xff]
750
+ t1 = @xS0[(r1 >> 24) & 0xff] ^
751
+ @xS1[r1 & 0xff] ^
752
+ @xS2[(r1 >> 8) & 0xff] ^
753
+ @xS3[(r1 >> 16) & 0xff]
754
+
755
+ r2 ^= 0xffffffff & (t0 + t1 + @k[36])
756
+ r2 = (r2 >> 1 & 0x7fffffff) | (r2 & 0x1) << 31
757
+
758
+ r3 = ((r3 >> 31) & 1) | (r3 & 0x7fffffff) << 1
759
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[37])
760
+
761
+ t0 = @xS0[r2 & 0xff] ^
762
+ @xS1[(r2 >> 8) & 0xff] ^
763
+ @xS2[(r2 >> 16) & 0xff] ^
764
+ @xS3[(r2 >> 24) & 0xff]
765
+ t1 = @xS0[(r3 >> 24) & 0xff] ^
766
+ @xS1[r3 & 0xff] ^
767
+ @xS2[(r3 >> 8) & 0xff] ^
768
+ @xS3[(r3 >> 16) & 0xff]
769
+
770
+ r0 ^= 0xffffffff & (t0 + t1 + @k[38])
771
+ r0 = (r0 >> 1 & 0x7fffffff) | (r0 & 0x1) << 31
772
+
773
+ r1 = ((r1 >> 31) & 1) | (r1 & 0x7fffffff) << 1
774
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[39])
775
+
776
+ [@k[4] ^ r2, @k[5] ^ r3, @k[6] ^ r0, @k[7] ^ r1].pack("V4")
760
777
  end
761
778
 
762
779
  # Decrypt a single block (16 bytes).
763
780
  def decrypt_block(plain)
764
- words = plain.unpack("V4")
765
- k = @k
766
781
 
767
- r0 = k[4] ^ words[0]
768
- r1 = k[5] ^ words[1]
769
- r2 = k[6] ^ words[2]
770
- r3 = k[7] ^ words[3]
782
+ words = plain.unpack("V4")
771
783
 
772
- xS0, xS1, xS2, xS3 = *@s
784
+ r0 = @k[4] ^ words[0]
785
+ r1 = @k[5] ^ words[1]
786
+ r2 = @k[6] ^ words[2]
787
+ r3 = @k[7] ^ words[3]
773
788
 
774
789
  # i = 7
775
- t0 = xS0[r0 & 0xff] ^
776
- xS1[r0 >> 8 & 0xff] ^
777
- xS2[r0 >> 16 & 0xff] ^
778
- xS3[r0 >> 24 & 0xff]
779
- t1 = xS0[r1 >> 24 & 0xff] ^
780
- xS1[r1 & 0xff] ^
781
- xS2[r1 >> 8 & 0xff] ^
782
- xS3[r1 >> 16 & 0xff]
783
-
784
- r2 = r2 >> 31 & 0x1 | mask32(r2 << 1)
785
- r2 ^= mask32(t0 + t1 + k[38])
786
-
787
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[39])
788
- r3 = r3 >> 1 & 0x7fffffff | mask32(r3 << 31)
789
-
790
- t0 = xS0[r2 & 0xff] ^
791
- xS1[r2 >> 8 & 0xff] ^
792
- xS2[r2 >> 16 & 0xff] ^
793
- xS3[r2 >> 24 & 0xff]
794
- t1 = xS0[r3 >> 24 & 0xff] ^
795
- xS1[r3 & 0xff] ^
796
- xS2[r3 >> 8 & 0xff] ^
797
- xS3[r3 >> 16 & 0xff]
798
-
799
- r0 = r0 >> 31 & 0x1 | mask32(r0 << 1)
800
- r0 ^= mask32(t0 + t1 + k[36])
801
-
802
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[37])
803
- r1 = r1 >> 1 & 0x7fffffff | mask32(r1 << 31)
790
+ t0 = @xS0[r0 & 0xff] ^
791
+ @xS1[r0 >> 8 & 0xff] ^
792
+ @xS2[r0 >> 16 & 0xff] ^
793
+ @xS3[r0 >> 24 & 0xff]
794
+ t1 = @xS0[r1 >> 24 & 0xff] ^
795
+ @xS1[r1 & 0xff] ^
796
+ @xS2[r1 >> 8 & 0xff] ^
797
+ @xS3[r1 >> 16 & 0xff]
798
+
799
+ r2 = r2 >> 31 & 0x1 | (r2 & 0x7fffffff) << 1
800
+ r2 ^= 0xffffffff & (t0 + t1 + @k[38])
801
+
802
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[39])
803
+ r3 = r3 >> 1 & 0x7fffffff | (r3 & 0x1) << 31
804
+
805
+ t0 = @xS0[r2 & 0xff] ^
806
+ @xS1[r2 >> 8 & 0xff] ^
807
+ @xS2[r2 >> 16 & 0xff] ^
808
+ @xS3[r2 >> 24 & 0xff]
809
+ t1 = @xS0[r3 >> 24 & 0xff] ^
810
+ @xS1[r3 & 0xff] ^
811
+ @xS2[r3 >> 8 & 0xff] ^
812
+ @xS3[r3 >> 16 & 0xff]
813
+
814
+ r0 = r0 >> 31 & 0x1 | (r0 & 0x7fffffff) << 1
815
+ r0 ^= 0xffffffff & (t0 + t1 + @k[36])
816
+
817
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[37])
818
+ r1 = r1 >> 1 & 0x7fffffff | (r1 & 0x1) << 31
804
819
 
805
820
  # i = 6
806
- t0 = xS0[r0 & 0xff] ^
807
- xS1[r0 >> 8 & 0xff] ^
808
- xS2[r0 >> 16 & 0xff] ^
809
- xS3[r0 >> 24 & 0xff]
810
- t1 = xS0[r1 >> 24 & 0xff] ^
811
- xS1[r1 & 0xff] ^
812
- xS2[r1 >> 8 & 0xff] ^
813
- xS3[r1 >> 16 & 0xff]
814
-
815
- r2 = r2 >> 31 & 0x1 | mask32(r2 << 1)
816
- r2 ^= mask32(t0 + t1 + k[34])
817
-
818
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[35])
819
- r3 = r3 >> 1 & 0x7fffffff | mask32(r3 << 31)
820
-
821
- t0 = xS0[r2 & 0xff] ^
822
- xS1[r2 >> 8 & 0xff] ^
823
- xS2[r2 >> 16 & 0xff] ^
824
- xS3[r2 >> 24 & 0xff]
825
- t1 = xS0[r3 >> 24 & 0xff] ^
826
- xS1[r3 & 0xff] ^
827
- xS2[r3 >> 8 & 0xff] ^
828
- xS3[r3 >> 16 & 0xff]
829
-
830
- r0 = r0 >> 31 & 0x1 | mask32(r0 << 1)
831
- r0 ^= mask32(t0 + t1 + k[32])
832
-
833
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[33])
834
- r1 = r1 >> 1 & 0x7fffffff | mask32(r1 << 31)
821
+ t0 = @xS0[r0 & 0xff] ^
822
+ @xS1[r0 >> 8 & 0xff] ^
823
+ @xS2[r0 >> 16 & 0xff] ^
824
+ @xS3[r0 >> 24 & 0xff]
825
+ t1 = @xS0[r1 >> 24 & 0xff] ^
826
+ @xS1[r1 & 0xff] ^
827
+ @xS2[r1 >> 8 & 0xff] ^
828
+ @xS3[r1 >> 16 & 0xff]
829
+
830
+ r2 = r2 >> 31 & 0x1 | (r2 & 0x7fffffff) << 1
831
+ r2 ^= 0xffffffff & (t0 + t1 + @k[34])
832
+
833
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[35])
834
+ r3 = r3 >> 1 & 0x7fffffff | (r3 & 0x1) << 31
835
+
836
+ t0 = @xS0[r2 & 0xff] ^
837
+ @xS1[r2 >> 8 & 0xff] ^
838
+ @xS2[r2 >> 16 & 0xff] ^
839
+ @xS3[r2 >> 24 & 0xff]
840
+ t1 = @xS0[r3 >> 24 & 0xff] ^
841
+ @xS1[r3 & 0xff] ^
842
+ @xS2[r3 >> 8 & 0xff] ^
843
+ @xS3[r3 >> 16 & 0xff]
844
+
845
+ r0 = r0 >> 31 & 0x1 | (r0 & 0x7fffffff) << 1
846
+ r0 ^= 0xffffffff & (t0 + t1 + @k[32])
847
+
848
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[33])
849
+ r1 = r1 >> 1 & 0x7fffffff | (r1 & 0x1) << 31
835
850
 
836
851
  # i = 5
837
- t0 = xS0[r0 & 0xff] ^
838
- xS1[r0 >> 8 & 0xff] ^
839
- xS2[r0 >> 16 & 0xff] ^
840
- xS3[r0 >> 24 & 0xff]
841
- t1 = xS0[r1 >> 24 & 0xff] ^
842
- xS1[r1 & 0xff] ^
843
- xS2[r1 >> 8 & 0xff] ^
844
- xS3[r1 >> 16 & 0xff]
845
-
846
- r2 = r2 >> 31 & 0x1 | mask32(r2 << 1)
847
- r2 ^= mask32(t0 + t1 + k[30])
848
-
849
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[31])
850
- r3 = r3 >> 1 & 0x7fffffff | mask32(r3 << 31)
851
-
852
- t0 = xS0[r2 & 0xff] ^
853
- xS1[r2 >> 8 & 0xff] ^
854
- xS2[r2 >> 16 & 0xff] ^
855
- xS3[r2 >> 24 & 0xff]
856
- t1 = xS0[r3 >> 24 & 0xff] ^
857
- xS1[r3 & 0xff] ^
858
- xS2[r3 >> 8 & 0xff] ^
859
- xS3[r3 >> 16 & 0xff]
860
-
861
- r0 = r0 >> 31 & 0x1 | mask32(r0 << 1)
862
- r0 ^= mask32(t0 + t1 + k[28])
863
-
864
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[29])
865
- r1 = r1 >> 1 & 0x7fffffff | mask32(r1 << 31)
852
+ t0 = @xS0[r0 & 0xff] ^
853
+ @xS1[r0 >> 8 & 0xff] ^
854
+ @xS2[r0 >> 16 & 0xff] ^
855
+ @xS3[r0 >> 24 & 0xff]
856
+ t1 = @xS0[r1 >> 24 & 0xff] ^
857
+ @xS1[r1 & 0xff] ^
858
+ @xS2[r1 >> 8 & 0xff] ^
859
+ @xS3[r1 >> 16 & 0xff]
860
+
861
+ r2 = r2 >> 31 & 0x1 | (r2 & 0x7fffffff) << 1
862
+ r2 ^= 0xffffffff & (t0 + t1 + @k[30])
863
+
864
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[31])
865
+ r3 = r3 >> 1 & 0x7fffffff | (r3 & 0x1) << 31
866
+
867
+ t0 = @xS0[r2 & 0xff] ^
868
+ @xS1[r2 >> 8 & 0xff] ^
869
+ @xS2[r2 >> 16 & 0xff] ^
870
+ @xS3[r2 >> 24 & 0xff]
871
+ t1 = @xS0[r3 >> 24 & 0xff] ^
872
+ @xS1[r3 & 0xff] ^
873
+ @xS2[r3 >> 8 & 0xff] ^
874
+ @xS3[r3 >> 16 & 0xff]
875
+
876
+ r0 = r0 >> 31 & 0x1 | (r0 & 0x7fffffff) << 1
877
+ r0 ^= 0xffffffff & (t0 + t1 + @k[28])
878
+
879
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[29])
880
+ r1 = r1 >> 1 & 0x7fffffff | (r1 & 0x1) << 31
866
881
 
867
882
  # i = 4
868
- t0 = xS0[r0 & 0xff] ^
869
- xS1[r0 >> 8 & 0xff] ^
870
- xS2[r0 >> 16 & 0xff] ^
871
- xS3[r0 >> 24 & 0xff]
872
- t1 = xS0[r1 >> 24 & 0xff] ^
873
- xS1[r1 & 0xff] ^
874
- xS2[r1 >> 8 & 0xff] ^
875
- xS3[r1 >> 16 & 0xff]
876
-
877
- r2 = r2 >> 31 & 0x1 | mask32(r2 << 1)
878
- r2 ^= mask32(t0 + t1 + k[26])
879
-
880
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[27])
881
- r3 = r3 >> 1 & 0x7fffffff | mask32(r3 << 31)
882
-
883
- t0 = xS0[r2 & 0xff] ^
884
- xS1[r2 >> 8 & 0xff] ^
885
- xS2[r2 >> 16 & 0xff] ^
886
- xS3[r2 >> 24 & 0xff]
887
- t1 = xS0[r3 >> 24 & 0xff] ^
888
- xS1[r3 & 0xff] ^
889
- xS2[r3 >> 8 & 0xff] ^
890
- xS3[r3 >> 16 & 0xff]
891
-
892
- r0 = r0 >> 31 & 0x1 | mask32(r0 << 1)
893
- r0 ^= mask32(t0 + t1 + k[24])
894
-
895
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[25])
896
- r1 = r1 >> 1 & 0x7fffffff | mask32(r1 << 31)
897
-
883
+ t0 = @xS0[r0 & 0xff] ^
884
+ @xS1[r0 >> 8 & 0xff] ^
885
+ @xS2[r0 >> 16 & 0xff] ^
886
+ @xS3[r0 >> 24 & 0xff]
887
+ t1 = @xS0[r1 >> 24 & 0xff] ^
888
+ @xS1[r1 & 0xff] ^
889
+ @xS2[r1 >> 8 & 0xff] ^
890
+ @xS3[r1 >> 16 & 0xff]
891
+
892
+ r2 = r2 >> 31 & 0x1 | (r2 & 0x7fffffff) << 1
893
+ r2 ^= 0xffffffff & (t0 + t1 + @k[26])
894
+
895
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[27])
896
+ r3 = r3 >> 1 & 0x7fffffff | (r3 & 0x1) << 31
897
+
898
+ t0 = @xS0[r2 & 0xff] ^
899
+ @xS1[r2 >> 8 & 0xff] ^
900
+ @xS2[r2 >> 16 & 0xff] ^
901
+ @xS3[r2 >> 24 & 0xff]
902
+ t1 = @xS0[r3 >> 24 & 0xff] ^
903
+ @xS1[r3 & 0xff] ^
904
+ @xS2[r3 >> 8 & 0xff] ^
905
+ @xS3[r3 >> 16 & 0xff]
906
+
907
+ r0 = r0 >> 31 & 0x1 | (r0 & 0x7fffffff) << 1
908
+ r0 ^= 0xffffffff & (t0 + t1 + @k[24])
909
+
910
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[25])
911
+ r1 = r1 >> 1 & 0x7fffffff | (r1 & 0x1) << 31
898
912
 
899
913
  # i = 3
900
- t0 = xS0[r0 & 0xff] ^
901
- xS1[r0 >> 8 & 0xff] ^
902
- xS2[r0 >> 16 & 0xff] ^
903
- xS3[r0 >> 24 & 0xff]
904
- t1 = xS0[r1 >> 24 & 0xff] ^
905
- xS1[r1 & 0xff] ^
906
- xS2[r1 >> 8 & 0xff] ^
907
- xS3[r1 >> 16 & 0xff]
908
-
909
- r2 = r2 >> 31 & 0x1 | mask32(r2 << 1)
910
- r2 ^= mask32(t0 + t1 + k[22])
911
-
912
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[23])
913
- r3 = r3 >> 1 & 0x7fffffff | mask32(r3 << 31)
914
-
915
- t0 = xS0[r2 & 0xff] ^
916
- xS1[r2 >> 8 & 0xff] ^
917
- xS2[r2 >> 16 & 0xff] ^
918
- xS3[r2 >> 24 & 0xff]
919
- t1 = xS0[r3 >> 24 & 0xff] ^
920
- xS1[r3 & 0xff] ^
921
- xS2[r3 >> 8 & 0xff] ^
922
- xS3[r3 >> 16 & 0xff]
923
-
924
- r0 = r0 >> 31 & 0x1 | mask32(r0 << 1)
925
- r0 ^= mask32(t0 + t1 + k[20])
926
-
927
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[21])
928
- r1 = r1 >> 1 & 0x7fffffff | mask32(r1 << 31)
914
+ t0 = @xS0[r0 & 0xff] ^
915
+ @xS1[r0 >> 8 & 0xff] ^
916
+ @xS2[r0 >> 16 & 0xff] ^
917
+ @xS3[r0 >> 24 & 0xff]
918
+ t1 = @xS0[r1 >> 24 & 0xff] ^
919
+ @xS1[r1 & 0xff] ^
920
+ @xS2[r1 >> 8 & 0xff] ^
921
+ @xS3[r1 >> 16 & 0xff]
922
+
923
+ r2 = r2 >> 31 & 0x1 | (r2 & 0x7fffffff) << 1
924
+ r2 ^= 0xffffffff & (t0 + t1 + @k[22])
925
+
926
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[23])
927
+ r3 = r3 >> 1 & 0x7fffffff | (r3 & 0x1) << 31
928
+
929
+ t0 = @xS0[r2 & 0xff] ^
930
+ @xS1[r2 >> 8 & 0xff] ^
931
+ @xS2[r2 >> 16 & 0xff] ^
932
+ @xS3[r2 >> 24 & 0xff]
933
+ t1 = @xS0[r3 >> 24 & 0xff] ^
934
+ @xS1[r3 & 0xff] ^
935
+ @xS2[r3 >> 8 & 0xff] ^
936
+ @xS3[r3 >> 16 & 0xff]
937
+
938
+ r0 = r0 >> 31 & 0x1 | (r0 & 0x7fffffff) << 1
939
+ r0 ^= 0xffffffff & (t0 + t1 + @k[20])
940
+
941
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[21])
942
+ r1 = r1 >> 1 & 0x7fffffff | (r1 & 0x1) << 31
929
943
 
930
944
  # i = 2
931
- t0 = xS0[r0 & 0xff] ^
932
- xS1[r0 >> 8 & 0xff] ^
933
- xS2[r0 >> 16 & 0xff] ^
934
- xS3[r0 >> 24 & 0xff]
935
- t1 = xS0[r1 >> 24 & 0xff] ^
936
- xS1[r1 & 0xff] ^
937
- xS2[r1 >> 8 & 0xff] ^
938
- xS3[r1 >> 16 & 0xff]
939
-
940
- r2 = r2 >> 31 & 0x1 | mask32(r2 << 1)
941
- r2 ^= mask32(t0 + t1 + k[18])
942
-
943
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[19])
944
- r3 = r3 >> 1 & 0x7fffffff | mask32(r3 << 31)
945
-
946
- t0 = xS0[r2 & 0xff] ^
947
- xS1[r2 >> 8 & 0xff] ^
948
- xS2[r2 >> 16 & 0xff] ^
949
- xS3[r2 >> 24 & 0xff]
950
- t1 = xS0[r3 >> 24 & 0xff] ^
951
- xS1[r3 & 0xff] ^
952
- xS2[r3 >> 8 & 0xff] ^
953
- xS3[r3 >> 16 & 0xff]
954
-
955
- r0 = r0 >> 31 & 0x1 | mask32(r0 << 1)
956
- r0 ^= mask32(t0 + t1 + k[16])
957
-
958
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[17])
959
- r1 = r1 >> 1 & 0x7fffffff | mask32(r1 << 31)
945
+ t0 = @xS0[r0 & 0xff] ^
946
+ @xS1[r0 >> 8 & 0xff] ^
947
+ @xS2[r0 >> 16 & 0xff] ^
948
+ @xS3[r0 >> 24 & 0xff]
949
+ t1 = @xS0[r1 >> 24 & 0xff] ^
950
+ @xS1[r1 & 0xff] ^
951
+ @xS2[r1 >> 8 & 0xff] ^
952
+ @xS3[r1 >> 16 & 0xff]
953
+
954
+ r2 = r2 >> 31 & 0x1 | (r2 & 0x7fffffff) << 1
955
+ r2 ^= 0xffffffff & (t0 + t1 + @k[18])
956
+
957
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[19])
958
+ r3 = r3 >> 1 & 0x7fffffff | (r3 & 0x1) << 31
959
+
960
+ t0 = @xS0[r2 & 0xff] ^
961
+ @xS1[r2 >> 8 & 0xff] ^
962
+ @xS2[r2 >> 16 & 0xff] ^
963
+ @xS3[r2 >> 24 & 0xff]
964
+ t1 = @xS0[r3 >> 24 & 0xff] ^
965
+ @xS1[r3 & 0xff] ^
966
+ @xS2[r3 >> 8 & 0xff] ^
967
+ @xS3[r3 >> 16 & 0xff]
968
+
969
+ r0 = r0 >> 31 & 0x1 | (r0 & 0x7fffffff) << 1
970
+ r0 ^= 0xffffffff & (t0 + t1 + @k[16])
971
+
972
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[17])
973
+ r1 = r1 >> 1 & 0x7fffffff | (r1 & 0x1) << 31
960
974
 
961
975
  # i = 1
962
- t0 = xS0[r0 & 0xff] ^
963
- xS1[r0 >> 8 & 0xff] ^
964
- xS2[r0 >> 16 & 0xff] ^
965
- xS3[r0 >> 24 & 0xff]
966
- t1 = xS0[r1 >> 24 & 0xff] ^
967
- xS1[r1 & 0xff] ^
968
- xS2[r1 >> 8 & 0xff] ^
969
- xS3[r1 >> 16 & 0xff]
970
-
971
- r2 = r2 >> 31 & 0x1 | mask32(r2 << 1)
972
- r2 ^= mask32(t0 + t1 + k[14])
973
-
974
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[15])
975
- r3 = r3 >> 1 & 0x7fffffff | mask32(r3 << 31)
976
-
977
- t0 = xS0[r2 & 0xff] ^
978
- xS1[r2 >> 8 & 0xff] ^
979
- xS2[r2 >> 16 & 0xff] ^
980
- xS3[r2 >> 24 & 0xff]
981
- t1 = xS0[r3 >> 24 & 0xff] ^
982
- xS1[r3 & 0xff] ^
983
- xS2[r3 >> 8 & 0xff] ^
984
- xS3[r3 >> 16 & 0xff]
985
-
986
- r0 = r0 >> 31 & 0x1 | mask32(r0 << 1)
987
- r0 ^= mask32(t0 + t1 + k[12])
988
-
989
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[13])
990
- r1 = r1 >> 1 & 0x7fffffff | mask32(r1 << 31)
976
+ t0 = @xS0[r0 & 0xff] ^
977
+ @xS1[r0 >> 8 & 0xff] ^
978
+ @xS2[r0 >> 16 & 0xff] ^
979
+ @xS3[r0 >> 24 & 0xff]
980
+ t1 = @xS0[r1 >> 24 & 0xff] ^
981
+ @xS1[r1 & 0xff] ^
982
+ @xS2[r1 >> 8 & 0xff] ^
983
+ @xS3[r1 >> 16 & 0xff]
984
+
985
+ r2 = r2 >> 31 & 0x1 | (r2 & 0x7fffffff) << 1
986
+ r2 ^= 0xffffffff & (t0 + t1 + @k[14])
987
+
988
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[15])
989
+ r3 = r3 >> 1 & 0x7fffffff | (r3 & 0x1) << 31
990
+
991
+ t0 = @xS0[r2 & 0xff] ^
992
+ @xS1[r2 >> 8 & 0xff] ^
993
+ @xS2[r2 >> 16 & 0xff] ^
994
+ @xS3[r2 >> 24 & 0xff]
995
+ t1 = @xS0[r3 >> 24 & 0xff] ^
996
+ @xS1[r3 & 0xff] ^
997
+ @xS2[r3 >> 8 & 0xff] ^
998
+ @xS3[r3 >> 16 & 0xff]
999
+
1000
+ r0 = r0 >> 31 & 0x1 | (r0 & 0x7fffffff) << 1
1001
+ r0 ^= 0xffffffff & (t0 + t1 + @k[12])
1002
+
1003
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[13])
1004
+ r1 = r1 >> 1 & 0x7fffffff | (r1 & 0x1) << 31
991
1005
 
992
1006
  # i = 0
993
- t0 = xS0[r0 & 0xff] ^
994
- xS1[r0 >> 8 & 0xff] ^
995
- xS2[r0 >> 16 & 0xff] ^
996
- xS3[r0 >> 24 & 0xff]
997
- t1 = xS0[r1 >> 24 & 0xff] ^
998
- xS1[r1 & 0xff] ^
999
- xS2[r1 >> 8 & 0xff] ^
1000
- xS3[r1 >> 16 & 0xff]
1001
-
1002
- r2 = r2 >> 31 & 0x1 | mask32(r2 << 1)
1003
- r2 ^= mask32(t0 + t1 + k[10])
1004
-
1005
- r3 ^= mask32(t0 + mask32(t1 << 1) + k[11])
1006
- r3 = r3 >> 1 & 0x7fffffff | mask32(r3 << 31)
1007
-
1008
- t0 = xS0[r2 & 0xff] ^
1009
- xS1[r2 >> 8 & 0xff] ^
1010
- xS2[r2 >> 16 & 0xff] ^
1011
- xS3[r2 >> 24 & 0xff]
1012
- t1 = xS0[r3 >> 24 & 0xff] ^
1013
- xS1[r3 & 0xff] ^
1014
- xS2[r3 >> 8 & 0xff] ^
1015
- xS3[r3 >> 16 & 0xff]
1016
-
1017
- r0 = r0 >> 31 & 0x1 | mask32(r0 << 1)
1018
- r0 ^= mask32(t0 + t1 + k[8])
1019
-
1020
- r1 ^= mask32(t0 + mask32(t1 << 1) + k[9])
1021
- r1 = r1 >> 1 & 0x7fffffff | mask32(r1 << 31)
1022
-
1023
- [mask32(k[0] ^ r2), mask32(k[1] ^ r3), mask32(k[2] ^ r0), mask32(k[3] ^ r1)].pack("V4")
1007
+ t0 = @xS0[r0 & 0xff] ^
1008
+ @xS1[r0 >> 8 & 0xff] ^
1009
+ @xS2[r0 >> 16 & 0xff] ^
1010
+ @xS3[r0 >> 24 & 0xff]
1011
+ t1 = @xS0[r1 >> 24 & 0xff] ^
1012
+ @xS1[r1 & 0xff] ^
1013
+ @xS2[r1 >> 8 & 0xff] ^
1014
+ @xS3[r1 >> 16 & 0xff]
1015
+
1016
+ r2 = r2 >> 31 & 0x1 | (r2 & 0x7fffffff) << 1
1017
+ r2 ^= 0xffffffff & (t0 + t1 + @k[10])
1018
+
1019
+ r3 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[11])
1020
+ r3 = r3 >> 1 & 0x7fffffff | (r3 & 0x1) << 31
1021
+
1022
+ t0 = @xS0[r2 & 0xff] ^
1023
+ @xS1[r2 >> 8 & 0xff] ^
1024
+ @xS2[r2 >> 16 & 0xff] ^
1025
+ @xS3[r2 >> 24 & 0xff]
1026
+ t1 = @xS0[r3 >> 24 & 0xff] ^
1027
+ @xS1[r3 & 0xff] ^
1028
+ @xS2[r3 >> 8 & 0xff] ^
1029
+ @xS3[r3 >> 16 & 0xff]
1030
+
1031
+ r0 = r0 >> 31 & 0x1 | (r0 & 0x7fffffff) << 1
1032
+ r0 ^= 0xffffffff & (t0 + t1 + @k[8])
1033
+
1034
+ r1 ^= 0xffffffff & (t0 + ((t1 & 0x7fffffff) << 1) + @k[9])
1035
+ r1 = r1 >> 1 & 0x7fffffff | (r1 & 0x1) << 31
1036
+
1037
+ [@k[0] ^ r2, @k[1] ^ r3, @k[2] ^ r0, @k[3] ^ r1].pack("V4")
1024
1038
  end
1025
1039
 
1026
1040
  private
@@ -1058,16 +1072,16 @@ private
1058
1072
  t = b >> 24
1059
1073
 
1060
1074
  # Shift the others up.
1061
- b = mask32(b << 8) | (a >> 24)
1062
- a = mask32(a << 8)
1075
+ b = ((b & 0xffffff) << 8) | (a >> 24)
1076
+ a = ((a & 0xffffff) << 8)
1063
1077
 
1064
- u = mask32(t << 1)
1078
+ u = ((t & 0x7fffffff) << 1)
1065
1079
 
1066
1080
  # Subtract the modular polynomial on overflow.
1067
1081
  u ^= 0x14d unless (t & 0x80).zero?
1068
1082
 
1069
1083
  # Remove t * (a * x^2 + 1).
1070
- b ^= t ^ mask32(u << 16)
1084
+ b ^= t ^ ((u & 0xffff) << 16)
1071
1085
 
1072
1086
  # Form u = a*t + t/a = t*(a + 1/a).
1073
1087
  u ^= 0x7fffffff & (t >> 1)
@@ -1076,103 +1090,19 @@ private
1076
1090
  u ^= 0xa6 unless (t & 0x01).zero?
1077
1091
 
1078
1092
  # Remove t * (a + 1/a) * (x^3 + x).
1079
- b ^= mask32(u << 24) | mask32(u << 8)
1093
+ b ^= ((u & 0xff) << 24) | ((u & 0xffffff) << 8)
1080
1094
 
1081
1095
  end
1082
1096
 
1083
1097
  [ b >> 24, b >> 16 & 0xff, b >> 8 & 0xff, b & 0xff ]
1084
1098
  end
1085
1099
 
1086
- # Retain only lowest 32 bits of the given integer.
1087
- def mask32(x)
1088
- x & 0xffffffff
1089
- end
1090
-
1091
1100
  # Generates a random initialization vector of the given length.
1092
1101
  # Warning: use Ruby standard library Kernel#rand.
1093
1102
  def generate_iv(block_size)
1094
1103
  Array.new(block_size).
1095
1104
  map{ |x| rand(256) }.
1096
- pack("C#{block_size}")
1097
- end
1098
-
1099
- end
1100
-
1101
- # Encryption modes.
1102
- #
1103
- # The only currently implemented modes are ECB (Electronic Code Book)
1104
- # and CBC (Cipher Block Chaining).
1105
- module Mode
1106
-
1107
- ECB = :ecb
1108
- CBC = :cbc
1109
- ALL = [ CBC, ECB ]
1110
- DEFAULT = ECB
1111
-
1112
- # Takes a string or symbol and returns the lowercased
1113
- # symbol representation if this is a recognized mode.
1114
- # Otherwise, throws ArgumentError.
1115
- def Mode::validate(mode)
1116
- mode_sym = mode.nil? ? DEFAULT : mode.to_s.downcase.to_sym
1117
- raise ArgumentError, "unknown cipher mode #{mode.inspect}" unless ALL.include? mode_sym
1118
- mode_sym
1119
- end
1120
-
1121
- end
1122
-
1123
- # Implements padding modes to make plaintext into a complete
1124
- # number of blocks before encryption and to remove that padding
1125
- # after successful decryption.
1126
- #
1127
- # The only implemented padding schemes are :none and
1128
- # :zero_byte. Note that zero byte padding is potentially
1129
- # dangerous because if the plaintext terminates in
1130
- # zero bytes then these will be erroneously removed by #unpad.
1131
- # A more sensible padding scheme should be used in this case.
1132
- module Padding
1133
-
1134
- NONE = :none
1135
- ZERO_BYTE = :zero_byte
1136
- ALL = [ NONE, ZERO_BYTE ]
1137
- DEFAULT = NONE
1138
-
1139
- # Takes a string or symbol and returns the lowercased
1140
- # symbol representation if this is a recognized padding scheme.
1141
- # Otherwise, throws ArgumentError.
1142
- def Padding::validate(scheme)
1143
- scheme_sym = scheme.nil? ? DEFAULT : scheme.to_s.downcase.to_sym
1144
- raise ArgumentError, "unknown padding scheme #{scheme.inspect}" unless ALL.include? scheme_sym
1145
- scheme_sym
1146
- end
1147
-
1148
- # Pad the given plaintext to a complete number of blocks. If
1149
- # the padding scheme is :none and the plaintext is not a whole
1150
- # number of blocks then ArgumentError is thrown.
1151
- def Padding::pad(plaintext, block_size, scheme=DEFAULT)
1152
- scheme_sym = validate(scheme)
1153
- remainder = plaintext.length % block_size
1154
- case scheme_sym
1155
- when NONE
1156
- raise ArgumentError, "no padding scheme specified and plaintext length is not a multiple of the block size" unless remainder.zero?
1157
- plaintext.dup
1158
- when ZERO_BYTE
1159
- unless remainder.zero?
1160
- plaintext.dup << "\0" * (block_size - remainder)
1161
- else
1162
- plaintext.dup
1163
- end
1164
- end
1165
- end
1166
-
1167
- # Unpad the given plaintext using the given scheme.
1168
- def Padding::unpad(plaintext, block_size, scheme=DEFAULT)
1169
- scheme_sym = validate(scheme)
1170
- case scheme_sym
1171
- when NONE
1172
- plaintext.dup
1173
- when ZERO_BYTE
1174
- plaintext.dup.sub(/\000+\Z/, '')
1175
- end
1105
+ pack("C#{block_size}") # defaults to ASCII-8BIT encoding
1176
1106
  end
1177
1107
 
1178
1108
  end