Add a helper function sk_FOO_last

Change-Id: Iff6e2fc9b209fb96f33af0e7ea86fe3ebba25b03
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/102850
Reviewed-by: Lily Chen <chlily@google.com>
Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: David Benjamin <davidben@google.com>
Commit-Queue: Lily Chen <chlily@google.com>
diff --git a/crypto/stack/stack.cc b/crypto/stack/stack.cc
index 1628c23..55ae25d 100644
--- a/crypto/stack/stack.cc
+++ b/crypto/stack/stack.cc
@@ -93,6 +93,13 @@
   return sk->data[i];
 }
 
+void *OPENSSL_sk_last(const OPENSSL_STACK *sk) {
+  if (!sk || sk->num == 0) {
+    return nullptr;
+  }
+  return sk->data[sk->num - 1];
+}
+
 void *OPENSSL_sk_set(OPENSSL_STACK *sk, size_t i, void *value) {
   if (!sk || i >= sk->num) {
     return nullptr;
diff --git a/crypto/stack/stack_test.cc b/crypto/stack/stack_test.cc
index 6b890d8..ade50c1 100644
--- a/crypto/stack/stack_test.cc
+++ b/crypto/stack/stack_test.cc
@@ -77,6 +77,14 @@
     }
   }
 
+  if (vec.empty()) {
+    EXPECT_EQ(sk_TEST_INT_last(sk), nullptr);
+  } else {
+    const TEST_INT *obj = sk_TEST_INT_last(sk);
+    ASSERT_TRUE(obj);
+    EXPECT_EQ(vec.back(), *obj);
+  }
+
   // Reading out-of-bounds fails.
   EXPECT_FALSE(sk_TEST_INT_value(sk, vec.size()));
   EXPECT_FALSE(sk_TEST_INT_value(sk, vec.size() + 1));
diff --git a/crypto/x509/x509_vfy.cc b/crypto/x509/x509_vfy.cc
index 9ec1d26..a1cb7f7 100644
--- a/crypto/x509/x509_vfy.cc
+++ b/crypto/x509/x509_vfy.cc
@@ -182,7 +182,7 @@
   // Maintain invariants: `num` is always the size of `ctx->chain` and `x` is
   // always the last element.
   int num = (int)sk_X509_num(ctx->chain);
-  X509 *x = sk_X509_value(ctx->chain, num - 1);
+  X509 *x = sk_X509_last(ctx->chain);
   // `param->depth` does not include the leaf certificate or the trust anchor,
   // so the maximum size is 2 more.
   int max_chain = param->depth >= INT_MAX - 2 ? INT_MAX : param->depth + 2;
@@ -331,8 +331,7 @@
       }
       num++;
       ctx->last_untrusted = num;
-      ctx->current_cert =
-          sk_X509_value(ctx->chain, sk_X509_num(ctx->chain) - 1);
+      ctx->current_cert = sk_X509_last(ctx->chain);
       ctx->error = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN;
     }
 
diff --git a/include/openssl/prefix_symbols.h b/include/openssl/prefix_symbols.h
index 8ae8d28..c691fc2 100644
--- a/include/openssl/prefix_symbols.h
+++ b/include/openssl/prefix_symbols.h
@@ -1558,6 +1558,7 @@
 #pragma redefine_extname OPENSSL_sk_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_free)
 #pragma redefine_extname OPENSSL_sk_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_insert)
 #pragma redefine_extname OPENSSL_sk_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_is_sorted)
+#pragma redefine_extname OPENSSL_sk_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_last)
 #pragma redefine_extname OPENSSL_sk_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_new)
 #pragma redefine_extname OPENSSL_sk_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_new_null)
 #pragma redefine_extname OPENSSL_sk_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_num)
@@ -4705,6 +4706,7 @@
 #define OPENSSL_sk_free BORINGSSL_ADD_PREFIX(OPENSSL_sk_free)
 #define OPENSSL_sk_insert BORINGSSL_ADD_PREFIX(OPENSSL_sk_insert)
 #define OPENSSL_sk_is_sorted BORINGSSL_ADD_PREFIX(OPENSSL_sk_is_sorted)
+#define OPENSSL_sk_last BORINGSSL_ADD_PREFIX(OPENSSL_sk_last)
 #define OPENSSL_sk_new BORINGSSL_ADD_PREFIX(OPENSSL_sk_new)
 #define OPENSSL_sk_new_null BORINGSSL_ADD_PREFIX(OPENSSL_sk_new_null)
 #define OPENSSL_sk_num BORINGSSL_ADD_PREFIX(OPENSSL_sk_num)
@@ -6355,6 +6357,7 @@
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_free)
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_insert)
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_is_sorted)
+#pragma redefine_extname sk_ACCESS_DESCRIPTION_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_last)
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_new)
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_new_null)
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_num)
@@ -6381,6 +6384,7 @@
 #pragma redefine_extname sk_ASN1_INTEGER_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_free)
 #pragma redefine_extname sk_ASN1_INTEGER_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_insert)
 #pragma redefine_extname sk_ASN1_INTEGER_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_is_sorted)
