diff --git a/src/post_modules/Nettle/configure.in b/src/post_modules/Nettle/configure.in index ea7d29718491cc28158ccaf104348bdb30cf8478..45b7f367eb57cab5676f0d673a6006ba0ded2498 100644 --- a/src/post_modules/Nettle/configure.in +++ b/src/post_modules/Nettle/configure.in @@ -56,29 +56,37 @@ else # NB: Some versions of RedHat have censored the weaker curves # (secp_192r1 and secp_224r1 (cf [LysLysKOM 21863021])), and # there are no identifying macros, so we need to probe for them. - define(PIKE_CHECK_ECC_CURVE, [ - AC_MSG_CHECKING(if curve $1 is available) - AC_CACHE_VAL(pike_cv_have_curve_$1, [ - AC_TRY_LINK([#include <nettle/ecc-curve.h>], - [ struct ecc_curve *c = &$1; ], - [ pike_cv_have_curve_$1=yes ], - [ pike_cv_have_curve_$1=no ]) + define(PIKE_CHECK_NETTLE_ECC_CURVE, [ + AC_CHECK_FUNC(nettle_get_$1, [ + AC_DEFINE(translit(HAVE_CURVE_NETTLE_$1,[a-z],[A-Z]), 1, + [Define if your libnettle has the nettle curve $1.]) + ], [ + AC_MSG_CHECKING(if legacy declaration of nettle curve $1 is available) + + AC_CACHE_VAL(pike_cv_have_curve_nettle_$1, [ + AC_TRY_LINK([#include <nettle/ecc-curve.h>], + [ struct ecc_curve *c = &nettle_$1; ], + [ pike_cv_have_curve_nettle_$1=yes ], + [ pike_cv_have_curve_nettle_$1=no ]) + ]) + AC_MSG_RESULT($pike_cv_have_curve_nettle_$1); + if test "x$pike_cv_have_curve_nettle_$1" = "xyes"; then + AC_DEFINE(translit(HAVE_CURVE_NETTLE_$1,[a-z],[A-Z]), 1, + [Define if your libnettle has the nettle curve $1.]) + AC_DEFINE(translit(NEED_WRAPPER_FOR_CURVE_NETTLE_$1,[a-z],[A-Z]), 1, + [Define if your libnettle is missing the getter for the nettle curve $1.]) + fi ]) - AC_MSG_RESULT($pike_cv_have_curve_$1); - if test "x$pike_cv_have_curve_$1" = "xyes"; then - AC_DEFINE(translit(HAVE_CURVE_$1,[a-z],[A-Z]), 1, - [Define if your libnettle has the curve $1.]) - fi ]) AC_ARG_WITH(weak-curves, [ --with-weak-curves Include SECP192R1 and SECP224R1, frequently removed from Nettle binary dists], [weak_curves=yes], []) if test "x$weak_curves" = "xyes" ; then - PIKE_CHECK_ECC_CURVE(nettle_secp_192r1) - PIKE_CHECK_ECC_CURVE(nettle_secp_224r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_192r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_224r1) fi - PIKE_CHECK_ECC_CURVE(nettle_secp_256r1) - PIKE_CHECK_ECC_CURVE(nettle_secp_384r1) - PIKE_CHECK_ECC_CURVE(nettle_secp_521r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_256r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_384r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_521r1) AC_SUBST(IDEA_OBJ) diff --git a/src/post_modules/Nettle/hogweed.cmod b/src/post_modules/Nettle/hogweed.cmod index 40eb88ac47364ce22ea49d7f6ff8a4ee792a876a..e9231090ebf10272968d2e689bda955bdf45c968 100644 --- a/src/post_modules/Nettle/hogweed.cmod +++ b/src/post_modules/Nettle/hogweed.cmod @@ -339,6 +339,22 @@ program_flags PROGRAM_CLEAR_STORAGE; #define SECP384R1 3 #define SECP521R1 4 +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_192R1 +static const struct ecc_curve *nettle_get_secp_192r1(void) { return nettle_secp_192r1; } +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_192R1 */ +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_224R1 +static const struct ecc_curve *nettle_get_secp_224r1(void) { return nettle_secp_224r1; } +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_224R1 */ +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_256R1 +static const struct ecc_curve *nettle_get_secp_256r1(void) { return nettle_secp_256r1; } +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_256R1 */ +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_384R1 +static const struct ecc_curve *nettle_get_secp_384r1(void) { return nettle_secp_384r1; } +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_384R1 */ +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_521R1 +static const struct ecc_curve *nettle_get_secp_521r1(void) { return nettle_secp_521r1; } +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_521R1 */ + #ifndef ecc_point_equal_p static int ecc_point_equal_p(const struct ecc_point *a, const struct ecc_point *b) { @@ -396,19 +412,19 @@ PIKECLASS ECC_Curve switch(curve) { #ifdef HAVE_CURVE_NETTLE_SECP_192R1 - case SECP192R1: THIS->curve = &nettle_secp_192r1; break; + case SECP192R1: THIS->curve = nettle_get_secp_192r1(); break; #endif /* HAVE_CURVE_NETTLE_SECP_192R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_224R1 - case SECP224R1: THIS->curve = &nettle_secp_224r1; break; + case SECP224R1: THIS->curve = nettle_get_secp_224r1(); break; #endif /* HAVE_CURVE_NETTLE_SECP_224R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_256R1 - case SECP256R1: THIS->curve = &nettle_secp_256r1; break; + case SECP256R1: THIS->curve = nettle_get_secp_256r1(); break; #endif /* HAVE_CURVE_NETTLE_SECP_256R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_384R1 - case SECP384R1: THIS->curve = &nettle_secp_384r1; break; + case SECP384R1: THIS->curve = nettle_get_secp_384r1(); break; #endif /* HAVE_CURVE_NETTLE_SECP_384R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_521R1 - case SECP521R1: THIS->curve = &nettle_secp_521r1; break; + case SECP521R1: THIS->curve = nettle_get_secp_521r1(); break; #endif /* HAVE_CURVE_NETTLE_SECP_521R1 */ default: Pike_error("Invalid curve\n"); @@ -479,31 +495,31 @@ PIKECLASS ECC_Curve PIKEFUN string(7bit) name() { #ifdef HAVE_CURVE_NETTLE_SECP_192R1 - if (THIS->curve == &nettle_secp_192r1) { + if (THIS->curve == nettle_get_secp_192r1()) { ref_push_string(MK_STRING("SECP_192R1")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_192R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_224R1 - if (THIS->curve == &nettle_secp_224r1) { + if (THIS->curve == nettle_get_secp_224r1()) { ref_push_string(MK_STRING("SECP_224R1")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_224R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_256R1 - if (THIS->curve == &nettle_secp_256r1) { + if (THIS->curve == nettle_get_secp_256r1()) { ref_push_string(MK_STRING("SECP_256R1")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_256R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_384R1 - if (THIS->curve == &nettle_secp_384r1) { + if (THIS->curve == nettle_get_secp_384r1()) { ref_push_string(MK_STRING("SECP_384R1")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_384R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_521R1 - if (THIS->curve == &nettle_secp_521r1) { + if (THIS->curve == nettle_get_secp_521r1()) { ref_push_string(MK_STRING("SECP_521R1")); return; } @@ -526,19 +542,19 @@ PIKECLASS ECC_Curve PIKEFUN string(7bit) jose_name() { #ifdef HAVE_CURVE_NETTLE_SECP_256R1 - if (THIS->curve == &nettle_secp_256r1) { + if (THIS->curve == nettle_get_secp_256r1()) { ref_push_string(MK_STRING("P-256")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_256R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_384R1 - if (THIS->curve == &nettle_secp_384r1) { + if (THIS->curve == nettle_get_secp_384r1()) { ref_push_string(MK_STRING("P-384")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_384R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_521R1 - if (THIS->curve == &nettle_secp_521r1) { + if (THIS->curve == nettle_get_secp_521r1()) { ref_push_string(MK_STRING("P-521")); return; } @@ -558,31 +574,31 @@ PIKECLASS ECC_Curve #else do { #ifdef HAVE_CURVE_NETTLE_SECP_192R1 - if (THIS->curve == &nettle_secp_192r1) { + if (THIS->curve == nettle_get_secp_192r1()) { push_int(192); break; } #endif /* HAVE_CURVE_NETTLE_SECP_192R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_224R1 - if (THIS->curve == &nettle_secp_224r1) { + if (THIS->curve == nettle_get_secp_224r1()) { push_int(224); break; } #endif /* HAVE_CURVE_NETTLE_SECP_224R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_256R1 - if (THIS->curve == &nettle_secp_256r1) { + if (THIS->curve == nettle_get_secp_256r1()) { push_int(256); break; } #endif /* HAVE_CURVE_NETTLE_SECP_256R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_384R1 - if (THIS->curve == &nettle_secp_384r1) { + if (THIS->curve == nettle_get_secp_384r1()) { push_int(384); break; } #endif /* HAVE_CURVE_NETTLE_SECP_384R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_521R1 - if (THIS->curve == &nettle_secp_521r1) { + if (THIS->curve == nettle_get_secp_521r1()) { push_int(521); break; }