Digest-BLAKE3

 view release on metacpan or  search on metacpan

t/02vectors.t  view on Meta::CPAN

#! perl

use Test::More;

use Digest::BLAKE3;

my($input_rep_len, $input_rep, $output_len, $key, $context, @cases, @hashers);

@hashers = (
    Digest::BLAKE3::->new_hash(),
    Digest::BLAKE3::->new_keyed_hash($key),
    Digest::BLAKE3::->new_derive_key($context),
);

foreach my $hasher (@hashers) {
    $hasher->hashsize($output_len*8);
}

plan(tests => 3*@cases);

foreach my $case (@cases) {
    my($input_len, $input);

    $input_len = $case->{input_len};
    $input = substr(
	$input_rep x (($input_len+$input_rep_len-1)/$input_rep_len),
	0, $input_len);
    foreach my $hasher (@hashers) {
	my($mode);

	$mode = $hasher->mode();
	is($hasher->add($input)->b64digest(), $case->{$mode},
	   "$mode $input_len");
    }
}

# derived from test_vectors/test_vectors.json in the BLAKE3 repository

BEGIN {
    $input_rep_len = 251;
    $input_rep = join("", map(chr($_), 0..$input_rep_len-1));
    $output_len = 131;
    $key = "whats the Elvish word for friend";
    $context = "BLAKE3 2019-12-27 16:29:52 test vectors context";
    @cases = (
	{
	    input_len => 0,
	    hash => "rxNJufX5oaagQE3qNtzJSZvLJcmtwRK3zJqTyuQfMmLgDwPntprya3+q8J/NMzBQM43f4IW4zIacqYsgbAgkOib1SHeJ6PZgr+bJnvngxSuS5zkwJKgEWc+R9Hb5/9vacAHCLhWbQCYx8nfKlvLe/fEHgoIxTnY2maMcU2MWVCHM4U0",
	    keyed_hash => "krK3VgTtPHYfnW9iOSyKkietDqPwlXPng/FJik7WDSaxgXGi8ipLlIIscB8QcVPbokkYxLrk0pRcIOzhM4difTtzy/l7eX1eWZSMfveI9UNy30XkXkKTx9wYwdQRRKl1i+WJYIVr4eq74iwmUxkN5WDKOyrEqmkqkhBpQlTDcehRvI8",
	    derive_key => "LMOXg8IjFU/qjft8GxZg8qwty9HB3oJ3sLDdObflDX2QVjDIvikN/PPmhC8Tvd1XPAmMPxc2Hx8ga4ytnQiKpKP3RnUsawzmqDsNqB1ZZJJXzfjrPp99SZjkECH6wRne77iWIkrJn4YAEfc2Cebg5FQPk7Jz5WVH39OqGgNbpmidiaA"
	},
	{
	    input_len => 1,
	    hash => "LTre3/EbYfFMiG41r6A2c23Nh6dNJ7XBUQIl0PWS4hPDpsuL9iPiDNtTX40aX/uGNC2cC2Sso7zh0x9grfoTezWK1Nefl7R8PV558Xnfh6O5d274Ml+DKYhrpC8H+xOLtQL0CBy87DGVxYcebCPizJfTxpphProTHl8TUfPx2nhlReU",
	    keyed_hash => "bXh43/8vSFY105ATJ4rhTxRUuMCjotNLwas4IoqAyVtlaMBJBglBMAb71CjrP9FOd1bZD3Okcl+tFH979w/WHE4M9wdIhekrDj8SWXi0FUmG1PsgKj8zGj+2zzSaOnDkmZD5j+Qol2HIYCxOarETjTHTtiIYB4svO6mojh0I0N1M6hE",
	    derive_key => "s+LjQKEXpJnGzyOYoZ7g0pzKK7dATHMGM4JpO/ZssGxYJ7kb+Im2uXxUd/U1Nhyu/KC12MR0ZEHFdhcRGTMViVBnD5qooF15HarhCsaDy++Pr4l8hOYRSlnSFzw/QXAjo11pg/LH36V+f8VZrXUdv7n/qznC74xKr+vJrpc6ZPDHZVE"
	},
	{
	    input_len => 2,
	    hash => "e3AVu5LPCzGAN3AqbN2B3uQSJPc0aEwsEizWNZyx7mPYOGsi4t3AWDa3wbtpPZKvAG3rX/vExw+0TQGV0MbyUvqsYWWe+GUjqhZRf4fLXxNA5yN1arZe+y+Rlk4UOR3ipDImOm+vHRRpN7NaM2IcEtAL6CI6fxkZzsCs0SCX/zqwCrE",
	    keyed_hash => "U5Ldrg4KadX0AWBGLL2b2Ik3UIL/IkrJx1iAK3pv0gqf+/fv0T6Ymmwkb5bTqWudJ58sTmP7C9/2M5V6z1DuGl9li+FEurD28WUA3uSqWWf8LFhthaBMrd7JD/+3Yz9GpgeGAkNTueXOvid/zZUUIX/uImfc2o97MWl7fFT6tqk5v48",
	    derive_key => "HxZlZaffAJjuZZItf+pCX7GLmUPxnWFh4tF5OTVhaObapZyuGYkrLVT2/J9HXSYDH9HCKuCj6O972yP0UqFeACdinS6Gexux5qshxxKXN3dQgmxATfzMJAa9V6g3dfieCwdeWadzIyZxXvkSB44hOUT0kK1oA3VXUYt5wAht5tb2zdI"
	},
	{
	    input_len => 3,
	    hash => "4b5Neoq1VgqkGZ7qM5hJuo4pPVXKCoEAZybRhFGeZH9bSbgvgFpTjGiRXBroA1yQD9HUsTkCkg/QXhRQgi823pRUt+mZbeSQDI5yNRKIP5P0NF+KWL/mTuONOtcasCd2XSXN0ORIMoqOemg7mmr4sK+U+gkBDZGGiQsJaghHHkIwoTQ",
	    keyed_hash => "OeZ7drWgB9SSGWl3n+Zm2me1ITsJYISrZ0dC8NXsYrm5FC0PqwjhsWHv27KNGK/GTY9yFgyVjlOpUM3s+RwaG7qxqcDwHe92Knfi6FRdTewkHpiom22y6aWwcPwRDKriYiaQvXt2wCq2B1Cj6nVCamu4gDw3D/5GXwf7V975Xfdyw58",
	    derive_key => "RAq6NcsAa2H8F8BSklXeQ478BqjJ6/Py3aw7WoZwV5fyfi6RRXT02H7ATDeeEniezL+8FYkmJgQnB4Atvk6Xw/9Z3KgMHlQka20FUVT3NIo5t9CYsrSCTr6Q4QTnY7KkR1EhMs7eFiQ0hKVaTkCoV5ADi7Dc92LowFPKuuQbviKlv/c"
	},
	{
	    input_len => 4,
	    hash => "8w9aso/gR5BAN/d7baT+oeJyQcXRMmONi+3OnUBJTzKPYDukVkRT4Gzc7my+copFGbvm8NQeihS1siUXSlZtv6YbVq+x5FLcCMgE+MMUPJ4sxKMbtzi/jBkXtVgwxuZXlyEXAdwLmNqh+uqm7p5Wq2Bs4DoaiB6PFOh6Ss9GRics/RI",
	    keyed_hash => "dnHd5ZDJXVrJYWZR/1qgonvuWROjSOBTuKqRCJF/4HARbArP8/DR+perONgT/UZQYIkRgUfYM5MBmwaKVdZGJR7PgRBfeY12oQrkE/PZJXh9Yhan60ROUQ/VaRbx11OlVE7PAHITShRrJhW0L1DBefVrj64HiACOPifGdII0niScuGo",
	    derive_key => "9GCFyBkNaQIjac4aGIgOmzacE165PzxjVQ0+djDpEGD719j0JYvsnaTgUET4i5GUT3yrMXovDBgnlimjhn+tBmLJrU1CxvJ+WxJNoXyMTzqUoCW6XRtiNobGCZ0gKnMXqC49ldrkaofeBVXXJ6XfVd5E2reZog3/4jlZTW6Z7ReVCRA"
	},
	{
	    input_len => 5,
	    hash => "tAtE39l+eoSplqka+LhRiMZsEmlAunqtLnrms4VAKqLrz9rGxdMsMSCeH4GkVHUSgNtklCzjlRBOHk6spiYH3hwsp0glF1TqW76MIBUOf0fv1XASxjs8amYy3Bx80V8+HJmZBAN9YPrC65OX8q2+RY1/Jk5k8ec6qSezCYjirtLwNiA",
	    keyed_hash => "c6xp7s8oaJTYECAYpvxyn0sfQkfTcD9pvcal/j4MhGFqsZnR8vPlO/+xfwoiCf6LT31Me65Zwrx9AfH/lMZ1iMxrOPpgJIhvLAeL/gm12eZYTNbFIcO7UvTedoezcRei277A1Z6S+pqMwyQNRDL5F1eqvK4D6HQx2sAD59c1dL/dghg",
	    derive_key => "HyTtpp28t1KEfsPrtd1Cg22G5YUAx8mNkG7Ngu2a5H9vSKP2fk5DMpyaibHKUmubNcv30lweNTuv+1kP15vljdtscR8aa2DphiC4UcaIZwQS/LBDVle6a2ONIfDyoE8vawvYg0g3sQ5DjV9MfCxxKZz3WG6pFE7QklPVH49U3Wv/cZ0"
	},
	{
	    input_len => 6,
	    hash => "BsTo/7aHL62W+arKXu4VU+tirtCtcZjO9C6H9qYWyERhGjDE5PN/4v4jwIg83lz3BZ2ItlfH7SCH49IQkl7ecWQ11tXYJZeh5SuVU5GegE9WVieL1zmIBpLJS/8oJNjgtIysHSRoJpnkiDOJ3E8vqi6ztNtuOd69UGH/NgmRbz4HUpo",
	    keyed_hash => "gtMZnQATA1aCzH8qOZ1MISVEN2qDmqhjoPTJEiDKem3C/7OqBfJjHw+prBm26X635maeXsJUeZNQyLjRieiAeACEKlODxNkHyTLzRJCq8ABk3ozbFXNXveN8FQTSlgA0kwiHYDq8XMufUkf3kiS6/2Ego8YipG17G8ruAsUCVGCUElY",
	    derive_key => "vpazCzeRn+Q3nfvnUq53tPfiq5L3/ydDX3by8GX2pfQ1rgGh0UvVprO2nYy9NfCwHvIXP/b5tkDKC9R0jvo5i/mpwKzWpm2TMv3JtH/+KLp6tgkMJnR7hfT6si+Ta3HrP2RhPYvZ36vpu2jaGd54MhtIHlKX355A7Io9Zi8+FHnGXeA"
	},
	{
	    input_len => 7,
	    hash => "P4dw84f6rQj6qdhBTp9EmsaOb/BBf2c/YCpkaokUGf5mA2725tGo9Uuqn+0fwRx3z7nP9luukVBFAnBG6+DAG/WpQfO7D3N5HT/AuENw+fMK8M1bD8M03WH3D+tg2teF8HD+8fND7ZM7SaXKDRalA/WZo2WkKWc5JIso0aILDizIl1w",
	    keyed_hash => "rwp+w4Ku3Az9Ym5J52KLx6NTpMsQiFVUGlZRv2T7sop8UDW6D0ipxz2rsr4FM9Auj9XQ1WOaGLKAO6a/Un4dFF1f1kBsQ3t5vKrWx73xz0vVaok8PrlRAzWnp5hUjGdT90YXvt6IvvkkukszT4hSR22QsmxdxMNmiiUZJmpWLGyANKY",
	    derive_key => "3DtkhfnZSTUylEKRaw0FloW6gVofoqFBByF0U6f8nw5mJm2y6nyWhD+dggjmAKc/f0Wy9VuebWp8zwXarmOj/dELJawL0uIkzoKR+IwFl21XXfmYR324b7LPu/kXJdYstXrP6zwtlzuJtQPCtg3ehaeAK2ncGsIAfVYjy+qMv7axgfU"
	},
	{
	    input_len => 8,
	    hash => "I1EgfQT8Fq3kPMqwhgCTnHwfpwpcCqynYGPQTDIo6utyXW1Gzu2PeFq58vmwas/jmMZpnGEp2ghMtTEXdEWmgolPloXq+DaZkiHRfJpko6BXAAUkzSgjmG2zeLB0KQoam5OiLhNe0sFMfiDG0EXNALkDQAN0EmZ26niHTXny3XiDz1w",
	    keyed_hash => "vi9UlcYcuhuzSKNJSMAEBF471Nro8P6Cv0TQ2iRaBgBI615ozm3qHrAinhRPV4s6p+n0+F/r0TXfhSXm/kDG8DQNE90JslXM1REqlCOPK+PAtbfs3gZYBCapPgcIVVomUwWr+G2HTjS0mVt4jjeoI0kfJRJ6UC/gcEuqa/3wTnbBMnY",
	    derive_key => "KxZpeM7xTZ1DgEbHIFGdixytcH4Zl0bxVi0Mh/vTKUDw4lRalmk6ZmVCJeu6rHbQk7+pzY9SWlOsuSqGGpjELn0cSuguaKtpHVEAEu3Spyj5jNR5TvdX6U1lRpYbTygKUarDOcyVtkqSuDzD8m2K+N+0wJHCQKzbTUdyjSPnFIcg7wQ"
	},
	{
	    input_len => 63,
	    hash => "6bw3pZTarYO+lHDff3s3mCl8PYNM6AuoXW4gdie323sRlwErHn2a9NfLe90fO7SakKm13sPqK7xurrznf05HDL9Ghwk7U1LwTkpFcPuiMxZOasw2kA410YWIaoJ/fqm9weXDzoiwlaIA5iwQwEOz6bxsubasTfpReUsCrOn5h3kEB1U",
	    keyed_hash => "ux611K+nk8Hr3Z+wje9sNtEAlphq4M/hSM0QEXDON66gWmPXSoQK7NUU9lTwgOUaxQ/WF9ImENkXgP5rB6JrCEers4KRBYyXR0723dGQ0w/DGBhcCcoVidICTwpvFtRfEWeDd0g/pcAFsqEHy5lD5dpjTnBGhV6qiIZj3lXWRxNx1V0",
	    derive_key => "tkUeMLlTwgbjRkTGgDck6dJyXgiTA5z8SVhPmR9FGvO4no/1ctPaT0AiGZuVY7nXDrthbv/wdj6avscbVQ8TceIzMZxMTnTak2uo5buymlmOAHoLv6kpyZc4yizAmNWRNNEf8wDDn4Li/On38PomZFlQP2SrmRO+/GX93EdPbcHGdmk"
	},
	{
	    input_len => 64,
	    hash => "Tu1xQepKXNS3iGBr0j9G4hKvnKzrrNx9H0xtx/JRG5j8nMVsuDH/4z6o5+HR3wmybv0nZ2cAZqqC0COx3+irGyt/u1uXWS1G/+PgWmqbWS4pScdBYORnQwG8P5fgSQP4xs+VuGMXTDMiiSTN73rkdVmxCylKzWYGZsRTiDNYK0P4LXQ",
	    keyed_hash => "uoztNvMncA0hPxILGiB6O4wEMwUoWG9BTQny99nMt+aCRMJgEK/D92JhW7rFUqHKkJ5nyD4v1UeM9GuegR78zJP3eiGxehUuusoWlXM/2whuI80OtIxBwDTVJSP8ISNuXYySVTBuSNUrpAtNrCQlZGDVZXPRMSMZr88+051y0L/Gmss",



( run in 0.542 second using v1.01-cache-2.11-cpan-e1769b4cff6 )