diff --git a/Changes b/Changes index faf5c33..f5c1a98 100644 --- a/Changes +++ b/Changes @@ -1,4 +1,9 @@ Changes for CryptX + +0.064 2019-06-14 + - fix #50 libtommath patch - building on HP-UX 11.11 / PA-RISC + - necessary XS adaptation to the latest libtommath + - bundled libtomcrypt update branch:develop (commit:c600d81e 2019-06-09) 0.063 2018-11-28 - proper patch for #46 (related to Math::BigInt::LTM) diff --git a/CryptX.xs b/CryptX.xs index 2495a3b..0e0bb19 100644 --- a/CryptX.xs +++ b/CryptX.xs @@ -403,7 +403,7 @@ mp_int mpi; if (in == NULL) XSRETURN_UNDEF; - if (mp_init(&mpi) != CRYPT_OK) XSRETURN_UNDEF; + if (mp_init(&mpi) != MP_OKAY) XSRETURN_UNDEF; if (strlen(in) == 0) { RETVAL = newSVpvn("", 0); } @@ -417,7 +417,10 @@ SvPOK_only(RETVAL); SvCUR_set(RETVAL, len); out_data = (unsigned char *)SvPVX(RETVAL); - mp_to_unsigned_bin(&mpi, out_data); + if (mp_to_unsigned_bin(&mpi, out_data) != MP_OKAY) { + SvREFCNT_dec(RETVAL); + RETVAL = newSVpvn(NULL, 0); /* undef */ + } } } else { @@ -437,30 +440,39 @@ char *out_data; mp_int mpi, tmp; mp_digit d; + mp_err merr; int digits = 0; if (!SvPOK(in) || radix < 2 || radix > 64) XSRETURN_UNDEF; in_data = (unsigned char *) SvPVbyte(in, len); - mp_init_multi(&mpi, &tmp, NULL); + if (mp_init_multi(&mpi, &tmp, NULL) != MP_OKAY) XSRETURN_UNDEF; if (len == 0) { RETVAL = newSVpvn("", 0); } else { if (mp_read_unsigned_bin(&mpi, in_data, (unsigned long)len) == CRYPT_OK) { - mp_copy(&mpi, &tmp); - while (mp_iszero(&tmp) == MP_NO) { - mp_div_d(&tmp, (mp_digit)radix, &tmp, &d); + merr = mp_copy(&mpi, &tmp); + while (merr == MP_OKAY && mp_iszero(&tmp) == MP_NO) { + merr = mp_div_d(&tmp, (mp_digit)radix, &tmp, &d); digits++; } - if (digits == 0) { + if (merr != MP_OKAY) { + RETVAL = newSVpvn(NULL, 0); /* undef */ + } + else if (digits == 0) { RETVAL = newSVpvn("", 0); } else { RETVAL = NEWSV(0, digits + 2); /* +2 for sign and NUL byte */ SvPOK_only(RETVAL); out_data = SvPVX(RETVAL); - mp_toradix(&mpi, out_data, radix); - SvCUR_set(RETVAL, strlen(out_data)); + if (mp_toradix(&mpi, out_data, radix) == MP_OKAY) { + SvCUR_set(RETVAL, strlen(out_data)); + } + else { + SvREFCNT_dec(RETVAL); + RETVAL = newSVpvn(NULL, 0); /* undef */ + } } } else { diff --git a/MANIFEST b/MANIFEST index 365391b..15c29b5 100644 --- a/MANIFEST +++ b/MANIFEST @@ -457,6 +457,7 @@ src/ltc/pk/asn1/oid/pk_oid_cmp.c src/ltc/pk/asn1/oid/pk_oid_str.c src/ltc/pk/asn1/pkcs8/pkcs8_decode_flexi.c +src/ltc/pk/asn1/x509/x509_decode_public_key_from_certificate.c src/ltc/pk/asn1/x509/x509_decode_subject_public_key_info.c src/ltc/pk/asn1/x509/x509_encode_subject_public_key_info.c src/ltc/pk/dh/dh.c @@ -616,6 +617,7 @@ src/ltm/bn_mp_fread.c src/ltm/bn_mp_fwrite.c src/ltm/bn_mp_gcd.c +src/ltm/bn_mp_get_bit.c src/ltm/bn_mp_get_int.c src/ltm/bn_mp_get_long.c src/ltm/bn_mp_grow.c @@ -632,6 +634,7 @@ src/ltm/bn_mp_jacobi.c src/ltm/bn_mp_karatsuba_mul.c src/ltm/bn_mp_karatsuba_sqr.c +src/ltm/bn_mp_kronecker.c src/ltm/bn_mp_lcm.c src/ltm/bn_mp_lshd.c src/ltm/bn_mp_mod.c @@ -650,12 +653,14 @@ src/ltm/bn_mp_neg.c src/ltm/bn_mp_or.c src/ltm/bn_mp_prime_fermat.c +src/ltm/bn_mp_prime_frobenius_underwood.c src/ltm/bn_mp_prime_is_divisible.c src/ltm/bn_mp_prime_is_prime.c src/ltm/bn_mp_prime_miller_rabin.c src/ltm/bn_mp_prime_next_prime.c src/ltm/bn_mp_prime_rabin_miller_trials.c src/ltm/bn_mp_prime_random_ex.c +src/ltm/bn_mp_prime_strong_lucas_selfridge.c src/ltm/bn_mp_radix_size.c src/ltm/bn_mp_radix_smap.c src/ltm/bn_mp_rand.c diff --git a/META.json b/META.json index 5a87162..6745e1f 100644 --- a/META.json +++ b/META.json @@ -45,6 +45,6 @@ "url" : "https://github.com/DCIT/perl-CryptX" } }, - "version" : "0.063", + "version" : "0.064", "x_serialization_backend" : "JSON::PP version 2.94" } diff --git a/META.yml b/META.yml index b1c73fc..9f3ef55 100644 --- a/META.yml +++ b/META.yml @@ -22,5 +22,5 @@ resources: bugtracker: https://github.com/DCIT/perl-CryptX/issues repository: https://github.com/DCIT/perl-CryptX -version: '0.063' +version: '0.064' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' diff --git a/inc/CryptX_BigInt_LTM.xs.inc b/inc/CryptX_BigInt_LTM.xs.inc index aaa3a6a..488513b 100644 --- a/inc/CryptX_BigInt_LTM.xs.inc +++ b/inc/CryptX_BigInt_LTM.xs.inc @@ -7,15 +7,35 @@ Math::BigInt::LTM _new(Class, SV *x) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); +#ifdef BN_MP_SET_INT_C if ((SvUOK(x) || SvIOK(x)) && (sizeof(UV) <= sizeof(unsigned long) || SvUV(x) == (unsigned long)SvUV(x))) { mp_set_int(RETVAL, (unsigned long)SvUV(x)); } - else { - mp_read_radix(RETVAL, SvPV_nolen(x), 10); - } +#elif IVSIZE == 8 + if (SvUOK(x)) { + mp_set_u64(RETVAL, (unsigned long long)SvUV(x)); + } + else if (SvIOK(x)) { + mp_set_i64(RETVAL, (long long)SvIV(x)); + } +#else + if (SvUOK(x)) { + mp_set_u32(RETVAL, (unsigned int)SvUV(x)); + } + else if (SvIOK(x)) { + mp_set_i32(RETVAL, (int)SvIV(x)); + } +#endif + else { + /* fallback - read the decimal number from string */ + merr = mp_read_radix(RETVAL, SvPV_nolen(x), 10); + } + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -25,13 +45,15 @@ Math::BigInt::LTM _from_bin(Class, SV *x) PREINIT: + mp_err merr; char *str, *start; CODE: Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + merr = mp_init(RETVAL); str = SvPV_nolen(x); start = (strlen(str)>2 && str[0] == '0' && str[1] == 'b') ? str+2 : str; - mp_read_radix(RETVAL, start, 2); + merr = mp_read_radix(RETVAL, start, 2); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -41,13 +63,15 @@ Math::BigInt::LTM _from_hex(Class, SV *x) PREINIT: + mp_err merr; char *str, *start; CODE: Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + merr = mp_init(RETVAL); str = SvPV_nolen(x); start = (strlen(str)>2 && str[0] == '0' && str[1] == 'x') ? str+2 : str; - mp_read_radix(RETVAL, start, 16); + merr = mp_read_radix(RETVAL, start, 16); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -56,10 +80,13 @@ Math::BigInt::LTM _from_oct(Class, SV *x) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); - mp_read_radix(RETVAL, SvPV_nolen(x), 8); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); + merr = mp_read_radix(RETVAL, SvPV_nolen(x), 8); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -68,10 +95,13 @@ Math::BigInt::LTM _from_base(Class, SV *x, int base) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); - mp_read_radix(RETVAL, SvPV_nolen(x), base); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); + merr = mp_read_radix(RETVAL, SvPV_nolen(x), base); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -81,13 +111,15 @@ Math::BigInt::LTM _from_bytes(Class, SV *x) PREINIT: + mp_err merr; STRLEN buf_len; unsigned char *buf_ptr; CODE: Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + merr = mp_init(RETVAL); buf_ptr = (unsigned char *)SvPVbyte(x, buf_len); - mp_read_unsigned_bin(RETVAL, buf_ptr, buf_len); + merr = mp_read_unsigned_bin(RETVAL, buf_ptr, buf_len); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -96,18 +128,46 @@ void _set(Class, Math::BigInt::LTM n, SV *x) - CODE: - mp_set_int(n, (unsigned long)SvIV(x)); + PREINIT: + mp_err merr; + CODE: +#ifdef BN_MP_SET_INT_C + if ((SvUOK(x) || SvIOK(x)) && (sizeof(UV) <= sizeof(unsigned long) || SvUV(x) == (unsigned long)SvUV(x))) { + mp_set_int(n, (unsigned long)SvIV(x)); + } +#elif IVSIZE == 8 + if (SvUOK(x)) { + mp_set_u64(n, (unsigned long long)SvUV(x)); + } + else if (SvIOK(x)) { + mp_set_i64(n, (long long)SvIV(x)); + } +#else + if (SvUOK(x)) { + mp_set_u32(n, (unsigned int)SvUV(x)); + } + else if (SvIOK(x)) { + mp_set_i32(n, (int)SvIV(x)); + } +#endif + else { + /* fallback - read the decimal number from string */ + merr = mp_read_radix(n, SvPV_nolen(x), 10); + PERL_UNUSED_VAR(merr); + } ############################################################################## # _zero() Math::BigInt::LTM _zero(Class) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); - mp_set_int(RETVAL, 0); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); + mp_zero(RETVAL); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -116,10 +176,17 @@ Math::BigInt::LTM _one(Class) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); +#ifdef BN_MP_SET_INT_C mp_set_int(RETVAL, 1); +#else + mp_set_u32(RETVAL, 1); +#endif + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -128,10 +195,17 @@ Math::BigInt::LTM _two(Class) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); +#ifdef BN_MP_SET_INT_C mp_set_int(RETVAL, 2); +#else + mp_set_u32(RETVAL, 2); +#endif + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -140,10 +214,17 @@ Math::BigInt::LTM _ten(Class) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); +#ifdef BN_MP_SET_INT_C mp_set_int(RETVAL, 10); +#else + mp_set_u32(RETVAL, 10); +#endif + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -152,11 +233,18 @@ Math::BigInt::LTM _1ex(Class, int x) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); +#ifdef BN_MP_SET_INT_C mp_set_int(RETVAL, 10); - mp_expt_d(RETVAL, x, RETVAL); +#else + mp_set_u32(RETVAL, 10); +#endif + merr = mp_expt_d(RETVAL, x, RETVAL); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -177,6 +265,7 @@ SV * _str(Class, Math::BigInt::LTM n) PREINIT: + mp_err merr; int len; char *buf; CODE: @@ -186,10 +275,11 @@ else { len = mp_count_bits(n) / 3 + 3; /* decimal_size ~ (binary_size/3 + 1) +1 for sign +1 for NUL-byte */ Newz(0, buf, len, char); - mp_toradix_n(n, buf, 10, len); + merr = mp_toradix_n(n, buf, 10, len); RETVAL = newSVpv(buf, 0); Safefree(buf); } + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -199,6 +289,7 @@ int _len(Class, Math::BigInt::LTM n) PREINIT: + mp_err merr; int len; char *buf; CODE: @@ -208,10 +299,11 @@ else { len = mp_count_bits(n) / 3 + 3; /* decimal_size ~ (binary_size/3 + 1) +1 for sign +1 for NUL-byte */ Newz(0, buf, len, char); - mp_toradix_n(n, buf, 10, len); + merr = mp_toradix_n(n, buf, 10, len); RETVAL = (int)strlen(buf); Safefree(buf); } + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -240,6 +332,7 @@ int _zeros(Class, Math::BigInt::LTM n) PREINIT: + mp_err merr; int len; char *buf; CODE: @@ -249,7 +342,7 @@ else { len = mp_count_bits(n) / 3 + 3; /* decimal_size ~ (binary_size/3 + 1) +1 for sign +1 for NUL-byte */ Newz(0, buf, len, char); - mp_toradix_n(n, buf, 10, len); + merr = mp_toradix_n(n, buf, 10, len); len = (int)strlen(buf); RETVAL = 0; while (len > 0) { @@ -259,6 +352,7 @@ } Safefree(buf); } + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -268,6 +362,7 @@ SV * _to_hex(Class, Math::BigInt::LTM n) PREINIT: + mp_err merr; int i, len; char *buf; CODE: @@ -275,9 +370,10 @@ RETVAL = newSV(len); SvPOK_on(RETVAL); buf = SvPVX(RETVAL); - mp_tohex(n, buf); + merr = mp_toradix(n, buf, 16); /* to hex */ for (i=0; i0; i++) buf[i] = toLOWER(buf[i]); SvCUR_set(RETVAL, strlen(buf)); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -287,6 +383,7 @@ SV * _to_bin(Class, Math::BigInt::LTM n) PREINIT: + mp_err merr; int len; char *buf; CODE: @@ -294,8 +391,9 @@ RETVAL = newSV(len); SvPOK_on(RETVAL); buf = SvPVX(RETVAL); - mp_tobinary(n, buf); + merr = mp_toradix(n, buf, 2); /* to binary */ SvCUR_set(RETVAL, strlen(buf)); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -305,6 +403,7 @@ SV * _to_oct(Class, Math::BigInt::LTM n) PREINIT: + mp_err merr; int len; char *buf; CODE: @@ -312,8 +411,9 @@ RETVAL = newSV(len); SvPOK_on(RETVAL); buf = SvPVX(RETVAL); - mp_tooctal(n, buf); + merr = mp_toradix(n, buf, 8); /* to octal */ SvCUR_set(RETVAL, strlen(buf)); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -323,6 +423,7 @@ SV * _to_base(Class, Math::BigInt::LTM n, int base) PREINIT: + mp_err merr; int len; char *buf; CODE: @@ -331,13 +432,14 @@ SvPOK_on(RETVAL); buf = SvPVX(RETVAL); if (len > 0) { - mp_toradix_n(n, buf, base, len); + merr = mp_toradix_n(n, buf, base, len); SvCUR_set(RETVAL, strlen(buf)); } else { buf[0] = '0'; SvCUR_set(RETVAL, 1); } + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -350,6 +452,7 @@ ALIAS: _as_bytes = 1 PREINIT: + mp_err merr; int len; unsigned char *buf; CODE: @@ -359,13 +462,14 @@ SvPOK_on(RETVAL); buf = (unsigned char*)SvPVX(RETVAL); if (len > 0) { - mp_to_unsigned_bin(n, buf); + merr = mp_to_unsigned_bin(n, buf); SvCUR_set(RETVAL, len); } else { buf[0] = 0; SvCUR_set(RETVAL, 1); } + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -374,15 +478,18 @@ Math::BigInt::LTM _modpow(Class, Math::BigInt::LTM n, Math::BigInt::LTM exp, Math::BigInt::LTM mod) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); if (mp_cmp_d(mod, 1) == MP_EQ) { - mp_set_int(RETVAL, 0); - } - else { - mp_exptmod(n, exp, mod, RETVAL); - } + mp_zero(RETVAL); + } + else { + merr = mp_exptmod(n, exp, mod, RETVAL); + } + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -392,12 +499,13 @@ void _modinv(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) PREINIT: + mp_err merr; int rc; SV* s; mp_int* RETVAL; PPCODE: Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); + merr = mp_init(RETVAL); rc = mp_invmod(x, y, RETVAL); EXTEND(SP, 2); /* we return two values */ if (rc != MP_OKAY) { @@ -413,14 +521,18 @@ sv_setpvn(s, "+", 1); PUSHs(s); } + PERL_UNUSED_VAR(merr); ############################################################################## # _add() - add $y to $x in place void _add(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - PPCODE: - mp_add(x, y, x); + PREINIT: + mp_err merr; + PPCODE: + merr = mp_add(x, y, x); + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -428,8 +540,11 @@ void _inc(Class, Math::BigInt::LTM x) - PPCODE: - mp_add_d(x, 1, x); + PREINIT: + mp_err merr; + PPCODE: + merr = mp_add_d(x, 1, x); + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -437,8 +552,11 @@ void _dec(Class, Math::BigInt::LTM x) - PPCODE: - mp_sub_d(x, 1, x); + PREINIT: + mp_err merr; + PPCODE: + merr = mp_sub_d(x, 1, x); + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -447,17 +565,20 @@ void _sub(Class, Math::BigInt::LTM x, Math::BigInt::LTM y, ...) + PREINIT: + mp_err merr; PPCODE: if ( items == 4 && SvTRUE(ST(3)) ) { /* y -= x */ - mp_sub(x, y, y); + merr = mp_sub(x, y, y); XPUSHs(ST(2)); /* y */ } else { /* x -= y */ - mp_sub(x, y, x); + merr = mp_sub(x, y, x); XPUSHs(ST(1)); /* x */ } + PERL_UNUSED_VAR(merr); ############################################################################## # _rsft() @@ -465,12 +586,23 @@ void _rsft(Class, Math::BigInt::LTM x, Math::BigInt::LTM y, unsigned long base_int) PREINIT: + mp_err merr; mp_int* BASE; PPCODE: Newz(0, BASE, 1, mp_int); - mp_init_set_int(BASE, base_int); - mp_expt_d(BASE, mp_get_long(y), BASE); - mp_div(x, BASE, x, NULL); + merr = mp_init(BASE); +#ifdef BN_MP_SET_INT_C + mp_set_int(BASE, base_int); +#else + mp_set_ul(BASE, base_int); +#endif +#ifdef BN_MP_GET_LONG_C + merr = mp_expt_d(BASE, mp_get_long(y), BASE); +#else + merr = mp_expt_d(BASE, mp_get_ul(y), BASE); +#endif + merr = mp_div(x, BASE, x, NULL); + PERL_UNUSED_VAR(merr); mp_clear(BASE); Safefree(BASE); XPUSHs(ST(1)); /* x */ @@ -481,12 +613,23 @@ void _lsft(Class, Math::BigInt::LTM x, Math::BigInt::LTM y, unsigned long base_int) PREINIT: + mp_err merr; mp_int* BASE; PPCODE: Newz(0, BASE, 1, mp_int); - mp_init_set_int(BASE, base_int); - mp_expt_d(BASE, mp_get_long(y), BASE); - mp_mul(x, BASE, x); + merr = mp_init(BASE); +#ifdef BN_MP_SET_INT_C + mp_set_int(BASE, base_int); +#else + mp_set_ul(BASE, base_int); +#endif +#ifdef BN_MP_GET_LONG_C + merr = mp_expt_d(BASE, mp_get_long(y), BASE); +#else + merr = mp_expt_d(BASE, mp_get_ul(y), BASE); +#endif + merr = mp_mul(x, BASE, x); + PERL_UNUSED_VAR(merr); mp_clear(BASE); Safefree(BASE); XPUSHs(ST(1)); /* x */ @@ -496,8 +639,11 @@ void _mul(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - PPCODE: - mp_mul(x, y, x); + PREINIT: + mp_err merr; + PPCODE: + merr = mp_mul(x, y, x); + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -506,28 +652,33 @@ void _div(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) PREINIT: + mp_err merr; mp_int * rem; PPCODE: if (GIMME_V == G_ARRAY) { Newz(0, rem, 1, mp_int); - mp_init(rem); - mp_div(x, y, x, rem); + merr = mp_init(rem); + merr = mp_div(x, y, x, rem); EXTEND(SP, 2); PUSHs(ST(1)); /* x */ PUSHs(sv_2mortal(sv_from_mpi(rem))); } else { - mp_div(x, y, x, NULL); + merr = mp_div(x, y, x, NULL); XPUSHs(ST(1)); /* x */ } + PERL_UNUSED_VAR(merr); ############################################################################## # _mod() - x %= y void _mod(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - PPCODE: - mp_mod(x, y, x); + PREINIT: + mp_err merr; + PPCODE: + merr = mp_mod(x, y, x); + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -587,8 +738,15 @@ void _pow(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - PPCODE: - mp_expt_d(x, mp_get_long(y), x); + PREINIT: + mp_err merr; + PPCODE: +#ifdef BN_MP_GET_LONG_C + merr = mp_expt_d(x, mp_get_long(y), x); +#else + merr = mp_expt_d(x, mp_get_ul(y), x); +#endif + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -596,10 +754,13 @@ Math::BigInt::LTM _gcd(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); - mp_gcd(x, y, RETVAL); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); + merr = mp_gcd(x, y, RETVAL); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -608,8 +769,11 @@ void _and(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - PPCODE: - mp_and(x, y, x); + PREINIT: + mp_err merr; + PPCODE: + merr = mp_and(x, y, x); + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -617,8 +781,11 @@ void _xor(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - PPCODE: - mp_xor(x, y, x); + PREINIT: + mp_err merr; + PPCODE: + merr = mp_xor(x, y, x); + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -626,8 +793,11 @@ void _or(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - PPCODE: - mp_or(x, y, x); + PREINIT: + mp_err merr; + PPCODE: + merr = mp_or(x, y, x); + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -635,10 +805,13 @@ Math::BigInt::LTM _copy(Class, Math::BigInt::LTM m) - CODE: - Newz(0, RETVAL, 1, mp_int); - mp_init(RETVAL); - mp_copy(m, RETVAL); + PREINIT: + mp_err merr; + CODE: + Newz(0, RETVAL, 1, mp_int); + merr = mp_init(RETVAL); + merr = mp_copy(m, RETVAL); + PERL_UNUSED_VAR(merr); OUTPUT: RETVAL @@ -667,8 +840,11 @@ void _sqrt(Class, Math::BigInt::LTM x) - PPCODE: - mp_sqrt(x, x); + PREINIT: + mp_err merr; + PPCODE: + merr = mp_sqrt(x, x); + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -676,16 +852,26 @@ void _root(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - PPCODE: - mp_n_root(x, mp_get_long(y), x); + PREINIT: + mp_err merr; + PPCODE: +#ifdef BN_MP_GET_LONG_C + merr = mp_n_root(x, mp_get_long(y), x); +#else + merr = mp_n_root(x, mp_get_ul(y), x); +#endif + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## # _lcm() - least common multiple void _lcm(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) - PPCODE: - mp_lcm(x, y, x) ; + PREINIT: + mp_err merr; + PPCODE: + merr = mp_lcm(x, y, x) ; + PERL_UNUSED_VAR(merr); XPUSHs(ST(1)); /* x */ ############################################################################## @@ -697,14 +883,16 @@ SV *cloning = NO_INIT SV *serialized PREINIT: + mp_err merr; SV *target; mp_int *mpi; PPCODE: PERL_UNUSED_VAR(cloning); if (SvROK(blank_obj) && sv_isa(blank_obj, "Math::BigInt::LTM")) { Newz(0, mpi, 1, mp_int); - mp_init(mpi); - mp_read_radix(mpi, SvPV_nolen(serialized), 10); + merr = mp_init(mpi); + merr = mp_read_radix(mpi, SvPV_nolen(serialized), 10); + PERL_UNUSED_VAR(merr); target = SvRV(blank_obj); SvIV_set(target, PTR2IV(mpi)); SvIOK_on(target); @@ -719,6 +907,7 @@ Math::BigInt::LTM self SV *cloning = NO_INIT PREINIT: + mp_err merr; unsigned long len; char *buf; CODE: @@ -729,7 +918,8 @@ else { len = mp_count_bits(self) / 3 + 3; /* decimal_size ~ (binary_size/3 + 1) +1 for sign +1 for NUL-byte */ Newz(0, buf, len, char); - mp_toradix_n(self, buf, 10, len); + merr = mp_toradix_n(self, buf, 10, len); + PERL_UNUSED_VAR(merr); RETVAL = newSVpv(buf, 0); Safefree(buf); } diff --git a/lib/Crypt/AuthEnc/CCM.pm b/lib/Crypt/AuthEnc/CCM.pm index c91d50b..1165c8c 100644 --- a/lib/Crypt/AuthEnc/CCM.pm +++ b/lib/Crypt/AuthEnc/CCM.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw( ccm_encrypt_authenticate ccm_decrypt_verify )] ); diff --git a/lib/Crypt/AuthEnc/ChaCha20Poly1305.pm b/lib/Crypt/AuthEnc/ChaCha20Poly1305.pm index 0b0b5cb..743b0fe 100644 --- a/lib/Crypt/AuthEnc/ChaCha20Poly1305.pm +++ b/lib/Crypt/AuthEnc/ChaCha20Poly1305.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw( chacha20poly1305_encrypt_authenticate chacha20poly1305_decrypt_verify )] ); diff --git a/lib/Crypt/AuthEnc/EAX.pm b/lib/Crypt/AuthEnc/EAX.pm index ddf6500..8a26355 100644 --- a/lib/Crypt/AuthEnc/EAX.pm +++ b/lib/Crypt/AuthEnc/EAX.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw( eax_encrypt_authenticate eax_decrypt_verify )] ); diff --git a/lib/Crypt/AuthEnc/GCM.pm b/lib/Crypt/AuthEnc/GCM.pm index 23be318..e8fa5b5 100644 --- a/lib/Crypt/AuthEnc/GCM.pm +++ b/lib/Crypt/AuthEnc/GCM.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw( gcm_encrypt_authenticate gcm_decrypt_verify )] ); diff --git a/lib/Crypt/AuthEnc/OCB.pm b/lib/Crypt/AuthEnc/OCB.pm index 4e9aacf..3cb6ff8 100644 --- a/lib/Crypt/AuthEnc/OCB.pm +++ b/lib/Crypt/AuthEnc/OCB.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw( ocb_encrypt_authenticate ocb_decrypt_verify )] ); diff --git a/lib/Crypt/AuthEnc.pm b/lib/Crypt/AuthEnc.pm index 31f68e9..a0c4137 100644 --- a/lib/Crypt/AuthEnc.pm +++ b/lib/Crypt/AuthEnc.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; ### not used diff --git a/lib/Crypt/Checksum/Adler32.pm b/lib/Crypt/Checksum/Adler32.pm index 9589362..9b247b7 100644 --- a/lib/Crypt/Checksum/Adler32.pm +++ b/lib/Crypt/Checksum/Adler32.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Checksum Exporter); our %EXPORT_TAGS = ( all => [qw( adler32_data adler32_data_hex adler32_data_int adler32_file adler32_file_hex adler32_file_int )] ); diff --git a/lib/Crypt/Checksum/CRC32.pm b/lib/Crypt/Checksum/CRC32.pm index 11ba458..c9b9ddf 100644 --- a/lib/Crypt/Checksum/CRC32.pm +++ b/lib/Crypt/Checksum/CRC32.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Checksum Exporter); our %EXPORT_TAGS = ( all => [qw( crc32_data crc32_data_hex crc32_data_int crc32_file crc32_file_hex crc32_file_int )] ); diff --git a/lib/Crypt/Checksum.pm b/lib/Crypt/Checksum.pm index 2946b11..796e5a2 100644 --- a/lib/Crypt/Checksum.pm +++ b/lib/Crypt/Checksum.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw/ adler32_data adler32_data_hex adler32_data_int adler32_file adler32_file_hex adler32_file_int diff --git a/lib/Crypt/Cipher/AES.pm b/lib/Crypt/Cipher/AES.pm index 7827754..2cbe8df 100644 --- a/lib/Crypt/Cipher/AES.pm +++ b/lib/Crypt/Cipher/AES.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/Anubis.pm b/lib/Crypt/Cipher/Anubis.pm index 71c2dbd..6c5c201 100644 --- a/lib/Crypt/Cipher/Anubis.pm +++ b/lib/Crypt/Cipher/Anubis.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/Blowfish.pm b/lib/Crypt/Cipher/Blowfish.pm index 4dde350..73dc3dc 100644 --- a/lib/Crypt/Cipher/Blowfish.pm +++ b/lib/Crypt/Cipher/Blowfish.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/CAST5.pm b/lib/Crypt/Cipher/CAST5.pm index 25bb004..84d710b 100644 --- a/lib/Crypt/Cipher/CAST5.pm +++ b/lib/Crypt/Cipher/CAST5.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/Camellia.pm b/lib/Crypt/Cipher/Camellia.pm index 4902e8a..fb7128b 100644 --- a/lib/Crypt/Cipher/Camellia.pm +++ b/lib/Crypt/Cipher/Camellia.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/DES.pm b/lib/Crypt/Cipher/DES.pm index eb1df38..3427e7b 100644 --- a/lib/Crypt/Cipher/DES.pm +++ b/lib/Crypt/Cipher/DES.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/DES_EDE.pm b/lib/Crypt/Cipher/DES_EDE.pm index 5ce5778..8f7cab9 100644 --- a/lib/Crypt/Cipher/DES_EDE.pm +++ b/lib/Crypt/Cipher/DES_EDE.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/IDEA.pm b/lib/Crypt/Cipher/IDEA.pm index e9a88e9..249c13a 100644 --- a/lib/Crypt/Cipher/IDEA.pm +++ b/lib/Crypt/Cipher/IDEA.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/KASUMI.pm b/lib/Crypt/Cipher/KASUMI.pm index add9252..754e8fd 100644 --- a/lib/Crypt/Cipher/KASUMI.pm +++ b/lib/Crypt/Cipher/KASUMI.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/Khazad.pm b/lib/Crypt/Cipher/Khazad.pm index 88c58f9..d05a46e 100644 --- a/lib/Crypt/Cipher/Khazad.pm +++ b/lib/Crypt/Cipher/Khazad.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/MULTI2.pm b/lib/Crypt/Cipher/MULTI2.pm index 807164a..64be309 100644 --- a/lib/Crypt/Cipher/MULTI2.pm +++ b/lib/Crypt/Cipher/MULTI2.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/Noekeon.pm b/lib/Crypt/Cipher/Noekeon.pm index 652404c..e6d2acb 100644 --- a/lib/Crypt/Cipher/Noekeon.pm +++ b/lib/Crypt/Cipher/Noekeon.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/RC2.pm b/lib/Crypt/Cipher/RC2.pm index cccf576..706aaa4 100644 --- a/lib/Crypt/Cipher/RC2.pm +++ b/lib/Crypt/Cipher/RC2.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/RC5.pm b/lib/Crypt/Cipher/RC5.pm index caf9f72..ecdc53f 100644 --- a/lib/Crypt/Cipher/RC5.pm +++ b/lib/Crypt/Cipher/RC5.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/RC6.pm b/lib/Crypt/Cipher/RC6.pm index c5ea927..da55084 100644 --- a/lib/Crypt/Cipher/RC6.pm +++ b/lib/Crypt/Cipher/RC6.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/SAFERP.pm b/lib/Crypt/Cipher/SAFERP.pm index 1ad644d..5c9ff81 100644 --- a/lib/Crypt/Cipher/SAFERP.pm +++ b/lib/Crypt/Cipher/SAFERP.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/SAFER_K128.pm b/lib/Crypt/Cipher/SAFER_K128.pm index 790a1d1..71509c1 100644 --- a/lib/Crypt/Cipher/SAFER_K128.pm +++ b/lib/Crypt/Cipher/SAFER_K128.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/SAFER_K64.pm b/lib/Crypt/Cipher/SAFER_K64.pm index 7e9bd40..0c980b2 100644 --- a/lib/Crypt/Cipher/SAFER_K64.pm +++ b/lib/Crypt/Cipher/SAFER_K64.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/SAFER_SK128.pm b/lib/Crypt/Cipher/SAFER_SK128.pm index 541120e..81b7d40 100644 --- a/lib/Crypt/Cipher/SAFER_SK128.pm +++ b/lib/Crypt/Cipher/SAFER_SK128.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/SAFER_SK64.pm b/lib/Crypt/Cipher/SAFER_SK64.pm index ff4feaf..b3a99ac 100644 --- a/lib/Crypt/Cipher/SAFER_SK64.pm +++ b/lib/Crypt/Cipher/SAFER_SK64.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/SEED.pm b/lib/Crypt/Cipher/SEED.pm index abac68c..4767852 100644 --- a/lib/Crypt/Cipher/SEED.pm +++ b/lib/Crypt/Cipher/SEED.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/Serpent.pm b/lib/Crypt/Cipher/Serpent.pm index 5fb6a7f..c5cfdbd 100644 --- a/lib/Crypt/Cipher/Serpent.pm +++ b/lib/Crypt/Cipher/Serpent.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/Skipjack.pm b/lib/Crypt/Cipher/Skipjack.pm index 3ee1aa7..6227d47 100644 --- a/lib/Crypt/Cipher/Skipjack.pm +++ b/lib/Crypt/Cipher/Skipjack.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/Twofish.pm b/lib/Crypt/Cipher/Twofish.pm index 5471c93..d59b357 100644 --- a/lib/Crypt/Cipher/Twofish.pm +++ b/lib/Crypt/Cipher/Twofish.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher/XTEA.pm b/lib/Crypt/Cipher/XTEA.pm index 34e75bd..59fa156 100644 --- a/lib/Crypt/Cipher/XTEA.pm +++ b/lib/Crypt/Cipher/XTEA.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Cipher); diff --git a/lib/Crypt/Cipher.pm b/lib/Crypt/Cipher.pm index 60266c3..3ddd59d 100644 --- a/lib/Crypt/Cipher.pm +++ b/lib/Crypt/Cipher.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use Carp; $Carp::Internal{(__PACKAGE__)}++; diff --git a/lib/Crypt/Digest/BLAKE2b_160.pm b/lib/Crypt/Digest/BLAKE2b_160.pm index f6d1100..d8400fc 100644 --- a/lib/Crypt/Digest/BLAKE2b_160.pm +++ b/lib/Crypt/Digest/BLAKE2b_160.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( blake2b_160 blake2b_160_hex blake2b_160_b64 blake2b_160_b64u blake2b_160_file blake2b_160_file_hex blake2b_160_file_b64 blake2b_160_file_b64u )] ); diff --git a/lib/Crypt/Digest/BLAKE2b_256.pm b/lib/Crypt/Digest/BLAKE2b_256.pm index 6d80edd..16d696c 100644 --- a/lib/Crypt/Digest/BLAKE2b_256.pm +++ b/lib/Crypt/Digest/BLAKE2b_256.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( blake2b_256 blake2b_256_hex blake2b_256_b64 blake2b_256_b64u blake2b_256_file blake2b_256_file_hex blake2b_256_file_b64 blake2b_256_file_b64u )] ); diff --git a/lib/Crypt/Digest/BLAKE2b_384.pm b/lib/Crypt/Digest/BLAKE2b_384.pm index d990782..d7237ce 100644 --- a/lib/Crypt/Digest/BLAKE2b_384.pm +++ b/lib/Crypt/Digest/BLAKE2b_384.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( blake2b_384 blake2b_384_hex blake2b_384_b64 blake2b_384_b64u blake2b_384_file blake2b_384_file_hex blake2b_384_file_b64 blake2b_384_file_b64u )] ); diff --git a/lib/Crypt/Digest/BLAKE2b_512.pm b/lib/Crypt/Digest/BLAKE2b_512.pm index 1626379..5286952 100644 --- a/lib/Crypt/Digest/BLAKE2b_512.pm +++ b/lib/Crypt/Digest/BLAKE2b_512.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( blake2b_512 blake2b_512_hex blake2b_512_b64 blake2b_512_b64u blake2b_512_file blake2b_512_file_hex blake2b_512_file_b64 blake2b_512_file_b64u )] ); diff --git a/lib/Crypt/Digest/BLAKE2s_128.pm b/lib/Crypt/Digest/BLAKE2s_128.pm index 798e888..8ab460b 100644 --- a/lib/Crypt/Digest/BLAKE2s_128.pm +++ b/lib/Crypt/Digest/BLAKE2s_128.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( blake2s_128 blake2s_128_hex blake2s_128_b64 blake2s_128_b64u blake2s_128_file blake2s_128_file_hex blake2s_128_file_b64 blake2s_128_file_b64u )] ); diff --git a/lib/Crypt/Digest/BLAKE2s_160.pm b/lib/Crypt/Digest/BLAKE2s_160.pm index 4af1eeb..417e249 100644 --- a/lib/Crypt/Digest/BLAKE2s_160.pm +++ b/lib/Crypt/Digest/BLAKE2s_160.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( blake2s_160 blake2s_160_hex blake2s_160_b64 blake2s_160_b64u blake2s_160_file blake2s_160_file_hex blake2s_160_file_b64 blake2s_160_file_b64u )] ); diff --git a/lib/Crypt/Digest/BLAKE2s_224.pm b/lib/Crypt/Digest/BLAKE2s_224.pm index 288eb8d..f139977 100644 --- a/lib/Crypt/Digest/BLAKE2s_224.pm +++ b/lib/Crypt/Digest/BLAKE2s_224.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( blake2s_224 blake2s_224_hex blake2s_224_b64 blake2s_224_b64u blake2s_224_file blake2s_224_file_hex blake2s_224_file_b64 blake2s_224_file_b64u )] ); diff --git a/lib/Crypt/Digest/BLAKE2s_256.pm b/lib/Crypt/Digest/BLAKE2s_256.pm index 5410236..7db3899 100644 --- a/lib/Crypt/Digest/BLAKE2s_256.pm +++ b/lib/Crypt/Digest/BLAKE2s_256.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( blake2s_256 blake2s_256_hex blake2s_256_b64 blake2s_256_b64u blake2s_256_file blake2s_256_file_hex blake2s_256_file_b64 blake2s_256_file_b64u )] ); diff --git a/lib/Crypt/Digest/CHAES.pm b/lib/Crypt/Digest/CHAES.pm index f067c45..e608d74 100644 --- a/lib/Crypt/Digest/CHAES.pm +++ b/lib/Crypt/Digest/CHAES.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( chaes chaes_hex chaes_b64 chaes_b64u chaes_file chaes_file_hex chaes_file_b64 chaes_file_b64u )] ); diff --git a/lib/Crypt/Digest/Keccak224.pm b/lib/Crypt/Digest/Keccak224.pm index ea21bdd..9073d83 100644 --- a/lib/Crypt/Digest/Keccak224.pm +++ b/lib/Crypt/Digest/Keccak224.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( keccak224 keccak224_hex keccak224_b64 keccak224_b64u keccak224_file keccak224_file_hex keccak224_file_b64 keccak224_file_b64u )] ); diff --git a/lib/Crypt/Digest/Keccak256.pm b/lib/Crypt/Digest/Keccak256.pm index 8445789..1d792c8 100644 --- a/lib/Crypt/Digest/Keccak256.pm +++ b/lib/Crypt/Digest/Keccak256.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( keccak256 keccak256_hex keccak256_b64 keccak256_b64u keccak256_file keccak256_file_hex keccak256_file_b64 keccak256_file_b64u )] ); diff --git a/lib/Crypt/Digest/Keccak384.pm b/lib/Crypt/Digest/Keccak384.pm index 544e776..fc38b1a 100644 --- a/lib/Crypt/Digest/Keccak384.pm +++ b/lib/Crypt/Digest/Keccak384.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( keccak384 keccak384_hex keccak384_b64 keccak384_b64u keccak384_file keccak384_file_hex keccak384_file_b64 keccak384_file_b64u )] ); diff --git a/lib/Crypt/Digest/Keccak512.pm b/lib/Crypt/Digest/Keccak512.pm index e95a761..d7d2315 100644 --- a/lib/Crypt/Digest/Keccak512.pm +++ b/lib/Crypt/Digest/Keccak512.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( keccak512 keccak512_hex keccak512_b64 keccak512_b64u keccak512_file keccak512_file_hex keccak512_file_b64 keccak512_file_b64u )] ); diff --git a/lib/Crypt/Digest/MD2.pm b/lib/Crypt/Digest/MD2.pm index 9701842..cac3944 100644 --- a/lib/Crypt/Digest/MD2.pm +++ b/lib/Crypt/Digest/MD2.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( md2 md2_hex md2_b64 md2_b64u md2_file md2_file_hex md2_file_b64 md2_file_b64u )] ); diff --git a/lib/Crypt/Digest/MD4.pm b/lib/Crypt/Digest/MD4.pm index 308ae4c..16bb81b 100644 --- a/lib/Crypt/Digest/MD4.pm +++ b/lib/Crypt/Digest/MD4.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( md4 md4_hex md4_b64 md4_b64u md4_file md4_file_hex md4_file_b64 md4_file_b64u )] ); diff --git a/lib/Crypt/Digest/MD5.pm b/lib/Crypt/Digest/MD5.pm index 848c014..9fcd1d3 100644 --- a/lib/Crypt/Digest/MD5.pm +++ b/lib/Crypt/Digest/MD5.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( md5 md5_hex md5_b64 md5_b64u md5_file md5_file_hex md5_file_b64 md5_file_b64u )] ); diff --git a/lib/Crypt/Digest/RIPEMD128.pm b/lib/Crypt/Digest/RIPEMD128.pm index 9beea59..6bdd279 100644 --- a/lib/Crypt/Digest/RIPEMD128.pm +++ b/lib/Crypt/Digest/RIPEMD128.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( ripemd128 ripemd128_hex ripemd128_b64 ripemd128_b64u ripemd128_file ripemd128_file_hex ripemd128_file_b64 ripemd128_file_b64u )] ); diff --git a/lib/Crypt/Digest/RIPEMD160.pm b/lib/Crypt/Digest/RIPEMD160.pm index d6bcc2c..df36267 100644 --- a/lib/Crypt/Digest/RIPEMD160.pm +++ b/lib/Crypt/Digest/RIPEMD160.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( ripemd160 ripemd160_hex ripemd160_b64 ripemd160_b64u ripemd160_file ripemd160_file_hex ripemd160_file_b64 ripemd160_file_b64u )] ); diff --git a/lib/Crypt/Digest/RIPEMD256.pm b/lib/Crypt/Digest/RIPEMD256.pm index 2a44dbe..fc27137 100644 --- a/lib/Crypt/Digest/RIPEMD256.pm +++ b/lib/Crypt/Digest/RIPEMD256.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( ripemd256 ripemd256_hex ripemd256_b64 ripemd256_b64u ripemd256_file ripemd256_file_hex ripemd256_file_b64 ripemd256_file_b64u )] ); diff --git a/lib/Crypt/Digest/RIPEMD320.pm b/lib/Crypt/Digest/RIPEMD320.pm index bcee754..2cc9109 100644 --- a/lib/Crypt/Digest/RIPEMD320.pm +++ b/lib/Crypt/Digest/RIPEMD320.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( ripemd320 ripemd320_hex ripemd320_b64 ripemd320_b64u ripemd320_file ripemd320_file_hex ripemd320_file_b64 ripemd320_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA1.pm b/lib/Crypt/Digest/SHA1.pm index 9e8d52a..7a7c46d 100644 --- a/lib/Crypt/Digest/SHA1.pm +++ b/lib/Crypt/Digest/SHA1.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha1 sha1_hex sha1_b64 sha1_b64u sha1_file sha1_file_hex sha1_file_b64 sha1_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA224.pm b/lib/Crypt/Digest/SHA224.pm index 56ff921..5499a4c 100644 --- a/lib/Crypt/Digest/SHA224.pm +++ b/lib/Crypt/Digest/SHA224.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha224 sha224_hex sha224_b64 sha224_b64u sha224_file sha224_file_hex sha224_file_b64 sha224_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA256.pm b/lib/Crypt/Digest/SHA256.pm index 9d2b895..219169a 100644 --- a/lib/Crypt/Digest/SHA256.pm +++ b/lib/Crypt/Digest/SHA256.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha256 sha256_hex sha256_b64 sha256_b64u sha256_file sha256_file_hex sha256_file_b64 sha256_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA384.pm b/lib/Crypt/Digest/SHA384.pm index b36931e..f1b0bf4 100644 --- a/lib/Crypt/Digest/SHA384.pm +++ b/lib/Crypt/Digest/SHA384.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha384 sha384_hex sha384_b64 sha384_b64u sha384_file sha384_file_hex sha384_file_b64 sha384_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA3_224.pm b/lib/Crypt/Digest/SHA3_224.pm index 212bd42..dbc6250 100644 --- a/lib/Crypt/Digest/SHA3_224.pm +++ b/lib/Crypt/Digest/SHA3_224.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha3_224 sha3_224_hex sha3_224_b64 sha3_224_b64u sha3_224_file sha3_224_file_hex sha3_224_file_b64 sha3_224_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA3_256.pm b/lib/Crypt/Digest/SHA3_256.pm index 4dfd448..a45ab3f 100644 --- a/lib/Crypt/Digest/SHA3_256.pm +++ b/lib/Crypt/Digest/SHA3_256.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha3_256 sha3_256_hex sha3_256_b64 sha3_256_b64u sha3_256_file sha3_256_file_hex sha3_256_file_b64 sha3_256_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA3_384.pm b/lib/Crypt/Digest/SHA3_384.pm index 44d013c..a5091ee 100644 --- a/lib/Crypt/Digest/SHA3_384.pm +++ b/lib/Crypt/Digest/SHA3_384.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha3_384 sha3_384_hex sha3_384_b64 sha3_384_b64u sha3_384_file sha3_384_file_hex sha3_384_file_b64 sha3_384_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA3_512.pm b/lib/Crypt/Digest/SHA3_512.pm index 355f1d3..58bddab 100644 --- a/lib/Crypt/Digest/SHA3_512.pm +++ b/lib/Crypt/Digest/SHA3_512.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha3_512 sha3_512_hex sha3_512_b64 sha3_512_b64u sha3_512_file sha3_512_file_hex sha3_512_file_b64 sha3_512_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA512.pm b/lib/Crypt/Digest/SHA512.pm index aa0e59d..4f54496 100644 --- a/lib/Crypt/Digest/SHA512.pm +++ b/lib/Crypt/Digest/SHA512.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha512 sha512_hex sha512_b64 sha512_b64u sha512_file sha512_file_hex sha512_file_b64 sha512_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA512_224.pm b/lib/Crypt/Digest/SHA512_224.pm index 7f2c651..b313777 100644 --- a/lib/Crypt/Digest/SHA512_224.pm +++ b/lib/Crypt/Digest/SHA512_224.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha512_224 sha512_224_hex sha512_224_b64 sha512_224_b64u sha512_224_file sha512_224_file_hex sha512_224_file_b64 sha512_224_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHA512_256.pm b/lib/Crypt/Digest/SHA512_256.pm index 9fdea60..6572c92 100644 --- a/lib/Crypt/Digest/SHA512_256.pm +++ b/lib/Crypt/Digest/SHA512_256.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( sha512_256 sha512_256_hex sha512_256_b64 sha512_256_b64u sha512_256_file sha512_256_file_hex sha512_256_file_b64 sha512_256_file_b64u )] ); diff --git a/lib/Crypt/Digest/SHAKE.pm b/lib/Crypt/Digest/SHAKE.pm index 8b7b8cc..57df692 100644 --- a/lib/Crypt/Digest/SHAKE.pm +++ b/lib/Crypt/Digest/SHAKE.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use Carp; $Carp::Internal{(__PACKAGE__)}++; diff --git a/lib/Crypt/Digest/Tiger192.pm b/lib/Crypt/Digest/Tiger192.pm index 653df11..1da9d09 100644 --- a/lib/Crypt/Digest/Tiger192.pm +++ b/lib/Crypt/Digest/Tiger192.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( tiger192 tiger192_hex tiger192_b64 tiger192_b64u tiger192_file tiger192_file_hex tiger192_file_b64 tiger192_file_b64u )] ); diff --git a/lib/Crypt/Digest/Whirlpool.pm b/lib/Crypt/Digest/Whirlpool.pm index ca96546..78dad5f 100644 --- a/lib/Crypt/Digest/Whirlpool.pm +++ b/lib/Crypt/Digest/Whirlpool.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Digest Exporter); our %EXPORT_TAGS = ( all => [qw( whirlpool whirlpool_hex whirlpool_b64 whirlpool_b64u whirlpool_file whirlpool_file_hex whirlpool_file_b64 whirlpool_file_b64u )] ); diff --git a/lib/Crypt/Digest.pm b/lib/Crypt/Digest.pm index abd09a6..138a8ab 100644 --- a/lib/Crypt/Digest.pm +++ b/lib/Crypt/Digest.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u )] ); diff --git a/lib/Crypt/KeyDerivation.pm b/lib/Crypt/KeyDerivation.pm index 183c403..d732825 100644 --- a/lib/Crypt/KeyDerivation.pm +++ b/lib/Crypt/KeyDerivation.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw(pbkdf1 pbkdf2 hkdf hkdf_expand hkdf_extract)] ); diff --git a/lib/Crypt/Mac/BLAKE2b.pm b/lib/Crypt/Mac/BLAKE2b.pm index 0c40c25..12f7c9b 100644 --- a/lib/Crypt/Mac/BLAKE2b.pm +++ b/lib/Crypt/Mac/BLAKE2b.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Mac Exporter); our %EXPORT_TAGS = ( all => [qw( blake2b blake2b_hex blake2b_b64 blake2b_b64u )] ); diff --git a/lib/Crypt/Mac/BLAKE2s.pm b/lib/Crypt/Mac/BLAKE2s.pm index 917db97..7bdfb8b 100644 --- a/lib/Crypt/Mac/BLAKE2s.pm +++ b/lib/Crypt/Mac/BLAKE2s.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Mac Exporter); our %EXPORT_TAGS = ( all => [qw( blake2s blake2s_hex blake2s_b64 blake2s_b64u )] ); diff --git a/lib/Crypt/Mac/F9.pm b/lib/Crypt/Mac/F9.pm index bc49f35..0cddda1 100644 --- a/lib/Crypt/Mac/F9.pm +++ b/lib/Crypt/Mac/F9.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Mac Exporter); our %EXPORT_TAGS = ( all => [qw( f9 f9_hex f9_b64 f9_b64u )] ); diff --git a/lib/Crypt/Mac/HMAC.pm b/lib/Crypt/Mac/HMAC.pm index 0a08933..be7a9ff 100644 --- a/lib/Crypt/Mac/HMAC.pm +++ b/lib/Crypt/Mac/HMAC.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Mac Exporter); our %EXPORT_TAGS = ( all => [qw( hmac hmac_hex hmac_b64 hmac_b64u )] ); diff --git a/lib/Crypt/Mac/OMAC.pm b/lib/Crypt/Mac/OMAC.pm index d31d985..8183d07 100644 --- a/lib/Crypt/Mac/OMAC.pm +++ b/lib/Crypt/Mac/OMAC.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Mac Exporter); our %EXPORT_TAGS = ( all => [qw( omac omac_hex omac_b64 omac_b64u )] ); diff --git a/lib/Crypt/Mac/PMAC.pm b/lib/Crypt/Mac/PMAC.pm index b015387..5c0d5b9 100644 --- a/lib/Crypt/Mac/PMAC.pm +++ b/lib/Crypt/Mac/PMAC.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Mac Exporter); our %EXPORT_TAGS = ( all => [qw( pmac pmac_hex pmac_b64 pmac_b64u )] ); diff --git a/lib/Crypt/Mac/Pelican.pm b/lib/Crypt/Mac/Pelican.pm index 4250d75..17b1775 100644 --- a/lib/Crypt/Mac/Pelican.pm +++ b/lib/Crypt/Mac/Pelican.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Mac Exporter); our %EXPORT_TAGS = ( all => [qw( pelican pelican_hex pelican_b64 pelican_b64u )] ); diff --git a/lib/Crypt/Mac/Poly1305.pm b/lib/Crypt/Mac/Poly1305.pm index c5bf556..15265cb 100644 --- a/lib/Crypt/Mac/Poly1305.pm +++ b/lib/Crypt/Mac/Poly1305.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Mac Exporter); our %EXPORT_TAGS = ( all => [qw( poly1305 poly1305_hex poly1305_b64 poly1305_b64u )] ); diff --git a/lib/Crypt/Mac/XCBC.pm b/lib/Crypt/Mac/XCBC.pm index 05d63e6..76c916f 100644 --- a/lib/Crypt/Mac/XCBC.pm +++ b/lib/Crypt/Mac/XCBC.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::Mac Exporter); our %EXPORT_TAGS = ( all => [qw( xcbc xcbc_hex xcbc_b64 xcbc_b64u )] ); diff --git a/lib/Crypt/Mac.pm b/lib/Crypt/Mac.pm index 7e09a4f..55709aa 100644 --- a/lib/Crypt/Mac.pm +++ b/lib/Crypt/Mac.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use Carp; $Carp::Internal{(__PACKAGE__)}++; diff --git a/lib/Crypt/Misc.pm b/lib/Crypt/Misc.pm index 0f3e129..7faf482 100644 --- a/lib/Crypt/Misc.pm +++ b/lib/Crypt/Misc.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 5.57 'import'; use Carp 'croak'; diff --git a/lib/Crypt/Mode/CBC.pm b/lib/Crypt/Mode/CBC.pm index a7e0ec1..354dbda 100644 --- a/lib/Crypt/Mode/CBC.pm +++ b/lib/Crypt/Mode/CBC.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use Crypt::Cipher; diff --git a/lib/Crypt/Mode/CFB.pm b/lib/Crypt/Mode/CFB.pm index 924b225..df637a2 100644 --- a/lib/Crypt/Mode/CFB.pm +++ b/lib/Crypt/Mode/CFB.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use Crypt::Cipher; diff --git a/lib/Crypt/Mode/CTR.pm b/lib/Crypt/Mode/CTR.pm index de2e67d..60fb0ca 100644 --- a/lib/Crypt/Mode/CTR.pm +++ b/lib/Crypt/Mode/CTR.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use Crypt::Cipher; diff --git a/lib/Crypt/Mode/ECB.pm b/lib/Crypt/Mode/ECB.pm index 1937af2..2dfd5cd 100644 --- a/lib/Crypt/Mode/ECB.pm +++ b/lib/Crypt/Mode/ECB.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use Crypt::Cipher; diff --git a/lib/Crypt/Mode/OFB.pm b/lib/Crypt/Mode/OFB.pm index 7489d7d..ec59ee7 100644 --- a/lib/Crypt/Mode/OFB.pm +++ b/lib/Crypt/Mode/OFB.pm @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use Crypt::Cipher; diff --git a/lib/Crypt/Mode.pm b/lib/Crypt/Mode.pm index 818a50e..448ce8f 100644 --- a/lib/Crypt/Mode.pm +++ b/lib/Crypt/Mode.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; ### not used diff --git a/lib/Crypt/PK/DH.pm b/lib/Crypt/PK/DH.pm index 931b2e1..770b1de 100644 --- a/lib/Crypt/PK/DH.pm +++ b/lib/Crypt/PK/DH.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw( dh_shared_secret )] ); diff --git a/lib/Crypt/PK/DSA.pm b/lib/Crypt/PK/DSA.pm index 0649318..05bf799 100644 --- a/lib/Crypt/PK/DSA.pm +++ b/lib/Crypt/PK/DSA.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw( dsa_encrypt dsa_decrypt dsa_sign_message dsa_verify_message dsa_sign_hash dsa_verify_hash )] ); diff --git a/lib/Crypt/PK/ECC.pm b/lib/Crypt/PK/ECC.pm index e8ddd59..dfd1009 100644 --- a/lib/Crypt/PK/ECC.pm +++ b/lib/Crypt/PK/ECC.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw( ecc_encrypt ecc_decrypt ecc_sign_message ecc_verify_message ecc_sign_hash ecc_verify_hash ecc_shared_secret )] ); diff --git a/lib/Crypt/PK/RSA.pm b/lib/Crypt/PK/RSA.pm index 8f64b41..5f61f73 100644 --- a/lib/Crypt/PK/RSA.pm +++ b/lib/Crypt/PK/RSA.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw(rsa_encrypt rsa_decrypt rsa_sign_message rsa_verify_message rsa_sign_hash rsa_verify_hash)] ); diff --git a/lib/Crypt/PK.pm b/lib/Crypt/PK.pm index b0092ad..7421bbd 100644 --- a/lib/Crypt/PK.pm +++ b/lib/Crypt/PK.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use Carp; diff --git a/lib/Crypt/PRNG/ChaCha20.pm b/lib/Crypt/PRNG/ChaCha20.pm index e9b09ee..2de2874 100644 --- a/lib/Crypt/PRNG/ChaCha20.pm +++ b/lib/Crypt/PRNG/ChaCha20.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::PRNG Exporter); our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] ); diff --git a/lib/Crypt/PRNG/Fortuna.pm b/lib/Crypt/PRNG/Fortuna.pm index 51a3c16..00f1ae4 100644 --- a/lib/Crypt/PRNG/Fortuna.pm +++ b/lib/Crypt/PRNG/Fortuna.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::PRNG Exporter); our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] ); diff --git a/lib/Crypt/PRNG/RC4.pm b/lib/Crypt/PRNG/RC4.pm index 7367cc8..fcf5e84 100644 --- a/lib/Crypt/PRNG/RC4.pm +++ b/lib/Crypt/PRNG/RC4.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::PRNG Exporter); our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] ); diff --git a/lib/Crypt/PRNG/Sober128.pm b/lib/Crypt/PRNG/Sober128.pm index eaf6198..7cbf82b 100644 --- a/lib/Crypt/PRNG/Sober128.pm +++ b/lib/Crypt/PRNG/Sober128.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::PRNG Exporter); our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] ); diff --git a/lib/Crypt/PRNG/Yarrow.pm b/lib/Crypt/PRNG/Yarrow.pm index c10bc42..757859f 100644 --- a/lib/Crypt/PRNG/Yarrow.pm +++ b/lib/Crypt/PRNG/Yarrow.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use base qw(Crypt::PRNG Exporter); our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] ); diff --git a/lib/Crypt/PRNG.pm b/lib/Crypt/PRNG.pm index 8196a8a..337ed7b 100644 --- a/lib/Crypt/PRNG.pm +++ b/lib/Crypt/PRNG.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import'; our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] ); diff --git a/lib/Crypt/Stream/ChaCha.pm b/lib/Crypt/Stream/ChaCha.pm index 9a11531..65a7617 100644 --- a/lib/Crypt/Stream/ChaCha.pm +++ b/lib/Crypt/Stream/ChaCha.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use CryptX; diff --git a/lib/Crypt/Stream/RC4.pm b/lib/Crypt/Stream/RC4.pm index 90b520d..18c049a 100644 --- a/lib/Crypt/Stream/RC4.pm +++ b/lib/Crypt/Stream/RC4.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use CryptX; diff --git a/lib/Crypt/Stream/Rabbit.pm b/lib/Crypt/Stream/Rabbit.pm index c000fe6..f250845 100644 --- a/lib/Crypt/Stream/Rabbit.pm +++ b/lib/Crypt/Stream/Rabbit.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use CryptX; diff --git a/lib/Crypt/Stream/Salsa20.pm b/lib/Crypt/Stream/Salsa20.pm index fdc6734..9588ef8 100644 --- a/lib/Crypt/Stream/Salsa20.pm +++ b/lib/Crypt/Stream/Salsa20.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use CryptX; diff --git a/lib/Crypt/Stream/Sober128.pm b/lib/Crypt/Stream/Sober128.pm index 5d9f897..17cf86a 100644 --- a/lib/Crypt/Stream/Sober128.pm +++ b/lib/Crypt/Stream/Sober128.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use CryptX; diff --git a/lib/Crypt/Stream/Sosemanuk.pm b/lib/Crypt/Stream/Sosemanuk.pm index a65ed8f..1a68c04 100644 --- a/lib/Crypt/Stream/Sosemanuk.pm +++ b/lib/Crypt/Stream/Sosemanuk.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use CryptX; diff --git a/lib/CryptX.pm b/lib/CryptX.pm index 7e72dd4..3aee024 100644 --- a/lib/CryptX.pm +++ b/lib/CryptX.pm @@ -2,7 +2,7 @@ use strict; use warnings ; -our $VERSION = '0.063'; +our $VERSION = '0.064'; require XSLoader; XSLoader::load('CryptX', $VERSION); diff --git a/lib/Math/BigInt/LTM.pm b/lib/Math/BigInt/LTM.pm index 1cfbe21..1a05831 100644 --- a/lib/Math/BigInt/LTM.pm +++ b/lib/Math/BigInt/LTM.pm @@ -2,7 +2,7 @@ use strict; use warnings; -our $VERSION = '0.063'; +our $VERSION = '0.064'; use CryptX; use Carp; diff --git a/ppport.h b/ppport.h index 068275d..96ac134 100644 --- a/ppport.h +++ b/ppport.h @@ -4,9 +4,9 @@ /* ---------------------------------------------------------------------- - ppport.h -- Perl/Pollution/Portability Version 3.36 - - Automatically created by Devel::PPPort running under perl 5.022003. + ppport.h -- Perl/Pollution/Portability Version 3.52 + + Automatically created by Devel::PPPort running under perl 5.026003. Do NOT edit this file directly! -- Edit PPPort_pm.PL and the includes in parts/inc/ instead. @@ -21,7 +21,7 @@ =head1 NAME -ppport.h - Perl/Pollution/Portability version 3.36 +ppport.h - Perl/Pollution/Portability version 3.52 =head1 SYNOPSIS @@ -46,8 +46,8 @@ --nochanges don't suggest changes --nofilter don't filter input files - --strip strip all script and doc functionality from - ppport.h + --strip strip all script and doc functionality + from ppport.h --list-provided list provided API --list-unsupported list unsupported API @@ -56,7 +56,7 @@ =head1 COMPATIBILITY This version of F is designed to support operation with Perl -installations back to 5.003, and has been tested up to 5.20. +installations back to 5.003, and has been tested up to 5.30. =head1 OPTIONS @@ -221,6 +221,8 @@ PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL SvRX() NEED_SvRX NEED_SvRX_GLOBAL caller_cx() NEED_caller_cx NEED_caller_cx_GLOBAL + croak_xs_usage() NEED_croak_xs_usage NEED_croak_xs_usage_GLOBAL + die_sv() NEED_die_sv NEED_die_sv_GLOBAL eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL @@ -229,11 +231,15 @@ grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL gv_fetchpvn_flags() NEED_gv_fetchpvn_flags NEED_gv_fetchpvn_flags_GLOBAL load_module() NEED_load_module NEED_load_module_GLOBAL + mess() NEED_mess NEED_mess_GLOBAL + mess_nocontext() NEED_mess_nocontext NEED_mess_nocontext_GLOBAL + mess_sv() NEED_mess_sv NEED_mess_sv_GLOBAL mg_findext() NEED_mg_findext NEED_mg_findext_GLOBAL my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL + my_strnlen() NEED_my_strnlen NEED_my_strnlen_GLOBAL newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL @@ -250,7 +256,9 @@ sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL sv_unmagicext() NEED_sv_unmagicext NEED_sv_unmagicext_GLOBAL + utf8_to_uvchr_buf() NEED_utf8_to_uvchr_buf NEED_utf8_to_uvchr_buf_GLOBAL vload_module() NEED_vload_module NEED_vload_module_GLOBAL + vmess() NEED_vmess NEED_vmess_GLOBAL vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL warner() NEED_warner NEED_warner_GLOBAL @@ -330,7 +338,7 @@ If F was generated using the latest version of C and is causing failure of this module, please -file a bug report here: L +send a bug report to L. Please include the following information: @@ -381,9 +389,9 @@ use strict; # Disable broken TRIE-optimization -BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 } - -my $VERSION = 3.36; +BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if "$]" >= 5.009004 && "$]" <= 5.009005 } + +my $VERSION = 3.52; my %opt = ( quiet => 0, @@ -450,9 +458,9 @@ (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), } ) : die "invalid spec: $_" } qw( -ASCII_TO_NEED||5.007001|n AvFILLp|5.004050||p AvFILL||| +BOM_UTF8||| BhkDISABLE||5.024000| BhkENABLE||5.024000| BhkENTRY_set||5.024000| @@ -541,6 +549,7 @@ IVTYPE|5.006000||p IVdf|5.006000||p LEAVE||| +LIKELY|||p LINKLIST||5.013006| LVRET||| MARK||| @@ -552,7 +561,6 @@ MY_CXT|5.007003||p MoveD|5.009002|5.004050|p Move||| -NATIVE_TO_NEED||5.007001|n NOOP|5.005000||p NUM2PTR|5.006000||p NVTYPE|5.006000||p @@ -597,6 +605,7 @@ PERLIO_FUNCS_CAST|5.009003||p PERLIO_FUNCS_DECL|5.009003||p PERL_ABS|5.008001||p +PERL_ARGS_ASSERT_CROAK_XS_USAGE|||p PERL_BCDVERSION|5.024000||p PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p PERL_HASH|5.003070||p @@ -744,6 +753,7 @@ PL_sv_no|5.004050||pn PL_sv_undef|5.004050||pn PL_sv_yes|5.004050||pn +PL_sv_zero|||n PL_tainted|5.004050||p PL_tainting|5.004050||p PL_tokenbuf|5.024000||p @@ -820,12 +830,22 @@ PerlIO_tell||5.007003| PerlIO_unread||5.007003| PerlIO_write||5.007003| -Perl_signbit||5.009005|n +PerlLIO_dup2_cloexec||| +PerlLIO_dup_cloexec||| +PerlLIO_open3_cloexec||| +PerlLIO_open_cloexec||| +PerlProc_pipe_cloexec||| +PerlSock_accept_cloexec||| +PerlSock_socket_cloexec||| +PerlSock_socketpair_cloexec||| +Perl_langinfo|||n +Perl_setlocale|||n PoisonFree|5.009004||p PoisonNew|5.009004||p PoisonWith|5.009004||p Poison|5.008000||p READ_XDIGIT||5.017006| +REPLACEMENT_CHARACTER_UTF8||| RESTORE_LC_NUMERIC||5.024000| RETVAL|||n Renewc||| @@ -927,6 +947,7 @@ SvPOK_on||| SvPOKp||| SvPOK||| +SvPVCLEAR||| SvPVX_const|5.009003||p SvPVX_mutable|5.009003||p SvPVX||| @@ -964,6 +985,9 @@ SvPVutf8||5.006000| SvPVx||| SvPV||| +SvREADONLY_off||| +SvREADONLY_on||| +SvREADONLY||| SvREFCNT_dec_NN||5.017007| SvREFCNT_dec||| SvREFCNT_inc_NN|5.009004||p @@ -1015,8 +1039,16 @@ SvVSTRING_mg|5.009004||p THIS|||n UNDERBAR|5.009002||p +UNICODE_REPLACEMENT|||p +UNLIKELY|||p UTF8SKIP||5.006000| +UTF8_IS_INVARIANT||| +UTF8_IS_NONCHAR||| +UTF8_IS_SUPER||| +UTF8_IS_SURROGATE||| UTF8_MAXBYTES|5.009002||p +UTF8_SAFE_SKIP|||p +UVCHR_IS_INVARIANT||| UVCHR_SKIP||5.022000| UVSIZE|5.006000||p UVTYPE|5.006000||p @@ -1114,57 +1146,17 @@ XopFLAGS||5.013007| ZeroD|5.009002||p Zero||| +__ASSERT_|||p _aMY_CXT|5.007003||p -_add_range_to_invlist||| -_append_range_to_invlist||| -_core_swash_init||| -_get_encoding||| -_get_regclass_nonbitmap_data||| -_get_swash_invlist||| -_invlistEQ||| -_invlist_array_init|||n -_invlist_contains_cp|||n -_invlist_dump||| -_invlist_intersection_maybe_complement_2nd||| -_invlist_intersection||| -_invlist_invert||| -_invlist_len|||n -_invlist_populate_swatch|||n -_invlist_search|||n -_invlist_subtract||| -_invlist_union_maybe_complement_2nd||| -_invlist_union||| -_is_cur_LC_category_utf8||| -_is_in_locale_category||5.021001| -_is_uni_FOO||5.017008| -_is_uni_perl_idcont||5.017008| -_is_uni_perl_idstart||5.017007| -_is_utf8_FOO||5.017008| -_is_utf8_char_slow||5.021001|n -_is_utf8_idcont||5.021001| -_is_utf8_idstart||5.021001| -_is_utf8_mark||5.017008| -_is_utf8_perl_idcont||5.017008| -_is_utf8_perl_idstart||5.017007| -_is_utf8_xidcont||5.021001| -_is_utf8_xidstart||5.021001| -_load_PL_utf8_foldclosures||| -_make_exactf_invlist||| +_inverse_folds||| +_is_grapheme||| +_is_in_locale_category||| _new_invlist_C_array||| -_new_invlist||| _pMY_CXT|5.007003||p -_setlocale_debug_string|||n -_setup_canned_invlist||| -_swash_inversion_hash||| -_swash_to_invlist||| -_to_fold_latin1||| -_to_uni_fold_flags||5.014000| +_to_fold_latin1|||n _to_upper_title_latin1||| _to_utf8_case||| -_to_utf8_fold_flags||5.019009| -_to_utf8_lower_flags||5.019009| -_to_utf8_title_flags||5.019009| -_to_utf8_upper_flags||5.019009| +_variant_byte_number|||n _warn_problematic_locale|||n aMY_CXT_|5.007003||p aMY_CXT|5.007003||p @@ -1172,8 +1164,8 @@ aTHXR|5.024000||p aTHX_|5.006000||p aTHX|5.006000||p +abort_execution||| add_above_Latin1_folds||| -add_cp_to_invlist||| add_data|||n add_multi_match||| add_utf16_textfilter||| @@ -1181,8 +1173,6 @@ advance_one_LB||| advance_one_SB||| advance_one_WB||| -alloc_maybe_populate_EXACT||| -alloccopstash||| allocmy||| amagic_call||| amagic_cmp_locale||| @@ -1194,19 +1184,16 @@ anonymise_cv_maybe||| any_dup||| ao||| -append_utf8_from_native_byte||5.019004|n apply_attrs_my||| -apply_attrs_string||5.006001| apply_attrs||| apply||| +argvout_final||| assert_uft8_cache_coherent||| assignment_type||| atfork_lock||5.007003|n atfork_unlock||5.007003|n av_arylen_p||5.009003| av_clear||| -av_create_and_push||5.009005| -av_create_and_unshift_one||5.009005| av_delete||5.006000| av_exists||5.006000| av_extend_guts||| @@ -1216,16 +1203,18 @@ av_iter_p||5.011000| av_len||| av_make||| +av_nonelem||| av_pop||| av_push||| av_reify||| av_shift||| av_store||| -av_tindex||5.017009| -av_top_index||5.017009| +av_tindex|5.017009|5.017009|p +av_top_index|5.017009|5.017009|p av_undef||| av_unshift||| ax|||n +backup_one_GCB||| backup_one_LB||| backup_one_SB||| backup_one_WB||| @@ -1241,8 +1230,6 @@ boot_core_UNIVERSAL||| boot_core_mro||| bytes_cmp_utf8||5.013007| -bytes_from_utf8||5.007001| -bytes_to_utf8||5.006001| cBOOL|5.013000||p call_argv|5.006000||p call_atexit||5.006000| @@ -1257,11 +1244,19 @@ cast_iv||5.006000|n cast_ulong||5.006000|n cast_uv||5.006000|n -check_locale_boundary_crossing||| +category_name|||n +change_engine_size||| +check_and_deprecate||| check_type_and_open||| check_uni||| -check_utf8_print||| checkcomma||| +ckWARN2_d||| +ckWARN2||| +ckWARN3_d||| +ckWARN3||| +ckWARN4_d||| +ckWARN4||| +ckWARN_d||| ckWARN|5.006000||p ck_entersub_args_core||| ck_entersub_args_list||5.013006| @@ -1273,7 +1268,6 @@ ckwarn_d||5.009003| ckwarn||5.009003| clear_defarray||5.023008| -clear_placeholders||| clear_special_blocks||| clone_params_del|||n clone_params_new|||n @@ -1281,14 +1275,12 @@ cntrl_to_mnemonic|||n compute_EXACTish|||n construct_ahocorasick_from_trie||| -cop_fetch_label||5.015001| cop_free||| cop_hints_2hv||5.013007| cop_hints_fetch_pvn||5.013007| cop_hints_fetch_pvs||5.013007| cop_hints_fetch_pv||5.013007| cop_hints_fetch_sv||5.013007| -cop_store_label||5.015001| cophh_2hv||5.013007| cophh_copy||5.013007| cophh_delete_pvn||5.013007| @@ -1308,14 +1300,14 @@ core_prototype||| coresub_op||| cr_textfilter||| -create_eval_scope||| -croak_memory_wrap||5.019003|n +croak_caller|||vn +croak_memory_wrap|5.019003||pn croak_no_mem|||n -croak_no_modify||5.013003|n -croak_nocontext|||vn +croak_no_modify|5.013003||pn +croak_nocontext|||pvn croak_popstack|||n -croak_sv||5.013001| -croak_xs_usage||5.010001|n +croak_sv|5.013001||p +croak_xs_usage|5.010001||pn croak|||v csighandler||5.009003|n current_re_engine||| @@ -1325,13 +1317,13 @@ custom_op_name||5.007003| custom_op_register||5.013007| custom_op_xop||5.013007| -cv_ckproto_len_flags||| cv_clone_into||| cv_clone||| cv_const_sv_or_av|||n cv_const_sv||5.003070|n cv_dump||| cv_forget_slab||| +cv_get_call_checker_flags||| cv_get_call_checker||5.013006| cv_name||5.021005| cv_set_call_checker_flags||5.021004| @@ -1343,24 +1335,6 @@ cvstash_set||| cx_dump||5.005000| cx_dup||| -cx_popblock||5.023008| -cx_popeval||5.023008| -cx_popformat||5.023008| -cx_popgiven||5.023008| -cx_poploop||5.023008| -cx_popsub_args||5.023008| -cx_popsub_common||5.023008| -cx_popsub||5.023008| -cx_popwhen||5.023008| -cx_pushblock||5.023008| -cx_pusheval||5.023008| -cx_pushformat||5.023008| -cx_pushgiven||5.023008| -cx_pushloop_for||5.023008| -cx_pushloop_plain||5.023008| -cx_pushsub||5.023008| -cx_pushwhen||5.023008| -cx_topblock||5.023008| cxinc||| dAXMARK|5.009003||p dAX|5.007002||p @@ -1396,13 +1370,12 @@ deb||5.007003|v defelem_target||| del_sv||| -delete_eval_scope||| +delimcpy_no_escape|||n delimcpy||5.004000|n -deprecate_commaless_var_list||| despatch_signals||5.007001| destroy_matcher||| die_nocontext|||vn -die_sv||5.013001| +die_sv|5.013001||p die_unwind||| die|||v dirp_dup||| @@ -1418,7 +1391,6 @@ do_dump_pad||| do_eof||| do_exec3||| -do_execfree||| do_exec||| do_gv_dump||5.006000| do_gvgv_dump||5.006000| @@ -1432,9 +1404,7 @@ do_ncmp||| do_oddball||| do_op_dump||5.006000| -do_open6||| do_open9||5.006000| -do_open_raw||| do_openn||5.007001| do_open||5.003070| do_pmop_dump||5.006000| @@ -1461,6 +1431,7 @@ do_vecset||| do_vop||| docatch||| +does_utf8_overflow|||n doeval_compile||| dofile||| dofindlabel||| @@ -1494,6 +1465,7 @@ dump_mstats||| dump_packsubs_perl||| dump_packsubs||5.006000| +dump_regex_sets_structures||| dump_sub_perl||| dump_sub||5.006000| dump_sv_child||| @@ -1503,8 +1475,9 @@ dump_vindent||5.006000| dumpuntil||| dup_attrlist||| +dup_warnings||| edit_distance|||n -emulate_cop_io||| +emulate_setlocale|||n eval_pv|5.006000||p eval_sv|5.006000||p exec_failed||| @@ -1526,17 +1499,18 @@ find_hash_subscript||| find_in_my_stash||| find_lexical_cv||| +find_next_masked|||n find_runcv_where||| find_runcv||5.008001| -find_rundefsvoffset||5.009002| find_rundefsv||5.013002| find_script||| -find_uninit_var||| +find_span_end_mask|||n +find_span_end|||n first_symbol|||n fixup_errno_string||| +foldEQ_latin1_s2_folded|||n foldEQ_latin1||5.013008|n foldEQ_locale||5.013002|n -foldEQ_utf8_flags||5.013010| foldEQ_utf8||5.013002| foldEQ||5.013002|n fold_constants||| @@ -1550,7 +1524,6 @@ force_word||| forget_pmop||| form_nocontext|||vn -form_short_octal_warning||| form||5.004000|v fp_dup||| fprintf_nocontext|||vn @@ -1559,7 +1532,9 @@ free_tied_hv_pool||| free_tmps||| gen_constant_list||| +get_ANYOFM_contents||| get_ANYOF_cp_list_for_ssc||| +get_and_check_backslash_N_name_wrapper||| get_and_check_backslash_N_name||| get_aux_mg||| get_av|5.006000||p @@ -1573,9 +1548,6 @@ get_debug_opts||| get_hash_seed||| get_hv|5.006000||p -get_invlist_iter_addr|||n -get_invlist_offset_addr|||n -get_invlist_previous_index_addr|||n get_mstats||| get_no_modify||| get_num||| @@ -1583,7 +1555,6 @@ get_op_names||5.005000| get_opargs||| get_ppaddr||5.006000| -get_re_arg||| get_sv|5.006000||p get_vtbl||5.005030| getcwd_sv||5.007002| @@ -1596,9 +1567,6 @@ grok_atoUV|||n grok_bin|5.007003||p grok_bslash_N||| -grok_bslash_c||| -grok_bslash_o||| -grok_bslash_x||| grok_hex|5.007003||p grok_infnan||5.021004| grok_number_flags||5.021002| @@ -1632,9 +1600,6 @@ gv_fetchmeth_sv_autoload||5.015004| gv_fetchmeth_sv||5.015004| gv_fetchmethod_autoload||5.004000| -gv_fetchmethod_pv_flags||5.015004| -gv_fetchmethod_pvn_flags||5.015004| -gv_fetchmethod_sv_flags||5.015004| gv_fetchmethod||| gv_fetchmeth||| gv_fetchpvn_flags|5.009002||p @@ -1662,26 +1627,23 @@ gv_stashpv||| gv_stashsvpvn_cached||| gv_stashsv||| -gv_try_downgrade||| handle_named_backref||| handle_possible_posix||| handle_regex_sets||| +handle_user_defined_property||| he_dup||| hek_dup||| hfree_next_entry||| -hfreeentries||| hsplit||| hv_assert||| hv_auxinit_internal|||n hv_auxinit||| -hv_backreferences_p||| hv_clear_placeholders||5.009001| hv_clear||| hv_common_key_len||5.010000| hv_common||5.010000| hv_copy_hints_hv||5.009004| hv_delayfree_ent||5.004000| -hv_delete_common||| hv_delete_ent||5.003070| hv_delete||| hv_eiter_p||5.009003| @@ -1695,15 +1657,14 @@ hv_fetch||| hv_fill||5.013002| hv_free_ent_ret||| +hv_free_entries||| hv_free_ent||5.004000| hv_iterinit||| hv_iterkeysv||5.003070| hv_iterkey||| -hv_iternext_flags||5.008000| hv_iternextsv||| hv_iternext||| hv_iterval||| -hv_kill_backrefs||| hv_ksplit||5.003070| hv_magic_check|||n hv_magic||| @@ -1712,12 +1673,12 @@ hv_placeholders_get||5.009003| hv_placeholders_p||| hv_placeholders_set||5.009003| +hv_pushkv||| hv_rand_set||5.018000| hv_riter_p||5.009003| hv_riter_set||5.009003| hv_scalar||5.009001| hv_store_ent||5.003070| -hv_store_flags||5.008000| hv_stores|5.009004||p hv_store||| hv_undef_flags||| @@ -1735,133 +1696,107 @@ init_dbargs||| init_debugger||| init_global_struct||| -init_i18nl10n||5.006000| -init_i18nl14n||5.006000| init_ids||| init_interp||| init_main_stash||| +init_named_cv||| init_perllib||| init_postdump_symbols||| init_predump_symbols||| init_stacks||5.005000| init_tm||5.007002| +init_uniprops||| inplace_aassign||| instr|||n intro_my||5.004000| intuit_method||| intuit_more||| invert||| -invlist_array|||n -invlist_clear||| -invlist_clone||| -invlist_contents||| -invlist_extend||| -invlist_highest|||n -invlist_is_iterating|||n -invlist_iterfinish|||n -invlist_iterinit|||n -invlist_iternext|||n -invlist_max|||n -invlist_previous_index|||n -invlist_replace_list_destroys_src||| -invlist_set_len||| -invlist_set_previous_index|||n -invlist_trim|||n invoke_exception_hook||| io_close||| +isALNUMC_A|||p isALNUMC|5.006000||p -isALNUM_lazy||5.021001| -isALPHANUMERIC||5.017008| -isALPHA||| +isALNUM_A|||p +isALNUM|||p +isALPHANUMERIC_A|||p +isALPHANUMERIC|5.017008|5.017008|p +isALPHA_A|||p +isALPHA|||p +isASCII_A|||p isASCII|5.006000||p +isBLANK_A|||p isBLANK|5.006001||p +isC9_STRICT_UTF8_CHAR|||n +isCNTRL_A|||p isCNTRL|5.006000||p -isDIGIT||| -isFOO_lc||| +isDIGIT_A|||p +isDIGIT|||p +isFF_OVERLONG|||n isFOO_utf8_lc||| -isGCB|||n +isGCB||| +isGRAPH_A|||p isGRAPH|5.006000||p -isIDCONT||5.017008| -isIDFIRST_lazy||5.021001| -isIDFIRST||| +isIDCONT_A|||p +isIDCONT|5.017008|5.017008|p +isIDFIRST_A|||p +isIDFIRST|||p isLB||| -isLOWER||| -isOCTAL||5.013005| +isLOWER_A|||p +isLOWER|||p +isOCTAL_A|||p +isOCTAL|5.013005|5.013005|p +isPRINT_A|||p isPRINT|5.004000||p +isPSXSPC_A|||p isPSXSPC|5.006001||p +isPUNCT_A|||p isPUNCT|5.006000||p isSB||| -isSPACE||| -isUPPER||| -isUTF8_CHAR||5.021001| +isSCRIPT_RUN||| +isSPACE_A|||p +isSPACE|||p +isSTRICT_UTF8_CHAR|||n +isUPPER_A|||p +isUPPER|||p +isUTF8_CHAR_flags||| +isUTF8_CHAR||5.021001|n isWB||| -isWORDCHAR||5.013006| +isWORDCHAR_A|||p +isWORDCHAR|5.013006|5.013006|p +isXDIGIT_A|||p isXDIGIT|5.006000||p is_an_int||| -is_ascii_string||5.011000| +is_ascii_string||5.011000|n +is_c9strict_utf8_string_loclen|||n +is_c9strict_utf8_string_loc|||n +is_c9strict_utf8_string|||n is_handle_constructor|||n is_invariant_string||5.021007|n is_lvalue_sub||5.007001| is_safe_syscall||5.019004| is_ssc_worth_it|||n -is_uni_alnum_lc||5.006000| -is_uni_alnumc_lc||5.017007| -is_uni_alnumc||5.017007| -is_uni_alnum||5.006000| -is_uni_alpha_lc||5.006000| -is_uni_alpha||5.006000| -is_uni_ascii_lc||5.006000| -is_uni_ascii||5.006000| -is_uni_blank_lc||5.017002| -is_uni_blank||5.017002| -is_uni_cntrl_lc||5.006000| -is_uni_cntrl||5.006000| -is_uni_digit_lc||5.006000| -is_uni_digit||5.006000| -is_uni_graph_lc||5.006000| -is_uni_graph||5.006000| -is_uni_idfirst_lc||5.006000| -is_uni_idfirst||5.006000| -is_uni_lower_lc||5.006000| -is_uni_lower||5.006000| -is_uni_print_lc||5.006000| -is_uni_print||5.006000| -is_uni_punct_lc||5.006000| -is_uni_punct||5.006000| -is_uni_space_lc||5.006000| -is_uni_space||5.006000| -is_uni_upper_lc||5.006000| -is_uni_upper||5.006000| -is_uni_xdigit_lc||5.006000| -is_uni_xdigit||5.006000| -is_utf8_alnumc||5.017007| -is_utf8_alnum||5.006000| -is_utf8_alpha||5.006000| -is_utf8_ascii||5.006000| -is_utf8_blank||5.017002| +is_strict_utf8_string_loclen|||n +is_strict_utf8_string_loc|||n +is_strict_utf8_string|||n is_utf8_char_buf||5.015008|n -is_utf8_char||5.006000|n -is_utf8_cntrl||5.006000| +is_utf8_common_with_len||| is_utf8_common||| -is_utf8_digit||5.006000| -is_utf8_graph||5.006000| -is_utf8_idcont||5.008000| -is_utf8_idfirst||5.006000| -is_utf8_lower||5.006000| -is_utf8_mark||5.006000| -is_utf8_perl_space||5.011001| -is_utf8_perl_word||5.011001| -is_utf8_posix_digit||5.011001| -is_utf8_print||5.006000| -is_utf8_punct||5.006000| -is_utf8_space||5.006000| +is_utf8_cp_above_31_bits|||n +is_utf8_fixed_width_buf_flags|||n +is_utf8_fixed_width_buf_loc_flags|||n +is_utf8_fixed_width_buf_loclen_flags|||n +is_utf8_invariant_string_loc|||n +is_utf8_invariant_string|||n +is_utf8_non_invariant_string|||n +is_utf8_overlong_given_start_byte_ok|||n +is_utf8_string_flags|||n +is_utf8_string_loc_flags|||n +is_utf8_string_loclen_flags|||n is_utf8_string_loclen||5.009003|n is_utf8_string_loc||5.008001|n is_utf8_string||5.006001|n -is_utf8_upper||5.006000| -is_utf8_xdigit||5.006000| -is_utf8_xidcont||5.013010| -is_utf8_xidfirst||5.013010| +is_utf8_valid_partial_char_flags|||n +is_utf8_valid_partial_char|||n isa_lookup||| isinfnansv||| isinfnan||5.021004|n @@ -1871,22 +1806,8 @@ join_exact||| keyword_plugin_standard||| keyword||| -leave_adjust_stacks||5.023008| leave_scope||| -lex_bufutf8||5.011002| -lex_discard_to||5.011002| -lex_grow_linestr||5.011002| -lex_next_chunk||5.011002| -lex_peek_unichar||5.011002| -lex_read_space||5.011002| -lex_read_to||5.011002| -lex_read_unichar||5.011002| -lex_start||5.009005| -lex_stuff_pvn||5.011002| lex_stuff_pvs||5.013005| -lex_stuff_pv||5.013006| -lex_stuff_sv||5.011002| -lex_unstuff||5.011002| listkids||| list||| load_module_nocontext|||vn @@ -1951,6 +1872,7 @@ magic_setlvref||| magic_setmglob||| magic_setnkeys||| +magic_setnonelem||| magic_setpack||| magic_setpos||| magic_setregexp||| @@ -1983,9 +1905,9 @@ mem_log_free|||n mem_log_realloc|||n mess_alloc||| -mess_nocontext|||vn -mess_sv||5.013001| -mess||5.006000|v +mess_nocontext|||pvn +mess_sv|5.013001||p +mess|5.006000||pv mfree||5.007002|n mg_clear||| mg_copy||| @@ -1994,9 +1916,9 @@ mg_findext|5.013008||pn mg_find|||n mg_free_type||5.013006| +mg_freeext||| mg_free||| mg_get||| -mg_length||5.005000| mg_localize||| mg_magical|||n mg_set||| @@ -2025,14 +1947,13 @@ mro_set_mro||5.010001| mro_set_private_data||5.010001| mul128||| -mulexp10|||n +multiconcat_stringify||| multideref_stringify||| my_atof2||5.007002| +my_atof3||| my_atof||5.006000| my_attrs||| -my_bcopy||5.004050|n my_bytes_to_utf8|||n -my_bzero|||n my_chsize||| my_clearenv||| my_cxt_index||| @@ -2046,22 +1967,26 @@ my_kid||| my_lstat_flags||| my_lstat||5.024000| -my_memcmp|||n -my_memset|||n +my_memrchr|||n +my_mkostemp|||n +my_mkstemp_cloexec|||n +my_mkstemp|||n +my_nl_langinfo|||n my_pclose||5.003070| my_popen_list||5.007001| my_popen||5.003070| my_setenv||| -my_setlocale||| my_snprintf|5.009004||pvn my_socketpair||5.007003|n my_sprintf|5.009003||pvn my_stat_flags||| my_stat||5.024000| -my_strerror||5.021001| +my_strerror||| my_strftime||5.007002| my_strlcat|5.009004||pn my_strlcpy|5.009004||pn +my_strnlen|||pn +my_strtod|||n my_unexec||| my_vsnprintf||5.009004|n need_utf8|||n @@ -2084,7 +2009,6 @@ newFOROP||5.013007| newGIVENOP||5.009003| newGIVWHENOP||| -newGP||| newGVOP||| newGVREF||| newGVgen_flags||5.015004| @@ -2103,9 +2027,6 @@ newMYSUB||5.017004| newNULLLIST||| newOP||| -newPADNAMELIST||5.021007|n -newPADNAMEouter||5.021007|n -newPADNAMEpvn||5.021007|n newPADOP||| newPMOP||| newPROG||| @@ -2138,6 +2059,8 @@ newSVpvs|5.009003||p newSVpv||| newSVrv||| +newSVsv_flags||| +newSVsv_nomg||| newSVsv||| newSVuv|5.006000||p newSV||| @@ -2146,19 +2069,19 @@ newWHENOP||5.009003| newWHILEOP||5.013007| newXS_deffile||| -newXS_flags||5.009004| newXS_len_flags||| newXSproto||5.006000| newXS||5.006000| -new_collate||5.006000| +new_collate||| new_constant||| -new_ctype||5.006000| +new_ctype||| new_he||| new_logop||| -new_numeric||5.006000| +new_msg_hv||| +new_numeric||| +new_regcurly|||n new_stackinfo||5.005000| new_version||5.009000| -new_warnings_bitfield||| next_symbol||| nextargv||| nextchar||| @@ -2170,12 +2093,14 @@ not_a_number||| not_incrementable||| nothreadhook||5.008000| +notify_parser_that_changed_to_utf8||| nuke_stacks||| num_overflow|||n oopsAV||| oopsHV||| op_append_elem||5.013006| op_append_list||5.013006| +op_class||| op_clear||| op_contextualize||5.013006| op_convert_list||5.021006| @@ -2184,19 +2109,14 @@ op_integerize||| op_linklist||5.013006| op_lvalue_flags||| -op_lvalue||5.013007| op_null||5.007002| op_parent|||n op_prepend_elem||5.013006| -op_refcnt_dec||| -op_refcnt_inc||| op_refcnt_lock||5.009002| op_refcnt_unlock||5.009002| op_relocate_sv||| -op_scope||5.013007| op_sibling_splice||5.021002|n op_std_init||| -op_unscope||| open_script||| openn_cleanup||| openn_setup||| @@ -2204,7 +2124,9 @@ opslab_force_free||| opslab_free_nopad||| opslab_free||| -output_or_return_posix_warnings||| +optimize_optree||| +optimize_op||| +output_posix_warnings||| pMY_CXT_|5.007003||p pMY_CXT|5.007003||p pTHX_|5.006000||p @@ -2222,7 +2144,6 @@ pad_add_name_sv||5.015001| pad_add_weakref||| pad_alloc_name||| -pad_alloc||| pad_block_start||| pad_check_dup||| pad_compname_type||5.009003| @@ -2240,30 +2161,18 @@ pad_setsv||| pad_sv||| pad_swipe||| -pad_tidy||5.008001| padlist_dup||| padlist_store||| padname_dup||| padname_free||| padnamelist_dup||| -padnamelist_fetch||5.021007|n padnamelist_free||| -padnamelist_store||5.021007| -parse_arithexpr||5.013008| -parse_barestmt||5.013007| -parse_block||5.013007| parse_body||| -parse_fullexpr||5.013008| -parse_fullstmt||5.013005| parse_gv_stash_name||| parse_ident||| -parse_label||5.013007| -parse_listexpr||5.013008| parse_lparen_question_flags||| -parse_stmtseq||5.013006| -parse_subsignature||| -parse_termexpr||5.013008| parse_unicode_opts||| +parse_uniprop_string||| parser_dup||| parser_free_nexttoke_ops||| parser_free||| @@ -2292,11 +2201,12 @@ pregfree2||5.011000| pregfree||| prescan_version||5.011004| +print_bytes_for_locale||| +print_collxfrm_input_and_return||| printbuf||| printf_nocontext|||vn process_special_blocks||| ptr_hash|||n -ptr_table_clear||5.009005| ptr_table_fetch||5.009005| ptr_table_find|||n ptr_table_free||5.009005| @@ -2314,7 +2224,6 @@ pv_pretty|5.009004||p pv_uni_display||5.007003| qerror||| -qsortsvu||| quadmath_format_needed|||n quadmath_format_single|||n re_compile||5.009005| @@ -2362,15 +2271,14 @@ reg_numbered_buff_length||| reg_numbered_buff_store||| reg_qr_package||| -reg_recode||| reg_scan_name||| reg_skipcomment|||n reg_temp_copy||| reganode||| regatom||| regbranch||| -regclass_swash||5.009004| regclass||| +regcp_restore||| regcppop||| regcppush||| regcurly|||n @@ -2405,6 +2313,7 @@ require_pv||5.006000| require_tie_mod||| restore_magic||| +restore_switched_locale||| rninstr|||n rpeep||| rsignal_restore||| @@ -2476,6 +2385,7 @@ save_sptr||| save_strlen||| save_svref||| +save_to_buffer|||n save_vptr||5.006000| savepvn||| savepvs||5.009003| @@ -2487,7 +2397,6 @@ savestack_grow_cnt||5.008001| savestack_grow||| savesvpv||5.009002| -savetmps||5.023008| sawparens||| scalar_mod_type|||n scalarboolean||| @@ -2506,23 +2415,28 @@ scan_num||5.007001| scan_oct||| scan_pat||| -scan_str||| scan_subst||| scan_trans||| scan_version||5.009001| scan_vstring||5.009005| -scan_word||| search_const||| seed||5.008001| sequence_num||| set_ANYOF_arg||| set_caret_X||| set_context||5.006000|n -set_numeric_local||5.006000| set_numeric_radix||5.006000| set_numeric_standard||5.006000| +set_numeric_underlying||| set_padlist|||n +set_regex_pv||| setdefout||| +setfd_cloexec_for_nonsysfd||| +setfd_cloexec_or_inhexec_by_sysfdness||| +setfd_cloexec|||n +setfd_inhexec_for_sysfd||| +setfd_inhexec|||n +setlocale_debug_string|||n share_hek_flags||| share_hek||5.004000| should_warn_nl|||n @@ -2530,7 +2444,6 @@ sighandler|||n simplify_sort||| skip_to_be_ignored_text||| -skipspace_flags||| softref2xv||| sortcv_stacked||| sortcv_xsub||| @@ -2552,7 +2465,6 @@ ssc_or||| ssc_union||| stack_grow||| -start_glob||| start_subparse||5.004000| stdize_locale||| strEQ||| @@ -2579,7 +2491,6 @@ sv_2iv_flags||5.009001| sv_2iv||| sv_2mortal||| -sv_2num||| sv_2nv_flags||5.013001| sv_2pv_flags|5.007002||p sv_2pv_nolen|5.006000||p @@ -2653,10 +2564,8 @@ sv_exp_grow||| sv_force_normal_flags||5.007001| sv_force_normal||5.006000| -sv_free2||| sv_free_arenas||| sv_free||| -sv_get_backrefs||5.021008|n sv_gets||5.003070| sv_grow||| sv_i_ncmp||| @@ -2667,7 +2576,6 @@ sv_isa||| sv_isobject||| sv_iv||5.005000| -sv_kill_backrefs||| sv_len_utf8_nomg||| sv_len_utf8||5.006000| sv_len||| @@ -2713,12 +2621,15 @@ sv_report_used||| sv_resetpvn||| sv_reset||| +sv_rvunweaken||| sv_rvweaken||5.006000| +sv_set_undef||| sv_sethek||| sv_setiv_mg|5.004050||p sv_setiv||| sv_setnv_mg|5.006000||p sv_setnv||| +sv_setpv_bufsize||| sv_setpv_mg|5.004050||p sv_setpvf_mg_nocontext|||pvn sv_setpvf_mg|5.006000|5.004000|pv @@ -2737,13 +2648,13 @@ sv_setref_pvs||5.024000| sv_setref_pv||| sv_setref_uv||5.007001| -sv_setsv_cow||| sv_setsv_flags||5.007002| sv_setsv_mg|5.004050||p sv_setsv_nomg|5.007002||p sv_setsv||| sv_setuv_mg|5.004050||p sv_setuv|5.004000||p +sv_string_from_errnum||| sv_tainted||5.004000| sv_taint||5.004000| sv_true||5.005000| @@ -2758,8 +2669,8 @@ sv_usepvn_flags||5.009004| sv_usepvn_mg|5.004050||p sv_usepvn||| -sv_utf8_decode||5.006000| -sv_utf8_downgrade||5.006000| +sv_utf8_decode||| +sv_utf8_downgrade||| sv_utf8_encode||5.006000| sv_utf8_upgrade_flags_grow||5.011000| sv_utf8_upgrade_flags||5.007002| @@ -2775,11 +2686,10 @@ sv_vsetpvf|5.006000|5.004000|p svtype||| swallow_bom||| -swash_fetch||5.007002| -swash_init||5.006000| -swash_scan_list_line||| swatch_get||| -sync_locale||5.021004| +switch_category_locale_to_template||| +switch_to_global_locale|||n +sync_locale||5.021004|n sys_init3||5.010000|n sys_init||5.010000|n sys_intern_clear||| @@ -2790,43 +2700,39 @@ taint_proper||| tied_method|||v tmps_grow_p||| +toFOLD_utf8_safe||| toFOLD_utf8||5.019001| toFOLD_uvchr||5.023009| toFOLD||5.019001| toLOWER_L1||5.019001| toLOWER_LC||5.004000| +toLOWER_utf8_safe||| toLOWER_utf8||5.015007| toLOWER_uvchr||5.023009| toLOWER||| +toTITLE_utf8_safe||| toTITLE_utf8||5.015007| toTITLE_uvchr||5.023009| toTITLE||5.019001| +toUPPER_utf8_safe||| toUPPER_utf8||5.015007| toUPPER_uvchr||5.023009| toUPPER||| to_byte_substr||| to_lower_latin1|||n -to_uni_fold||5.007003| -to_uni_lower_lc||5.006000| -to_uni_lower||5.007003| -to_uni_title_lc||5.006000| -to_uni_title||5.007003| -to_uni_upper_lc||5.006000| -to_uni_upper||5.007003| -to_utf8_case||5.007003| -to_utf8_fold||5.015007| -to_utf8_lower||5.015007| to_utf8_substr||| -to_utf8_title||5.015007| -to_utf8_upper||5.015007| tokenize_use||| tokeq||| tokereport||| too_few_arguments_pv||| too_many_arguments_pv||| translate_substr_offsets|||n +traverse_op_tree||| try_amagic_bin||| try_amagic_un||| +turkic_fc||| +turkic_lc||| +turkic_uc||| uiv_2buf|||n unlnk||| unpack_rec||| @@ -2844,16 +2750,17 @@ utf16_to_utf8_reversed||5.006001| utf16_to_utf8||5.006001| utf8_distance||5.006000| +utf8_hop_back|||n +utf8_hop_forward|||n +utf8_hop_safe|||n utf8_hop||5.006000|n utf8_length||5.007001| utf8_mg_len_cache_update||| utf8_mg_pos_cache_update||| -utf8_to_bytes||5.006001| -utf8_to_uvchr_buf||5.015009| -utf8_to_uvchr||5.007001| -utf8_to_uvuni_buf||5.015009| -utf8_to_uvuni||5.007001| -utf8n_to_uvchr||5.007001| +utf8_to_uvchr_buf|5.015009|5.015009|p +utf8_to_uvchr|||p +utf8n_to_uvchr_error|||n +utf8n_to_uvchr||5.007001|n utf8n_to_uvuni||5.007001| utilize||| uvchr_to_utf8_flags||5.007003| @@ -2861,10 +2768,9 @@ uvoffuni_to_utf8_flags||5.019004| uvuni_to_utf8_flags||5.007003| uvuni_to_utf8||5.007001| -valid_utf8_to_uvchr||5.015009| -valid_utf8_to_uvuni||5.015009| -validate_proto||| +valid_utf8_to_uvchr|||n validate_suid||| +variant_under_utf8_count|||n varname||| vcmp||5.009000| vcroak||5.006000| @@ -2874,7 +2780,7 @@ vivify_defelem||| vivify_ref||| vload_module|5.006000||p -vmess||5.006000| +vmess|5.006000|5.006000|p vnewSVpvf|5.006000|5.004000|p vnormal||5.009002| vnumify||5.009000| @@ -2883,8 +2789,9 @@ vwarner||5.006000| vwarn||5.006000| wait4pid||| -warn_nocontext|||vn -warn_sv||5.013001| +warn_nocontext|||pvn +warn_on_first_deprecated_use||| +warn_sv|5.013001||p warner_nocontext|||vn warner|5.006000|5.004000|pv warn|||v @@ -2895,6 +2802,7 @@ whichsig_sv||5.015004| whichsig||| win32_croak_not_implemented|||n +win32_setlocale||| with_queued_errors||| wrap_op_checker||5.015008| write_to_stderr||| @@ -2906,6 +2814,7 @@ yyerror||| yylex||| yyparse||| +yyquit||| yyunlex||| yywarn||| ); @@ -3673,8 +3582,8 @@ # endif #endif -#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) -#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION)) +#define D_PPP_DEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) +#define PERL_BCDVERSION ((D_PPP_DEC2BCD(PERL_REVISION)<<24)|(D_PPP_DEC2BCD(PERL_VERSION)<<12)|D_PPP_DEC2BCD(PERL_SUBVERSION)) /* It is very unlikely that anyone will try to use this with Perl 6 (or greater), but who knows. @@ -4071,139 +3980,6 @@ #ifndef UVSIZE # define UVSIZE IVSIZE #endif -#ifndef sv_setuv -# define sv_setuv(sv, uv) \ - STMT_START { \ - UV TeMpUv = uv; \ - if (TeMpUv <= IV_MAX) \ - sv_setiv(sv, TeMpUv); \ - else \ - sv_setnv(sv, (double)TeMpUv); \ - } STMT_END -#endif -#ifndef newSVuv -# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) -#endif -#ifndef sv_2uv -# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) -#endif - -#ifndef SvUVX -# define SvUVX(sv) ((UV)SvIVX(sv)) -#endif - -#ifndef SvUVXx -# define SvUVXx(sv) SvUVX(sv) -#endif - -#ifndef SvUV -# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) -#endif - -#ifndef SvUVx -# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) -#endif - -/* Hint: sv_uv - * Always use the SvUVx() macro instead of sv_uv(). - */ -#ifndef sv_uv -# define sv_uv(sv) SvUVx(sv) -#endif - -#if !defined(SvUOK) && defined(SvIOK_UV) -# define SvUOK(sv) SvIOK_UV(sv) -#endif -#ifndef XST_mUV -# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) -#endif - -#ifndef XSRETURN_UV -# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END -#endif -#ifndef PUSHu -# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END -#endif - -#ifndef XPUSHu -# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END -#endif - -#ifdef HAS_MEMCMP -#ifndef memNE -# define memNE(s1,s2,l) (memcmp(s1,s2,l)) -#endif - -#ifndef memEQ -# define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) -#endif - -#else -#ifndef memNE -# define memNE(s1,s2,l) (bcmp(s1,s2,l)) -#endif - -#ifndef memEQ -# define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) -#endif - -#endif -#ifndef memEQs -# define memEQs(s1, l, s2) \ - (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1))) -#endif - -#ifndef memNEs -# define memNEs(s1, l, s2) !memEQs(s1, l, s2) -#endif -#ifndef MoveD -# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) -#endif - -#ifndef CopyD -# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) -#endif - -#ifdef HAS_MEMSET -#ifndef ZeroD -# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) -#endif - -#else -#ifndef ZeroD -# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) -#endif - -#endif -#ifndef PoisonWith -# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) -#endif - -#ifndef PoisonNew -# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) -#endif - -#ifndef PoisonFree -# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) -#endif - -#ifndef Poison -# define Poison(d,n,t) PoisonFree(d,n,t) -#endif -#ifndef Newx -# define Newx(v,n,t) New(0,v,n,t) -#endif - -#ifndef Newxc -# define Newxc(v,n,t,c) Newc(0,v,n,t,c) -#endif - -#ifndef Newxz -# define Newxz(v,n,t) Newz(0,v,n,t) -#endif -#ifndef PERL_MAGIC_qr -# define PERL_MAGIC_qr 'r' -#endif #ifndef cBOOL # define cBOOL(cbool) ((cbool) ? (bool)1 : (bool)0) #endif @@ -4226,6 +4002,22 @@ #ifndef OpMAYBESIB_set # define OpMAYBESIB_set(o, sib, parent) ((o)->op_sibling = (sib)) +#endif + +#ifndef HEf_SVKEY +# define HEf_SVKEY -2 +#endif + +#if defined(DEBUGGING) && !defined(__COVERITY__) +#ifndef __ASSERT_ +# define __ASSERT_(statement) assert(statement), +#endif + +#else +#ifndef __ASSERT_ +# define __ASSERT_(statement) +#endif + #endif #ifndef SvRX @@ -4236,12 +4028,13 @@ extern void * DPPP_(my_SvRX)(pTHX_ SV *rv); #endif +#if defined(NEED_SvRX) || defined(NEED_SvRX_GLOBAL) + #ifdef SvRX # undef SvRX #endif #define SvRX(a) DPPP_(my_SvRX)(aTHX_ a) -#if defined(NEED_SvRX) || defined(NEED_SvRX_GLOBAL) void * DPPP_(my_SvRX)(pTHX_ SV *rv) @@ -4421,6 +4214,13 @@ #ifndef AvFILLp # define AvFILLp AvFILL #endif +#ifndef av_tindex +# define av_tindex AvFILL +#endif + +#ifndef av_top_index +# define av_top_index AvFILL +#endif #ifndef ERRSV # define ERRSV get_sv("@",FALSE) #endif @@ -4542,44 +4342,136 @@ typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*); #endif -#ifndef isPSXSPC -# define isPSXSPC(c) (isSPACE(c) || (c) == '\v') -#endif - -#ifndef isBLANK -# define isBLANK(c) ((c) == ' ' || (c) == '\t') + +#ifndef WIDEST_UTYPE +# ifdef QUADKIND +# ifdef U64TYPE +# define WIDEST_UTYPE U64TYPE +# else +# define WIDEST_UTYPE Quad_t +# endif +# else +# define WIDEST_UTYPE U32 +# endif #endif #ifdef EBCDIC -#ifndef isALNUMC -# define isALNUMC(c) isalnum(c) -#endif - + +/* This is the first version where these macros are fully correct. Relying on + * the C library functions, as earlier releases did, causes problems with + * locales */ +# if (PERL_BCDVERSION < 0x5022000) +# undef isALNUM +# undef isALNUM_A +# undef isALNUMC +# undef isALNUMC_A +# undef isALPHA +# undef isALPHA_A +# undef isALPHANUMERIC +# undef isALPHANUMERIC_A +# undef isASCII +# undef isASCII_A +# undef isBLANK +# undef isBLANK_A +# undef isCNTRL +# undef isCNTRL_A +# undef isDIGIT +# undef isDIGIT_A +# undef isGRAPH +# undef isGRAPH_A +# undef isIDCONT +# undef isIDCONT_A +# undef isIDFIRST +# undef isIDFIRST_A +# undef isLOWER +# undef isLOWER_A +# undef isOCTAL +# undef isOCTAL_A +# undef isPRINT +# undef isPRINT_A +# undef isPSXSPC +# undef isPSXSPC_A +# undef isPUNCT +# undef isPUNCT_A +# undef isSPACE +# undef isSPACE_A +# undef isUPPER +# undef isUPPER_A +# undef isWORDCHAR +# undef isWORDCHAR_A +# undef isXDIGIT +# undef isXDIGIT_A +# endif #ifndef isASCII -# define isASCII(c) isascii(c) -#endif - +# define isASCII(c) (isCNTRL(c) || isPRINT(c)) +#endif + + /* The below is accurate for all EBCDIC code pages supported by + * all the versions of Perl overridden by this */ #ifndef isCNTRL -# define isCNTRL(c) iscntrl(c) -#endif - -#ifndef isGRAPH -# define isGRAPH(c) isgraph(c) -#endif - -#ifndef isPRINT -# define isPRINT(c) isprint(c) -#endif - -#ifndef isPUNCT -# define isPUNCT(c) ispunct(c) -#endif - -#ifndef isXDIGIT -# define isXDIGIT(c) isxdigit(c) -#endif - -#else +# define isCNTRL(c) ( (c) == '\0' || (c) == '\a' || (c) == '\b' \ + || (c) == '\f' || (c) == '\n' || (c) == '\r' \ + || (c) == '\t' || (c) == '\v' \ + || ((c) <= 3 && (c) >= 1) /* SOH, STX, ETX */ \ + || (c) == 7 /* U+7F DEL */ \ + || ((c) <= 0x13 && (c) >= 0x0E) /* SO, SI */ \ + /* DLE, DC[1-3] */ \ + || (c) == 0x18 /* U+18 CAN */ \ + || (c) == 0x19 /* U+19 EOM */ \ + || ((c) <= 0x1F && (c) >= 0x1C) /* [FGRU]S */ \ + || (c) == 0x26 /* U+17 ETB */ \ + || (c) == 0x27 /* U+1B ESC */ \ + || (c) == 0x2D /* U+05 ENQ */ \ + || (c) == 0x2E /* U+06 ACK */ \ + || (c) == 0x32 /* U+16 SYN */ \ + || (c) == 0x37 /* U+04 EOT */ \ + || (c) == 0x3C /* U+14 DC4 */ \ + || (c) == 0x3D /* U+15 NAK */ \ + || (c) == 0x3F /* U+1A SUB */ \ + ) +#endif + +/* The ordering of the tests in this and isUPPER are to exclude most characters + * early */ +#ifndef isLOWER +# define isLOWER(c) ( (c) >= 'a' && (c) <= 'z' \ + && ( (c) <= 'i' \ + || ((c) >= 'j' && (c) <= 'r') \ + || (c) >= 's')) +#endif + +#ifndef isUPPER +# define isUPPER(c) ( (c) >= 'A' && (c) <= 'Z' \ + && ( (c) <= 'I' \ + || ((c) >= 'J' && (c) <= 'R') \ + || (c) >= 'S')) +#endif + +#else /* Above is EBCDIC; below is ASCII */ + +# if (PERL_BCDVERSION < 0x5004000) +/* The implementation of these in older perl versions can give wrong results if + * the C program locale is set to other than the C locale */ +# undef isALNUM +# undef isALNUM_A +# undef isALPHA +# undef isALPHA_A +# undef isDIGIT +# undef isDIGIT_A +# undef isIDFIRST +# undef isIDFIRST_A +# undef isLOWER +# undef isLOWER_A +# undef isUPPER +# undef isUPPER_A +# endif + +# if (PERL_BCDVERSION < 0x5008000) +/* Hint: isCNTRL + * Earlier perls omitted DEL */ +# undef isCNTRL +# endif + # if (PERL_BCDVERSION < 0x5010000) /* Hint: isPRINT * The implementation in older perl versions includes all of the @@ -4587,21 +4479,24 @@ * Devel::PPPort always overrides a present buggy version. */ # undef isPRINT +# undef isPRINT_A # endif -#ifdef HAS_QUAD -# ifdef U64TYPE -# define WIDEST_UTYPE U64TYPE -# else -# define WIDEST_UTYPE Quad_t +# if (PERL_BCDVERSION < 0x5014000) +/* Hint: isASCII + * The implementation in older perl versions always returned true if the + * parameter was a signed char + */ +# undef isASCII +# undef isASCII_A # endif -#else -# define WIDEST_UTYPE U32 -#endif -#ifndef isALNUMC -# define isALNUMC(c) (isALPHA(c) || isDIGIT(c)) -#endif - + +# if (PERL_BCDVERSION < 0x5020000) +/* Hint: isSPACE + * The implementation in older perl versions didn't include \v */ +# undef isSPACE +# undef isSPACE_A +# endif #ifndef isASCII # define isASCII(c) ((WIDEST_UTYPE) (c) <= 127) #endif @@ -4610,22 +4505,169 @@ # define isCNTRL(c) ((WIDEST_UTYPE) (c) < ' ' || (c) == 127) #endif +#ifndef isLOWER +# define isLOWER(c) ((c) >= 'a' && (c) <= 'z') +#endif + +#ifndef isUPPER +# define isUPPER(c) ((c) <= 'Z' && (c) >= 'A') +#endif + +#endif /* Below are definitions common to EBCDIC and ASCII */ +#ifndef isALNUM +# define isALNUM(c) isWORDCHAR(c) +#endif + +#ifndef isALNUMC +# define isALNUMC(c) isALPHANUMERIC(c) +#endif + +#ifndef isALPHA +# define isALPHA(c) (isUPPER(c) || isLOWER(c)) +#endif + +#ifndef isALPHANUMERIC +# define isALPHANUMERIC(c) (isALPHA(c) || isDIGIT(c)) +#endif + +#ifndef isBLANK +# define isBLANK(c) ((c) == ' ' || (c) == '\t') +#endif + +#ifndef isDIGIT +# define isDIGIT(c) ((c) <= '9' && (c) >= '0') +#endif + #ifndef isGRAPH -# define isGRAPH(c) (isALNUM(c) || isPUNCT(c)) +# define isGRAPH(c) (isWORDCHAR(c) || isPUNCT(c)) +#endif + +#ifndef isIDCONT +# define isIDCONT(c) isWORDCHAR(c) +#endif + +#ifndef isIDFIRST +# define isIDFIRST(c) (isALPHA(c) || (c) == '_') +#endif + +#ifndef isOCTAL +# define isOCTAL(c) (((WIDEST_UTYPE)((c)) & ~7) == '0') #endif #ifndef isPRINT -# define isPRINT(c) (((c) >= 32 && (c) < 127)) +# define isPRINT(c) (isGRAPH(c) || (c) == ' ') +#endif + +#ifndef isPSXSPC +# define isPSXSPC(c) isSPACE(c) #endif #ifndef isPUNCT -# define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126)) +# define isPUNCT(c) ( (c) == '-' || (c) == '!' || (c) == '"' \ + || (c) == '#' || (c) == '$' || (c) == '%' \ + || (c) == '&' || (c) == '\'' || (c) == '(' \ + || (c) == ')' || (c) == '*' || (c) == '+' \ + || (c) == ',' || (c) == '.' || (c) == '/' \ + || (c) == ':' || (c) == ';' || (c) == '<' \ + || (c) == '=' || (c) == '>' || (c) == '?' \ + || (c) == '@' || (c) == '[' || (c) == '\\' \ + || (c) == ']' || (c) == '^' || (c) == '_' \ + || (c) == '`' || (c) == '{' || (c) == '|' \ + || (c) == '}' || (c) == '~') +#endif + +#ifndef isSPACE +# define isSPACE(c) ( isBLANK(c) || (c) == '\n' || (c) == '\r' \ + || (c) == '\v' || (c) == '\f') +#endif + +#ifndef isWORDCHAR +# define isWORDCHAR(c) (isALPHANUMERIC(c) || (c) == '_') #endif #ifndef isXDIGIT -# define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) -#endif - +# define isXDIGIT(c) ( isDIGIT(c) \ + || ((c) >= 'a' && (c) <= 'f') \ + || ((c) >= 'A' && (c) <= 'F')) +#endif +#ifndef isALNUM_A +# define isALNUM_A isALNUM +#endif + +#ifndef isALNUMC_A +# define isALNUMC_A isALNUMC +#endif + +#ifndef isALPHA_A +# define isALPHA_A isALPHA +#endif + +#ifndef isALPHANUMERIC_A +# define isALPHANUMERIC_A isALPHANUMERIC +#endif + +#ifndef isASCII_A +# define isASCII_A isASCII +#endif + +#ifndef isBLANK_A +# define isBLANK_A isBLANK +#endif + +#ifndef isCNTRL_A +# define isCNTRL_A isCNTRL +#endif + +#ifndef isDIGIT_A +# define isDIGIT_A isDIGIT +#endif + +#ifndef isGRAPH_A +# define isGRAPH_A isGRAPH +#endif + +#ifndef isIDCONT_A +# define isIDCONT_A isIDCONT +#endif + +#ifndef isIDFIRST_A +# define isIDFIRST_A isIDFIRST +#endif + +#ifndef isLOWER_A +# define isLOWER_A isLOWER +#endif + +#ifndef isOCTAL_A +# define isOCTAL_A isOCTAL +#endif + +#ifndef isPRINT_A +# define isPRINT_A isPRINT +#endif + +#ifndef isPSXSPC_A +# define isPSXSPC_A isPSXSPC +#endif + +#ifndef isPUNCT_A +# define isPUNCT_A isPUNCT +#endif + +#ifndef isSPACE_A +# define isSPACE_A isSPACE +#endif + +#ifndef isUPPER_A +# define isUPPER_A isUPPER +#endif + +#ifndef isWORDCHAR_A +# define isWORDCHAR_A isWORDCHAR +#endif + +#ifndef isXDIGIT_A +# define isXDIGIT_A isXDIGIT #endif /* Until we figure out how to support this in older perls... */ @@ -4643,6 +4685,1071 @@ #ifndef C_ARRAY_END # define C_ARRAY_END(a) ((a) + C_ARRAY_LENGTH(a)) +#endif +#ifndef LIKELY +# define LIKELY(x) (x) +#endif + +#ifndef UNLIKELY +# define UNLIKELY(x) (x) +#endif +#ifndef UNICODE_REPLACEMENT +# define UNICODE_REPLACEMENT 0xFFFD +#endif + +#ifndef MUTABLE_PTR +#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) +# define MUTABLE_PTR(p) ({ void *_p = (p); _p; }) +#else +# define MUTABLE_PTR(p) ((void *) (p)) +#endif +#endif +#ifndef MUTABLE_SV +# define MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p)) +#endif +#ifndef WARN_ALL +# define WARN_ALL 0 +#endif + +#ifndef WARN_CLOSURE +# define WARN_CLOSURE 1 +#endif + +#ifndef WARN_DEPRECATED +# define WARN_DEPRECATED 2 +#endif + +#ifndef WARN_EXITING +# define WARN_EXITING 3 +#endif + +#ifndef WARN_GLOB +# define WARN_GLOB 4 +#endif + +#ifndef WARN_IO +# define WARN_IO 5 +#endif + +#ifndef WARN_CLOSED +# define WARN_CLOSED 6 +#endif + +#ifndef WARN_EXEC +# define WARN_EXEC 7 +#endif + +#ifndef WARN_LAYER +# define WARN_LAYER 8 +#endif + +#ifndef WARN_NEWLINE +# define WARN_NEWLINE 9 +#endif + +#ifndef WARN_PIPE +# define WARN_PIPE 10 +#endif + +#ifndef WARN_UNOPENED +# define WARN_UNOPENED 11 +#endif + +#ifndef WARN_MISC +# define WARN_MISC 12 +#endif + +#ifndef WARN_NUMERIC +# define WARN_NUMERIC 13 +#endif + +#ifndef WARN_ONCE +# define WARN_ONCE 14 +#endif + +#ifndef WARN_OVERFLOW +# define WARN_OVERFLOW 15 +#endif + +#ifndef WARN_PACK +# define WARN_PACK 16 +#endif + +#ifndef WARN_PORTABLE +# define WARN_PORTABLE 17 +#endif + +#ifndef WARN_RECURSION +# define WARN_RECURSION 18 +#endif + +#ifndef WARN_REDEFINE +# define WARN_REDEFINE 19 +#endif + +#ifndef WARN_REGEXP +# define WARN_REGEXP 20 +#endif + +#ifndef WARN_SEVERE +# define WARN_SEVERE 21 +#endif + +#ifndef WARN_DEBUGGING +# define WARN_DEBUGGING 22 +#endif + +#ifndef WARN_INPLACE +# define WARN_INPLACE 23 +#endif + +#ifndef WARN_INTERNAL +# define WARN_INTERNAL 24 +#endif + +#ifndef WARN_MALLOC +# define WARN_MALLOC 25 +#endif + +#ifndef WARN_SIGNAL +# define WARN_SIGNAL 26 +#endif + +#ifndef WARN_SUBSTR +# define WARN_SUBSTR 27 +#endif + +#ifndef WARN_SYNTAX +# define WARN_SYNTAX 28 +#endif + +#ifndef WARN_AMBIGUOUS +# define WARN_AMBIGUOUS 29 +#endif + +#ifndef WARN_BAREWORD +# define WARN_BAREWORD 30 +#endif + +#ifndef WARN_DIGIT +# define WARN_DIGIT 31 +#endif + +#ifndef WARN_PARENTHESIS +# define WARN_PARENTHESIS 32 +#endif + +#ifndef WARN_PRECEDENCE +# define WARN_PRECEDENCE 33 +#endif + +#ifndef WARN_PRINTF +# define WARN_PRINTF 34 +#endif + +#ifndef WARN_PROTOTYPE +# define WARN_PROTOTYPE 35 +#endif + +#ifndef WARN_QW +# define WARN_QW 36 +#endif + +#ifndef WARN_RESERVED +# define WARN_RESERVED 37 +#endif + +#ifndef WARN_SEMICOLON +# define WARN_SEMICOLON 38 +#endif + +#ifndef WARN_TAINT +# define WARN_TAINT 39 +#endif + +#ifndef WARN_THREADS +# define WARN_THREADS 40 +#endif + +#ifndef WARN_UNINITIALIZED +# define WARN_UNINITIALIZED 41 +#endif + +#ifndef WARN_UNPACK +# define WARN_UNPACK 42 +#endif + +#ifndef WARN_UNTIE +# define WARN_UNTIE 43 +#endif + +#ifndef WARN_UTF8 +# define WARN_UTF8 44 +#endif + +#ifndef WARN_VOID +# define WARN_VOID 45 +#endif + +#ifndef WARN_ASSERTIONS +# define WARN_ASSERTIONS 46 +#endif +#ifndef packWARN +# define packWARN(a) (a) +#endif + +#ifndef ckWARN +# ifdef G_WARN_ON +# define ckWARN(a) (PL_dowarn & G_WARN_ON) +# else +# define ckWARN(a) PL_dowarn +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) +#if defined(NEED_warner) +static void DPPP_(my_warner)(U32 err, const char *pat, ...); +static +#else +extern void DPPP_(my_warner)(U32 err, const char *pat, ...); +#endif + +#if defined(NEED_warner) || defined(NEED_warner_GLOBAL) + +#define Perl_warner DPPP_(my_warner) + + +void +DPPP_(my_warner)(U32 err, const char *pat, ...) +{ + SV *sv; + va_list args; + + PERL_UNUSED_ARG(err); + + va_start(args, pat); + sv = vnewSVpvf(pat, &args); + va_end(args); + sv_2mortal(sv); + warn("%s", SvPV_nolen(sv)); +} + +#define warner Perl_warner + +#define Perl_warner_nocontext Perl_warner + +#endif +#endif + +#define _ppport_MIN(a,b) (((a) <= (b)) ? (a) : (b)) +#ifndef sv_setuv +# define sv_setuv(sv, uv) \ + STMT_START { \ + UV TeMpUv = uv; \ + if (TeMpUv <= IV_MAX) \ + sv_setiv(sv, TeMpUv); \ + else \ + sv_setnv(sv, (double)TeMpUv); \ + } STMT_END +#endif +#ifndef newSVuv +# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) +#endif +#ifndef sv_2uv +# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) +#endif + +#ifndef SvUVX +# define SvUVX(sv) ((UV)SvIVX(sv)) +#endif + +#ifndef SvUVXx +# define SvUVXx(sv) SvUVX(sv) +#endif + +#ifndef SvUV +# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) +#endif + +#ifndef SvUVx +# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) +#endif + +/* Hint: sv_uv + * Always use the SvUVx() macro instead of sv_uv(). + */ +#ifndef sv_uv +# define sv_uv(sv) SvUVx(sv) +#endif + +#if !defined(SvUOK) && defined(SvIOK_UV) +# define SvUOK(sv) SvIOK_UV(sv) +#endif +#ifndef XST_mUV +# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) +#endif + +#ifndef XSRETURN_UV +# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END +#endif +#ifndef PUSHu +# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END +#endif + +#ifndef XPUSHu +# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END +#endif + +#if defined UTF8SKIP + +/* Don't use official version because it uses MIN, which may not be available */ +#undef UTF8_SAFE_SKIP +#ifndef UTF8_SAFE_SKIP +# define UTF8_SAFE_SKIP(s, e) ( \ + ((((e) - (s)) <= 0) \ + ? 0 \ + : _ppport_MIN(((e) - (s)), UTF8SKIP(s)))) +#endif + +#endif + +#if !defined(my_strnlen) +#if defined(NEED_my_strnlen) +static STRLEN DPPP_(my_my_strnlen)(const char *str, Size_t maxlen); +static +#else +extern STRLEN DPPP_(my_my_strnlen)(const char *str, Size_t maxlen); +#endif + +#if defined(NEED_my_strnlen) || defined(NEED_my_strnlen_GLOBAL) + +#define my_strnlen DPPP_(my_my_strnlen) +#define Perl_my_strnlen DPPP_(my_my_strnlen) + + +STRLEN +DPPP_(my_my_strnlen)(const char *str, Size_t maxlen) +{ + const char *p = str; + + while(maxlen-- && *p) + p++; + + return p - str; +} + +#endif +#endif + +#if (PERL_BCDVERSION < 0x5031002) + /* Versions prior to this accepted things that are now considered + * malformations, and didn't return -1 on error with warnings enabled + * */ +# undef utf8_to_uvchr_buf +#endif + +/* This implementation brings modern, generally more restricted standards to + * utf8_to_uvchr_buf. Some of these are security related, and clearly must + * be done. But its arguable that the others need not, and hence should not. + * The reason they're here is that a module that intends to play with the + * latest perls shoud be able to work the same in all releases. An example is + * that perl no longer accepts any UV for a code point, but limits them to + * IV_MAX or below. This is for future internal use of the larger code points. + * If it turns out that some of these changes are breaking code that isn't + * intended to work with modern perls, the tighter restrictions could be + * relaxed. khw thinks this is unlikely, but has been wrong in the past. */ + +#ifndef utf8_to_uvchr_buf + /* Choose which underlying implementation to use. At least one must be + * present or the perl is too early to handle this function */ +# if defined(utf8n_to_uvchr) || defined(utf8_to_uv) +# if defined(utf8n_to_uvchr) /* This is the preferred implementation */ +# define _ppport_utf8_to_uvchr_buf_callee utf8n_to_uvchr +# else +# define _ppport_utf8_to_uvchr_buf_callee utf8_to_uv +# endif + +# endif + +#ifdef _ppport_utf8_to_uvchr_buf_callee +# if defined(NEED_utf8_to_uvchr_buf) +static UV DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 * s, const U8 * send, STRLEN * retlen); +static +#else +extern UV DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 * s, const U8 * send, STRLEN * retlen); +#endif + +#if defined(NEED_utf8_to_uvchr_buf) || defined(NEED_utf8_to_uvchr_buf_GLOBAL) + +#ifdef utf8_to_uvchr_buf +# undef utf8_to_uvchr_buf +#endif +#define utf8_to_uvchr_buf(a,b,c) DPPP_(my_utf8_to_uvchr_buf)(aTHX_ a,b,c) +#define Perl_utf8_to_uvchr_buf DPPP_(my_utf8_to_uvchr_buf) + + +UV +DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen) +{ + UV ret; + STRLEN curlen; + bool overflows = 0; + const U8 *cur_s = s; + const bool do_warnings = ckWARN_d(WARN_UTF8); + + if (send > s) { + curlen = send - s; + } + else { + assert(0); /* Modern perls die under this circumstance */ + curlen = 0; + if (! do_warnings) { /* Handle empty here if no warnings needed */ + if (retlen) *retlen = 0; + return UNICODE_REPLACEMENT; + } + } + + /* The modern version allows anything that evaluates to a legal UV, but not + * overlongs nor an empty input */ + ret = _ppport_utf8_to_uvchr_buf_callee( + s, curlen, retlen, (UTF8_ALLOW_ANYUV + & ~(UTF8_ALLOW_LONG|UTF8_ALLOW_EMPTY))); + + /* But actually, modern versions restrict the UV to being no more than what + * an IV can hold */ + if (ret > PERL_INT_MAX) { + overflows = 1; + } + +# if (PERL_BCDVERSION < 0x5026000) +# ifndef EBCDIC + + /* There are bugs in versions earlier than this on non-EBCDIC platforms + * in which it did not detect all instances of overflow, which could be + * a security hole. Also, earlier versions did not allow the overflow + * malformation under any circumstances, and modern ones do. So we + * need to check here. */ + + else if (curlen > 0 && *s >= 0xFE) { + + /* If the main routine detected overflow, great; it returned 0. But if the + * input's first byte indicates it could overflow, we need to verify. + * First, on a 32-bit machine the first byte being at least \xFE + * automatically is overflow */ + if (sizeof(ret) < 8) { + overflows = 1; + } + else { + const U8 highest[] = /* 2*63-1 */ + "\xFF\x80\x87\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF"; + const U8 *cur_h = highest; + + for (cur_s = s; cur_s < send; cur_s++, cur_h++) { + if (UNLIKELY(*cur_s == *cur_h)) { + continue; + } + + /* If this byte is larger than the corresponding highest UTF-8 + * byte, the sequence overflows; otherwise the byte is less than + * (as we handled the equality case above), and so the sequence + * doesn't overflow */ + overflows = *cur_s > *cur_h; + break; + + } + + /* Here, either we set the bool and broke out of the loop, or got + * to the end and all bytes are the same which indicates it doesn't + * overflow. */ + } + } + +# endif +# endif /* < 5.26 */ + + if (UNLIKELY(overflows)) { + if (! do_warnings) { + if (retlen) { + *retlen = _ppport_MIN(*retlen, UTF8SKIP(s)); + *retlen = _ppport_MIN(*retlen, curlen); + } + return UNICODE_REPLACEMENT; + } + else { + + /* On versions that correctly detect overflow, but forbid it + * always, 0 will be returned, but also a warning will have been + * raised. Don't repeat it */ + if (ret != 0) { + /* We use the error message in use from 5.8-5.14 */ + Perl_warner(aTHX_ packWARN(WARN_UTF8), + "Malformed UTF-8 character (overflow at 0x%" UVxf + ", byte 0x%02x, after start byte 0x%02x)", + ret, *cur_s, *s); + } + if (retlen) { + *retlen = (STRLEN) -1; + } + return 0; + } + } + + /* If failed and warnings are off, to emulate the behavior of the real + * utf8_to_uvchr(), try again, allowing anything. (Note a return of 0 is + * ok if the input was '\0') */ + if (UNLIKELY(ret == 0 && (curlen == 0 || *s != '\0'))) { + + /* If curlen is 0, we already handled the case where warnings are + * disabled, so this 'if' will be true, and we won't look at the + * contents of 's' */ + if (do_warnings) { + *retlen = (STRLEN) -1; + } + else { + ret = _ppport_utf8_to_uvchr_buf_callee( + s, curlen, retlen, UTF8_ALLOW_ANY); + /* Override with the REPLACEMENT character, as that is what the + * modern version of this function returns */ + ret = UNICODE_REPLACEMENT; + +# if (PERL_BCDVERSION < 0x5016000) + + /* Versions earlier than this don't necessarily return the proper + * length. It should not extend past the end of string, nor past + * what the first byte indicates the length is, nor past the + * continuation characters */ + if (retlen && *retlen >= 0) { + *retlen = _ppport_MIN(*retlen, curlen); + *retlen = _ppport_MIN(*retlen, UTF8SKIP(s)); + unsigned int i = 1; + do { + if (s[i] < 0x80 || s[i] > 0xBF) { + *retlen = i; + break; + } + } while (++i < *retlen); + } + +# endif + + } + } + + return ret; +} + +# endif +#endif +#endif + +#if defined(UTF8SKIP) && defined(utf8_to_uvchr_buf) +#undef utf8_to_uvchr /* Always redefine this unsafe function so that it refuses + to read past a NUL, making it much less likely to read + off the end of the buffer. A NUL indicates the start + of the next character anyway. If the input isn't + NUL-terminated, the function remains unsafe, as it + always has been. */ +#ifndef utf8_to_uvchr +# define utf8_to_uvchr(s, lp) \ + ((*(s) == '\0') \ + ? utf8_to_uvchr_buf(s,((s)+1), lp) /* Handle single NUL specially */ \ + : utf8_to_uvchr_buf(s, (s) + my_strnlen((char *) (s), UTF8SKIP(s)), (lp))) +#endif + +#endif + +#ifdef HAS_MEMCMP +#ifndef memNE +# define memNE(s1,s2,l) (memcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) +#endif + +#else +#ifndef memNE +# define memNE(s1,s2,l) (bcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) +#endif + +#endif +#ifndef memEQs +# define memEQs(s1, l, s2) \ + (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1))) +#endif + +#ifndef memNEs +# define memNEs(s1, l, s2) !memEQs(s1, l, s2) +#endif +#ifndef MoveD +# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifndef CopyD +# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifdef HAS_MEMSET +#ifndef ZeroD +# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) +#endif + +#else +#ifndef ZeroD +# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) +#endif + +#endif +#ifndef PoisonWith +# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) +#endif + +#ifndef PoisonNew +# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) +#endif + +#ifndef PoisonFree +# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) +#endif + +#ifndef Poison +# define Poison(d,n,t) PoisonFree(d,n,t) +#endif +#ifndef Newx +# define Newx(v,n,t) New(0,v,n,t) +#endif + +#ifndef Newxc +# define Newxc(v,n,t,c) Newc(0,v,n,t,c) +#endif + +#ifndef Newxz +# define Newxz(v,n,t) Newz(0,v,n,t) +#endif +#ifndef PERL_MAGIC_sv +# define PERL_MAGIC_sv '\0' +#endif + +#ifndef PERL_MAGIC_overload +# define PERL_MAGIC_overload 'A' +#endif + +#ifndef PERL_MAGIC_overload_elem +# define PERL_MAGIC_overload_elem 'a' +#endif + +#ifndef PERL_MAGIC_overload_table +# define PERL_MAGIC_overload_table 'c' +#endif + +#ifndef PERL_MAGIC_bm +# define PERL_MAGIC_bm 'B' +#endif + +#ifndef PERL_MAGIC_regdata +# define PERL_MAGIC_regdata 'D' +#endif + +#ifndef PERL_MAGIC_regdatum +# define PERL_MAGIC_regdatum 'd' +#endif + +#ifndef PERL_MAGIC_env +# define PERL_MAGIC_env 'E' +#endif + +#ifndef PERL_MAGIC_envelem +# define PERL_MAGIC_envelem 'e' +#endif + +#ifndef PERL_MAGIC_fm +# define PERL_MAGIC_fm 'f' +#endif + +#ifndef PERL_MAGIC_regex_global +# define PERL_MAGIC_regex_global 'g' +#endif + +#ifndef PERL_MAGIC_isa +# define PERL_MAGIC_isa 'I' +#endif + +#ifndef PERL_MAGIC_isaelem +# define PERL_MAGIC_isaelem 'i' +#endif + +#ifndef PERL_MAGIC_nkeys +# define PERL_MAGIC_nkeys 'k' +#endif + +#ifndef PERL_MAGIC_dbfile +# define PERL_MAGIC_dbfile 'L' +#endif + +#ifndef PERL_MAGIC_dbline +# define PERL_MAGIC_dbline 'l' +#endif + +#ifndef PERL_MAGIC_mutex +# define PERL_MAGIC_mutex 'm' +#endif + +#ifndef PERL_MAGIC_shared +# define PERL_MAGIC_shared 'N' +#endif + +#ifndef PERL_MAGIC_shared_scalar +# define PERL_MAGIC_shared_scalar 'n' +#endif + +#ifndef PERL_MAGIC_collxfrm +# define PERL_MAGIC_collxfrm 'o' +#endif + +#ifndef PERL_MAGIC_tied +# define PERL_MAGIC_tied 'P' +#endif + +#ifndef PERL_MAGIC_tiedelem +# define PERL_MAGIC_tiedelem 'p' +#endif + +#ifndef PERL_MAGIC_tiedscalar +# define PERL_MAGIC_tiedscalar 'q' +#endif + +#ifndef PERL_MAGIC_qr +# define PERL_MAGIC_qr 'r' +#endif + +#ifndef PERL_MAGIC_sig +# define PERL_MAGIC_sig 'S' +#endif + +#ifndef PERL_MAGIC_sigelem +# define PERL_MAGIC_sigelem 's' +#endif + +#ifndef PERL_MAGIC_taint +# define PERL_MAGIC_taint 't' +#endif + +#ifndef PERL_MAGIC_uvar +# define PERL_MAGIC_uvar 'U' +#endif + +#ifndef PERL_MAGIC_uvar_elem +# define PERL_MAGIC_uvar_elem 'u' +#endif + +#ifndef PERL_MAGIC_vstring +# define PERL_MAGIC_vstring 'V' +#endif + +#ifndef PERL_MAGIC_vec +# define PERL_MAGIC_vec 'v' +#endif + +#ifndef PERL_MAGIC_utf8 +# define PERL_MAGIC_utf8 'w' +#endif + +#ifndef PERL_MAGIC_substr +# define PERL_MAGIC_substr 'x' +#endif + +#ifndef PERL_MAGIC_defelem +# define PERL_MAGIC_defelem 'y' +#endif + +#ifndef PERL_MAGIC_glob +# define PERL_MAGIC_glob '*' +#endif + +#ifndef PERL_MAGIC_arylen +# define PERL_MAGIC_arylen '#' +#endif + +#ifndef PERL_MAGIC_pos +# define PERL_MAGIC_pos '.' +#endif + +#ifndef PERL_MAGIC_backref +# define PERL_MAGIC_backref '<' +#endif + +#ifndef PERL_MAGIC_ext +# define PERL_MAGIC_ext '~' +#endif + +#ifdef NEED_mess_sv +#define NEED_mess +#endif + +#ifdef NEED_mess +#define NEED_mess_nocontext +#define NEED_vmess +#endif + +#ifndef croak_sv +#if (PERL_BCDVERSION >= 0x5007003) || ( (PERL_BCDVERSION >= 0x5006001) && (PERL_BCDVERSION < 0x5007000) ) +# if ( (PERL_BCDVERSION >= 0x5008000) && (PERL_BCDVERSION < 0x5008009) ) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5010001) ) +# define D_PPP_FIX_UTF8_ERRSV(errsv, sv) \ + STMT_START { \ + if (sv != errsv) \ + SvFLAGS(errsv) = (SvFLAGS(errsv) & ~SVf_UTF8) | \ + (SvFLAGS(sv) & SVf_UTF8); \ + } STMT_END +# else +# define D_PPP_FIX_UTF8_ERRSV(errsv, sv) STMT_START {} STMT_END +# endif +# define croak_sv(sv) \ + STMT_START { \ + if (SvROK(sv)) { \ + sv_setsv(ERRSV, sv); \ + croak(NULL); \ + } else { \ + D_PPP_FIX_UTF8_ERRSV(ERRSV, sv); \ + croak("%" SVf, SVfARG(sv)); \ + } \ + } STMT_END +#elif (PERL_BCDVERSION >= 0x5004000) +# define croak_sv(sv) croak("%" SVf, SVfARG(sv)) +#else +# define croak_sv(sv) croak("%s", SvPV_nolen(sv)) +#endif +#endif + +#ifndef die_sv +#if defined(NEED_die_sv) +static OP * DPPP_(my_die_sv)(pTHX_ SV *sv); +static +#else +extern OP * DPPP_(my_die_sv)(pTHX_ SV *sv); +#endif + +#if defined(NEED_die_sv) || defined(NEED_die_sv_GLOBAL) + +#ifdef die_sv +# undef die_sv +#endif +#define die_sv(a) DPPP_(my_die_sv)(aTHX_ a) +#define Perl_die_sv DPPP_(my_die_sv) + +OP * +DPPP_(my_die_sv)(pTHX_ SV *sv) +{ + croak_sv(sv); + return (OP *)NULL; +} +#endif +#endif + +#ifndef warn_sv +#if (PERL_BCDVERSION >= 0x5004000) +# define warn_sv(sv) warn("%" SVf, SVfARG(sv)) +#else +# define warn_sv(sv) warn("%s", SvPV_nolen(sv)) +#endif +#endif + +#ifndef vmess +#if defined(NEED_vmess) +static SV * DPPP_(my_vmess)(pTHX_ const char * pat, va_list * args); +static +#else +extern SV * DPPP_(my_vmess)(pTHX_ const char * pat, va_list * args); +#endif + +#if defined(NEED_vmess) || defined(NEED_vmess_GLOBAL) + +#ifdef vmess +# undef vmess +#endif +#define vmess(a,b) DPPP_(my_vmess)(aTHX_ a,b) +#define Perl_vmess DPPP_(my_vmess) + +SV* +DPPP_(my_vmess)(pTHX_ const char* pat, va_list* args) +{ + mess(pat, args); + return PL_mess_sv; +} +#endif +#endif + +#if (PERL_BCDVERSION < 0x5006000) +#undef mess +#endif + +#if !defined(mess_nocontext) && !defined(Perl_mess_nocontext) +#if defined(NEED_mess_nocontext) +static SV * DPPP_(my_mess_nocontext)(const char * pat, ...); +static +#else +extern SV * DPPP_(my_mess_nocontext)(const char * pat, ...); +#endif + +#if defined(NEED_mess_nocontext) || defined(NEED_mess_nocontext_GLOBAL) + +#define mess_nocontext DPPP_(my_mess_nocontext) +#define Perl_mess_nocontext DPPP_(my_mess_nocontext) + +SV* +DPPP_(my_mess_nocontext)(const char* pat, ...) +{ + dTHX; + SV *sv; + va_list args; + va_start(args, pat); + sv = vmess(pat, &args); + va_end(args); + return sv; +} +#endif +#endif + +#ifndef mess +#if defined(NEED_mess) +static SV * DPPP_(my_mess)(pTHX_ const char * pat, ...); +static +#else +extern SV * DPPP_(my_mess)(pTHX_ const char * pat, ...); +#endif + +#if defined(NEED_mess) || defined(NEED_mess_GLOBAL) + +#define Perl_mess DPPP_(my_mess) + +SV* +DPPP_(my_mess)(pTHX_ const char* pat, ...) +{ + SV *sv; + va_list args; + va_start(args, pat); + sv = vmess(pat, &args); + va_end(args); + return sv; +} +#ifdef mess_nocontext +#define mess mess_nocontext +#else +#define mess Perl_mess_nocontext +#endif +#endif +#endif + +#ifndef mess_sv +#if defined(NEED_mess_sv) +static SV * DPPP_(my_mess_sv)(pTHX_ SV * basemsg, bool consume); +static +#else +extern SV * DPPP_(my_mess_sv)(pTHX_ SV * basemsg, bool consume); +#endif + +#if defined(NEED_mess_sv) || defined(NEED_mess_sv_GLOBAL) + +#ifdef mess_sv +# undef mess_sv +#endif +#define mess_sv(a,b) DPPP_(my_mess_sv)(aTHX_ a,b) +#define Perl_mess_sv DPPP_(my_mess_sv) + +SV * +DPPP_(my_mess_sv)(pTHX_ SV *basemsg, bool consume) +{ + SV *tmp; + SV *ret; + + if (SvPOK(basemsg) && SvCUR(basemsg) && *(SvEND(basemsg)-1) == '\n') { + if (consume) + return basemsg; + ret = mess(""); + SvSetSV_nosteal(ret, basemsg); + return ret; + } + + if (consume) { + sv_catsv(basemsg, mess("")); + return basemsg; + } + + ret = mess(""); + tmp = newSVsv(ret); + SvSetSV_nosteal(ret, basemsg); + sv_catsv(ret, tmp); + sv_dec(tmp); + return ret; +} +#endif +#endif + +#ifndef warn_nocontext +#define warn_nocontext warn +#endif + +#ifndef croak_nocontext +#define croak_nocontext croak +#endif + +#ifndef croak_no_modify +#define croak_no_modify() croak_nocontext("%s", PL_no_modify) +#define Perl_croak_no_modify() croak_no_modify() +#endif + +#ifndef croak_memory_wrap +#if (PERL_BCDVERSION >= 0x5009002) || ( (PERL_BCDVERSION >= 0x5008006) && (PERL_BCDVERSION < 0x5009000) ) +# define croak_memory_wrap() croak_nocontext("%s", PL_memory_wrap) +#else +# define croak_memory_wrap() croak_nocontext("panic: memory wrap") +#endif +#endif + +#ifndef croak_xs_usage +#if defined(NEED_croak_xs_usage) +static void DPPP_(my_croak_xs_usage)(const CV * const cv, const char * const params); +static +#else +extern void DPPP_(my_croak_xs_usage)(const CV * const cv, const char * const params); +#endif + +#if defined(NEED_croak_xs_usage) || defined(NEED_croak_xs_usage_GLOBAL) + +#define croak_xs_usage DPPP_(my_croak_xs_usage) +#define Perl_croak_xs_usage DPPP_(my_croak_xs_usage) + + +#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE +#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params) +#endif + +void +DPPP_(my_croak_xs_usage)(const CV *const cv, const char *const params) +{ + dTHX; + const GV *const gv = CvGV(cv); + + PERL_ARGS_ASSERT_CROAK_XS_USAGE; + + if (gv) { + const char *const gvname = GvNAME(gv); + const HV *const stash = GvSTASH(gv); + const char *const hvname = stash ? HvNAME(stash) : NULL; + + if (hvname) + croak("Usage: %s::%s(%s)", hvname, gvname, params); + else + croak("Usage: %s(%s)", gvname, params); + } else { + /* Pants. I don't think that it should be possible to get here. */ + croak("Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params); + } +} +#endif #endif #ifndef PERL_SIGNALS_UNSAFE_FLAG @@ -4901,13 +6008,14 @@ extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); #endif +#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) + #ifdef eval_pv # undef eval_pv #endif #define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) #define Perl_eval_pv DPPP_(my_eval_pv) -#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error) @@ -4923,8 +6031,8 @@ sv = POPs; PUTBACK; - if (croak_on_error && SvTRUE(GvSV(errgv))) - croak(SvPVx(GvSV(errgv), na)); + if (croak_on_error && SvTRUEx(ERRSV)) + croak_sv(ERRSV); return sv; } @@ -4940,13 +6048,14 @@ extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); #endif +#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) + #ifdef vload_module # undef vload_module #endif #define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) #define Perl_vload_module DPPP_(my_vload_module) -#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) @@ -5015,13 +6124,14 @@ extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); #endif +#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) + #ifdef load_module # undef load_module #endif #define load_module DPPP_(my_load_module) #define Perl_load_module DPPP_(my_load_module) -#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) @@ -5046,13 +6156,14 @@ extern SV * DPPP_(my_newRV_noinc)(SV *sv); #endif +#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) + #ifdef newRV_noinc # undef newRV_noinc #endif #define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) #define Perl_newRV_noinc DPPP_(my_newRV_noinc) -#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) SV * DPPP_(my_newRV_noinc)(SV *sv) { @@ -5077,13 +6188,14 @@ extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); #endif +#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) + #ifdef newCONSTSUB # undef newCONSTSUB #endif #define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) #define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) -#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) /* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ /* (There's no PL_parser in perl < 5.005, so this is completely safe) */ @@ -5342,13 +6454,14 @@ extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); #endif +#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL) + #ifdef newSV_type # undef newSV_type #endif #define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a) #define Perl_newSV_type DPPP_(my_newSV_type) -#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL) SV* DPPP_(my_newSV_type)(pTHX_ svtype const t) @@ -5388,13 +6501,14 @@ extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); #endif +#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL) + #ifdef newSVpvn_flags # undef newSVpvn_flags #endif #define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c) #define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags) -#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL) SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags) @@ -5439,13 +6553,14 @@ extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); #endif +#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) + #ifdef sv_2pvbyte # undef sv_2pvbyte #endif #define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) #define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) -#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp) @@ -5536,13 +6651,14 @@ extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); #endif +#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) + #ifdef sv_2pv_flags # undef sv_2pv_flags #endif #define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c) #define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags) -#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) @@ -5560,13 +6676,14 @@ extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); #endif +#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) + #ifdef sv_pvn_force_flags # undef sv_pvn_force_flags #endif #define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c) #define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags) -#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) @@ -5580,9 +6697,9 @@ #endif #if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) ) -# define DPPP_SVPV_NOLEN_LP_ARG &PL_na +# define D_PPP_SVPV_NOLEN_LP_ARG &PL_na #else -# define DPPP_SVPV_NOLEN_LP_ARG 0 +# define D_PPP_SVPV_NOLEN_LP_ARG 0 #endif #ifndef SvPV_const # define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) @@ -5606,7 +6723,7 @@ # define SvPV_flags_const_nolen(sv, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX_const(sv) : \ - (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) + (const char*) sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) #endif #ifndef SvPV_flags_mutable # define SvPV_flags_mutable(sv, lp, flags) \ @@ -5641,7 +6758,7 @@ #ifndef SvPV_force_flags_nolen # define SvPV_force_flags_nolen(sv, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ - ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags)) + ? SvPVX(sv) : sv_pvn_force_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags)) #endif #ifndef SvPV_force_flags_mutable # define SvPV_force_flags_mutable(sv, lp, flags) \ @@ -5652,12 +6769,12 @@ #ifndef SvPV_nolen # define SvPV_nolen(sv) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) + ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) #endif #ifndef SvPV_nolen_const # define SvPV_nolen_const(sv) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) + ? SvPVX_const(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) #endif #ifndef SvPV_nomg # define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) @@ -5673,7 +6790,7 @@ #ifndef SvPV_nomg_nolen # define SvPV_nomg_nolen(sv) ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, 0)) + ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, 0)) #endif #ifndef SvPV_renew # define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \ @@ -5746,13 +6863,14 @@ extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); #endif +#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) + #ifdef vnewSVpvf # undef vnewSVpvf #endif #define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) #define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) -#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) @@ -5781,9 +6899,10 @@ extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); #endif +#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) + #define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) -#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) @@ -5807,10 +6926,11 @@ extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); #endif +#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) + #define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) #define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) -#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) @@ -5852,9 +6972,10 @@ extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); #endif +#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) + #define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) -#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) @@ -5878,10 +6999,11 @@ extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); #endif +#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) + #define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) #define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) -#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) @@ -5930,13 +7052,14 @@ extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); #endif +#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) + #ifdef newSVpvn_share # undef newSVpvn_share #endif #define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) #define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) -#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash) @@ -5975,13 +7098,14 @@ extern GV* DPPP_(my_gv_fetchpvn_flags)(pTHX_ const char* name, STRLEN len, int flags, int types); #endif +#if defined(NEED_gv_fetchpvn_flags) || defined(NEED_gv_fetchpvn_flags_GLOBAL) + #ifdef gv_fetchpvn_flags # undef gv_fetchpvn_flags #endif #define gv_fetchpvn_flags(a,b,c,d) DPPP_(my_gv_fetchpvn_flags)(aTHX_ a,b,c,d) #define Perl_gv_fetchpvn_flags DPPP_(my_gv_fetchpvn_flags) -#if defined(NEED_gv_fetchpvn_flags) || defined(NEED_gv_fetchpvn_flags_GLOBAL) GV* DPPP_(my_gv_fetchpvn_flags)(pTHX_ const char* name, STRLEN len, int flags, int types) { @@ -6011,238 +7135,6 @@ #ifndef gv_init_pvn # define gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE) #endif -#ifndef WARN_ALL -# define WARN_ALL 0 -#endif - -#ifndef WARN_CLOSURE -# define WARN_CLOSURE 1 -#endif - -#ifndef WARN_DEPRECATED -# define WARN_DEPRECATED 2 -#endif - -#ifndef WARN_EXITING -# define WARN_EXITING 3 -#endif - -#ifndef WARN_GLOB -# define WARN_GLOB 4 -#endif - -#ifndef WARN_IO -# define WARN_IO 5 -#endif - -#ifndef WARN_CLOSED -# define WARN_CLOSED 6 -#endif - -#ifndef WARN_EXEC -# define WARN_EXEC 7 -#endif - -#ifndef WARN_LAYER -# define WARN_LAYER 8 -#endif - -#ifndef WARN_NEWLINE -# define WARN_NEWLINE 9 -#endif - -#ifndef WARN_PIPE -# define WARN_PIPE 10 -#endif - -#ifndef WARN_UNOPENED -# define WARN_UNOPENED 11 -#endif - -#ifndef WARN_MISC -# define WARN_MISC 12 -#endif - -#ifndef WARN_NUMERIC -# define WARN_NUMERIC 13 -#endif - -#ifndef WARN_ONCE -# define WARN_ONCE 14 -#endif - -#ifndef WARN_OVERFLOW -# define WARN_OVERFLOW 15 -#endif - -#ifndef WARN_PACK -# define WARN_PACK 16 -#endif - -#ifndef WARN_PORTABLE -# define WARN_PORTABLE 17 -#endif - -#ifndef WARN_RECURSION -# define WARN_RECURSION 18 -#endif - -#ifndef WARN_REDEFINE -# define WARN_REDEFINE 19 -#endif - -#ifndef WARN_REGEXP -# define WARN_REGEXP 20 -#endif - -#ifndef WARN_SEVERE -# define WARN_SEVERE 21 -#endif - -#ifndef WARN_DEBUGGING -# define WARN_DEBUGGING 22 -#endif - -#ifndef WARN_INPLACE -# define WARN_INPLACE 23 -#endif - -#ifndef WARN_INTERNAL -# define WARN_INTERNAL 24 -#endif - -#ifndef WARN_MALLOC -# define WARN_MALLOC 25 -#endif - -#ifndef WARN_SIGNAL -# define WARN_SIGNAL 26 -#endif - -#ifndef WARN_SUBSTR -# define WARN_SUBSTR 27 -#endif - -#ifndef WARN_SYNTAX -# define WARN_SYNTAX 28 -#endif - -#ifndef WARN_AMBIGUOUS -# define WARN_AMBIGUOUS 29 -#endif - -#ifndef WARN_BAREWORD -# define WARN_BAREWORD 30 -#endif - -#ifndef WARN_DIGIT -# define WARN_DIGIT 31 -#endif - -#ifndef WARN_PARENTHESIS -# define WARN_PARENTHESIS 32 -#endif - -#ifndef WARN_PRECEDENCE -# define WARN_PRECEDENCE 33 -#endif - -#ifndef WARN_PRINTF -# define WARN_PRINTF 34 -#endif - -#ifndef WARN_PROTOTYPE -# define WARN_PROTOTYPE 35 -#endif - -#ifndef WARN_QW -# define WARN_QW 36 -#endif - -#ifndef WARN_RESERVED -# define WARN_RESERVED 37 -#endif - -#ifndef WARN_SEMICOLON -# define WARN_SEMICOLON 38 -#endif - -#ifndef WARN_TAINT -# define WARN_TAINT 39 -#endif - -#ifndef WARN_THREADS -# define WARN_THREADS 40 -#endif - -#ifndef WARN_UNINITIALIZED -# define WARN_UNINITIALIZED 41 -#endif - -#ifndef WARN_UNPACK -# define WARN_UNPACK 42 -#endif - -#ifndef WARN_UNTIE -# define WARN_UNTIE 43 -#endif - -#ifndef WARN_UTF8 -# define WARN_UTF8 44 -#endif - -#ifndef WARN_VOID -# define WARN_VOID 45 -#endif - -#ifndef WARN_ASSERTIONS -# define WARN_ASSERTIONS 46 -#endif -#ifndef packWARN -# define packWARN(a) (a) -#endif - -#ifndef ckWARN -# ifdef G_WARN_ON -# define ckWARN(a) (PL_dowarn & G_WARN_ON) -# else -# define ckWARN(a) PL_dowarn -# endif -#endif - -#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) -#if defined(NEED_warner) -static void DPPP_(my_warner)(U32 err, const char *pat, ...); -static -#else -extern void DPPP_(my_warner)(U32 err, const char *pat, ...); -#endif - -#define Perl_warner DPPP_(my_warner) - -#if defined(NEED_warner) || defined(NEED_warner_GLOBAL) - -void -DPPP_(my_warner)(U32 err, const char *pat, ...) -{ - SV *sv; - va_list args; - - PERL_UNUSED_ARG(err); - - va_start(args, pat); - sv = vnewSVpvf(pat, &args); - va_end(args); - sv_2mortal(sv); - warn("%s", SvPV_nolen(sv)); -} - -#define warner Perl_warner - -#define Perl_warner_nocontext Perl_warner - -#endif -#endif /* concatenating with "" ensures that only literal strings are accepted as argument * note that STR_WITH_LEN() can't be used as argument to macros or functions that @@ -6290,180 +7182,6 @@ #endif #ifndef SvGETMAGIC # define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END -#endif - -/* Some random bits for sv_unmagicext. These should probably be pulled in for - real and organized at some point */ -#ifndef HEf_SVKEY -# define HEf_SVKEY -2 -#endif - -#ifndef MUTABLE_PTR -#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) -# define MUTABLE_PTR(p) ({ void *_p = (p); _p; }) -#else -# define MUTABLE_PTR(p) ((void *) (p)) -#endif -#endif -#ifndef MUTABLE_SV -# define MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p)) -#endif - -/* end of random bits */ -#ifndef PERL_MAGIC_sv -# define PERL_MAGIC_sv '\0' -#endif - -#ifndef PERL_MAGIC_overload -# define PERL_MAGIC_overload 'A' -#endif - -#ifndef PERL_MAGIC_overload_elem -# define PERL_MAGIC_overload_elem 'a' -#endif - -#ifndef PERL_MAGIC_overload_table -# define PERL_MAGIC_overload_table 'c' -#endif - -#ifndef PERL_MAGIC_bm -# define PERL_MAGIC_bm 'B' -#endif - -#ifndef PERL_MAGIC_regdata -# define PERL_MAGIC_regdata 'D' -#endif - -#ifndef PERL_MAGIC_regdatum -# define PERL_MAGIC_regdatum 'd' -#endif - -#ifndef PERL_MAGIC_env -# define PERL_MAGIC_env 'E' -#endif - -#ifndef PERL_MAGIC_envelem -# define PERL_MAGIC_envelem 'e' -#endif - -#ifndef PERL_MAGIC_fm -# define PERL_MAGIC_fm 'f' -#endif - -#ifndef PERL_MAGIC_regex_global -# define PERL_MAGIC_regex_global 'g' -#endif - -#ifndef PERL_MAGIC_isa -# define PERL_MAGIC_isa 'I' -#endif - -#ifndef PERL_MAGIC_isaelem -# define PERL_MAGIC_isaelem 'i' -#endif - -#ifndef PERL_MAGIC_nkeys -# define PERL_MAGIC_nkeys 'k' -#endif - -#ifndef PERL_MAGIC_dbfile -# define PERL_MAGIC_dbfile 'L' -#endif - -#ifndef PERL_MAGIC_dbline -# define PERL_MAGIC_dbline 'l' -#endif - -#ifndef PERL_MAGIC_mutex -# define PERL_MAGIC_mutex 'm' -#endif - -#ifndef PERL_MAGIC_shared -# define PERL_MAGIC_shared 'N' -#endif - -#ifndef PERL_MAGIC_shared_scalar -# define PERL_MAGIC_shared_scalar 'n' -#endif - -#ifndef PERL_MAGIC_collxfrm -# define PERL_MAGIC_collxfrm 'o' -#endif - -#ifndef PERL_MAGIC_tied -# define PERL_MAGIC_tied 'P' -#endif - -#ifndef PERL_MAGIC_tiedelem -# define PERL_MAGIC_tiedelem 'p' -#endif - -#ifndef PERL_MAGIC_tiedscalar -# define PERL_MAGIC_tiedscalar 'q' -#endif - -#ifndef PERL_MAGIC_qr -# define PERL_MAGIC_qr 'r' -#endif - -#ifndef PERL_MAGIC_sig -# define PERL_MAGIC_sig 'S' -#endif - -#ifndef PERL_MAGIC_sigelem -# define PERL_MAGIC_sigelem 's' -#endif - -#ifndef PERL_MAGIC_taint -# define PERL_MAGIC_taint 't' -#endif - -#ifndef PERL_MAGIC_uvar -# define PERL_MAGIC_uvar 'U' -#endif - -#ifndef PERL_MAGIC_uvar_elem -# define PERL_MAGIC_uvar_elem 'u' -#endif - -#ifndef PERL_MAGIC_vstring -# define PERL_MAGIC_vstring 'V' -#endif - -#ifndef PERL_MAGIC_vec -# define PERL_MAGIC_vec 'v' -#endif - -#ifndef PERL_MAGIC_utf8 -# define PERL_MAGIC_utf8 'w' -#endif - -#ifndef PERL_MAGIC_substr -# define PERL_MAGIC_substr 'x' -#endif - -#ifndef PERL_MAGIC_defelem -# define PERL_MAGIC_defelem 'y' -#endif - -#ifndef PERL_MAGIC_glob -# define PERL_MAGIC_glob '*' -#endif - -#ifndef PERL_MAGIC_arylen -# define PERL_MAGIC_arylen '#' -#endif - -#ifndef PERL_MAGIC_pos -# define PERL_MAGIC_pos '.' -#endif - -#ifndef PERL_MAGIC_backref -# define PERL_MAGIC_backref '<' -#endif - -#ifndef PERL_MAGIC_ext -# define PERL_MAGIC_ext '~' #endif /* That's the best we can do... */ @@ -6633,10 +7351,11 @@ extern MAGIC * DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl); #endif +#if defined(NEED_mg_findext) || defined(NEED_mg_findext_GLOBAL) + #define mg_findext DPPP_(my_mg_findext) #define Perl_mg_findext DPPP_(my_mg_findext) -#if defined(NEED_mg_findext) || defined(NEED_mg_findext_GLOBAL) MAGIC * DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl) { @@ -6667,13 +7386,14 @@ extern int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl); #endif +#if defined(NEED_sv_unmagicext) || defined(NEED_sv_unmagicext_GLOBAL) + #ifdef sv_unmagicext # undef sv_unmagicext #endif #define sv_unmagicext(a,b,c) DPPP_(my_sv_unmagicext)(aTHX_ a,b,c) #define Perl_sv_unmagicext DPPP_(my_sv_unmagicext) -#if defined(NEED_sv_unmagicext) || defined(NEED_sv_unmagicext_GLOBAL) int DPPP_(my_sv_unmagicext)(pTHX_ SV *const sv, const int type, MGVTBL *vtbl) @@ -6840,13 +7560,14 @@ extern const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp); #endif +#if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) + #ifdef caller_cx # undef caller_cx #endif #define caller_cx(a,b) DPPP_(my_caller_cx)(aTHX_ a,b) #define Perl_caller_cx DPPP_(my_caller_cx) -#if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp) @@ -6957,13 +7678,14 @@ extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); #endif +#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) + #ifdef grok_numeric_radix # undef grok_numeric_radix #endif #define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) #define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) -#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) bool DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) { @@ -7013,13 +7735,14 @@ extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); #endif +#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) + #ifdef grok_number # undef grok_number #endif #define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) #define Perl_grok_number DPPP_(my_grok_number) -#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) int DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) { @@ -7227,13 +7950,14 @@ extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif +#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) + #ifdef grok_bin # undef grok_bin #endif #define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) #define Perl_grok_bin DPPP_(my_grok_bin) -#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) UV DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { @@ -7329,13 +8053,14 @@ extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif +#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) + #ifdef grok_hex # undef grok_hex #endif #define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) #define Perl_grok_hex DPPP_(my_grok_hex) -#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) UV DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { @@ -7431,13 +8156,14 @@ extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif +#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) + #ifdef grok_oct # undef grok_oct #endif #define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) #define Perl_grok_oct DPPP_(my_grok_oct) -#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) UV DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { @@ -7524,10 +8250,11 @@ extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); #endif +#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) + #define my_snprintf DPPP_(my_my_snprintf) #define Perl_my_snprintf DPPP_(my_my_snprintf) -#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) int DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) @@ -7558,10 +8285,11 @@ extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); #endif +#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) + #define my_sprintf DPPP_(my_my_sprintf) #define Perl_my_sprintf DPPP_(my_my_sprintf) -#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) int DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...) @@ -7600,10 +8328,11 @@ extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); #endif +#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) + #define my_strlcat DPPP_(my_my_strlcat) #define Perl_my_strlcat DPPP_(my_my_strlcat) -#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) Size_t DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) @@ -7630,10 +8359,11 @@ extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); #endif +#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) + #define my_strlcpy DPPP_(my_my_strlcpy) #define Perl_my_strlcpy DPPP_(my_my_strlcpy) -#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) Size_t DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) @@ -7720,13 +8450,14 @@ extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); #endif +#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) + #ifdef pv_escape # undef pv_escape #endif #define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f) #define Perl_pv_escape DPPP_(my_pv_escape) -#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) char * DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str, @@ -7739,7 +8470,7 @@ STRLEN wrote = 0; STRLEN chsize = 0; STRLEN readsize = 1; -#if defined(is_utf8_string) && defined(utf8_to_uvchr) +#if defined(is_utf8_string) && defined(utf8_to_uvchr_buf) bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0; #endif const char *pv = str; @@ -7749,15 +8480,15 @@ if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) sv_setpvs(dsv, ""); -#if defined(is_utf8_string) && defined(utf8_to_uvchr) +#if defined(is_utf8_string) && defined(utf8_to_uvchr_buf) if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) isuni = 1; #endif for (; pv < end && (!max || wrote < max) ; pv += readsize) { const UV u = -#if defined(is_utf8_string) && defined(utf8_to_uvchr) - isuni ? utf8_to_uvchr((U8*)pv, &readsize) : +#if defined(is_utf8_string) && defined(utf8_to_uvchr_buf) + isuni ? utf8_to_uvchr_buf((U8*)pv, end, &readsize) : #endif (U8)*pv; const U8 c = (U8)u & 0xFF; @@ -7829,13 +8560,14 @@ extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); #endif +#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) + #ifdef pv_pretty # undef pv_pretty #endif #define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g) #define Perl_pv_pretty DPPP_(my_pv_pretty) -#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) char * DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count, @@ -7883,13 +8615,14 @@ extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); #endif +#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) + #ifdef pv_display # undef pv_display #endif #define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e) #define Perl_pv_display DPPP_(my_pv_display) -#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) char * DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) diff --git a/src/Makefile b/src/Makefile index d08de80..f528bd0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -96,32 +96,32 @@ ltc/pk/asn1/der/utctime/der_length_utctime.o ltc/pk/asn1/der/utf8/der_decode_utf8_string.o \ ltc/pk/asn1/der/utf8/der_encode_utf8_string.o ltc/pk/asn1/der/utf8/der_length_utf8_string.o \ ltc/pk/asn1/oid/pk_get_oid.o ltc/pk/asn1/oid/pk_oid_cmp.o ltc/pk/asn1/oid/pk_oid_str.o \ -ltc/pk/asn1/pkcs8/pkcs8_decode_flexi.o ltc/pk/asn1/x509/x509_decode_subject_public_key_info.o \ -ltc/pk/asn1/x509/x509_encode_subject_public_key_info.o ltc/pk/dh/dh.o ltc/pk/dh/dh_check_pubkey.o \ -ltc/pk/dh/dh_export.o ltc/pk/dh/dh_export_key.o ltc/pk/dh/dh_free.o ltc/pk/dh/dh_generate_key.o \ -ltc/pk/dh/dh_import.o ltc/pk/dh/dh_set.o ltc/pk/dh/dh_set_pg_dhparam.o ltc/pk/dh/dh_shared_secret.o \ -ltc/pk/dsa/dsa_decrypt_key.o ltc/pk/dsa/dsa_encrypt_key.o ltc/pk/dsa/dsa_export.o \ -ltc/pk/dsa/dsa_free.o ltc/pk/dsa/dsa_generate_key.o ltc/pk/dsa/dsa_generate_pqg.o \ -ltc/pk/dsa/dsa_import.o ltc/pk/dsa/dsa_make_key.o ltc/pk/dsa/dsa_set.o ltc/pk/dsa/dsa_set_pqg_dsaparam.o \ -ltc/pk/dsa/dsa_shared_secret.o ltc/pk/dsa/dsa_sign_hash.o ltc/pk/dsa/dsa_verify_hash.o \ -ltc/pk/dsa/dsa_verify_key.o ltc/pk/ecc/ecc.o ltc/pk/ecc/ecc_ansi_x963_export.o ltc/pk/ecc/ecc_ansi_x963_import.o \ -ltc/pk/ecc/ecc_decrypt_key.o ltc/pk/ecc/ecc_encrypt_key.o ltc/pk/ecc/ecc_export.o \ -ltc/pk/ecc/ecc_export_openssl.o ltc/pk/ecc/ecc_find_curve.o ltc/pk/ecc/ecc_free.o \ -ltc/pk/ecc/ecc_get_key.o ltc/pk/ecc/ecc_get_oid_str.o ltc/pk/ecc/ecc_get_size.o ltc/pk/ecc/ecc_import.o \ -ltc/pk/ecc/ecc_import_openssl.o ltc/pk/ecc/ecc_import_pkcs8.o ltc/pk/ecc/ecc_import_x509.o \ -ltc/pk/ecc/ecc_make_key.o ltc/pk/ecc/ecc_recover_key.o ltc/pk/ecc/ecc_set_curve.o \ -ltc/pk/ecc/ecc_set_curve_internal.o ltc/pk/ecc/ecc_set_key.o ltc/pk/ecc/ecc_shared_secret.o \ -ltc/pk/ecc/ecc_sign_hash.o ltc/pk/ecc/ecc_sizes.o ltc/pk/ecc/ecc_ssh_ecdsa_encode_name.o \ -ltc/pk/ecc/ecc_verify_hash.o ltc/pk/ecc/ltc_ecc_export_point.o ltc/pk/ecc/ltc_ecc_import_point.o \ -ltc/pk/ecc/ltc_ecc_is_point.o ltc/pk/ecc/ltc_ecc_is_point_at_infinity.o ltc/pk/ecc/ltc_ecc_map.o \ -ltc/pk/ecc/ltc_ecc_mul2add.o ltc/pk/ecc/ltc_ecc_mulmod.o ltc/pk/ecc/ltc_ecc_mulmod_timing.o \ -ltc/pk/ecc/ltc_ecc_points.o ltc/pk/ecc/ltc_ecc_projective_add_point.o ltc/pk/ecc/ltc_ecc_projective_dbl_point.o \ -ltc/pk/ecc/ltc_ecc_verify_key.o ltc/pk/pkcs1/pkcs_1_i2osp.o ltc/pk/pkcs1/pkcs_1_mgf1.o \ -ltc/pk/pkcs1/pkcs_1_oaep_decode.o ltc/pk/pkcs1/pkcs_1_oaep_encode.o ltc/pk/pkcs1/pkcs_1_os2ip.o \ -ltc/pk/pkcs1/pkcs_1_pss_decode.o ltc/pk/pkcs1/pkcs_1_pss_encode.o ltc/pk/pkcs1/pkcs_1_v1_5_decode.o \ -ltc/pk/pkcs1/pkcs_1_v1_5_encode.o ltc/pk/rsa/rsa_decrypt_key.o ltc/pk/rsa/rsa_encrypt_key.o \ -ltc/pk/rsa/rsa_export.o ltc/pk/rsa/rsa_exptmod.o ltc/pk/rsa/rsa_free.o ltc/pk/rsa/rsa_get_size.o \ -ltc/pk/rsa/rsa_import.o ltc/pk/rsa/rsa_import_pkcs8.o ltc/pk/rsa/rsa_import_x509.o \ +ltc/pk/asn1/pkcs8/pkcs8_decode_flexi.o ltc/pk/asn1/x509/x509_decode_public_key_from_certificate.o \ +ltc/pk/asn1/x509/x509_decode_subject_public_key_info.o ltc/pk/asn1/x509/x509_encode_subject_public_key_info.o \ +ltc/pk/dh/dh.o ltc/pk/dh/dh_check_pubkey.o ltc/pk/dh/dh_export.o ltc/pk/dh/dh_export_key.o \ +ltc/pk/dh/dh_free.o ltc/pk/dh/dh_generate_key.o ltc/pk/dh/dh_import.o ltc/pk/dh/dh_set.o \ +ltc/pk/dh/dh_set_pg_dhparam.o ltc/pk/dh/dh_shared_secret.o ltc/pk/dsa/dsa_decrypt_key.o \ +ltc/pk/dsa/dsa_encrypt_key.o ltc/pk/dsa/dsa_export.o ltc/pk/dsa/dsa_free.o ltc/pk/dsa/dsa_generate_key.o \ +ltc/pk/dsa/dsa_generate_pqg.o ltc/pk/dsa/dsa_import.o ltc/pk/dsa/dsa_make_key.o ltc/pk/dsa/dsa_set.o \ +ltc/pk/dsa/dsa_set_pqg_dsaparam.o ltc/pk/dsa/dsa_shared_secret.o ltc/pk/dsa/dsa_sign_hash.o \ +ltc/pk/dsa/dsa_verify_hash.o ltc/pk/dsa/dsa_verify_key.o ltc/pk/ecc/ecc.o ltc/pk/ecc/ecc_ansi_x963_export.o \ +ltc/pk/ecc/ecc_ansi_x963_import.o ltc/pk/ecc/ecc_decrypt_key.o ltc/pk/ecc/ecc_encrypt_key.o \ +ltc/pk/ecc/ecc_export.o ltc/pk/ecc/ecc_export_openssl.o ltc/pk/ecc/ecc_find_curve.o \ +ltc/pk/ecc/ecc_free.o ltc/pk/ecc/ecc_get_key.o ltc/pk/ecc/ecc_get_oid_str.o ltc/pk/ecc/ecc_get_size.o \ +ltc/pk/ecc/ecc_import.o ltc/pk/ecc/ecc_import_openssl.o ltc/pk/ecc/ecc_import_pkcs8.o \ +ltc/pk/ecc/ecc_import_x509.o ltc/pk/ecc/ecc_make_key.o ltc/pk/ecc/ecc_recover_key.o \ +ltc/pk/ecc/ecc_set_curve.o ltc/pk/ecc/ecc_set_curve_internal.o ltc/pk/ecc/ecc_set_key.o \ +ltc/pk/ecc/ecc_shared_secret.o ltc/pk/ecc/ecc_sign_hash.o ltc/pk/ecc/ecc_sizes.o \ +ltc/pk/ecc/ecc_ssh_ecdsa_encode_name.o ltc/pk/ecc/ecc_verify_hash.o ltc/pk/ecc/ltc_ecc_export_point.o \ +ltc/pk/ecc/ltc_ecc_import_point.o ltc/pk/ecc/ltc_ecc_is_point.o ltc/pk/ecc/ltc_ecc_is_point_at_infinity.o \ +ltc/pk/ecc/ltc_ecc_map.o ltc/pk/ecc/ltc_ecc_mul2add.o ltc/pk/ecc/ltc_ecc_mulmod.o \ +ltc/pk/ecc/ltc_ecc_mulmod_timing.o ltc/pk/ecc/ltc_ecc_points.o ltc/pk/ecc/ltc_ecc_projective_add_point.o \ +ltc/pk/ecc/ltc_ecc_projective_dbl_point.o ltc/pk/ecc/ltc_ecc_verify_key.o ltc/pk/pkcs1/pkcs_1_i2osp.o \ +ltc/pk/pkcs1/pkcs_1_mgf1.o ltc/pk/pkcs1/pkcs_1_oaep_decode.o ltc/pk/pkcs1/pkcs_1_oaep_encode.o \ +ltc/pk/pkcs1/pkcs_1_os2ip.o ltc/pk/pkcs1/pkcs_1_pss_decode.o ltc/pk/pkcs1/pkcs_1_pss_encode.o \ +ltc/pk/pkcs1/pkcs_1_v1_5_decode.o ltc/pk/pkcs1/pkcs_1_v1_5_encode.o ltc/pk/rsa/rsa_decrypt_key.o \ +ltc/pk/rsa/rsa_encrypt_key.o ltc/pk/rsa/rsa_export.o ltc/pk/rsa/rsa_exptmod.o ltc/pk/rsa/rsa_free.o \ +ltc/pk/rsa/rsa_get_size.o ltc/pk/rsa/rsa_import.o ltc/pk/rsa/rsa_import_pkcs8.o ltc/pk/rsa/rsa_import_x509.o \ ltc/pk/rsa/rsa_make_key.o ltc/pk/rsa/rsa_set.o ltc/pk/rsa/rsa_sign_hash.o ltc/pk/rsa/rsa_sign_saltlen_get.o \ ltc/pk/rsa/rsa_verify_hash.o ltc/prngs/chacha20.o ltc/prngs/fortuna.o ltc/prngs/rc4.o \ ltc/prngs/rng_get_bytes.o ltc/prngs/rng_make_prng.o ltc/prngs/sober128.o ltc/prngs/sprng.o \ @@ -142,18 +142,19 @@ ltm/bn_mp_div_3.o ltm/bn_mp_div_d.o ltm/bn_mp_dr_is_modulus.o ltm/bn_mp_dr_reduce.o \ ltm/bn_mp_dr_setup.o ltm/bn_mp_exch.o ltm/bn_mp_export.o ltm/bn_mp_exptmod.o ltm/bn_mp_exptmod_fast.o \ ltm/bn_mp_expt_d.o ltm/bn_mp_expt_d_ex.o ltm/bn_mp_exteuclid.o ltm/bn_mp_fread.o \ -ltm/bn_mp_fwrite.o ltm/bn_mp_gcd.o ltm/bn_mp_get_int.o ltm/bn_mp_get_long.o ltm/bn_mp_grow.o \ -ltm/bn_mp_import.o ltm/bn_mp_init.o ltm/bn_mp_init_copy.o ltm/bn_mp_init_multi.o \ +ltm/bn_mp_fwrite.o ltm/bn_mp_gcd.o ltm/bn_mp_get_bit.o ltm/bn_mp_get_int.o ltm/bn_mp_get_long.o \ +ltm/bn_mp_grow.o ltm/bn_mp_import.o ltm/bn_mp_init.o ltm/bn_mp_init_copy.o ltm/bn_mp_init_multi.o \ ltm/bn_mp_init_set.o ltm/bn_mp_init_set_int.o ltm/bn_mp_init_size.o ltm/bn_mp_invmod.o \ ltm/bn_mp_invmod_slow.o ltm/bn_mp_is_square.o ltm/bn_mp_jacobi.o ltm/bn_mp_karatsuba_mul.o \ -ltm/bn_mp_karatsuba_sqr.o ltm/bn_mp_lcm.o ltm/bn_mp_lshd.o ltm/bn_mp_mod.o ltm/bn_mp_mod_2d.o \ -ltm/bn_mp_mod_d.o ltm/bn_mp_montgomery_calc_normalization.o ltm/bn_mp_montgomery_reduce.o \ -ltm/bn_mp_montgomery_setup.o ltm/bn_mp_mul.o ltm/bn_mp_mulmod.o ltm/bn_mp_mul_2.o \ -ltm/bn_mp_mul_2d.o ltm/bn_mp_mul_d.o ltm/bn_mp_neg.o ltm/bn_mp_n_root.o ltm/bn_mp_n_root_ex.o \ -ltm/bn_mp_or.o ltm/bn_mp_prime_fermat.o ltm/bn_mp_prime_is_divisible.o ltm/bn_mp_prime_is_prime.o \ -ltm/bn_mp_prime_miller_rabin.o ltm/bn_mp_prime_next_prime.o ltm/bn_mp_prime_rabin_miller_trials.o \ -ltm/bn_mp_prime_random_ex.o ltm/bn_mp_radix_size.o ltm/bn_mp_radix_smap.o ltm/bn_mp_rand.o \ -ltm/bn_mp_read_radix.o ltm/bn_mp_read_signed_bin.o ltm/bn_mp_read_unsigned_bin.o \ +ltm/bn_mp_karatsuba_sqr.o ltm/bn_mp_kronecker.o ltm/bn_mp_lcm.o ltm/bn_mp_lshd.o \ +ltm/bn_mp_mod.o ltm/bn_mp_mod_2d.o ltm/bn_mp_mod_d.o ltm/bn_mp_montgomery_calc_normalization.o \ +ltm/bn_mp_montgomery_reduce.o ltm/bn_mp_montgomery_setup.o ltm/bn_mp_mul.o ltm/bn_mp_mulmod.o \ +ltm/bn_mp_mul_2.o ltm/bn_mp_mul_2d.o ltm/bn_mp_mul_d.o ltm/bn_mp_neg.o ltm/bn_mp_n_root.o \ +ltm/bn_mp_n_root_ex.o ltm/bn_mp_or.o ltm/bn_mp_prime_fermat.o ltm/bn_mp_prime_frobenius_underwood.o \ +ltm/bn_mp_prime_is_divisible.o ltm/bn_mp_prime_is_prime.o ltm/bn_mp_prime_miller_rabin.o \ +ltm/bn_mp_prime_next_prime.o ltm/bn_mp_prime_rabin_miller_trials.o ltm/bn_mp_prime_random_ex.o \ +ltm/bn_mp_prime_strong_lucas_selfridge.o ltm/bn_mp_radix_size.o ltm/bn_mp_radix_smap.o \ +ltm/bn_mp_rand.o ltm/bn_mp_read_radix.o ltm/bn_mp_read_signed_bin.o ltm/bn_mp_read_unsigned_bin.o \ ltm/bn_mp_reduce.o ltm/bn_mp_reduce_2k.o ltm/bn_mp_reduce_2k_l.o ltm/bn_mp_reduce_2k_setup.o \ ltm/bn_mp_reduce_2k_setup_l.o ltm/bn_mp_reduce_is_2k.o ltm/bn_mp_reduce_is_2k_l.o \ ltm/bn_mp_reduce_setup.o ltm/bn_mp_rshd.o ltm/bn_mp_set.o ltm/bn_mp_set_int.o ltm/bn_mp_set_long.o \ diff --git a/src/Makefile.nmake b/src/Makefile.nmake index c78076a..20d7585 100644 --- a/src/Makefile.nmake +++ b/src/Makefile.nmake @@ -102,13 +102,14 @@ ltc/pk/asn1/der/utctime/der_length_utctime.obj ltc/pk/asn1/der/utf8/der_decode_utf8_string.obj \ ltc/pk/asn1/der/utf8/der_encode_utf8_string.obj ltc/pk/asn1/der/utf8/der_length_utf8_string.obj \ ltc/pk/asn1/oid/pk_get_oid.obj ltc/pk/asn1/oid/pk_oid_cmp.obj ltc/pk/asn1/oid/pk_oid_str.obj \ -ltc/pk/asn1/pkcs8/pkcs8_decode_flexi.obj ltc/pk/asn1/x509/x509_decode_subject_public_key_info.obj \ -ltc/pk/asn1/x509/x509_encode_subject_public_key_info.obj ltc/pk/dh/dh.obj ltc/pk/dh/dh_check_pubkey.obj \ -ltc/pk/dh/dh_export.obj ltc/pk/dh/dh_export_key.obj ltc/pk/dh/dh_free.obj ltc/pk/dh/dh_generate_key.obj \ -ltc/pk/dh/dh_import.obj ltc/pk/dh/dh_set.obj ltc/pk/dh/dh_set_pg_dhparam.obj ltc/pk/dh/dh_shared_secret.obj \ -ltc/pk/dsa/dsa_decrypt_key.obj ltc/pk/dsa/dsa_encrypt_key.obj ltc/pk/dsa/dsa_export.obj \ -ltc/pk/dsa/dsa_free.obj ltc/pk/dsa/dsa_generate_key.obj ltc/pk/dsa/dsa_generate_pqg.obj \ -ltc/pk/dsa/dsa_import.obj ltc/pk/dsa/dsa_make_key.obj ltc/pk/dsa/dsa_set.obj ltc/pk/dsa/dsa_set_pqg_dsaparam.obj \ +ltc/pk/asn1/pkcs8/pkcs8_decode_flexi.obj ltc/pk/asn1/x509/x509_decode_public_key_from_certificate.obj \ +ltc/pk/asn1/x509/x509_decode_subject_public_key_info.obj ltc/pk/asn1/x509/x509_encode_subject_public_key_info.obj \ +ltc/pk/dh/dh.obj ltc/pk/dh/dh_check_pubkey.obj ltc/pk/dh/dh_export.obj ltc/pk/dh/dh_export_key.obj \ +ltc/pk/dh/dh_free.obj ltc/pk/dh/dh_generate_key.obj ltc/pk/dh/dh_import.obj ltc/pk/dh/dh_set.obj \ +ltc/pk/dh/dh_set_pg_dhparam.obj ltc/pk/dh/dh_shared_secret.obj ltc/pk/dsa/dsa_decrypt_key.obj \ +ltc/pk/dsa/dsa_encrypt_key.obj ltc/pk/dsa/dsa_export.obj ltc/pk/dsa/dsa_free.obj \ +ltc/pk/dsa/dsa_generate_key.obj ltc/pk/dsa/dsa_generate_pqg.obj ltc/pk/dsa/dsa_import.obj \ +ltc/pk/dsa/dsa_make_key.obj ltc/pk/dsa/dsa_set.obj ltc/pk/dsa/dsa_set_pqg_dsaparam.obj \ ltc/pk/dsa/dsa_shared_secret.obj ltc/pk/dsa/dsa_sign_hash.obj ltc/pk/dsa/dsa_verify_hash.obj \ ltc/pk/dsa/dsa_verify_key.obj ltc/pk/ecc/ecc.obj ltc/pk/ecc/ecc_ansi_x963_export.obj \ ltc/pk/ecc/ecc_ansi_x963_import.obj ltc/pk/ecc/ecc_decrypt_key.obj ltc/pk/ecc/ecc_encrypt_key.obj \ @@ -150,27 +151,27 @@ ltm/bn_mp_dr_is_modulus.obj ltm/bn_mp_dr_reduce.obj ltm/bn_mp_dr_setup.obj ltm/bn_mp_exch.obj \ ltm/bn_mp_export.obj ltm/bn_mp_exptmod.obj ltm/bn_mp_exptmod_fast.obj ltm/bn_mp_expt_d.obj \ ltm/bn_mp_expt_d_ex.obj ltm/bn_mp_exteuclid.obj ltm/bn_mp_fread.obj ltm/bn_mp_fwrite.obj \ -ltm/bn_mp_gcd.obj ltm/bn_mp_get_int.obj ltm/bn_mp_get_long.obj ltm/bn_mp_grow.obj \ -ltm/bn_mp_import.obj ltm/bn_mp_init.obj ltm/bn_mp_init_copy.obj ltm/bn_mp_init_multi.obj \ -ltm/bn_mp_init_set.obj ltm/bn_mp_init_set_int.obj ltm/bn_mp_init_size.obj ltm/bn_mp_invmod.obj \ -ltm/bn_mp_invmod_slow.obj ltm/bn_mp_is_square.obj ltm/bn_mp_jacobi.obj ltm/bn_mp_karatsuba_mul.obj \ -ltm/bn_mp_karatsuba_sqr.obj ltm/bn_mp_lcm.obj ltm/bn_mp_lshd.obj ltm/bn_mp_mod.obj \ -ltm/bn_mp_mod_2d.obj ltm/bn_mp_mod_d.obj ltm/bn_mp_montgomery_calc_normalization.obj \ +ltm/bn_mp_gcd.obj ltm/bn_mp_get_bit.obj ltm/bn_mp_get_int.obj ltm/bn_mp_get_long.obj \ +ltm/bn_mp_grow.obj ltm/bn_mp_import.obj ltm/bn_mp_init.obj ltm/bn_mp_init_copy.obj \ +ltm/bn_mp_init_multi.obj ltm/bn_mp_init_set.obj ltm/bn_mp_init_set_int.obj ltm/bn_mp_init_size.obj \ +ltm/bn_mp_invmod.obj ltm/bn_mp_invmod_slow.obj ltm/bn_mp_is_square.obj ltm/bn_mp_jacobi.obj \ +ltm/bn_mp_karatsuba_mul.obj ltm/bn_mp_karatsuba_sqr.obj ltm/bn_mp_kronecker.obj ltm/bn_mp_lcm.obj \ +ltm/bn_mp_lshd.obj ltm/bn_mp_mod.obj ltm/bn_mp_mod_2d.obj ltm/bn_mp_mod_d.obj ltm/bn_mp_montgomery_calc_normalization.obj \ ltm/bn_mp_montgomery_reduce.obj ltm/bn_mp_montgomery_setup.obj ltm/bn_mp_mul.obj \ ltm/bn_mp_mulmod.obj ltm/bn_mp_mul_2.obj ltm/bn_mp_mul_2d.obj ltm/bn_mp_mul_d.obj \ ltm/bn_mp_neg.obj ltm/bn_mp_n_root.obj ltm/bn_mp_n_root_ex.obj ltm/bn_mp_or.obj ltm/bn_mp_prime_fermat.obj \ -ltm/bn_mp_prime_is_divisible.obj ltm/bn_mp_prime_is_prime.obj ltm/bn_mp_prime_miller_rabin.obj \ -ltm/bn_mp_prime_next_prime.obj ltm/bn_mp_prime_rabin_miller_trials.obj ltm/bn_mp_prime_random_ex.obj \ -ltm/bn_mp_radix_size.obj ltm/bn_mp_radix_smap.obj ltm/bn_mp_rand.obj ltm/bn_mp_read_radix.obj \ -ltm/bn_mp_read_signed_bin.obj ltm/bn_mp_read_unsigned_bin.obj ltm/bn_mp_reduce.obj \ -ltm/bn_mp_reduce_2k.obj ltm/bn_mp_reduce_2k_l.obj ltm/bn_mp_reduce_2k_setup.obj ltm/bn_mp_reduce_2k_setup_l.obj \ -ltm/bn_mp_reduce_is_2k.obj ltm/bn_mp_reduce_is_2k_l.obj ltm/bn_mp_reduce_setup.obj \ -ltm/bn_mp_rshd.obj ltm/bn_mp_set.obj ltm/bn_mp_set_int.obj ltm/bn_mp_set_long.obj \ -ltm/bn_mp_shrink.obj ltm/bn_mp_signed_bin_size.obj ltm/bn_mp_sqr.obj ltm/bn_mp_sqrmod.obj \ -ltm/bn_mp_sqrt.obj ltm/bn_mp_sqrtmod_prime.obj ltm/bn_mp_sub.obj ltm/bn_mp_submod.obj \ -ltm/bn_mp_sub_d.obj ltm/bn_mp_tc_and.obj ltm/bn_mp_tc_div_2d.obj ltm/bn_mp_tc_or.obj \ -ltm/bn_mp_tc_xor.obj ltm/bn_mp_toom_mul.obj ltm/bn_mp_toom_sqr.obj ltm/bn_mp_toradix.obj \ -ltm/bn_mp_toradix_n.obj ltm/bn_mp_to_signed_bin.obj ltm/bn_mp_to_signed_bin_n.obj \ +ltm/bn_mp_prime_frobenius_underwood.obj ltm/bn_mp_prime_is_divisible.obj ltm/bn_mp_prime_is_prime.obj \ +ltm/bn_mp_prime_miller_rabin.obj ltm/bn_mp_prime_next_prime.obj ltm/bn_mp_prime_rabin_miller_trials.obj \ +ltm/bn_mp_prime_random_ex.obj ltm/bn_mp_prime_strong_lucas_selfridge.obj ltm/bn_mp_radix_size.obj \ +ltm/bn_mp_radix_smap.obj ltm/bn_mp_rand.obj ltm/bn_mp_read_radix.obj ltm/bn_mp_read_signed_bin.obj \ +ltm/bn_mp_read_unsigned_bin.obj ltm/bn_mp_reduce.obj ltm/bn_mp_reduce_2k.obj ltm/bn_mp_reduce_2k_l.obj \ +ltm/bn_mp_reduce_2k_setup.obj ltm/bn_mp_reduce_2k_setup_l.obj ltm/bn_mp_reduce_is_2k.obj \ +ltm/bn_mp_reduce_is_2k_l.obj ltm/bn_mp_reduce_setup.obj ltm/bn_mp_rshd.obj ltm/bn_mp_set.obj \ +ltm/bn_mp_set_int.obj ltm/bn_mp_set_long.obj ltm/bn_mp_shrink.obj ltm/bn_mp_signed_bin_size.obj \ +ltm/bn_mp_sqr.obj ltm/bn_mp_sqrmod.obj ltm/bn_mp_sqrt.obj ltm/bn_mp_sqrtmod_prime.obj \ +ltm/bn_mp_sub.obj ltm/bn_mp_submod.obj ltm/bn_mp_sub_d.obj ltm/bn_mp_tc_and.obj ltm/bn_mp_tc_div_2d.obj \ +ltm/bn_mp_tc_or.obj ltm/bn_mp_tc_xor.obj ltm/bn_mp_toom_mul.obj ltm/bn_mp_toom_sqr.obj \ +ltm/bn_mp_toradix.obj ltm/bn_mp_toradix_n.obj ltm/bn_mp_to_signed_bin.obj ltm/bn_mp_to_signed_bin_n.obj \ ltm/bn_mp_to_unsigned_bin.obj ltm/bn_mp_to_unsigned_bin_n.obj ltm/bn_mp_unsigned_bin_size.obj \ ltm/bn_mp_xor.obj ltm/bn_mp_zero.obj ltm/bn_prime_tab.obj ltm/bn_reverse.obj ltm/bn_s_mp_add.obj \ ltm/bn_s_mp_exptmod.obj ltm/bn_s_mp_mul_digs.obj ltm/bn_s_mp_mul_high_digs.obj ltm/bn_s_mp_sqr.obj \ diff --git a/src/ltc/headers/tomcrypt_argchk.h b/src/ltc/headers/tomcrypt_argchk.h index be9ef0f..3e90f1f 100644 --- a/src/ltc/headers/tomcrypt_argchk.h +++ b/src/ltc/headers/tomcrypt_argchk.h @@ -9,18 +9,13 @@ /* Defines the LTC_ARGCHK macro used within the library */ /* ARGTYPE is defined in tomcrypt_cfg.h */ + +/* ARGTYPE is per default defined to 0 */ #if ARGTYPE == 0 #include -/* this is the default LibTomCrypt macro */ -#if defined(__clang__) || defined(__GNUC_MINOR__) -#define NORETURN __attribute__ ((noreturn)) -#else -#define NORETURN -#endif - -void crypt_argchk(const char *v, const char *s, int d) NORETURN; +LTC_NORETURN void crypt_argchk(const char *v, const char *s, int d); #define LTC_ARGCHK(x) do { if (!(x)) { crypt_argchk(#x, __FILE__, __LINE__); } }while(0) #define LTC_ARGCHKVD(x) do { if (!(x)) { crypt_argchk(#x, __FILE__, __LINE__); } }while(0) @@ -37,7 +32,7 @@ #elif ARGTYPE == 3 -#define LTC_ARGCHK(x) +#define LTC_ARGCHK(x) LTC_UNUSED_PARAM(x) #define LTC_ARGCHKVD(x) LTC_ARGCHK(x) #elif ARGTYPE == 4 diff --git a/src/ltc/headers/tomcrypt_cfg.h b/src/ltc/headers/tomcrypt_cfg.h index 5d64ca7..116fd1c 100644 --- a/src/ltc/headers/tomcrypt_cfg.h +++ b/src/ltc/headers/tomcrypt_cfg.h @@ -59,6 +59,14 @@ #define LTC_INLINE inline #else #define LTC_INLINE +#endif + +#if defined(__clang__) || defined(__GNUC_MINOR__) +#define LTC_NORETURN __attribute__ ((noreturn)) +#elif defined(_MSC_VER) +#define LTC_NORETURN __declspec(noreturn) +#else +#define LTC_NORETURN #endif /* type of argument checking, 0=default, 1=fatal and 2=error+continue, 3=nothing */ diff --git a/src/ltc/headers/tomcrypt_custom.h b/src/ltc/headers/tomcrypt_custom.h index aedf08b..d4b72a5 100644 --- a/src/ltc/headers/tomcrypt_custom.h +++ b/src/ltc/headers/tomcrypt_custom.h @@ -554,7 +554,7 @@ #endif #endif -#if defined(LTC_MECC) || defined(LTC_MRSA) || defined(LTC_MDSA) +#if defined(LTC_MECC) || defined(LTC_MRSA) || defined(LTC_MDSA) || defined(LTC_SSH) /* Include the MPI functionality? (required by the PK algorithms) */ #define LTC_MPI diff --git a/src/ltc/headers/tomcrypt_pk.h b/src/ltc/headers/tomcrypt_pk.h index 49eeda5..fc196d0 100644 --- a/src/ltc/headers/tomcrypt_pk.h +++ b/src/ltc/headers/tomcrypt_pk.h @@ -259,7 +259,6 @@ /** the ECC params provided */ extern const ltc_ecc_curve ltc_ecc_curves[]; -int ecc_test(void); void ecc_sizes(int *low, int *high); int ecc_get_size(const ecc_key *key); diff --git a/src/ltc/headers/tomcrypt_private.h b/src/ltc/headers/tomcrypt_private.h index e536d57..0d4842e 100644 --- a/src/ltc/headers/tomcrypt_private.h +++ b/src/ltc/headers/tomcrypt_private.h @@ -330,6 +330,13 @@ int der_utf8_valid_char(const wchar_t c); +typedef int (*public_key_decode_cb)(const unsigned char *in, unsigned long inlen, void *ctx); + +int x509_decode_public_key_from_certificate(const unsigned char *in, unsigned long inlen, + enum ltc_oid_id algorithm, ltc_asn1_type param_type, + ltc_asn1_list* parameters, unsigned long *parameters_len, + public_key_decode_cb callback, void *ctx); + /* SUBJECT PUBLIC KEY INFO */ int x509_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen, unsigned int algorithm, const void* public_key, unsigned long public_key_len, diff --git a/src/ltc/math/ltm_desc.c b/src/ltc/math/ltm_desc.c index 0ee7958..139574b 100644 --- a/src/ltc/math/ltm_desc.c +++ b/src/ltc/math/ltm_desc.c @@ -89,13 +89,22 @@ static int set_int(void *a, ltc_mp_digit b) { LTC_ARGCHK(a != NULL); +#ifdef BN_MP_SET_INT_C return mpi_to_ltc_error(mp_set_int(a, b)); +#else + mp_set_u32(a, b); + return CRYPT_OK; +#endif } static unsigned long get_int(void *a) { LTC_ARGCHK(a != NULL); +#ifdef BN_MP_GET_INT_C return mp_get_int(a); +#else + return mp_get_ul(a); +#endif } static ltc_mp_digit get_digit(void *a, int n) @@ -412,9 +421,7 @@ int err; LTC_ARGCHK(a != NULL); LTC_ARGCHK(c != NULL); - if (b == 0) { - b = LTC_MILLER_RABIN_REPS; - } /* if */ + b = mp_prime_rabin_miller_trials(mp_count_bits(a)); err = mpi_to_ltc_error(mp_prime_is_prime(a, b, c)); *c = (*c == MP_YES) ? LTC_MP_YES : LTC_MP_NO; return err; @@ -426,10 +433,14 @@ return mpi_to_ltc_error(mp_rand(a, size)); } +#ifndef MP_DIGIT_BIT +#define MP_DIGIT_BIT DIGIT_BIT +#endif + const ltc_math_descriptor ltm_desc = { "LibTomMath", - (int)DIGIT_BIT, + (int)MP_DIGIT_BIT, &init, &init_copy, diff --git a/src/ltc/misc/padding/padding_pad.c b/src/ltc/misc/padding/padding_pad.c index b1745ae..57fbb6b 100644 --- a/src/ltc/misc/padding/padding_pad.c +++ b/src/ltc/misc/padding/padding_pad.c @@ -99,11 +99,15 @@ type = mode & LTC_PAD_MASK; if (*padded_length < l) { +#ifdef LTC_RNG_GET_BYTES if (type != LTC_PAD_ISO_10126) { *padded_length = l; } else { *padded_length = length + 256; } +#else + *padded_length = l; +#endif return CRYPT_BUFFER_OVERFLOW; } diff --git a/src/ltc/misc/ssh/ssh_encode_sequence_multi.c b/src/ltc/misc/ssh/ssh_encode_sequence_multi.c index 96facd5..5d83497 100644 --- a/src/ltc/misc/ssh/ssh_encode_sequence_multi.c +++ b/src/ltc/misc/ssh/ssh_encode_sequence_multi.c @@ -121,7 +121,7 @@ size = strlen(sdata); STORE32H(size, out); out += 4; - XSTRNCPY((char *)out, sdata, size); + XMEMCPY(out, sdata, size); out += size; break; case LTC_SSHDATA_MPINT: diff --git a/src/ltc/pk/asn1/x509/x509_decode_public_key_from_certificate.c b/src/ltc/pk/asn1/x509/x509_decode_public_key_from_certificate.c new file mode 100644 index 0000000..0b43c4c --- /dev/null +++ b/src/ltc/pk/asn1/x509/x509_decode_public_key_from_certificate.c @@ -0,0 +1,118 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + */ +#include "tomcrypt_private.h" + +/** + @file x509_decode_public_key_from_certificate.c + ASN.1 DER/X.509, decode a certificate +*/ + +#ifdef LTC_DER + +/* Check if it looks like a SubjectPublicKeyInfo */ +#define LOOKS_LIKE_SPKI(l) ((l) != NULL) \ +&& ((l)->type == LTC_ASN1_SEQUENCE) \ +&& ((l)->child != NULL) \ +&& ((l)->child->type == LTC_ASN1_OBJECT_IDENTIFIER) \ +&& ((l)->next != NULL) \ +&& ((l)->next->type == LTC_ASN1_BIT_STRING) + +/** + Try to decode the public key from a X.509 certificate + @param in The input buffer + @param inlen The length of the input buffer + @param algorithm One out of the enum #public_key_algorithms + @param param_type The parameters' type out of the enum ltc_asn1_type + @param parameters The parameters to include + @param parameters_len [in/out] The number of parameters to include + @param callback The callback + @param ctx The context passed to the callback + @return CRYPT_OK on success, CRYPT_NOP if no SubjectPublicKeyInfo was found +*/ +int x509_decode_public_key_from_certificate(const unsigned char *in, unsigned long inlen, + enum ltc_oid_id algorithm, ltc_asn1_type param_type, + ltc_asn1_list* parameters, unsigned long *parameters_len, + public_key_decode_cb callback, void *ctx) +{ + int err; + unsigned char *tmpbuf; + unsigned long tmpbuf_len, tmp_inlen; + ltc_asn1_list *decoded_list = NULL, *l; + + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(inlen != 0); + + tmpbuf_len = inlen; + tmpbuf = XCALLOC(1, tmpbuf_len); + if (tmpbuf == NULL) { + err = CRYPT_MEM; + goto LBL_OUT; + } + + tmp_inlen = inlen; + if ((err = der_decode_sequence_flexi(in, &tmp_inlen, &decoded_list)) == CRYPT_OK) { + l = decoded_list; + + err = CRYPT_NOP; + + /* Move 2 levels up in the tree + SEQUENCE + SEQUENCE + ... + */ + if ((l->type == LTC_ASN1_SEQUENCE) && (l->child != NULL)) { + l = l->child; + if ((l->type == LTC_ASN1_SEQUENCE) && (l->child != NULL)) { + l = l->child; + + /* Move forward in the tree until we find this combination + ... + SEQUENCE + SEQUENCE + OBJECT IDENTIFIER + NULL + BIT STRING + */ + do { + /* The additional check for l->data is there to make sure + * we won't try to decode a list that has been 'shrunk' + */ + if ((l->type == LTC_ASN1_SEQUENCE) + && (l->data != NULL) + && LOOKS_LIKE_SPKI(l->child)) { + if (algorithm == PKA_EC) { + err = ecc_import_subject_public_key_info(l->data, l->size, ctx); + } else { + err = x509_decode_subject_public_key_info(l->data, l->size, + algorithm, tmpbuf, &tmpbuf_len, + param_type, parameters, parameters_len); + if (err == CRYPT_OK) { + err = callback(tmpbuf, tmpbuf_len, ctx); + goto LBL_OUT; + } + } + } + l = l->next; + } while(l); + } + } + } + +LBL_OUT: + if (decoded_list) der_free_sequence_flexi(decoded_list); + if (tmpbuf != NULL) XFREE(tmpbuf); + + return err; +} + +#endif + +/* ref: $Format:%D$ */ +/* git commit: $Format:%H$ */ +/* commit time: $Format:%ai$ */ diff --git a/src/ltc/pk/asn1/x509/x509_decode_subject_public_key_info.c b/src/ltc/pk/asn1/x509/x509_decode_subject_public_key_info.c index bd84e7c..2d851b5 100644 --- a/src/ltc/pk/asn1/x509/x509_decode_subject_public_key_info.c +++ b/src/ltc/pk/asn1/x509/x509_decode_subject_public_key_info.c @@ -34,7 +34,7 @@ @param public_key_len [in/out] The length of the public key buffer and the written length @param parameters_type The parameters' type out of the enum ltc_asn1_type @param parameters The parameters to include - @param parameters_len [in/out]The number of parameters to include + @param parameters_len [in/out] The number of parameters to include @return CRYPT_OK on success */ int x509_decode_subject_public_key_info(const unsigned char *in, unsigned long inlen, @@ -42,18 +42,25 @@ ltc_asn1_type parameters_type, ltc_asn1_list* parameters, unsigned long *parameters_len) { int err; - unsigned long len, alg_id_num; + unsigned long len, alg_id_num, tmplen; const char* oid; unsigned char *tmpbuf; unsigned long tmpoid[16]; + unsigned long *_parameters_len; ltc_asn1_list alg_id[2]; ltc_asn1_list subject_pubkey[2]; LTC_ARGCHK(in != NULL); LTC_ARGCHK(inlen != 0); LTC_ARGCHK(public_key_len != NULL); + if (parameters_type != LTC_ASN1_EOL) { - LTC_ARGCHK(parameters_len != NULL); + if ((parameters == NULL) || (parameters_len == NULL)) { + tmplen = 0; + _parameters_len = &tmplen; + } else { + _parameters_len = parameters_len; + } } err = pk_get_oid(algorithm, &oid); @@ -72,9 +79,8 @@ LTC_SET_ASN1(alg_id, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, sizeof(tmpoid)/sizeof(tmpoid[0])); if (parameters_type == LTC_ASN1_EOL) { alg_id_num = 1; - } - else { - LTC_SET_ASN1(alg_id, 1, parameters_type, parameters, *parameters_len); + } else { + LTC_SET_ASN1(alg_id, 1, parameters_type, parameters, *_parameters_len); alg_id_num = 2; } @@ -89,7 +95,7 @@ goto LBL_ERR; } if (parameters_type != LTC_ASN1_EOL) { - *parameters_len = alg_id[1].size; + *_parameters_len = alg_id[1].size; } if ((err = pk_oid_cmp_with_asn1(oid, &alg_id[0])) != CRYPT_OK) { diff --git a/src/ltc/pk/ecc/ecc_import_x509.c b/src/ltc/pk/ecc/ecc_import_x509.c index 99a2750..61ee862 100644 --- a/src/ltc/pk/ecc/ecc_import_x509.c +++ b/src/ltc/pk/ecc/ecc_import_x509.c @@ -112,36 +112,7 @@ */ int ecc_import_x509(const unsigned char *in, unsigned long inlen, ecc_key *key) { - int err; - unsigned long len; - ltc_asn1_list *decoded_list = NULL, *l; - - LTC_ARGCHK(in != NULL); - LTC_ARGCHK(key != NULL); - - len = inlen; - if ((err = der_decode_sequence_flexi(in, &len, &decoded_list)) == CRYPT_OK) { - err = CRYPT_ERROR; - l = decoded_list; - if (l->type == LTC_ASN1_SEQUENCE && - l->child && l->child->type == LTC_ASN1_SEQUENCE) { - l = l->child->child; - while (l) { - if (l->type == LTC_ASN1_SEQUENCE && l->data && - l->child && l->child->type == LTC_ASN1_SEQUENCE && - l->child->child && l->child->child->type == LTC_ASN1_OBJECT_IDENTIFIER && - l->child->next && l->child->next->type == LTC_ASN1_BIT_STRING) { - err = ecc_import_subject_public_key_info(l->data, l->size, key); - goto LBL_DONE; - } - l = l->next; - } - } - } - -LBL_DONE: - if (decoded_list) der_free_sequence_flexi(decoded_list); - return err; + return x509_decode_public_key_from_certificate(in, inlen, PKA_EC, LTC_ASN1_EOL, NULL, NULL, NULL, key); } #endif /* LTC_MECC */ diff --git a/src/ltc/pk/rsa/rsa_import_x509.c b/src/ltc/pk/rsa/rsa_import_x509.c index c615b77..5220ae3 100644 --- a/src/ltc/pk/rsa/rsa_import_x509.c +++ b/src/ltc/pk/rsa/rsa_import_x509.c @@ -15,6 +15,15 @@ #ifdef LTC_MRSA +static int _rsa_decode(const unsigned char *in, unsigned long inlen, rsa_key *key) +{ + /* now it should be SEQUENCE { INTEGER, INTEGER } */ + return der_decode_sequence_multi(in, inlen, + LTC_ASN1_INTEGER, 1UL, key->N, + LTC_ASN1_INTEGER, 1UL, key->e, + LTC_ASN1_EOL, 0UL, NULL); +} + /** Import an RSA key from a X.509 certificate @param in The packet to import from @@ -25,9 +34,6 @@ int rsa_import_x509(const unsigned char *in, unsigned long inlen, rsa_key *key) { int err; - unsigned char *tmpbuf; - unsigned long tmpbuf_len, tmp_inlen, len; - ltc_asn1_list *decoded_list = NULL, *l; LTC_ARGCHK(in != NULL); LTC_ARGCHK(key != NULL); @@ -39,74 +45,14 @@ return err; } - tmpbuf_len = inlen; - tmpbuf = XCALLOC(1, tmpbuf_len); - if (tmpbuf == NULL) { - err = CRYPT_MEM; - goto LBL_ERR; + if ((err = x509_decode_public_key_from_certificate(in, inlen, + PKA_RSA, LTC_ASN1_NULL, + NULL, NULL, + (public_key_decode_cb)_rsa_decode, key)) != CRYPT_OK) { + rsa_free(key); + } else { + key->type = PK_PUBLIC; } - - tmp_inlen = inlen; - if ((err = der_decode_sequence_flexi(in, &tmp_inlen, &decoded_list)) == CRYPT_OK) { - l = decoded_list; - /* Move 2 levels up in the tree - SEQUENCE - SEQUENCE - ... - */ - if (l->type == LTC_ASN1_SEQUENCE && l->child) { - l = l->child; - if (l->type == LTC_ASN1_SEQUENCE && l->child) { - l = l->child; - - err = CRYPT_ERROR; - - /* Move forward in the tree until we find this combination - ... - SEQUENCE - SEQUENCE - OBJECT IDENTIFIER 1.2.840.113549.1.1.1 - NULL - BIT STRING - */ - do { - /* The additional check for l->data is there to make sure - * we won't try to decode a list that has been 'shrunk' - */ - if (l->type == LTC_ASN1_SEQUENCE && l->data && l->child && - l->child->type == LTC_ASN1_SEQUENCE && l->child->child && - l->child->child->type == LTC_ASN1_OBJECT_IDENTIFIER && l->child->next && - l->child->next->type == LTC_ASN1_BIT_STRING) { - len = 0; - err = x509_decode_subject_public_key_info(l->data, l->size, - PKA_RSA, tmpbuf, &tmpbuf_len, - LTC_ASN1_NULL, NULL, &len); - if (err == CRYPT_OK) { - /* now it should be SEQUENCE { INTEGER, INTEGER } */ - if ((err = der_decode_sequence_multi(tmpbuf, tmpbuf_len, - LTC_ASN1_INTEGER, 1UL, key->N, - LTC_ASN1_INTEGER, 1UL, key->e, - LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { - goto LBL_ERR; - } - key->type = PK_PUBLIC; - err = CRYPT_OK; - goto LBL_FREE; - } - } - l = l->next; - } while(l); - } - } - } - - -LBL_ERR: - rsa_free(key); - -LBL_FREE: - if (decoded_list) der_free_sequence_flexi(decoded_list); - if (tmpbuf != NULL) XFREE(tmpbuf); return err; } diff --git a/src/ltm/bn_error.c b/src/ltm/bn_error.c index 05b398a..697875f 100644 --- a/src/ltm/bn_error.c +++ b/src/ltm/bn_error.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ static const struct { diff --git a/src/ltm/bn_fast_mp_invmod.c b/src/ltm/bn_fast_mp_invmod.c index be1a810..3c8088f 100644 --- a/src/ltm/bn_fast_mp_invmod.c +++ b/src/ltm/bn_fast_mp_invmod.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* computes the modular inverse via binary extended euclidean algorithm, diff --git a/src/ltm/bn_fast_mp_montgomery_reduce.c b/src/ltm/bn_fast_mp_montgomery_reduce.c index 3454f58..eb5d90b 100644 --- a/src/ltm/bn_fast_mp_montgomery_reduce.c +++ b/src/ltm/bn_fast_mp_montgomery_reduce.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* computes xR**-1 == x (mod N) via Montgomery Reduction diff --git a/src/ltm/bn_fast_s_mp_mul_digs.c b/src/ltm/bn_fast_s_mp_mul_digs.c index 1da314c..4736799 100644 --- a/src/ltm/bn_fast_s_mp_mul_digs.c +++ b/src/ltm/bn_fast_s_mp_mul_digs.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* Fast (comba) multiplier diff --git a/src/ltm/bn_fast_s_mp_mul_high_digs.c b/src/ltm/bn_fast_s_mp_mul_high_digs.c index 45d30ca..06c076c 100644 --- a/src/ltm/bn_fast_s_mp_mul_high_digs.c +++ b/src/ltm/bn_fast_s_mp_mul_high_digs.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* this is a modified version of fast_s_mul_digs that only produces diff --git a/src/ltm/bn_fast_s_mp_sqr.c b/src/ltm/bn_fast_s_mp_sqr.c index 3614a44..5be8e9d 100644 --- a/src/ltm/bn_fast_s_mp_sqr.c +++ b/src/ltm/bn_fast_s_mp_sqr.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* the jist of squaring... diff --git a/src/ltm/bn_mp_2expt.c b/src/ltm/bn_mp_2expt.c index 6737a55..42f5746 100644 --- a/src/ltm/bn_mp_2expt.c +++ b/src/ltm/bn_mp_2expt.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* computes a = 2**b diff --git a/src/ltm/bn_mp_abs.c b/src/ltm/bn_mp_abs.c index 7c60014..f12d261 100644 --- a/src/ltm/bn_mp_abs.c +++ b/src/ltm/bn_mp_abs.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* b = |a| diff --git a/src/ltm/bn_mp_add.c b/src/ltm/bn_mp_add.c index af53713..f04388a 100644 --- a/src/ltm/bn_mp_add.c +++ b/src/ltm/bn_mp_add.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* high level addition (handles signs) */ diff --git a/src/ltm/bn_mp_add_d.c b/src/ltm/bn_mp_add_d.c index 69cbd12..ecdb791 100644 --- a/src/ltm/bn_mp_add_d.c +++ b/src/ltm/bn_mp_add_d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* single digit addition */ diff --git a/src/ltm/bn_mp_addmod.c b/src/ltm/bn_mp_addmod.c index b7907e5..f8e4dda 100644 --- a/src/ltm/bn_mp_addmod.c +++ b/src/ltm/bn_mp_addmod.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* d = a + b (mod c) */ diff --git a/src/ltm/bn_mp_and.c b/src/ltm/bn_mp_and.c index 24f380e..789bb58 100644 --- a/src/ltm/bn_mp_and.c +++ b/src/ltm/bn_mp_and.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* AND two ints together */ diff --git a/src/ltm/bn_mp_clamp.c b/src/ltm/bn_mp_clamp.c index 1bdfdc9..0953f4b 100644 --- a/src/ltm/bn_mp_clamp.c +++ b/src/ltm/bn_mp_clamp.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* trim unused digits diff --git a/src/ltm/bn_mp_clear.c b/src/ltm/bn_mp_clear.c index fc01cb8..1f360b2 100644 --- a/src/ltm/bn_mp_clear.c +++ b/src/ltm/bn_mp_clear.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* clear one (frees) */ diff --git a/src/ltm/bn_mp_clear_multi.c b/src/ltm/bn_mp_clear_multi.c index 9d7d9da..c96b4ac 100644 --- a/src/ltm/bn_mp_clear_multi.c +++ b/src/ltm/bn_mp_clear_multi.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ #include diff --git a/src/ltm/bn_mp_cmp.c b/src/ltm/bn_mp_cmp.c index d6e3761..fdcb8d5 100644 --- a/src/ltm/bn_mp_cmp.c +++ b/src/ltm/bn_mp_cmp.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* compare two ints (signed)*/ diff --git a/src/ltm/bn_mp_cmp_d.c b/src/ltm/bn_mp_cmp_d.c index 9816018..643cac6 100644 --- a/src/ltm/bn_mp_cmp_d.c +++ b/src/ltm/bn_mp_cmp_d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* compare a digit */ diff --git a/src/ltm/bn_mp_cmp_mag.c b/src/ltm/bn_mp_cmp_mag.c index a5f629a..7f6ce27 100644 --- a/src/ltm/bn_mp_cmp_mag.c +++ b/src/ltm/bn_mp_cmp_mag.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* compare maginitude of two ints (unsigned) */ diff --git a/src/ltm/bn_mp_cnt_lsb.c b/src/ltm/bn_mp_cnt_lsb.c index 8e8f488..5d9b327 100644 --- a/src/ltm/bn_mp_cnt_lsb.c +++ b/src/ltm/bn_mp_cnt_lsb.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ static const int lnz[16] = { diff --git a/src/ltm/bn_mp_complement.c b/src/ltm/bn_mp_complement.c index 9dfddc3..5a5a969 100644 --- a/src/ltm/bn_mp_complement.c +++ b/src/ltm/bn_mp_complement.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* b = ~a */ diff --git a/src/ltm/bn_mp_copy.c b/src/ltm/bn_mp_copy.c index 718febd..51e0239 100644 --- a/src/ltm/bn_mp_copy.c +++ b/src/ltm/bn_mp_copy.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* copy, b = a */ diff --git a/src/ltm/bn_mp_count_bits.c b/src/ltm/bn_mp_count_bits.c index 11b84b2..f7a05df 100644 --- a/src/ltm/bn_mp_count_bits.c +++ b/src/ltm/bn_mp_count_bits.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* returns the number of bits in an int */ diff --git a/src/ltm/bn_mp_div.c b/src/ltm/bn_mp_div.c index 0d459d1..44e3cb9 100644 --- a/src/ltm/bn_mp_div.c +++ b/src/ltm/bn_mp_div.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ #ifdef BN_MP_DIV_SMALL diff --git a/src/ltm/bn_mp_div_2.c b/src/ltm/bn_mp_div_2.c index 7ced424..e679d00 100644 --- a/src/ltm/bn_mp_div_2.c +++ b/src/ltm/bn_mp_div_2.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* b = a/2 */ diff --git a/src/ltm/bn_mp_div_2d.c b/src/ltm/bn_mp_div_2d.c index 3fb822c..912faaf 100644 --- a/src/ltm/bn_mp_div_2d.c +++ b/src/ltm/bn_mp_div_2d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* shift right by a certain bit count (store quotient in c, optional remainder in d) */ diff --git a/src/ltm/bn_mp_div_3.c b/src/ltm/bn_mp_div_3.c index c5ca137..33a3432 100644 --- a/src/ltm/bn_mp_div_3.c +++ b/src/ltm/bn_mp_div_3.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* divide by three (based on routine from MPI and the GMP manual) */ diff --git a/src/ltm/bn_mp_div_d.c b/src/ltm/bn_mp_div_d.c index 3020ab2..d30ce33 100644 --- a/src/ltm/bn_mp_div_d.c +++ b/src/ltm/bn_mp_div_d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ static int s_is_power_of_two(mp_digit b, int *p) diff --git a/src/ltm/bn_mp_dr_is_modulus.c b/src/ltm/bn_mp_dr_is_modulus.c index b01c77c..4d0c8ce 100644 --- a/src/ltm/bn_mp_dr_is_modulus.c +++ b/src/ltm/bn_mp_dr_is_modulus.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* determines if a number is a valid DR modulus */ diff --git a/src/ltm/bn_mp_dr_reduce.c b/src/ltm/bn_mp_dr_reduce.c index da36b85..da24d17 100644 --- a/src/ltm/bn_mp_dr_reduce.c +++ b/src/ltm/bn_mp_dr_reduce.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* reduce "x" in place modulo "n" using the Diminished Radix algorithm. diff --git a/src/ltm/bn_mp_dr_setup.c b/src/ltm/bn_mp_dr_setup.c index afcdaf0..f8c7e7e 100644 --- a/src/ltm/bn_mp_dr_setup.c +++ b/src/ltm/bn_mp_dr_setup.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* determines the setup value */ diff --git a/src/ltm/bn_mp_exch.c b/src/ltm/bn_mp_exch.c index b846928..2f33877 100644 --- a/src/ltm/bn_mp_exch.c +++ b/src/ltm/bn_mp_exch.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* swap the elements of two integers, for cases where you can't simply swap the diff --git a/src/ltm/bn_mp_export.c b/src/ltm/bn_mp_export.c index e55101a..ea48e90 100644 --- a/src/ltm/bn_mp_export.c +++ b/src/ltm/bn_mp_export.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* based on gmp's mpz_export. diff --git a/src/ltm/bn_mp_expt_d.c b/src/ltm/bn_mp_expt_d.c index 7aff105..e0df09c 100644 --- a/src/ltm/bn_mp_expt_d.c +++ b/src/ltm/bn_mp_expt_d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* wrapper function for mp_expt_d_ex() */ diff --git a/src/ltm/bn_mp_expt_d_ex.c b/src/ltm/bn_mp_expt_d_ex.c index 53e880c..5a6f7b2 100644 --- a/src/ltm/bn_mp_expt_d_ex.c +++ b/src/ltm/bn_mp_expt_d_ex.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* calculate c = a**b using a square-multiply algorithm */ diff --git a/src/ltm/bn_mp_exptmod.c b/src/ltm/bn_mp_exptmod.c index ec0cf7e..c400b7e 100644 --- a/src/ltm/bn_mp_exptmod.c +++ b/src/ltm/bn_mp_exptmod.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ diff --git a/src/ltm/bn_mp_exptmod_fast.c b/src/ltm/bn_mp_exptmod_fast.c index 0d01e38..4de9c5f 100644 --- a/src/ltm/bn_mp_exptmod_fast.c +++ b/src/ltm/bn_mp_exptmod_fast.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* computes Y == G**X mod P, HAC pp.616, Algorithm 14.85 @@ -165,15 +164,15 @@ } /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ - if ((err = mp_copy(&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + if ((err = mp_copy(&M[1], &M[(size_t)1 << (winsize - 1)])) != MP_OKAY) { goto LBL_RES; } for (x = 0; x < (winsize - 1); x++) { - if ((err = mp_sqr(&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { - goto LBL_RES; - } - if ((err = redux(&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { + if ((err = mp_sqr(&M[(size_t)1 << (winsize - 1)], &M[(size_t)1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux(&M[(size_t)1 << (winsize - 1)], P, mp)) != MP_OKAY) { goto LBL_RES; } } diff --git a/src/ltm/bn_mp_exteuclid.c b/src/ltm/bn_mp_exteuclid.c index b13ee30..c23a6c1 100644 --- a/src/ltm/bn_mp_exteuclid.c +++ b/src/ltm/bn_mp_exteuclid.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* Extended euclidean algorithm of (a, b) produces diff --git a/src/ltm/bn_mp_fread.c b/src/ltm/bn_mp_fread.c index 7652aac..9c935cb 100644 --- a/src/ltm/bn_mp_fread.c +++ b/src/ltm/bn_mp_fread.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ #ifndef LTM_NO_FILE diff --git a/src/ltm/bn_mp_fwrite.c b/src/ltm/bn_mp_fwrite.c index 8df2134..9f0c3df 100644 --- a/src/ltm/bn_mp_fwrite.c +++ b/src/ltm/bn_mp_fwrite.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ #ifndef LTM_NO_FILE diff --git a/src/ltm/bn_mp_gcd.c b/src/ltm/bn_mp_gcd.c index 0a5000e..05030c2 100644 --- a/src/ltm/bn_mp_gcd.c +++ b/src/ltm/bn_mp_gcd.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* Greatest Common Divisor using the binary method */ diff --git a/src/ltm/bn_mp_get_bit.c b/src/ltm/bn_mp_get_bit.c new file mode 100644 index 0000000..ab732c4 --- /dev/null +++ b/src/ltm/bn_mp_get_bit.c @@ -0,0 +1,54 @@ +#include "tommath_private.h" +#ifdef BN_MP_GET_BIT_C + +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * SPDX-License-Identifier: Unlicense + */ + +/* Checks the bit at position b and returns MP_YES + if the bit is 1, MP_NO if it is 0 and MP_VAL + in case of error */ +int mp_get_bit(const mp_int *a, int b) +{ + int limb; + mp_digit bit, isset; + + if (b < 0) { + return MP_VAL; + } + + limb = b / DIGIT_BIT; + + /* + * Zero is a special value with the member "used" set to zero. + * Needs to be tested before the check for the upper boundary + * otherwise (limb >= a->used) would be true for a = 0 + */ + + if (mp_iszero(a) != MP_NO) { + return MP_NO; + } + + if (limb >= a->used) { + return MP_VAL; + } + + bit = (mp_digit)(1) << (b % DIGIT_BIT); + + isset = a->dp[limb] & bit; + return (isset != 0u) ? MP_YES : MP_NO; +} + +#endif + +/* ref: $Format:%D$ */ +/* git commit: $Format:%H$ */ +/* commit time: $Format:%ai$ */ diff --git a/src/ltm/bn_mp_get_int.c b/src/ltm/bn_mp_get_int.c index 4f99363..13eddbf 100644 --- a/src/ltm/bn_mp_get_int.c +++ b/src/ltm/bn_mp_get_int.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* get the lower 32-bits of an mp_int */ diff --git a/src/ltm/bn_mp_get_long.c b/src/ltm/bn_mp_get_long.c index bb9bd75..a4d05d6 100644 --- a/src/ltm/bn_mp_get_long.c +++ b/src/ltm/bn_mp_get_long.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* get the lower unsigned long of an mp_int, platform dependent */ @@ -37,3 +36,7 @@ return res; } #endif + +/* ref: $Format:%D$ */ +/* git commit: $Format:%H$ */ +/* commit time: $Format:%ai$ */ diff --git a/src/ltm/bn_mp_grow.c b/src/ltm/bn_mp_grow.c index d336ba1..1d92b29 100644 --- a/src/ltm/bn_mp_grow.c +++ b/src/ltm/bn_mp_grow.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* grow as required */ diff --git a/src/ltm/bn_mp_import.c b/src/ltm/bn_mp_import.c index e28d20e..066c5b3 100644 --- a/src/ltm/bn_mp_import.c +++ b/src/ltm/bn_mp_import.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* based on gmp's mpz_import. diff --git a/src/ltm/bn_mp_init.c b/src/ltm/bn_mp_init.c index cdc0bd2..7520089 100644 --- a/src/ltm/bn_mp_init.c +++ b/src/ltm/bn_mp_init.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* init a new mp_int */ diff --git a/src/ltm/bn_mp_init_copy.c b/src/ltm/bn_mp_init_copy.c index 3d3e6cd..4739a98 100644 --- a/src/ltm/bn_mp_init_copy.c +++ b/src/ltm/bn_mp_init_copy.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* creates "a" then copies b into it */ diff --git a/src/ltm/bn_mp_init_multi.c b/src/ltm/bn_mp_init_multi.c index d254696..7f8bd04 100644 --- a/src/ltm/bn_mp_init_multi.c +++ b/src/ltm/bn_mp_init_multi.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ #include diff --git a/src/ltm/bn_mp_init_set.c b/src/ltm/bn_mp_init_set.c index 4bce757..36606af 100644 --- a/src/ltm/bn_mp_init_set.c +++ b/src/ltm/bn_mp_init_set.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* initialize and set a digit */ diff --git a/src/ltm/bn_mp_init_set_int.c b/src/ltm/bn_mp_init_set_int.c index 10c5bb7..7d81811 100644 --- a/src/ltm/bn_mp_init_set_int.c +++ b/src/ltm/bn_mp_init_set_int.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* initialize and set a digit */ diff --git a/src/ltm/bn_mp_init_size.c b/src/ltm/bn_mp_init_size.c index ccca5b9..9b933fb 100644 --- a/src/ltm/bn_mp_init_size.c +++ b/src/ltm/bn_mp_init_size.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* init an mp_init for a given size */ diff --git a/src/ltm/bn_mp_invmod.c b/src/ltm/bn_mp_invmod.c index 8dd188c..f1a482d 100644 --- a/src/ltm/bn_mp_invmod.c +++ b/src/ltm/bn_mp_invmod.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* hac 14.61, pp608 */ diff --git a/src/ltm/bn_mp_invmod_slow.c b/src/ltm/bn_mp_invmod_slow.c index 49ed095..e60cf04 100644 --- a/src/ltm/bn_mp_invmod_slow.c +++ b/src/ltm/bn_mp_invmod_slow.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* hac 14.61, pp608 */ diff --git a/src/ltm/bn_mp_is_square.c b/src/ltm/bn_mp_is_square.c index 6e3cb56..5363a47 100644 --- a/src/ltm/bn_mp_is_square.c +++ b/src/ltm/bn_mp_is_square.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* Check if remainders are possible squares - fast exclude non-squares */ diff --git a/src/ltm/bn_mp_jacobi.c b/src/ltm/bn_mp_jacobi.c index fe37f22..1eb3dd4 100644 --- a/src/ltm/bn_mp_jacobi.c +++ b/src/ltm/bn_mp_jacobi.c @@ -9,21 +9,14 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* computes the jacobi c = (a | n) (or Legendre if n is prime) - * HAC pp. 73 Algorithm 2.149 - * HAC is wrong here, as the special case of (0 | 1) is not - * handled correctly. + * Kept for legacy reasons, please use mp_kronecker() instead */ int mp_jacobi(const mp_int *a, const mp_int *n, int *c) { - mp_int a1, p1; - int k, s, r, res; - mp_digit residue; - /* if a < 0 return MP_VAL */ if (mp_isneg(a) == MP_YES) { return MP_VAL; @@ -34,81 +27,7 @@ return MP_VAL; } - /* step 1. handle case of a == 0 */ - if (mp_iszero(a) == MP_YES) { - /* special case of a == 0 and n == 1 */ - if (mp_cmp_d(n, 1uL) == MP_EQ) { - *c = 1; - } else { - *c = 0; - } - return MP_OKAY; - } - - /* step 2. if a == 1, return 1 */ - if (mp_cmp_d(a, 1uL) == MP_EQ) { - *c = 1; - return MP_OKAY; - } - - /* default */ - s = 0; - - /* step 3. write a = a1 * 2**k */ - if ((res = mp_init_copy(&a1, a)) != MP_OKAY) { - return res; - } - - if ((res = mp_init(&p1)) != MP_OKAY) { - goto LBL_A1; - } - - /* divide out larger power of two */ - k = mp_cnt_lsb(&a1); - if ((res = mp_div_2d(&a1, k, &a1, NULL)) != MP_OKAY) { - goto LBL_P1; - } - - /* step 4. if e is even set s=1 */ - if (((unsigned)k & 1u) == 0u) { - s = 1; - } else { - /* else set s=1 if p = 1/7 (mod 8) or s=-1 if p = 3/5 (mod 8) */ - residue = n->dp[0] & 7u; - - if ((residue == 1u) || (residue == 7u)) { - s = 1; - } else if ((residue == 3u) || (residue == 5u)) { - s = -1; - } - } - - /* step 5. if p == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ - if (((n->dp[0] & 3u) == 3u) && ((a1.dp[0] & 3u) == 3u)) { - s = -s; - } - - /* if a1 == 1 we're done */ - if (mp_cmp_d(&a1, 1uL) == MP_EQ) { - *c = s; - } else { - /* n1 = n mod a1 */ - if ((res = mp_mod(n, &a1, &p1)) != MP_OKAY) { - goto LBL_P1; - } - if ((res = mp_jacobi(&p1, &a1, &r)) != MP_OKAY) { - goto LBL_P1; - } - *c = s * r; - } - - /* done */ - res = MP_OKAY; -LBL_P1: - mp_clear(&p1); -LBL_A1: - mp_clear(&a1); - return res; + return mp_kronecker(a, n, c); } #endif diff --git a/src/ltm/bn_mp_karatsuba_mul.c b/src/ltm/bn_mp_karatsuba_mul.c index af12c55..cb75bca 100644 --- a/src/ltm/bn_mp_karatsuba_mul.c +++ b/src/ltm/bn_mp_karatsuba_mul.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* c = |a| * |b| using Karatsuba Multiplication using diff --git a/src/ltm/bn_mp_karatsuba_sqr.c b/src/ltm/bn_mp_karatsuba_sqr.c index 99a31b8..c219a37 100644 --- a/src/ltm/bn_mp_karatsuba_sqr.c +++ b/src/ltm/bn_mp_karatsuba_sqr.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* Karatsuba squaring, computes b = a*a using three diff --git a/src/ltm/bn_mp_kronecker.c b/src/ltm/bn_mp_kronecker.c new file mode 100644 index 0000000..a20fa74 --- /dev/null +++ b/src/ltm/bn_mp_kronecker.c @@ -0,0 +1,144 @@ +#include "tommath_private.h" +#ifdef BN_MP_KRONECKER_C + +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * SPDX-License-Identifier: Unlicense + */ + +/* + Kronecker symbol (a|p) + Straightforward implementation of algorithm 1.4.10 in + Henri Cohen: "A Course in Computational Algebraic Number Theory" + + @book{cohen2013course, + title={A course in computational algebraic number theory}, + author={Cohen, Henri}, + volume={138}, + year={2013}, + publisher={Springer Science \& Business Media} + } + */ +int mp_kronecker(const mp_int *a, const mp_int *p, int *c) +{ + mp_int a1, p1, r; + + int e = MP_OKAY; + int v, k; + + static const int table[8] = {0, 1, 0, -1, 0, -1, 0, 1}; + + if (mp_iszero(p) != MP_NO) { + if ((a->used == 1) && (a->dp[0] == 1u)) { + *c = 1; + return e; + } else { + *c = 0; + return e; + } + } + + if ((mp_iseven(a) != MP_NO) && (mp_iseven(p) != MP_NO)) { + *c = 0; + return e; + } + + if ((e = mp_init_copy(&a1, a)) != MP_OKAY) { + return e; + } + if ((e = mp_init_copy(&p1, p)) != MP_OKAY) { + goto LBL_KRON_0; + } + + v = mp_cnt_lsb(&p1); + if ((e = mp_div_2d(&p1, v, &p1, NULL)) != MP_OKAY) { + goto LBL_KRON_1; + } + + if ((v & 0x1) == 0) { + k = 1; + } else { + k = table[a->dp[0] & 7u]; + } + + if (p1.sign == MP_NEG) { + p1.sign = MP_ZPOS; + if (a1.sign == MP_NEG) { + k = -k; + } + } + + if ((e = mp_init(&r)) != MP_OKAY) { + goto LBL_KRON_1; + } + + for (;;) { + if (mp_iszero(&a1) != MP_NO) { + if (mp_cmp_d(&p1, 1uL) == MP_EQ) { + *c = k; + goto LBL_KRON; + } else { + *c = 0; + goto LBL_KRON; + } + } + + v = mp_cnt_lsb(&a1); + if ((e = mp_div_2d(&a1, v, &a1, NULL)) != MP_OKAY) { + goto LBL_KRON; + } + + if ((v & 0x1) == 1) { + k = k * table[p1.dp[0] & 7u]; + } + + if (a1.sign == MP_NEG) { + /* + * Compute k = (-1)^((a1)*(p1-1)/4) * k + * a1.dp[0] + 1 cannot overflow because the MSB + * of the type mp_digit is not set by definition + */ + if (((a1.dp[0] + 1u) & p1.dp[0] & 2u) != 0u) { + k = -k; + } + } else { + /* compute k = (-1)^((a1-1)*(p1-1)/4) * k */ + if ((a1.dp[0] & p1.dp[0] & 2u) != 0u) { + k = -k; + } + } + + if ((e = mp_copy(&a1, &r)) != MP_OKAY) { + goto LBL_KRON; + } + r.sign = MP_ZPOS; + if ((e = mp_mod(&p1, &r, &a1)) != MP_OKAY) { + goto LBL_KRON; + } + if ((e = mp_copy(&r, &p1)) != MP_OKAY) { + goto LBL_KRON; + } + } + +LBL_KRON: + mp_clear(&r); +LBL_KRON_1: + mp_clear(&p1); +LBL_KRON_0: + mp_clear(&a1); + + return e; +} + +#endif + +/* ref: $Format:%D$ */ +/* git commit: $Format:%H$ */ +/* commit time: $Format:%ai$ */ diff --git a/src/ltm/bn_mp_lcm.c b/src/ltm/bn_mp_lcm.c index 3798afc..cb9fa3d 100644 --- a/src/ltm/bn_mp_lcm.c +++ b/src/ltm/bn_mp_lcm.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* computes least common multiple as |a*b|/(a, b) */ diff --git a/src/ltm/bn_mp_lshd.c b/src/ltm/bn_mp_lshd.c index 649df90..6762a10 100644 --- a/src/ltm/bn_mp_lshd.c +++ b/src/ltm/bn_mp_lshd.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* shift left a certain amount of digits */ diff --git a/src/ltm/bn_mp_mod.c b/src/ltm/bn_mp_mod.c index 21acf8c..fa022a7 100644 --- a/src/ltm/bn_mp_mod.c +++ b/src/ltm/bn_mp_mod.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* c = a mod b, 0 <= c < b if b > 0, b < c <= 0 if b < 0 */ diff --git a/src/ltm/bn_mp_mod_2d.c b/src/ltm/bn_mp_mod_2d.c index bf69221..759198b 100644 --- a/src/ltm/bn_mp_mod_2d.c +++ b/src/ltm/bn_mp_mod_2d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* calc a value mod 2**b */ diff --git a/src/ltm/bn_mp_mod_d.c b/src/ltm/bn_mp_mod_d.c index 5252c4f..f58b6b5 100644 --- a/src/ltm/bn_mp_mod_d.c +++ b/src/ltm/bn_mp_mod_d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ int mp_mod_d(const mp_int *a, mp_digit b, mp_digit *c) diff --git a/src/ltm/bn_mp_montgomery_calc_normalization.c b/src/ltm/bn_mp_montgomery_calc_normalization.c index 8b0a320..848378c 100644 --- a/src/ltm/bn_mp_montgomery_calc_normalization.c +++ b/src/ltm/bn_mp_montgomery_calc_normalization.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* diff --git a/src/ltm/bn_mp_montgomery_reduce.c b/src/ltm/bn_mp_montgomery_reduce.c index 2def073..382c7cc 100644 --- a/src/ltm/bn_mp_montgomery_reduce.c +++ b/src/ltm/bn_mp_montgomery_reduce.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* computes xR**-1 == x (mod N) via Montgomery Reduction */ diff --git a/src/ltm/bn_mp_montgomery_setup.c b/src/ltm/bn_mp_montgomery_setup.c index cd53b6d..26c632a 100644 --- a/src/ltm/bn_mp_montgomery_setup.c +++ b/src/ltm/bn_mp_montgomery_setup.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* setups the montgomery reduction stuff */ diff --git a/src/ltm/bn_mp_mul.c b/src/ltm/bn_mp_mul.c index e7613a3..f83b1b7 100644 --- a/src/ltm/bn_mp_mul.c +++ b/src/ltm/bn_mp_mul.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* high level multiplication (handles sign) */ diff --git a/src/ltm/bn_mp_mul_2.c b/src/ltm/bn_mp_mul_2.c index e0f051f..2ed5516 100644 --- a/src/ltm/bn_mp_mul_2.c +++ b/src/ltm/bn_mp_mul_2.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* b = a*2 */ diff --git a/src/ltm/bn_mp_mul_2d.c b/src/ltm/bn_mp_mul_2d.c index 42c6535..9ea548d 100644 --- a/src/ltm/bn_mp_mul_2d.c +++ b/src/ltm/bn_mp_mul_2d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* shift left by a certain bit count */ diff --git a/src/ltm/bn_mp_mul_d.c b/src/ltm/bn_mp_mul_d.c index d6bddfd..936e133 100644 --- a/src/ltm/bn_mp_mul_d.c +++ b/src/ltm/bn_mp_mul_d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* multiply by a digit */ diff --git a/src/ltm/bn_mp_mulmod.c b/src/ltm/bn_mp_mulmod.c index ca9ef3e..4192452 100644 --- a/src/ltm/bn_mp_mulmod.c +++ b/src/ltm/bn_mp_mulmod.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* d = a * b (mod c) */ diff --git a/src/ltm/bn_mp_n_root.c b/src/ltm/bn_mp_n_root.c index 16232d8..c14771f 100644 --- a/src/ltm/bn_mp_n_root.c +++ b/src/ltm/bn_mp_n_root.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* wrapper function for mp_n_root_ex() diff --git a/src/ltm/bn_mp_n_root_ex.c b/src/ltm/bn_mp_n_root_ex.c index 9fd7098..ebc08ba 100644 --- a/src/ltm/bn_mp_n_root_ex.c +++ b/src/ltm/bn_mp_n_root_ex.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* find the n'th root of an integer diff --git a/src/ltm/bn_mp_neg.c b/src/ltm/bn_mp_neg.c index 612b9c7..9020525 100644 --- a/src/ltm/bn_mp_neg.c +++ b/src/ltm/bn_mp_neg.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* b = -a */ diff --git a/src/ltm/bn_mp_or.c b/src/ltm/bn_mp_or.c index 151dfff..a0f2711 100644 --- a/src/ltm/bn_mp_or.c +++ b/src/ltm/bn_mp_or.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* OR two ints together */ diff --git a/src/ltm/bn_mp_prime_fermat.c b/src/ltm/bn_mp_prime_fermat.c index 7cd39bd..63ced96 100644 --- a/src/ltm/bn_mp_prime_fermat.c +++ b/src/ltm/bn_mp_prime_fermat.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* performs one Fermat test. diff --git a/src/ltm/bn_mp_prime_frobenius_underwood.c b/src/ltm/bn_mp_prime_frobenius_underwood.c new file mode 100644 index 0000000..4ceb51e --- /dev/null +++ b/src/ltm/bn_mp_prime_frobenius_underwood.c @@ -0,0 +1,198 @@ +#include "tommath_private.h" +#ifdef BN_MP_PRIME_FROBENIUS_UNDERWOOD_C + +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * SPDX-License-Identifier: Unlicense + */ + +/* + * See file bn_mp_prime_is_prime.c or the documentation in doc/bn.tex for the details + */ +#ifndef LTM_USE_FIPS_ONLY + +#ifdef MP_8BIT +/* + * floor of positive solution of + * (2^16)-1 = (a+4)*(2*a+5) + * TODO: Both values are smaller than N^(1/4), would have to use a bigint + * for a instead but any a biger than about 120 are already so rare that + * it is possible to ignore them and still get enough pseudoprimes. + * But it is still a restriction of the set of available pseudoprimes + * which makes this implementation less secure if used stand-alone. + */ +#define LTM_FROBENIUS_UNDERWOOD_A 177 +#else +#define LTM_FROBENIUS_UNDERWOOD_A 32764 +#endif +int mp_prime_frobenius_underwood(const mp_int *N, int *result) +{ + mp_int T1z, T2z, Np1z, sz, tz; + + int a, ap2, length, i, j, isset; + int e; + + *result = MP_NO; + + if ((e = mp_init_multi(&T1z, &T2z, &Np1z, &sz, &tz, NULL)) != MP_OKAY) { + return e; + } + + for (a = 0; a < LTM_FROBENIUS_UNDERWOOD_A; a++) { + /* TODO: That's ugly! No, really, it is! */ + if ((a==2) || (a==4) || (a==7) || (a==8) || (a==10) || + (a==14) || (a==18) || (a==23) || (a==26) || (a==28)) { + continue; + } + /* (32764^2 - 4) < 2^31, no bigint for >MP_8BIT needed) */ + if ((e = mp_set_long(&T1z, (unsigned long)a)) != MP_OKAY) { + goto LBL_FU_ERR; + } + + if ((e = mp_sqr(&T1z, &T1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + + if ((e = mp_sub_d(&T1z, 4uL, &T1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + + if ((e = mp_kronecker(&T1z, N, &j)) != MP_OKAY) { + goto LBL_FU_ERR; + } + + if (j == -1) { + break; + } + + if (j == 0) { + /* composite */ + goto LBL_FU_ERR; + } + } + /* Tell it a composite and set return value accordingly */ + if (a >= LTM_FROBENIUS_UNDERWOOD_A) { + e = MP_ITER; + goto LBL_FU_ERR; + } + /* Composite if N and (a+4)*(2*a+5) are not coprime */ + if ((e = mp_set_long(&T1z, (unsigned long)((a+4)*((2*a)+5)))) != MP_OKAY) { + goto LBL_FU_ERR; + } + + if ((e = mp_gcd(N, &T1z, &T1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + + if (!((T1z.used == 1) && (T1z.dp[0] == 1u))) { + goto LBL_FU_ERR; + } + + ap2 = a + 2; + if ((e = mp_add_d(N, 1uL, &Np1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + + mp_set(&sz, 1uL); + mp_set(&tz, 2uL); + length = mp_count_bits(&Np1z); + + for (i = length - 2; i >= 0; i--) { + /* + * temp = (sz*(a*sz+2*tz))%N; + * tz = ((tz-sz)*(tz+sz))%N; + * sz = temp; + */ + if ((e = mp_mul_2(&tz, &T2z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + + /* a = 0 at about 50% of the cases (non-square and odd input) */ + if (a != 0) { + if ((e = mp_mul_d(&sz, (mp_digit)a, &T1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((e = mp_add(&T1z, &T2z, &T2z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + } + + if ((e = mp_mul(&T2z, &sz, &T1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((e = mp_sub(&tz, &sz, &T2z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((e = mp_add(&sz, &tz, &sz)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((e = mp_mul(&sz, &T2z, &tz)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((e = mp_mod(&tz, N, &tz)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((e = mp_mod(&T1z, N, &sz)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((isset = mp_get_bit(&Np1z, i)) == MP_VAL) { + e = isset; + goto LBL_FU_ERR; + } + if (isset == MP_YES) { + /* + * temp = (a+2) * sz + tz + * tz = 2 * tz - sz + * sz = temp + */ + if (a == 0) { + if ((e = mp_mul_2(&sz, &T1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + } else { + if ((e = mp_mul_d(&sz, (mp_digit)ap2, &T1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + } + if ((e = mp_add(&T1z, &tz, &T1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((e = mp_mul_2(&tz, &T2z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((e = mp_sub(&T2z, &sz, &tz)) != MP_OKAY) { + goto LBL_FU_ERR; + } + mp_exch(&sz, &T1z); + } + } + + if ((e = mp_set_long(&T1z, (unsigned long)((2 * a) + 5))) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((e = mp_mod(&T1z, N, &T1z)) != MP_OKAY) { + goto LBL_FU_ERR; + } + if ((mp_iszero(&sz) != MP_NO) && (mp_cmp(&tz, &T1z) == MP_EQ)) { + *result = MP_YES; + goto LBL_FU_ERR; + } + +LBL_FU_ERR: + mp_clear_multi(&tz, &sz, &Np1z, &T2z, &T1z, NULL); + return e; +} + +#endif +#endif + +/* ref: $Format:%D$ */ +/* git commit: $Format:%H$ */ +/* commit time: $Format:%ai$ */ diff --git a/src/ltm/bn_mp_prime_is_divisible.c b/src/ltm/bn_mp_prime_is_divisible.c index 706521e..0e6e2f3 100644 --- a/src/ltm/bn_mp_prime_is_divisible.c +++ b/src/ltm/bn_mp_prime_is_divisible.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* determines if an integers is divisible by one diff --git a/src/ltm/bn_mp_prime_is_prime.c b/src/ltm/bn_mp_prime_is_prime.c index 209fba0..63d3725 100644 --- a/src/ltm/bn_mp_prime_is_prime.c +++ b/src/ltm/bn_mp_prime_is_prime.c @@ -9,37 +9,72 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ -/* performs a variable number of rounds of Miller-Rabin - * - * Probability of error after t rounds is no more than - - * - * Sets result to 1 if probably prime, 0 otherwise - */ +/* portable integer log of two with small footprint */ +static unsigned int s_floor_ilog2(int value) +{ + unsigned int r = 0; + while ((value >>= 1) != 0) { + r++; + } + return r; +} + + int mp_prime_is_prime(const mp_int *a, int t, int *result) { mp_int b; - int ix, err, res; + int ix, err, res, p_max = 0, size_a, len; + unsigned int fips_rand, mask; /* default to no */ *result = MP_NO; /* valid value of t? */ - if ((t <= 0) || (t > PRIME_SIZE)) { + if (t > PRIME_SIZE) { return MP_VAL; + } + + /* Some shortcuts */ + /* N > 3 */ + if (a->used == 1) { + if ((a->dp[0] == 0u) || (a->dp[0] == 1u)) { + *result = 0; + return MP_OKAY; + } + if (a->dp[0] == 2u) { + *result = 1; + return MP_OKAY; + } + } + + /* N must be odd */ + if (mp_iseven(a) == MP_YES) { + return MP_OKAY; + } + /* N is not a perfect square: floor(sqrt(N))^2 != N */ + if ((err = mp_is_square(a, &res)) != MP_OKAY) { + return err; + } + if (res != 0) { + return MP_OKAY; } /* is the input equal to one of the primes in the table? */ for (ix = 0; ix < PRIME_SIZE; ix++) { if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { - *result = 1; + *result = MP_YES; return MP_OKAY; } } +#ifdef MP_8BIT + /* The search in the loop above was exhaustive in this case */ + if (a->used == 1 && PRIME_SIZE >= 31) { + return MP_OKAY; + } +#endif /* first perform trial division */ if ((err = mp_prime_is_divisible(a, &res)) != MP_OKAY) { @@ -51,21 +86,270 @@ return MP_OKAY; } - /* now perform the miller-rabin rounds */ - if ((err = mp_init(&b)) != MP_OKAY) { + /* + Run the Miller-Rabin test with base 2 for the BPSW test. + */ + if ((err = mp_init_set(&b, 2uL)) != MP_OKAY) { return err; } - for (ix = 0; ix < t; ix++) { - /* set the prime */ - mp_set(&b, ltm_prime_tab[ix]); - - if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { - goto LBL_B; - } - + if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { + goto LBL_B; + } + if (res == MP_NO) { + goto LBL_B; + } + /* + Rumours have it that Mathematica does a second M-R test with base 3. + Other rumours have it that their strong L-S test is slightly different. + It does not hurt, though, beside a bit of extra runtime. + */ + b.dp[0]++; + if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { + goto LBL_B; + } + if (res == MP_NO) { + goto LBL_B; + } + + /* + * Both, the Frobenius-Underwood test and the the Lucas-Selfridge test are quite + * slow so if speed is an issue, define LTM_USE_FIPS_ONLY to use M-R tests with + * bases 2, 3 and t random bases. + */ +#ifndef LTM_USE_FIPS_ONLY + if (t >= 0) { + /* + * Use a Frobenius-Underwood test instead of the Lucas-Selfridge test for + * MP_8BIT (It is unknown if the Lucas-Selfridge test works with 16-bit + * integers but the necesssary analysis is on the todo-list). + */ +#if defined (MP_8BIT) || defined (LTM_USE_FROBENIUS_TEST) + err = mp_prime_frobenius_underwood(a, &res); + if (err != MP_OKAY && err != MP_ITER) { + goto LBL_B; + } if (res == MP_NO) { goto LBL_B; + } +#else + if ((err = mp_prime_strong_lucas_selfridge(a, &res)) != MP_OKAY) { + goto LBL_B; + } + if (res == MP_NO) { + goto LBL_B; + } +#endif + } +#endif + + /* run at least one Miller-Rabin test with a random base */ + if (t == 0) { + t = 1; + } + + /* + abs(t) extra rounds of M-R to extend the range of primes it can find if t < 0. + Only recommended if the input range is known to be < 3317044064679887385961981 + + It uses the bases for a deterministic M-R test if input < 3317044064679887385961981 + The caller has to check the size. + + Not for cryptographic use because with known bases strong M-R pseudoprimes can + be constructed. Use at least one M-R test with a random base (t >= 1). + + The 1119 bit large number + + 80383745745363949125707961434194210813883768828755814583748891752229742737653\ + 33652186502336163960045457915042023603208766569966760987284043965408232928738\ + 79185086916685732826776177102938969773947016708230428687109997439976544144845\ + 34115587245063340927902227529622941498423068816854043264575340183297861112989\ + 60644845216191652872597534901 + + has been constructed by F. Arnault (F. Arnault, "Rabin-Miller primality test: + composite numbers which pass it.", Mathematics of Computation, 1995, 64. Jg., + Nr. 209, S. 355-361), is a semiprime with the two factors + + 40095821663949960541830645208454685300518816604113250877450620473800321707011\ + 96242716223191597219733582163165085358166969145233813917169287527980445796800\ + 452592031836601 + + 20047910831974980270915322604227342650259408302056625438725310236900160853505\ + 98121358111595798609866791081582542679083484572616906958584643763990222898400\ + 226296015918301 + + and it is a strong pseudoprime to all forty-six prime M-R bases up to 200 + + It does not fail the strong Bailley-PSP test as implemented here, it is just + given as an example, if not the reason to use the BPSW-test instead of M-R-tests + with a sequence of primes 2...n. + + */ + if (t < 0) { + t = -t; + /* + Sorenson, Jonathan; Webster, Jonathan (2015). + "Strong Pseudoprimes to Twelve Prime Bases". + */ + /* 0x437ae92817f9fc85b7e5 = 318665857834031151167461 */ + if ((err = mp_read_radix(&b, "437ae92817f9fc85b7e5", 16)) != MP_OKAY) { + goto LBL_B; + } + + if (mp_cmp(a, &b) == MP_LT) { + p_max = 12; + } else { + /* 0x2be6951adc5b22410a5fd = 3317044064679887385961981 */ + if ((err = mp_read_radix(&b, "2be6951adc5b22410a5fd", 16)) != MP_OKAY) { + goto LBL_B; + } + + if (mp_cmp(a, &b) == MP_LT) { + p_max = 13; + } else { + err = MP_VAL; + goto LBL_B; + } + } + + /* for compatibility with the current API (well, compatible within a sign's width) */ + if (p_max < t) { + p_max = t; + } + + if (p_max > PRIME_SIZE) { + err = MP_VAL; + goto LBL_B; + } + /* we did bases 2 and 3 already, skip them */ + for (ix = 2; ix < p_max; ix++) { + mp_set(&b, ltm_prime_tab[ix]); + if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { + goto LBL_B; + } + if (res == MP_NO) { + goto LBL_B; + } + } + } + /* + Do "t" M-R tests with random bases between 3 and "a". + See Fips 186.4 p. 126ff + */ + else if (t > 0) { + /* + * The mp_digit's have a defined bit-size but the size of the + * array a.dp is a simple 'int' and this library can not assume full + * compliance to the current C-standard (ISO/IEC 9899:2011) because + * it gets used for small embeded processors, too. Some of those MCUs + * have compilers that one cannot call standard compliant by any means. + * Hence the ugly type-fiddling in the following code. + */ + size_a = mp_count_bits(a); + mask = (1u << s_floor_ilog2(size_a)) - 1u; + /* + Assuming the General Rieman hypothesis (never thought to write that in a + comment) the upper bound can be lowered to 2*(log a)^2. + E. Bach, "Explicit bounds for primality testing and related problems," + Math. Comp. 55 (1990), 355-380. + + size_a = (size_a/10) * 7; + len = 2 * (size_a * size_a); + + E.g.: a number of size 2^2048 would be reduced to the upper limit + + floor(2048/10)*7 = 1428 + 2 * 1428^2 = 4078368 + + (would have been ~4030331.9962 with floats and natural log instead) + That number is smaller than 2^28, the default bit-size of mp_digit. + */ + + /* + How many tests, you might ask? Dana Jacobsen of Math::Prime::Util fame + does exactly 1. In words: one. Look at the end of _GMP_is_prime() in + Math-Prime-Util-GMP-0.50/primality.c if you do not believe it. + + The function mp_rand() goes to some length to use a cryptographically + good PRNG. That also means that the chance to always get the same base + in the loop is non-zero, although very low. + If the BPSW test and/or the addtional Frobenious test have been + performed instead of just the Miller-Rabin test with the bases 2 and 3, + a single extra test should suffice, so such a very unlikely event + will not do much harm. + + To preemptivly answer the dangling question: no, a witness does not + need to be prime. + */ + for (ix = 0; ix < t; ix++) { + /* mp_rand() guarantees the first digit to be non-zero */ + if ((err = mp_rand(&b, 1)) != MP_OKAY) { + goto LBL_B; + } + /* + * Reduce digit before casting because mp_digit might be bigger than + * an unsigned int and "mask" on the other side is most probably not. + */ + fips_rand = (unsigned int)(b.dp[0] & (mp_digit) mask); +#ifdef MP_8BIT + /* + * One 8-bit digit is too small, so concatenate two if the size of + * unsigned int allows for it. + */ + if ((sizeof(unsigned int) * CHAR_BIT)/2 >= (sizeof(mp_digit) * CHAR_BIT)) { + if ((err = mp_rand(&b, 1)) != MP_OKAY) { + goto LBL_B; + } + fips_rand <<= sizeof(mp_digit) * CHAR_BIT; + fips_rand |= (unsigned int) b.dp[0]; + fips_rand &= mask; + } +#endif + /* Ceil, because small numbers have a right to live, too, */ + len = (((int)fips_rand + DIGIT_BIT) / DIGIT_BIT); + /* Unlikely. */ + if (len < 0) { + ix--; + continue; + } + /* + * As mentioned above, one 8-bit digit is too small and + * although it can only happen in the unlikely case that + * an "unsigned int" is smaller than 16 bit a simple test + * is cheap and the correction even cheaper. + */ +#ifdef MP_8BIT + /* All "a" < 2^8 have been caught before */ + if (len == 1) { + len++; + } +#endif + if ((err = mp_rand(&b, len)) != MP_OKAY) { + goto LBL_B; + } + /* + * That number might got too big and the witness has to be + * smaller than or equal to "a" + */ + len = mp_count_bits(&b); + if (len > size_a) { + len = len - size_a; + if ((err = mp_div_2d(&b, len, &b, NULL)) != MP_OKAY) { + goto LBL_B; + } + } + + /* Although the chance for b <= 3 is miniscule, try again. */ + if (mp_cmp_d(&b, 3uL) != MP_GT) { + ix--; + continue; + } + if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { + goto LBL_B; + } + if (res == MP_NO) { + goto LBL_B; + } } } @@ -75,6 +359,7 @@ mp_clear(&b); return err; } + #endif /* ref: $Format:%D$ */ diff --git a/src/ltm/bn_mp_prime_miller_rabin.c b/src/ltm/bn_mp_prime_miller_rabin.c index 5d94e36..a12e533 100644 --- a/src/ltm/bn_mp_prime_miller_rabin.c +++ b/src/ltm/bn_mp_prime_miller_rabin.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* Miller-Rabin test of "a" to the base of "b" as described in diff --git a/src/ltm/bn_mp_prime_next_prime.c b/src/ltm/bn_mp_prime_next_prime.c index 89e2841..28256ca 100644 --- a/src/ltm/bn_mp_prime_next_prime.c +++ b/src/ltm/bn_mp_prime_next_prime.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* finds the next prime after the number "a" using "t" trials @@ -23,11 +22,6 @@ int err, res = MP_NO, x, y; mp_digit res_tab[PRIME_SIZE], step, kstep; mp_int b; - - /* ensure t is valid */ - if ((t <= 0) || (t > PRIME_SIZE)) { - return MP_VAL; - } /* force positive */ a->sign = MP_ZPOS; @@ -141,17 +135,9 @@ continue; } - /* is this prime? */ - for (x = 0; x < t; x++) { - mp_set(&b, ltm_prime_tab[x]); - if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { - goto LBL_ERR; - } - if (res == MP_NO) { - break; - } + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { + goto LBL_ERR; } - if (res == MP_YES) { break; } diff --git a/src/ltm/bn_mp_prime_rabin_miller_trials.c b/src/ltm/bn_mp_prime_rabin_miller_trials.c index d400902..1c0a748 100644 --- a/src/ltm/bn_mp_prime_rabin_miller_trials.c +++ b/src/ltm/bn_mp_prime_rabin_miller_trials.c @@ -9,25 +9,31 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ static const struct { int k, t; } sizes[] = { - { 128, 28 }, + { 80, -1 }, /* Use deterministic algorithm for size <= 80 bits */ + { 81, 39 }, + { 96, 37 }, + { 128, 32 }, + { 160, 27 }, + { 192, 21 }, { 256, 16 }, { 384, 10 }, { 512, 7 }, { 640, 6 }, { 768, 5 }, { 896, 4 }, - { 1024, 4 } + { 1024, 4 }, + { 2048, 2 }, + { 4096, 1 }, }; -/* returns # of RM trials required for a given bit size */ +/* returns # of RM trials required for a given bit size and max. error of 2^(-96)*/ int mp_prime_rabin_miller_trials(int size) { int x; diff --git a/src/ltm/bn_mp_prime_random_ex.c b/src/ltm/bn_mp_prime_random_ex.c index 13fdcdf..b0b4632 100644 --- a/src/ltm/bn_mp_prime_random_ex.c +++ b/src/ltm/bn_mp_prime_random_ex.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* makes a truly random prime of a given size (bits), diff --git a/src/ltm/bn_mp_prime_strong_lucas_selfridge.c b/src/ltm/bn_mp_prime_strong_lucas_selfridge.c new file mode 100644 index 0000000..68c7ee3 --- /dev/null +++ b/src/ltm/bn_mp_prime_strong_lucas_selfridge.c @@ -0,0 +1,412 @@ +#include "tommath_private.h" +#ifdef BN_MP_PRIME_STRONG_LUCAS_SELFRIDGE_C + +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * SPDX-License-Identifier: Unlicense + */ + +/* + * See file bn_mp_prime_is_prime.c or the documentation in doc/bn.tex for the details + */ +#ifndef LTM_USE_FIPS_ONLY + +/* + * 8-bit is just too small. You can try the Frobenius test + * but that frobenius test can fail, too, for the same reason. + */ +#ifndef MP_8BIT + +/* + * multiply bigint a with int d and put the result in c + * Like mp_mul_d() but with a signed long as the small input + */ +static int s_mp_mul_si(const mp_int *a, long d, mp_int *c) +{ + mp_int t; + int err, neg = 0; + + if ((err = mp_init(&t)) != MP_OKAY) { + return err; + } + if (d < 0) { + neg = 1; + d = -d; + } + + /* + * mp_digit might be smaller than a long, which excludes + * the use of mp_mul_d() here. + */ + if ((err = mp_set_long(&t, (unsigned long) d)) != MP_OKAY) { + goto LBL_MPMULSI_ERR; + } + if ((err = mp_mul(a, &t, c)) != MP_OKAY) { + goto LBL_MPMULSI_ERR; + } + if (neg == 1) { + c->sign = (a->sign == MP_NEG) ? MP_ZPOS: MP_NEG; + } +LBL_MPMULSI_ERR: + mp_clear(&t); + return err; +} + + + +/* + Strong Lucas-Selfridge test. + returns MP_YES if it is a strong L-S prime, MP_NO if it is composite + + Code ported from Thomas Ray Nicely's implementation of the BPSW test + at http://www.trnicely.net/misc/bpsw.html + + Freeware copyright (C) 2016 Thomas R. Nicely . + Released into the public domain by the author, who disclaims any legal + liability arising from its use + + The multi-line comments are made by Thomas R. Nicely and are copied verbatim. + Additional comments marked "CZ" (without the quotes) are by the code-portist. + + (If that name sounds familiar, he is the guy who found the fdiv bug in the + Pentium (P5x, I think) Intel processor) +*/ +int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result) +{ + /* CZ TODO: choose better variable names! */ + mp_int Dz, gcd, Np1, Uz, Vz, U2mz, V2mz, Qmz, Q2mz, Qkdz, T1z, T2z, T3z, T4z, Q2kdz; + /* CZ TODO: Some of them need the full 32 bit, hence the (temporary) exclusion of MP_8BIT */ + int D, Ds, J, sign, P, Q, r, s, u, Nbits; + int e; + int isset; + + *result = MP_NO; + + /* + Find the first element D in the sequence {5, -7, 9, -11, 13, ...} + such that Jacobi(D,N) = -1 (Selfridge's algorithm). Theory + indicates that, if N is not a perfect square, D will "nearly + always" be "small." Just in case, an overflow trap for D is + included. + */ + + if ((e = mp_init_multi(&Dz, &gcd, &Np1, &Uz, &Vz, &U2mz, &V2mz, &Qmz, &Q2mz, &Qkdz, &T1z, &T2z, &T3z, &T4z, &Q2kdz, + NULL)) != MP_OKAY) { + return e; + } + + D = 5; + sign = 1; + + for (;;) { + Ds = sign * D; + sign = -sign; + if ((e = mp_set_long(&Dz, (unsigned long)D)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_gcd(a, &Dz, &gcd)) != MP_OKAY) { + goto LBL_LS_ERR; + } + /* if 1 < GCD < N then N is composite with factor "D", and + Jacobi(D,N) is technically undefined (but often returned + as zero). */ + if ((mp_cmp_d(&gcd, 1uL) == MP_GT) && (mp_cmp(&gcd, a) == MP_LT)) { + goto LBL_LS_ERR; + } + if (Ds < 0) { + Dz.sign = MP_NEG; + } + if ((e = mp_kronecker(&Dz, a, &J)) != MP_OKAY) { + goto LBL_LS_ERR; + } + + if (J == -1) { + break; + } + D += 2; + + if (D > (INT_MAX - 2)) { + e = MP_VAL; + goto LBL_LS_ERR; + } + } + + P = 1; /* Selfridge's choice */ + Q = (1 - Ds) / 4; /* Required so D = P*P - 4*Q */ + + /* NOTE: The conditions (a) N does not divide Q, and + (b) D is square-free or not a perfect square, are included by + some authors; e.g., "Prime numbers and computer methods for + factorization," Hans Riesel (2nd ed., 1994, Birkhauser, Boston), + p. 130. For this particular application of Lucas sequences, + these conditions were found to be immaterial. */ + + /* Now calculate N - Jacobi(D,N) = N + 1 (even), and calculate the + odd positive integer d and positive integer s for which + N + 1 = 2^s*d (similar to the step for N - 1 in Miller's test). + The strong Lucas-Selfridge test then returns N as a strong + Lucas probable prime (slprp) if any of the following + conditions is met: U_d=0, V_d=0, V_2d=0, V_4d=0, V_8d=0, + V_16d=0, ..., etc., ending with V_{2^(s-1)*d}=V_{(N+1)/2}=0 + (all equalities mod N). Thus d is the highest index of U that + must be computed (since V_2m is independent of U), compared + to U_{N+1} for the standard Lucas-Selfridge test; and no + index of V beyond (N+1)/2 is required, just as in the + standard Lucas-Selfridge test. However, the quantity Q^d must + be computed for use (if necessary) in the latter stages of + the test. The result is that the strong Lucas-Selfridge test + has a running time only slightly greater (order of 10 %) than + that of the standard Lucas-Selfridge test, while producing + only (roughly) 30 % as many pseudoprimes (and every strong + Lucas pseudoprime is also a standard Lucas pseudoprime). Thus + the evidence indicates that the strong Lucas-Selfridge test is + more effective than the standard Lucas-Selfridge test, and a + Baillie-PSW test based on the strong Lucas-Selfridge test + should be more reliable. */ + + if ((e = mp_add_d(a, 1uL, &Np1)) != MP_OKAY) { + goto LBL_LS_ERR; + } + s = mp_cnt_lsb(&Np1); + + /* CZ + * This should round towards zero because + * Thomas R. Nicely used GMP's mpz_tdiv_q_2exp() + * and mp_div_2d() is equivalent. Additionally: + * dividing an even number by two does not produce + * any leftovers. + */ + if ((e = mp_div_2d(&Np1, s, &Dz, NULL)) != MP_OKAY) { + goto LBL_LS_ERR; + } + /* We must now compute U_d and V_d. Since d is odd, the accumulated + values U and V are initialized to U_1 and V_1 (if the target + index were even, U and V would be initialized instead to U_0=0 + and V_0=2). The values of U_2m and V_2m are also initialized to + U_1 and V_1; the FOR loop calculates in succession U_2 and V_2, + U_4 and V_4, U_8 and V_8, etc. If the corresponding bits + (1, 2, 3, ...) of t are on (the zero bit having been accounted + for in the initialization of U and V), these values are then + combined with the previous totals for U and V, using the + composition formulas for addition of indices. */ + + mp_set(&Uz, 1uL); /* U=U_1 */ + mp_set(&Vz, (mp_digit)P); /* V=V_1 */ + mp_set(&U2mz, 1uL); /* U_1 */ + mp_set(&V2mz, (mp_digit)P); /* V_1 */ + + if (Q < 0) { + Q = -Q; + if ((e = mp_set_long(&Qmz, (unsigned long)Q)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mul_2(&Qmz, &Q2mz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + /* Initializes calculation of Q^d */ + if ((e = mp_set_long(&Qkdz, (unsigned long)Q)) != MP_OKAY) { + goto LBL_LS_ERR; + } + Qmz.sign = MP_NEG; + Q2mz.sign = MP_NEG; + Qkdz.sign = MP_NEG; + Q = -Q; + } else { + if ((e = mp_set_long(&Qmz, (unsigned long)Q)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mul_2(&Qmz, &Q2mz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + /* Initializes calculation of Q^d */ + if ((e = mp_set_long(&Qkdz, (unsigned long)Q)) != MP_OKAY) { + goto LBL_LS_ERR; + } + } + + Nbits = mp_count_bits(&Dz); + for (u = 1; u < Nbits; u++) { /* zero bit off, already accounted for */ + /* Formulas for doubling of indices (carried out mod N). Note that + * the indices denoted as "2m" are actually powers of 2, specifically + * 2^(ul-1) beginning each loop and 2^ul ending each loop. + * + * U_2m = U_m*V_m + * V_2m = V_m*V_m - 2*Q^m + */ + + if ((e = mp_mul(&U2mz, &V2mz, &U2mz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mod(&U2mz, a, &U2mz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_sqr(&V2mz, &V2mz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_sub(&V2mz, &Q2mz, &V2mz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mod(&V2mz, a, &V2mz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + /* Must calculate powers of Q for use in V_2m, also for Q^d later */ + if ((e = mp_sqr(&Qmz, &Qmz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + /* prevents overflow */ /* CZ still necessary without a fixed prealloc'd mem.? */ + if ((e = mp_mod(&Qmz, a, &Qmz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mul_2(&Qmz, &Q2mz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + + if ((isset = mp_get_bit(&Dz, u)) == MP_VAL) { + e = isset; + goto LBL_LS_ERR; + } + if (isset == MP_YES) { + /* Formulas for addition of indices (carried out mod N); + * + * U_(m+n) = (U_m*V_n + U_n*V_m)/2 + * V_(m+n) = (V_m*V_n + D*U_m*U_n)/2 + * + * Be careful with division by 2 (mod N)! + */ + + if ((e = mp_mul(&U2mz, &Vz, &T1z)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mul(&Uz, &V2mz, &T2z)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mul(&V2mz, &Vz, &T3z)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mul(&U2mz, &Uz, &T4z)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = s_mp_mul_si(&T4z, (long)Ds, &T4z)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_add(&T1z, &T2z, &Uz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if (mp_isodd(&Uz) != MP_NO) { + if ((e = mp_add(&Uz, a, &Uz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + } + /* CZ + * This should round towards negative infinity because + * Thomas R. Nicely used GMP's mpz_fdiv_q_2exp(). + * But mp_div_2() does not do so, it is truncating instead. + */ + if ((e = mp_div_2(&Uz, &Uz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((Uz.sign == MP_NEG) && (mp_isodd(&Uz) != MP_NO)) { + if ((e = mp_sub_d(&Uz, 1uL, &Uz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + } + if ((e = mp_add(&T3z, &T4z, &Vz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if (mp_isodd(&Vz) != MP_NO) { + if ((e = mp_add(&Vz, a, &Vz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + } + if ((e = mp_div_2(&Vz, &Vz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((Vz.sign == MP_NEG) && (mp_isodd(&Vz) != MP_NO)) { + if ((e = mp_sub_d(&Vz, 1uL, &Vz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + } + if ((e = mp_mod(&Uz, a, &Uz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mod(&Vz, a, &Vz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + /* Calculating Q^d for later use */ + if ((e = mp_mul(&Qkdz, &Qmz, &Qkdz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mod(&Qkdz, a, &Qkdz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + } + } + + /* If U_d or V_d is congruent to 0 mod N, then N is a prime or a + strong Lucas pseudoprime. */ + if ((mp_iszero(&Uz) != MP_NO) || (mp_iszero(&Vz) != MP_NO)) { + *result = MP_YES; + goto LBL_LS_ERR; + } + + /* NOTE: Ribenboim ("The new book of prime number records," 3rd ed., + 1995/6) omits the condition V0 on p.142, but includes it on + p. 130. The condition is NECESSARY; otherwise the test will + return false negatives---e.g., the primes 29 and 2000029 will be + returned as composite. */ + + /* Otherwise, we must compute V_2d, V_4d, V_8d, ..., V_{2^(s-1)*d} + by repeated use of the formula V_2m = V_m*V_m - 2*Q^m. If any of + these are congruent to 0 mod N, then N is a prime or a strong + Lucas pseudoprime. */ + + /* Initialize 2*Q^(d*2^r) for V_2m */ + if ((e = mp_mul_2(&Qkdz, &Q2kdz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + + for (r = 1; r < s; r++) { + if ((e = mp_sqr(&Vz, &Vz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_sub(&Vz, &Q2kdz, &Vz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mod(&Vz, a, &Vz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if (mp_iszero(&Vz) != MP_NO) { + *result = MP_YES; + goto LBL_LS_ERR; + } + /* Calculate Q^{d*2^r} for next r (final iteration irrelevant). */ + if (r < (s - 1)) { + if ((e = mp_sqr(&Qkdz, &Qkdz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mod(&Qkdz, a, &Qkdz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + if ((e = mp_mul_2(&Qkdz, &Q2kdz)) != MP_OKAY) { + goto LBL_LS_ERR; + } + } + } +LBL_LS_ERR: + mp_clear_multi(&Q2kdz, &T4z, &T3z, &T2z, &T1z, &Qkdz, &Q2mz, &Qmz, &V2mz, &U2mz, &Vz, &Uz, &Np1, &gcd, &Dz, NULL); + return e; +} +#endif +#endif +#endif + +/* ref: $Format:%D$ */ +/* git commit: $Format:%H$ */ +/* commit time: $Format:%ai$ */ diff --git a/src/ltm/bn_mp_radix_size.c b/src/ltm/bn_mp_radix_size.c index 1e286ed..8583faa 100644 --- a/src/ltm/bn_mp_radix_size.c +++ b/src/ltm/bn_mp_radix_size.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* returns size of ASCII reprensentation */ diff --git a/src/ltm/bn_mp_radix_smap.c b/src/ltm/bn_mp_radix_smap.c index caba69f..f0b743e 100644 --- a/src/ltm/bn_mp_radix_smap.c +++ b/src/ltm/bn_mp_radix_smap.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* chars used in radix conversions */ diff --git a/src/ltm/bn_mp_rand.c b/src/ltm/bn_mp_rand.c index af017f2..b66d1b0 100644 --- a/src/ltm/bn_mp_rand.c +++ b/src/ltm/bn_mp_rand.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* First the OS-specific special cases diff --git a/src/ltm/bn_mp_read_radix.c b/src/ltm/bn_mp_read_radix.c index 02ba113..200601e 100644 --- a/src/ltm/bn_mp_read_radix.c +++ b/src/ltm/bn_mp_read_radix.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* read a string [ASCII] in a given radix */ diff --git a/src/ltm/bn_mp_read_signed_bin.c b/src/ltm/bn_mp_read_signed_bin.c index 3a0e231..e97a1d0 100644 --- a/src/ltm/bn_mp_read_signed_bin.c +++ b/src/ltm/bn_mp_read_signed_bin.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* read signed bin, big endian, first byte is 0==positive or 1==negative */ diff --git a/src/ltm/bn_mp_read_unsigned_bin.c b/src/ltm/bn_mp_read_unsigned_bin.c index f29e7e6..648762a 100644 --- a/src/ltm/bn_mp_read_unsigned_bin.c +++ b/src/ltm/bn_mp_read_unsigned_bin.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* reads a unsigned char array, assumes the msb is stored first [big endian] */ diff --git a/src/ltm/bn_mp_reduce.c b/src/ltm/bn_mp_reduce.c index 3f93387..cbf8641 100644 --- a/src/ltm/bn_mp_reduce.c +++ b/src/ltm/bn_mp_reduce.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* reduces x mod m, assumes 0 < x < m**2, mu is diff --git a/src/ltm/bn_mp_reduce_2k.c b/src/ltm/bn_mp_reduce_2k.c index f5c74b8..af673e6 100644 --- a/src/ltm/bn_mp_reduce_2k.c +++ b/src/ltm/bn_mp_reduce_2k.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* reduces a modulo n where n is of the form 2**p - d */ diff --git a/src/ltm/bn_mp_reduce_2k_l.c b/src/ltm/bn_mp_reduce_2k_l.c index cbdfad7..afdc321 100644 --- a/src/ltm/bn_mp_reduce_2k_l.c +++ b/src/ltm/bn_mp_reduce_2k_l.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* reduces a modulo n where n is of the form 2**p - d diff --git a/src/ltm/bn_mp_reduce_2k_setup.c b/src/ltm/bn_mp_reduce_2k_setup.c index 11248a3..166a965 100644 --- a/src/ltm/bn_mp_reduce_2k_setup.c +++ b/src/ltm/bn_mp_reduce_2k_setup.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* determines the setup value */ diff --git a/src/ltm/bn_mp_reduce_2k_setup_l.c b/src/ltm/bn_mp_reduce_2k_setup_l.c index 04c7634..5584b48 100644 --- a/src/ltm/bn_mp_reduce_2k_setup_l.c +++ b/src/ltm/bn_mp_reduce_2k_setup_l.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* determines the setup value */ diff --git a/src/ltm/bn_mp_reduce_is_2k.c b/src/ltm/bn_mp_reduce_is_2k.c index 14612c0..8be985e 100644 --- a/src/ltm/bn_mp_reduce_is_2k.c +++ b/src/ltm/bn_mp_reduce_is_2k.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* determines if mp_reduce_2k can be used */ diff --git a/src/ltm/bn_mp_reduce_is_2k_l.c b/src/ltm/bn_mp_reduce_is_2k_l.c index 7c9cacf..da4aeda 100644 --- a/src/ltm/bn_mp_reduce_is_2k_l.c +++ b/src/ltm/bn_mp_reduce_is_2k_l.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* determines if reduce_2k_l can be used */ diff --git a/src/ltm/bn_mp_reduce_setup.c b/src/ltm/bn_mp_reduce_setup.c index 92d03fc..134d8a3 100644 --- a/src/ltm/bn_mp_reduce_setup.c +++ b/src/ltm/bn_mp_reduce_setup.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* pre-calculate the value required for Barrett reduction diff --git a/src/ltm/bn_mp_rshd.c b/src/ltm/bn_mp_rshd.c index d17ad00..61ab8c0 100644 --- a/src/ltm/bn_mp_rshd.c +++ b/src/ltm/bn_mp_rshd.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* shift right a certain amount of digits */ diff --git a/src/ltm/bn_mp_set.c b/src/ltm/bn_mp_set.c index dc03f4c..590a100 100644 --- a/src/ltm/bn_mp_set.c +++ b/src/ltm/bn_mp_set.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* set to a digit */ diff --git a/src/ltm/bn_mp_set_int.c b/src/ltm/bn_mp_set_int.c index 4d6e580..4f01e25 100644 --- a/src/ltm/bn_mp_set_int.c +++ b/src/ltm/bn_mp_set_int.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* set a 32-bit const */ diff --git a/src/ltm/bn_mp_set_long.c b/src/ltm/bn_mp_set_long.c index f842632..35be8e7 100644 --- a/src/ltm/bn_mp_set_long.c +++ b/src/ltm/bn_mp_set_long.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* set a platform dependent unsigned long int */ diff --git a/src/ltm/bn_mp_shrink.c b/src/ltm/bn_mp_shrink.c index b2e9d89..ff7905f 100644 --- a/src/ltm/bn_mp_shrink.c +++ b/src/ltm/bn_mp_shrink.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* shrink a bignum */ diff --git a/src/ltm/bn_mp_signed_bin_size.c b/src/ltm/bn_mp_signed_bin_size.c index 529482f..89cd43e 100644 --- a/src/ltm/bn_mp_signed_bin_size.c +++ b/src/ltm/bn_mp_signed_bin_size.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* get the size for an signed equivalent */ diff --git a/src/ltm/bn_mp_sqr.c b/src/ltm/bn_mp_sqr.c index 237c919..63bb2e2 100644 --- a/src/ltm/bn_mp_sqr.c +++ b/src/ltm/bn_mp_sqr.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* computes b = a*a */ diff --git a/src/ltm/bn_mp_sqrmod.c b/src/ltm/bn_mp_sqrmod.c index f3ed8a8..953829e 100644 --- a/src/ltm/bn_mp_sqrmod.c +++ b/src/ltm/bn_mp_sqrmod.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* c = a * a (mod b) */ diff --git a/src/ltm/bn_mp_sqrt.c b/src/ltm/bn_mp_sqrt.c index ec1b785..55b5c79 100644 --- a/src/ltm/bn_mp_sqrt.c +++ b/src/ltm/bn_mp_sqrt.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* this function is less generic than mp_n_root, simpler and faster */ diff --git a/src/ltm/bn_mp_sqrtmod_prime.c b/src/ltm/bn_mp_sqrtmod_prime.c index f7647b9..cc4da3b 100644 --- a/src/ltm/bn_mp_sqrtmod_prime.c +++ b/src/ltm/bn_mp_sqrtmod_prime.c @@ -5,8 +5,11 @@ * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * - * The library is free for all purposes without any express - * guarantee it works. + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * SPDX-License-Identifier: Unlicense */ /* Tonelli-Shanks algorithm @@ -122,3 +125,7 @@ } #endif + +/* ref: $Format:%D$ */ +/* git commit: $Format:%H$ */ +/* commit time: $Format:%ai$ */ diff --git a/src/ltm/bn_mp_sub.c b/src/ltm/bn_mp_sub.c index 9ef1059..df31951 100644 --- a/src/ltm/bn_mp_sub.c +++ b/src/ltm/bn_mp_sub.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* high level subtraction (handles signs) */ diff --git a/src/ltm/bn_mp_sub_d.c b/src/ltm/bn_mp_sub_d.c index 1ac9859..d8ac250 100644 --- a/src/ltm/bn_mp_sub_d.c +++ b/src/ltm/bn_mp_sub_d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* single digit subtraction */ diff --git a/src/ltm/bn_mp_submod.c b/src/ltm/bn_mp_submod.c index 0325b9d..ba9ee6f 100644 --- a/src/ltm/bn_mp_submod.c +++ b/src/ltm/bn_mp_submod.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* d = a - b (mod c) */ diff --git a/src/ltm/bn_mp_tc_and.c b/src/ltm/bn_mp_tc_and.c index e9fe4c6..9834dc6 100644 --- a/src/ltm/bn_mp_tc_and.c +++ b/src/ltm/bn_mp_tc_and.c @@ -9,19 +9,20 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* two complement and */ int mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c) { - int res = MP_OKAY, bits; + int res = MP_OKAY, bits, abits, bbits; int as = mp_isneg(a), bs = mp_isneg(b); mp_int *mx = NULL, _mx, acpy, bcpy; if ((as != MP_NO) || (bs != MP_NO)) { - bits = MAX(mp_count_bits(a), mp_count_bits(b)); + abits = mp_count_bits(a); + bbits = mp_count_bits(b); + bits = MAX(abits, bbits); res = mp_init_set_int(&_mx, 1uL); if (res != MP_OKAY) { goto end; diff --git a/src/ltm/bn_mp_tc_div_2d.c b/src/ltm/bn_mp_tc_div_2d.c index ea190c3..4ff0acf 100644 --- a/src/ltm/bn_mp_tc_div_2d.c +++ b/src/ltm/bn_mp_tc_div_2d.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* two complement right shift */ diff --git a/src/ltm/bn_mp_tc_or.c b/src/ltm/bn_mp_tc_or.c index 91b6b40..0941468 100644 --- a/src/ltm/bn_mp_tc_or.c +++ b/src/ltm/bn_mp_tc_or.c @@ -9,19 +9,20 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* two complement or */ int mp_tc_or(const mp_int *a, const mp_int *b, mp_int *c) { - int res = MP_OKAY, bits; + int res = MP_OKAY, bits, abits, bbits; int as = mp_isneg(a), bs = mp_isneg(b); mp_int *mx = NULL, _mx, acpy, bcpy; if ((as != MP_NO) || (bs != MP_NO)) { - bits = MAX(mp_count_bits(a), mp_count_bits(b)); + abits = mp_count_bits(a); + bbits = mp_count_bits(b); + bits = MAX(abits, bbits); res = mp_init_set_int(&_mx, 1uL); if (res != MP_OKAY) { goto end; diff --git a/src/ltm/bn_mp_tc_xor.c b/src/ltm/bn_mp_tc_xor.c index 50fb12d..cdb1d40 100644 --- a/src/ltm/bn_mp_tc_xor.c +++ b/src/ltm/bn_mp_tc_xor.c @@ -9,19 +9,20 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* two complement xor */ int mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c) { - int res = MP_OKAY, bits; + int res = MP_OKAY, bits, abits, bbits; int as = mp_isneg(a), bs = mp_isneg(b); mp_int *mx = NULL, _mx, acpy, bcpy; if ((as != MP_NO) || (bs != MP_NO)) { - bits = MAX(mp_count_bits(a), mp_count_bits(b)); + abits = mp_count_bits(a); + bbits = mp_count_bits(b); + bits = MAX(abits, bbits); res = mp_init_set_int(&_mx, 1uL); if (res != MP_OKAY) { goto end; diff --git a/src/ltm/bn_mp_to_signed_bin.c b/src/ltm/bn_mp_to_signed_bin.c index 22a938e..04e3b84 100644 --- a/src/ltm/bn_mp_to_signed_bin.c +++ b/src/ltm/bn_mp_to_signed_bin.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* store in signed [big endian] format */ diff --git a/src/ltm/bn_mp_to_signed_bin_n.c b/src/ltm/bn_mp_to_signed_bin_n.c index 417a380..d13fede 100644 --- a/src/ltm/bn_mp_to_signed_bin_n.c +++ b/src/ltm/bn_mp_to_signed_bin_n.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* store in signed [big endian] format */ diff --git a/src/ltm/bn_mp_to_unsigned_bin.c b/src/ltm/bn_mp_to_unsigned_bin.c index aa719ae..ab57514 100644 --- a/src/ltm/bn_mp_to_unsigned_bin.c +++ b/src/ltm/bn_mp_to_unsigned_bin.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* store in unsigned [big endian] format */ diff --git a/src/ltm/bn_mp_to_unsigned_bin_n.c b/src/ltm/bn_mp_to_unsigned_bin_n.c index 43676e8..c53e7fb 100644 --- a/src/ltm/bn_mp_to_unsigned_bin_n.c +++ b/src/ltm/bn_mp_to_unsigned_bin_n.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* store in unsigned [big endian] format */ diff --git a/src/ltm/bn_mp_toom_mul.c b/src/ltm/bn_mp_toom_mul.c index ff7df02..32b5e43 100644 --- a/src/ltm/bn_mp_toom_mul.c +++ b/src/ltm/bn_mp_toom_mul.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* multiplication using the Toom-Cook 3-way algorithm diff --git a/src/ltm/bn_mp_toom_sqr.c b/src/ltm/bn_mp_toom_sqr.c index edc89cd..8595db5 100644 --- a/src/ltm/bn_mp_toom_sqr.c +++ b/src/ltm/bn_mp_toom_sqr.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* squaring using Toom-Cook 3-way algorithm */ diff --git a/src/ltm/bn_mp_toradix.c b/src/ltm/bn_mp_toradix.c index 8c05e75..c6e1c65 100644 --- a/src/ltm/bn_mp_toradix.c +++ b/src/ltm/bn_mp_toradix.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* stores a bignum as a ASCII string in a given radix (2..64) */ diff --git a/src/ltm/bn_mp_toradix_n.c b/src/ltm/bn_mp_toradix_n.c index 27cb401..84431f2 100644 --- a/src/ltm/bn_mp_toradix_n.c +++ b/src/ltm/bn_mp_toradix_n.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* stores a bignum as a ASCII string in a given radix (2..64) diff --git a/src/ltm/bn_mp_unsigned_bin_size.c b/src/ltm/bn_mp_unsigned_bin_size.c index bc9b853..d716c8f 100644 --- a/src/ltm/bn_mp_unsigned_bin_size.c +++ b/src/ltm/bn_mp_unsigned_bin_size.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* get the size for an unsigned equivalent */ diff --git a/src/ltm/bn_mp_xor.c b/src/ltm/bn_mp_xor.c index b502eb0..bfcdbb9 100644 --- a/src/ltm/bn_mp_xor.c +++ b/src/ltm/bn_mp_xor.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* XOR two ints together */ diff --git a/src/ltm/bn_mp_zero.c b/src/ltm/bn_mp_zero.c index 78f165b..89f7c29 100644 --- a/src/ltm/bn_mp_zero.c +++ b/src/ltm/bn_mp_zero.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* set to zero */ diff --git a/src/ltm/bn_prime_tab.c b/src/ltm/bn_prime_tab.c index f23afcb..5c0e192 100644 --- a/src/ltm/bn_prime_tab.c +++ b/src/ltm/bn_prime_tab.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ const mp_digit ltm_prime_tab[] = { diff --git a/src/ltm/bn_reverse.c b/src/ltm/bn_reverse.c index 5b49172..2990528 100644 --- a/src/ltm/bn_reverse.c +++ b/src/ltm/bn_reverse.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* reverse an array, used for radix code */ diff --git a/src/ltm/bn_s_mp_add.c b/src/ltm/bn_s_mp_add.c index 8a3bc82..979e470 100644 --- a/src/ltm/bn_s_mp_add.c +++ b/src/ltm/bn_s_mp_add.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* low level addition, based on HAC pp.594, Algorithm 14.7 */ diff --git a/src/ltm/bn_s_mp_exptmod.c b/src/ltm/bn_s_mp_exptmod.c index f84da21..b22cde8 100644 --- a/src/ltm/bn_s_mp_exptmod.c +++ b/src/ltm/bn_s_mp_exptmod.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ #ifdef MP_LOW_MEM @@ -99,19 +98,19 @@ /* compute the value at M[1<<(winsize-1)] by squaring * M[1] (winsize-1) times */ - if ((err = mp_copy(&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + if ((err = mp_copy(&M[1], &M[(size_t)1 << (winsize - 1)])) != MP_OKAY) { goto LBL_MU; } for (x = 0; x < (winsize - 1); x++) { /* square it */ - if ((err = mp_sqr(&M[1 << (winsize - 1)], - &M[1 << (winsize - 1)])) != MP_OKAY) { + if ((err = mp_sqr(&M[(size_t)1 << (winsize - 1)], + &M[(size_t)1 << (winsize - 1)])) != MP_OKAY) { goto LBL_MU; } /* reduce modulo P */ - if ((err = redux(&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { + if ((err = redux(&M[(size_t)1 << (winsize - 1)], P, &mu)) != MP_OKAY) { goto LBL_MU; } } diff --git a/src/ltm/bn_s_mp_mul_digs.c b/src/ltm/bn_s_mp_mul_digs.c index 442c803..332e974 100644 --- a/src/ltm/bn_s_mp_mul_digs.c +++ b/src/ltm/bn_s_mp_mul_digs.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* multiplies |a| * |b| and only computes upto digs digits of result diff --git a/src/ltm/bn_s_mp_mul_high_digs.c b/src/ltm/bn_s_mp_mul_high_digs.c index e6efd4e..509682b 100644 --- a/src/ltm/bn_s_mp_mul_high_digs.c +++ b/src/ltm/bn_s_mp_mul_high_digs.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* multiplies |a| * |b| and does not compute the lower digs digits diff --git a/src/ltm/bn_s_mp_sqr.c b/src/ltm/bn_s_mp_sqr.c index 4cab045..b3d0fd0 100644 --- a/src/ltm/bn_s_mp_sqr.c +++ b/src/ltm/bn_s_mp_sqr.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ diff --git a/src/ltm/bn_s_mp_sub.c b/src/ltm/bn_s_mp_sub.c index fbce7ca..88e44dc 100644 --- a/src/ltm/bn_s_mp_sub.c +++ b/src/ltm/bn_s_mp_sub.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* low level subtraction (assumes |a| > |b|), HAC pp.595 Algorithm 14.9 */ diff --git a/src/ltm/bncore.c b/src/ltm/bncore.c index 916712d..c97b8e1 100644 --- a/src/ltm/bncore.c +++ b/src/ltm/bncore.c @@ -9,8 +9,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ /* Known optimal configurations diff --git a/src/ltm/tommath.h b/src/ltm/tommath.h index c6145f4..f8051a2 100644 --- a/src/ltm/tommath.h +++ b/src/ltm/tommath.h @@ -7,8 +7,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ #ifndef BN_H_ #define BN_H_ @@ -17,7 +16,7 @@ #include #include -#include +#include "tommath_class.h" #ifdef __cplusplus extern "C" { @@ -36,7 +35,7 @@ defined(__ia64) || defined(__ia64__) || defined(__itanium__) || defined(_M_IA64) || \ defined(__LP64__) || defined(_LP64) || defined(__64BIT__) # if !(defined(MP_32BIT) || defined(MP_16BIT) || defined(MP_8BIT)) -# if defined(__GNUC__) +# if defined(__GNUC__) && !defined(__hppa) /* we support 128bit integers only via: __attribute__((mode(TI))) */ # define MP_64BIT # else @@ -118,6 +117,7 @@ #define MP_MEM -2 /* out of mem */ #define MP_VAL -3 /* invalid input */ #define MP_RANGE MP_VAL +#define MP_ITER -4 /* Max. iterations reached */ #define MP_YES 1 /* yes response */ #define MP_NO 0 /* no response */ @@ -204,6 +204,9 @@ /* set to a digit */ void mp_set(mp_int *a, mp_digit b); +/* set a double */ +int mp_set_double(mp_int *a, double b); + /* set a 32-bit const */ int mp_set_int(mp_int *a, unsigned long b); @@ -212,6 +215,9 @@ /* set a platform dependent unsigned long long value */ /* int mp_set_long_long(mp_int *a, unsigned long long b); */ + +/* get a double */ +double mp_get_double(const mp_int *a); /* get a 32-bit value */ unsigned long mp_get_int(const mp_int *a); @@ -295,6 +301,11 @@ /* c = a AND b */ int mp_and(const mp_int *a, const mp_int *b, mp_int *c); +/* Checks the bit at position b and returns MP_YES + if the bit is 1, MP_NO if it is 0 and MP_VAL + in case of error */ +int mp_get_bit(const mp_int *a, int b); + /* c = a XOR b (two complement) */ int mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c); @@ -413,6 +424,9 @@ /* computes the jacobi c = (a | n) (or Legendre if b is prime) */ int mp_jacobi(const mp_int *a, const mp_int *n, int *c); + +/* computes the Kronecker symbol c = (a | p) (like jacobi() but with {a,p} in Z */ +int mp_kronecker(const mp_int *a, const mp_int *p, int *c); /* used to setup the Barrett reduction for a given modulus b */ int mp_reduce_setup(mp_int *a, const mp_int *b); @@ -495,10 +509,27 @@ */ int mp_prime_rabin_miller_trials(int size); -/* performs t rounds of Miller-Rabin on "a" using the first - * t prime bases. Also performs an initial sieve of trial +/* performs one strong Lucas-Selfridge test of "a". + * Sets result to 0 if composite or 1 if probable prime + */ +int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result); + +/* performs one Frobenius test of "a" as described by Paul Underwood. + * Sets result to 0 if composite or 1 if probable prime + */ +int mp_prime_frobenius_underwood(const mp_int *N, int *result); + +/* performs t random rounds of Miller-Rabin on "a" additional to + * bases 2 and 3. Also performs an initial sieve of trial * division. Determines if "a" is prime with probability * of error no more than (1/4)**t. + * Both a strong Lucas-Selfridge to complete the BPSW test + * and a separate Frobenius test are available at compile time. + * With t<0 a deterministic test is run for primes up to + * 318665857834031151167461. With t<13 (abs(t)-13) additional + * tests with sequential small primes are run starting at 43. + * Is Fips 186.4 compliant if called with t as computed by + * mp_prime_rabin_miller_trials(); * * Sets result to 1 if probably prime, 0 otherwise */ diff --git a/src/ltm/tommath_class.h b/src/ltm/tommath_class.h index 1989054..7dfd838 100644 --- a/src/ltm/tommath_class.h +++ b/src/ltm/tommath_class.h @@ -1,3 +1,15 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * SPDX-License-Identifier: Unlicense + */ + #if !(defined(LTM1) && defined(LTM2) && defined(LTM3)) #if defined(LTM2) # define LTM3 @@ -48,6 +60,8 @@ # define BN_MP_FREAD_C # define BN_MP_FWRITE_C # define BN_MP_GCD_C +# define BN_MP_GET_BIT_C +# define BN_MP_GET_DOUBLE_C # define BN_MP_GET_INT_C # define BN_MP_GET_LONG_C # define BN_MP_GET_LONG_LONG_C @@ -65,6 +79,7 @@ # define BN_MP_JACOBI_C # define BN_MP_KARATSUBA_MUL_C # define BN_MP_KARATSUBA_SQR_C +# define BN_MP_KRONECKER_C # define BN_MP_LCM_C # define BN_MP_LSHD_C # define BN_MP_MOD_C @@ -83,12 +98,14 @@ # define BN_MP_NEG_C # define BN_MP_OR_C # define BN_MP_PRIME_FERMAT_C +# define BN_MP_PRIME_FROBENIUS_UNDERWOOD_C # define BN_MP_PRIME_IS_DIVISIBLE_C # define BN_MP_PRIME_IS_PRIME_C # define BN_MP_PRIME_MILLER_RABIN_C # define BN_MP_PRIME_NEXT_PRIME_C # define BN_MP_PRIME_RABIN_MILLER_TRIALS_C # define BN_MP_PRIME_RANDOM_EX_C +# define BN_MP_PRIME_STRONG_LUCAS_SELFRIDGE_C # define BN_MP_RADIX_SIZE_C # define BN_MP_RADIX_SMAP_C # define BN_MP_RAND_C @@ -105,6 +122,7 @@ # define BN_MP_REDUCE_SETUP_C # define BN_MP_RSHD_C # define BN_MP_SET_C +# define BN_MP_SET_DOUBLE_C # define BN_MP_SET_INT_C # define BN_MP_SET_LONG_C # define BN_MP_SET_LONG_LONG_C @@ -160,6 +178,7 @@ # define BN_MP_CMP_C # define BN_MP_CMP_D_C # define BN_MP_ADD_C +# define BN_MP_CMP_MAG_C # define BN_MP_EXCH_C # define BN_MP_CLEAR_MULTI_C #endif @@ -425,6 +444,14 @@ # define BN_MP_CLEAR_C #endif +#if defined(BN_MP_GET_BIT_C) +# define BN_MP_ISZERO_C +#endif + +#if defined(BN_MP_GET_DOUBLE_C) +# define BN_MP_ISNEG_C +#endif + #if defined(BN_MP_GET_INT_C) #endif @@ -509,14 +536,9 @@ #endif #if defined(BN_MP_JACOBI_C) +# define BN_MP_KRONECKER_C # define BN_MP_ISNEG_C # define BN_MP_CMP_D_C -# define BN_MP_ISZERO_C -# define BN_MP_INIT_COPY_C -# define BN_MP_CNT_LSB_C -# define BN_MP_DIV_2D_C -# define BN_MP_MOD_C -# define BN_MP_CLEAR_C #endif #if defined(BN_MP_KARATSUBA_MUL_C) @@ -538,6 +560,18 @@ # define BN_S_MP_SUB_C # define BN_MP_LSHD_C # define BN_MP_ADD_C +# define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_KRONECKER_C) +# define BN_MP_ISZERO_C +# define BN_MP_ISEVEN_C +# define BN_MP_INIT_COPY_C +# define BN_MP_CNT_LSB_C +# define BN_MP_DIV_2D_C +# define BN_MP_CMP_D_C +# define BN_MP_COPY_C +# define BN_MP_MOD_C # define BN_MP_CLEAR_C #endif @@ -666,16 +700,49 @@ # define BN_MP_CLEAR_C #endif +#if defined(BN_MP_PRIME_FROBENIUS_UNDERWOOD_C) +# define BN_MP_PRIME_IS_PRIME_C +# define BN_MP_INIT_MULTI_C +# define BN_MP_SET_LONG_C +# define BN_MP_SQR_C +# define BN_MP_SUB_D_C +# define BN_MP_KRONECKER_C +# define BN_MP_GCD_C +# define BN_MP_ADD_D_C +# define BN_MP_SET_C +# define BN_MP_COUNT_BITS_C +# define BN_MP_MUL_2_C +# define BN_MP_MUL_D_C +# define BN_MP_ADD_C +# define BN_MP_MUL_C +# define BN_MP_SUB_C +# define BN_MP_MOD_C +# define BN_MP_GET_BIT_C +# define BN_MP_EXCH_C +# define BN_MP_ISZERO_C +# define BN_MP_CMP_C +# define BN_MP_CLEAR_MULTI_C +#endif + #if defined(BN_MP_PRIME_IS_DIVISIBLE_C) # define BN_MP_MOD_D_C #endif #if defined(BN_MP_PRIME_IS_PRIME_C) +# define BN_MP_ISEVEN_C +# define BN_MP_IS_SQUARE_C # define BN_MP_CMP_D_C # define BN_MP_PRIME_IS_DIVISIBLE_C -# define BN_MP_INIT_C -# define BN_MP_SET_C +# define BN_MP_INIT_SET_C # define BN_MP_PRIME_MILLER_RABIN_C +# define BN_MP_PRIME_FROBENIUS_UNDERWOOD_C +# define BN_MP_PRIME_STRONG_LUCAS_SELFRIDGE_C +# define BN_MP_READ_RADIX_C +# define BN_MP_CMP_C +# define BN_MP_SET_C +# define BN_MP_COUNT_BITS_C +# define BN_MP_RAND_C +# define BN_MP_DIV_2D_C # define BN_MP_CLEAR_C #endif @@ -699,7 +766,7 @@ # define BN_MP_MOD_D_C # define BN_MP_INIT_C # define BN_MP_ADD_D_C -# define BN_MP_PRIME_MILLER_RABIN_C +# define BN_MP_PRIME_IS_PRIME_C # define BN_MP_CLEAR_C #endif @@ -715,6 +782,37 @@ # define BN_MP_ADD_D_C #endif +#if defined(BN_MP_PRIME_STRONG_LUCAS_SELFRIDGE_C) +# define BN_MP_PRIME_IS_PRIME_C +# define BN_MP_MUL_D_C +# define BN_MP_MUL_SI_C +# define BN_MP_INIT_C +# define BN_MP_SET_LONG_C +# define BN_MP_MUL_C +# define BN_MP_CLEAR_C +# define BN_MP_INIT_MULTI_C +# define BN_MP_GCD_C +# define BN_MP_CMP_D_C +# define BN_MP_CMP_C +# define BN_MP_KRONECKER_C +# define BN_MP_ADD_D_C +# define BN_MP_CNT_LSB_C +# define BN_MP_DIV_2D_C +# define BN_MP_SET_C +# define BN_MP_MUL_2_C +# define BN_MP_COUNT_BITS_C +# define BN_MP_MOD_C +# define BN_MP_SQR_C +# define BN_MP_SUB_C +# define BN_MP_GET_BIT_C +# define BN_MP_ADD_C +# define BN_MP_ISODD_C +# define BN_MP_DIV_2_C +# define BN_MP_SUB_D_C +# define BN_MP_ISZERO_C +# define BN_MP_CLEAR_MULTI_C +#endif + #if defined(BN_MP_RADIX_SIZE_C) # define BN_MP_ISZERO_C # define BN_MP_COUNT_BITS_C @@ -831,6 +929,13 @@ #if defined(BN_MP_SET_C) # define BN_MP_ZERO_C +#endif + +#if defined(BN_MP_SET_DOUBLE_C) +# define BN_MP_SET_LONG_LONG_C +# define BN_MP_DIV_2D_C +# define BN_MP_MUL_2D_C +# define BN_MP_ISZERO_C #endif #if defined(BN_MP_SET_INT_C) @@ -1113,3 +1218,7 @@ #else # define LTM_LAST #endif + +/* ref: $Format:%D$ */ +/* git commit: $Format:%H$ */ +/* commit time: $Format:%ai$ */ diff --git a/src/ltm/tommath_private.h b/src/ltm/tommath_private.h index e9dbd5b..8c195d3 100644 --- a/src/ltm/tommath_private.h +++ b/src/ltm/tommath_private.h @@ -7,8 +7,7 @@ * Michael Fromberger but has been written from scratch with * additional optimizations in place. * - * The library is free for all purposes without any express - * guarantee it works. + * SPDX-License-Identifier: Unlicense */ #ifndef TOMMATH_PRIV_H_ #define TOMMATH_PRIV_H_ diff --git a/src/ltm/tommath_superclass.h b/src/ltm/tommath_superclass.h index da53793..7b98ed6 100644 --- a/src/ltm/tommath_superclass.h +++ b/src/ltm/tommath_superclass.h @@ -1,3 +1,15 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * SPDX-License-Identifier: Unlicense + */ + /* super class file for PK algos */ /* default ... include all MPI */