+#pragma redefine_extname sk_ASN1_INTEGER_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_last)
 #pragma redefine_extname sk_ASN1_INTEGER_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_new)
 #pragma redefine_extname sk_ASN1_INTEGER_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_new_null)
 #pragma redefine_extname sk_ASN1_INTEGER_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_num)
@@ -6407,6 +6411,7 @@
 #pragma redefine_extname sk_ASN1_OBJECT_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_free)
 #pragma redefine_extname sk_ASN1_OBJECT_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_insert)
 #pragma redefine_extname sk_ASN1_OBJECT_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_is_sorted)
+#pragma redefine_extname sk_ASN1_OBJECT_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_last)
 #pragma redefine_extname sk_ASN1_OBJECT_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_new)
 #pragma redefine_extname sk_ASN1_OBJECT_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_new_null)
 #pragma redefine_extname sk_ASN1_OBJECT_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_num)
@@ -6433,6 +6438,7 @@
 #pragma redefine_extname sk_ASN1_TYPE_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_free)
 #pragma redefine_extname sk_ASN1_TYPE_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_insert)
 #pragma redefine_extname sk_ASN1_TYPE_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_is_sorted)
+#pragma redefine_extname sk_ASN1_TYPE_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_last)
 #pragma redefine_extname sk_ASN1_TYPE_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_new)
 #pragma redefine_extname sk_ASN1_TYPE_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_new_null)
 #pragma redefine_extname sk_ASN1_TYPE_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_num)
@@ -6459,6 +6465,7 @@
 #pragma redefine_extname sk_ASN1_VALUE_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_free)
 #pragma redefine_extname sk_ASN1_VALUE_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_insert)
 #pragma redefine_extname sk_ASN1_VALUE_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_is_sorted)
+#pragma redefine_extname sk_ASN1_VALUE_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_last)
 #pragma redefine_extname sk_ASN1_VALUE_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_new)
 #pragma redefine_extname sk_ASN1_VALUE_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_new_null)
 #pragma redefine_extname sk_ASN1_VALUE_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_num)
@@ -6485,6 +6492,7 @@
 #pragma redefine_extname sk_BIO_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_free)
 #pragma redefine_extname sk_BIO_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_insert)
 #pragma redefine_extname sk_BIO_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_is_sorted)
+#pragma redefine_extname sk_BIO_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_last)
 #pragma redefine_extname sk_BIO_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_new)
 #pragma redefine_extname sk_BIO_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_new_null)
 #pragma redefine_extname sk_BIO_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_num)
@@ -6511,6 +6519,7 @@
 #pragma redefine_extname sk_CONF_VALUE_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_free)
 #pragma redefine_extname sk_CONF_VALUE_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_insert)
 #pragma redefine_extname sk_CONF_VALUE_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_is_sorted)
+#pragma redefine_extname sk_CONF_VALUE_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_last)
 #pragma redefine_extname sk_CONF_VALUE_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_new)
 #pragma redefine_extname sk_CONF_VALUE_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_new_null)
 #pragma redefine_extname sk_CONF_VALUE_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_num)
@@ -6537,6 +6546,7 @@
 #pragma redefine_extname sk_CRYPTO_BUFFER_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_free)
 #pragma redefine_extname sk_CRYPTO_BUFFER_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_insert)
 #pragma redefine_extname sk_CRYPTO_BUFFER_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_is_sorted)
+#pragma redefine_extname sk_CRYPTO_BUFFER_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_last)
 #pragma redefine_extname sk_CRYPTO_BUFFER_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_new)
 #pragma redefine_extname sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_new_null)
 #pragma redefine_extname sk_CRYPTO_BUFFER_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_num)
@@ -6563,6 +6573,7 @@
 #pragma redefine_extname sk_DIST_POINT_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_free)
 #pragma redefine_extname sk_DIST_POINT_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_insert)
 #pragma redefine_extname sk_DIST_POINT_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_is_sorted)
+#pragma redefine_extname sk_DIST_POINT_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_last)
 #pragma redefine_extname sk_DIST_POINT_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_new)
 #pragma redefine_extname sk_DIST_POINT_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_new_null)
 #pragma redefine_extname sk_DIST_POINT_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_num)
@@ -6589,6 +6600,7 @@
 #pragma redefine_extname sk_GENERAL_NAME_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_free)
 #pragma redefine_extname sk_GENERAL_NAME_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_insert)
 #pragma redefine_extname sk_GENERAL_NAME_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_is_sorted)
+#pragma redefine_extname sk_GENERAL_NAME_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_last)
 #pragma redefine_extname sk_GENERAL_NAME_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_new)
 #pragma redefine_extname sk_GENERAL_NAME_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_new_null)
 #pragma redefine_extname sk_GENERAL_NAME_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_num)
@@ -6615,6 +6627,7 @@
 #pragma redefine_extname sk_GENERAL_SUBTREE_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_free)
 #pragma redefine_extname sk_GENERAL_SUBTREE_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_insert)
 #pragma redefine_extname sk_GENERAL_SUBTREE_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_is_sorted)
