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) {