Class: Webpush::VapidKey

Inherits:
Object
  • Object
show all
Defined in:
lib/webpush/vapid_key.rb

Overview

Class for abstracting the generation and encoding of elliptic curve public and private keys for use with the VAPID protocol

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeVapidKey

Returns a new instance of VapidKey.



19
20
21
22
# File 'lib/webpush/vapid_key.rb', line 19

def initialize
  @curve = OpenSSL::PKey::EC.new('prime256v1')
  @curve.generate_key
end

Instance Attribute Details

#:curveOpenSSL::PKey::EC (readonly)

the OpenSSL elliptic curve instance

Returns:

  • (OpenSSL::PKey::EC)

    the current value of :curve



5
6
7
# File 'lib/webpush/vapid_key.rb', line 5

def :curve
  @:curve
end

#curveObject (readonly)

Returns the value of attribute curve.



17
18
19
# File 'lib/webpush/vapid_key.rb', line 17

def curve
  @curve
end

Class Method Details

.from_keys(public_key, private_key) ⇒ Webpush::VapidKey

Create a VapidKey instance from encoded elliptic curve public and private keys

Returns:



9
10
11
12
13
14
15
# File 'lib/webpush/vapid_key.rb', line 9

def self.from_keys(public_key, private_key)
  key = new
  key.public_key = public_key
  key.private_key = private_key

  key
end

Instance Method Details

#curve_nameObject



53
54
55
# File 'lib/webpush/vapid_key.rb', line 53

def curve_name
  group.curve_name
end

#groupObject



57
58
59
# File 'lib/webpush/vapid_key.rb', line 57

def group
  curve.group
end

#inspectObject



66
67
68
# File 'lib/webpush/vapid_key.rb', line 66

def inspect
  "#<#{self.class}:#{object_id.to_s(16)} #{to_h.map { |k, v| ":#{k}=#{v}" }.join(" ")}>"
end

#private_keyString

Retrive the encoded elliptic curve private key for VAPID protocol

Returns:

  • (String)

    base64 urlsafe-encoded binary representation of 32-byte VAPID private key



41
42
43
# File 'lib/webpush/vapid_key.rb', line 41

def private_key
  encode64(curve.private_key.to_s(2))
end

#private_key=(key) ⇒ Object



49
50
51
# File 'lib/webpush/vapid_key.rb', line 49

def private_key=(key)
  curve.private_key = to_big_num(key)
end

#public_keyString

Retrieve the encoded elliptic curve public key for VAPID protocol

Returns:

  • (String)

    encoded binary representation of 65-byte VAPID public key



27
28
29
# File 'lib/webpush/vapid_key.rb', line 27

def public_key
  encode64(curve.public_key.to_bn.to_s(2))
end

#public_key=(key) ⇒ Object



45
46
47
# File 'lib/webpush/vapid_key.rb', line 45

def public_key=(key)
  curve.public_key = OpenSSL::PKey::EC::Point.new(group, to_big_num(key))
end

#public_key_for_push_headerString

Retrieve the encoded elliptic curve public key suitable for the Web Push request

Returns:

  • (String)

    the encoded VAPID public key for us in ‘Encryption’ header



34
35
36
# File 'lib/webpush/vapid_key.rb', line 34

def public_key_for_push_header
  trim_encode64(curve.public_key.to_bn.to_s(2))
end

#to_hObject Also known as: to_hash



61
62
63
# File 'lib/webpush/vapid_key.rb', line 61

def to_h
  { public_key: public_key, private_key: private_key }
end