openssl-ccm 1.2.2 → 1.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 94f0f2ac744cac26cf3f3fe5ec47b676d656d0a3d57eaef6ac5af2e5aceade69
4
- data.tar.gz: 0c5e4bee394768df4c0d7f88edd4c297513e420c8bfb2dd10f4ddbe885fa552f
3
+ metadata.gz: 5d7496d323bd3e12c63cf6cc2e8e8fec61755b71167dcdf87889d4ed9c35d343
4
+ data.tar.gz: 7e3d5687db5623504750e49c676265ff0f739d4e2d0dccaa67559c852d6b3cea
5
5
  SHA512:
6
- metadata.gz: 3ec73e24140d4702b6a5debd39d5ef77dd1815d9c5a9bccc586350474ddbe971f02727261deb1fe320596662847cd2598b08ac652ce8b42c279bbeceb67df5fb
7
- data.tar.gz: f6e5f8c3a7380b21cab77f9ca1af26635c9564fc4f0b05df7b4b537bad6b96e9d4bb622efd796d9708d2dd1119891c7e6fb84bd6d423795fe41fa3b54ee9d24a
6
+ metadata.gz: f2d6bb787cfc366e0d1b3f2e00459d8fdb450c4baadb335d225faa5c1ef615bb4e64842a71967a9add92fa5873c6192ad5e9b230eac46e29cd031062c0e1a835
7
+ data.tar.gz: e4e0667dfaa18103791c5a94a88bada6ab08df87d6020564d06d789431520ca1e6631a3fc3bd85160b821570e42e52cfa0e86c47cd661c90ff534ee144986983
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/openssl-ccm.png)](http://badge.fury.io/rb/openssl-ccm)
2
- [![Dependency Status](https://gemnasium.com/SmallLars/openssl-ccm.png)](https://gemnasium.com/SmallLars/openssl-ccm)
3
- [![Build Status](https://travis-ci.org/SmallLars/openssl-ccm.png?branch=master)](https://travis-ci.org/SmallLars/openssl-ccm)
4
2
  [![Coverage Status](https://coveralls.io/repos/SmallLars/openssl-ccm/badge.png?branch=master)](https://coveralls.io/r/SmallLars/openssl-ccm)
5
- [![Code Climate](https://codeclimate.com/github/SmallLars/openssl-ccm.png)](https://codeclimate.com/github/SmallLars/openssl-ccm)
3
+ [![Maintainability](https://qlty.sh/gh/SmallLars/projects/openssl-cmac/maintainability.svg)](https://qlty.sh/gh/SmallLars/projects/openssl-cmac)
6
4
  [![Inline docs](http://inch-ci.org/github/smalllars/openssl-ccm.png)](http://inch-ci.org/github/smalllars/openssl-ccm)
7
5
 
8
6
  # openssl-ccm
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OpenSSL
2
4
  class CCM
3
- VERSION = '1.2.2'
5
+ VERSION = '1.3.0'
4
6
  end
5
7
  end
data/lib/openssl/ccm.rb CHANGED
@@ -1,5 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'openssl'
2
4
 
5
+ # Extends Ruby's standard OpenSSL module with the CCM (Counter with CBC-MAC) class.
6
+ #
7
+ # This module is part of Ruby's standard library and is only reopened here
8
+ # to provide support for the CCM authenticated encryption mode (as defined in RFC 3610).
3
9
  module OpenSSL
4
10
  # CCMError used for wrong parameter resonse.
5
11
  class CCMError < StandardError
@@ -21,11 +27,10 @@ module OpenSSL
21
27
  #
22
28
  # @return [[String]] supported algorithms
23
29
  def self.ciphers
24
- @ciphers ||= OpenSSL::Cipher.ciphers.select { |c| c.match(/-(128|192|256)-CBC$/i) }.map { |e| e[0..-9].upcase }.uniq
30
+ selected = OpenSSL::Cipher.ciphers.select { |c| c.match(/-(128|192|256)-CBC$/i) }
31
+ @ciphers ||= selected.map { |e| e[0..-9].upcase }.uniq
25
32
  end
26
33
 
27
- public
28
-
29
34
  # Creates a new CCM object.
30
35
  #
31
36
  # @param cipher [String] one of the supported algorithms like 'AES'
@@ -35,23 +40,16 @@ module OpenSSL
35
40
  #
36
41
  # @return [Object] the new CCM object
37
42
  def initialize(cipher, key, mac_len)
38
- unless CCM.ciphers.include?(cipher.upcase)
39
- fail CCMError, "unsupported cipher algorithm (#{cipher})"
40
- end
41
- fail CCMError, 'invalid key length' unless key.b.length >= 16
42
- unless (4..16).step(2).include?(mac_len)
43
- fail CCMError, 'invalid mac length'
44
- end
43
+ raise CCMError, "unsupported cipher algorithm (#{cipher})" unless CCM.ciphers.include?(cipher.upcase)
44
+ raise CCMError, 'invalid key length' unless key.b.length >= 16
45
+ raise CCMError, 'invalid mac length' unless (4..16).step(2).include?(mac_len)
45
46
 
46
- if key.length < 24
47
- cipher_key_size = "128"
48
- elsif key.length < 32
49
- cipher_key_size = "192"
50
- else
51
- cipher_key_size = "256"
52
- end
47
+ cipher_key_size = if key.length < 24 then '128'
48
+ elsif key.length < 32 then '192'
49
+ else '256' # rubocop:disable Lint/ElseLayout
50
+ end
53
51
 
54
- @cipher = OpenSSL::Cipher.new("#{cipher.upcase}-" + cipher_key_size + "-CBC")
52
+ @cipher = OpenSSL::Cipher.new("#{cipher.upcase}-#{cipher_key_size}-CBC")
55
53
  @key = key
56
54
  @mac_len = mac_len
57
55
  end
@@ -87,26 +85,22 @@ module OpenSSL
87
85
  new_data = crypt(data.b[0...-@mac_len], nonce)
88
86
  new_mac = mac(new_data, nonce, additional_data)
89
87
  return new_data if new_mac == data.b[-@mac_len..-1]
88
+
90
89
  ''
91
90
  end
92
91
 
93
92
  private
94
93
 
95
94
  def valid?(data, nonce, additional_data)
96
- unless (7..13).include?(nonce.b.length)
97
- fail CCMError, 'invalid nonce length'
98
- end
99
- unless data.b.length < 2**(8 * (15 - nonce.b.length))
100
- fail CCMError, 'invalid data length'
101
- end
102
- unless additional_data.b.length < 2**64
103
- fail CCMError, 'invalid additional_data length'
104
- end
95
+ raise CCMError, 'invalid nonce length' unless (7..13).include?(nonce.b.length)
96
+ raise CCMError, 'invalid data length' unless data.b.length < 2**(8 * (15 - nonce.b.length))
97
+ raise CCMError, 'invalid additional_data length' unless additional_data.b.length < 2**64
98
+
105
99
  true
106
100
  end
107
101
 
108
102
  def crypt(data, nonce)
109
- result = ''
103
+ result = String.new
110
104
  data.bytes.each_slice(16).with_index(1) do |block, b|
111
105
  counter = get_counter(nonce, b).bytes
112
106
  block.length.times { |i| counter[i] ^= block[i] }
@@ -119,39 +113,43 @@ module OpenSSL
119
113
  @cipher.reset
120
114
  @cipher.encrypt
121
115
  @cipher.key = @key
116
+ @cipher.iv = "\x00" * 16
122
117
 
123
- b_0 = Array.new(8, 0)
124
- b_0[0] = (additional_data.empty? ? 0 : 64) \
118
+ mac = init_with_b0(data, nonce, additional_data)
119
+ !additional_data.empty? && mac = process(additional_data)
120
+ !data.empty? && mac = @cipher.update(data + padding(data)).bytes[-16..-1]
121
+
122
+ a0 = get_counter(nonce, 0).bytes
123
+ 16.times { |i| mac[i] ^= a0[i] }
124
+ mac[0...@mac_len].pack('C*')
125
+ end
126
+
127
+ def init_with_b0(data, nonce, additional_data)
128
+ b0 = Array.new(8, 0)
129
+ b0[0] = (additional_data.empty? ? 0 : 64) \
125
130
  + (8 * ((@mac_len - 2) / 2)) \
126
131
  + (14 - nonce.b.length)
127
- b_0 += [data.b.length].pack('Q').reverse.bytes
128
- b_0[1, nonce.b.length] = nonce.bytes
129
- mac = @cipher.update(b_0.pack('C*')).bytes
130
-
131
- unless additional_data.empty?
132
- len = additional_data.b.length
133
- d = case
134
- when len < (2**16 - 2**8)
135
- [len].pack('n')
136
- when len < 2**32
137
- "\xFF\xFE" + [len].pack('N')
138
- else
139
- "\xFF\xFF" + [len].pack('Q').reverse
140
- end + additional_data
141
- mac = @cipher.update(d + padding(d)).bytes[-16..-1]
142
- end
143
-
144
- unless data.empty?
145
- mac = @cipher.update(data + padding(data)).bytes[-16..-1]
146
- end
132
+ b0 += [data.b.length].pack('Q').reverse.bytes
133
+ b0[1, nonce.b.length] = nonce.bytes
134
+ @cipher.update(b0.pack('C*')).bytes
135
+ end
147
136
 
148
- a_0 = get_counter(nonce, 0).bytes
149
- 16.times { |i| mac[i] ^= a_0[i] }
150
- mac[0...@mac_len].pack('C*')
137
+ def process(additional_data)
138
+ len = additional_data.b.length
139
+ d = case
140
+ when len < (2**16) - (2**8)
141
+ [len].pack('n')
142
+ when len < 2**32
143
+ "\xFF\xFE#{[len].pack('N')}"
144
+ else
145
+ "\xFF\xFF#{[len].pack('Q').reverse}"
146
+ end + additional_data
147
+ @cipher.update(d + padding(d)).bytes[-16..-1]
151
148
  end
152
149
 
153
150
  def padding(data)
154
- return '' if (data.b.length % 16) == 0
151
+ return '' if (data.b.length % 16).zero?
152
+
155
153
  "\x00" * (16 - (data.b.length % 16))
156
154
  end
157
155
 
@@ -164,6 +162,7 @@ module OpenSSL
164
162
  @cipher.reset
165
163
  @cipher.encrypt
166
164
  @cipher.key = @key
165
+ @cipher.iv = "\x00" * 16
167
166
  @cipher.update(a.pack('C*'))
168
167
  end
169
168
  end
metadata CHANGED
@@ -1,172 +1,47 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openssl-ccm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Schmertmann
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2019-01-08 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: rake
13
+ name: openssl
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '12.3'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 12.3.2
23
- type: :development
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '12.3'
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: 12.3.2
33
- - !ruby/object:Gem::Dependency
34
- name: rdoc
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '4.3'
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 4.3.0
43
- type: :development
44
- prerelease: false
45
- version_requirements: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: '4.3'
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: 4.3.0
53
- - !ruby/object:Gem::Dependency
54
- name: yard
55
- requirement: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: '0.9'
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: 0.9.16
63
- type: :development
64
- prerelease: false
65
- version_requirements: !ruby/object:Gem::Requirement
66
- requirements:
67
- - - "~>"
68
- - !ruby/object:Gem::Version
69
- version: '0.9'
70
- - - ">="
71
- - !ruby/object:Gem::Version
72
- version: 0.9.16
73
- - !ruby/object:Gem::Dependency
74
- name: rubocop
75
- requirement: !ruby/object:Gem::Requirement
76
- requirements:
77
- - - "~>"
78
- - !ruby/object:Gem::Version
79
- version: '0.50'
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: 0.50.0
83
- type: :development
84
- prerelease: false
85
- version_requirements: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '0.50'
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: 0.50.0
93
- - !ruby/object:Gem::Dependency
94
- name: test-unit
95
- requirement: !ruby/object:Gem::Requirement
96
- requirements:
97
- - - "~>"
98
- - !ruby/object:Gem::Version
99
- version: '3.2'
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: 3.2.9
103
- type: :development
104
- prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '3.2'
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- version: 3.2.9
113
- - !ruby/object:Gem::Dependency
114
- name: coveralls
115
- requirement: !ruby/object:Gem::Requirement
116
- requirements:
117
- - - "~>"
118
- - !ruby/object:Gem::Version
119
- version: '0.8'
120
- - - ">="
121
- - !ruby/object:Gem::Version
122
- version: 0.8.22
123
- type: :development
18
+ version: '3.0'
19
+ type: :runtime
124
20
  prerelease: false
125
21
  version_requirements: !ruby/object:Gem::Requirement
126
22
  requirements:
127
23
  - - "~>"
128
24
  - !ruby/object:Gem::Version
129
- version: '0.8'
130
- - - ">="
131
- - !ruby/object:Gem::Version
132
- version: 0.8.22
25
+ version: '3.0'
133
26
  description: Ruby Gem for RFC 3610 - Counter with CBC-MAC (CCM)
134
27
  email:
135
28
  - SmallLars@t-online.de
136
29
  executables: []
137
30
  extensions: []
138
31
  extra_rdoc_files:
139
- - README.md
140
32
  - LICENSE
33
+ - README.md
141
34
  files:
142
- - ".rubocop.yml"
143
- - ".yardopts"
144
- - Gemfile
145
35
  - LICENSE
146
36
  - README.md
147
- - Rakefile
148
37
  - lib/openssl/ccm.rb
149
38
  - lib/openssl/ccm/version.rb
150
- - test/data_1
151
- - test/data_1-1_e
152
- - test/data_1-2_e
153
- - test/data_1-3_e
154
- - test/data_1-4_e
155
- - test/data_2
156
- - test/data_2-1_e
157
- - test/data_2-2_e
158
- - test/data_2-3_e
159
- - test/data_2-4_e
160
- - test/data_3
161
- - test/data_3-1_e
162
- - test/data_3-2_e
163
- - test/data_3-3_e
164
- - test/data_3-4_e
165
- - test/test_ccm.rb
166
39
  homepage: https://github.com/smalllars/openssl-ccm
167
40
  licenses:
168
41
  - MIT
169
- metadata: {}
42
+ metadata:
43
+ rubygems_mfa_required: 'true'
44
+ source_code_uri: https://github.com/smalllars/openssl-ccm
170
45
  post_install_message: Thanks for installing!
171
46
  rdoc_options:
172
47
  - "-x"
@@ -184,25 +59,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
59
  - !ruby/object:Gem::Version
185
60
  version: '0'
186
61
  requirements: []
187
- rubyforge_project:
188
- rubygems_version: 2.7.7
189
- signing_key:
62
+ rubygems_version: 3.6.9
190
63
  specification_version: 4
191
64
  summary: RFC 3610 - CCM
192
- test_files:
193
- - test/test_ccm.rb
194
- - test/data_3-2_e
195
- - test/data_3-4_e
196
- - test/data_3-1_e
197
- - test/data_3
198
- - test/data_1-2_e
199
- - test/data_2-4_e
200
- - test/data_1-4_e
201
- - test/data_1-3_e
202
- - test/data_2-2_e
203
- - test/data_2-3_e
204
- - test/data_1
205
- - test/data_2
206
- - test/data_1-1_e
207
- - test/data_2-1_e
208
- - test/data_3-3_e
65
+ test_files: []
data/.rubocop.yml DELETED
@@ -1,12 +0,0 @@
1
-
2
- ClassLength:
3
- Max: 256
4
-
5
- MethodLength:
6
- Max: 32
7
-
8
- CyclomaticComplexity:
9
- Max: 8
10
-
11
- Documentation:
12
- Enabled: false
data/.yardopts DELETED
@@ -1,4 +0,0 @@
1
- --no-private
2
- --protected
3
- lib/**/**/*.rb -
4
- LICENSE
data/Gemfile DELETED
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'rake', '>=12.3.2'
4
- gem 'rdoc', '>=4.3.0'
5
- gem 'yard', '>=0.9.16'
6
- gem 'rubocop', '>=0.50.0'
7
- gem 'test-unit', '>=3.2.9'
8
- gem 'coveralls', '>=0.8.22'
data/Rakefile DELETED
@@ -1,31 +0,0 @@
1
- require './lib/openssl/ccm/version'
2
- require "bundler/gem_tasks"
3
- require 'rake/testtask'
4
-
5
- task :default => :build
6
-
7
- desc "Run tests"
8
- Rake::TestTask.new do |t|
9
- t.libs << 'test'
10
- end
11
-
12
- desc "Create documentation"
13
- task :doc do
14
- sh "gem rdoc --rdoc openssl-ccm"
15
- sh "yardoc"
16
- end
17
-
18
- desc "Uninstall and clean documentation"
19
- task :clean do
20
- sh "gem uninstall openssl-ccm"
21
- begin; sh "rm -R ./coverage"; rescue; end
22
- begin; sh "rm -R ./.yardoc"; rescue; end
23
- begin; sh "rm -R ./doc"; rescue; end
24
- end
25
-
26
- desc "Development Dependencies"
27
- task (:devinst) { sh "gem install --dev ./openssl-ccm-#{OpenSSL::CCM::VERSION}.gem" }
28
-
29
- desc "Bundle install"
30
- task (:bundle) { sh "bundle install" }
31
-
data/test/data_1 DELETED
File without changes
data/test/data_1-1_e DELETED
@@ -1 +0,0 @@
1
- �`��`C� �x�J)�
data/test/data_1-2_e DELETED
@@ -1 +0,0 @@
1
- �3Qȳ��
data/test/data_1-3_e DELETED
@@ -1 +0,0 @@
1
- ��#�=�ʵ��ii3
data/test/data_1-4_e DELETED
@@ -1 +0,0 @@
1
- (����y
data/test/data_2 DELETED
@@ -1,2 +0,0 @@
1
- Ein kleiner Text
2
- zum Testen von CCM.
data/test/data_2-1_e DELETED
Binary file
data/test/data_2-2_e DELETED
@@ -1 +0,0 @@
1
- Dz�p�5{h�5M���A=��%�֧ސ�ii��@���tS,��Ϲ
data/test/data_2-3_e DELETED
@@ -1 +0,0 @@
1
- `��gM�T�)~>4�x����O��;���� �c���rܮ|��V*���<
data/test/data_2-4_e DELETED
@@ -1,2 +0,0 @@
1
- �1U��p�b�vA���&pa�6����F=Z�
2
- s���7UB�~�;�
data/test/data_3 DELETED
Binary file
data/test/data_3-1_e DELETED
Binary file
data/test/data_3-2_e DELETED
Binary file
data/test/data_3-3_e DELETED
Binary file
data/test/data_3-4_e DELETED
Binary file
data/test/test_ccm.rb DELETED
@@ -1,344 +0,0 @@
1
- require 'coveralls'
2
- Coveralls.wear!
3
- require 'test/unit'
4
- require 'openssl/ccm'
5
-
6
- # Testclass with Test Vectors from
7
- # http://tools.ietf.org/html/rfc3610#section-8
8
- class CCMTest < Test::Unit::TestCase
9
- KEY = %W(C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF) * 12 \
10
- + %W(D7828D13B2B0BDC325A76236DF93CC6B) * 12
11
- NONCE = %W(
12
- 00000003020100A0A1A2A3A4A5
13
- 00000004030201A0A1A2A3A4A5
14
- 00000005040302A0A1A2A3A4A5
15
- 00000006050403A0A1A2A3A4A5
16
- 00000007060504A0A1A2A3A4A5
17
- 00000008070605A0A1A2A3A4A5
18
- 00000009080706A0A1A2A3A4A5
19
- 0000000A090807A0A1A2A3A4A5
20
- 0000000B0A0908A0A1A2A3A4A5
21
- 0000000C0B0A09A0A1A2A3A4A5
22
- 0000000D0C0B0AA0A1A2A3A4A5
23
- 0000000E0D0C0BA0A1A2A3A4A5
24
- 00412B4EA9CDBE3C9696766CFA
25
- 0033568EF7B2633C9696766CFA
26
- 00103FE41336713C9696766CFA
27
- 00764C63B8058E3C9696766CFA
28
- 00F8B678094E3B3C9696766CFA
29
- 00D560912D3F703C9696766CFA
30
- 0042FFF8F1951C3C9696766CFA
31
- 00920F40E56CDC3C9696766CFA
32
- 0027CA0C7120BC3C9696766CFA
33
- 005B8CCBCD9AF83C9696766CFA
34
- 003EBE94044B9A3C9696766CFA
35
- 008D493B30AE8B3C9696766CFA
36
- )
37
- DATA = %W(
38
- 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E
39
- 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
40
- 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20
41
- 0C0D0E0F101112131415161718191A1B1C1D1E
42
- 0C0D0E0F101112131415161718191A1B1C1D1E1F
43
- 0C0D0E0F101112131415161718191A1B1C1D1E1F20
44
- 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E
45
- 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
46
- 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20
47
- 0C0D0E0F101112131415161718191A1B1C1D1E
48
- 0C0D0E0F101112131415161718191A1B1C1D1E1F
49
- 0C0D0E0F101112131415161718191A1B1C1D1E1F20
50
- 08E8CF97D820EA258460E96AD9CF5289054D895CEAC47C
51
- 9020EA6F91BDD85AFA0039BA4BAFF9BFB79C7028949CD0EC
52
- B916E0EACC1C00D7DCEC68EC0B3BBB1A02DE8A2D1AA346132E
53
- 12DAAC5630EFA5396F770CE1A66B21F7B2101C
54
- E88B6A46C78D63E52EB8C546EFB5DE6F75E9CC0D
55
- 6435ACBAFB11A82E2F071D7CA4A5EBD93A803BA87F
56
- 8A19B950BCF71A018E5E6701C91787659809D67DBEDD18
57
- 1761433C37C5A35FC1F39F406302EB907C6163BE38C98437
58
- A434A8E58500C6E41530538862D686EA9E81301B5AE4226BFA
59
- B96B49E21D621741632875DB7F6C9243D2D7C2
60
- E2FCFBB880442C731BF95167C8FFD7895E337076
61
- ABF21C0B02FEB88F856DF4A37381BCE3CC128517D4
62
- )
63
- ADD_DATA = %W(0001020304050607) * 3 \
64
- + %W(000102030405060708090A0B) * 3 \
65
- + %W(0001020304050607) * 3 \
66
- + %W(000102030405060708090A0B) * 3 \
67
- + %W(
68
- 0BE1A88BACE018B1
69
- 63018F76DC8A1BCB
70
- AA6CFA36CAE86B40
71
- D0D0735C531E1BECF049C244
72
- 77B60F011C03E1525899BCAE
73
- CD9044D2B71FDB8120EA60C0
74
- D85BC7E69F944FB8
75
- 74A0EBC9069F5B37
76
- 44A3AA3AAE6475CA
77
- EC46BB63B02520C33C49FD70
78
- 47A65AC78B3D594227E85E71
79
- 6E37A6EF546D955D34AB6059
80
- )
81
- CTR0001 = %W(
82
- 50859D916DCB6DDDE077C2D1D4EC9F97
83
- 7AC0103DED38F6C0390DBA871C4991F4
84
- 59B8EFFF46147312B47A1D9D393D3CFF
85
- AE81666A838B886AEEBF4A5B3284508A
86
- D0FCF5744D8F31E8895B05054B7C90C3
87
- 63CCBE1EE01744984564B23A8D245C80
88
- 093CDBB9C5524FDAC1C5ECD291C470AF
89
- 737C3391CC8E13DDE0AAC54B6DB7EB98
90
- 8A5A106BC0299A555B936B0B0EA0DE5A
91
- 0B392B9B056697063F12568F2B13A10F
92
- 6B66BC0C90A1F112FCBE6F4E122077BC
93
- CCF2AED9E04AC974E65855B32B9430BF
94
- 4451B0117A8482BF0319AEC1595EBDDA
95
- DCEBF413383C66A05A7255EF98D7FFAD
96
- 08C4DAC8ECC1C07B4CE1F24C375A47EE
97
- 0608FF95A694D559F40BB79DEFFA41DF
98
- BDCE955CCFD3810A91EA77A6A45BC04C
99
- 64A2C55650CEE04C7A93D8EEF543E88E
100
- 363834FA28833DB755660D98650D6846
101
- 4F71A5C11242E37D29F0FEE41BE1025F
102
- 568A459E40094867EB85E09E6A2E6476
103
- 88BC194280C1FA3EBEFCEFFB4DC62D54
104
- 0A7E0A6353C8CF9EBC3B6E63159AD097
105
- 58DB19B3889AA38B3CA40B16FF422C73
106
- )
107
- CTR0002 = %W(
108
- 7546717AC6DE9AFF640C9C06DE6D0D8F
109
- D40CDE22D5F92424F7BE9A569DA79F51
110
- 69F122A078C79B8977894C99975C2378
111
- D1B19206AC939E2FB6DDCE10A774FD8D
112
- 72A0D4219F0DE1D40483BC2D3D0CFC2A
113
- 396DBAA2A7D2CBD4B5E17C107945BBC0
114
- 11578386E2C472B48ECC8AADAB776FCB
115
- 74B77177C5AAC53B04A4F8708E92EB2B
116
- EA05FDE2AB225CFEB77312CB88D9A54A
117
- 078965252340943B9E69B256CC5EF731
118
- 979E572BBE658AE5CC2011832A9A9B5B
119
- A2CAAC1163F407E5E5F6E3B3790F79F8
120
- 83EB76E13A44847F9220090776B825C5
121
- 2F542CBA15D66CDFE1EC468F0E68A124
122
- A7872E6C6DC44E842602504C3FA573C5
123
- 80553A75783804A9648B68DD7FDCDD7A
124
- 432EF232AE36D89222BF6337E6B26CE8
125
- 18E765ACB7B0E9AF092BD0206CA1C83C
126
- 35E96354871672563F0C08AF784431A9
127
- 342BD3F17CB77BC1790B05056159272C
128
- A600AA929203549AAEEF2CCC59137A57
129
- 3E597DA5AE21CCA4009E4C0C91F62249
130
- EA2032DA27826E139E1E725C5B0D3EBF
131
- C32F243D65DC7E9F4B0216AB7FB96B4D
132
- )
133
- CIPHER = %W(
134
- 588C979A61C663D2F066D0C2C0F989806D5F6B61DAC384
135
- 72C91A36E135F8CF291CA894085C87E3CC15C439C9E43A3B
136
- 51B1E5F44A197D1DA46B0F8E2D282AE871E838BB64DA859657
137
- A28C6865939A9A79FAAA5C4C2A9D4A91CDAC8C
138
- DCF1FB7B5D9E23FB9D4E131253658AD86EBDCA3E
139
- 6FC1B011F006568B5171A42D953D469B2570A4BD87
140
- 0135D1B2C95F41D5D1D4FEC185D166B8094E999DFED96C
141
- 7B75399AC0831DD2F0BBD75879A2FD8F6CAE6B6CD9B7DB24
142
- 82531A60CC24945A4B8279181AB5C84DF21CE7F9B73F42E197
143
- 07342594157785152B074098330ABB141B947B
144
- 676BB20380B0E301E8AB79590A396DA78B834934
145
- C0FFA0D6F05BDB67F24D43A4338D2AA4BED7B20E43
146
- 4CB97F86A2A4689A877947AB8091EF5386A6FFBDD080F8
147
- 4CCB1E7CA981BEFAA0726C55D378061298C85C92814ABC33
148
- B1D23A2220DDC0AC900D9AA03C61FCF4A559A4417767089708
149
- 14D253C3967B70609B7CBB7C49916028324526
150
- 5545FF1A085EE2EFBF52B2E04BEE1E2336C73E3F
151
- 009769ECABDF48625594C59251E6035722675E04C8
152
- BC218DAA947427B6DB386A99AC1AEF23ADE0B52939CB6A
153
- 5810E6FD25874022E80361A478E3E9CF484AB04F447EFFF6
154
- F2BEED7BC5098E83FEB5B31608F8E29C38819A89C8E776F154
155
- 31D750A09DA3ED7FDDD49A2032AABF17EC8EBF
156
- E882F1DBD38CE3EDA7C23F04DD65071EB41342AC
157
- F32905B88A641B04B9C9FFB58CC390900F3DA12AB1
158
- )
159
- MAC = %W(
160
- 17E8D12CFDF926E0
161
- A091D56E10400916
162
- 4ADAA76FBD9FB0C5
163
- 96C861B9C9E61EF1
164
- 51E83F077D9C2D93
165
- 405A0443AC91CB94
166
- 048C56602C97ACBB7490
167
- C17B4433F434963F34B4
168
- EA9C07E56B5EB17E5F4E
169
- 566AA9406B4D999988DD
170
- F53AA2E9107A8B6C022C
171
- CD1AA31662E7AD65D6DB
172
- E78CF7CB0CDDD7B3
173
- C52EE81D7D77C08A
174
- A776796EDB723506
175
- 9A6F49975BCADEAF
176
- 762C0C7744FE7E3C
177
- 47099E5AE0704551
178
- 637CF9BEC2408897C6BA
179
- F0A477CC2FC9BF548944
180
- 4D4151A4ED3A8B87B9CE
181
- 7D22C8088C666BE5C197
182
- DF7E00DCCEC7AE52987D
183
- 6DCE9E82EFA16DA62059
184
- )
185
-
186
- def test_aes_init
187
- assert_raise(OpenSSL::CCMError) { OpenSSL::CCM.new('', 'A' * 16, 8) }
188
- assert_raise(OpenSSL::CCMError) { OpenSSL::CCM.new('AE', 'A' * 16, 8) }
189
-
190
- assert_raise(OpenSSL::CCMError) { OpenSSL::CCM.new('AES', '', 8) }
191
- assert_raise(OpenSSL::CCMError) { OpenSSL::CCM.new('AES', 'A', 8) }
192
- assert_raise(OpenSSL::CCMError) { OpenSSL::CCM.new('AES', 'A' * 15, 8) }
193
-
194
- 3.step(17, 2) do |l|
195
- assert_raise(OpenSSL::CCMError) { OpenSSL::CCM.new('AES', 'A' * 16, l) }
196
- end
197
- end
198
-
199
- def test_aes_padding
200
- ccm = OpenSSL::CCM.new('AES', 'A' * 16, 8)
201
-
202
- assert_equal(''.b , ccm.send(:padding, '').b)
203
- assert_equal("\x00".b , ccm.send(:padding, 'A' * 15).b)
204
- assert_equal(''.b , ccm.send(:padding, 'A' * 16).b)
205
- assert_equal(("\x00" * 15).b, ccm.send(:padding, 'A').b)
206
- end
207
-
208
- def test_aes_valid
209
- ccm = OpenSSL::CCM.new('AES', 'A' * 16, 8)
210
-
211
- assert(ccm.send(:valid?, '', 'A' * 13, ''))
212
- assert(ccm.send(:valid?, 'A' * (256**2 - 1), 'A' * 13, ''))
213
- assert_raise(OpenSSL::CCMError) do
214
- ccm.send(:valid?, 'A' * 256**2, 'A' * 13, '')
215
- end
216
-
217
- assert_raise OpenSSL::CCMError do
218
- ccm.send(:valid?, 'Hello!', 'A' * 6, '')
219
- end
220
- assert(ccm.send(:valid?, '', 'A' * 7, ''))
221
- assert(ccm.send(:valid?, '', 'A' * 13, ''))
222
- assert_raise OpenSSL::CCMError do
223
- ccm.send(:valid?, 'Hello!', 'A' * 14, '')
224
- end
225
- end
226
-
227
- def test_aes_vectors
228
- assert(OpenSSL::CCM.ciphers.include?('AES'), 'Missing AES-Cipher')
229
- KEY.length.times do |i|
230
- ccm = OpenSSL::CCM.new('AES', [KEY[i]].pack('H*'),
231
- [MAC[i]].pack('H*').b.length)
232
-
233
- c = ccm.send(:get_counter, [NONCE[i]].pack('H*'), 1)
234
- assert_equal(CTR0001[i], c.unpack('H*')[0].upcase,
235
- "Wrong CTR0001 in Vector #{i + 1}")
236
-
237
- c = ccm.send(:get_counter, [NONCE[i]].pack('H*'), 2)
238
- assert_equal(CTR0002[i], c.unpack('H*')[0].upcase,
239
- "Wrong CTR0002 in Vector #{i + 1}")
240
-
241
- c = ccm.send(:crypt, [DATA[i]].pack('H*'), [NONCE[i]].pack('H*'))
242
- assert_equal(CIPHER[i], c.unpack('H*')[0].upcase,
243
- "Wrong CIPHER in Vector #{i + 1}")
244
-
245
- c = ccm.send(:mac,
246
- [DATA[i]].pack('H*'),
247
- [NONCE[i]].pack('H*'),
248
- [ADD_DATA[i]].pack('H*'))
249
- assert_equal(MAC[i], c.unpack('H*')[0].upcase,
250
- "Wrong MAC in Vector #{i + 1}")
251
-
252
- c = ccm.send(:encrypt,
253
- [DATA[i]].pack('H*'),
254
- [NONCE[i]].pack('H*'),
255
- [ADD_DATA[i]].pack('H*'))
256
- assert_equal((CIPHER[i] + MAC[i]), c.unpack('H*')[0].upcase,
257
- "Wrong ENCRYPT in Vector #{i + 1}")
258
-
259
- c = ccm.send(:decrypt,
260
- [CIPHER[i] + MAC[i]].pack('H*'),
261
- [NONCE[i]].pack('H*'),
262
- [ADD_DATA[i]].pack('H*'))
263
- assert_equal(DATA[i], c.unpack('H*')[0].upcase,
264
- "Wrong ENCRYPT in Vector #{i + 1}")
265
- end
266
- end
267
-
268
- def test_aes_data
269
- key = %W(
270
- 00000000000000000000000000000000
271
- 001234567890ABCDEFDCAFFEED3921EE
272
- 001234567890ABCDEFDCAFFEED3921EE
273
- 11223344AABB00000000000000000000
274
- )
275
- nonce = %W(
276
- 00000000000000000000000000
277
- 00112233445566778899
278
- 001122334455667788990000
279
- 00112233445566778899
280
- )
281
- mac_len = [16, 8, 14, 8]
282
-
283
- assert(OpenSSL::CCM.ciphers.include?('AES'), 'Missing AES-Cipher')
284
-
285
- for cipher in ['aes', 'AES']
286
- 1.upto(3) do |i|
287
- open("test/data_#{i}", mode = 'r') do |i_file|
288
- input = i_file.read
289
- key.length.times do |j|
290
- open("test/data_#{i}-#{j + 1}_e", mode = 'r') do |o_file|
291
- output = o_file.read
292
- ccm = OpenSSL::CCM.new(cipher, [key[j]].pack('H*'), mac_len[j])
293
- c = ccm.encrypt(input, [nonce[j]].pack('H*'))
294
- assert_equal(output.unpack('H*'), c.unpack('H*'),
295
- "Wrong ENCRYPT in Vector #{i + 1}")
296
- end
297
- end
298
- end
299
- end
300
- end
301
- end
302
-
303
- #Test case from https://github.com/weidai11/cryptopp/blob/master/TestVectors/ccm.txt
304
- def test_aes_data_256
305
- key = %W(
306
- 0000000000000000000000000000000000000000000000000000000000000000
307
- fb7615b23d80891dd470980bc79584c8b2fb64ce60978f4d17fce45a49e830b7
308
- )
309
-
310
- nonce = %W(
311
- 000000000000000000000000
312
- dbd1a3636024b7b402da7d6f
313
- )
314
-
315
- plaintext = %W(
316
- 00000000000000000000000000000000
317
- a845348ec8c5b5f126f50e76fefd1b1e
318
- )
319
-
320
- ciphertext = %W(
321
- c1944044c8e7aa95d2de9513c7f3dd8c
322
- cc881261c6a7fa72b96a1739176b277f
323
- )
324
-
325
- mac = %W(
326
- 4b0a3e5e51f151eb0ffae7c43d010fdb
327
- 3472e1145f2c0cbe146349062cf0e423
328
- )
329
-
330
- assert(OpenSSL::CCM.ciphers.include?('AES'), 'Missing AES-Cipher')
331
-
332
- for cipher in ['aes', 'AES']
333
- key.length.times do |i|
334
- mac_len = mac[i].length / 2
335
- ccm = OpenSSL::CCM.new(cipher, [key[i]].pack('H*'), mac_len)
336
- c = ccm.encrypt([plaintext[i]].pack('H*'), [nonce[i]].pack('H*'))
337
- assert_equal([mac[i]], c[-mac_len..-1].unpack('H*'),
338
- "Wrong MAC ENCRYPT in Test #{i} ")
339
- assert_equal([ciphertext[i]], c[0..-mac_len - 1].unpack('H*'),
340
- "Wrong ciphertext ENCRYPT in Test #{i}")
341
- end
342
- end
343
- end
344
- end