+#pragma redefine_extname sk_GENERAL_SUBTREE_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_last)
 #pragma redefine_extname sk_GENERAL_SUBTREE_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_new)
 #pragma redefine_extname sk_GENERAL_SUBTREE_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_new_null)
 #pragma redefine_extname sk_GENERAL_SUBTREE_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_num)
@@ -6641,6 +6654,7 @@
 #pragma redefine_extname sk_OPENSSL_STRING_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_free)
 #pragma redefine_extname sk_OPENSSL_STRING_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_insert)
 #pragma redefine_extname sk_OPENSSL_STRING_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_is_sorted)
+#pragma redefine_extname sk_OPENSSL_STRING_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_last)
 #pragma redefine_extname sk_OPENSSL_STRING_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_new)
 #pragma redefine_extname sk_OPENSSL_STRING_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_new_null)
 #pragma redefine_extname sk_OPENSSL_STRING_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_num)
@@ -6667,6 +6681,7 @@
 #pragma redefine_extname sk_POLICYINFO_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_free)
 #pragma redefine_extname sk_POLICYINFO_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_insert)
 #pragma redefine_extname sk_POLICYINFO_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_is_sorted)
+#pragma redefine_extname sk_POLICYINFO_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_last)
 #pragma redefine_extname sk_POLICYINFO_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_new)
 #pragma redefine_extname sk_POLICYINFO_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_new_null)
 #pragma redefine_extname sk_POLICYINFO_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_num)
@@ -6693,6 +6708,7 @@
 #pragma redefine_extname sk_POLICYQUALINFO_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_free)
 #pragma redefine_extname sk_POLICYQUALINFO_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_insert)
 #pragma redefine_extname sk_POLICYQUALINFO_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_is_sorted)
+#pragma redefine_extname sk_POLICYQUALINFO_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_last)
 #pragma redefine_extname sk_POLICYQUALINFO_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_new)
 #pragma redefine_extname sk_POLICYQUALINFO_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_new_null)
 #pragma redefine_extname sk_POLICYQUALINFO_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_num)
@@ -6719,6 +6735,7 @@
 #pragma redefine_extname sk_POLICY_MAPPING_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_free)
 #pragma redefine_extname sk_POLICY_MAPPING_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_insert)
 #pragma redefine_extname sk_POLICY_MAPPING_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_is_sorted)
+#pragma redefine_extname sk_POLICY_MAPPING_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_last)
 #pragma redefine_extname sk_POLICY_MAPPING_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_new)
 #pragma redefine_extname sk_POLICY_MAPPING_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_new_null)
 #pragma redefine_extname sk_POLICY_MAPPING_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_num)
@@ -6745,6 +6762,7 @@
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_free)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_insert)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_is_sorted)
+#pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_last)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_new)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_new_null)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_num)
@@ -6771,6 +6789,7 @@
 #pragma redefine_extname sk_SSL_CIPHER_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_free)
 #pragma redefine_extname sk_SSL_CIPHER_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_insert)
 #pragma redefine_extname sk_SSL_CIPHER_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_is_sorted)
+#pragma redefine_extname sk_SSL_CIPHER_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_last)
 #pragma redefine_extname sk_SSL_CIPHER_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_new)
 #pragma redefine_extname sk_SSL_CIPHER_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_new_null)
 #pragma redefine_extname sk_SSL_CIPHER_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_num)
@@ -6797,6 +6816,7 @@
 #pragma redefine_extname sk_SSL_COMP_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_free)
 #pragma redefine_extname sk_SSL_COMP_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_insert)
 #pragma redefine_extname sk_SSL_COMP_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_is_sorted)
+#pragma redefine_extname sk_SSL_COMP_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_last)
 #pragma redefine_extname sk_SSL_COMP_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_new)
 #pragma redefine_extname sk_SSL_COMP_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_new_null)
 #pragma redefine_extname sk_SSL_COMP_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_num)
@@ -6823,6 +6843,7 @@
 #pragma redefine_extname sk_TRUST_TOKEN_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_free)
 #pragma redefine_extname sk_TRUST_TOKEN_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_insert)
 #pragma redefine_extname sk_TRUST_TOKEN_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_is_sorted)
+#pragma redefine_extname sk_TRUST_TOKEN_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_last)
 #pragma redefine_extname sk_TRUST_TOKEN_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_new)
 #pragma redefine_extname sk_TRUST_TOKEN_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_new_null)
 #pragma redefine_extname sk_TRUST_TOKEN_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_num)
@@ -6849,6 +6870,7 @@
 #pragma redefine_extname sk_X509_ALGOR_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_free)
 #pragma redefine_extname sk_X509_ALGOR_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_insert)
 #pragma redefine_extname sk_X509_ALGOR_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_is_sorted)
+#pragma redefine_extname sk_X509_ALGOR_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_last)
 #pragma redefine_extname sk_X509_ALGOR_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_new)
 #pragma redefine_extname sk_X509_ALGOR_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_new_null)
 #pragma redefine_extname sk_X509_ALGOR_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_num)
