<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/fd259e6117af72e16caa5c8e85b4aa5ad3d532ca">https://github.com/macports/macports-ports/commit/fd259e6117af72e16caa5c8e85b4aa5ad3d532ca</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit fd259e6117af72e16caa5c8e85b4aa5ad3d532ca
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Thu Mar 23 11:34:59 2023 +0100

<span style='display:block; white-space:pre;color:#404040;'>    openssl3: Fix CVE-2023-0464, lldb break on aarch64
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    See https://www.openssl.org/news/secadv/20230322.txt for the advisory
</span><span style='display:block; white-space:pre;color:#404040;'>    for the CVE.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also backports a patch for CPU feature detection on macOS from master so
</span><span style='display:block; white-space:pre;color:#404040;'>    it no longer relies on signal handling of SIGILL after attempting to
</span><span style='display:block; white-space:pre;color:#404040;'>    perform the possibly unsuported assembly instruction, because that
</span><span style='display:block; white-space:pre;color:#404040;'>    signal will stop lldb on macOS regardless of whether a handler exists,
</span><span style='display:block; white-space:pre;color:#404040;'>    which leads to an unexpected debugging experience. This change includes
</span><span style='display:block; white-space:pre;color:#404040;'>    enabling CPU optimizations for M2 Macs.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    No revbump of the openssl port or other dependent ports, because these
</span><span style='display:block; white-space:pre;color:#404040;'>    are entirely internal changes and neither the names of installed files
</span><span style='display:block; white-space:pre;color:#404040;'>    nor their ABI changes.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    CVE: CVE-2023-0464
</span><span style='display:block; white-space:pre;color:#404040;'>    Fixes: https://trac.macports.org/ticket/67122
</span>---
 devel/openssl3/Portfile                            |   7 +-
 .../2017771e2db3e2b96f89bbe8766c3209f6a99545.patch | 220 ++++++++
 .../52a38144b019cfda6b0e5eaa0aca88ae11661a26.patch | 558 +++++++++++++++++++++
 .../d79bb5316e1318bd776d6b2d6723a36778e07f9d.patch |  36 ++
 4 files changed, 819 insertions(+), 2 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/openssl3/Portfile b/devel/openssl3/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index eff300e5634..381543c884e 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/openssl3/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/openssl3/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -11,7 +11,7 @@ legacysupport.newest_darwin_requires_legacy 8
</span> set major_v         3
 name                openssl$major_v
 version             ${major_v}.1.0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision            0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision            1
</span> 
 # Please revbump these ports when updating the openssl3 version/revision
 #  - freeradius (#43461)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -52,7 +52,10 @@ checksums           rmd160  203ebe676bbdde1a869fc14c6c4e21983ce4b810 \
</span>                     size    15525381
 
 patchfiles          avx512.patch \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    patch-openssl3-ppc-asm.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    patch-openssl3-ppc-asm.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    2017771e2db3e2b96f89bbe8766c3209f6a99545.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    d79bb5316e1318bd776d6b2d6723a36778e07f9d.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    52a38144b019cfda6b0e5eaa0aca88ae11661a26.patch
