Skip to content

Commit 95531e0

Browse files
committed
Support signing requests using ED25519
Allow requests to be signed using ED25519 private keys by passing a nil digest. This is similar to commit f463f56 when signing certs. Note ED25519 keys do not implement the same `public_key` method, so the test must special case based on oid.
1 parent 8367b16 commit 95531e0

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

ext/openssl/ossl_x509req.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,11 @@ ossl_x509req_sign(VALUE self, VALUE key, VALUE digest)
312312

313313
GetX509Req(self, req);
314314
pkey = GetPrivPKeyPtr(key); /* NO NEED TO DUP */
315-
md = ossl_evp_get_digestbyname(digest);
315+
if (NIL_P(digest)) {
316+
md = NULL; /* needed for some key types, e.g. Ed25519 */
317+
} else {
318+
md = ossl_evp_get_digestbyname(digest);
319+
}
316320
if (!X509_REQ_sign(req, pkey, md)) {
317321
ossl_raise(eX509ReqError, NULL);
318322
}

test/openssl/test_x509req.rb

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ def issue_csr(ver, dn, key, digest)
1717
req = OpenSSL::X509::Request.new
1818
req.version = ver
1919
req.subject = dn
20-
req.public_key = key.public_key
20+
if key.oid == "ED25519"
21+
req.public_key = key
22+
else
23+
req.public_key = key.public_key
24+
end
2125
req.sign(key, digest)
2226
req
2327
end
@@ -132,6 +136,29 @@ def test_sign_and_verify_dsa_md5
132136
issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('MD5')) }
133137
end
134138

139+
def test_sign_and_verify_ed25519
140+
# See test_ed25519 in test_pkey.rb
141+
142+
# Ed25519 is not FIPS-approved.
143+
omit_on_fips
144+
145+
begin
146+
ed25519 = OpenSSL::PKey::generate_key("ED25519")
147+
rescue OpenSSL::PKey::PKeyError => e
148+
# OpenSSL < 1.1.1
149+
#
150+
pend "Ed25519 is not implemented" unless openssl?(1, 1, 1)
151+
152+
raise e
153+
end
154+
155+
# See ASN1_item_sign_ctx in ChangeLog for 3.8.1: https://github.com/libressl/portable/blob/master/ChangeLog
156+
pend 'ASN1 signing with Ed25519 not yet working' unless openssl? or libressl?(3, 8, 1)
157+
158+
req = issue_csr(0, @dn, ed25519, nil)
159+
assert_equal(true, req.verify(ed25519))
160+
end
161+
135162
def test_dup
136163
req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
137164
assert_equal(req.to_der, req.dup.to_der)

0 commit comments

Comments
 (0)