LCOV - code coverage report
Current view: top level - lib/crypt_ops - crypto_dh.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 25 26 96.2 %
Date: 2021-11-24 03:28:48 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* Copyright (c) 2001, Matej Pfajfar.
       2             :  * Copyright (c) 2001-2004, Roger Dingledine.
       3             :  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
       4             :  * Copyright (c) 2007-2021, The Tor Project, Inc. */
       5             : /* See LICENSE for licensing information */
       6             : 
       7             : /**
       8             :  * \file crypto_dh.c
       9             :  * \brief Block of functions related with DH utilities and operations.
      10             :  *    over Z_p.  We aren't using this for any new crypto -- EC is more
      11             :  *    efficient.
      12             :  **/
      13             : 
      14             : #include "lib/crypt_ops/compat_openssl.h"
      15             : #include "lib/crypt_ops/crypto_dh.h"
      16             : #include "lib/crypt_ops/crypto_digest.h"
      17             : #include "lib/crypt_ops/crypto_hkdf.h"
      18             : #include "lib/crypt_ops/crypto_util.h"
      19             : #include "lib/log/log.h"
      20             : #include "lib/log/util_bug.h"
      21             : 
      22             : /** Our DH 'g' parameter */
      23             : const unsigned DH_GENERATOR = 2;
      24             : /** This is the 1024-bit safe prime that Apache uses for its DH stuff; see
      25             :  * modules/ssl/ssl_engine_dh.c; Apache also uses a generator of 2 with this
      26             :  * prime.
      27             :  */
      28             : const char TLS_DH_PRIME[] =
      29             :   "D67DE440CBBBDC1936D693D34AFD0AD50C84D239A45F520BB88174CB98"
      30             :   "BCE951849F912E639C72FB13B4B4D7177E16D55AC179BA420B2A29FE324A"
      31             :   "467A635E81FF5901377BEDDCFD33168A461AAD3B72DAE8860078045B07A7"
      32             :   "DBCA7874087D1510EA9FCC9DDD330507DD62DB88AEAA747DE0F4D6E2BD68"
      33             :   "B0E7393E0F24218EB3";
      34             : /**
      35             :  * This is from rfc2409, section 6.2.  It's a safe prime, and
      36             :  * supposedly it equals:
      37             :  * 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }.
      38             :  */
      39             : const char OAKLEY_PRIME_2[] =
      40             :   "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
      41             :   "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
      42             :   "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
      43             :   "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
      44             :   "49286651ECE65381FFFFFFFFFFFFFFFF";
      45             : 
      46             : void
      47       11081 : crypto_dh_init(void)
      48             : {
      49             : #ifdef ENABLE_OPENSSL
      50       11081 :   crypto_dh_init_openssl();
      51             : #endif
      52             : #ifdef ENABLE_NSS
      53             :   crypto_dh_init_nss();
      54             : #endif
      55       11081 : }
      56             : 
      57             : void
      58         235 : crypto_dh_free_all(void)
      59             : {
      60             : #ifdef ENABLE_OPENSSL
      61         235 :   crypto_dh_free_all_openssl();
      62             : #endif
      63             : #ifdef ENABLE_NSS
      64             :   crypto_dh_free_all_nss();
      65             : #endif
      66         235 : }
      67             : 
      68             : /** Given a DH key exchange object, and our peer's value of g^y (as a
      69             :  * <b>pubkey_len</b>-byte value in <b>pubkey</b>) generate
      70             :  * <b>secret_bytes_out</b> bytes of shared key material and write them
      71             :  * to <b>secret_out</b>.  Return the number of bytes generated on success,
      72             :  * or -1 on failure.
      73             :  *
      74             :  * (We generate key material by computing
      75             :  *         SHA1( g^xy || "\x00" ) || SHA1( g^xy || "\x01" ) || ...
      76             :  * where || is concatenation.)
      77             :  */
      78             : ssize_t
      79          28 : crypto_dh_compute_secret(int severity, crypto_dh_t *dh,
      80             :                          const char *pubkey, size_t pubkey_len,
      81             :                          char *secret_out, size_t secret_bytes_out)
      82             : {
      83          28 :   tor_assert(secret_bytes_out/DIGEST_LEN <= 255);
      84             : 
      85          28 :   unsigned char *secret_tmp = NULL;
      86          28 :   size_t secret_len=0, secret_tmp_len=0;
      87          28 :   secret_tmp_len = crypto_dh_get_bytes(dh);
      88          28 :   secret_tmp = tor_malloc(secret_tmp_len);
      89             : 
      90          28 :   ssize_t result = crypto_dh_handshake(severity, dh, pubkey, pubkey_len,
      91             :                                    secret_tmp, secret_tmp_len);
      92          28 :   if (result < 0)
      93          13 :     goto error;
      94             : 
      95          15 :   secret_len = result;
      96          15 :   if (crypto_expand_key_material_TAP(secret_tmp, secret_len,
      97             :                                      (uint8_t*)secret_out, secret_bytes_out)<0)
      98           0 :     goto error;
      99          15 :   secret_len = secret_bytes_out;
     100             : 
     101          15 :   goto done;
     102             :  error:
     103             :   result = -1;
     104          28 :  done:
     105          28 :   if (secret_tmp) {
     106          28 :     memwipe(secret_tmp, 0, secret_tmp_len);
     107          28 :     tor_free(secret_tmp);
     108             :   }
     109          28 :   if (result < 0)
     110             :     return result;
     111             :   else
     112          15 :     return secret_len;
     113             : }

Generated by: LCOV version 1.14