Skip to content

Commit 7fa47ce

Browse files
collimarcoClearlyClairexfalcox
committed
Add support for OpenSSL 3
Co-Authored-By: ClearlyClaire <[email protected]> Co-Authored-By: xfalcox <[email protected]>
1 parent f9e7f65 commit 7fa47ce

File tree

4 files changed

+36
-20
lines changed

4 files changed

+36
-20
lines changed

lib/web_push/encryption.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ def encrypt(message, p256dh, auth)
1010
group_name = 'prime256v1'
1111
salt = Random.new.bytes(16)
1212

13-
server = OpenSSL::PKey::EC.new(group_name)
14-
server.generate_key
13+
server = OpenSSL::PKey::EC.generate(group_name)
1514
server_public_key_bn = server.public_key.to_bn
1615

1716
group = OpenSSL::PKey::EC::Group.new(group_name)

lib/web_push/vapid_key.rb

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,22 @@ class VapidKey
1010
# @return [WebPush::VapidKey] a VapidKey instance for the given public and private keys
1111
def self.from_keys(public_key, private_key)
1212
key = new
13-
key.public_key = public_key
14-
key.private_key = private_key
15-
13+
key.set_keys! public_key, private_key
1614
key
1715
end
1816

1917
# Create a VapidKey instance from pem encoded elliptic curve public and private keys
2018
#
2119
# @return [WebPush::VapidKey] a VapidKey instance for the given public and private keys
2220
def self.from_pem(pem)
23-
key = new
24-
src = OpenSSL::PKey.read pem
25-
key.curve.public_key = src.public_key
26-
key.curve.private_key = src.private_key
27-
28-
key
21+
new(OpenSSL::PKey.read(pem))
2922
end
3023

3124
attr_reader :curve
3225

33-
def initialize
34-
@curve = OpenSSL::PKey::EC.new('prime256v1')
35-
@curve.generate_key
26+
def initialize(pkey = nil)
27+
@curve = pkey
28+
@curve = OpenSSL::PKey::EC.generate('prime256v1') if @curve.nil?
3629
end
3730

3831
# Retrieve the encoded elliptic curve public key for VAPID protocol
@@ -57,11 +50,37 @@ def private_key
5750
end
5851

5952
def public_key=(key)
60-
curve.public_key = OpenSSL::PKey::EC::Point.new(group, to_big_num(key))
53+
set_keys! key, nil
6154
end
6255

6356
def private_key=(key)
64-
curve.private_key = to_big_num(key)
57+
set_keys! nil, key
58+
end
59+
60+
def set_keys!(public_key = nil, private_key = nil)
61+
if public_key.nil?
62+
public_key = curve.public_key
63+
else
64+
public_key = OpenSSL::PKey::EC::Point.new(group, to_big_num(public_key))
65+
end
66+
67+
if private_key.nil?
68+
private_key = curve.private_key
69+
else
70+
private_key = to_big_num(private_key)
71+
end
72+
73+
asn1 = OpenSSL::ASN1::Sequence([
74+
OpenSSL::ASN1::Integer.new(1),
75+
# Not properly padded but OpenSSL doesn't mind
76+
OpenSSL::ASN1::OctetString(private_key.to_s(2)),
77+
OpenSSL::ASN1::ObjectId('prime256v1', 0, :EXPLICIT),
78+
OpenSSL::ASN1::BitString(public_key.to_octet_string(:uncompressed), 1, :EXPLICIT),
79+
])
80+
81+
der = asn1.to_der
82+
83+
@curve = OpenSSL::PKey::EC.new(der)
6584
end
6685

6786
def curve_name

lib/web_push/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module WebPush
4-
VERSION = '2.1.0'.freeze
4+
VERSION = '3.0.0'.freeze
55
end

spec/web_push/encryption_spec.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
describe '#encrypt' do
55
let(:curve) do
66
group = 'prime256v1'
7-
curve = OpenSSL::PKey::EC.new(group)
8-
curve.generate_key
9-
curve
7+
OpenSSL::PKey::EC.generate(group)
108
end
119

1210
let(:p256dh) do

0 commit comments

Comments
 (0)