Coverage Report

Created: 2024-11-21 06:47

/src/boringssl/crypto/fipsmodule/delocate.h
Line
Count
Source
1
/* Copyright (c) 2017, Google Inc.
2
 *
3
 * Permission to use, copy, modify, and/or distribute this software for any
4
 * purpose with or without fee is hereby granted, provided that the above
5
 * copyright notice and this permission notice appear in all copies.
6
 *
7
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10
 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
15
#ifndef OPENSSL_HEADER_FIPSMODULE_DELOCATE_H
16
#define OPENSSL_HEADER_FIPSMODULE_DELOCATE_H
17
18
#include <openssl/base.h>
19
20
#include "../internal.h"
21
22
23
#if !defined(BORINGSSL_SHARED_LIBRARY) && defined(BORINGSSL_FIPS) && \
24
    !defined(OPENSSL_ASAN) && !defined(OPENSSL_MSAN)
25
#define DEFINE_BSS_GET(type, name)        \
26
  static type name __attribute__((used)); \
27
  type *name##_bss_get(void) __attribute__((const));
28
// For FIPS builds we require that CRYPTO_ONCE_INIT be zero.
29
#define DEFINE_STATIC_ONCE(name) DEFINE_BSS_GET(CRYPTO_once_t, name)
30
// For FIPS builds we require that CRYPTO_MUTEX_INIT be zero.
31
#define DEFINE_STATIC_MUTEX(name) DEFINE_BSS_GET(CRYPTO_MUTEX, name)
32
// For FIPS builds we require that CRYPTO_EX_DATA_CLASS_INIT be zero.
33
#define DEFINE_STATIC_EX_DATA_CLASS(name) \
34
  DEFINE_BSS_GET(CRYPTO_EX_DATA_CLASS, name)
35
#else
36
#define DEFINE_BSS_GET(type, name) \
37
  static type name;                \
38
8.00k
  static type *name##_bss_get(void) { return &name; }
bcm.c:BN_value_one_storage_bss_get
Line
Count
Source
38
7.24k
  static type *name##_bss_get(void) { return &name; }
Unexecuted instantiation: bcm.c:EVP_aes_128_cbc_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_128_ctr_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_128_ofb_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_128_gcm_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_192_cbc_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_192_ctr_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_192_ofb_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_192_gcm_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_256_cbc_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_256_ctr_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_256_ofb_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_256_gcm_storage_bss_get
Unexecuted instantiation: bcm.c:aes_hw_128_ecb_storage_bss_get
Unexecuted instantiation: bcm.c:aes_128_ecb_generic_storage_bss_get
Unexecuted instantiation: bcm.c:aes_hw_192_ecb_storage_bss_get
Unexecuted instantiation: bcm.c:aes_192_ecb_generic_storage_bss_get
Unexecuted instantiation: bcm.c:aes_hw_256_ecb_storage_bss_get
Unexecuted instantiation: bcm.c:aes_256_ecb_generic_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_192_gcm_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_randnonce_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_randnonce_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_tls12_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_tls12_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_tls13_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_tls13_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_ccm_bluetooth_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_ccm_bluetooth_8_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_ccm_matter_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_sha1_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_sha224_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_sha256_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_sha384_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_sha512_storage_bss_get
Unexecuted instantiation: bcm.c:EVP_sha512_256_storage_bss_get
Unexecuted instantiation: bcm.c:md_pctx_ops_storage_bss_get
Unexecuted instantiation: bcm.c:EC_group_p224_storage_bss_get
Unexecuted instantiation: bcm.c:EC_group_p256_storage_bss_get
Unexecuted instantiation: bcm.c:EC_group_p384_storage_bss_get
Unexecuted instantiation: bcm.c:EC_group_p521_storage_bss_get
Unexecuted instantiation: bcm.c:EC_GFp_mont_method_storage_bss_get
Unexecuted instantiation: bcm.c:EC_GFp_nistp224_method_storage_bss_get
Unexecuted instantiation: bcm.c:EC_GFp_nistp256_method_storage_bss_get
Unexecuted instantiation: bcm.c:EC_GFp_nistz256_method_storage_bss_get
Unexecuted instantiation: bcm.c:g_small_factors_storage_bss_get
bcm.c:RSA_default_method_storage_bss_get
Line
Count
Source
38
766
  static type *name##_bss_get(void) { return &name; }
39
#define DEFINE_STATIC_ONCE(name)                \
40
  static CRYPTO_once_t name = CRYPTO_ONCE_INIT; \
41
8.00k
  static CRYPTO_once_t *name##_bss_get(void) { return &name; }
bcm.c:BN_value_one_once_bss_get
Line
Count
Source
41
7.23k
  static CRYPTO_once_t *name##_bss_get(void) { return &name; }
Unexecuted instantiation: bcm.c:EVP_aes_128_cbc_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_128_ctr_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_128_ofb_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_128_gcm_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_192_cbc_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_192_ctr_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_192_ofb_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_192_gcm_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_256_cbc_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_256_ctr_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_256_ofb_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aes_256_gcm_once_bss_get
Unexecuted instantiation: bcm.c:aes_hw_128_ecb_once_bss_get
Unexecuted instantiation: bcm.c:aes_128_ecb_generic_once_bss_get
Unexecuted instantiation: bcm.c:aes_hw_192_ecb_once_bss_get
Unexecuted instantiation: bcm.c:aes_192_ecb_generic_once_bss_get
Unexecuted instantiation: bcm.c:aes_hw_256_ecb_once_bss_get
Unexecuted instantiation: bcm.c:aes_256_ecb_generic_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_192_gcm_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_randnonce_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_randnonce_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_tls12_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_tls12_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_tls13_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_tls13_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_ccm_bluetooth_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_ccm_bluetooth_8_once_bss_get
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_ccm_matter_once_bss_get
Unexecuted instantiation: bcm.c:EVP_sha1_once_bss_get
Unexecuted instantiation: bcm.c:EVP_sha224_once_bss_get
Unexecuted instantiation: bcm.c:EVP_sha256_once_bss_get
Unexecuted instantiation: bcm.c:EVP_sha384_once_bss_get
Unexecuted instantiation: bcm.c:EVP_sha512_once_bss_get
Unexecuted instantiation: bcm.c:EVP_sha512_256_once_bss_get
Unexecuted instantiation: bcm.c:md_pctx_ops_once_bss_get
Unexecuted instantiation: bcm.c:EC_group_p224_once_bss_get
Unexecuted instantiation: bcm.c:EC_group_p256_once_bss_get
Unexecuted instantiation: bcm.c:EC_group_p384_once_bss_get
Unexecuted instantiation: bcm.c:EC_group_p521_once_bss_get
Unexecuted instantiation: bcm.c:EC_GFp_mont_method_once_bss_get
Unexecuted instantiation: bcm.c:EC_GFp_nistp224_method_once_bss_get
Unexecuted instantiation: bcm.c:EC_GFp_nistp256_method_once_bss_get
Unexecuted instantiation: bcm.c:EC_GFp_nistz256_method_once_bss_get
Unexecuted instantiation: bcm.c:g_small_factors_once_bss_get
bcm.c:RSA_default_method_once_bss_get
Line
Count
Source
41
764
  static CRYPTO_once_t *name##_bss_get(void) { return &name; }
42
#define DEFINE_STATIC_MUTEX(name)               \
43
  static CRYPTO_MUTEX name = CRYPTO_MUTEX_INIT; \
44
  static CRYPTO_MUTEX *name##_bss_get(void) { return &name; }
45
#define DEFINE_STATIC_EX_DATA_CLASS(name)                       \
46
  static CRYPTO_EX_DATA_CLASS name = CRYPTO_EX_DATA_CLASS_INIT; \
47
764
  static CRYPTO_EX_DATA_CLASS *name##_bss_get(void) { return &name; }
Unexecuted instantiation: bcm.c:g_ec_ex_data_class_bss_get
bcm.c:g_rsa_ex_data_class_bss_get
Line
Count
Source
47
764
  static CRYPTO_EX_DATA_CLASS *name##_bss_get(void) { return &name; }
48
#endif
49
50
#define DEFINE_DATA(type, name, accessor_decorations)                         \
51
  DEFINE_BSS_GET(type, name##_storage)                                        \
52
  DEFINE_STATIC_ONCE(name##_once)                                             \
53
  static void name##_do_init(type *out);                                      \
54
4
  static void name##_init(void) { name##_do_init(name##_storage_bss_get()); } \
bcm.c:BN_value_one_init
Line
Count
Source
54
2
  static void name##_init(void) { name##_do_init(name##_storage_bss_get()); } \
Unexecuted instantiation: bcm.c:EVP_aes_128_cbc_init
Unexecuted instantiation: bcm.c:EVP_aes_128_ctr_init
Unexecuted instantiation: bcm.c:EVP_aes_128_ofb_init
Unexecuted instantiation: bcm.c:EVP_aes_128_gcm_init
Unexecuted instantiation: bcm.c:EVP_aes_192_cbc_init
Unexecuted instantiation: bcm.c:EVP_aes_192_ctr_init
Unexecuted instantiation: bcm.c:EVP_aes_192_ofb_init
Unexecuted instantiation: bcm.c:EVP_aes_192_gcm_init
Unexecuted instantiation: bcm.c:EVP_aes_256_cbc_init
Unexecuted instantiation: bcm.c:EVP_aes_256_ctr_init
Unexecuted instantiation: bcm.c:EVP_aes_256_ofb_init
Unexecuted instantiation: bcm.c:EVP_aes_256_gcm_init
Unexecuted instantiation: bcm.c:aes_hw_128_ecb_init
Unexecuted instantiation: bcm.c:aes_128_ecb_generic_init
Unexecuted instantiation: bcm.c:aes_hw_192_ecb_init
Unexecuted instantiation: bcm.c:aes_192_ecb_generic_init
Unexecuted instantiation: bcm.c:aes_hw_256_ecb_init
Unexecuted instantiation: bcm.c:aes_256_ecb_generic_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_192_gcm_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_randnonce_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_randnonce_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_tls12_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_tls12_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_gcm_tls13_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_256_gcm_tls13_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_ccm_bluetooth_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_ccm_bluetooth_8_init
Unexecuted instantiation: bcm.c:EVP_aead_aes_128_ccm_matter_init
Unexecuted instantiation: bcm.c:EVP_sha1_init
Unexecuted instantiation: bcm.c:EVP_sha224_init
Unexecuted instantiation: bcm.c:EVP_sha256_init
Unexecuted instantiation: bcm.c:EVP_sha384_init
Unexecuted instantiation: bcm.c:EVP_sha512_init
Unexecuted instantiation: bcm.c:EVP_sha512_256_init
Unexecuted instantiation: bcm.c:md_pctx_ops_init
Unexecuted instantiation: bcm.c:EC_group_p224_init
Unexecuted instantiation: bcm.c:EC_group_p256_init
Unexecuted instantiation: bcm.c:EC_group_p384_init
Unexecuted instantiation: bcm.c:EC_group_p521_init
Unexecuted instantiation: bcm.c:EC_GFp_mont_method_init
Unexecuted instantiation: bcm.c:EC_GFp_nistp224_method_init
Unexecuted instantiation: bcm.c:EC_GFp_nistp256_method_init
Unexecuted instantiation: bcm.c:EC_GFp_nistz256_method_init
Unexecuted instantiation: bcm.c:g_small_factors_init
bcm.c:RSA_default_method_init
Line
Count
Source
54
2
  static void name##_init(void) { name##_do_init(name##_storage_bss_get()); } \
55
63.6k
  accessor_decorations type *name(void) {                                     \
56
63.6k
    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
57
63.6k
    /* See http://c-faq.com/ansi/constmismatch.html for why the following     \
58
63.6k
     * cast is needed. */                                                     \
