diff options
author | Matt Caswell <matt@openssl.org> | 2020-02-04 16:41:19 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2020-02-11 22:32:56 +0000 |
commit | 97b50f67f212589661c9f1edd5285822c6cc642b (patch) | |
tree | ffe238b1b99a2e5fc40d4ae76dbff5b9f9f95f22 /providers | |
parent | 6f7d213533d9c7c2d810499cfedaa6d2424482c9 (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.info | 12 | ||||
-rw-r--r-- | providers/implementations/exchange/ecx_exch.c | 23 |
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; |