@@ -6875,6 +6897,7 @@
 #pragma redefine_extname sk_X509_ATTRIBUTE_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_free)
 #pragma redefine_extname sk_X509_ATTRIBUTE_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_insert)
 #pragma redefine_extname sk_X509_ATTRIBUTE_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_is_sorted)
+#pragma redefine_extname sk_X509_ATTRIBUTE_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_last)
 #pragma redefine_extname sk_X509_ATTRIBUTE_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_new)
 #pragma redefine_extname sk_X509_ATTRIBUTE_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_new_null)
 #pragma redefine_extname sk_X509_ATTRIBUTE_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_num)
@@ -6901,6 +6924,7 @@
 #pragma redefine_extname sk_X509_CRL_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_free)
 #pragma redefine_extname sk_X509_CRL_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_insert)
 #pragma redefine_extname sk_X509_CRL_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_is_sorted)
+#pragma redefine_extname sk_X509_CRL_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_last)
 #pragma redefine_extname sk_X509_CRL_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_new)
 #pragma redefine_extname sk_X509_CRL_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_new_null)
 #pragma redefine_extname sk_X509_CRL_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_num)
@@ -6927,6 +6951,7 @@
 #pragma redefine_extname sk_X509_EXTENSION_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_free)
 #pragma redefine_extname sk_X509_EXTENSION_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_insert)
 #pragma redefine_extname sk_X509_EXTENSION_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_is_sorted)
+#pragma redefine_extname sk_X509_EXTENSION_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_last)
 #pragma redefine_extname sk_X509_EXTENSION_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_new)
 #pragma redefine_extname sk_X509_EXTENSION_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_new_null)
 #pragma redefine_extname sk_X509_EXTENSION_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_num)
@@ -6953,6 +6978,7 @@
 #pragma redefine_extname sk_X509_INFO_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_free)
 #pragma redefine_extname sk_X509_INFO_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_insert)
 #pragma redefine_extname sk_X509_INFO_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_is_sorted)
+#pragma redefine_extname sk_X509_INFO_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_last)
 #pragma redefine_extname sk_X509_INFO_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_new)
 #pragma redefine_extname sk_X509_INFO_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_new_null)
 #pragma redefine_extname sk_X509_INFO_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_num)
@@ -6979,6 +7005,7 @@
 #pragma redefine_extname sk_X509_NAME_ENTRY_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_free)
 #pragma redefine_extname sk_X509_NAME_ENTRY_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_insert)
 #pragma redefine_extname sk_X509_NAME_ENTRY_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_is_sorted)
+#pragma redefine_extname sk_X509_NAME_ENTRY_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_last)
 #pragma redefine_extname sk_X509_NAME_ENTRY_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_new)
 #pragma redefine_extname sk_X509_NAME_ENTRY_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_new_null)
 #pragma redefine_extname sk_X509_NAME_ENTRY_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_num)
@@ -7005,6 +7032,7 @@
 #pragma redefine_extname sk_X509_NAME_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_free)
 #pragma redefine_extname sk_X509_NAME_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_insert)
 #pragma redefine_extname sk_X509_NAME_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_is_sorted)
+#pragma redefine_extname sk_X509_NAME_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_last)
 #pragma redefine_extname sk_X509_NAME_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_new)
 #pragma redefine_extname sk_X509_NAME_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_new_null)
 #pragma redefine_extname sk_X509_NAME_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_num)
@@ -7031,6 +7059,7 @@
 #pragma redefine_extname sk_X509_OBJECT_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_free)
 #pragma redefine_extname sk_X509_OBJECT_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_insert)
 #pragma redefine_extname sk_X509_OBJECT_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_is_sorted)
+#pragma redefine_extname sk_X509_OBJECT_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_last)
 #pragma redefine_extname sk_X509_OBJECT_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_new)
 #pragma redefine_extname sk_X509_OBJECT_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_new_null)
 #pragma redefine_extname sk_X509_OBJECT_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_num)
@@ -7057,6 +7086,7 @@
 #pragma redefine_extname sk_X509_REVOKED_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_free)
 #pragma redefine_extname sk_X509_REVOKED_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_insert)
 #pragma redefine_extname sk_X509_REVOKED_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_is_sorted)
+#pragma redefine_extname sk_X509_REVOKED_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_last)
 #pragma redefine_extname sk_X509_REVOKED_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_new)
 #pragma redefine_extname sk_X509_REVOKED_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_new_null)
 #pragma redefine_extname sk_X509_REVOKED_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_num)
@@ -7083,6 +7113,7 @@
 #pragma redefine_extname sk_X509_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_free)
 #pragma redefine_extname sk_X509_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_insert)
 #pragma redefine_extname sk_X509_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_is_sorted)
+#pragma redefine_extname sk_X509_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_last)
 #pragma redefine_extname sk_X509_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_new)
 #pragma redefine_extname sk_X509_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_new_null)
 #pragma redefine_extname sk_X509_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_num)
@@ -7109,6 +7140,7 @@
 #pragma redefine_extname sk_void_free BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_free)
 #pragma redefine_extname sk_void_insert BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_insert)
 #pragma redefine_extname sk_void_is_sorted BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_is_sorted)
