1de8cc8edSafresh1#!perl -w 2de8cc8edSafresh1 3de8cc8edSafresh1use strict; 4de8cc8edSafresh1use warnings; 5de8cc8edSafresh1use Test::More; 6de8cc8edSafresh1use Devel::Peek; 7de8cc8edSafresh1use Config; 8de8cc8edSafresh1 9de8cc8edSafresh1BEGIN { use_ok('XS::APItest') } 10de8cc8edSafresh1 11de8cc8edSafresh1my $is_wide = $Config{ivsize} == 8; 12de8cc8edSafresh1 13de8cc8edSafresh1sub test_rot { 14de8cc8edSafresh1 my ( $fnc, $n, $r, $max ) = @_; 15de8cc8edSafresh1 my %seen; 16de8cc8edSafresh1 my @seq; 17de8cc8edSafresh1 while ( @seq < $max and !$seen{$n}++ ) { 18de8cc8edSafresh1 push @seq, $n; 19de8cc8edSafresh1 $n = $fnc->( $n, $r ); 20de8cc8edSafresh1 } 21de8cc8edSafresh1 return \@seq; 22de8cc8edSafresh1} 23de8cc8edSafresh1 24de8cc8edSafresh1for my $test ( 25de8cc8edSafresh1 [ 26de8cc8edSafresh1 # source string: 27de8cc8edSafresh1 "\x{12}\x{34}\x{56}\x{78}\x{9A}\x{BC}\x{DE}\x{F0}" x 2, 28de8cc8edSafresh1 29de8cc8edSafresh1 #results: 30de8cc8edSafresh1 #16 32 64 31de8cc8edSafresh1 "0x3412", "0x78563412", "0xf0debc9a78563412", 32de8cc8edSafresh1 "0x5634", "0x9A785634", "0x12f0debc9a785634", 33de8cc8edSafresh1 "0x7856", "0xBC9A7856", "0x3412f0debc9a7856", 34de8cc8edSafresh1 "0x9A78", "0xDEBC9A78", "0x563412f0debc9a78", 35de8cc8edSafresh1 "0xBC9A", "0xF0DEBC9A", "0x78563412f0debc9a", 36de8cc8edSafresh1 "0xDEBC", "0x12F0DEBC", "0x9a78563412f0debc", 37de8cc8edSafresh1 "0xF0DE", "0x3412F0DE", "0xbc9a78563412f0de", 38de8cc8edSafresh1 "0x12F0", "0x563412F0", "0xdebc9a78563412f0", 39de8cc8edSafresh1 ], 40de8cc8edSafresh1 [ 41de8cc8edSafresh1 # source string: 42de8cc8edSafresh1 "\x{F0}\x{E1}\x{D2}\x{C3}\x{B4}\x{A5}\x{96}\x{87}" x 2, 43de8cc8edSafresh1 44de8cc8edSafresh1 #results: 45de8cc8edSafresh1 #16 32 64 46de8cc8edSafresh1 "0xe1f0", "0xc3d2e1f0", "0x8796a5b4c3d2e1f0", 47de8cc8edSafresh1 "0xd2e1", "0xb4c3d2e1", "0xf08796a5b4c3d2e1", 48de8cc8edSafresh1 "0xc3d2", "0xa5b4c3d2", "0xe1f08796a5b4c3d2", 49de8cc8edSafresh1 "0xb4c3", "0x96a5b4c3", "0xd2e1f08796a5b4c3", 50de8cc8edSafresh1 "0xa5b4", "0x8796a5b4", "0xc3d2e1f08796a5b4", 51de8cc8edSafresh1 "0x96a5", "0xf08796a5", "0xb4c3d2e1f08796a5", 52de8cc8edSafresh1 "0x8796", "0xe1f08796", "0xa5b4c3d2e1f08796", 53de8cc8edSafresh1 "0xf087", "0xd2e1f087", "0x96a5b4c3d2e1f087", 54de8cc8edSafresh1 ], 55de8cc8edSafresh1 ) 56de8cc8edSafresh1{ 57de8cc8edSafresh1 my $str = $test->[0]; 58de8cc8edSafresh1 for my $ofs ( 0 .. 7 ) { 59de8cc8edSafresh1 my $n = ( $ofs * 3 ) + 1; 60de8cc8edSafresh1 my ( $want16, $want32, $want64 ) = @{$test}[ $n .. ( $n + 2 ) ]; 61de8cc8edSafresh1 my $input = join " ", map { sprintf "%02x", ord($_) } split //, 62de8cc8edSafresh1 substr $str, $ofs, 8; 63de8cc8edSafresh1 my $hex16 = sprintf "0x%04x", 64de8cc8edSafresh1 XS::APItest::HvMacro::u8_to_u16_le( $str, $ofs ); 65de8cc8edSafresh1 is( $hex16, lc($want16), 66de8cc8edSafresh1 "U8TO16_LE works as expected (hex bytes:" 67de8cc8edSafresh1 . substr( $input, 0, 4 + 1 ) 68de8cc8edSafresh1 . ")" ); 69de8cc8edSafresh1 my $hex32 = sprintf "0x%08x", 70de8cc8edSafresh1 XS::APItest::HvMacro::u8_to_u32_le( $str, $ofs ); 71de8cc8edSafresh1 is( $hex32, lc($want32), 72de8cc8edSafresh1 "U8TO32_LE works as expected (hex bytes:" 73de8cc8edSafresh1 . substr( $input, 0, 8 + 3 ) 74de8cc8edSafresh1 . ")" ); 75de8cc8edSafresh1 next unless $is_wide; 76de8cc8edSafresh1 my $hex64 = sprintf "0x%016x", 77de8cc8edSafresh1 XS::APItest::HvMacro::u8_to_u64_le( $str, $ofs ); 78de8cc8edSafresh1 is( $hex64, lc($want64), 79de8cc8edSafresh1 "U8TO64_LE works as expected (hex bytes:" 80de8cc8edSafresh1 . substr( $input, 0, 16 + 7 ) 81de8cc8edSafresh1 . ")" ); 82de8cc8edSafresh1 } 83de8cc8edSafresh1} 84de8cc8edSafresh1{ 85de8cc8edSafresh1 my $seq_l32 = test_rot( \&XS::APItest::HvMacro::rotl32, 1, 1, 33 ); 86de8cc8edSafresh1 is( 0 + @$seq_l32, 32, "rotl32(n,1) works as expected" ); 87de8cc8edSafresh1 is_deeply( 88de8cc8edSafresh1 $seq_l32, 89de8cc8edSafresh1 [ 90de8cc8edSafresh1 1, 2, 4, 8, 91de8cc8edSafresh1 16, 32, 64, 128, 92de8cc8edSafresh1 256, 512, 1024, 2048, 93de8cc8edSafresh1 4096, 8192, 16384, 32768, 94de8cc8edSafresh1 65536, 131072, 262144, 524288, 95de8cc8edSafresh1 1048576, 2097152, 4194304, 8388608, 96de8cc8edSafresh1 16777216, 33554432, 67108864, 134217728, 97de8cc8edSafresh1 268435456, 536870912, 1073741824, 2147483648 98de8cc8edSafresh1 ], 99de8cc8edSafresh1 "rotl32(n,1) returned expected results" 100de8cc8edSafresh1 ); 101de8cc8edSafresh1 my $seq_r32 = test_rot( \&XS::APItest::HvMacro::rotr32, 1, 1, 33 ); 102de8cc8edSafresh1 is( 0 + @$seq_r32, 32, "rotr32(n,1) works as expected" ); 103de8cc8edSafresh1 is_deeply( 104de8cc8edSafresh1 $seq_r32, 105de8cc8edSafresh1 [ 106de8cc8edSafresh1 1, 2147483648, 1073741824, 536870912, 107de8cc8edSafresh1 268435456, 134217728, 67108864, 33554432, 108de8cc8edSafresh1 16777216, 8388608, 4194304, 2097152, 109de8cc8edSafresh1 1048576, 524288, 262144, 131072, 110de8cc8edSafresh1 65536, 32768, 16384, 8192, 111de8cc8edSafresh1 4096, 2048, 1024, 512, 112de8cc8edSafresh1 256, 128, 64, 32, 113de8cc8edSafresh1 16, 8, 4, 2 114de8cc8edSafresh1 ], 115de8cc8edSafresh1 "rotr32(n,1) returned expected" 116de8cc8edSafresh1 ); 117de8cc8edSafresh1 isnt( "@$seq_l32", "@$seq_r32", 118de8cc8edSafresh1 "rotl32(n,1) and rotr32(n,1) return different results" ); 119de8cc8edSafresh1} 120de8cc8edSafresh1if ($is_wide) { 121de8cc8edSafresh1 my $seq_l64 = test_rot( \&XS::APItest::HvMacro::rotl64, 1, 1, 65 ); 122de8cc8edSafresh1 is( 0 + @$seq_l64, 64, "rotl64(n,1) works as expected" ); 123de8cc8edSafresh1 is_deeply( 124de8cc8edSafresh1 $seq_l64, 125de8cc8edSafresh1 [ 126de8cc8edSafresh1 1, 2, 127de8cc8edSafresh1 4, 8, 128de8cc8edSafresh1 16, 32, 129de8cc8edSafresh1 64, 128, 130de8cc8edSafresh1 256, 512, 131de8cc8edSafresh1 1024, 2048, 132de8cc8edSafresh1 4096, 8192, 133de8cc8edSafresh1 16384, 32768, 134de8cc8edSafresh1 65536, 131072, 135de8cc8edSafresh1 262144, 524288, 136de8cc8edSafresh1 1048576, 2097152, 137de8cc8edSafresh1 4194304, 8388608, 138de8cc8edSafresh1 16777216, 33554432, 139de8cc8edSafresh1 67108864, 134217728, 140de8cc8edSafresh1 268435456, 536870912, 141de8cc8edSafresh1 1073741824, 2147483648, 142de8cc8edSafresh1 4294967296, 8589934592, 143de8cc8edSafresh1 '17179869184', '34359738368', 144de8cc8edSafresh1 '68719476736', '137438953472', 145de8cc8edSafresh1 '274877906944', '549755813888', 146de8cc8edSafresh1 '1099511627776', '2199023255552', 147de8cc8edSafresh1 '4398046511104', '8796093022208', 148de8cc8edSafresh1 '17592186044416', '35184372088832', 149de8cc8edSafresh1 '70368744177664', '140737488355328', 150de8cc8edSafresh1 '281474976710656', '562949953421312', 151de8cc8edSafresh1 '1125899906842624', '2251799813685248', 152de8cc8edSafresh1 '4503599627370496', '9007199254740992', 153de8cc8edSafresh1 '18014398509481984', '36028797018963968', 154de8cc8edSafresh1 '72057594037927936', '144115188075855872', 155de8cc8edSafresh1 '288230376151711744', '576460752303423488', 156de8cc8edSafresh1 '1152921504606846976', '2305843009213693952', 157de8cc8edSafresh1 '4611686018427387904', '9223372036854775808' 158de8cc8edSafresh1 ], 159de8cc8edSafresh1 "rotl64(n,1) returned expected results" 160de8cc8edSafresh1 ); 161de8cc8edSafresh1 my $seq_r64 = test_rot( \&XS::APItest::HvMacro::rotr64, 1, 1, 65 ); 162de8cc8edSafresh1 is( 0 + @$seq_r64, 64, "rotr64(n,1) works as expected" ); 163de8cc8edSafresh1 is_deeply( 164de8cc8edSafresh1 $seq_r64, 165de8cc8edSafresh1 [ 166de8cc8edSafresh1 1, '9223372036854775808', 167de8cc8edSafresh1 '4611686018427387904', '2305843009213693952', 168de8cc8edSafresh1 '1152921504606846976', '576460752303423488', 169de8cc8edSafresh1 '288230376151711744', '144115188075855872', 170de8cc8edSafresh1 '72057594037927936', '36028797018963968', 171de8cc8edSafresh1 '18014398509481984', '9007199254740992', 172de8cc8edSafresh1 '4503599627370496', '2251799813685248', 173de8cc8edSafresh1 '1125899906842624', '562949953421312', 174de8cc8edSafresh1 '281474976710656', '140737488355328', 175de8cc8edSafresh1 '70368744177664', '35184372088832', 176de8cc8edSafresh1 '17592186044416', '8796093022208', 177de8cc8edSafresh1 '4398046511104', '2199023255552', 178de8cc8edSafresh1 '1099511627776', '549755813888', 179de8cc8edSafresh1 '274877906944', '137438953472', 180de8cc8edSafresh1 '68719476736', '34359738368', 181de8cc8edSafresh1 '17179869184', 8589934592, 182de8cc8edSafresh1 4294967296, 2147483648, 183de8cc8edSafresh1 1073741824, 536870912, 184de8cc8edSafresh1 268435456, 134217728, 185de8cc8edSafresh1 67108864, 33554432, 186de8cc8edSafresh1 16777216, 8388608, 187de8cc8edSafresh1 4194304, 2097152, 188de8cc8edSafresh1 1048576, 524288, 189de8cc8edSafresh1 262144, 131072, 190de8cc8edSafresh1 65536, 32768, 191de8cc8edSafresh1 16384, 8192, 192de8cc8edSafresh1 4096, 2048, 193de8cc8edSafresh1 1024, 512, 194de8cc8edSafresh1 256, 128, 195de8cc8edSafresh1 64, 32, 196de8cc8edSafresh1 16, 8, 197de8cc8edSafresh1 4, 2 198de8cc8edSafresh1 ], 199de8cc8edSafresh1 "rotr64(n,1) returned expected results" 200de8cc8edSafresh1 ); 201de8cc8edSafresh1 isnt( "@$seq_l64", "@$seq_r64", 202de8cc8edSafresh1 "rotl64(n,1) and rotr64(n,1) return different results" ); 203de8cc8edSafresh1} 204de8cc8edSafresh1if ($is_wide) { 205*256a93a4Safresh1 push @INC, '../../t'; 206*256a93a4Safresh1 require 'charset_tools.pl'; 207*256a93a4Safresh1 208*256a93a4Safresh1 # The values here are from the ASCII/Unicode code points; so if on EBCDIC 209*256a93a4Safresh1 # we need # to convert from native to uni to get the same values 210*256a93a4Safresh1 211*256a93a4Safresh1 my $seed = native_to_uni("perl is for good"); 212de8cc8edSafresh1 my $state = XS::APItest::HvMacro::siphash_seed_state($seed); 213de8cc8edSafresh1 is( 214de8cc8edSafresh1 sprintf( "%016x", 215*256a93a4Safresh1 XS::APItest::HvMacro::siphash24( $state, native_to_uni("Larry wall is BDFL")) ), 216de8cc8edSafresh1 "71a11e065cefc12c", 217de8cc8edSafresh1 "Siphash24 seems to work" 218de8cc8edSafresh1 ); 219de8cc8edSafresh1 is( 220de8cc8edSafresh1 sprintf( "%016x", 221*256a93a4Safresh1 XS::APItest::HvMacro::siphash13( $state, native_to_uni("Larry wall is BDFL" ))), 222de8cc8edSafresh1 "adee71f47e49757a", 223de8cc8edSafresh1 "Siphash13 seems to work" 224de8cc8edSafresh1 ); 225de8cc8edSafresh1 is( XS::APItest::HvMacro::test_siphash24(), 0, "siphash24 test vectors check" ); 226de8cc8edSafresh1 is( XS::APItest::HvMacro::test_siphash13(), 0, "siphash13 test vectors check" ); 227de8cc8edSafresh1} 228de8cc8edSafresh1done_testing(); 229de8cc8edSafresh1 230