=pod

=head1 NAME

EVP_PKEY_set1_encoded_public_key, EVP_PKEY_get1_encoded_public_key,
EVP_PKEY_set1_tls_encodedpoint, EVP_PKEY_get1_tls_encodedpoint
- functions to set and get public key data within an EVP_PKEY

=head1 SYNOPSIS

 #include <openssl/evp.h>

 int EVP_PKEY_set1_encoded_public_key(EVP_PKEY *pkey,
                                      const unsigned char *pub, size_t publen);

 size_t EVP_PKEY_get1_encoded_public_key(EVP_PKEY *pkey, unsigned char **ppub);

The following functions have been deprecated since OpenSSL 3.0, and can be
hidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value,
see L<openssl_user_macros(7)>:

 int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey,
                                    const unsigned char *pt, size_t ptlen);

 size_t EVP_PKEY_get1_tls_encodedpoint(EVP_PKEY *pkey, unsigned char **ppt);

=head1 DESCRIPTION

EVP_PKEY_set1_encoded_public_key() can be used to set the public key value
within an existing EVP_PKEY object. For the built-in OpenSSL algorithms this
currently only works for those that support key exchange. Parameters are not
set as part of this operation, so typically an application will create an
EVP_PKEY first, set the parameters on it, and then call this function.
For example setting the parameters might be done using
L<EVP_PKEY_copy_parameters(3)>.

The format for the encoded public key will depend on the algorithm in use. For
DH it should be encoded as a positive integer in big-endian form. For EC is
should be a point conforming to Sec. 2.3.4 of the SECG SEC 1 ("Elliptic
Curve Cryptography") standard. For X25519 and X448 it should be encoded in a
format as defined by RFC7748.

The key to be updated is supplied in B<pkey>. The buffer containing the encoded
key is pointed to be B<pub>. The length of the buffer is supplied in B<publen>.

EVP_PKEY_get1_encoded_public_key() does the equivalent operation except that
the encoded public key is returned to the application. The key containing the
public key data is supplied in B<pkey>. A buffer containing the encoded key will
be allocated and stored in B<*ppub>. The length of the encoded public key is
returned by the function. The application is responsible for freeing the
allocated buffer.

The macro EVP_PKEY_set1_tls_encodedpoint() is deprecated and simply calls
EVP_PKEY_set1_encoded_public_key() with all the same arguments. New applications
should use EVP_PKEY_set1_encoded_public_key() instead.

The macro EVP_PKEY_get1_tls_encodedpoint() is deprecated and simply calls
EVP_PKEY_get1_encoded_public_key() with all the same arguments. New applications
should use EVP_PKEY_get1_encoded_public_key() instead.


=head1 RETURN VALUES

EVP_PKEY_set1_encoded_public_key() returns 1 for success and 0 or a negative
value for failure.

EVP_PKEY_get1_encoded_public_key() return 1

=head1 EXAMPLES

See L<EVP_PKEY_derive_init(3)> and L<EVP_PKEY_derive(3)> for information about
performing a key exchange operation.

=head2 Set up a peer's EVP_PKEY ready for a key exchange operation

 #include <openssl/evp.h>

 int exchange(EVP_PKEY *ourkey, unsigned char *peer_pub, size_t peer_pub_len)
 {
     EVP_PKEY *peerkey = EVP_PKEY_new();

     if (peerkey == NULL || EVP_PKEY_copy_parameters(peerkey, ourkey) <= 0)
         return 0;

     if (EVP_PKEY_set1_encoded_public_key(peerkey, peer_pub,
                                          peer_pub_len) <= 0)
         return 0;

     /* Do the key exchange here */

     EVP_PKEY_free(peerkey);

     return 1;
 }

=head2 Get an encoded public key to send to a peer

 #include <openssl/evp.h>

 int get_encoded_pub_key(EVP_PKEY *ourkey)
 {
     unsigned char *pubkey;
     size_t pubkey_len;

    pubkey_len = EVP_PKEY_get1_encoded_public_key(ourkey, &pubkey);
    if (pubkey_len == 0)
        return 0;

    /*
     * Send the encoded public key stored in the buffer at "pubkey" and of
     * length pubkey_len, to the peer.
     */

    OPENSSL_free(pubkey);
    return 1;
 }

=head1 SEE ALSO

L<EVP_PKEY_new(3)>, L<EVP_PKEY_copy_parameters(3)>,
L<EVP_PKEY_derive_init(3)>, L<EVP_PKEY_derive(3)>,
L<EVP_PKEY-DH(7)>, L<EVP_PKEY-EC(7)>, L<EVP_PKEY-X25519(7)>, L<EVP_PKEY-X448(7)>

=head1 HISTORY

EVP_PKEY_set1_encoded_public_key() and EVP_PKEY_get1_encoded_public_key() were
added in OpenSSL 3.0.

EVP_PKEY_set1_tls_encodedpoint() and EVP_PKEY_get1_tls_encodedpoint() were
deprecated in OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2020 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