+#pragma redefine_extname sk_void_last BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_last)
 #pragma redefine_extname sk_void_new BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_new)
 #pragma redefine_extname sk_void_new_null BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_new_null)
 #pragma redefine_extname sk_void_num BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_num)
@@ -7145,6 +7177,7 @@
 #define sk_ACCESS_DESCRIPTION_free BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_free)
 #define sk_ACCESS_DESCRIPTION_insert BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_insert)
 #define sk_ACCESS_DESCRIPTION_is_sorted BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_is_sorted)
+#define sk_ACCESS_DESCRIPTION_last BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_last)
 #define sk_ACCESS_DESCRIPTION_new BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_new)
 #define sk_ACCESS_DESCRIPTION_new_null BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_new_null)
 #define sk_ACCESS_DESCRIPTION_num BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_num)
@@ -7171,6 +7204,7 @@
 #define sk_ASN1_INTEGER_free BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_free)
 #define sk_ASN1_INTEGER_insert BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_insert)
 #define sk_ASN1_INTEGER_is_sorted BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_is_sorted)
+#define sk_ASN1_INTEGER_last BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_last)
 #define sk_ASN1_INTEGER_new BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_new)
 #define sk_ASN1_INTEGER_new_null BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_new_null)
 #define sk_ASN1_INTEGER_num BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_num)
@@ -7197,6 +7231,7 @@
 #define sk_ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_free)
 #define sk_ASN1_OBJECT_insert BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_insert)
 #define sk_ASN1_OBJECT_is_sorted BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_is_sorted)
+#define sk_ASN1_OBJECT_last BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_last)
 #define sk_ASN1_OBJECT_new BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_new)
 #define sk_ASN1_OBJECT_new_null BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_new_null)
 #define sk_ASN1_OBJECT_num BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_num)
@@ -7223,6 +7258,7 @@
 #define sk_ASN1_TYPE_free BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_free)
 #define sk_ASN1_TYPE_insert BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_insert)
 #define sk_ASN1_TYPE_is_sorted BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_is_sorted)
+#define sk_ASN1_TYPE_last BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_last)
 #define sk_ASN1_TYPE_new BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_new)
 #define sk_ASN1_TYPE_new_null BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_new_null)
 #define sk_ASN1_TYPE_num BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_num)
@@ -7249,6 +7285,7 @@
 #define sk_ASN1_VALUE_free BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_free)
 #define sk_ASN1_VALUE_insert BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_insert)
 #define sk_ASN1_VALUE_is_sorted BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_is_sorted)
+#define sk_ASN1_VALUE_last BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_last)
 #define sk_ASN1_VALUE_new BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_new)
 #define sk_ASN1_VALUE_new_null BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_new_null)
 #define sk_ASN1_VALUE_num BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_num)
@@ -7275,6 +7312,7 @@
 #define sk_BIO_free BORINGSSL_ADD_PREFIX(sk_BIO_free)
 #define sk_BIO_insert BORINGSSL_ADD_PREFIX(sk_BIO_insert)
 #define sk_BIO_is_sorted BORINGSSL_ADD_PREFIX(sk_BIO_is_sorted)
+#define sk_BIO_last BORINGSSL_ADD_PREFIX(sk_BIO_last)
 #define sk_BIO_new BORINGSSL_ADD_PREFIX(sk_BIO_new)
 #define sk_BIO_new_null BORINGSSL_ADD_PREFIX(sk_BIO_new_null)
 #define sk_BIO_num BORINGSSL_ADD_PREFIX(sk_BIO_num)
@@ -7301,6 +7339,7 @@
 #define sk_CONF_VALUE_free BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_free)
 #define sk_CONF_VALUE_insert BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_insert)
 #define sk_CONF_VALUE_is_sorted BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_is_sorted)
+#define sk_CONF_VALUE_last BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_last)
 #define sk_CONF_VALUE_new BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_new)
 #define sk_CONF_VALUE_new_null BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_new_null)
 #define sk_CONF_VALUE_num BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_num)
@@ -7327,6 +7366,7 @@
 #define sk_CRYPTO_BUFFER_free BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_free)
 #define sk_CRYPTO_BUFFER_insert BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_insert)
 #define sk_CRYPTO_BUFFER_is_sorted BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_is_sorted)
+#define sk_CRYPTO_BUFFER_last BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_last)
 #define sk_CRYPTO_BUFFER_new BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_new)
 #define sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_new_null)
 #define sk_CRYPTO_BUFFER_num BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_num)
@@ -7353,6 +7393,7 @@
 #define sk_DIST_POINT_free BORINGSSL_ADD_PREFIX(sk_DIST_POINT_free)
 #define sk_DIST_POINT_insert BORINGSSL_ADD_PREFIX(sk_DIST_POINT_insert)
 #define sk_DIST_POINT_is_sorted BORINGSSL_ADD_PREFIX(sk_DIST_POINT_is_sorted)
+#define sk_DIST_POINT_last BORINGSSL_ADD_PREFIX(sk_DIST_POINT_last)
 #define sk_DIST_POINT_new BORINGSSL_ADD_PREFIX(sk_DIST_POINT_new)
 #define sk_DIST_POINT_new_null BORINGSSL_ADD_PREFIX(sk_DIST_POINT_new_null)
 #define sk_DIST_POINT_num BORINGSSL_ADD_PREFIX(sk_DIST_POINT_num)
