=pod

=head1 NAME

SSL_get_shared_sigalgs, SSL_get_sigalgs - get supported signature algorithms

=head1 SYNOPSIS

 #include <openssl/ssl.h>

 int SSL_get_shared_sigalgs(SSL *s, int idx,
                            int *psign, int *phash, int *psignhash,
                            unsigned char *rsig, unsigned char *rhash);

 int SSL_get_sigalgs(SSL *s, int idx,
                     int *psign, int *phash, int *psignhash,
                     unsigned char *rsig, unsigned char *rhash);

=head1 DESCRIPTION

SSL_get_shared_sigalgs() returns information about the shared signature
algorithms supported by peer B<s>. The parameter B<idx> indicates the index
of the shared signature algorithm to return starting from zero. The signature
algorithm NID is written to B<*psign>, the hash NID to B<*phash> and the
sign and hash NID to B<*psignhash>. The raw signature and hash values
are written to B<*rsig> and B<*rhash>.

SSL_get_sigalgs() is similar to SSL_get_shared_sigalgs() except it returns
information about all signature algorithms supported by B<s> in the order
they were sent by the peer.

=head1 RETURN VALUES

SSL_get_shared_sigalgs() and SSL_get_sigalgs() return the number of
signature algorithms or B<0> if the B<idx> parameter is out of range.

=head1 NOTES

These functions are typically called for debugging purposes (to report
the peer's preferences) or where an application wants finer control over
certificate selection. Most applications will rely on internal handling
and will not need to call them.

If an application is only interested in the highest preference shared
signature algorithm it can just set B<idx> to zero.

Any or all of the parameters B<psign>, B<phash>, B<psignhash>, B<rsig> or
B<rhash> can be set to B<NULL> if the value is not required. By setting
them all to B<NULL> and setting B<idx> to zero the total number of
signature algorithms can be determined: which can be zero.

These functions must be called after the peer has sent a list of supported
signature algorithms: after a client hello (for servers) or a certificate
request (for clients). They can (for example) be called in the certificate
callback.

Only TLS 1.2, TLS 1.3 and DTLS 1.2 currently support signature algorithms.
If these
functions are called on an earlier version of TLS or DTLS zero is returned.

The shared signature algorithms returned by SSL_get_shared_sigalgs() are
ordered according to configuration and peer preferences.

The raw values correspond to the on the wire form as defined by RFC5246 et al.
The NIDs are OpenSSL equivalents. For example if the peer sent sha256(4) and
rsa(1) then B<*rhash> would be 4, B<*rsign> 1, B<*phash> NID_sha256, B<*psig>
NID_rsaEncryption and B<*psighash> NID_sha256WithRSAEncryption.

If a signature algorithm is not recognised the corresponding NIDs
will be set to B<NID_undef>. This may be because the value is not supported,
is not an appropriate combination (for example MD5 and DSA) or the
signature algorithm does not use a hash (for example Ed25519).

=head1 SEE ALSO

L<SSL_CTX_set_cert_cb(3)>,
L<ssl(7)>

=head1 COPYRIGHT

Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