59
63.6k
    return (const type *)name##_storage_bss_get();                            \
60
63.6k
  }                                                                           \
BN_value_one
Line
Count
Source
55
62.8k
  accessor_decorations type *name(void) {                                     \
56
62.8k
    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
57
62.8k
    /* See http://c-faq.com/ansi/constmismatch.html for why the following     \
58
62.8k
     * cast is needed. */                                                     \
59
62.8k
    return (const type *)name##_storage_bss_get();                            \
60
62.8k
  }                                                                           \
Unexecuted instantiation: EVP_aead_aes_128_gcm
Unexecuted instantiation: EVP_aead_aes_192_gcm
Unexecuted instantiation: EVP_aead_aes_256_gcm
Unexecuted instantiation: EVP_aead_aes_128_gcm_randnonce
Unexecuted instantiation: EVP_aead_aes_256_gcm_randnonce
Unexecuted instantiation: EVP_aead_aes_128_gcm_tls12
Unexecuted instantiation: EVP_aead_aes_256_gcm_tls12
Unexecuted instantiation: EVP_aead_aes_128_gcm_tls13
Unexecuted instantiation: EVP_aead_aes_256_gcm_tls13
Unexecuted instantiation: EVP_aead_aes_128_ccm_bluetooth
Unexecuted instantiation: EVP_aead_aes_128_ccm_bluetooth_8
Unexecuted instantiation: EVP_aead_aes_128_ccm_matter
EVP_sha1
Line
Count
Source
55
3
  accessor_decorations type *name(void) {                                     \
56
3
    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
57
3
    /* See http://c-faq.com/ansi/constmismatch.html for why the following     \
58
3
     * cast is needed. */                                                     \
59
3
    return (const type *)name##_storage_bss_get();                            \
60
3
  }                                                                           \
