<? 
    include "kravatte_final.php"; 
     
    function xtrae($key,$vector,$x="") 
        { 
        $k  = explode(",",explode('])',explode("$key = $x"."bytes([",$vector)[1])[0]);         
        $zk = "";foreach ($k as $m) $zk .=@explode("0x",trim($m))[1]; 
        return pack("H*",$zk);                 
        } 
         
    $x=new Kravatte; 
 
    // Test Vectors 
 
    $server   = "http://raw.githubusercontent.com/inmcm/kravatte/master/tests"; 
     
    $fvectors = ["mac"]; 
 
    foreach ($fvectors as $f) 
        { 
        $count   = 0; 
        echo "Kravatte $f "; 
        $vectors = file_get_contents("$server/test_kravatte_$f.py"); 
        $vectors = explode("def test_",$vectors); 
 
        foreach (array_slice(array_slice($vectors,1),0,-1) as $vector) 
            { 
            $count++;                 
            $type   = explode('(',explode('kravatte_',$vector)[1])[0];         
            $size   = explode("_",explode("(",$vector)[0]); $size = $size[sizeof($size)-1]; 
                     
            $zk    = xtrae("my_key",$vector);                 
            $zm    = xtrae("my_message",$vector);                             
            $out    = bin2hex(xtrae("real_output",$vector));     
             
            $res    = $x->mac($zk,$zm, $size); 
         
            if (($res != $out)) 
                die("$count Bad");             
            } 
        echo "OK $count tested\n"; 
        } 
 
    $fvectors = ["sane"]; 
 
    foreach ($fvectors as $f) 
        { 
        $count   = 0; 
        echo "Kravatte $f "; 
        $vectors = file_get_contents("$server/test_kravatte_$f.py"); 
        $vectors = explode("def test_kravatte",$vectors); 
 
        foreach (array_slice($vectors,1) as $vector) 
            { 
            $count++;     
            $type = explode('(',explode('SANE_',$vector)[1])[0]; 
                         
            $zk            = xtrae("my_key",$vector);                 
            $zm            = xtrae("my_message",$vector); 
            $meta            = xtrae("my_metadata",$vector); 
            $nonce            = xtrae("my_nonce",$vector);             
            $output_ciphertext    = bin2hex(xtrae("output_ciphertexts",$vector,"[")); 
            $output_tag        = bin2hex(xtrae("output_tags",$vector,"[")); 
             
            $x->Kravatte_SANE($nonce,$zk); 
             
            [$cipher,$tag] = $x->Kravatte_SANE_enc($zm, $meta); 
             
            if (($cipher != $output_ciphertext) or ($tag != $output_tag)) 
                die("$count Bad");             
            } 
        echo "OK $count tested\n"; 
        } 
                 
    $fvectors = ["sanse"]; 
 
    foreach ($fvectors as $f) 
        { 
        $count   = 0; 
        echo "Kravatte $f "; 
        $vectors = file_get_contents("$server/test_kravatte_$f.py"); 
        $vectors = explode("def test_kravatte",$vectors); 
 
        foreach (array_slice($vectors,1) as $vector) 
            { 
            $count++;     
            $type = explode('(',explode('SANSE_',$vector)[1])[0]; 
         
            $zk            = xtrae("my_key",$vector);                 
            $zm            = xtrae("my_message",$vector); 
            $meta            = xtrae("my_metadata",$vector);             
            $output_ciphertext    = bin2hex(xtrae("output_ciphertexts",$vector,"[")); 
            $output_tag        = bin2hex(xtrae("output_tags",$vector,"[")); 
             
            $x->Kravatte_SANSE($zk); 
             
            [$cipher,$tag] = $x->Kravatte_SANSE_enc($zm, $meta); 
             
            if (($cipher != $output_ciphertext) or ($tag != $output_tag)) 
                die("$count Bad");             
            } 
        echo "OK $count tested\n"; 
        } 
                 
    $fvectors = ["wbc"]; 
 
    foreach ($fvectors as $f) 
        { 
        $count   = 0; 
        echo "Kravatte $f "; 
        $vectors = file_get_contents("$server/test_kravatte_$f.py"); 
        $vectors = explode("def test_kravatte",$vectors); 
 
        foreach (array_slice($vectors,2) as $vector) 
            { 
            $count++;     
            $type=explode('(',explode('WBC_',$vector)[1])[0]; 
                     
            $zk            = xtrae("my_key",$vector);                 
            $zm            = xtrae("my_message",$vector); 
            $tweak            = xtrae("my_tweak",$vector);                     
            $output_ciphertext    = bin2hex(xtrae("real_ciphertext",$vector)); 
             
            $x->Kravatte_WBC(strlen($zm), $tweak,$zk); 
             
            $cipher = $x->Kravatte_WBC_enc($zm); 
             
            if (($cipher != $output_ciphertext)) 
                die("$count Bad");             
            } 
        echo "OK $count $f tested\n"; 
        } 
         
    $fvectors = ["wbc_ae"]; 
 
    foreach ($fvectors as $f) 
        { 
        $count = 0; 
        echo "Kravatte $f "; 
        $vectors = file_get_contents("$server/test_kravatte_$f.py"); 
        $vectors = explode("def test_kravatte",$vectors); 
 
        foreach (array_slice($vectors,1) as $vector) 
            { 
            $count++;     
            $type = explode('(',explode('WBC_AE_',$vector)[1])[0];         
 
            $zk            = xtrae("my_key",$vector);                 
            $zm            = xtrae("my_message",$vector); 
            $meta            = xtrae("my_metadata",$vector);                     
            $output_ciphertext    = bin2hex(xtrae("real_ciphertext",$vector)); 
                         
            $x->Kravatte_WBC_AE(strlen($zm), $zk); 
             
            $cipher = $x->Kravatte_WBC_AE_enc($zm,$meta); 
             
            if (($cipher != $output_ciphertext)) 
                die("$count Bad");             
            } 
        echo "OK $count $f tested\n"; 
        } 
                 
    echo "Kravatte oracle "; 
    $vectors = file_get_contents("$server/test_kravatte_oracle.py"); 
    $vectors = explode("def test_kravatte",$vectors); 
 
    foreach (array_slice($vectors,1) as $vector) 
        {     
        $type=explode('(',explode('random_oracle_',$vector)[1])[0]; 
 
        $zk            = xtrae("my_key",$vector);                 
        $zm            = xtrae("my_message",$vector);                 
        $real            = bin2hex(xtrae("real_output",$vector)); 
 
            $x->KravatteOracle($zm, $zk); 
     
            $index_ref = [[0, 1], [200, 202], [400, 404], [600, 608], [800, 816], [1000, 1032], 
                         [1200, 1264], [1400, 1528], [1600, 1856], [2000, 2512], [2600, 3624], 
                         [3800, 5848]]; 
     
            for ($h=0;$h<12;$h++) 
            { 
                $k   = 2**$h; 
                $res = $x->random($k); 
                [$start, $stop] = $index_ref[$h]; 
                $m   = substr($real,$start*2,$stop*2-$start*2); 
             
            if (($m != $res)) 
                die("$k Bad"); 
            }             
        } 
    echo "OK \n\n"; 
 
 |