Const-correct the internal/external pointer casts We can use overloads to get it right in C++. This caught one type that should have been const. Bug: 450044889 Change-Id: I936fe877cb95bebb73a9a72160f3c87f2b68d713 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/82689 Reviewed-by: Adam Langley <agl@google.com> Commit-Queue: Adam Langley <agl@google.com> Auto-Submit: David Benjamin <davidben@google.com>
diff --git a/crypto/fipsmodule/mldsa/mldsa.cc.inc b/crypto/fipsmodule/mldsa/mldsa.cc.inc index 2a2fd1c..d72e069 100644 --- a/crypto/fipsmodule/mldsa/mldsa.cc.inc +++ b/crypto/fipsmodule/mldsa/mldsa.cc.inc
@@ -1998,81 +1998,86 @@ context, context_len); } -private_key<6, 5> *private_key_from_external_65( +static_assert(sizeof(MLDSA65_private_key) == sizeof(private_key<6, 5>)); +static_assert(alignof(MLDSA65_private_key) == alignof(private_key<6, 5>)); + +const private_key<6, 5> *private_key_from_external_65( const MLDSA65_private_key *external) { - static_assert(sizeof(MLDSA65_private_key) == sizeof(private_key<6, 5>), - "MLDSA65 private key size incorrect"); - static_assert(alignof(MLDSA65_private_key) == alignof(private_key<6, 5>), - "MLDSA65 private key alignment incorrect"); - return (private_key<6, 5> *)external; + return reinterpret_cast<const private_key<6, 5> *>(external); +} +private_key<6, 5> *private_key_from_external_65(MLDSA65_private_key *external) { + return reinterpret_cast<private_key<6, 5> *>(external); } -public_key<6> *public_key_from_external_65(const MLDSA65_public_key *external) { - static_assert(sizeof(MLDSA65_public_key) == sizeof(public_key<6>), - "MLDSA65 public key size incorrect"); - static_assert(alignof(MLDSA65_public_key) == alignof(public_key<6>), - "MLDSA65 public key alignment incorrect"); - return (public_key<6> *)external; +static_assert(sizeof(MLDSA65_public_key) == sizeof(public_key<6>)); +static_assert(alignof(MLDSA65_public_key) == alignof(public_key<6>)); + +const public_key<6> *public_key_from_external_65( + const MLDSA65_public_key *external) { + return reinterpret_cast<const public_key<6> *>(external); +} +public_key<6> *public_key_from_external_65(MLDSA65_public_key *external) { + return reinterpret_cast<public_key<6> *>(external); } -struct prehash_context *prehash_context_from_external_65( - MLDSA65_prehash *external) { - static_assert(sizeof(MLDSA65_prehash) == sizeof(prehash_context), - "MLDSA pre-hash context size incorrect"); - static_assert(alignof(MLDSA65_prehash) == alignof(prehash_context), - "MLDSA pre-hash context alignment incorrect"); +prehash_context *prehash_context_from_external_65(MLDSA65_prehash *external) { + static_assert(sizeof(MLDSA65_prehash) == sizeof(prehash_context)); + static_assert(alignof(MLDSA65_prehash) == alignof(prehash_context)); return reinterpret_cast<prehash_context *>(external); } -private_key<8, 7> *private_key_from_external_87( +static_assert(sizeof(MLDSA87_private_key) == sizeof(private_key<8, 7>)); +static_assert(alignof(MLDSA87_private_key) == alignof(private_key<8, 7>)); +const private_key<8, 7> *private_key_from_external_87( const MLDSA87_private_key *external) { - static_assert(sizeof(MLDSA87_private_key) == sizeof(private_key<8, 7>), - "MLDSA87 private key size incorrect"); - static_assert(alignof(MLDSA87_private_key) == alignof(private_key<8, 7>), - "MLDSA87 private key alignment incorrect"); - return (private_key<8, 7> *)external; + return reinterpret_cast<const private_key<8, 7> *>(external); +} +private_key<8, 7> *private_key_from_external_87(MLDSA87_private_key *external) { + return reinterpret_cast<private_key<8, 7> *>(external); } -public_key<8> *public_key_from_external_87(const MLDSA87_public_key *external) { - static_assert(sizeof(MLDSA87_public_key) == sizeof(public_key<8>), - "MLDSA87 public key size incorrect"); - static_assert(alignof(MLDSA87_public_key) == alignof(public_key<8>), - "MLDSA87 public key alignment incorrect"); - return (public_key<8> *)external; +static_assert(sizeof(MLDSA87_public_key) == sizeof(public_key<8>)); +static_assert(alignof(MLDSA87_public_key) == alignof(public_key<8>)); + +const public_key<8> *public_key_from_external_87( + const MLDSA87_public_key *external) { + return reinterpret_cast<const public_key<8> *>(external); +} +public_key<8> *public_key_from_external_87(MLDSA87_public_key *external) { + return reinterpret_cast<public_key<8> *>(external); } -struct prehash_context *prehash_context_from_external_87( - MLDSA87_prehash *external) { - static_assert(sizeof(MLDSA87_prehash) == sizeof(prehash_context), - "MLDSA pre-hash context size incorrect"); - static_assert(alignof(MLDSA87_prehash) == alignof(prehash_context), - "MLDSA pre-hash context alignment incorrect"); +prehash_context *prehash_context_from_external_87(MLDSA87_prehash *external) { + static_assert(sizeof(MLDSA87_prehash) == sizeof(prehash_context)); + static_assert(alignof(MLDSA87_prehash) == alignof(prehash_context)); return reinterpret_cast<prehash_context *>(external); } -private_key<4, 4> *private_key_from_external_44( +static_assert(sizeof(MLDSA44_private_key) == sizeof(private_key<4, 4>)); +static_assert(alignof(MLDSA44_private_key) == alignof(private_key<4, 4>)); + +const private_key<4, 4> *private_key_from_external_44( const MLDSA44_private_key *external) { - static_assert(sizeof(MLDSA44_private_key) == sizeof(private_key<4, 4>), - "MLDSA44 private key size incorrect"); - static_assert(alignof(MLDSA44_private_key) == alignof(private_key<4, 4>), - "MLDSA44 private key alignment incorrect"); - return (private_key<4, 4> *)external; + return reinterpret_cast<const private_key<4, 4> *>(external); +} +private_key<4, 4> *private_key_from_external_44(MLDSA44_private_key *external) { + return reinterpret_cast<private_key<4, 4> *>(external); } -public_key<4> *public_key_from_external_44(const MLDSA44_public_key *external) { - static_assert(sizeof(MLDSA44_public_key) == sizeof(public_key<4>), - "MLDSA44 public key size incorrect"); - static_assert(alignof(MLDSA44_public_key) == alignof(public_key<4>), - "MLDSA44 public key alignment incorrect"); - return (public_key<4> *)external; +static_assert(sizeof(MLDSA44_public_key) == sizeof(public_key<4>)); +static_assert(alignof(MLDSA44_public_key) == alignof(public_key<4>)); + +const public_key<4> *public_key_from_external_44( + const MLDSA44_public_key *external) { + return reinterpret_cast<const public_key<4> *>(external); +} +public_key<4> *public_key_from_external_44(MLDSA44_public_key *external) { + return reinterpret_cast<public_key<4> *>(external); } -struct prehash_context *prehash_context_from_external_44( - MLDSA44_prehash *external) { - static_assert(sizeof(MLDSA44_prehash) == sizeof(prehash_context), - "MLDSA pre-hash context size incorrect"); - static_assert(alignof(MLDSA44_prehash) == alignof(prehash_context), - "MLDSA pre-hash context alignment incorrect"); +prehash_context *prehash_context_from_external_44(MLDSA44_prehash *external) { + static_assert(sizeof(MLDSA44_prehash) == sizeof(prehash_context)); + static_assert(alignof(MLDSA44_prehash) == alignof(prehash_context)); return reinterpret_cast<prehash_context *>(external); }
diff --git a/crypto/fipsmodule/mlkem/mlkem.cc.inc b/crypto/fipsmodule/mlkem/mlkem.cc.inc index 692670c..017cf90 100644 --- a/crypto/fipsmodule/mlkem/mlkem.cc.inc +++ b/crypto/fipsmodule/mlkem/mlkem.cc.inc
@@ -870,41 +870,52 @@ return 1; } -public_key<RANK768> *public_key_768_from_external( +static_assert(sizeof(MLKEM768_public_key) >= sizeof(public_key<RANK768>)); +static_assert(alignof(MLKEM768_public_key) >= alignof(public_key<RANK768>)); + +const public_key<RANK768> *public_key_768_from_external( const MLKEM768_public_key *external) { - static_assert(sizeof(MLKEM768_public_key) >= sizeof(public_key<RANK768>), - "MLKEM public key is too small"); - static_assert(alignof(MLKEM768_public_key) >= alignof(public_key<RANK768>), - "MLKEM public key alignment incorrect"); - return (public_key<RANK768> *)external; + return reinterpret_cast<const public_key<RANK768> *>(external); +} +public_key<RANK768> *public_key_768_from_external( + MLKEM768_public_key *external) { + return reinterpret_cast<public_key<RANK768> *>(external); } -static public_key<RANK1024> *public_key_1024_from_external( +static_assert(sizeof(MLKEM1024_public_key) >= sizeof(public_key<RANK1024>)); +static_assert(alignof(MLKEM1024_public_key) >= alignof(public_key<RANK1024>)); + +const public_key<RANK1024> *public_key_1024_from_external( const MLKEM1024_public_key *external) { - static_assert(sizeof(MLKEM1024_public_key) >= sizeof(public_key<RANK1024>), - "MLKEM1024 public key is too small"); - static_assert(alignof(MLKEM1024_public_key) >= alignof(public_key<RANK1024>), - "MLKEM1024 public key alignment incorrect"); - return (public_key<RANK1024> *)external; + return reinterpret_cast<const public_key<RANK1024> *>(external); +} +public_key<RANK1024> *public_key_1024_from_external( + MLKEM1024_public_key *external) { + return reinterpret_cast<public_key<RANK1024> *>(external); } -private_key<RANK768> *private_key_768_from_external( +static_assert(sizeof(MLKEM768_private_key) >= sizeof(private_key<RANK768>)); +static_assert(alignof(MLKEM768_private_key) >= alignof(private_key<RANK768>)); + +const private_key<RANK768> *private_key_768_from_external( const MLKEM768_private_key *external) { - static_assert(sizeof(MLKEM768_private_key) >= sizeof(private_key<RANK768>), - "MLKEM private key too small"); - static_assert(alignof(MLKEM768_private_key) >= alignof(private_key<RANK768>), - "MLKEM private key alignment incorrect"); - return (private_key<RANK768> *)external; + return reinterpret_cast<const private_key<RANK768> *>(external); +} +private_key<RANK768> *private_key_768_from_external( + MLKEM768_private_key *external) { + return reinterpret_cast<private_key<RANK768> *>(external); } -private_key<RANK1024> *private_key_1024_from_external( +static_assert(sizeof(MLKEM1024_private_key) >= sizeof(private_key<RANK1024>)); +static_assert(alignof(MLKEM1024_private_key) >= alignof(private_key<RANK1024>)); + +const private_key<RANK1024> *private_key_1024_from_external( const MLKEM1024_private_key *external) { - static_assert(sizeof(MLKEM1024_private_key) >= sizeof(private_key<RANK1024>), - "MLKEM1024 private key too small"); - static_assert( - alignof(MLKEM1024_private_key) >= alignof(private_key<RANK1024>), - "MLKEM1024 private key alignment incorrect"); - return (private_key<RANK1024> *)external; + return reinterpret_cast<const private_key<RANK1024> *>(external); +} +private_key<RANK1024> *private_key_1024_from_external( + MLKEM1024_private_key *external) { + return reinterpret_cast<private_key<RANK1024> *>(external); } // See section 6.2. @@ -1062,7 +1073,7 @@ } // namespace mlkem bcm_status BCM_mlkem768_check_fips(const MLKEM768_private_key *private_key) { - mlkem::private_key<RANK768> *priv = + const mlkem::private_key<RANK768> *priv = mlkem::private_key_768_from_external(private_key); const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY] = {1, 2, 3, 4}; @@ -1125,7 +1136,7 @@ } bcm_status BCM_mlkem1024_check_fips(const MLKEM1024_private_key *private_key) { - mlkem::private_key<RANK1024> *priv = + const mlkem::private_key<RANK1024> *priv = mlkem::private_key_1024_from_external(private_key); const uint8_t entropy[BCM_MLKEM_ENCAP_ENTROPY] = {1, 2, 3, 4};
diff --git a/crypto/xwing/xwing.cc b/crypto/xwing/xwing.cc index 532aa4f..38436a0 100644 --- a/crypto/xwing/xwing.cc +++ b/crypto/xwing/xwing.cc
@@ -29,13 +29,15 @@ uint8_t seed[XWING_PRIVATE_KEY_BYTES]; }; -static struct private_key *private_key_from_external( +static_assert(sizeof(XWING_private_key) == sizeof(private_key)); +static_assert(alignof(XWING_private_key) == alignof(private_key)); + +static const private_key *private_key_from_external( const XWING_private_key *external) { - static_assert(sizeof(XWING_private_key) == sizeof(private_key), - "XWING private key size is incorrect"); - static_assert(alignof(XWING_private_key) == alignof(private_key), - "XWING private key alignment is incorrect"); - return (private_key *)external; + return reinterpret_cast<const private_key *>(external); +} +static private_key *private_key_from_external(XWING_private_key *external) { + return reinterpret_cast<private_key *>(external); } static void xwing_expand_private_key(private_key *inout_private_key) {