EVP_sha224
Line
Count
Source
55
3
  accessor_decorations type *name(void) {                                     \
56
3
    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
57
3
    /* See http://c-faq.com/ansi/constmismatch.html for why the following     \
58
3
     * cast is needed. */                                                     \
59
3
    return (const type *)name##_storage_bss_get();                            \
60
3
  }                                                                           \
EVP_sha256
Line
Count
Source
55
3
  accessor_decorations type *name(void) {                                     \
56
3
    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
57
3
    /* See http://c-faq.com/ansi/constmismatch.html for why the following     \
58
3
     * cast is needed. */                                                     \
59
3
    return (const type *)name##_storage_bss_get();                            \
60
3
  }                                                                           \
EVP_sha384
Line
Count
Source
55
3
  accessor_decorations type *name(void) {                                     \
56
3
    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
57
3
    /* See http://c-faq.com/ansi/constmismatch.html for why the following     \
58
3
     * cast is needed. */                                                     \
59
3
    return (const type *)name##_storage_bss_get();                            \
60
3
  }                                                                           \
EVP_sha512
Line
Count
Source
55
3
  accessor_decorations type *name(void) {                                     \
56
3
    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
57
3
    /* See http://c-faq.com/ansi/constmismatch.html for why the following     \
58
3
     * cast is needed. */                                                     \
59
3
    return (const type *)name##_storage_bss_get();                            \
60
3
  }                                                                           \