@@ -7379,6 +7420,7 @@
 #define sk_GENERAL_NAME_free BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_free)
 #define sk_GENERAL_NAME_insert BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_insert)
 #define sk_GENERAL_NAME_is_sorted BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_is_sorted)
+#define sk_GENERAL_NAME_last BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_last)
 #define sk_GENERAL_NAME_new BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_new)
 #define sk_GENERAL_NAME_new_null BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_new_null)
 #define sk_GENERAL_NAME_num BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_num)
@@ -7405,6 +7447,7 @@
 #define sk_GENERAL_SUBTREE_free BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_free)
 #define sk_GENERAL_SUBTREE_insert BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_insert)
 #define sk_GENERAL_SUBTREE_is_sorted BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_is_sorted)
+#define sk_GENERAL_SUBTREE_last BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_last)
 #define sk_GENERAL_SUBTREE_new BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_new)
 #define sk_GENERAL_SUBTREE_new_null BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_new_null)
 #define sk_GENERAL_SUBTREE_num BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_num)
@@ -7431,6 +7474,7 @@
 #define sk_OPENSSL_STRING_free BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_free)
 #define sk_OPENSSL_STRING_insert BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_insert)
 #define sk_OPENSSL_STRING_is_sorted BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_is_sorted)
+#define sk_OPENSSL_STRING_last BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_last)
 #define sk_OPENSSL_STRING_new BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_new)
 #define sk_OPENSSL_STRING_new_null BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_new_null)
 #define sk_OPENSSL_STRING_num BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_num)
@@ -7457,6 +7501,7 @@
 #define sk_POLICYINFO_free BORINGSSL_ADD_PREFIX(sk_POLICYINFO_free)
 #define sk_POLICYINFO_insert BORINGSSL_ADD_PREFIX(sk_POLICYINFO_insert)
 #define sk_POLICYINFO_is_sorted BORINGSSL_ADD_PREFIX(sk_POLICYINFO_is_sorted)
+#define sk_POLICYINFO_last BORINGSSL_ADD_PREFIX(sk_POLICYINFO_last)
 #define sk_POLICYINFO_new BORINGSSL_ADD_PREFIX(sk_POLICYINFO_new)
 #define sk_POLICYINFO_new_null BORINGSSL_ADD_PREFIX(sk_POLICYINFO_new_null)
 #define sk_POLICYINFO_num BORINGSSL_ADD_PREFIX(sk_POLICYINFO_num)
@@ -7483,6 +7528,7 @@
 #define sk_POLICYQUALINFO_free BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_free)
 #define sk_POLICYQUALINFO_insert BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_insert)
 #define sk_POLICYQUALINFO_is_sorted BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_is_sorted)
+#define sk_POLICYQUALINFO_last BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_last)
 #define sk_POLICYQUALINFO_new BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_new)
 #define sk_POLICYQUALINFO_new_null BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_new_null)
 #define sk_POLICYQUALINFO_num BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_num)
@@ -7509,6 +7555,7 @@
 #define sk_POLICY_MAPPING_free BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_free)
 #define sk_POLICY_MAPPING_insert BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_insert)
 #define sk_POLICY_MAPPING_is_sorted BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_is_sorted)
+#define sk_POLICY_MAPPING_last BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_last)
 #define sk_POLICY_MAPPING_new BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_new)
 #define sk_POLICY_MAPPING_new_null BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_new_null)
 #define sk_POLICY_MAPPING_num BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_num)
@@ -7535,6 +7582,7 @@
 #define sk_SRTP_PROTECTION_PROFILE_free BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_free)
 #define sk_SRTP_PROTECTION_PROFILE_insert BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_insert)
 #define sk_SRTP_PROTECTION_PROFILE_is_sorted BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_is_sorted)
+#define sk_SRTP_PROTECTION_PROFILE_last BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_last)
 #define sk_SRTP_PROTECTION_PROFILE_new BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_new)
 #define sk_SRTP_PROTECTION_PROFILE_new_null BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_new_null)
 #define sk_SRTP_PROTECTION_PROFILE_num BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_num)
@@ -7561,6 +7609,7 @@
 #define sk_SSL_CIPHER_free BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_free)
 #define sk_SSL_CIPHER_insert BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_insert)
 #define sk_SSL_CIPHER_is_sorted BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_is_sorted)
+#define sk_SSL_CIPHER_last BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_last)
 #define sk_SSL_CIPHER_new BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_new)
 #define sk_SSL_CIPHER_new_null BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_new_null)
 #define sk_SSL_CIPHER_num BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_num)
@@ -7587,6 +7636,7 @@
 #define sk_SSL_COMP_free BORINGSSL_ADD_PREFIX(sk_SSL_COMP_free)
 #define sk_SSL_COMP_insert BORINGSSL_ADD_PREFIX(sk_SSL_COMP_insert)
 #define sk_SSL_COMP_is_sorted BORINGSSL_ADD_PREFIX(sk_SSL_COMP_is_sorted)
