4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Diffie-Hellman Wrapper Implementation over OpenSSL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "InternalCryptLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <openssl/dh.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocates and Initializes one Diffie-Hellman Context for subsequent use.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Pointer to the Diffie-Hellman Context that has been initialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the allocations fails, DhNew() returns NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhNew (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocates & Initializes DH Context by OpenSSL DH_new()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (VOID *)DH_new ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Release the specified DH context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DhContext is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DhContext Pointer to the DH context to be released.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhFree (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *DhContext
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free OpenSSL DH Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DH_free ((DH *)DhContext);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Generates DH parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Given generator g, and length of prime number p in bits, this function generates p,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and sets DH context according to value of g and p.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Before this function can be invoked, pseudorandom number generator must be correctly
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync initialized by RandomSeed().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DhContext is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Prime is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] DhContext Pointer to the DH context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Generator Value of generator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] PrimeLength Length in bits of prime to be generated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Prime Pointer to the buffer to receive the generated prime number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE DH pamameter generation succeeded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Value of Generator is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE PRNG fails to generate random prime number with PrimeLength.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhGenerateParameter (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID *DhContext,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Generator,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN PrimeLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 *Prime
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check input parameters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DhContext == NULL || Prime == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Generator != DH_GENERATOR_2 && Generator != DH_GENERATOR_5) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = (BOOLEAN) DH_generate_parameters_ex (DhContext, (UINT32) PrimeLength, (UINT32) Generator, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!RetVal) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BN_bn2bin (((DH *) DhContext)->p, Prime);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Sets generator and prime parameters for DH.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Given generator g, and prime number p, this function and sets DH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync context accordingly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DhContext is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Prime is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] DhContext Pointer to the DH context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Generator Value of generator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] PrimeLength Length in bits of prime to be generated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prime Pointer to the prime number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE DH pamameter setting succeeded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Value of Generator is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Value of Generator is not suitable for the Prime.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Value of Prime is not a prime number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Value of Prime is not a safe prime number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhSetParameter (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID *DhContext,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Generator,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN PrimeLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT8 *Prime
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DH *Dh;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check input parameters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DhContext == NULL || Prime == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Generator != DH_GENERATOR_2 && Generator != DH_GENERATOR_5) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dh = (DH *) DhContext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dh->p = BN_new();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dh->g = BN_new();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BN_bin2bn (Prime, (UINT32) (PrimeLength / 8), Dh->p);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BN_set_word (Dh->g, (UINT32) Generator);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Generates DH public key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function generates random secret exponent, and computes the public key, which is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned via parameter PublicKey and PublicKeySize. DH context is updated accordingly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the PublicKey buffer is too small to hold the public key, FALSE is returned and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PublicKeySize is set to the required buffer size to obtain the public key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DhContext is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If PublicKeySize is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If PublicKeySize is large enough but PublicKey is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] DhContext Pointer to the DH context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] PublicKey Pointer to the buffer to receive generated public key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] PublicKeySize On input, the size of PublicKey buffer in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync On output, the size of data returned in PublicKey buffer in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE DH public key generation succeeded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE DH public key generation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE PublicKeySize is not large enough.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhGenerateKey (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID *DhContext,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 *PublicKey,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *PublicKeySize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DH *Dh;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check input parameters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DhContext == NULL || PublicKeySize == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PublicKey == NULL && *PublicKeySize != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dh = (DH *) DhContext;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PublicKeySize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = (BOOLEAN) DH_generate_key (DhContext);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RetVal) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BN_bn2bin (Dh->pub_key, PublicKey);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PublicKeySize = BN_num_bytes (Dh->pub_key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Computes exchanged common key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Given peer's public key, this function computes the exchanged common key, based on its own
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync context including value of prime modulus and random secret exponent.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DhContext is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If PeerPublicKey is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If KeySize is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If KeySize is large enough but Key is NULL, then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] DhContext Pointer to the DH context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] PeerPublicKey Pointer to the peer's public key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] PeerPublicKeySize Size of peer's public key in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Key Pointer to the buffer to receive generated key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] KeySize On input, the size of Key buffer in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync On output, the size of data returned in Key buffer in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE DH exchanged key generation succeeded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE DH exchanged key generation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE KeySize is not large enough.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDhComputeKey (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID *DhContext,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT8 *PeerPublicKey,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN PeerPublicKeySize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 *Key,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *KeySize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BIGNUM *Bn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check input parameters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DhContext == NULL || PeerPublicKey == NULL || KeySize == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key == NULL && *KeySize != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bn = BN_bin2bn (PeerPublicKey, (UINT32) PeerPublicKeySize, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *KeySize = (BOOLEAN) DH_compute_key (Key, Bn, DhContext);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BN_free (Bn);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}