1*8fb009dcSAndroid Build Coastguard Worker /* Copyright (C) 1995-1998 Eric Young ([email protected]) 2*8fb009dcSAndroid Build Coastguard Worker * All rights reserved. 3*8fb009dcSAndroid Build Coastguard Worker * 4*8fb009dcSAndroid Build Coastguard Worker * This package is an SSL implementation written 5*8fb009dcSAndroid Build Coastguard Worker * by Eric Young ([email protected]). 6*8fb009dcSAndroid Build Coastguard Worker * The implementation was written so as to conform with Netscapes SSL. 7*8fb009dcSAndroid Build Coastguard Worker * 8*8fb009dcSAndroid Build Coastguard Worker * This library is free for commercial and non-commercial use as long as 9*8fb009dcSAndroid Build Coastguard Worker * the following conditions are aheared to. The following conditions 10*8fb009dcSAndroid Build Coastguard Worker * apply to all code found in this distribution, be it the RC4, RSA, 11*8fb009dcSAndroid Build Coastguard Worker * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12*8fb009dcSAndroid Build Coastguard Worker * included with this distribution is covered by the same copyright terms 13*8fb009dcSAndroid Build Coastguard Worker * except that the holder is Tim Hudson ([email protected]). 14*8fb009dcSAndroid Build Coastguard Worker * 15*8fb009dcSAndroid Build Coastguard Worker * Copyright remains Eric Young's, and as such any Copyright notices in 16*8fb009dcSAndroid Build Coastguard Worker * the code are not to be removed. 17*8fb009dcSAndroid Build Coastguard Worker * If this package is used in a product, Eric Young should be given attribution 18*8fb009dcSAndroid Build Coastguard Worker * as the author of the parts of the library used. 19*8fb009dcSAndroid Build Coastguard Worker * This can be in the form of a textual message at program startup or 20*8fb009dcSAndroid Build Coastguard Worker * in documentation (online or textual) provided with the package. 21*8fb009dcSAndroid Build Coastguard Worker * 22*8fb009dcSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 23*8fb009dcSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 24*8fb009dcSAndroid Build Coastguard Worker * are met: 25*8fb009dcSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the copyright 26*8fb009dcSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 27*8fb009dcSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 28*8fb009dcSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 29*8fb009dcSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 30*8fb009dcSAndroid Build Coastguard Worker * 3. All advertising materials mentioning features or use of this software 31*8fb009dcSAndroid Build Coastguard Worker * must display the following acknowledgement: 32*8fb009dcSAndroid Build Coastguard Worker * "This product includes cryptographic software written by 33*8fb009dcSAndroid Build Coastguard Worker * Eric Young ([email protected])" 34*8fb009dcSAndroid Build Coastguard Worker * The word 'cryptographic' can be left out if the rouines from the library 35*8fb009dcSAndroid Build Coastguard Worker * being used are not cryptographic related :-). 36*8fb009dcSAndroid Build Coastguard Worker * 4. If you include any Windows specific code (or a derivative thereof) from 37*8fb009dcSAndroid Build Coastguard Worker * the apps directory (application code) you must include an acknowledgement: 38*8fb009dcSAndroid Build Coastguard Worker * "This product includes software written by Tim Hudson ([email protected])" 39*8fb009dcSAndroid Build Coastguard Worker * 40*8fb009dcSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41*8fb009dcSAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42*8fb009dcSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43*8fb009dcSAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 44*8fb009dcSAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 45*8fb009dcSAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 46*8fb009dcSAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47*8fb009dcSAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 48*8fb009dcSAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49*8fb009dcSAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50*8fb009dcSAndroid Build Coastguard Worker * SUCH DAMAGE. 51*8fb009dcSAndroid Build Coastguard Worker * 52*8fb009dcSAndroid Build Coastguard Worker * The licence and distribution terms for any publically available version or 53*8fb009dcSAndroid Build Coastguard Worker * derivative of this code cannot be changed. i.e. this code cannot simply be 54*8fb009dcSAndroid Build Coastguard Worker * copied and put under another distribution licence 55*8fb009dcSAndroid Build Coastguard Worker * [including the GNU Public Licence.] */ 56*8fb009dcSAndroid Build Coastguard Worker 57*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_DH_H 58*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_DH_H 59*8fb009dcSAndroid Build Coastguard Worker 60*8fb009dcSAndroid Build Coastguard Worker #include <openssl/base.h> 61*8fb009dcSAndroid Build Coastguard Worker 62*8fb009dcSAndroid Build Coastguard Worker #include <openssl/thread.h> 63*8fb009dcSAndroid Build Coastguard Worker 64*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 65*8fb009dcSAndroid Build Coastguard Worker extern "C" { 66*8fb009dcSAndroid Build Coastguard Worker #endif 67*8fb009dcSAndroid Build Coastguard Worker 68*8fb009dcSAndroid Build Coastguard Worker 69*8fb009dcSAndroid Build Coastguard Worker // DH contains functions for performing Diffie-Hellman key agreement in 70*8fb009dcSAndroid Build Coastguard Worker // multiplicative groups. 71*8fb009dcSAndroid Build Coastguard Worker // 72*8fb009dcSAndroid Build Coastguard Worker // This module is deprecated and retained for legacy reasons only. It is not 73*8fb009dcSAndroid Build Coastguard Worker // considered a priority for performance or hardening work. Do not use it in 74*8fb009dcSAndroid Build Coastguard Worker // new code. Use X25519 or ECDH with P-256 instead. 75*8fb009dcSAndroid Build Coastguard Worker 76*8fb009dcSAndroid Build Coastguard Worker 77*8fb009dcSAndroid Build Coastguard Worker // Allocation and destruction. 78*8fb009dcSAndroid Build Coastguard Worker // 79*8fb009dcSAndroid Build Coastguard Worker // A |DH| object represents a Diffie-Hellman key or group parameters. A given 80*8fb009dcSAndroid Build Coastguard Worker // object may be used concurrently on multiple threads by non-mutating 81*8fb009dcSAndroid Build Coastguard Worker // functions, provided no other thread is concurrently calling a mutating 82*8fb009dcSAndroid Build Coastguard Worker // function. Unless otherwise documented, functions which take a |const| pointer 83*8fb009dcSAndroid Build Coastguard Worker // are non-mutating and functions which take a non-|const| pointer are mutating. 84*8fb009dcSAndroid Build Coastguard Worker 85*8fb009dcSAndroid Build Coastguard Worker // DH_new returns a new, empty DH object or NULL on error. 86*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DH *DH_new(void); 87*8fb009dcSAndroid Build Coastguard Worker 88*8fb009dcSAndroid Build Coastguard Worker // DH_free decrements the reference count of |dh| and frees it if the reference 89*8fb009dcSAndroid Build Coastguard Worker // count drops to zero. 90*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DH_free(DH *dh); 91*8fb009dcSAndroid Build Coastguard Worker 92*8fb009dcSAndroid Build Coastguard Worker // DH_up_ref increments the reference count of |dh| and returns one. It does not 93*8fb009dcSAndroid Build Coastguard Worker // mutate |dh| for thread-safety purposes and may be used concurrently. 94*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_up_ref(DH *dh); 95*8fb009dcSAndroid Build Coastguard Worker 96*8fb009dcSAndroid Build Coastguard Worker 97*8fb009dcSAndroid Build Coastguard Worker // Properties. 98*8fb009dcSAndroid Build Coastguard Worker 99*8fb009dcSAndroid Build Coastguard Worker // DH_bits returns the size of |dh|'s group modulus, in bits. 100*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT unsigned DH_bits(const DH *dh); 101*8fb009dcSAndroid Build Coastguard Worker 102*8fb009dcSAndroid Build Coastguard Worker // DH_get0_pub_key returns |dh|'s public key. 103*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DH_get0_pub_key(const DH *dh); 104*8fb009dcSAndroid Build Coastguard Worker 105*8fb009dcSAndroid Build Coastguard Worker // DH_get0_priv_key returns |dh|'s private key, or NULL if |dh| is a public key. 106*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DH_get0_priv_key(const DH *dh); 107*8fb009dcSAndroid Build Coastguard Worker 108*8fb009dcSAndroid Build Coastguard Worker // DH_get0_p returns |dh|'s group modulus. 109*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DH_get0_p(const DH *dh); 110*8fb009dcSAndroid Build Coastguard Worker 111*8fb009dcSAndroid Build Coastguard Worker // DH_get0_q returns the size of |dh|'s subgroup, or NULL if it is unset. 112*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DH_get0_q(const DH *dh); 113*8fb009dcSAndroid Build Coastguard Worker 114*8fb009dcSAndroid Build Coastguard Worker // DH_get0_g returns |dh|'s group generator. 115*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT const BIGNUM *DH_get0_g(const DH *dh); 116*8fb009dcSAndroid Build Coastguard Worker 117*8fb009dcSAndroid Build Coastguard Worker // DH_get0_key sets |*out_pub_key| and |*out_priv_key|, if non-NULL, to |dh|'s 118*8fb009dcSAndroid Build Coastguard Worker // public and private key, respectively. If |dh| is a public key, the private 119*8fb009dcSAndroid Build Coastguard Worker // key will be set to NULL. 120*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DH_get0_key(const DH *dh, const BIGNUM **out_pub_key, 121*8fb009dcSAndroid Build Coastguard Worker const BIGNUM **out_priv_key); 122*8fb009dcSAndroid Build Coastguard Worker 123*8fb009dcSAndroid Build Coastguard Worker // DH_set0_key sets |dh|'s public and private key to the specified values. If 124*8fb009dcSAndroid Build Coastguard Worker // NULL, the field is left unchanged. On success, it takes ownership of each 125*8fb009dcSAndroid Build Coastguard Worker // argument and returns one. Otherwise, it returns zero. 126*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key); 127*8fb009dcSAndroid Build Coastguard Worker 128*8fb009dcSAndroid Build Coastguard Worker // DH_get0_pqg sets |*out_p|, |*out_q|, and |*out_g|, if non-NULL, to |dh|'s p, 129*8fb009dcSAndroid Build Coastguard Worker // q, and g parameters, respectively. 130*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DH_get0_pqg(const DH *dh, const BIGNUM **out_p, 131*8fb009dcSAndroid Build Coastguard Worker const BIGNUM **out_q, const BIGNUM **out_g); 132*8fb009dcSAndroid Build Coastguard Worker 133*8fb009dcSAndroid Build Coastguard Worker // DH_set0_pqg sets |dh|'s p, q, and g parameters to the specified values. If 134*8fb009dcSAndroid Build Coastguard Worker // NULL, the field is left unchanged. On success, it takes ownership of each 135*8fb009dcSAndroid Build Coastguard Worker // argument and returns one. Otherwise, it returns zero. |q| may be NULL, but 136*8fb009dcSAndroid Build Coastguard Worker // |p| and |g| must either be specified or already configured on |dh|. 137*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g); 138*8fb009dcSAndroid Build Coastguard Worker 139*8fb009dcSAndroid Build Coastguard Worker // DH_set_length sets the number of bits to use for the secret exponent when 140*8fb009dcSAndroid Build Coastguard Worker // calling |DH_generate_key| on |dh| and returns one. If unset, 141*8fb009dcSAndroid Build Coastguard Worker // |DH_generate_key| will use the bit length of p. 142*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_set_length(DH *dh, unsigned priv_length); 143*8fb009dcSAndroid Build Coastguard Worker 144*8fb009dcSAndroid Build Coastguard Worker 145*8fb009dcSAndroid Build Coastguard Worker // Standard parameters. 146*8fb009dcSAndroid Build Coastguard Worker 147*8fb009dcSAndroid Build Coastguard Worker // DH_get_rfc7919_2048 returns the group `ffdhe2048` from 148*8fb009dcSAndroid Build Coastguard Worker // https://tools.ietf.org/html/rfc7919#appendix-A.1. It returns NULL if out 149*8fb009dcSAndroid Build Coastguard Worker // of memory. 150*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DH *DH_get_rfc7919_2048(void); 151*8fb009dcSAndroid Build Coastguard Worker 152*8fb009dcSAndroid Build Coastguard Worker // BN_get_rfc3526_prime_1536 sets |*ret| to the 1536-bit MODP group from RFC 153*8fb009dcSAndroid Build Coastguard Worker // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 154*8fb009dcSAndroid Build Coastguard Worker // and returned. It returns NULL on allocation failure. 155*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *ret); 156*8fb009dcSAndroid Build Coastguard Worker 157*8fb009dcSAndroid Build Coastguard Worker // BN_get_rfc3526_prime_2048 sets |*ret| to the 2048-bit MODP group from RFC 158*8fb009dcSAndroid Build Coastguard Worker // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 159*8fb009dcSAndroid Build Coastguard Worker // and returned. It returns NULL on allocation failure. 160*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *ret); 161*8fb009dcSAndroid Build Coastguard Worker 162*8fb009dcSAndroid Build Coastguard Worker // BN_get_rfc3526_prime_3072 sets |*ret| to the 3072-bit MODP group from RFC 163*8fb009dcSAndroid Build Coastguard Worker // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 164*8fb009dcSAndroid Build Coastguard Worker // and returned. It returns NULL on allocation failure. 165*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *ret); 166*8fb009dcSAndroid Build Coastguard Worker 167*8fb009dcSAndroid Build Coastguard Worker // BN_get_rfc3526_prime_4096 sets |*ret| to the 4096-bit MODP group from RFC 168*8fb009dcSAndroid Build Coastguard Worker // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 169*8fb009dcSAndroid Build Coastguard Worker // and returned. It returns NULL on allocation failure. 170*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *ret); 171*8fb009dcSAndroid Build Coastguard Worker 172*8fb009dcSAndroid Build Coastguard Worker // BN_get_rfc3526_prime_6144 sets |*ret| to the 6144-bit MODP group from RFC 173*8fb009dcSAndroid Build Coastguard Worker // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 174*8fb009dcSAndroid Build Coastguard Worker // and returned. It returns NULL on allocation failure. 175*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *ret); 176*8fb009dcSAndroid Build Coastguard Worker 177*8fb009dcSAndroid Build Coastguard Worker // BN_get_rfc3526_prime_8192 sets |*ret| to the 8192-bit MODP group from RFC 178*8fb009dcSAndroid Build Coastguard Worker // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 179*8fb009dcSAndroid Build Coastguard Worker // and returned. It returns NULL on allocation failure. 180*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *ret); 181*8fb009dcSAndroid Build Coastguard Worker 182*8fb009dcSAndroid Build Coastguard Worker 183*8fb009dcSAndroid Build Coastguard Worker // Parameter generation. 184*8fb009dcSAndroid Build Coastguard Worker 185*8fb009dcSAndroid Build Coastguard Worker #define DH_GENERATOR_2 2 186*8fb009dcSAndroid Build Coastguard Worker #define DH_GENERATOR_5 5 187*8fb009dcSAndroid Build Coastguard Worker 188*8fb009dcSAndroid Build Coastguard Worker // DH_generate_parameters_ex generates a suitable Diffie-Hellman group with a 189*8fb009dcSAndroid Build Coastguard Worker // prime that is |prime_bits| long and stores it in |dh|. The generator of the 190*8fb009dcSAndroid Build Coastguard Worker // group will be |generator|, which should be |DH_GENERATOR_2| unless there's a 191*8fb009dcSAndroid Build Coastguard Worker // good reason to use a different value. The |cb| argument contains a callback 192*8fb009dcSAndroid Build Coastguard Worker // function that will be called during the generation. See the documentation in 193*8fb009dcSAndroid Build Coastguard Worker // |bn.h| about this. In addition to the callback invocations from |BN|, |cb| 194*8fb009dcSAndroid Build Coastguard Worker // will also be called with |event| equal to three when the generation is 195*8fb009dcSAndroid Build Coastguard Worker // complete. 196*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_generate_parameters_ex(DH *dh, int prime_bits, 197*8fb009dcSAndroid Build Coastguard Worker int generator, BN_GENCB *cb); 198*8fb009dcSAndroid Build Coastguard Worker 199*8fb009dcSAndroid Build Coastguard Worker 200*8fb009dcSAndroid Build Coastguard Worker // Diffie-Hellman operations. 201*8fb009dcSAndroid Build Coastguard Worker 202*8fb009dcSAndroid Build Coastguard Worker // DH_generate_key generates a new, random, private key and stores it in 203*8fb009dcSAndroid Build Coastguard Worker // |dh|, if |dh| does not already have a private key. Otherwise, it updates 204*8fb009dcSAndroid Build Coastguard Worker // |dh|'s public key to match the private key. It returns one on success and 205*8fb009dcSAndroid Build Coastguard Worker // zero on error. 206*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_generate_key(DH *dh); 207*8fb009dcSAndroid Build Coastguard Worker 208*8fb009dcSAndroid Build Coastguard Worker // DH_compute_key_padded calculates the shared key between |dh| and |peers_key| 209*8fb009dcSAndroid Build Coastguard Worker // and writes it as a big-endian integer into |out|, padded up to |DH_size| 210*8fb009dcSAndroid Build Coastguard Worker // bytes. It returns the number of bytes written, which is always |DH_size|, or 211*8fb009dcSAndroid Build Coastguard Worker // a negative number on error. |out| must have |DH_size| bytes of space. 212*8fb009dcSAndroid Build Coastguard Worker // 213*8fb009dcSAndroid Build Coastguard Worker // WARNING: this differs from the usual BoringSSL return-value convention. 214*8fb009dcSAndroid Build Coastguard Worker // 215*8fb009dcSAndroid Build Coastguard Worker // Note this function differs from |DH_compute_key| in that it preserves leading 216*8fb009dcSAndroid Build Coastguard Worker // zeros in the secret. This function is the preferred variant. It matches PKCS 217*8fb009dcSAndroid Build Coastguard Worker // #3 and avoids some side channel attacks. However, the two functions are not 218*8fb009dcSAndroid Build Coastguard Worker // drop-in replacements for each other. Using a different variant than the 219*8fb009dcSAndroid Build Coastguard Worker // application expects will result in sporadic key mismatches. 220*8fb009dcSAndroid Build Coastguard Worker // 221*8fb009dcSAndroid Build Coastguard Worker // Callers that expect a fixed-width secret should use this function over 222*8fb009dcSAndroid Build Coastguard Worker // |DH_compute_key|. Callers that use either function should migrate to a modern 223*8fb009dcSAndroid Build Coastguard Worker // primitive such as X25519 or ECDH with P-256 instead. 224*8fb009dcSAndroid Build Coastguard Worker // 225*8fb009dcSAndroid Build Coastguard Worker // This function does not mutate |dh| for thread-safety purposes and may be used 226*8fb009dcSAndroid Build Coastguard Worker // concurrently. 227*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_compute_key_padded(uint8_t *out, const BIGNUM *peers_key, 228*8fb009dcSAndroid Build Coastguard Worker DH *dh); 229*8fb009dcSAndroid Build Coastguard Worker 230*8fb009dcSAndroid Build Coastguard Worker // DH_compute_key_hashed calculates the shared key between |dh| and |peers_key| 231*8fb009dcSAndroid Build Coastguard Worker // and hashes it with the given |digest|. If the hash output is less than 232*8fb009dcSAndroid Build Coastguard Worker // |max_out_len| bytes then it writes the hash output to |out| and sets 233*8fb009dcSAndroid Build Coastguard Worker // |*out_len| to the number of bytes written. Otherwise it signals an error. It 234*8fb009dcSAndroid Build Coastguard Worker // returns one on success or zero on error. 235*8fb009dcSAndroid Build Coastguard Worker // 236*8fb009dcSAndroid Build Coastguard Worker // NOTE: this follows the usual BoringSSL return-value convention, but that's 237*8fb009dcSAndroid Build Coastguard Worker // different from |DH_compute_key| and |DH_compute_key_padded|. 238*8fb009dcSAndroid Build Coastguard Worker // 239*8fb009dcSAndroid Build Coastguard Worker // This function does not mutate |dh| for thread-safety purposes and may be used 240*8fb009dcSAndroid Build Coastguard Worker // concurrently. 241*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_compute_key_hashed(DH *dh, uint8_t *out, size_t *out_len, 242*8fb009dcSAndroid Build Coastguard Worker size_t max_out_len, 243*8fb009dcSAndroid Build Coastguard Worker const BIGNUM *peers_key, 244*8fb009dcSAndroid Build Coastguard Worker const EVP_MD *digest); 245*8fb009dcSAndroid Build Coastguard Worker 246*8fb009dcSAndroid Build Coastguard Worker 247*8fb009dcSAndroid Build Coastguard Worker // Utility functions. 248*8fb009dcSAndroid Build Coastguard Worker 249*8fb009dcSAndroid Build Coastguard Worker // DH_size returns the number of bytes in the DH group's prime. 250*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_size(const DH *dh); 251*8fb009dcSAndroid Build Coastguard Worker 252*8fb009dcSAndroid Build Coastguard Worker // DH_num_bits returns the minimum number of bits needed to represent the 253*8fb009dcSAndroid Build Coastguard Worker // absolute value of the DH group's prime. 254*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT unsigned DH_num_bits(const DH *dh); 255*8fb009dcSAndroid Build Coastguard Worker 256*8fb009dcSAndroid Build Coastguard Worker #define DH_CHECK_P_NOT_PRIME 0x01 257*8fb009dcSAndroid Build Coastguard Worker #define DH_CHECK_P_NOT_SAFE_PRIME 0x02 258*8fb009dcSAndroid Build Coastguard Worker #define DH_CHECK_UNABLE_TO_CHECK_GENERATOR 0x04 259*8fb009dcSAndroid Build Coastguard Worker #define DH_CHECK_NOT_SUITABLE_GENERATOR 0x08 260*8fb009dcSAndroid Build Coastguard Worker #define DH_CHECK_Q_NOT_PRIME 0x10 261*8fb009dcSAndroid Build Coastguard Worker #define DH_CHECK_INVALID_Q_VALUE 0x20 262*8fb009dcSAndroid Build Coastguard Worker 263*8fb009dcSAndroid Build Coastguard Worker // These are compatibility defines. 264*8fb009dcSAndroid Build Coastguard Worker #define DH_NOT_SUITABLE_GENERATOR DH_CHECK_NOT_SUITABLE_GENERATOR 265*8fb009dcSAndroid Build Coastguard Worker #define DH_UNABLE_TO_CHECK_GENERATOR DH_CHECK_UNABLE_TO_CHECK_GENERATOR 266*8fb009dcSAndroid Build Coastguard Worker 267*8fb009dcSAndroid Build Coastguard Worker // DH_check checks the suitability of |dh| as a Diffie-Hellman group. and sets 268*8fb009dcSAndroid Build Coastguard Worker // |DH_CHECK_*| flags in |*out_flags| if it finds any errors. It returns one if 269*8fb009dcSAndroid Build Coastguard Worker // |*out_flags| was successfully set and zero on error. 270*8fb009dcSAndroid Build Coastguard Worker // 271*8fb009dcSAndroid Build Coastguard Worker // Note: these checks may be quite computationally expensive. 272*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_check(const DH *dh, int *out_flags); 273*8fb009dcSAndroid Build Coastguard Worker 274*8fb009dcSAndroid Build Coastguard Worker #define DH_CHECK_PUBKEY_TOO_SMALL 0x1 275*8fb009dcSAndroid Build Coastguard Worker #define DH_CHECK_PUBKEY_TOO_LARGE 0x2 276*8fb009dcSAndroid Build Coastguard Worker #define DH_CHECK_PUBKEY_INVALID 0x4 277*8fb009dcSAndroid Build Coastguard Worker 278*8fb009dcSAndroid Build Coastguard Worker // DH_check_pub_key checks the suitability of |pub_key| as a public key for the 279*8fb009dcSAndroid Build Coastguard Worker // DH group in |dh| and sets |DH_CHECK_PUBKEY_*| flags in |*out_flags| if it 280*8fb009dcSAndroid Build Coastguard Worker // finds any errors. It returns one if |*out_flags| was successfully set and 281*8fb009dcSAndroid Build Coastguard Worker // zero on error. 282*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, 283*8fb009dcSAndroid Build Coastguard Worker int *out_flags); 284*8fb009dcSAndroid Build Coastguard Worker 285*8fb009dcSAndroid Build Coastguard Worker // DHparams_dup allocates a fresh |DH| and copies the parameters from |dh| into 286*8fb009dcSAndroid Build Coastguard Worker // it. It returns the new |DH| or NULL on error. 287*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DH *DHparams_dup(const DH *dh); 288*8fb009dcSAndroid Build Coastguard Worker 289*8fb009dcSAndroid Build Coastguard Worker 290*8fb009dcSAndroid Build Coastguard Worker // ASN.1 functions. 291*8fb009dcSAndroid Build Coastguard Worker 292*8fb009dcSAndroid Build Coastguard Worker // DH_parse_parameters decodes a DER-encoded DHParameter structure (PKCS #3) 293*8fb009dcSAndroid Build Coastguard Worker // from |cbs| and advances |cbs|. It returns a newly-allocated |DH| or NULL on 294*8fb009dcSAndroid Build Coastguard Worker // error. 295*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DH *DH_parse_parameters(CBS *cbs); 296*8fb009dcSAndroid Build Coastguard Worker 297*8fb009dcSAndroid Build Coastguard Worker // DH_marshal_parameters marshals |dh| as a DER-encoded DHParameter structure 298*8fb009dcSAndroid Build Coastguard Worker // (PKCS #3) and appends the result to |cbb|. It returns one on success and zero 299*8fb009dcSAndroid Build Coastguard Worker // on error. 300*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_marshal_parameters(CBB *cbb, const DH *dh); 301*8fb009dcSAndroid Build Coastguard Worker 302*8fb009dcSAndroid Build Coastguard Worker 303*8fb009dcSAndroid Build Coastguard Worker // Deprecated functions. 304*8fb009dcSAndroid Build Coastguard Worker 305*8fb009dcSAndroid Build Coastguard Worker // DH_generate_parameters behaves like |DH_generate_parameters_ex|, which is 306*8fb009dcSAndroid Build Coastguard Worker // what you should use instead. It returns NULL on error, or a newly-allocated 307*8fb009dcSAndroid Build Coastguard Worker // |DH| on success. This function is provided for compatibility only. 308*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DH *DH_generate_parameters(int prime_len, int generator, 309*8fb009dcSAndroid Build Coastguard Worker void (*callback)(int, int, void *), 310*8fb009dcSAndroid Build Coastguard Worker void *cb_arg); 311*8fb009dcSAndroid Build Coastguard Worker 312*8fb009dcSAndroid Build Coastguard Worker // d2i_DHparams parses a DER-encoded DHParameter structure (PKCS #3) from |len| 313*8fb009dcSAndroid Build Coastguard Worker // bytes at |*inp|, as in |d2i_SAMPLE|. 314*8fb009dcSAndroid Build Coastguard Worker // 315*8fb009dcSAndroid Build Coastguard Worker // Use |DH_parse_parameters| instead. 316*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT DH *d2i_DHparams(DH **ret, const unsigned char **inp, long len); 317*8fb009dcSAndroid Build Coastguard Worker 318*8fb009dcSAndroid Build Coastguard Worker // i2d_DHparams marshals |in| to a DER-encoded DHParameter structure (PKCS #3), 319*8fb009dcSAndroid Build Coastguard Worker // as described in |i2d_SAMPLE|. 320*8fb009dcSAndroid Build Coastguard Worker // 321*8fb009dcSAndroid Build Coastguard Worker // Use |DH_marshal_parameters| instead. 322*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int i2d_DHparams(const DH *in, unsigned char **outp); 323*8fb009dcSAndroid Build Coastguard Worker 324*8fb009dcSAndroid Build Coastguard Worker // DH_compute_key behaves like |DH_compute_key_padded| but, contrary to PKCS #3, 325*8fb009dcSAndroid Build Coastguard Worker // returns a variable-length shared key with leading zeros. It returns the 326*8fb009dcSAndroid Build Coastguard Worker // number of bytes written, or a negative number on error. |out| must have 327*8fb009dcSAndroid Build Coastguard Worker // |DH_size| bytes of space. 328*8fb009dcSAndroid Build Coastguard Worker // 329*8fb009dcSAndroid Build Coastguard Worker // WARNING: this differs from the usual BoringSSL return-value convention. 330*8fb009dcSAndroid Build Coastguard Worker // 331*8fb009dcSAndroid Build Coastguard Worker // Note this function's running time and memory access pattern leaks information 332*8fb009dcSAndroid Build Coastguard Worker // about the shared secret. Particularly if |dh| is reused, this may result in 333*8fb009dcSAndroid Build Coastguard Worker // side channel attacks such as https://raccoon-attack.com/. 334*8fb009dcSAndroid Build Coastguard Worker // 335*8fb009dcSAndroid Build Coastguard Worker // |DH_compute_key_padded| is the preferred variant and avoids the above 336*8fb009dcSAndroid Build Coastguard Worker // attacks. However, the two functions are not drop-in replacements for each 337*8fb009dcSAndroid Build Coastguard Worker // other. Using a different variant than the application expects will result in 338*8fb009dcSAndroid Build Coastguard Worker // sporadic key mismatches. 339*8fb009dcSAndroid Build Coastguard Worker // 340*8fb009dcSAndroid Build Coastguard Worker // Callers that expect a fixed-width secret should use |DH_compute_key_padded| 341*8fb009dcSAndroid Build Coastguard Worker // instead. Callers that use either function should migrate to a modern 342*8fb009dcSAndroid Build Coastguard Worker // primitive such as X25519 or ECDH with P-256 instead. 343*8fb009dcSAndroid Build Coastguard Worker // 344*8fb009dcSAndroid Build Coastguard Worker // This function does not mutate |dh| for thread-safety purposes and may be used 345*8fb009dcSAndroid Build Coastguard Worker // concurrently. 346*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int DH_compute_key(uint8_t *out, const BIGNUM *peers_key, 347*8fb009dcSAndroid Build Coastguard Worker DH *dh); 348*8fb009dcSAndroid Build Coastguard Worker 349*8fb009dcSAndroid Build Coastguard Worker 350*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 351*8fb009dcSAndroid Build Coastguard Worker } // extern C 352*8fb009dcSAndroid Build Coastguard Worker 353*8fb009dcSAndroid Build Coastguard Worker extern "C++" { 354*8fb009dcSAndroid Build Coastguard Worker 355*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_BEGIN 356*8fb009dcSAndroid Build Coastguard Worker 357*8fb009dcSAndroid Build Coastguard Worker BORINGSSL_MAKE_DELETER(DH, DH_free) 358*8fb009dcSAndroid Build Coastguard Worker BORINGSSL_MAKE_UP_REF(DH, DH_up_ref) 359*8fb009dcSAndroid Build Coastguard Worker 360*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_END 361*8fb009dcSAndroid Build Coastguard Worker 362*8fb009dcSAndroid Build Coastguard Worker } // extern C++ 363*8fb009dcSAndroid Build Coastguard Worker 364*8fb009dcSAndroid Build Coastguard Worker #endif 365*8fb009dcSAndroid Build Coastguard Worker 366*8fb009dcSAndroid Build Coastguard Worker #define DH_R_BAD_GENERATOR 100 367*8fb009dcSAndroid Build Coastguard Worker #define DH_R_INVALID_PUBKEY 101 368*8fb009dcSAndroid Build Coastguard Worker #define DH_R_MODULUS_TOO_LARGE 102 369*8fb009dcSAndroid Build Coastguard Worker #define DH_R_NO_PRIVATE_VALUE 103 370*8fb009dcSAndroid Build Coastguard Worker #define DH_R_DECODE_ERROR 104 371*8fb009dcSAndroid Build Coastguard Worker #define DH_R_ENCODE_ERROR 105 372*8fb009dcSAndroid Build Coastguard Worker #define DH_R_INVALID_PARAMETERS 106 373*8fb009dcSAndroid Build Coastguard Worker 374*8fb009dcSAndroid Build Coastguard Worker #endif // OPENSSL_HEADER_DH_H 375