Class: COSE::Key::EC2

Inherits:
CurveKey show all
Defined in:
lib/cose/key/ec2.rb

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

Attributes inherited from CurveKey

#crv, #d, #x

Attributes inherited from Base

#alg, #base_iv, #key_ops, #kid

Class Method Summary collapse

Instance Method Summary collapse

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

#yObject (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

#curveObject



86
87
88
# File 'lib/cose/key/ec2.rb', line 86

def curve
  Curve.find(crv)
end

#mapObject



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_pkeyObject



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