Method: COSE::Key::EC2#to_key

Defined in:
lib/cose/key/ec2.rb

#to_keyObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/cose/key/ec2.rb', line 62

def to_key
  point = OpenSSL::PKey::EC::Point.new(
    OpenSSL::PKey::EC::Group.new(crv_name),
    OpenSSL::BN.new(['04' + x.unpack('H*').first + y.unpack('H*').first].pack('H*'), 2)
  )

  # Public key
  data_sequence = OpenSSL::ASN1::Sequence([
    OpenSSL::ASN1::Sequence([
      OpenSSL::ASN1::ObjectId("id-ecPublicKey"),
      OpenSSL::ASN1::ObjectId(crv_name)
    ]),
    OpenSSL::ASN1::BitString(point.to_octet_string(:uncompressed))
  ])

  if d
    # Private key
    data_sequence = OpenSSL::ASN1::Sequence([
      OpenSSL::ASN1::Integer(1),
      OpenSSL::ASN1::OctetString(OpenSSL::BN.new(d, 2).to_s(2)),
      OpenSSL::ASN1::ObjectId(crv_name, 0, :EXPLICIT),
      OpenSSL::ASN1::BitString(point.to_octet_string(:uncompressed), 1, :EXPLICIT)
    ])
  end

  OpenSSL::PKey::EC.new(data_sequence.to_der)
end