EVP_sha512_256
Line
Count
Source
55
3
  accessor_decorations type *name(void) {                                     \
56
3
    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
57
3
    /* See http://c-faq.com/ansi/constmismatch.html for why the following     \
58
3
     * cast is needed. */                                                     \
59
3
    return (const type *)name##_storage_bss_get();                            \
60
3
  }                                                                           \
Unexecuted instantiation: EC_group_p224
Unexecuted instantiation: EC_group_p256
Unexecuted instantiation: EC_group_p384
Unexecuted instantiation: EC_group_p521
Unexecuted instantiation: EC_GFp_mont_method
Unexecuted instantiation: EC_GFp_nistp224_method
Unexecuted instantiation: EC_GFp_nistp256_method
Unexecuted instantiation: EC_GFp_nistz256_method
RSA_default_method
Line
Count
Source
55
764
  accessor_decorations type *name(void) {                                     \
56
764
    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
57
764
    /* See http://c-faq.com/ansi/constmismatch.html for why the following     \
58
764
     * cast is needed. */                                                     \
59
764
    return (const type *)name##_storage_bss_get();                            \
60
764
  }                                                                           \
Unexecuted instantiation: bcm.c:aes_hw_128_ecb
Unexecuted instantiation: bcm.c:aes_128_ecb_generic
Unexecuted instantiation: bcm.c:aes_hw_192_ecb
Unexecuted instantiation: bcm.c:aes_192_ecb_generic
Unexecuted instantiation: bcm.c:aes_hw_256_ecb
Unexecuted instantiation: bcm.c:aes_256_ecb_generic
Unexecuted instantiation: bcm.c:md_pctx_ops
Unexecuted instantiation: bcm.c:g_small_factors
61
  static void name##_do_init(type *out)
62
63
// DEFINE_METHOD_FUNCTION defines a function named |name| which returns a
64
// method table of type const |type|*. In FIPS mode, to avoid rel.ro data, it
65
// is split into a CRYPTO_once_t-guarded initializer in the module and
66
// unhashed, non-module accessor functions to space reserved in the BSS. The
67
// method table is initialized by a caller-supplied function which takes a
68
// parameter named |out| of type |type|*. The caller should follow the macro
69
// invocation with the body of this function:
70
//
71
//     DEFINE_METHOD_FUNCTION(EVP_MD, EVP_md4) {
72
//       out->type = NID_md4;
73
//       out->md_size = MD4_DIGEST_LENGTH;
74
//       out->flags = 0;
75
//       out->init = md4_init;
76
//       out->update = md4_update;
77
//       out->final = md4_final;
78
//       out->block_size = 64;
79
//       out->ctx_size = sizeof(MD4_CTX);
80
//     }
81
//
82
// This mechanism does not use a static initializer because their execution
83
// order is undefined. See FIPS.md for more details.
84
#define DEFINE_METHOD_FUNCTION(type, name) DEFINE_DATA(type, name, const)
85
86
#define DEFINE_LOCAL_DATA(type, name) DEFINE_DATA(type, name, static const)
87
88
#endif  // OPENSSL_HEADER_FIPSMODULE_DELOCATE_H