cose 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/.travis.yml +12 -3
- data/Appraisals +3 -0
- data/CHANGELOG.md +14 -0
- data/README.md +46 -29
- data/cose.gemspec +1 -1
- data/gemfiles/openssl_default.gemfile +5 -0
- data/lib/cose/key.rb +5 -0
- data/lib/cose/key/base.rb +38 -4
- data/lib/cose/key/curve_key.rb +48 -0
- data/lib/cose/key/ec2.rb +33 -47
- data/lib/cose/key/okp.rb +22 -0
- data/lib/cose/key/rsa.rb +86 -61
- data/lib/cose/key/symmetric.rb +20 -9
- data/lib/cose/version.rb +1 -1
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32030549359b2c5afe6862546965c13f4071b55c9ace03a6385ce5c62c3af7bc
|
4
|
+
data.tar.gz: 46e4769b04dadb56b998ae807a2cfe80e73c95c131c93b8b6424d5752f1aae0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 907c461c040d4e80b19403922557a7098e30cb348a829f9252ed74ab4c9f8d3ca62ba24f75ddc6e4df6c19de95f900be53483dbc4c97ded66927433513a38ce0
|
7
|
+
data.tar.gz: 8142ebaaf7c32486f60f29243e689ae5bf96a4a39eed87838c55eeed8a13cc102e7dbd14d489749da9cff5ac149aa4a97c172f113e69f70e0658d285f3571063
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -4,16 +4,25 @@ language: ruby
|
|
4
4
|
rvm:
|
5
5
|
- ruby-head
|
6
6
|
- 2.6.2
|
7
|
-
- 2.5.
|
8
|
-
- 2.4.
|
7
|
+
- 2.5.5
|
8
|
+
- 2.4.6
|
9
|
+
- 2.3.8
|
10
|
+
- 2.2.10
|
9
11
|
|
10
12
|
gemfile:
|
11
13
|
- gemfiles/openssl_2_0.gemfile
|
12
14
|
- gemfiles/openssl_2_1.gemfile
|
15
|
+
- gemfiles/openssl_default.gemfile
|
13
16
|
|
14
|
-
before_install: gem install bundler -v
|
17
|
+
before_install: gem install bundler -v '~> 1.17'
|
15
18
|
|
16
19
|
matrix:
|
17
20
|
fast_finish: true
|
18
21
|
allow_failures:
|
19
22
|
- rvm: ruby-head
|
23
|
+
- rvm: 2.2.10
|
24
|
+
exclude:
|
25
|
+
- rvm: 2.2.10
|
26
|
+
gemfile: gemfiles/openssl_2_0.gemfile
|
27
|
+
- rvm: 2.2.10
|
28
|
+
gemfile: gemfiles/openssl_2_1.gemfile
|
data/Appraisals
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v0.6.0] - 2019-04-03
|
4
|
+
|
5
|
+
### Added
|
6
|
+
|
7
|
+
- Support Key Common Parameters (`#base_iv`, `key_ops`, `#alg` and `#kid`)
|
8
|
+
- Support OKP Key
|
9
|
+
- Support RSA private key serialization
|
10
|
+
- Works with ruby 2.3
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
|
14
|
+
- Key type-specific parameters names better match RFC
|
15
|
+
|
3
16
|
## [v0.5.0] - 2019-03-25
|
4
17
|
|
5
18
|
### Added
|
@@ -54,6 +67,7 @@
|
|
54
67
|
- EC2 key object
|
55
68
|
- Works with ruby 2.5
|
56
69
|
|
70
|
+
[v0.6.0]: https://github.com/cedarcode/cose-ruby/compare/v0.5.0...v0.6.0/
|
57
71
|
[v0.5.0]: https://github.com/cedarcode/cose-ruby/compare/v0.4.1...v0.5.0/
|
58
72
|
[v0.4.1]: https://github.com/cedarcode/cose-ruby/compare/v0.4.0...v0.4.1/
|
59
73
|
[v0.4.0]: https://github.com/cedarcode/cose-ruby/compare/v0.3.0...v0.4.0/
|
data/README.md
CHANGED
@@ -30,48 +30,65 @@ Or install it yourself as:
|
|
30
30
|
```ruby
|
31
31
|
cbor_data = "..."
|
32
32
|
|
33
|
-
|
33
|
+
key = COSE::Key.deserialize(cbor_data)
|
34
34
|
```
|
35
35
|
|
36
36
|
Once you have a `COSE::Key` instance you can either access key parameters directly and/or convert it to an
|
37
|
-
`OpenSSL::PKey::PKey` instance for operating with it
|
37
|
+
`OpenSSL::PKey::PKey` instance (if supported for the key type) for operating with it
|
38
|
+
(encrypting/decrypting, signing/verifying, etc).
|
38
39
|
|
39
40
|
```ruby
|
40
41
|
# Convert to an OpenSSL::PKey::PKey
|
41
|
-
|
42
|
+
if key.respond_to?(:to_pkey)
|
43
|
+
openssl_pkey = key.to_pkey
|
44
|
+
end
|
42
45
|
|
43
46
|
# Access COSE key parameters
|
44
47
|
case key
|
48
|
+
when COSE::Key::OKP
|
49
|
+
key.crv
|
50
|
+
key.x
|
51
|
+
key.d
|
45
52
|
when COSE::Key::EC2
|
46
|
-
key.
|
47
|
-
key.
|
48
|
-
key.
|
49
|
-
key.
|
53
|
+
key.crv
|
54
|
+
key.x
|
55
|
+
key.y
|
56
|
+
key.d
|
50
57
|
when COSE::Key::RSA
|
51
|
-
key.
|
52
|
-
key.
|
53
|
-
key.
|
54
|
-
key.
|
55
|
-
key.
|
56
|
-
key.
|
57
|
-
key.
|
58
|
-
key.
|
58
|
+
key.n
|
59
|
+
key.e
|
60
|
+
key.d
|
61
|
+
key.p
|
62
|
+
key.q
|
63
|
+
key.dp
|
64
|
+
key.dq
|
65
|
+
key.qinv
|
59
66
|
when COSE::Key::Symmetric
|
60
|
-
key.
|
67
|
+
key.k
|
61
68
|
end
|
62
69
|
```
|
63
70
|
|
64
71
|
If you already know which COSE key type is encoded in the CBOR data, then:
|
65
72
|
|
73
|
+
```ruby
|
74
|
+
okp_key_cbor = "..."
|
75
|
+
|
76
|
+
cose_okp_key = COSE::Key::OKP.deserialize(okp_key_cbor)
|
77
|
+
|
78
|
+
cose_okp_key.crv
|
79
|
+
cose_okp_key.x
|
80
|
+
cose_okp_key.d
|
81
|
+
```
|
82
|
+
|
66
83
|
```ruby
|
67
84
|
ec2_key_cbor = "..."
|
68
85
|
|
69
86
|
cose_ec2_key = COSE::Key::EC2.deserialize(ec2_key_cbor)
|
70
87
|
|
71
|
-
cose_ec2_key.
|
72
|
-
cose_ec2_key.
|
73
|
-
cose_ec2_key.
|
74
|
-
cose_ec2_key.
|
88
|
+
cose_ec2_key.crv
|
89
|
+
cose_ec2_key.x
|
90
|
+
cose_ec2_key.y
|
91
|
+
cose_ec2_key.d
|
75
92
|
|
76
93
|
# or
|
77
94
|
|
@@ -83,7 +100,7 @@ symmetric_key_cbor = "..."
|
|
83
100
|
|
84
101
|
cose_symmetric_key = COSE::Key::Symmetric.deserialize(symmetric_key_cbor)
|
85
102
|
|
86
|
-
cose_symmetric_key.
|
103
|
+
cose_symmetric_key.k
|
87
104
|
```
|
88
105
|
|
89
106
|
```ruby
|
@@ -91,14 +108,14 @@ rsa_key_cbor = "..."
|
|
91
108
|
|
92
109
|
cose_rsa_key = COSE::Key::RSA.deserialize(rsa_key_cbor)
|
93
110
|
|
94
|
-
cose_rsa_key.
|
95
|
-
cose_rsa_key.
|
96
|
-
cose_rsa_key.
|
97
|
-
cose_rsa_key.
|
98
|
-
cose_rsa_key.
|
99
|
-
cose_rsa_key.
|
100
|
-
cose_rsa_key.
|
101
|
-
cose_rsa_key.
|
111
|
+
cose_rsa_key.n
|
112
|
+
cose_rsa_key.e
|
113
|
+
cose_rsa_key.d
|
114
|
+
cose_rsa_key.p
|
115
|
+
cose_rsa_key.q
|
116
|
+
cose_rsa_key.dp
|
117
|
+
cose_rsa_key.dq
|
118
|
+
cose_rsa_key.qinv
|
102
119
|
|
103
120
|
# or
|
104
121
|
|
data/cose.gemspec
CHANGED
@@ -35,7 +35,7 @@ Gem::Specification.new do |spec|
|
|
35
35
|
|
36
36
|
spec.add_development_dependency "appraisal", "~> 2.2.0"
|
37
37
|
spec.add_development_dependency "bundler", ">= 1.17", "< 3"
|
38
|
-
spec.add_development_dependency "byebug", "
|
38
|
+
spec.add_development_dependency "byebug", ">= 10.0"
|
39
39
|
spec.add_development_dependency "rake", "~> 12.3"
|
40
40
|
spec.add_development_dependency "rspec", "~> 3.8"
|
41
41
|
spec.add_development_dependency "rubocop", "0.65.0"
|
data/lib/cose/key.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "cbor"
|
2
2
|
require "cose/key/ec2"
|
3
|
+
require "cose/key/okp"
|
3
4
|
require "cose/key/rsa"
|
4
5
|
require "cose/key/symmetric"
|
5
6
|
require "openssl"
|
@@ -23,12 +24,16 @@ module COSE
|
|
23
24
|
map = CBOR.decode(data)
|
24
25
|
|
25
26
|
case map[Base::LABEL_KTY]
|
27
|
+
when COSE::Key::OKP::KTY_OKP
|
28
|
+
COSE::Key::OKP.from_map(map)
|
26
29
|
when COSE::Key::EC2::KTY_EC2
|
27
30
|
COSE::Key::EC2.from_map(map)
|
28
31
|
when COSE::Key::RSA::KTY_RSA
|
29
32
|
COSE::Key::RSA.from_map(map)
|
30
33
|
when COSE::Key::Symmetric::KTY_SYMMETRIC
|
31
34
|
COSE::Key::Symmetric.from_map(map)
|
35
|
+
when nil
|
36
|
+
raise UnknownKeyType, "Missing required key type kty label"
|
32
37
|
else
|
33
38
|
raise UnknownKeyType, "Unsupported or unknown key type #{map[Base::LABEL_KTY]}"
|
34
39
|
end
|
data/lib/cose/key/base.rb
CHANGED
@@ -5,16 +5,50 @@ require "cbor"
|
|
5
5
|
module COSE
|
6
6
|
module Key
|
7
7
|
class Base
|
8
|
+
LABEL_BASE_IV = 5
|
9
|
+
LABEL_KEY_OPS = 4
|
10
|
+
LABEL_ALG = 3
|
11
|
+
LABEL_KID = 2
|
8
12
|
LABEL_KTY = 1
|
9
13
|
|
10
14
|
def self.deserialize(cbor)
|
11
15
|
from_map(CBOR.decode(cbor))
|
12
16
|
end
|
13
17
|
|
14
|
-
def self.
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
+
def self.from_map(map)
|
19
|
+
enforce_type(map)
|
20
|
+
|
21
|
+
new(
|
22
|
+
base_iv: map[LABEL_BASE_IV],
|
23
|
+
key_ops: map[LABEL_KEY_OPS],
|
24
|
+
alg: map[LABEL_ALG],
|
25
|
+
kid: map[LABEL_KID],
|
26
|
+
**keyword_arguments_for_initialize(map)
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :kid, :alg, :key_ops, :base_iv
|
31
|
+
|
32
|
+
def initialize(kid: nil, alg: nil, key_ops: nil, base_iv: nil)
|
33
|
+
@kid = kid
|
34
|
+
@alg = alg
|
35
|
+
@key_ops = key_ops
|
36
|
+
@base_iv = base_iv
|
37
|
+
end
|
38
|
+
|
39
|
+
def serialize
|
40
|
+
CBOR.encode(map)
|
41
|
+
end
|
42
|
+
|
43
|
+
def map
|
44
|
+
map = {
|
45
|
+
LABEL_BASE_IV => base_iv,
|
46
|
+
LABEL_KEY_OPS => key_ops,
|
47
|
+
LABEL_ALG => alg,
|
48
|
+
LABEL_KID => kid,
|
49
|
+
}
|
50
|
+
|
51
|
+
map.reject { |_k, v| v.nil? }
|
18
52
|
end
|
19
53
|
end
|
20
54
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cose/key/base"
|
4
|
+
require "openssl"
|
5
|
+
|
6
|
+
module COSE
|
7
|
+
module Key
|
8
|
+
class CurveKey < Base
|
9
|
+
LABEL_CRV = -1
|
10
|
+
LABEL_X = -2
|
11
|
+
LABEL_D = -4
|
12
|
+
|
13
|
+
attr_reader :crv, :d, :x
|
14
|
+
|
15
|
+
def self.keyword_arguments_for_initialize(map)
|
16
|
+
{
|
17
|
+
crv: map[LABEL_CRV],
|
18
|
+
x: map[LABEL_X],
|
19
|
+
d: map[LABEL_D]
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(crv:, x: nil, d: nil, **keyword_arguments) # rubocop:disable Naming/UncommunicativeMethodParamName
|
24
|
+
super(**keyword_arguments)
|
25
|
+
|
26
|
+
if !crv
|
27
|
+
raise ArgumentError, "Required crv is missing"
|
28
|
+
elsif !x && !d
|
29
|
+
raise ArgumentError, "x and d cannot be missing simultaneously"
|
30
|
+
else
|
31
|
+
@crv = crv
|
32
|
+
@x = x
|
33
|
+
@d = d
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def map
|
38
|
+
map = super.merge(
|
39
|
+
LABEL_CRV => crv,
|
40
|
+
LABEL_X => x,
|
41
|
+
LABEL_D => d
|
42
|
+
)
|
43
|
+
|
44
|
+
map.reject { |_k, v| v.nil? }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/cose/key/ec2.rb
CHANGED
@@ -1,17 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "cose/key/
|
3
|
+
require "cose/key/curve_key"
|
4
4
|
require "openssl"
|
5
5
|
|
6
6
|
module COSE
|
7
7
|
module Key
|
8
|
-
class EC2 <
|
9
|
-
|
10
|
-
|
11
|
-
CRV_LABEL = -1
|
12
|
-
D_LABEL = -4
|
13
|
-
X_LABEL = -2
|
14
|
-
Y_LABEL = -3
|
8
|
+
class EC2 < CurveKey
|
9
|
+
LABEL_Y = -3
|
15
10
|
|
16
11
|
KTY_EC2 = 2
|
17
12
|
CRV_P256 = 1
|
@@ -24,6 +19,12 @@ module COSE
|
|
24
19
|
CRV_P521 => "secp521r1"
|
25
20
|
}.freeze
|
26
21
|
|
22
|
+
def self.enforce_type(map)
|
23
|
+
if map[LABEL_KTY] != KTY_EC2
|
24
|
+
raise "Not an EC2 key"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
27
28
|
def self.from_pkey(pkey)
|
28
29
|
curve = PKEY_CURVES.key(pkey.group.curve_name) || raise("Unsupported EC curve #{pkey.group.curve_name}")
|
29
30
|
|
@@ -42,73 +43,58 @@ module COSE
|
|
42
43
|
|
43
44
|
coordinate_length = bytes.size / 2
|
44
45
|
|
45
|
-
|
46
|
-
|
46
|
+
x = bytes[0..(coordinate_length - 1)]
|
47
|
+
y = bytes[coordinate_length..-1]
|
47
48
|
end
|
48
49
|
|
49
50
|
if private_key
|
50
|
-
|
51
|
+
d = private_key.to_s(2)
|
51
52
|
end
|
52
53
|
|
53
|
-
new(
|
54
|
+
new(crv: curve, x: x, y: y, d: d)
|
54
55
|
end
|
55
56
|
|
56
|
-
attr_reader :
|
57
|
+
attr_reader :y
|
57
58
|
|
58
|
-
def initialize(
|
59
|
-
if !
|
60
|
-
raise ArgumentError, "
|
61
|
-
elsif !x_coordinate
|
62
|
-
raise ArgumentError, "Required x-coordinate is missing"
|
63
|
-
elsif !y_coordinate
|
64
|
-
raise ArgumentError, "Required y-coordinate is missing"
|
59
|
+
def initialize(y: nil, **keyword_arguments) # rubocop:disable Naming/UncommunicativeMethodParamName
|
60
|
+
if (!y || !keyword_arguments[:x]) && !keyword_arguments[:d]
|
61
|
+
raise ArgumentError, "Both x and y are required if d is missing"
|
65
62
|
else
|
66
|
-
|
67
|
-
|
68
|
-
@
|
69
|
-
@x_coordinate = x_coordinate
|
70
|
-
@y_coordinate = y_coordinate
|
63
|
+
super(**keyword_arguments)
|
64
|
+
|
65
|
+
@y = y
|
71
66
|
end
|
72
67
|
end
|
73
68
|
|
74
|
-
def
|
75
|
-
|
69
|
+
def map
|
70
|
+
map = super.merge(
|
76
71
|
Base::LABEL_KTY => KTY_EC2,
|
77
|
-
|
78
|
-
X_LABEL => x_coordinate,
|
79
|
-
Y_LABEL => y_coordinate,
|
80
|
-
D_LABEL => d_coordinate
|
72
|
+
LABEL_Y => y,
|
81
73
|
)
|
74
|
+
|
75
|
+
map.reject { |_k, v| v.nil? }
|
82
76
|
end
|
83
77
|
|
84
78
|
def to_pkey
|
85
|
-
if PKEY_CURVES[
|
86
|
-
group = OpenSSL::PKey::EC::Group.new(PKEY_CURVES[
|
79
|
+
if PKEY_CURVES[crv]
|
80
|
+
group = OpenSSL::PKey::EC::Group.new(PKEY_CURVES[crv])
|
87
81
|
pkey = OpenSSL::PKey::EC.new(group)
|
88
|
-
public_key_bn = OpenSSL::BN.new("\x04" +
|
82
|
+
public_key_bn = OpenSSL::BN.new("\x04" + x + y, 2)
|
89
83
|
public_key_point = OpenSSL::PKey::EC::Point.new(group, public_key_bn)
|
90
84
|
pkey.public_key = public_key_point
|
91
85
|
|
92
|
-
if
|
93
|
-
pkey.private_key = OpenSSL::BN.new(
|
86
|
+
if d
|
87
|
+
pkey.private_key = OpenSSL::BN.new(d, 2)
|
94
88
|
end
|
95
89
|
|
96
90
|
pkey
|
97
91
|
else
|
98
|
-
raise "Unsupported curve #{
|
92
|
+
raise "Unsupported curve #{crv}"
|
99
93
|
end
|
100
94
|
end
|
101
95
|
|
102
|
-
def self.
|
103
|
-
|
104
|
-
|
105
|
-
new(
|
106
|
-
algorithm: map[ALG_LABEL],
|
107
|
-
curve: map[CRV_LABEL],
|
108
|
-
d_coordinate: map[D_LABEL],
|
109
|
-
x_coordinate: map[X_LABEL],
|
110
|
-
y_coordinate: map[Y_LABEL]
|
111
|
-
)
|
96
|
+
def self.keyword_arguments_for_initialize(map)
|
97
|
+
super.merge(y: map[LABEL_Y])
|
112
98
|
end
|
113
99
|
end
|
114
100
|
end
|
data/lib/cose/key/okp.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cose/key/curve_key"
|
4
|
+
require "openssl"
|
5
|
+
|
6
|
+
module COSE
|
7
|
+
module Key
|
8
|
+
class OKP < CurveKey
|
9
|
+
KTY_OKP = 1
|
10
|
+
|
11
|
+
def self.enforce_type(map)
|
12
|
+
if map[LABEL_KTY] != KTY_OKP
|
13
|
+
raise "Not an OKP key"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def map
|
18
|
+
super.merge(LABEL_KTY => KTY_OKP)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/cose/key/rsa.rb
CHANGED
@@ -11,99 +11,124 @@ module COSE
|
|
11
11
|
LABEL_D = -3
|
12
12
|
LABEL_P = -4
|
13
13
|
LABEL_Q = -5
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
LABEL_DP = -6
|
15
|
+
LABEL_DQ = -7
|
16
|
+
LABEL_QINV = -8
|
17
17
|
|
18
18
|
KTY_RSA = 3
|
19
19
|
|
20
|
+
def self.enforce_type(map)
|
21
|
+
if map[LABEL_KTY] != KTY_RSA
|
22
|
+
raise "Not an RSA key"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
20
26
|
def self.from_pkey(pkey)
|
21
27
|
params = pkey.params
|
22
28
|
|
23
29
|
attributes = {
|
24
|
-
|
25
|
-
|
30
|
+
n: params["n"].to_s(2),
|
31
|
+
e: params["e"].to_s(2)
|
26
32
|
}
|
27
33
|
|
28
34
|
if pkey.private?
|
29
35
|
attributes.merge!(
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
+
d: params["d"].to_s(2),
|
37
|
+
p: params["p"].to_s(2),
|
38
|
+
q: params["q"].to_s(2),
|
39
|
+
dp: params["dmp1"].to_s(2),
|
40
|
+
dq: params["dmq1"].to_s(2),
|
41
|
+
qinv: params["iqmp"].to_s(2)
|
36
42
|
)
|
37
43
|
end
|
38
44
|
|
39
45
|
new(attributes)
|
40
46
|
end
|
41
47
|
|
42
|
-
attr_reader
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
)
|
52
|
-
|
53
|
-
def initialize(
|
54
|
-
modulus_n:,
|
55
|
-
public_exponent_e:,
|
56
|
-
private_exponent_d: nil,
|
57
|
-
prime_factor_p: nil,
|
58
|
-
prime_factor_q: nil,
|
59
|
-
d_p: nil,
|
60
|
-
d_q: nil,
|
61
|
-
q_inv: nil
|
62
|
-
)
|
63
|
-
if !modulus_n
|
64
|
-
raise ArgumentError, "Required modulus_n is missing"
|
65
|
-
elsif !public_exponent_e
|
66
|
-
raise ArgumentError, "Required public_exponent_e is missing"
|
48
|
+
attr_reader :n, :e, :d, :p, :q, :dp, :dq, :qinv
|
49
|
+
|
50
|
+
def initialize(n:, e:, d: nil, p: nil, q: nil, dp: nil, dq: nil, qinv: nil, **keyword_arguments) # rubocop:disable Naming/UncommunicativeMethodParamName
|
51
|
+
super(**keyword_arguments)
|
52
|
+
|
53
|
+
if !n
|
54
|
+
raise ArgumentError, "Required public field n is missing"
|
55
|
+
elsif !e
|
56
|
+
raise ArgumentError, "Required public field e is missing"
|
67
57
|
else
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
58
|
+
private_fields = { d: d, p: p, q: q, dp: dp, dq: dq, qinv: qinv }
|
59
|
+
|
60
|
+
if private_fields.values.all?(&:nil?) || private_fields.values.none?(&:nil?)
|
61
|
+
@n = n
|
62
|
+
@e = e
|
63
|
+
@d = d
|
64
|
+
@p = p
|
65
|
+
@q = q
|
66
|
+
@dp = dp
|
67
|
+
@dq = dq
|
68
|
+
@qinv = qinv
|
69
|
+
else
|
70
|
+
missing = private_fields.detect { |_k, v| v.nil? }[0]
|
71
|
+
raise ArgumentError, "Incomplete private fields, #{missing} is missing"
|
72
|
+
end
|
76
73
|
end
|
77
74
|
end
|
78
75
|
|
79
|
-
def
|
80
|
-
|
76
|
+
def map
|
77
|
+
map = super.merge(
|
81
78
|
Base::LABEL_KTY => KTY_RSA,
|
82
|
-
LABEL_N =>
|
83
|
-
LABEL_E =>
|
84
|
-
LABEL_D =>
|
85
|
-
LABEL_P =>
|
86
|
-
LABEL_Q =>
|
87
|
-
|
88
|
-
|
89
|
-
|
79
|
+
LABEL_N => n,
|
80
|
+
LABEL_E => e,
|
81
|
+
LABEL_D => d,
|
82
|
+
LABEL_P => p,
|
83
|
+
LABEL_Q => q,
|
84
|
+
LABEL_DP => dp,
|
85
|
+
LABEL_DQ => dq,
|
86
|
+
LABEL_QINV => qinv
|
90
87
|
)
|
88
|
+
|
89
|
+
map.reject { |_k, v| v.nil? }
|
91
90
|
end
|
92
91
|
|
93
92
|
def to_pkey
|
94
93
|
pkey = OpenSSL::PKey::RSA.new
|
95
94
|
|
96
|
-
pkey.set_key
|
97
|
-
|
98
|
-
|
95
|
+
if pkey.respond_to?(:set_key)
|
96
|
+
pkey.set_key(bn(n), bn(e), bn(d))
|
97
|
+
else
|
98
|
+
pkey.n = bn(n)
|
99
|
+
pkey.e = bn(e)
|
100
|
+
pkey.d = bn(d)
|
101
|
+
end
|
102
|
+
|
103
|
+
if pkey.respond_to?(:set_factors)
|
104
|
+
pkey.set_factors(bn(p), bn(q))
|
105
|
+
else
|
106
|
+
pkey.p = bn(p)
|
107
|
+
pkey.q = bn(q)
|
108
|
+
end
|
109
|
+
|
110
|
+
if pkey.respond_to?(:set_crt_params)
|
111
|
+
pkey.set_crt_params(bn(dp), bn(dq), bn(qinv))
|
112
|
+
else
|
113
|
+
pkey.dmp1 = bn(dp)
|
114
|
+
pkey.dmq1 = bn(dq)
|
115
|
+
pkey.iqmp = bn(qinv)
|
116
|
+
end
|
99
117
|
|
100
118
|
pkey
|
101
119
|
end
|
102
120
|
|
103
|
-
def self.
|
104
|
-
|
105
|
-
|
106
|
-
|
121
|
+
def self.keyword_arguments_for_initialize(map)
|
122
|
+
{
|
123
|
+
n: map[LABEL_N],
|
124
|
+
e: map[LABEL_E],
|
125
|
+
d: map[LABEL_D],
|
126
|
+
p: map[LABEL_P],
|
127
|
+
q: map[LABEL_Q],
|
128
|
+
dp: map[LABEL_DP],
|
129
|
+
dq: map[LABEL_DQ],
|
130
|
+
qinv: map[LABEL_QINV]
|
131
|
+
}
|
107
132
|
end
|
108
133
|
|
109
134
|
private
|
data/lib/cose/key/symmetric.rb
CHANGED
@@ -5,23 +5,34 @@ require "cose/key/base"
|
|
5
5
|
module COSE
|
6
6
|
module Key
|
7
7
|
class Symmetric < Base
|
8
|
-
|
8
|
+
LABEL_K = -1
|
9
|
+
|
9
10
|
KTY_SYMMETRIC = 4
|
10
11
|
|
11
|
-
attr_reader :
|
12
|
+
attr_reader :k
|
12
13
|
|
13
|
-
def
|
14
|
-
if
|
15
|
-
raise
|
14
|
+
def self.enforce_type(map)
|
15
|
+
if map[LABEL_KTY] != KTY_SYMMETRIC
|
16
|
+
raise "Not a Symmetric key"
|
16
17
|
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(k:, **keyword_arguments) # rubocop:disable Naming/UncommunicativeMethodParamName
|
21
|
+
super(**keyword_arguments)
|
17
22
|
|
18
|
-
|
23
|
+
if !k
|
24
|
+
raise ArgumentError, "Required key value k is missing"
|
25
|
+
else
|
26
|
+
@k = k
|
27
|
+
end
|
19
28
|
end
|
20
29
|
|
21
|
-
def
|
22
|
-
|
30
|
+
def map
|
31
|
+
super.merge(LABEL_KTY => KTY_SYMMETRIC, LABEL_K => k)
|
32
|
+
end
|
23
33
|
|
24
|
-
|
34
|
+
def self.keyword_arguments_for_initialize(map)
|
35
|
+
{ k: map[LABEL_K] }
|
25
36
|
end
|
26
37
|
end
|
27
38
|
end
|
data/lib/cose/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gonzalo Rodriguez
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-03
|
12
|
+
date: 2019-04-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cbor
|
@@ -63,16 +63,16 @@ dependencies:
|
|
63
63
|
name: byebug
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '10.0'
|
69
69
|
type: :development
|
70
70
|
prerelease: false
|
71
71
|
version_requirements: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '10.0'
|
76
76
|
- !ruby/object:Gem::Dependency
|
77
77
|
name: rake
|
78
78
|
requirement: !ruby/object:Gem::Requirement
|
@@ -138,12 +138,15 @@ files:
|
|
138
138
|
- cose.gemspec
|
139
139
|
- gemfiles/openssl_2_0.gemfile
|
140
140
|
- gemfiles/openssl_2_1.gemfile
|
141
|
+
- gemfiles/openssl_default.gemfile
|
141
142
|
- lib/cose.rb
|
142
143
|
- lib/cose/encrypt.rb
|
143
144
|
- lib/cose/encrypt0.rb
|
144
145
|
- lib/cose/key.rb
|
145
146
|
- lib/cose/key/base.rb
|
147
|
+
- lib/cose/key/curve_key.rb
|
146
148
|
- lib/cose/key/ec2.rb
|
149
|
+
- lib/cose/key/okp.rb
|
147
150
|
- lib/cose/key/rsa.rb
|
148
151
|
- lib/cose/key/symmetric.rb
|
149
152
|
- lib/cose/mac.rb
|