+#define sk_SSL_COMP_last BORINGSSL_ADD_PREFIX(sk_SSL_COMP_last)
 #define sk_SSL_COMP_new BORINGSSL_ADD_PREFIX(sk_SSL_COMP_new)
 #define sk_SSL_COMP_new_null BORINGSSL_ADD_PREFIX(sk_SSL_COMP_new_null)
 #define sk_SSL_COMP_num BORINGSSL_ADD_PREFIX(sk_SSL_COMP_num)
@@ -7613,6 +7663,7 @@
 #define sk_TRUST_TOKEN_free BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_free)
 #define sk_TRUST_TOKEN_insert BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_insert)
 #define sk_TRUST_TOKEN_is_sorted BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_is_sorted)
+#define sk_TRUST_TOKEN_last BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_last)
 #define sk_TRUST_TOKEN_new BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_new)
 #define sk_TRUST_TOKEN_new_null BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_new_null)
 #define sk_TRUST_TOKEN_num BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_num)
@@ -7639,6 +7690,7 @@
 #define sk_X509_ALGOR_free BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_free)
 #define sk_X509_ALGOR_insert BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_insert)
 #define sk_X509_ALGOR_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_is_sorted)
+#define sk_X509_ALGOR_last BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_last)
 #define sk_X509_ALGOR_new BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_new)
 #define sk_X509_ALGOR_new_null BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_new_null)
 #define sk_X509_ALGOR_num BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_num)
@@ -7665,6 +7717,7 @@
 #define sk_X509_ATTRIBUTE_free BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_free)
 #define sk_X509_ATTRIBUTE_insert BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_insert)
 #define sk_X509_ATTRIBUTE_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_is_sorted)
+#define sk_X509_ATTRIBUTE_last BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_last)
 #define sk_X509_ATTRIBUTE_new BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_new)
 #define sk_X509_ATTRIBUTE_new_null BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_new_null)
 #define sk_X509_ATTRIBUTE_num BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_num)
@@ -7691,6 +7744,7 @@
 #define sk_X509_CRL_free BORINGSSL_ADD_PREFIX(sk_X509_CRL_free)
 #define sk_X509_CRL_insert BORINGSSL_ADD_PREFIX(sk_X509_CRL_insert)
 #define sk_X509_CRL_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_CRL_is_sorted)
+#define sk_X509_CRL_last BORINGSSL_ADD_PREFIX(sk_X509_CRL_last)
 #define sk_X509_CRL_new BORINGSSL_ADD_PREFIX(sk_X509_CRL_new)
 #define sk_X509_CRL_new_null BORINGSSL_ADD_PREFIX(sk_X509_CRL_new_null)
 #define sk_X509_CRL_num BORINGSSL_ADD_PREFIX(sk_X509_CRL_num)
@@ -7717,6 +7771,7 @@
 #define sk_X509_EXTENSION_free BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_free)
 #define sk_X509_EXTENSION_insert BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_insert)
 #define sk_X509_EXTENSION_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_is_sorted)
+#define sk_X509_EXTENSION_last BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_last)
 #define sk_X509_EXTENSION_new BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_new)
 #define sk_X509_EXTENSION_new_null BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_new_null)
 #define sk_X509_EXTENSION_num BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_num)
@@ -7743,6 +7798,7 @@
 #define sk_X509_INFO_free BORINGSSL_ADD_PREFIX(sk_X509_INFO_free)
 #define sk_X509_INFO_insert BORINGSSL_ADD_PREFIX(sk_X509_INFO_insert)
 #define sk_X509_INFO_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_INFO_is_sorted)
+#define sk_X509_INFO_last BORINGSSL_ADD_PREFIX(sk_X509_INFO_last)
 #define sk_X509_INFO_new BORINGSSL_ADD_PREFIX(sk_X509_INFO_new)
 #define sk_X509_INFO_new_null BORINGSSL_ADD_PREFIX(sk_X509_INFO_new_null)
 #define sk_X509_INFO_num BORINGSSL_ADD_PREFIX(sk_X509_INFO_num)
@@ -7769,6 +7825,7 @@
 #define sk_X509_NAME_ENTRY_free BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_free)
 #define sk_X509_NAME_ENTRY_insert BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_insert)
 #define sk_X509_NAME_ENTRY_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_is_sorted)
+#define sk_X509_NAME_ENTRY_last BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_last)
 #define sk_X509_NAME_ENTRY_new BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_new)
 #define sk_X509_NAME_ENTRY_new_null BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_new_null)
 #define sk_X509_NAME_ENTRY_num BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_num)
@@ -7795,6 +7852,7 @@
 #define sk_X509_NAME_free BORINGSSL_ADD_PREFIX(sk_X509_NAME_free)
 #define sk_X509_NAME_insert BORINGSSL_ADD_PREFIX(sk_X509_NAME_insert)
 #define sk_X509_NAME_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_NAME_is_sorted)
