Skip to content

Commit 7a5d567

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 b0fc100 when signing certs. Calling PKey#public_key is deprecated and does not work for Ed25519. The same can be accomplished by passing the private key.
1 parent b4f8aab commit 7a5d567

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
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: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,26 @@ def setup
1313
@dn = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=GOTOU Yuuzou")
1414
end
1515

16+
1617
def issue_csr(ver, dn, key, digest)
1718
req = OpenSSL::X509::Request.new
1819
req.version = ver
1920
req.subject = dn
20-
req.public_key = key.public_key
21+
req.public_key = key
2122
req.sign(key, digest)
2223
req
2324
end
2425

2526
def test_public_key
2627
req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
27-
assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
28+
assert_equal(@rsa1024.to_der, req.public_key.to_der)
2829
req = OpenSSL::X509::Request.new(req.to_der)
29-
assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
30+
assert_equal(@rsa1024.public_to_der, req.public_key.to_der)
3031

3132
req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256'))
32-
assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
33+
assert_equal(@dsa512.to_der, req.public_key.to_der)
3334
req = OpenSSL::X509::Request.new(req.to_der)
34-
assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
35+
assert_equal(@dsa512.public_to_der, req.public_key.to_der)
3536
end
3637

3738
def test_version
@@ -132,6 +133,14 @@ def test_sign_and_verify_dsa_md5
132133
issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('MD5')) }
133134
end
134135

136+
def test_sign_and_verify_ed25519
137+
omit_on_fips
138+
omit "Ed25519 not supported" unless openssl?(1, 1, 1) || libressl?(3, 8, 1)
139+
ed25519 = OpenSSL::PKey::generate_key("ED25519")
140+
req = issue_csr(0, @dn, ed25519, nil)
141+
assert_equal(true, req.verify(ed25519))
142+
end
143+
135144
def test_dup
136145
req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
137146
assert_equal(req.to_der, req.dup.to_der)

0 commit comments

Comments
 (0)