Class: COSE::Key::EC2
Constant Summary collapse
- LABEL_Y =
-3- KTY_EC2 =
2
Constants inherited from CurveKey
CurveKey::LABEL_CRV, CurveKey::LABEL_D, CurveKey::LABEL_X
Constants inherited from Base
Base::LABEL_ALG, Base::LABEL_BASE_IV, Base::LABEL_KEY_OPS, Base::LABEL_KID, Base::LABEL_KTY
Instance Attribute Summary collapse
-
#y ⇒ Object
readonly
Returns the value of attribute y.
Attributes inherited from CurveKey
Attributes inherited from Base
#alg, #base_iv, #key_ops, #kid
Class Method Summary collapse
- .enforce_type(map) ⇒ Object
- .from_pkey(pkey) ⇒ Object
- .keyword_arguments_for_initialize(map) ⇒ Object
Instance Method Summary collapse
- #curve ⇒ Object
-
#initialize(y: nil, **keyword_arguments) ⇒ EC2
constructor
rubocop:disable Naming/MethodParameterName.
- #map ⇒ Object
- #to_pkey ⇒ Object
Methods inherited from Base
deserialize, from_map, #serialize
Constructor Details
#initialize(y: nil, **keyword_arguments) ⇒ EC2
rubocop:disable Naming/MethodParameterName
51 52 53 54 55 56 57 58 59 |
# File 'lib/cose/key/ec2.rb', line 51 def initialize(y: nil, **keyword_arguments) # rubocop:disable Naming/MethodParameterName if (!y || !keyword_arguments[:x]) && !keyword_arguments[:d] raise ArgumentError, "Both x and y are required if d is missing" else super(**keyword_arguments) @y = y end end |
Instance Attribute Details
#y ⇒ Object (readonly)
Returns the value of attribute y.
49 50 51 |
# File 'lib/cose/key/ec2.rb', line 49 def y @y end |
Class Method Details
.enforce_type(map) ⇒ Object
14 15 16 17 18 |
# File 'lib/cose/key/ec2.rb', line 14 def self.enforce_type(map) if map[LABEL_KTY] != KTY_EC2 raise "Not an EC2 key" end end |
.from_pkey(pkey) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/cose/key/ec2.rb', line 20 def self.from_pkey(pkey) curve = Curve.by_pkey_name(pkey.group.curve_name) || raise("Unsupported EC curve #{pkey.group.curve_name}") case pkey when OpenSSL::PKey::EC::Point public_key = pkey when OpenSSL::PKey::EC public_key = pkey.public_key private_key = pkey.private_key else raise "Unsupported" end if public_key bytes = public_key.to_bn.to_s(2)[1..-1] coordinate_length = bytes.size / 2 x = bytes[0..(coordinate_length - 1)] y = bytes[coordinate_length..-1] end if private_key d = private_key.to_s(2) end new(crv: curve.id, x: x, y: y, d: d) end |
.keyword_arguments_for_initialize(map) ⇒ Object
90 91 92 |
# File 'lib/cose/key/ec2.rb', line 90 def self.keyword_arguments_for_initialize(map) super.merge(y: map[LABEL_Y]) end |
Instance Method Details
#curve ⇒ Object
86 87 88 |
# File 'lib/cose/key/ec2.rb', line 86 def curve Curve.find(crv) end |
#map ⇒ Object
61 62 63 64 65 66 |
# File 'lib/cose/key/ec2.rb', line 61 def map super.merge( Base::LABEL_KTY => KTY_EC2, LABEL_Y => y, ).compact end |
#to_pkey ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/cose/key/ec2.rb', line 68 def to_pkey if curve group = OpenSSL::PKey::EC::Group.new(curve.pkey_name) pkey = OpenSSL::PKey::EC.new(group) public_key_bn = OpenSSL::BN.new("\x04" + x + y, 2) public_key_point = OpenSSL::PKey::EC::Point.new(group, public_key_bn) pkey.public_key = public_key_point if d pkey.private_key = OpenSSL::BN.new(d, 2) end pkey else raise "Unsupported curve #{crv}" end end |