+#define sk_X509_NAME_last BORINGSSL_ADD_PREFIX(sk_X509_NAME_last)
 #define sk_X509_NAME_new BORINGSSL_ADD_PREFIX(sk_X509_NAME_new)
 #define sk_X509_NAME_new_null BORINGSSL_ADD_PREFIX(sk_X509_NAME_new_null)
 #define sk_X509_NAME_num BORINGSSL_ADD_PREFIX(sk_X509_NAME_num)
@@ -7821,6 +7879,7 @@
 #define sk_X509_OBJECT_free BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_free)
 #define sk_X509_OBJECT_insert BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_insert)
 #define sk_X509_OBJECT_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_is_sorted)
+#define sk_X509_OBJECT_last BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_last)
 #define sk_X509_OBJECT_new BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_new)
 #define sk_X509_OBJECT_new_null BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_new_null)
 #define sk_X509_OBJECT_num BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_num)
@@ -7847,6 +7906,7 @@
 #define sk_X509_REVOKED_free BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_free)
 #define sk_X509_REVOKED_insert BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_insert)
 #define sk_X509_REVOKED_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_is_sorted)
+#define sk_X509_REVOKED_last BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_last)
 #define sk_X509_REVOKED_new BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_new)
 #define sk_X509_REVOKED_new_null BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_new_null)
 #define sk_X509_REVOKED_num BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_num)
@@ -7873,6 +7933,7 @@
 #define sk_X509_free BORINGSSL_ADD_PREFIX(sk_X509_free)
 #define sk_X509_insert BORINGSSL_ADD_PREFIX(sk_X509_insert)
 #define sk_X509_is_sorted BORINGSSL_ADD_PREFIX(sk_X509_is_sorted)
+#define sk_X509_last BORINGSSL_ADD_PREFIX(sk_X509_last)
 #define sk_X509_new BORINGSSL_ADD_PREFIX(sk_X509_new)
 #define sk_X509_new_null BORINGSSL_ADD_PREFIX(sk_X509_new_null)
 #define sk_X509_num BORINGSSL_ADD_PREFIX(sk_X509_num)
@@ -7899,6 +7960,7 @@
 #define sk_void_free BORINGSSL_ADD_PREFIX(sk_void_free)
 #define sk_void_insert BORINGSSL_ADD_PREFIX(sk_void_insert)
 #define sk_void_is_sorted BORINGSSL_ADD_PREFIX(sk_void_is_sorted)
+#define sk_void_last BORINGSSL_ADD_PREFIX(sk_void_last)
 #define sk_void_new BORINGSSL_ADD_PREFIX(sk_void_new)
 #define sk_void_new_null BORINGSSL_ADD_PREFIX(sk_void_new_null)
 #define sk_void_num BORINGSSL_ADD_PREFIX(sk_void_num)
diff --git a/include/openssl/stack.h b/include/openssl/stack.h
index 18824d1..129aae0 100644
--- a/include/openssl/stack.h
+++ b/include/openssl/stack.h
@@ -128,6 +128,10 @@
 // returns NULL.
 SAMPLE *sk_SAMPLE_value(const STACK_OF(SAMPLE) *sk, size_t i);
 
+// sk_SAMPLE_last returns the last pointer in `sk`, or NULL if `sk` is empty. If
+// `sk` is NULL, it is treated as an empty list and the function returns NULL.
+SAMPLE *sk_SAMPLE_last(const STACK_OF(SAMPLE) *sk);
+
 // sk_SAMPLE_set sets the `i`th pointer in `sk` to `p` and returns `p`. If `i`
 // is out of range, it returns NULL.
 SAMPLE *sk_SAMPLE_set(STACK_OF(SAMPLE) *sk, size_t i, SAMPLE *p);
@@ -281,6 +285,7 @@
 OPENSSL_EXPORT size_t OPENSSL_sk_num(const OPENSSL_STACK *sk);
 OPENSSL_EXPORT void OPENSSL_sk_zero(OPENSSL_STACK *sk);
 OPENSSL_EXPORT void *OPENSSL_sk_value(const OPENSSL_STACK *sk, size_t i);
+OPENSSL_EXPORT void *OPENSSL_sk_last(const OPENSSL_STACK *sk);
 OPENSSL_EXPORT void *OPENSSL_sk_set(OPENSSL_STACK *sk, size_t i, void *p);
 OPENSSL_EXPORT void OPENSSL_sk_free(OPENSSL_STACK *sk);
 OPENSSL_EXPORT void OPENSSL_sk_pop_free_ex(
@@ -449,6 +454,10 @@
     return (ptrtype)OPENSSL_sk_value((const OPENSSL_STACK *)sk, i);            \
   }                                                                            \
                                                                                \
+  OPENSSL_INLINE ptrtype sk_##name##_last(const STACK_OF(name) *sk) {          \
+    return (ptrtype)OPENSSL_sk_last((const OPENSSL_STACK *)sk);                \
+  }                                                                            \
+                                                                               \
   OPENSSL_INLINE ptrtype sk_##name##_set(STACK_OF(name) *sk, size_t i,         \
                                          ptrtype p) {                          \
     return (ptrtype)OPENSSL_sk_set((OPENSSL_STACK *)sk, i, (void *)p);         \