diff --git a/CryptX.xs b/CryptX.xs index 936e175..b80fbb2 100644 --- a/CryptX.xs +++ b/CryptX.xs @@ -422,251 +422,32 @@ if(crypt_mp_init("ltm") != CRYPT_OK) { croak("FATAL: crypt_mp_init failed"); } SV * -CryptX__encode_base64url(SV * in) - CODE: - { - STRLEN in_len; - unsigned long out_len; - unsigned char *out_data, *in_data; - - if (!SvPOK(in)) XSRETURN_UNDEF; - in_data = (unsigned char *) SvPVbyte(in, in_len); - if (in_len == 0) { - RETVAL = newSVpvn("", 0); - } - else { - out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1); - RETVAL = NEWSV(0, out_len); /* avoid zero! */ - SvPOK_only(RETVAL); - out_data = (unsigned char *)SvPVX(RETVAL); - if (base64url_encode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) { - SvREFCNT_dec(RETVAL); - XSRETURN_UNDEF; - } - SvCUR_set(RETVAL, out_len); - } - } - OUTPUT: - RETVAL - -SV * -CryptX__decode_base64url(SV * in) - CODE: - { - STRLEN in_len; - unsigned long out_len; - unsigned char *out_data, *in_data; - - if (!SvPOK(in)) XSRETURN_UNDEF; - in_data = (unsigned char *) SvPVbyte(in, in_len); - if (in_len == 0) { - RETVAL = newSVpvn("", 0); - } - else { - out_len = (unsigned long)in_len; - RETVAL = NEWSV(0, out_len); /* avoid zero! */ - SvPOK_only(RETVAL); - out_data = (unsigned char *)SvPVX(RETVAL); - if (base64url_decode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) { - SvREFCNT_dec(RETVAL); - XSRETURN_UNDEF; - } - SvCUR_set(RETVAL, out_len); - } - } - OUTPUT: - RETVAL - -SV * -CryptX__encode_base64(SV * in) - CODE: - { - STRLEN in_len; - unsigned long out_len; - unsigned char *out_data, *in_data; - - if (!SvPOK(in)) XSRETURN_UNDEF; - in_data = (unsigned char *) SvPVbyte(in, in_len); - if (in_len == 0) { - RETVAL = newSVpvn("", 0); - } - else { - out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1); - RETVAL = NEWSV(0, out_len); /* avoid zero! */ - SvPOK_only(RETVAL); - out_data = (unsigned char *)SvPVX(RETVAL); - if (base64_encode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) { - SvREFCNT_dec(RETVAL); - XSRETURN_UNDEF; - } - SvCUR_set(RETVAL, out_len); - } - } - OUTPUT: - RETVAL - -SV * -CryptX__decode_base64(SV * in) - CODE: - { - STRLEN in_len; - unsigned long out_len; - unsigned char *out_data, *in_data; - - if (!SvPOK(in)) XSRETURN_UNDEF; - in_data = (unsigned char *)SvPVbyte(in, in_len); - if (in_len == 0) { - RETVAL = newSVpvn("", 0); - } - else { - out_len = (unsigned long)in_len; - RETVAL = NEWSV(0, out_len); /* avoid zero! */ - SvPOK_only(RETVAL); - out_data = (unsigned char *)SvPVX(RETVAL); - if (base64_decode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) { - SvREFCNT_dec(RETVAL); - XSRETURN_UNDEF; - } - SvCUR_set(RETVAL, out_len); - } - } - OUTPUT: - RETVAL - -SV * -CryptX__encode_b32(SV *in, unsigned idx) - CODE: - { - STRLEN in_len; - unsigned long out_len; - unsigned char *out_data, *in_data; - int id = -1; - - if (!SvPOK(in)) XSRETURN_UNDEF; - if (idx == 0) id = BASE32_RFC4648; - if (idx == 1) id = BASE32_BASE32HEX; - if (idx == 2) id = BASE32_ZBASE32; - if (idx == 3) id = BASE32_CROCKFORD; - if (id == -1) XSRETURN_UNDEF; - in_data = (unsigned char *) SvPVbyte(in, in_len); - if (in_len == 0) { - RETVAL = newSVpvn("", 0); - } - else { - out_len = (unsigned long)((8 * in_len + 4) / 5); - RETVAL = NEWSV(0, out_len); /* avoid zero! */ - SvPOK_only(RETVAL); - out_data = (unsigned char *)SvPVX(RETVAL); - if (base32_encode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) { - SvREFCNT_dec(RETVAL); - XSRETURN_UNDEF; - } - SvCUR_set(RETVAL, out_len); - } - } - OUTPUT: - RETVAL - -SV * -CryptX__decode_b32(SV *in, unsigned idx) - CODE: - { - STRLEN in_len; - unsigned long out_len; - unsigned char *out_data, *in_data; - int id = -1; - - if (!SvPOK(in)) XSRETURN_UNDEF; - if (idx == 0) id = BASE32_RFC4648; - if (idx == 1) id = BASE32_BASE32HEX; - if (idx == 2) id = BASE32_ZBASE32; - if (idx == 3) id = BASE32_CROCKFORD; - if (id == -1) XSRETURN_UNDEF; - in_data = (unsigned char *)SvPVbyte(in, in_len); - if (in_len == 0) { - RETVAL = newSVpvn("", 0); - } - else { - out_len = (unsigned long)in_len; - RETVAL = NEWSV(0, out_len); /* avoid zero! */ - SvPOK_only(RETVAL); - out_data = (unsigned char *)SvPVX(RETVAL); - if (base32_decode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) { - SvREFCNT_dec(RETVAL); - XSRETURN_UNDEF; - } - SvCUR_set(RETVAL, out_len); - } - } - OUTPUT: - RETVAL - -SV * -CryptX__increment_octets_le(SV * in) - CODE: - { - STRLEN len, i = 0; - unsigned char *out_data, *in_data; - - if (!SvPOK(in)) XSRETURN_UNDEF; - in_data = (unsigned char *)SvPVbyte(in, len); - if (len == 0) { - RETVAL = newSVpvn("", 0); - } - else { - RETVAL = NEWSV(0, len); /* avoid zero! */ - SvPOK_only(RETVAL); - SvCUR_set(RETVAL, len); - out_data = (unsigned char *)SvPVX(RETVAL); - Copy(in_data, out_data, len, unsigned char); - while (i < len) { - out_data[i]++; - if (0 != out_data[i]) break; - i++; - } - if (i == len) { - SvREFCNT_dec(RETVAL); - croak("FATAL: increment_octets_le overflow"); - } - } - } - OUTPUT: - RETVAL - -SV * -CryptX__increment_octets_be(SV * in) - CODE: - { - STRLEN len, i = 0; - unsigned char *out_data, *in_data; - - if (!SvPOK(in)) XSRETURN_UNDEF; - in_data = (unsigned char *)SvPVbyte(in, len); - if (len == 0) { - RETVAL = newSVpvn("", 0); - } - else { - RETVAL = NEWSV(0, len); /* avoid zero! */ - SvPOK_only(RETVAL); - SvCUR_set(RETVAL, len); - out_data = (unsigned char *)SvPVX(RETVAL); - Copy(in_data, out_data, len, unsigned char); - while (i < len) { - out_data[len - 1 - i]++; - if (0 != out_data[len - 1 - i]) break; - i++; - } - if (i == len) { - SvREFCNT_dec(RETVAL); - croak("FATAL: increment_octets_be overflow"); - } - } - } - OUTPUT: - RETVAL - -SV * -CryptX__radix_to_bin(char *in, int radix) +CryptX__ltc_build_settings() + CODE: + RETVAL = newSVpv(crypt_build_settings, 0); + OUTPUT: + RETVAL + +SV * +CryptX__ltc_mp_name() + CODE: + RETVAL = newSVpv(ltc_mp.name, 0); + OUTPUT: + RETVAL + +int +CryptX__ltc_mp_bits_per_digit() + CODE: + RETVAL = ltc_mp.bits_per_digit; + OUTPUT: + RETVAL + +MODULE = CryptX PACKAGE = Crypt::Misc + +PROTOTYPES: DISABLE + +SV * +_radix_to_bin(char *in, int radix) CODE: { STRLEN len; @@ -700,7 +481,7 @@ RETVAL SV * -CryptX__bin_to_radix(SV *in, int radix) +_bin_to_radix(SV *in, int radix) CODE: { STRLEN len; @@ -744,23 +525,213 @@ RETVAL SV * -CryptX__ltc_build_settings() - CODE: - RETVAL = newSVpv(crypt_build_settings, 0); - OUTPUT: - RETVAL - -SV * -CryptX__ltc_mp_name() - CODE: - RETVAL = newSVpv(ltc_mp.name, 0); - OUTPUT: - RETVAL - -int -CryptX__ltc_mp_bits_per_digit() - CODE: - RETVAL = ltc_mp.bits_per_digit; +encode_b64(SV * in) + ALIAS: + encode_b64u = 1 + CODE: + { + int rv; + STRLEN in_len; + unsigned long out_len; + unsigned char *out_data, *in_data; + + if (!SvPOK(in)) XSRETURN_UNDEF; + in_data = (unsigned char *) SvPVbyte(in, in_len); + if (in_len == 0) { + RETVAL = newSVpvn("", 0); + } + else { + out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1); + RETVAL = NEWSV(0, out_len); /* avoid zero! */ + SvPOK_only(RETVAL); + out_data = (unsigned char *)SvPVX(RETVAL); + if (ix == 1) + rv = base64url_encode(in_data, (unsigned long)in_len, out_data, &out_len); + else + rv = base64_encode(in_data, (unsigned long)in_len, out_data, &out_len); + if (rv != CRYPT_OK) { + SvREFCNT_dec(RETVAL); + XSRETURN_UNDEF; + } + SvCUR_set(RETVAL, out_len); + } + } + OUTPUT: + RETVAL + +SV * +decode_b64(SV * in) + ALIAS: + decode_b64u = 1 + CODE: + { + int rv; + STRLEN in_len; + unsigned long out_len; + unsigned char *out_data, *in_data; + + if (!SvPOK(in)) XSRETURN_UNDEF; + in_data = (unsigned char *)SvPVbyte(in, in_len); + if (in_len == 0) { + RETVAL = newSVpvn("", 0); + } + else { + out_len = (unsigned long)in_len; + RETVAL = NEWSV(0, out_len); /* avoid zero! */ + SvPOK_only(RETVAL); + out_data = (unsigned char *)SvPVX(RETVAL); + if (ix == 1) + rv = base64url_decode(in_data, (unsigned long)in_len, out_data, &out_len); + else + rv = base64_decode(in_data, (unsigned long)in_len, out_data, &out_len); + if (rv != CRYPT_OK) { + SvREFCNT_dec(RETVAL); + XSRETURN_UNDEF; + } + SvCUR_set(RETVAL, out_len); + } + } + OUTPUT: + RETVAL + +SV * +encode_b32r(SV *in) + ALIAS: + encode_b32b = 1 + encode_b32z = 2 + encode_b32c = 3 + CODE: + { + STRLEN in_len; + unsigned long out_len; + unsigned char *out_data, *in_data; + int id = -1; + + if (!SvPOK(in)) XSRETURN_UNDEF; + if (ix == 0) id = BASE32_RFC4648; + if (ix == 1) id = BASE32_BASE32HEX; + if (ix == 2) id = BASE32_ZBASE32; + if (ix == 3) id = BASE32_CROCKFORD; + if (id == -1) XSRETURN_UNDEF; + in_data = (unsigned char *) SvPVbyte(in, in_len); + if (in_len == 0) { + RETVAL = newSVpvn("", 0); + } + else { + out_len = (unsigned long)((8 * in_len + 4) / 5); + RETVAL = NEWSV(0, out_len); /* avoid zero! */ + SvPOK_only(RETVAL); + out_data = (unsigned char *)SvPVX(RETVAL); + if (base32_encode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) { + SvREFCNT_dec(RETVAL); + XSRETURN_UNDEF; + } + SvCUR_set(RETVAL, out_len); + } + } + OUTPUT: + RETVAL + +SV * +decode_b32r(SV *in) + ALIAS: + decode_b32b = 1 + decode_b32z = 2 + decode_b32c = 3 + CODE: + { + int rv; + STRLEN in_len; + unsigned long out_len; + unsigned char *out_data, *in_data; + int id = -1; + + if (!SvPOK(in)) XSRETURN_UNDEF; + if (ix == 0) id = BASE32_RFC4648; + if (ix == 1) id = BASE32_BASE32HEX; + if (ix == 2) id = BASE32_ZBASE32; + if (ix == 3) id = BASE32_CROCKFORD; + if (id == -1) XSRETURN_UNDEF; + in_data = (unsigned char *)SvPVbyte(in, in_len); + if (in_len == 0) { + RETVAL = newSVpvn("", 0); + } + else { + out_len = (unsigned long)in_len; + RETVAL = NEWSV(0, out_len); /* avoid zero! */ + SvPOK_only(RETVAL); + out_data = (unsigned char *)SvPVX(RETVAL); + if (base32_decode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) { + SvREFCNT_dec(RETVAL); + XSRETURN_UNDEF; + } + SvCUR_set(RETVAL, out_len); + } + } + OUTPUT: + RETVAL + +SV * +increment_octets_le(SV * in) + CODE: + { + STRLEN len, i = 0; + unsigned char *out_data, *in_data; + + if (!SvPOK(in)) XSRETURN_UNDEF; + in_data = (unsigned char *)SvPVbyte(in, len); + if (len == 0) { + RETVAL = newSVpvn("", 0); + } + else { + RETVAL = NEWSV(0, len); /* avoid zero! */ + SvPOK_only(RETVAL); + SvCUR_set(RETVAL, len); + out_data = (unsigned char *)SvPVX(RETVAL); + Copy(in_data, out_data, len, unsigned char); + while (i < len) { + out_data[i]++; + if (0 != out_data[i]) break; + i++; + } + if (i == len) { + SvREFCNT_dec(RETVAL); + croak("FATAL: increment_octets_le overflow"); + } + } + } + OUTPUT: + RETVAL + +SV * +increment_octets_be(SV * in) + CODE: + { + STRLEN len, i = 0; + unsigned char *out_data, *in_data; + + if (!SvPOK(in)) XSRETURN_UNDEF; + in_data = (unsigned char *)SvPVbyte(in, len); + if (len == 0) { + RETVAL = newSVpvn("", 0); + } + else { + RETVAL = NEWSV(0, len); /* avoid zero! */ + SvPOK_only(RETVAL); + SvCUR_set(RETVAL, len); + out_data = (unsigned char *)SvPVX(RETVAL); + Copy(in_data, out_data, len, unsigned char); + while (i < len) { + out_data[len - 1 - i]++; + if (0 != out_data[len - 1 - i]) break; + i++; + } + if (i == len) { + SvREFCNT_dec(RETVAL); + croak("FATAL: increment_octets_be overflow"); + } + } + } OUTPUT: RETVAL diff --git a/lib/Crypt/Misc.pm b/lib/Crypt/Misc.pm index 9b8c9b4..7978ec3 100644 --- a/lib/Crypt/Misc.pm +++ b/lib/Crypt/Misc.pm @@ -35,22 +35,6 @@ use Crypt::Cipher; use Crypt::PRNG 'random_bytes'; -sub encode_b64 { - CryptX::_encode_base64(@_); -} - -sub decode_b64 { - CryptX::_decode_base64(@_); -} - -sub encode_b64u { - CryptX::_encode_base64url(@_); -} - -sub decode_b64u { - CryptX::_decode_base64url(@_); -} - sub _encode_b58 { my ($bytes, $alphabet) = @_; @@ -61,7 +45,7 @@ if ($bytes =~ /^(\x00+)/) { $base58 = ('0' x length($1)); } - $base58 .= CryptX::_bin_to_radix($bytes, 58); + $base58 .= _bin_to_radix($bytes, 58); if (defined $alphabet) { my $default = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv"; @@ -92,7 +76,7 @@ $base58 = $2; $bytes = ("\x00" x length($1)); } - $bytes .= CryptX::_radix_to_bin($base58, 58) if defined $base58 && length($base58) > 0; + $bytes .= _radix_to_bin($base58, 58) if defined $base58 && length($base58) > 0; return $bytes; } @@ -108,27 +92,6 @@ sub encode_b58r { _encode_b58(shift, "rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz") } # Ripple sub encode_b58t { _encode_b58(shift, "RPShNAF39wBUDnEGHJKLM4pQrsT7VWXYZ2bcdeCg65jkm8ofqi1tuvaxyz") } # Tipple sub encode_b58s { _encode_b58(shift, "gsphnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCr65jkm8oFqi1tuvAxyz") } # Stellar - -sub encode_b32r { CryptX::_encode_b32(shift, 0) } # rfc4648 -sub encode_b32b { CryptX::_encode_b32(shift, 1) } # base32hex -sub encode_b32z { CryptX::_encode_b32(shift, 2) } # zbase32 -sub encode_b32c { CryptX::_encode_b32(shift, 3) } # crockford - -sub decode_b32r { CryptX::_decode_b32(shift, 0) } # rfc4648 -sub decode_b32b { CryptX::_decode_b32(shift, 1) } # base32hex -sub decode_b32z { CryptX::_decode_b32(shift, 2) } # zbase32 -sub decode_b32c { CryptX::_decode_b32(shift, 3) } # crockford - - -sub increment_octets_be { - CryptX::_increment_octets_be(@_); - #$_[0] = CryptX::_increment_octets_be($_[0]); -} - -sub increment_octets_le { - CryptX::_increment_octets_le(@_); - #$_[0] = CryptX::_increment_octets_le($_[0]); -} sub pem_to_der { my ($data, $password) = @_; @@ -194,6 +157,7 @@ } sub read_rawfile { + # $data = read_rawfile($filename); my $f = shift; croak "FATAL: read_rawfile() non-existing file '$f'" unless -f $f; open my $fh, "<", $f or croak "FATAL: read_rawfile() cannot open file '$f': $!";