gnunet-android

GNUnet for Android
Log | Files | Refs | README

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