ruby-aes-cext 1.0 → 1.1

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.
@@ -47,7 +47,7 @@ module Aes
47
47
 
48
48
  def Aes.check_key(key_string, kl = 128)
49
49
  kl = Aes.check_kl(kl)
50
- k = key_string.length
50
+ k = key_string ? key_string.length : 0
51
51
  raise "Bad key string or bad key length" if (k != kl/8) && (k != kl/4)
52
52
  hex = (key_string =~ /[a-f0-9A-F]{#{k}}/) == 0 && (k == kl/4)
53
53
  bin = ! hex
@@ -131,8 +131,11 @@ module Aes
131
131
  sout << @@aes.encrypt_buffer(sin)
132
132
  when IO
133
133
  while buf = sin.read(@@bs)
134
- sout << ((buf.length % 16).zero? ? @@aes.encrypt_blocks(buf) :
135
- @@aes.encrypt_buffer(buf))
134
+ if buf.length == @@bs
135
+ sout << @@aes.encrypt_blocks(buf)
136
+ else
137
+ sout << @@aes.encrypt_buffer(buf)
138
+ end
136
139
  end
137
140
  else
138
141
  raise "Bad input stream (String, IO)"
@@ -150,9 +153,12 @@ module Aes
150
153
  when String
151
154
  sout << @@aes.decrypt_buffer(sin)
152
155
  when IO
153
- while buf = sin.read(@@bs)
154
- sout << (sin.eof? ? @@aes.decrypt_buffer(buf) :
155
- @@aes.decrypt_blocks(buf))
156
+ while buf = sin.read(@@bs)#+1)
157
+ if buf.length == @@bs
158
+ sout << @@aes.decrypt_blocks(buf)
159
+ else
160
+ sout << @@aes.decrypt_buffer(buf)
161
+ end
156
162
  end
157
163
  else
158
164
  raise "Bad input stream (String, IO)"
@@ -0,0 +1,77 @@
1
+ =begin
2
+ This file is a part of ruby-aes <http://rubyforge.org/projects/ruby-aes>
3
+ Written by Alex Boussinet <alex.boussinet@gmail.com>
4
+
5
+ It contains the code shared by all the implementations
6
+ =end
7
+
8
+ module AesShared
9
+ def encrypt_blocks(buffer)
10
+ raise "Bad block length" unless (buffer.length % 16).zero?
11
+ ct = ""
12
+ block = ""
13
+ buffer.each_byte do |char|
14
+ block << char
15
+ if block.length == 16
16
+ ct << encrypt_block(block)
17
+ block = ""
18
+ end
19
+ end
20
+ ct
21
+ end
22
+
23
+ def decrypt_blocks(buffer)
24
+ raise "Bad block length" unless (buffer.length % 16).zero?
25
+ pt = ""
26
+ block = ""
27
+ buffer.each_byte do |char|
28
+ block << char
29
+ if block.length == 16
30
+ pt << decrypt_block(block)
31
+ block = ""
32
+ end
33
+ end
34
+ pt
35
+ end
36
+
37
+ def encrypt_buffer(buffer)
38
+ ct = ""
39
+ block = ""
40
+ buffer.each_byte do |char|
41
+ block << char
42
+ if block.length == 16
43
+ ct << encrypt_block(block)
44
+ block = ""
45
+ end
46
+ end
47
+ c = "\000"
48
+ if (m = 16 - block.length % 16) != 16
49
+ c = m.chr
50
+ ct << encrypt_block(block << c * m)
51
+ end
52
+ ct << c
53
+ end
54
+
55
+ def decrypt_buffer(buffer)
56
+ pt = ""
57
+ block = ""
58
+ buffer.each_byte do |char|
59
+ block << char
60
+ if block.length == 16
61
+ pt << decrypt_block(block)
62
+ block = ""
63
+ end
64
+ end
65
+ if block.length != 1
66
+ raise 'Bad Block Padding'
67
+ elsif (c = block[-1]).zero?
68
+ pt
69
+ else
70
+ if block * c == pt[-c..-1]
71
+ pt[0..-c-1]
72
+ else
73
+ raise "Bad Block Padding"
74
+ end
75
+ end
76
+ end
77
+ end
@@ -3,8 +3,10 @@ require File.dirname(__FILE__) + '/../lib/ruby-aes'
3
3
 
4
4
  require 'fileutils'
5
5
 
6
- KEY_LENGTH = [128,192,256].freeze
7
- MODES = ['ECB','CBC','OFB','CFB'].freeze
6
+ unless defined? KEY_LENGTH
7
+ KEY_LENGTH = [128,192,256].freeze
8
+ MODES = ['ECB','CBC','OFB','CFB'].freeze
9
+ end
8
10
 
9
11
  def random_fill(n, buffer)
10
12
  n.times do
@@ -13,24 +13,28 @@ class TestRubyAES < Test::Unit::TestCase
13
13
  random_fill(16, @iv)
14
14
  @pt = ""
15
15
  random_fill(64, @pt)
16
- @kl = KEY_LENGTH[(rand * KEY_LENGTH).to_i]
16
+ @kl = KEY_LENGTH[(rand * KEY_LENGTH.length).to_i]
17
17
  @mode = MODES[(rand * MODES.length).to_i]
18
18
  end
19
19
 
20
20
  def test_modes_and_key_lengths
21
+ pt = @pt[0...16]
21
22
  MODES.each do |mode|
22
23
  KEY_LENGTH.each do |kl|
23
- ct = Aes.encrypt_block(kl, mode, @keys[kl], @iv, @pt)
24
+ ct = Aes.encrypt_block(kl, mode, @keys[kl], @iv, pt)
24
25
  npt = Aes.decrypt_block(kl, mode, @keys[kl], @iv, ct)
25
- assert_equal(@pt, npt, "Error in encryption/decryption (#{kl}-#{mode})")
26
+ assert_equal(pt, npt, "Error in encryption/decryption (#{kl}-#{mode})")
26
27
  end
27
28
  end
28
29
  end
29
30
 
30
- def test_encrypt_stream
31
+ def test_encrypt_decrypt_stream
31
32
  file = "_ruby-aes_test_encrypt_stream_"
32
33
  sin = File.open(file, "w+b")
33
34
  random_fill(4242, sin)
35
+ sin.close
36
+
37
+ sin = File.open(file, "rb")
34
38
  sout = File.open("#{file}.aes", "w+b")
35
39
  Aes.encrypt_stream(@kl, @mode, @keys[@kl], @iv, sin, sout)
36
40
  sin.close
@@ -42,18 +46,27 @@ class TestRubyAES < Test::Unit::TestCase
42
46
  sin.close
43
47
  sout.close
44
48
 
45
- assert_equal IO.read(file), IO.read("#{file}.plain"),
46
- "Error in encrypt_stream"
49
+ pt, npt = IO.read(file), IO.read("#{file}.plain")
50
+
51
+ assert_equal pt, npt, "Error in encrypt_decrypt_stream"
52
+ ensure
47
53
  FileUtils.rm_f [ file, "#{file}.aes", "#{file}.plain" ]
48
54
  end
49
55
 
50
- def test_encrypt_buffer
56
+ def test_encrypt_decrypt_buffer
57
+ MODES.each do |mode|
58
+ KEY_LENGTH.each do |kl|
59
+ ct = Aes.encrypt_buffer(kl, mode, @keys[kl], @iv, @pt)
60
+ npt = Aes.decrypt_buffer(kl, mode, @keys[kl], @iv, ct)
61
+ assert_equal(@pt, npt, "Error in encrypt_decrypt_buffer")
62
+ end
63
+ end
51
64
  pt = ""
52
65
  42.times do
53
66
  pt << random_fill(1, pt)
54
67
  ct = Aes.encrypt_buffer(@kl, @mode, @keys[@kl], @iv, pt)
55
68
  npt = Aes.decrypt_buffer(@kl, @mode, @keys[@kl], @iv, ct)
56
- assert_equal(pt, npt, "Error in encrypt buffer (padding)")
69
+ assert_equal(pt, npt, "Error in encrypt_decrypt_buffer")
57
70
  end
58
71
  end
59
72
 
@@ -79,19 +92,19 @@ class TestRubyAES < Test::Unit::TestCase
79
92
 
80
93
  def test_check_key
81
94
  assert_raise(RuntimeError) do
82
- Aes.check_key(@key, 64)
95
+ Aes.check_key(@keys[128], 64)
83
96
  end # bad key length
84
97
  assert_raise(RuntimeError) do
85
98
  Aes.check_key('123', 128)
86
99
  end # bad key string
87
100
  assert_raise(RuntimeError) do
88
- Aes.check_key(@key, 256)
101
+ Aes.check_key(nil, 256)
89
102
  end # bad key string
90
103
  assert_raise(RuntimeError) do
91
- Aes.check_key(@key.unpack('H*'), 128)
104
+ Aes.check_key(@keys[128].unpack('H*'), 128)
92
105
  end # bad key string
93
106
  assert_nothing_raised do
94
- Aes.check_key(@key, @kl)
107
+ Aes.check_key(@keys[@kl], @kl)
95
108
  end
96
109
  end
97
110
 
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.3
2
+ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: ruby-aes-cext
5
5
  version: !ruby/object:Gem::Version
6
- version: "1.0"
7
- date: 2007-08-01 00:00:00 +02:00
6
+ version: "1.1"
7
+ date: 2008-01-05 00:00:00 +01:00
8
8
  summary: ruby-aes is an implementation of the Rijndael algorithm (AES)
9
9
  require_paths:
10
10
  - lib
@@ -36,6 +36,13 @@ files:
36
36
  - Rakefile
37
37
  - doc/rdoc
38
38
  - doc/rdoc/files
39
+ - doc/rdoc/files/lib
40
+ - doc/rdoc/files/lib/ruby-aes_rb.html
41
+ - doc/rdoc/files/lib/ruby-aes
42
+ - doc/rdoc/files/lib/ruby-aes/aes_shared_rb.html
43
+ - doc/rdoc/files/CHANGELOG.html
44
+ - doc/rdoc/files/README.html
45
+ - doc/rdoc/files/COPYING.html
39
46
  - doc/rdoc/index.html
40
47
  - doc/rdoc/rdoc-style.css
41
48
  - doc/rdoc/fr_method_index.html
@@ -43,17 +50,14 @@ files:
43
50
  - doc/rdoc/fr_file_index.html
44
51
  - doc/rdoc/created.rid
45
52
  - doc/rdoc/classes
46
- - doc/rdoc/files/lib
47
- - doc/rdoc/files/CHANGELOG.html
48
- - doc/rdoc/files/README.html
49
- - doc/rdoc/files/COPYING.html
50
- - doc/rdoc/files/lib/ruby-aes_rb.html
51
53
  - doc/rdoc/classes/Aes.html
54
+ - doc/rdoc/classes/AesShared.html
52
55
  - examples/encrypt_block.rb
53
56
  - examples/example_helper.rb
54
57
  - examples/encrypt_stream.rb
55
58
  - examples/encrypt_buffer.rb
56
59
  - lib/ruby-aes
60
+ - lib/ruby-aes/aes_shared.rb
57
61
  - lib/ruby-aes.rb
58
62
  - test/test_ruby-aes.rb
59
63
  - test/test_helper.rb
@@ -63,9 +67,9 @@ files:
63
67
  - test/KAT_MCT/table.192
64
68
  - test/KAT_MCT/table.256
65
69
  - test/KAT_MCT/aes_kat_mct.rb
66
- - ext/ruby-aes/aes_gencons.rb
67
- - ext/ruby-aes/extconf.rb
68
70
  - ext/ruby-aes/aes_alg.c
71
+ - ext/ruby-aes/extconf.rb
72
+ - ext/ruby-aes/aes_cons.h
69
73
  test_files:
70
74
  - test/test_ruby-aes.rb
71
75
  - test/test_helper.rb
@@ -1,118 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- =begin
4
- This file is a part of ruby-aes <http://rubyforge.org/projects/ruby-aes>
5
- Written by Alex Boussinet <alex.boussinet@gmail.com>
6
-
7
- This script generates the constant arrays needed by ruby-aes
8
- =end
9
-
10
- module AesCons
11
-
12
- ALOG = []
13
- LOG = []
14
- j = 1
15
- 256.times do |i|
16
- ALOG[i] = ALOG[i+255] = j
17
- LOG[j] = i
18
- j = (j ^ (j << 1) ^ (j & 0x80 != 0 ? 0x01b : 0)) & 0xff
19
- end
20
- LOG[1] = 0
21
-
22
- def self.mul(a, b)
23
- (a.zero? || b.zero?) ? 0 : ALOG[LOG[a] + LOG[b]]
24
- end
25
-
26
- RCON = []
27
- j = 1
28
- 10.times do |i|
29
- RCON[i] = j << 24 & 0xff000000
30
- j = mul(2, j)
31
- end
32
-
33
- S = []
34
- Si = []
35
- 256.times do |i|
36
- x = (i != 0) ? ALOG[255 - LOG[i]] : 0
37
- x ^= (x << 1) ^ (x << 2) ^ (x << 3) ^ (x << 4)
38
- x = 0x63 ^ (x ^ (x >> 8))
39
- S[i] = x & 0xff
40
- Si[x & 0xff] = i
41
- end
42
-
43
- def self.mul4(a, b)
44
- return 0 if (a.zero?)
45
- a = LOG[a & 0xFF]
46
- a0 = (b[0] != 0) ? ALOG[(a + LOG[b[0] & 0xff]) % 255] & 0xff : 0
47
- a1 = (b[1] != 0) ? ALOG[(a + LOG[b[1] & 0xff]) % 255] & 0xff : 0
48
- a2 = (b[2] != 0) ? ALOG[(a + LOG[b[2] & 0xff]) % 255] & 0xff : 0
49
- a3 = (b[3] != 0) ? ALOG[(a + LOG[b[3] & 0xff]) % 255] & 0xff : 0
50
- return a0 << 24 | a1 << 16 | a2 << 8 | a3
51
- end
52
-
53
- G = [
54
- [2, 1, 1, 3],[3, 2, 1, 1],[1, 3, 2, 1],[1, 1, 3, 2],
55
- [0, 0, 0, 1],[0, 0, 1, 0],[0, 1, 0, 0],[1, 0, 0, 0]
56
- ]
57
- Gi = [
58
- [14, 9, 13, 11], [11, 14, 9, 13], [13, 11, 14, 9],[9, 13, 11, 14],
59
- [0, 0, 0, 1],[0, 0, 1, 0],[0, 1, 0, 0],[1, 0, 0, 0]
60
- ]
61
- Te0, Te1, Te2, Te3 = [], [], [], []
62
- S0, S1, S2, S3 = [], [], [], []
63
- Td0, Td1, Td2, Td3 = [], [], [], []
64
- Si0, Si1, Si2, Si3 = [], [], [], []
65
- 256.times do |t|
66
- s = S[t]
67
- Te0[t] = mul4(s, G[0])
68
- Te1[t] = mul4(s, G[1])
69
- Te2[t] = mul4(s, G[2])
70
- Te3[t] = mul4(s, G[3])
71
- S0[t] = mul4(s, G[4])
72
- S1[t] = mul4(s, G[5])
73
- S2[t] = mul4(s, G[6])
74
- S3[t] = mul4(s, G[7])
75
- s = Si[t]
76
- Td0[t] = mul4(s, Gi[0])
77
- Td1[t] = mul4(s, Gi[1])
78
- Td2[t] = mul4(s, Gi[2])
79
- Td3[t] = mul4(s, Gi[3])
80
- Si0[t] = mul4(s, Gi[4])
81
- Si1[t] = mul4(s, Gi[5])
82
- Si2[t] = mul4(s, Gi[6])
83
- Si3[t] = mul4(s, Gi[7])
84
- end
85
-
86
- File.open("aes_cons.h" , "w+") do |f|
87
- f.write <<-STOP
88
- /*
89
- * This file is a part of ruby-aes <http://rubyforge.org/projects/ruby-aes>
90
- * Written by Alex Boussinet <alex.boussinet@gmail.com>
91
- *
92
- * aes_cons.h - AES Constant Arrays for ruby-aes
93
- */
94
-
95
- #ifndef __AES_CONS__
96
- #define __AES_CONS__
97
-
98
- STOP
99
- ["RCON", "Te0", "Te1", "Te2", "Te3", "S0", "S1", "S2", "S3",
100
- "Td0", "Td1", "Td2", "Td3", "Si0", "Si1", "Si2", "Si3"].each do |x|
101
- f.write "uint " + x + "[] = {\n"
102
- line = " " * 4
103
- module_eval(x).each do |y|
104
- z = "0x%08x" % y
105
- line << ", " if line.length > 4
106
- if (line.length + z.length) > 79
107
- f.write line.chop + "\n"
108
- line = " " * 4
109
- end
110
- line << z
111
- end
112
- f.write line unless line.length == 4
113
- f.write "\n};\n\n"
114
- end
115
- f.write "#endif\n"
116
- end
117
-
118
- end # AesCons