summaryrefslogtreecommitdiffstats
path: root/providers
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2020-02-04 16:41:19 +0000
committerMatt Caswell <matt@openssl.org>2020-02-11 22:32:56 +0000
commit97b50f67f212589661c9f1edd5285822c6cc642b (patch)
treeffe238b1b99a2e5fc40d4ae76dbff5b9f9f95f22 /providers
parent6f7d213533d9c7c2d810499cfedaa6d2424482c9 (diff)
Add S390 support for provider based X25519/X448
Reviewed-by: Patrick Steuer <patrick.steuer@de.ibm.com> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/10964)
Diffstat (limited to 'providers')
-rw-r--r--providers/implementations/exchange/build.info12
-rw-r--r--providers/implementations/exchange/ecx_exch.c23
2 files changed, 35 insertions, 0 deletions
diff --git a/providers/implementations/exchange/build.info b/providers/implementations/exchange/build.info
index 0c2b98631b..c74e122844 100644
--- a/providers/implementations/exchange/build.info
+++ b/providers/implementations/exchange/build.info
@@ -8,4 +8,16 @@ IF[{- !$disabled{dh} -}]
SOURCE[$DH_GOAL]=dh_exch.c
ENDIF
+IF[{- !$disabled{asm} -}]
+ $ECDEF_s390x=S390X_EC_ASM
+
+ # Now that we have defined all the arch specific variables, use the
+ # appropriate one, and define the appropriate macros
+ IF[$ECASM_{- $target{asm_arch} -}]
+ $ECDEF=$ECDEF_{- $target{asm_arch} -}
+ ENDIF
+ENDIF
+
+
SOURCE[$ECX_GOAL]=ecx_exch.c
+DEFINE[$ECX_GOAL]=$ECDEF
diff --git a/providers/implementations/exchange/ecx_exch.c b/providers/implementations/exchange/ecx_exch.c
index b7d1d9e395..ea12628937 100644
--- a/providers/implementations/exchange/ecx_exch.c
+++ b/providers/implementations/exchange/ecx_exch.c
@@ -16,6 +16,9 @@
#include "crypto/ecx.h"
#include "prov/implementations.h"
#include "prov/providercommonerr.h"
+#ifdef S390X_EC_ASM
+# include "s390x_arch.h"
+#endif
static OSSL_OP_keyexch_newctx_fn x25519_newctx;
static OSSL_OP_keyexch_newctx_fn x448_newctx;
@@ -126,11 +129,31 @@ static int ecx_derive(void *vecxctx, unsigned char *secret, size_t *secretlen,
}
if (ecxctx->keylen == X25519_KEYLEN) {
+#ifdef S390X_EC_ASM
+ if (OPENSSL_s390xcap_P.pcc[1]
+ & S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X25519)) {
+ if (s390x_x25519_mul(secret, ecxctx->peerkey->pubkey,
+ ecxctx->key->privkey) == 0) {
+ ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_DURING_DERIVATION);
+ return 0;
+ }
+ } else
+#endif
if (X25519(secret, ecxctx->key->privkey, ecxctx->peerkey->pubkey) == 0) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_DURING_DERIVATION);
return 0;
}
} else {
+#ifdef S390X_EC_ASM
+ if (OPENSSL_s390xcap_P.pcc[1]
+ & S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X448)) {
+ if (s390x_x448_mul(secret, ecxctx->peerkey->pubkey,
+ ecxctx->key->privkey) == 0) {
+ ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_DURING_DERIVATION);
+ return 0;
+ }
+ } else
+#endif
if (X448(secret, ecxctx->key->privkey, ecxctx->peerkey->pubkey) == 0) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_DURING_DERIVATION);
return 0;