dh.h (14205B)
1 // Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #ifndef OPENSSL_HEADER_DH_H 16 #define OPENSSL_HEADER_DH_H 17 18 #include <openssl/base.h> // IWYU pragma: export 19 20 #if defined(__cplusplus) 21 extern "C" { 22 #endif 23 24 25 // DH contains functions for performing Diffie-Hellman key agreement in 26 // multiplicative groups. 27 // 28 // This module is deprecated and retained for legacy reasons only. It is not 29 // considered a priority for performance or hardening work. Do not use it in 30 // new code. Use X25519 or ECDH with P-256 instead. 31 32 33 // Allocation and destruction. 34 // 35 // A |DH| object represents a Diffie-Hellman key or group parameters. A given 36 // object may be used concurrently on multiple threads by non-mutating 37 // functions, provided no other thread is concurrently calling a mutating 38 // function. Unless otherwise documented, functions which take a |const| pointer 39 // are non-mutating and functions which take a non-|const| pointer are mutating. 40 41 // DH_new returns a new, empty DH object or NULL on error. 42 OPENSSL_EXPORT DH *DH_new(void); 43 44 // DH_free decrements the reference count of |dh| and frees it if the reference 45 // count drops to zero. 46 OPENSSL_EXPORT void DH_free(DH *dh); 47 48 // DH_up_ref increments the reference count of |dh| and returns one. It does not 49 // mutate |dh| for thread-safety purposes and may be used concurrently. 50 OPENSSL_EXPORT int DH_up_ref(DH *dh); 51 52 53 // Properties. 54 55 // OPENSSL_DH_MAX_MODULUS_BITS is the maximum supported Diffie-Hellman group 56 // modulus, in bits. 57 #define OPENSSL_DH_MAX_MODULUS_BITS 10000 58 59 // DH_bits returns the size of |dh|'s group modulus, in bits. 60 OPENSSL_EXPORT unsigned DH_bits(const DH *dh); 61 62 // DH_get0_pub_key returns |dh|'s public key. 63 OPENSSL_EXPORT const BIGNUM *DH_get0_pub_key(const DH *dh); 64 65 // DH_get0_priv_key returns |dh|'s private key, or NULL if |dh| is a public key. 66 OPENSSL_EXPORT const BIGNUM *DH_get0_priv_key(const DH *dh); 67 68 // DH_get0_p returns |dh|'s group modulus. 69 OPENSSL_EXPORT const BIGNUM *DH_get0_p(const DH *dh); 70 71 // DH_get0_q returns the size of |dh|'s subgroup, or NULL if it is unset. 72 OPENSSL_EXPORT const BIGNUM *DH_get0_q(const DH *dh); 73 74 // DH_get0_g returns |dh|'s group generator. 75 OPENSSL_EXPORT const BIGNUM *DH_get0_g(const DH *dh); 76 77 // DH_get0_key sets |*out_pub_key| and |*out_priv_key|, if non-NULL, to |dh|'s 78 // public and private key, respectively. If |dh| is a public key, the private 79 // key will be set to NULL. 80 OPENSSL_EXPORT void DH_get0_key(const DH *dh, const BIGNUM **out_pub_key, 81 const BIGNUM **out_priv_key); 82 83 // DH_set0_key sets |dh|'s public and private key to the specified values. If 84 // NULL, the field is left unchanged. On success, it takes ownership of each 85 // argument and returns one. Otherwise, it returns zero. 86 OPENSSL_EXPORT int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key); 87 88 // DH_get0_pqg sets |*out_p|, |*out_q|, and |*out_g|, if non-NULL, to |dh|'s p, 89 // q, and g parameters, respectively. 90 OPENSSL_EXPORT void DH_get0_pqg(const DH *dh, const BIGNUM **out_p, 91 const BIGNUM **out_q, const BIGNUM **out_g); 92 93 // DH_set0_pqg sets |dh|'s p, q, and g parameters to the specified values. If 94 // NULL, the field is left unchanged. On success, it takes ownership of each 95 // argument and returns one. Otherwise, it returns zero. |q| may be NULL, but 96 // |p| and |g| must either be specified or already configured on |dh|. 97 OPENSSL_EXPORT int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g); 98 99 // DH_set_length sets the number of bits to use for the secret exponent when 100 // calling |DH_generate_key| on |dh| and returns one. If unset, 101 // |DH_generate_key| will use the bit length of p. 102 OPENSSL_EXPORT int DH_set_length(DH *dh, unsigned priv_length); 103 104 105 // Standard parameters. 106 107 // DH_get_rfc7919_2048 returns the group `ffdhe2048` from 108 // https://tools.ietf.org/html/rfc7919#appendix-A.1. It returns NULL if out 109 // of memory. 110 OPENSSL_EXPORT DH *DH_get_rfc7919_2048(void); 111 112 // BN_get_rfc3526_prime_1536 sets |*ret| to the 1536-bit MODP group from RFC 113 // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 114 // and returned. It returns NULL on allocation failure. 115 OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *ret); 116 117 // BN_get_rfc3526_prime_2048 sets |*ret| to the 2048-bit MODP group from RFC 118 // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 119 // and returned. It returns NULL on allocation failure. 120 OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *ret); 121 122 // BN_get_rfc3526_prime_3072 sets |*ret| to the 3072-bit MODP group from RFC 123 // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 124 // and returned. It returns NULL on allocation failure. 125 OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *ret); 126 127 // BN_get_rfc3526_prime_4096 sets |*ret| to the 4096-bit MODP group from RFC 128 // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 129 // and returned. It returns NULL on allocation failure. 130 OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *ret); 131 132 // BN_get_rfc3526_prime_6144 sets |*ret| to the 6144-bit MODP group from RFC 133 // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 134 // and returned. It returns NULL on allocation failure. 135 OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *ret); 136 137 // BN_get_rfc3526_prime_8192 sets |*ret| to the 8192-bit MODP group from RFC 138 // 3526 and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated 139 // and returned. It returns NULL on allocation failure. 140 OPENSSL_EXPORT BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *ret); 141 142 143 // Parameter generation. 144 145 #define DH_GENERATOR_2 2 146 #define DH_GENERATOR_5 5 147 148 // DH_generate_parameters_ex generates a suitable Diffie-Hellman group with a 149 // prime that is |prime_bits| long and stores it in |dh|. The generator of the 150 // group will be |generator|, which should be |DH_GENERATOR_2| unless there's a 151 // good reason to use a different value. The |cb| argument contains a callback 152 // function that will be called during the generation. See the documentation in 153 // |bn.h| about this. In addition to the callback invocations from |BN|, |cb| 154 // will also be called with |event| equal to three when the generation is 155 // complete. 156 OPENSSL_EXPORT int DH_generate_parameters_ex(DH *dh, int prime_bits, 157 int generator, BN_GENCB *cb); 158 159 160 // Diffie-Hellman operations. 161 162 // DH_generate_key generates a new, random, private key and stores it in 163 // |dh|, if |dh| does not already have a private key. Otherwise, it updates 164 // |dh|'s public key to match the private key. It returns one on success and 165 // zero on error. 166 OPENSSL_EXPORT int DH_generate_key(DH *dh); 167 168 // DH_compute_key_padded calculates the shared key between |dh| and |peers_key| 169 // and writes it as a big-endian integer into |out|, padded up to |DH_size| 170 // bytes. It returns the number of bytes written, which is always |DH_size|, or 171 // a negative number on error. |out| must have |DH_size| bytes of space. 172 // 173 // WARNING: this differs from the usual BoringSSL return-value convention. 174 // 175 // Note this function differs from |DH_compute_key| in that it preserves leading 176 // zeros in the secret. This function is the preferred variant. It matches PKCS 177 // #3 and avoids some side channel attacks. However, the two functions are not 178 // drop-in replacements for each other. Using a different variant than the 179 // application expects will result in sporadic key mismatches. 180 // 181 // Callers that expect a fixed-width secret should use this function over 182 // |DH_compute_key|. Callers that use either function should migrate to a modern 183 // primitive such as X25519 or ECDH with P-256 instead. 184 // 185 // This function does not mutate |dh| for thread-safety purposes and may be used 186 // concurrently. 187 OPENSSL_EXPORT int DH_compute_key_padded(uint8_t *out, const BIGNUM *peers_key, 188 DH *dh); 189 190 // DH_compute_key_hashed calculates the shared key between |dh| and |peers_key| 191 // and hashes it with the given |digest|. If the hash output is less than 192 // |max_out_len| bytes then it writes the hash output to |out| and sets 193 // |*out_len| to the number of bytes written. Otherwise it signals an error. It 194 // returns one on success or zero on error. 195 // 196 // NOTE: this follows the usual BoringSSL return-value convention, but that's 197 // different from |DH_compute_key| and |DH_compute_key_padded|. 198 // 199 // This function does not mutate |dh| for thread-safety purposes and may be used 200 // concurrently. 201 OPENSSL_EXPORT int DH_compute_key_hashed(DH *dh, uint8_t *out, size_t *out_len, 202 size_t max_out_len, 203 const BIGNUM *peers_key, 204 const EVP_MD *digest); 205 206 207 // Utility functions. 208 209 // DH_size returns the number of bytes in the DH group's prime. 210 OPENSSL_EXPORT int DH_size(const DH *dh); 211 212 // DH_num_bits returns the minimum number of bits needed to represent the 213 // absolute value of the DH group's prime. 214 OPENSSL_EXPORT unsigned DH_num_bits(const DH *dh); 215 216 #define DH_CHECK_P_NOT_PRIME 0x01 217 #define DH_CHECK_P_NOT_SAFE_PRIME 0x02 218 #define DH_CHECK_UNABLE_TO_CHECK_GENERATOR 0x04 219 #define DH_CHECK_NOT_SUITABLE_GENERATOR 0x08 220 #define DH_CHECK_Q_NOT_PRIME 0x10 221 #define DH_CHECK_INVALID_Q_VALUE 0x20 222 223 // These are compatibility defines. 224 #define DH_NOT_SUITABLE_GENERATOR DH_CHECK_NOT_SUITABLE_GENERATOR 225 #define DH_UNABLE_TO_CHECK_GENERATOR DH_CHECK_UNABLE_TO_CHECK_GENERATOR 226 227 // DH_check checks the suitability of |dh| as a Diffie-Hellman group. and sets 228 // |DH_CHECK_*| flags in |*out_flags| if it finds any errors. It returns one if 229 // |*out_flags| was successfully set and zero on error. 230 // 231 // Note: these checks may be quite computationally expensive. 232 OPENSSL_EXPORT int DH_check(const DH *dh, int *out_flags); 233 234 #define DH_CHECK_PUBKEY_TOO_SMALL 0x1 235 #define DH_CHECK_PUBKEY_TOO_LARGE 0x2 236 #define DH_CHECK_PUBKEY_INVALID 0x4 237 238 // DH_check_pub_key checks the suitability of |pub_key| as a public key for the 239 // DH group in |dh| and sets |DH_CHECK_PUBKEY_*| flags in |*out_flags| if it 240 // finds any errors. It returns one if |*out_flags| was successfully set and 241 // zero on error. 242 OPENSSL_EXPORT int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, 243 int *out_flags); 244 245 // DHparams_dup allocates a fresh |DH| and copies the parameters from |dh| into 246 // it. It returns the new |DH| or NULL on error. 247 OPENSSL_EXPORT DH *DHparams_dup(const DH *dh); 248 249 250 // ASN.1 functions. 251 252 // DH_parse_parameters decodes a DER-encoded DHParameter structure (PKCS #3) 253 // from |cbs| and advances |cbs|. It returns a newly-allocated |DH| or NULL on 254 // error. 255 OPENSSL_EXPORT DH *DH_parse_parameters(CBS *cbs); 256 257 // DH_marshal_parameters marshals |dh| as a DER-encoded DHParameter structure 258 // (PKCS #3) and appends the result to |cbb|. It returns one on success and zero 259 // on error. 260 OPENSSL_EXPORT int DH_marshal_parameters(CBB *cbb, const DH *dh); 261 262 263 // Deprecated functions. 264 265 // DH_generate_parameters behaves like |DH_generate_parameters_ex|, which is 266 // what you should use instead. It returns NULL on error, or a newly-allocated 267 // |DH| on success. This function is provided for compatibility only. 268 OPENSSL_EXPORT DH *DH_generate_parameters(int prime_len, int generator, 269 void (*callback)(int, int, void *), 270 void *cb_arg); 271 272 // d2i_DHparams parses a DER-encoded DHParameter structure (PKCS #3) from |len| 273 // bytes at |*inp|, as in |d2i_SAMPLE|. 274 // 275 // Use |DH_parse_parameters| instead. 276 OPENSSL_EXPORT DH *d2i_DHparams(DH **ret, const unsigned char **inp, long len); 277 278 // i2d_DHparams marshals |in| to a DER-encoded DHParameter structure (PKCS #3), 279 // as described in |i2d_SAMPLE|. 280 // 281 // Use |DH_marshal_parameters| instead. 282 OPENSSL_EXPORT int i2d_DHparams(const DH *in, unsigned char **outp); 283 284 // DH_compute_key behaves like |DH_compute_key_padded| but, contrary to PKCS #3, 285 // returns a variable-length shared key with leading zeros. It returns the 286 // number of bytes written, or a negative number on error. |out| must have 287 // |DH_size| bytes of space. 288 // 289 // WARNING: this differs from the usual BoringSSL return-value convention. 290 // 291 // Note this function's running time and memory access pattern leaks information 292 // about the shared secret. Particularly if |dh| is reused, this may result in 293 // side channel attacks such as https://raccoon-attack.com/. 294 // 295 // |DH_compute_key_padded| is the preferred variant and avoids the above 296 // attacks. However, the two functions are not drop-in replacements for each 297 // other. Using a different variant than the application expects will result in 298 // sporadic key mismatches. 299 // 300 // Callers that expect a fixed-width secret should use |DH_compute_key_padded| 301 // instead. Callers that use either function should migrate to a modern 302 // primitive such as X25519 or ECDH with P-256 instead. 303 // 304 // This function does not mutate |dh| for thread-safety purposes and may be used 305 // concurrently. 306 OPENSSL_EXPORT int DH_compute_key(uint8_t *out, const BIGNUM *peers_key, 307 DH *dh); 308 309 310 #if defined(__cplusplus) 311 } // extern C 312 313 extern "C++" { 314 315 BSSL_NAMESPACE_BEGIN 316 317 BORINGSSL_MAKE_DELETER(DH, DH_free) 318 BORINGSSL_MAKE_UP_REF(DH, DH_up_ref) 319 320 BSSL_NAMESPACE_END 321 322 } // extern C++ 323 324 #endif 325 326 #define DH_R_BAD_GENERATOR 100 327 #define DH_R_INVALID_PUBKEY 101 328 #define DH_R_MODULUS_TOO_LARGE 102 329 #define DH_R_NO_PRIVATE_VALUE 103 330 #define DH_R_DECODE_ERROR 104 331 #define DH_R_ENCODE_ERROR 105 332 #define DH_R_INVALID_PARAMETERS 106 333 334 #endif // OPENSSL_HEADER_DH_H