=pod

=head1 NAME

EVP_KEYEXCH-DH
- DH Key Exchange algorithm support

=head1 DESCRIPTION

Key exchange support for the B<DH> key type.

=head2 DH key exchange parameters

=over 4

=item "pad" (B<OSSL_EXCHANGE_PARAM_PAD>) <unsigned integer>

See L<provider-keyexch(7)/Common Key Exchange parameters>.

=item "kdf-ukm" (B<OSSL_EXCHANGE_PARAM_KDF_UKM>) <octet string>

Sets the User Key Material to be used as part of the selected Key Derivation
Function associated with the given key exchange ctx.

=item "kdf-ukm" (B<OSSL_EXCHANGE_PARAM_KDF_UKM>) <octet string ptr>

Gets a pointer to the User Key Material to be used as part of the selected
Key Derivation Function associated with the given key exchange ctx. Providers
usually do not need to support this gettable parameter as its sole purpose
is to support functionality of the deprecated EVP_PKEY_CTX_get0_dh_kdf_ukm()
function.

=back

=head1 EXAMPLES

The examples assume a host and peer both generate keys using the same
named group (or domain parameters). See L<EVP_PKEY-DH(7)/Examples>.
Both the host and peer transfer their public key to each other.

To convert the peer's generated key pair to a public key in DER format in order
to transfer to the host:

    EVP_PKEY *peer_key; /* It is assumed this contains the peers generated key */
    unsigned char *peer_pub_der = NULL;
    int peer_pub_der_len;

    peer_pub_der_len = i2d_PUBKEY(peer_key, &peer_pub_der);
    ...
    OPENSSL_free(peer_pub_der);

To convert the received peer's public key from DER format on the host:

    const unsigned char *pd = peer_pub_der;
    EVP_PKEY *peer_pub_key = d2i_PUBKEY(NULL, &pd, peer_pub_der_len);
    ...
    EVP_PKEY_free(peer_pub_key);

To derive a shared secret on the host using the host's key and the peer's public
key:

    /* It is assumed that the host_key and peer_pub_key are set up */
    void derive_secret(EVP_KEY *host_key, EVP_PKEY *peer_pub_key)
    {
        unsigned int pad = 1;
        OSSL_PARAM params[2];
        unsigned char *secret = NULL;
        size_t secret_len = 0;
        EVP_PKEY_CTX *dctx = EVP_PKEY_CTX_new_from_pkey(NULL, host_key, NULL);

        EVP_PKEY_derive_init(dctx);

        /* Optionally set the padding */
        params[0] = OSSL_PARAM_construct_uint(OSSL_EXCHANGE_PARAM_PAD, &pad);
        params[1] = OSSL_PARAM_construct_end();
        EVP_PKEY_CTX_set_params(dctx, params);

        EVP_PKEY_derive_set_peer(dctx, peer_pub_key);

        /* Get the size by passing NULL as the buffer */
        EVP_PKEY_derive(dctx, NULL, &secret_len);
        secret = OPENSSL_zalloc(secret_len);

        EVP_PKEY_derive(dctx, secret, &secret_len);
        ...
        OPENSSL_clear_free(secret, secret_len);
        EVP_PKEY_CTX_free(dctx);
    }

Very similar code can be used by the peer to derive the same shared secret
using the host's public key and the peer's generated key pair.

=head1 SEE ALSO

L<EVP_PKEY-DH(7)>,
L<EVP_PKEY-FFC(7)>,
L<EVP_PKEY(3)>,
L<provider-keyexch(7)>,
L<provider-keymgmt(7)>,
L<OSSL_PROVIDER-default(7)>,
L<OSSL_PROVIDER-FIPS(7)>,

=head1 COPYRIGHT

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