@@ -1968,6 +1968,84 @@ def test_ciphers_method_bogus_csuite
19681968 ) { ssl_ctx . ciphers = 'BOGUS' }
19691969 end
19701970
1971+ def test_sigalgs
1972+ omit "SSL_CTX_set1_sigalgs_list() not supported" if libressl?
1973+
1974+ svr_exts = [
1975+ [ "keyUsage" , "keyEncipherment,digitalSignature" , true ] ,
1976+ [ "subjectAltName" , "DNS:localhost" , false ] ,
1977+ ]
1978+ ecdsa_key = Fixtures . pkey ( "p256" )
1979+ ecdsa_cert = issue_cert ( @svr , ecdsa_key , 10 , svr_exts , @ca_cert , @ca_key )
1980+
1981+ ctx_proc = -> ctx {
1982+ # Unset values set by start_server
1983+ ctx . cert = ctx . key = ctx . extra_chain_cert = nil
1984+ ctx . add_certificate ( @svr_cert , @svr_key , [ @ca_cert ] ) # RSA
1985+ ctx . add_certificate ( ecdsa_cert , ecdsa_key , [ @ca_cert ] ) # ECDSA
1986+ }
1987+ start_server ( ctx_proc : ctx_proc ) do |port |
1988+ ctx1 = OpenSSL ::SSL ::SSLContext . new
1989+ ctx1 . sigalgs = "rsa_pss_rsae_sha256"
1990+ server_connect ( port , ctx1 ) { |ssl |
1991+ assert_kind_of ( OpenSSL ::PKey ::RSA , ssl . peer_cert . public_key )
1992+ ssl . puts ( "abc" ) ; ssl . gets
1993+ }
1994+
1995+ ctx2 = OpenSSL ::SSL ::SSLContext . new
1996+ ctx2 . sigalgs = "ed25519:ecdsa_secp256r1_sha256"
1997+ server_connect ( port , ctx2 ) { |ssl |
1998+ assert_kind_of ( OpenSSL ::PKey ::EC , ssl . peer_cert . public_key )
1999+ ssl . puts ( "abc" ) ; ssl . gets
2000+ }
2001+ end
2002+
2003+ # Frozen
2004+ ssl_ctx = OpenSSL ::SSL ::SSLContext . new
2005+ ssl_ctx . freeze
2006+ assert_raise ( FrozenError ) { ssl_ctx . sigalgs = "ECDSA+SHA256:RSA+SHA256" }
2007+
2008+ # Bogus
2009+ ssl_ctx = OpenSSL ::SSL ::SSLContext . new
2010+ assert_raise ( TypeError ) { ssl_ctx . sigalgs = nil }
2011+ assert_raise ( OpenSSL ::SSL ::SSLError ) { ssl_ctx . sigalgs = "BOGUS" }
2012+ end
2013+
2014+ def test_client_sigalgs
2015+ omit "SSL_CTX_set1_client_sigalgs_list() not supported" if libressl? || aws_lc?
2016+
2017+ cli_exts = [
2018+ [ "keyUsage" , "keyEncipherment,digitalSignature" , true ] ,
2019+ [ "subjectAltName" , "DNS:localhost" , false ] ,
2020+ ]
2021+ ecdsa_key = Fixtures . pkey ( "p256" )
2022+ ecdsa_cert = issue_cert ( @cli , ecdsa_key , 10 , cli_exts , @ca_cert , @ca_key )
2023+
2024+ ctx_proc = -> ctx {
2025+ store = OpenSSL ::X509 ::Store . new
2026+ store . add_cert ( @ca_cert )
2027+ store . purpose = OpenSSL ::X509 ::PURPOSE_SSL_CLIENT
2028+ ctx . cert_store = store
2029+ ctx . verify_mode = OpenSSL ::SSL ::VERIFY_PEER |OpenSSL ::SSL ::VERIFY_FAIL_IF_NO_PEER_CERT
2030+ ctx . client_sigalgs = "ECDSA+SHA256"
2031+ }
2032+ start_server ( ctx_proc : ctx_proc , ignore_listener_error : true ) do |port |
2033+ ctx1 = OpenSSL ::SSL ::SSLContext . new
2034+ ctx1 . add_certificate ( @cli_cert , @cli_key ) # RSA
2035+ assert_handshake_error {
2036+ server_connect ( port , ctx1 ) { |ssl |
2037+ ssl . puts ( "abc" ) ; ssl . gets
2038+ }
2039+ }
2040+
2041+ ctx2 = OpenSSL ::SSL ::SSLContext . new
2042+ ctx2 . add_certificate ( ecdsa_cert , ecdsa_key ) # ECDSA
2043+ server_connect ( port , ctx2 ) { |ssl |
2044+ ssl . puts ( "abc" ) ; ssl . gets
2045+ }
2046+ end
2047+ end
2048+
19712049 def test_connect_works_when_setting_dh_callback_to_nil
19722050 omit "AWS-LC does not support DHE ciphersuites" if aws_lc?
19732051
0 commit comments