Use a less verbose pattern to heap-allocate temporaries in ML-DSA

As a bonus, this is also destructor-aware, though none of these types
have meaningful destructors. We do need this annoying kAllowUniquePtr
marker because bssl::UniquePtr otherwise expects a separate destructor
to be registered.

Other types in libssl use `static constexpr bool` but apparently
function-local types can't have static constexpr values. This seems to
work though.

Change-Id: I16d24f7845c22fab039795d5c198dde267a9c183
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/82690
Reviewed-by: Adam Langley <agl@google.com>
Auto-Submit: David Benjamin <davidben@google.com>
Commit-Queue: Adam Langley <agl@google.com>
diff --git a/crypto/fipsmodule/mldsa/mldsa.cc.inc b/crypto/fipsmodule/mldsa/mldsa.cc.inc
index d72e069..9412b9c 100644
--- a/crypto/fipsmodule/mldsa/mldsa.cc.inc
+++ b/crypto/fipsmodule/mldsa/mldsa.cc.inc
@@ -24,6 +24,7 @@
 #include <openssl/rand.h>
 
 #include "../../internal.h"
+#include "../../mem_internal.h"
 #include "../bcm_interface.h"
 #include "../keccak/internal.h"
 
@@ -1591,11 +1592,6 @@
   return 1;
 }
 
-template <typename T>
-struct DeleterFree {
-  void operator()(T *ptr) { OPENSSL_free(ptr); }
-};
-
 // FIPS 204, Algorithm 6 (`ML-DSA.KeyGen_internal`). Returns 1 on success and 0
 // on failure.
 template <int K, int L>
@@ -1604,15 +1600,15 @@
     private_key<K, L> *priv, const uint8_t entropy[MLDSA_SEED_BYTES]) {
   // Intermediate values, allocated on the heap to allow use when there is a
   // limited amount of stack.
-  struct values_st {
+  struct Values {
+    enum { kAllowUniquePtr = true };
     public_key<K> pub;
     matrix<K, L> a_ntt;
     vector<L> s1_ntt;
     vector<K> t;
   };
-  std::unique_ptr<values_st, DeleterFree<values_st>> values(
-      reinterpret_cast<values_st *>(OPENSSL_malloc(sizeof(values_st))));
-  if (values == NULL) {
+  auto values = bssl::MakeUnique<Values>();
+  if (values == nullptr) {
     return 0;
   }
 
@@ -1675,15 +1671,15 @@
                               const private_key<K, L> *priv) {
   // Intermediate values, allocated on the heap to allow use when there is a
   // limited amount of stack.
-  struct values_st {
+  struct Values {
+    enum { kAllowUniquePtr = true };
     matrix<K, L> a_ntt;
     vector<L> s1_ntt;
     vector<K> t;
     vector<K> t0;
   };
-  std::unique_ptr<values_st, DeleterFree<values_st>> values(
-      reinterpret_cast<values_st *>(OPENSSL_malloc(sizeof(values_st))));
-  if (values == NULL) {
+  auto values = bssl::MakeUnique<Values>();
+  if (values == nullptr) {
     return 0;
   }
 
@@ -1724,7 +1720,8 @@
 
   // Intermediate values, allocated on the heap to allow use when there is a
   // limited amount of stack.
-  struct values_st {
+  struct Values {
+    enum { kAllowUniquePtr = true };
     signature<K, L> sign;
     vector<L> s1_ntt;
     vector<K> s2_ntt;
@@ -1736,9 +1733,8 @@
     vector<L> cs1;
     vector<K> cs2;
   };
-  std::unique_ptr<values_st, DeleterFree<values_st>> values(
-      reinterpret_cast<values_st *>(OPENSSL_malloc(sizeof(values_st))));
-  if (values == NULL) {
+  auto values = bssl::MakeUnique<Values>();
+  if (values == nullptr) {
     return 0;
   }
   OPENSSL_memcpy(&values->s1_ntt, &priv->s1, sizeof(values->s1_ntt));
@@ -1920,16 +1916,16 @@
     const uint8_t *context, size_t context_len) {
   // Intermediate values, allocated on the heap to allow use when there is a
   // limited amount of stack.
-  struct values_st {
+  struct Values {
+    enum { kAllowUniquePtr = true };
     signature<K, L> sign;
     matrix<K, L> a_ntt;
     vector<L> z_ntt;
     vector<K> az_ntt;
     vector<K> ct1_ntt;
   };
-  std::unique_ptr<values_st, DeleterFree<values_st>> values(
-      reinterpret_cast<values_st *>(OPENSSL_malloc(sizeof(values_st))));
-  if (values == NULL) {
+  auto values = bssl::MakeUnique<Values>();
+  if (values == nullptr) {
     return 0;
   }
 
@@ -2150,14 +2146,14 @@
 }
 
 static int verify_self_test() {
-  struct values_st {
+  struct Values {
+    enum { kAllowUniquePtr = true };
     private_key<6, 5> priv;
     public_key<6> pub;
     uint8_t pub_bytes[MLDSA65_PUBLIC_KEY_BYTES];
   };
-  std::unique_ptr<values_st, DeleterFree<values_st>> values(
-      reinterpret_cast<values_st *>(OPENSSL_malloc(sizeof(values_st))));
-  if (!values) {
+  auto values = bssl::MakeUnique<Values>();
+  if (values == nullptr) {
     return 0;
   }