</span> 
 if {${os.platform} eq "darwin" && ${os.major} < 11} {
     # Having the stdlib set to libc++ on 10.6 causes a dependency on a
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/openssl3/files/2017771e2db3e2b96f89bbe8766c3209f6a99545.patch b/devel/openssl3/files/2017771e2db3e2b96f89bbe8766c3209f6a99545.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..2065476e958
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/openssl3/files/2017771e2db3e2b96f89bbe8766c3209f6a99545.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,220 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 2017771e2db3e2b96f89bbe8766c3209f6a99545 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Pauli <pauli@openssl.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 8 Mar 2023 15:28:20 +1100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] x509: excessive resource use verifying policy constraints
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+A security vulnerability has been identified in all supported versions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+of OpenSSL related to the verification of X.509 certificate chains
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+that include policy constraints.  Attackers may be able to exploit this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+vulnerability by creating a malicious certificate chain that triggers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+exponential use of computational resources, leading to a denial-of-service
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+(DoS) attack on affected systems.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Fixes CVE-2023-0464
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Tomas Mraz <tomas@openssl.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+(Merged from https://github.com/openssl/openssl/pull/20570)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Upstream-Status: Backport [https://github.com/openssl/openssl/commit/2017771e2db3e2b96f89bbe8766c3209f6a99545]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto/x509/pcy_local.h |  8 +++++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto/x509/pcy_node.c  | 12 +++++++++---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto/x509/pcy_tree.c  | 36 ++++++++++++++++++++++++++----------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 3 files changed, 42 insertions(+), 14 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/crypto/x509/pcy_local.h b/crypto/x509/pcy_local.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 18b53cc09ebf..cba107ca0358 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./crypto/x509/pcy_local.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./crypto/x509/pcy_local.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -111,6 +111,11 @@ struct X509_POLICY_LEVEL_st {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct X509_POLICY_TREE_st {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* The number of nodes in the tree */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t node_count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* The maximum number of nodes in the tree */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t node_maximum;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* This is the tree 'level' data */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     X509_POLICY_LEVEL *levels;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int nlevel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -157,7 +162,8 @@ X509_POLICY_NODE *ossl_policy_tree_find_sk(STACK_OF(X509_POLICY_NODE) *sk,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ X509_POLICY_NODE *ossl_policy_level_add_node(X509_POLICY_LEVEL *level,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                              X509_POLICY_DATA *data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                              X509_POLICY_NODE *parent,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                             X509_POLICY_TREE *tree);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             X509_POLICY_TREE *tree,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             int extra_data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void ossl_policy_node_free(X509_POLICY_NODE *node);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ossl_policy_node_match(const X509_POLICY_LEVEL *lvl,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            const X509_POLICY_NODE *node, const ASN1_OBJECT *oid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/crypto/x509/pcy_node.c b/crypto/x509/pcy_node.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 9d9a7ea1799c..450f95a655fb 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./crypto/x509/pcy_node.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./crypto/x509/pcy_node.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -59,10 +59,15 @@ X509_POLICY_NODE *ossl_policy_level_find_node(const X509_POLICY_LEVEL *level,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ X509_POLICY_NODE *ossl_policy_level_add_node(X509_POLICY_LEVEL *level,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                              X509_POLICY_DATA *data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                              X509_POLICY_NODE *parent,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                             X509_POLICY_TREE *tree)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             X509_POLICY_TREE *tree,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             int extra_data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     X509_POLICY_NODE *node;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Verify that the tree isn't too large.  This mitigates CVE-2023-0464 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (tree->node_maximum > 0 && tree->node_count >= tree->node_maximum)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     node = OPENSSL_zalloc(sizeof(*node));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (node == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -70,7 +75,7 @@ X509_POLICY_NODE *ossl_policy_level_add_node(X509_POLICY_LEVEL *level,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     node->data = data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     node->parent = parent;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (level) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (level != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (level->anyPolicy)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 goto node_error;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -90,7 +95,7 @@ X509_POLICY_NODE *ossl_policy_level_add_node(X509_POLICY_LEVEL *level,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (tree) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (extra_data) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (tree->extra_data == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             tree->extra_data = sk_X509_POLICY_DATA_new_null();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (tree->extra_data == NULL){
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -103,6 +108,7 @@ X509_POLICY_NODE *ossl_policy_level_add_node(X509_POLICY_LEVEL *level,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    tree->node_count++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (parent)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         parent->nchild++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/crypto/x509/pcy_tree.c b/crypto/x509/pcy_tree.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index fa45da5117a1..f953a05a41a6 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./crypto/x509/pcy_tree.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./crypto/x509/pcy_tree.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -14,6 +14,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "pcy_local.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * If the maximum number of nodes in the policy tree isn't defined, set it to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * a generous default of 1000 nodes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Defining this to be zero means unlimited policy tree growth which opens the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * door on CVE-2023-0464.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef OPENSSL_POLICY_TREE_NODES_MAX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# define OPENSSL_POLICY_TREE_NODES_MAX 1000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void expected_print(BIO *channel,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            X509_POLICY_LEVEL *lev, X509_POLICY_NODE *node,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            int indent)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -163,6 +174,9 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return X509_PCY_TREE_INTERNAL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Limit the growth of the tree to mitigate CVE-2023-0464 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    tree->node_maximum = OPENSSL_POLICY_TREE_NODES_MAX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * http://tools.ietf.org/html/rfc5280#section-6.1.2, figure 3.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -180,7 +194,7 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ((data = ossl_policy_data_new(NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                      OBJ_nid2obj(NID_any_policy), 0)) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         goto bad_tree;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (ossl_policy_level_add_node(level, data, NULL, tree) == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (ossl_policy_level_add_node(level, data, NULL, tree, 1) == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         ossl_policy_data_free(data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         goto bad_tree;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -239,7 +253,8 @@ static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * Return value: 1 on success, 0 otherwise
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                    X509_POLICY_DATA *data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                    X509_POLICY_DATA *data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                    X509_POLICY_TREE *tree)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     X509_POLICY_LEVEL *last = curr - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int i, matched = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -249,13 +264,13 @@ static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(last->nodes, i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (ossl_policy_node_match(last, node, data->valid_policy)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if (ossl_policy_level_add_node(curr, data, node, NULL) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (ossl_policy_level_add_node(curr, data, node, tree, 0) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             matched = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!matched && last->anyPolicy) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (ossl_policy_level_add_node(curr, data, last->anyPolicy, NULL) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (ossl_policy_level_add_node(curr, data, last->anyPolicy, tree, 0) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -268,7 +283,8 @@ static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * Return value: 1 on success, 0 otherwise.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int tree_link_nodes(X509_POLICY_LEVEL *curr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           const X509_POLICY_CACHE *cache)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           const X509_POLICY_CACHE *cache,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           X509_POLICY_TREE *tree)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -276,7 +292,7 @@ static int tree_link_nodes(X509_POLICY_LEVEL *curr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         X509_POLICY_DATA *data = sk_X509_POLICY_DATA_value(cache->data, i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         /* Look for matching nodes in previous level */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (!tree_link_matching_nodes(curr, data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!tree_link_matching_nodes(curr, data, tree))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -307,7 +323,7 @@ static int tree_add_unmatched(X509_POLICY_LEVEL *curr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Curr may not have anyPolicy */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     data->qualifier_set = cache->anyPolicy->qualifier_set;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (ossl_policy_level_add_node(curr, data, node, tree) == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (ossl_policy_level_add_node(curr, data, node, tree, 1) == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         ossl_policy_data_free(data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -370,7 +386,7 @@ static int tree_link_any(X509_POLICY_LEVEL *curr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Finally add link to anyPolicy */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (last->anyPolicy &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             ossl_policy_level_add_node(curr, cache->anyPolicy,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                       last->anyPolicy, NULL) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                       last->anyPolicy, tree, 0) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -553,7 +569,7 @@ static int tree_calculate_user_set(X509_POLICY_TREE *tree,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             extra->flags = POLICY_DATA_FLAG_SHARED_QUALIFIERS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 | POLICY_DATA_FLAG_EXTRA_NODE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             node = ossl_policy_level_add_node(NULL, extra, anyPolicy->parent,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                              tree);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                              tree, 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (!tree->user_policies) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             tree->user_policies = sk_X509_POLICY_NODE_new_null();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -580,7 +596,7 @@ static int tree_evaluate(X509_POLICY_TREE *tree)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for (i = 1; i < tree->nlevel; i++, curr++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         cache = ossl_policy_cache_set(curr->cert);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (!tree_link_nodes(curr, cache))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!tree_link_nodes(curr, cache, tree))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return X509_PCY_TREE_INTERNAL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY)
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/openssl3/files/52a38144b019cfda6b0e5eaa0aca88ae11661a26.patch b/devel/openssl3/files/52a38144b019cfda6b0e5eaa0aca88ae11661a26.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..9de08f5622e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/openssl3/files/52a38144b019cfda6b0e5eaa0aca88ae11661a26.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,558 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 52a38144b019cfda6b0e5eaa0aca88ae11661a26 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Tom Cosgrove <tom.cosgrove@arm.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 12 Feb 2023 20:26:23 +0000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Tidy up aarch64 feature detection code in armcap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Make the SIGILL-based code easier to read, and don't use it on Apple Silicon.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Also fix "error: 'HWCAP(2)_*' macro redefined" warnings on FreeBSD.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Fixes #20188
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Change-Id: I5618bbe9444cc40cb5705c6ccbdc331c16bab794
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Tomas Mraz <tomas@openssl.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Paul Dale <pauli@openssl.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+(Merged from https://github.com/openssl/openssl/pull/20305)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Upstream-Status: Backport [https://github.com/openssl/openssl/commit/52a38144b019cfda6b0e5eaa0aca88ae11661a26]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto/armcap.c | 401 +++++++++++++++++++++++++-----------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 208 insertions(+), 193 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/crypto/armcap.c b/crypto/armcap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 01b3b32534f2..03bc659bdbd2 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./crypto/armcap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./crypto/armcap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Copyright 2011-2022 The OpenSSL Project Authors. All Rights Reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright 2011-2023 The OpenSSL Project Authors. All Rights Reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * Licensed under the Apache License 2.0 (the "License").  You may not use
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * this file except in compliance with the License.  You can obtain a copy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -10,17 +10,18 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#include <setjmp.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#include <signal.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <openssl/crypto.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <sys/sysctl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <setjmp.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <signal.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "internal/cryptlib.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifndef _WIN32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef _WIN32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <windows.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "arm_arch.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -46,7 +47,7 @@ uint32_t OPENSSL_rdtsc(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#elif __ARM_MAX_ARCH__<7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif __ARM_MAX_ARCH__ < 7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void OPENSSL_cpuid_setup(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -55,73 +56,11 @@ uint32_t OPENSSL_rdtsc(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static sigset_t all_masked;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static sigjmp_buf ill_jmp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static void ill_handler(int sig)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    siglongjmp(ill_jmp, sig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Following subroutines could have been inlined, but it's not all
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * ARM compilers support inline assembler...
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv7_neon_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_aes_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_sha1_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_sha256_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_pmull_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# ifdef __aarch64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_sm3_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_sm4_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_eor3_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_sha512_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-unsigned int _armv8_cpuid_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_sve_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_sve2_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void _armv8_rng_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-size_t OPENSSL_rndr_asm(unsigned char *buf, size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-size_t OPENSSL_rndrrs_asm(unsigned char *buf, size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-size_t OPENSSL_rndr_bytes(unsigned char *buf, size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-size_t OPENSSL_rndrrs_bytes(unsigned char *buf, size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static size_t OPENSSL_rndr_wrapper(size_t (*func)(unsigned char *, size_t), unsigned char *buf, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    size_t buffer_size = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for (i = 0; i < 8; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        buffer_size = func(buf, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (buffer_size == len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        usleep(5000);  /* 5000 microseconds (5 milliseconds) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return buffer_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else /* !_WIN32 && __ARM_MAX_ARCH__ >= 7 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-size_t OPENSSL_rndr_bytes(unsigned char *buf, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return OPENSSL_rndr_wrapper(OPENSSL_rndr_asm, buf, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* 3 ways of handling things here: __APPLE__,  getauxval() or SIGILL detect */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-size_t OPENSSL_rndrrs_bytes(unsigned char *buf, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return OPENSSL_rndr_wrapper(OPENSSL_rndrrs_asm, buf, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-uint32_t _armv7_tick(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-uint32_t OPENSSL_rdtsc(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (OPENSSL_armcap_P & ARMV7_TICK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return _armv7_tick();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* First determine if getauxval() is available (OSSL_IMPLEMENT_GETAUXVAL) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # if defined(__GNUC__) && __GNUC__>=2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void OPENSSL_cpuid_setup(void) __attribute__ ((constructor));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -161,10 +100,10 @@ static unsigned long getauxval(unsigned long key)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * Android: according to https://developer.android.com/ndk/guides/cpu-features,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * getauxval is supported starting with API level 18
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  if defined(__ANDROID__) && defined(__ANDROID_API__) && __ANDROID_API__ >= 18
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#   include <sys/auxv.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#   define OSSL_IMPLEMENT_GETAUXVAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# if defined(__ANDROID__) && defined(__ANDROID_API__) && __ANDROID_API__ >= 18
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  include <sys/auxv.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_IMPLEMENT_GETAUXVAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * ARM puts the feature bits for Crypto Extensions in AT_HWCAP2, whereas
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -177,40 +116,144 @@ static unsigned long getauxval(unsigned long key)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  define AT_HWCAP2              26
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # if defined(__arm__) || defined (__arm)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP                  AT_HWCAP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_NEON             (1 << 12)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE               AT_HWCAP2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_AES           (1 << 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_PMULL         (1 << 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_SHA1          (1 << 2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_SHA256        (1 << 3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP                  AT_HWCAP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_NEON             (1 << 12)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE               AT_HWCAP2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_AES           (1 << 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_PMULL         (1 << 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_SHA1          (1 << 2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_SHA256        (1 << 3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # elif defined(__aarch64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP                  AT_HWCAP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_NEON             (1 << 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE               HWCAP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_AES           (1 << 3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_PMULL         (1 << 4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_SHA1          (1 << 5)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_SHA256        (1 << 6)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CPUID            (1 << 11)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_SHA3             (1 << 17)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_SM3           (1 << 18)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_SM4           (1 << 19)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_CE_SHA512        (1 << 21)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP_SVE              (1 << 22)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                  /* AT_HWCAP2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP2                 26
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP2_SVE2            (1 << 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  define HWCAP2_RNG             (1 << 16)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP                  AT_HWCAP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_NEON             (1 << 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE               AT_HWCAP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_AES           (1 << 3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_PMULL         (1 << 4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_SHA1          (1 << 5)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_SHA256        (1 << 6)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CPUID            (1 << 11)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_SHA3             (1 << 17)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_SM3           (1 << 18)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_SM4           (1 << 19)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_CE_SHA512        (1 << 21)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP_SVE              (1 << 22)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                      /* AT_HWCAP2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP2                 26
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP2_SVE2            (1 << 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define OSSL_HWCAP2_RNG             (1 << 16)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++uint32_t _armv7_tick(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++uint32_t OPENSSL_rdtsc(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (OPENSSL_armcap_P & ARMV7_TICK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return _armv7_tick();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# ifdef __aarch64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t OPENSSL_rndr_asm(unsigned char *buf, size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t OPENSSL_rndrrs_asm(unsigned char *buf, size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t OPENSSL_rndr_bytes(unsigned char *buf, size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t OPENSSL_rndrrs_bytes(unsigned char *buf, size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static size_t OPENSSL_rndr_wrapper(size_t (*func)(unsigned char *, size_t), unsigned char *buf, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t buffer_size = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (i = 0; i < 8; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        buffer_size = func(buf, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (buffer_size == len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        usleep(5000);  /* 5000 microseconds (5 milliseconds) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return buffer_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t OPENSSL_rndr_bytes(unsigned char *buf, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return OPENSSL_rndr_wrapper(OPENSSL_rndr_asm, buf, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++size_t OPENSSL_rndrrs_bytes(unsigned char *buf, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return OPENSSL_rndr_wrapper(OPENSSL_rndrrs_asm, buf, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# if !defined(__APPLE__) && !defined(OSSL_IMPLEMENT_GETAUXVAL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static sigset_t all_masked;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static sigjmp_buf ill_jmp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void ill_handler(int sig)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    siglongjmp(ill_jmp, sig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Following subroutines could have been inlined, but not all
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ARM compilers support inline assembler, and we'd then have to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * worry about the compiler optimising out the detection code...
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv7_neon_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_aes_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_sha1_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_sha256_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_pmull_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  ifdef __aarch64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_sm3_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_sm4_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_sha512_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_eor3_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_sve_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_sve2_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void _armv8_rng_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# endif /* !__APPLE__ && !OSSL_IMPLEMENT_GETAUXVAL */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* We only call _armv8_cpuid_probe() if (OPENSSL_armcap_P & ARMV8_CPUID) != 0 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++unsigned int _armv8_cpuid_probe(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# if defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Checks the specified integer sysctl, returning `value` if it's 1, otherwise returning 0.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static unsigned int sysctl_query(const char *name, unsigned int value)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int sys_value = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t len = sizeof(sys_value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return (sysctlbyname(name, &sys_value, &len, NULL, 0) == 0 && sys_value == 1) ? value : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# elif !defined(OSSL_IMPLEMENT_GETAUXVAL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Calls a provided probe function, which may SIGILL. If it doesn't, return `value`, otherwise return 0.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static unsigned int arm_probe_for(void (*probe)(void), volatile unsigned int value)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* The probe function gave us SIGILL */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void OPENSSL_cpuid_setup(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     const char *e;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# if !defined(__APPLE__) && !defined(OSSL_IMPLEMENT_GETAUXVAL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     struct sigaction ill_oact, ill_act;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     sigset_t oset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     static int trigger = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (trigger)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -225,7 +268,7 @@ void OPENSSL_cpuid_setup(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # if defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#   if !defined(__aarch64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  if !defined(__aarch64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * Capability probing by catching SIGILL appears to be problematic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * on iOS. But since Apple universe is "monocultural", it's actually
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -235,78 +278,82 @@ void OPENSSL_cpuid_setup(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         OPENSSL_armcap_P = ARMV7_NEON;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * One could do same even for __aarch64__ iOS builds. It's not done
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * exclusively for reasons of keeping code unified across platforms.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * Unified code works because it never triggers SIGILL on Apple
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * devices...
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        unsigned int feature;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        size_t len = sizeof(feature);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        char uarch[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (sysctlbyname("hw.optional.armv8_2_sha512", &feature, &len, NULL, 0) == 0 && feature == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_SHA512;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        feature = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (sysctlbyname("hw.optional.armv8_2_sha3", &feature, &len, NULL, 0) == 0 && feature == 1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_SHA3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            len = sizeof(uarch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * From
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * https://github.com/llvm/llvm-project/blob/412237dcd07e5a2afbb1767858262a5f037149a3/llvm/lib/Target/AArch64/AArch64.td#L719
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * all of these have been available on 64-bit Apple Silicon from the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * beginning (the A7).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= ARMV7_NEON | ARMV8_PMULL | ARMV8_AES | ARMV8_SHA1 | ARMV8_SHA256;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* More recent extensions are indicated by sysctls */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= sysctl_query("hw.optional.armv8_2_sha512", ARMV8_SHA512);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= sysctl_query("hw.optional.armv8_2_sha3", ARMV8_SHA3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (OPENSSL_armcap_P & ARMV8_SHA3) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            char uarch[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            size_t len = sizeof(uarch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if ((sysctlbyname("machdep.cpu.brand_string", uarch, &len, NULL, 0) == 0) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ((strncmp(uarch, "Apple M1", 8) == 0) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                (strncmp(uarch, "Apple M2", 8) == 0)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                (strncmp(uarch, "Apple M2", 8) == 0))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 OPENSSL_armcap_P |= ARMV8_UNROLL8_EOR3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#   endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  endif       /* __aarch64__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# elif defined(OSSL_IMPLEMENT_GETAUXVAL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# ifdef OSSL_IMPLEMENT_GETAUXVAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (getauxval(HWCAP) & HWCAP_NEON) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        unsigned long hwcap = getauxval(HWCAP_CE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (getauxval(OSSL_HWCAP) & OSSL_HWCAP_NEON) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        unsigned long hwcap = getauxval(OSSL_HWCAP_CE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         OPENSSL_armcap_P |= ARMV7_NEON;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (hwcap & HWCAP_CE_AES)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (hwcap & OSSL_HWCAP_CE_AES)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_AES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (hwcap & HWCAP_CE_PMULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (hwcap & OSSL_HWCAP_CE_PMULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_PMULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (hwcap & HWCAP_CE_SHA1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (hwcap & OSSL_HWCAP_CE_SHA1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_SHA1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (hwcap & HWCAP_CE_SHA256)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (hwcap & OSSL_HWCAP_CE_SHA256)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_SHA256;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  ifdef __aarch64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (hwcap & HWCAP_CE_SM4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (hwcap & OSSL_HWCAP_CE_SM4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_SM4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (hwcap & HWCAP_CE_SHA512)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (hwcap & OSSL_HWCAP_CE_SHA512)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_SHA512;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (hwcap & HWCAP_CPUID)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (hwcap & OSSL_HWCAP_CPUID)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_CPUID;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (hwcap & HWCAP_CE_SM3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (hwcap & OSSL_HWCAP_CE_SM3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_SM3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (hwcap & HWCAP_SHA3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (hwcap & OSSL_HWCAP_SHA3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_SHA3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  ifdef __aarch64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (getauxval(HWCAP) & HWCAP_SVE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (getauxval(OSSL_HWCAP) & OSSL_HWCAP_SVE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_SVE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (getauxval(HWCAP2) & HWCAP2_SVE2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (getauxval(OSSL_HWCAP2) & OSSL_HWCAP2_SVE2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_SVE2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (getauxval(HWCAP2) & HWCAP2_RNG)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (getauxval(OSSL_HWCAP2) & OSSL_HWCAP2_RNG)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_RNG;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# else /* !__APPLE__ && !OSSL_IMPLEMENT_GETAUXVAL */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* If all else fails, do brute force SIGILL-based feature detection */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     sigfillset(&all_masked);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     sigdelset(&all_masked, SIGILL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -322,74 +369,42 @@ void OPENSSL_cpuid_setup(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     sigaction(SIGILL, &ill_act, &ill_oact);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* If we used getauxval, we already have all the values */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# ifndef OSSL_IMPLEMENT_GETAUXVAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        _armv7_neon_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        OPENSSL_armcap_P |= ARMV7_NEON;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            _armv8_pmull_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_PMULL | ARMV8_AES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        } else if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            _armv8_aes_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_AES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            _armv8_sha1_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_SHA1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            _armv8_sha256_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_SHA256;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  if defined(__aarch64__) && !defined(__APPLE__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            _armv8_sm4_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_SM4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    OPENSSL_armcap_P |= arm_probe_for(_armv7_neon_probe, ARMV7_NEON);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            _armv8_sha512_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_SHA512;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (OPENSSL_armcap_P & ARMV7_NEON) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            _armv8_sm3_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_SM3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= arm_probe_for(_armv8_pmull_probe, ARMV8_PMULL | ARMV8_AES);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!(OPENSSL_armcap_P & ARMV8_AES)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            OPENSSL_armcap_P |= arm_probe_for(_armv8_aes_probe, ARMV8_AES);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            _armv8_eor3_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            OPENSSL_armcap_P |= ARMV8_SHA3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  ifdef __aarch64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        _armv8_sve_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        OPENSSL_armcap_P |= ARMV8_SVE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        _armv8_sve2_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        OPENSSL_armcap_P |= ARMV8_SVE2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= arm_probe_for(_armv8_sha1_probe, ARMV8_SHA1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= arm_probe_for(_armv8_sha256_probe, ARMV8_SHA256);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (sigsetjmp(ill_jmp, 1) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        _armv8_rng_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        OPENSSL_armcap_P |= ARMV8_RNG;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  if defined(__aarch64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= arm_probe_for(_armv8_sm3_probe, ARMV8_SM3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= arm_probe_for(_armv8_sm4_probe, ARMV8_SM4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= arm_probe_for(_armv8_sha512_probe, ARMV8_SHA512);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        OPENSSL_armcap_P |= arm_probe_for(_armv8_eor3_probe, ARMV8_SHA3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  ifdef __aarch64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    OPENSSL_armcap_P |= arm_probe_for(_armv8_sve_probe, ARMV8_SVE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    OPENSSL_armcap_P |= arm_probe_for(_armv8_sve2_probe, ARMV8_SVE2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    OPENSSL_armcap_P |= arm_probe_for(_armv8_rng_probe, ARMV8_RNG);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * Probing for ARMV7_TICK is known to produce unreliable results,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * so we will only use the feature when the user explicitly enables
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * it with OPENSSL_armcap.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * so we only use the feature when the user explicitly enables it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * with OPENSSL_armcap.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     sigaction(SIGILL, &ill_oact, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     sigprocmask(SIG_SETMASK, &oset, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# endif /* __APPLE__, OSSL_IMPLEMENT_GETAUXVAL */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # ifdef __aarch64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (OPENSSL_armcap_P & ARMV8_CPUID)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         OPENSSL_arm_midr = _armv8_cpuid_probe();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -406,4 +421,4 @@ void OPENSSL_cpuid_setup(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         OPENSSL_armcap_P |= ARMV8_UNROLL8_EOR3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _WIN32, __ARM_MAX_ARCH__ >= 7 */
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/openssl3/files/d79bb5316e1318bd776d6b2d6723a36778e07f9d.patch b/devel/openssl3/files/d79bb5316e1318bd776d6b2d6723a36778e07f9d.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..69fa255c9fd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/openssl3/files/d79bb5316e1318bd776d6b2d6723a36778e07f9d.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,36 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 44a62980d836d3e2b8e66244ef1fc3f72aac57b1 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Tom Cosgrove <tom.cosgrove@arm.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 25 Jan 2023 19:34:25 +0000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 1/2] Enable AES optimisation on Apple Silicon M2-based systems
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Gives a performance enhancement of 16-38%, similar to the M1.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Tomas Mraz <tomas@openssl.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Hugo Landau <hlandau@openssl.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Paul Dale <pauli@openssl.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+(Merged from https://github.com/openssl/openssl/pull/20141)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+(cherry picked from commit d79bb5316e1318bd776d6b2d6723a36778e07f9d)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Upstream-Status: Backport [d79bb5316e1318bd776d6b2d6723a36778e07f9d]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ crypto/armcap.c | 3 ++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 2 insertions(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/crypto/armcap.c b/crypto/armcap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 71296786c3..68f735baec 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./crypto/armcap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./crypto/armcap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -254,7 +254,8 @@ void OPENSSL_cpuid_setup(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             OPENSSL_armcap_P |= ARMV8_SHA3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             len = sizeof(uarch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if ((sysctlbyname("machdep.cpu.brand_string", uarch, &len, NULL, 0) == 0) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                (strncmp(uarch, "Apple M1", 8) == 0))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               ((strncmp(uarch, "Apple M1", 8) == 0) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                (strncmp(uarch, "Apple M2", 8) == 0)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 OPENSSL_armcap_P |= ARMV8_UNROLL8_EOR3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.40.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>

</pre>