x86[_64] assembly pack: add optimized AES-NI OCB subroutines.
Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
parent
2fb5535e64
commit
bd30091c97
@ -43,16 +43,20 @@
|
||||
# Add aesni_xts_[en|de]crypt. Westmere spends 1.50 cycles processing
|
||||
# one byte out of 8KB with 128-bit key, Sandy Bridge - 1.09.
|
||||
|
||||
# November 2015
|
||||
#
|
||||
# Add aesni_ocb_[en|de]crypt.
|
||||
|
||||
######################################################################
|
||||
# Current large-block performance in cycles per byte processed with
|
||||
# 128-bit key (less is better).
|
||||
#
|
||||
# CBC en-/decrypt CTR XTS ECB
|
||||
# CBC en-/decrypt CTR XTS ECB OCB
|
||||
# Westmere 3.77/1.37 1.37 1.52 1.27
|
||||
# * Bridge 5.07/0.98 0.99 1.09 0.91
|
||||
# Haswell 4.44/0.80 0.97 1.03 0.72
|
||||
# Silvermont 5.77/3.56 3.67 4.03 3.46
|
||||
# Bulldozer 5.80/0.98 1.05 1.24 0.93
|
||||
# * Bridge 5.07/0.98 0.99 1.09 0.91 1.10
|
||||
# Haswell 4.44/0.80 0.97 1.03 0.72 0.76
|
||||
# Silvermont 5.77/3.56 3.67 4.03 3.46 4.03
|
||||
# Bulldozer 5.80/0.98 1.05 1.24 0.93 1.23
|
||||
|
||||
$PREFIX="aesni"; # if $PREFIX is set to "AES", the script
|
||||
# generates drop-in replacement for
|
||||
@ -1831,6 +1835,877 @@ if ($PREFIX eq "aesni") {
|
||||
&mov ("esp",&DWP(16*7+4,"esp")); # restore %esp
|
||||
&function_end("aesni_xts_decrypt");
|
||||
}
|
||||
|
||||
######################################################################
|
||||
# void aesni_ocb_[en|de]crypt(const char *inp, char *out, size_t blocks,
|
||||
# const AES_KEY *key, unsigned int start_block_num,
|
||||
# unsigned char offset_i[16], const unsigned char L_[][16],
|
||||
# unsigned char checksum[16]);
|
||||
#
|
||||
{
|
||||
# offsets within stack frame
|
||||
my $checksum = 16*6;
|
||||
my ($key_off,$rounds_off,$out_off,$end_off,$esp_off)=map(16*7+4*$_,(0..4));
|
||||
|
||||
# reassigned registers
|
||||
my ($l_,$block,$i1,$i3,$i5) = ($rounds_,$key_,$rounds,$len,$out);
|
||||
# $l_, $blocks, $inp, $key are permanently allocated in registers;
|
||||
# remaining non-volatile ones are offloaded to stack, which even
|
||||
# stay invariant after written to stack.
|
||||
|
||||
&function_begin("aesni_ocb_encrypt");
|
||||
&mov ($rounds,&wparam(5)); # &offset_i
|
||||
&mov ($rounds_,&wparam(7)); # &checksum
|
||||
|
||||
&mov ($inp,&wparam(0));
|
||||
&mov ($out,&wparam(1));
|
||||
&mov ($len,&wparam(2));
|
||||
&mov ($key,&wparam(3));
|
||||
&movdqu ($rndkey0,&QWP(0,$rounds)); # load offset_i
|
||||
&mov ($block,&wparam(4)); # start_block_num
|
||||
&movdqu ($rndkey1,&QWP(0,$rounds_)); # load checksum
|
||||
&mov ($l_,&wparam(6)); # L_
|
||||
|
||||
&mov ($rounds,"esp");
|
||||
&sub ("esp",$esp_off+4); # alloca
|
||||
&and ("esp",-16); # align stack
|
||||
|
||||
&sub ($out,$inp);
|
||||
&shl ($len,4);
|
||||
&lea ($len,&DWP(-16*6,$inp,$len)); # end of input - 16*6
|
||||
&mov (&DWP($out_off,"esp"),$out);
|
||||
&mov (&DWP($end_off,"esp"),$len);
|
||||
&mov (&DWP($esp_off,"esp"),$rounds);
|
||||
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&test ($block,1);
|
||||
&jnz (&label("odd"));
|
||||
|
||||
&bsf ($i3,$block);
|
||||
&add ($block,1);
|
||||
&shl ($i3,4);
|
||||
&movdqu ($inout5,&QWP(0,$l_,$i3));
|
||||
&mov ($i3,$key); # put aside key
|
||||
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&lea ($inp,&DWP(16,$inp));
|
||||
|
||||
&pxor ($inout5,$rndkey0); # ^ last offset_i
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&pxor ($inout0,$inout5); # ^ offset_i
|
||||
|
||||
&movdqa ($inout4,$rndkey1);
|
||||
if ($inline)
|
||||
{ &aesni_inline_generate1("enc"); }
|
||||
else
|
||||
{ &call ("_aesni_encrypt1"); }
|
||||
|
||||
&xorps ($inout0,$inout5); # ^ offset_i
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&movdqa ($rndkey1,$inout4); # pass the checksum
|
||||
|
||||
&movups (&QWP(-16,$out,$inp),$inout0); # store output
|
||||
|
||||
&mov ($rounds,&DWP(240,$i3));
|
||||
&mov ($key,$i3); # restore key
|
||||
&mov ($len,&DWP($end_off,"esp"));
|
||||
|
||||
&set_label("odd");
|
||||
&shl ($rounds,4);
|
||||
&mov ($out,16);
|
||||
&sub ($out,$rounds); # twisted rounds
|
||||
&mov (&DWP($key_off,"esp"),$key);
|
||||
&lea ($key,&DWP(32,$key,$rounds)); # end of key schedule
|
||||
&mov (&DWP($rounds_off,"esp"),$out);
|
||||
|
||||
&cmp ($inp,$len);
|
||||
&ja (&label("short"));
|
||||
&jmp (&label("grandloop"));
|
||||
|
||||
&set_label("grandloop",32);
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&lea ($i3,&DWP(3,$block));
|
||||
&lea ($i5,&DWP(5,$block));
|
||||
&add ($block,6);
|
||||
&bsf ($i1,$i1);
|
||||
&bsf ($i3,$i3);
|
||||
&bsf ($i5,$i5);
|
||||
&shl ($i1,4);
|
||||
&shl ($i3,4);
|
||||
&shl ($i5,4);
|
||||
&movdqu ($inout0,&QWP(0,$l_));
|
||||
&movdqu ($inout1,&QWP(0,$l_,$i1));
|
||||
&mov ($rounds,&DWP($rounds_off,"esp"));
|
||||
&movdqa ($inout2,$inout0);
|
||||
&movdqu ($inout3,&QWP(0,$l_,$i3));
|
||||
&movdqa ($inout4,$inout0);
|
||||
&movdqu ($inout5,&QWP(0,$l_,$i5));
|
||||
|
||||
&pxor ($inout0,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout1,$inout0);
|
||||
&movdqa (&QWP(16*0,"esp"),$inout0);
|
||||
&pxor ($inout2,$inout1);
|
||||
&movdqa (&QWP(16*1,"esp"),$inout1);
|
||||
&pxor ($inout3,$inout2);
|
||||
&movdqa (&QWP(16*2,"esp"),$inout2);
|
||||
&pxor ($inout4,$inout3);
|
||||
&movdqa (&QWP(16*3,"esp"),$inout3);
|
||||
&pxor ($inout5,$inout4);
|
||||
&movdqa (&QWP(16*4,"esp"),$inout4);
|
||||
&movdqa (&QWP(16*5,"esp"),$inout5);
|
||||
|
||||
&$movekey ($rndkey0,&QWP(-48,$key,$rounds));
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&movdqu ($inout2,&QWP(16*2,$inp));
|
||||
&movdqu ($inout3,&QWP(16*3,$inp));
|
||||
&movdqu ($inout4,&QWP(16*4,$inp));
|
||||
&movdqu ($inout5,&QWP(16*5,$inp));
|
||||
&lea ($inp,&DWP(16*6,$inp));
|
||||
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&pxor ($inout0,$rndkey0); # ^ roundkey[0]
|
||||
&pxor ($rndkey1,$inout1);
|
||||
&pxor ($inout1,$rndkey0);
|
||||
&pxor ($rndkey1,$inout2);
|
||||
&pxor ($inout2,$rndkey0);
|
||||
&pxor ($rndkey1,$inout3);
|
||||
&pxor ($inout3,$rndkey0);
|
||||
&pxor ($rndkey1,$inout4);
|
||||
&pxor ($inout4,$rndkey0);
|
||||
&pxor ($rndkey1,$inout5);
|
||||
&pxor ($inout5,$rndkey0);
|
||||
&movdqa (&QWP($checksum,"esp"),$rndkey1);
|
||||
|
||||
&$movekey ($rndkey1,&QWP(-32,$key,$rounds));
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($inout2,&QWP(16*2,"esp"));
|
||||
&pxor ($inout3,&QWP(16*3,"esp"));
|
||||
&pxor ($inout4,&QWP(16*4,"esp"));
|
||||
&pxor ($inout5,&QWP(16*5,"esp"));
|
||||
|
||||
&$movekey ($rndkey0,&QWP(-16,$key,$rounds));
|
||||
&aesenc ($inout0,$rndkey1);
|
||||
&aesenc ($inout1,$rndkey1);
|
||||
&aesenc ($inout2,$rndkey1);
|
||||
&aesenc ($inout3,$rndkey1);
|
||||
&aesenc ($inout4,$rndkey1);
|
||||
&aesenc ($inout5,$rndkey1);
|
||||
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&mov ($len,&DWP($end_off,"esp"));
|
||||
&call ("_aesni_encrypt6_enter");
|
||||
|
||||
&movdqa ($rndkey0,&QWP(16*5,"esp")); # pass last offset_i
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($inout2,&QWP(16*2,"esp"));
|
||||
&pxor ($inout3,&QWP(16*3,"esp"));
|
||||
&pxor ($inout4,&QWP(16*4,"esp"));
|
||||
&pxor ($inout5,$rndkey0);
|
||||
&movdqa ($rndkey1,&QWP($checksum,"esp"));# pass the checksum
|
||||
|
||||
&movdqu (&QWP(-16*6,$out,$inp),$inout0);# store output
|
||||
&movdqu (&QWP(-16*5,$out,$inp),$inout1);
|
||||
&movdqu (&QWP(-16*4,$out,$inp),$inout2);
|
||||
&movdqu (&QWP(-16*3,$out,$inp),$inout3);
|
||||
&movdqu (&QWP(-16*2,$out,$inp),$inout4);
|
||||
&movdqu (&QWP(-16*1,$out,$inp),$inout5);
|
||||
&cmp ($inp,$len); # done yet?
|
||||
&jb (&label("grandloop"));
|
||||
|
||||
&set_label("short");
|
||||
&add ($len,16*6);
|
||||
&sub ($len,$inp);
|
||||
&jz (&label("done"));
|
||||
|
||||
&cmp ($len,16*2);
|
||||
&jb (&label("one"));
|
||||
&je (&label("two"));
|
||||
|
||||
&cmp ($len,16*4);
|
||||
&jb (&label("three"));
|
||||
&je (&label("four"));
|
||||
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&lea ($i3,&DWP(3,$block));
|
||||
&bsf ($i1,$i1);
|
||||
&bsf ($i3,$i3);
|
||||
&shl ($i1,4);
|
||||
&shl ($i3,4);
|
||||
&movdqu ($inout0,&QWP(0,$l_));
|
||||
&movdqu ($inout1,&QWP(0,$l_,$i1));
|
||||
&mov ($rounds,&DWP($rounds_off,"esp"));
|
||||
&movdqa ($inout2,$inout0);
|
||||
&movdqu ($inout3,&QWP(0,$l_,$i3));
|
||||
&movdqa ($inout4,$inout0);
|
||||
|
||||
&pxor ($inout0,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout1,$inout0);
|
||||
&movdqa (&QWP(16*0,"esp"),$inout0);
|
||||
&pxor ($inout2,$inout1);
|
||||
&movdqa (&QWP(16*1,"esp"),$inout1);
|
||||
&pxor ($inout3,$inout2);
|
||||
&movdqa (&QWP(16*2,"esp"),$inout2);
|
||||
&pxor ($inout4,$inout3);
|
||||
&movdqa (&QWP(16*3,"esp"),$inout3);
|
||||
&pxor ($inout5,$inout4);
|
||||
&movdqa (&QWP(16*4,"esp"),$inout4);
|
||||
|
||||
&$movekey ($rndkey0,&QWP(-48,$key,$rounds));
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&movdqu ($inout2,&QWP(16*2,$inp));
|
||||
&movdqu ($inout3,&QWP(16*3,$inp));
|
||||
&movdqu ($inout4,&QWP(16*4,$inp));
|
||||
&pxor ($inout5,$inout5);
|
||||
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&pxor ($inout0,$rndkey0); # ^ roundkey[0]
|
||||
&pxor ($rndkey1,$inout1);
|
||||
&pxor ($inout1,$rndkey0);
|
||||
&pxor ($rndkey1,$inout2);
|
||||
&pxor ($inout2,$rndkey0);
|
||||
&pxor ($rndkey1,$inout3);
|
||||
&pxor ($inout3,$rndkey0);
|
||||
&pxor ($rndkey1,$inout4);
|
||||
&pxor ($inout4,$rndkey0);
|
||||
&movdqa (&QWP($checksum,"esp"),$rndkey1);
|
||||
|
||||
&$movekey ($rndkey1,&QWP(-32,$key,$rounds));
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($inout2,&QWP(16*2,"esp"));
|
||||
&pxor ($inout3,&QWP(16*3,"esp"));
|
||||
&pxor ($inout4,&QWP(16*4,"esp"));
|
||||
|
||||
&$movekey ($rndkey0,&QWP(-16,$key,$rounds));
|
||||
&aesenc ($inout0,$rndkey1);
|
||||
&aesenc ($inout1,$rndkey1);
|
||||
&aesenc ($inout2,$rndkey1);
|
||||
&aesenc ($inout3,$rndkey1);
|
||||
&aesenc ($inout4,$rndkey1);
|
||||
&aesenc ($inout5,$rndkey1);
|
||||
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&call ("_aesni_encrypt6_enter");
|
||||
|
||||
&movdqa ($rndkey0,&QWP(16*4,"esp")); # pass last offset_i
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($inout2,&QWP(16*2,"esp"));
|
||||
&pxor ($inout3,&QWP(16*3,"esp"));
|
||||
&pxor ($inout4,$rndkey0);
|
||||
&movdqa ($rndkey1,&QWP($checksum,"esp"));# pass the checksum
|
||||
|
||||
&movdqu (&QWP(16*0,$out,$inp),$inout0); # store output
|
||||
&movdqu (&QWP(16*1,$out,$inp),$inout1);
|
||||
&movdqu (&QWP(16*2,$out,$inp),$inout2);
|
||||
&movdqu (&QWP(16*3,$out,$inp),$inout3);
|
||||
&movdqu (&QWP(16*4,$out,$inp),$inout4);
|
||||
|
||||
&jmp (&label("done"));
|
||||
|
||||
&set_label("one",16);
|
||||
&movdqu ($inout5,&QWP(0,$l_));
|
||||
&mov ($key,&DWP($key_off,"esp")); # restore key
|
||||
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&pxor ($inout5,$rndkey0); # ^ last offset_i
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&pxor ($inout0,$inout5); # ^ offset_i
|
||||
|
||||
&movdqa ($inout4,$rndkey1);
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
if ($inline)
|
||||
{ &aesni_inline_generate1("enc"); }
|
||||
else
|
||||
{ &call ("_aesni_encrypt1"); }
|
||||
|
||||
&xorps ($inout0,$inout5); # ^ offset_i
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&movdqa ($rndkey1,$inout4); # pass the checksum
|
||||
&movups (&QWP(0,$out,$inp),$inout0);
|
||||
|
||||
&jmp (&label("done"));
|
||||
|
||||
&set_label("two",16);
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&mov ($key,&DWP($key_off,"esp")); # restore key
|
||||
&bsf ($i1,$i1);
|
||||
&shl ($i1,4);
|
||||
&movdqu ($inout4,&QWP(0,$l_));
|
||||
&movdqu ($inout5,&QWP(0,$l_,$i1));
|
||||
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&pxor ($inout4,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout5,$inout4);
|
||||
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&pxor ($inout0,$inout4); # ^ offset_i
|
||||
&pxor ($rndkey1,$inout1);
|
||||
&pxor ($inout1,$inout5);
|
||||
|
||||
&movdqa ($inout3,$rndkey1)
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&call ("_aesni_encrypt2");
|
||||
|
||||
&xorps ($inout0,$inout4); # ^ offset_i
|
||||
&xorps ($inout1,$inout5);
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&movdqa ($rndkey1,$inout3); # pass the checksum
|
||||
&movups (&QWP(16*0,$out,$inp),$inout0); # store output
|
||||
&movups (&QWP(16*1,$out,$inp),$inout1);
|
||||
|
||||
&jmp (&label("done"));
|
||||
|
||||
&set_label("three",16);
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&mov ($key,&DWP($key_off,"esp")); # restore key
|
||||
&bsf ($i1,$i1);
|
||||
&shl ($i1,4);
|
||||
&movdqu ($inout3,&QWP(0,$l_));
|
||||
&movdqu ($inout4,&QWP(0,$l_,$i1));
|
||||
&movdqa ($inout5,$inout3);
|
||||
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&movdqu ($inout2,&QWP(16*2,$inp));
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&pxor ($inout3,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout4,$inout3);
|
||||
&pxor ($inout5,$inout4);
|
||||
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&pxor ($inout0,$inout3); # ^ offset_i
|
||||
&pxor ($rndkey1,$inout1);
|
||||
&pxor ($inout1,$inout4);
|
||||
&pxor ($rndkey1,$inout2);
|
||||
&pxor ($inout2,$inout5);
|
||||
|
||||
&movdqa (&QWP($checksum,"esp"),$rndkey1);
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&call ("_aesni_encrypt3");
|
||||
|
||||
&xorps ($inout0,$inout3); # ^ offset_i
|
||||
&xorps ($inout1,$inout4);
|
||||
&xorps ($inout2,$inout5);
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&movdqa ($rndkey1,&QWP($checksum,"esp"));# pass the checksum
|
||||
&movups (&QWP(16*0,$out,$inp),$inout0); # store output
|
||||
&movups (&QWP(16*1,$out,$inp),$inout1);
|
||||
&movups (&QWP(16*2,$out,$inp),$inout2);
|
||||
|
||||
&jmp (&label("done"));
|
||||
|
||||
&set_label("four",16);
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&lea ($i3,&DWP(3,$block));
|
||||
&bsf ($i1,$i1);
|
||||
&bsf ($i3,$i3);
|
||||
&mov ($key,&DWP($key_off,"esp")); # restore key
|
||||
&shl ($i1,4);
|
||||
&shl ($i3,4);
|
||||
&movdqu ($inout2,&QWP(0,$l_));
|
||||
&movdqu ($inout3,&QWP(0,$l_,$i1));
|
||||
&movdqa ($inout4,$inout2);
|
||||
&movdqu ($inout5,&QWP(0,$l_,$i3));
|
||||
|
||||
&pxor ($inout2,$rndkey0); # ^ last offset_i
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&pxor ($inout3,$inout2);
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&pxor ($inout4,$inout3);
|
||||
&movdqa (&QWP(16*0,"esp"),$inout2);
|
||||
&pxor ($inout5,$inout4);
|
||||
&movdqa (&QWP(16*1,"esp"),$inout3);
|
||||
&movdqu ($inout2,&QWP(16*2,$inp));
|
||||
&movdqu ($inout3,&QWP(16*3,$inp));
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&pxor ($rndkey1,$inout1);
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($rndkey1,$inout2);
|
||||
&pxor ($inout2,$inout4);
|
||||
&pxor ($rndkey1,$inout3);
|
||||
&pxor ($inout3,$inout5);
|
||||
|
||||
&movdqa (&QWP($checksum,"esp"),$rndkey1)
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&call ("_aesni_encrypt4");
|
||||
|
||||
&xorps ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&xorps ($inout1,&QWP(16*1,"esp"));
|
||||
&xorps ($inout2,$inout4);
|
||||
&movups (&QWP(16*0,$out,$inp),$inout0); # store output
|
||||
&xorps ($inout3,$inout5);
|
||||
&movups (&QWP(16*1,$out,$inp),$inout1);
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&movups (&QWP(16*2,$out,$inp),$inout2);
|
||||
&movdqa ($rndkey1,&QWP($checksum,"esp"));# pass the checksum
|
||||
&movups (&QWP(16*3,$out,$inp),$inout3);
|
||||
|
||||
&set_label("done");
|
||||
&mov ($key,&DWP($esp_off,"esp"));
|
||||
&pxor ($inout0,$inout0); # clear register bank
|
||||
&pxor ($inout1,$inout1);
|
||||
&movdqa (&QWP(16*0,"esp"),$inout0); # clear stack
|
||||
&pxor ($inout2,$inout2);
|
||||
&movdqa (&QWP(16*1,"esp"),$inout0);
|
||||
&pxor ($inout3,$inout3);
|
||||
&movdqa (&QWP(16*2,"esp"),$inout0);
|
||||
&pxor ($inout4,$inout4);
|
||||
&movdqa (&QWP(16*3,"esp"),$inout0);
|
||||
&pxor ($inout5,$inout5);
|
||||
&movdqa (&QWP(16*4,"esp"),$inout0);
|
||||
&movdqa (&QWP(16*5,"esp"),$inout0);
|
||||
&movdqa (&QWP(16*6,"esp"),$inout0);
|
||||
|
||||
&lea ("esp",&DWP(0,$key));
|
||||
&mov ($rounds,&wparam(5)); # &offset_i
|
||||
&mov ($rounds_,&wparam(7)); # &checksum
|
||||
&movdqu (&QWP(0,$rounds),$rndkey0);
|
||||
&pxor ($rndkey0,$rndkey0);
|
||||
&movdqu (&QWP(0,$rounds_),$rndkey1);
|
||||
&pxor ($rndkey1,$rndkey1);
|
||||
&function_end("aesni_ocb_encrypt");
|
||||
|
||||
&function_begin("aesni_ocb_decrypt");
|
||||
&mov ($rounds,&wparam(5)); # &offset_i
|
||||
&mov ($rounds_,&wparam(7)); # &checksum
|
||||
|
||||
&mov ($inp,&wparam(0));
|
||||
&mov ($out,&wparam(1));
|
||||
&mov ($len,&wparam(2));
|
||||
&mov ($key,&wparam(3));
|
||||
&movdqu ($rndkey0,&QWP(0,$rounds)); # load offset_i
|
||||
&mov ($block,&wparam(4)); # start_block_num
|
||||
&movdqu ($rndkey1,&QWP(0,$rounds_)); # load checksum
|
||||
&mov ($l_,&wparam(6)); # L_
|
||||
|
||||
&mov ($rounds,"esp");
|
||||
&sub ("esp",$esp_off+4); # alloca
|
||||
&and ("esp",-16); # align stack
|
||||
|
||||
&sub ($out,$inp);
|
||||
&shl ($len,4);
|
||||
&lea ($len,&DWP(-16*6,$inp,$len)); # end of input - 16*6
|
||||
&mov (&DWP($out_off,"esp"),$out);
|
||||
&mov (&DWP($end_off,"esp"),$len);
|
||||
&mov (&DWP($esp_off,"esp"),$rounds);
|
||||
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&test ($block,1);
|
||||
&jnz (&label("odd"));
|
||||
|
||||
&bsf ($i3,$block);
|
||||
&add ($block,1);
|
||||
&shl ($i3,4);
|
||||
&movdqu ($inout5,&QWP(0,$l_,$i3));
|
||||
&mov ($i3,$key); # put aside key
|
||||
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&lea ($inp,&DWP(16,$inp));
|
||||
|
||||
&pxor ($inout5,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout0,$inout5); # ^ offset_i
|
||||
|
||||
&movdqa ($inout4,$rndkey1);
|
||||
if ($inline)
|
||||
{ &aesni_inline_generate1("dec"); }
|
||||
else
|
||||
{ &call ("_aesni_decrypt1"); }
|
||||
|
||||
&xorps ($inout0,$inout5); # ^ offset_i
|
||||
&movaps ($rndkey1,$inout4); # pass the checksum
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&xorps ($rndkey1,$inout0); # checksum
|
||||
&movups (&QWP(-16,$out,$inp),$inout0); # store output
|
||||
|
||||
&mov ($rounds,&DWP(240,$i3));
|
||||
&mov ($key,$i3); # restore key
|
||||
&mov ($len,&DWP($end_off,"esp"));
|
||||
|
||||
&set_label("odd");
|
||||
&shl ($rounds,4);
|
||||
&mov ($out,16);
|
||||
&sub ($out,$rounds); # twisted rounds
|
||||
&mov (&DWP($key_off,"esp"),$key);
|
||||
&lea ($key,&DWP(32,$key,$rounds)); # end of key schedule
|
||||
&mov (&DWP($rounds_off,"esp"),$out);
|
||||
|
||||
&cmp ($inp,$len);
|
||||
&ja (&label("short"));
|
||||
&jmp (&label("grandloop"));
|
||||
|
||||
&set_label("grandloop",32);
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&lea ($i3,&DWP(3,$block));
|
||||
&lea ($i5,&DWP(5,$block));
|
||||
&add ($block,6);
|
||||
&bsf ($i1,$i1);
|
||||
&bsf ($i3,$i3);
|
||||
&bsf ($i5,$i5);
|
||||
&shl ($i1,4);
|
||||
&shl ($i3,4);
|
||||
&shl ($i5,4);
|
||||
&movdqu ($inout0,&QWP(0,$l_));
|
||||
&movdqu ($inout1,&QWP(0,$l_,$i1));
|
||||
&mov ($rounds,&DWP($rounds_off,"esp"));
|
||||
&movdqa ($inout2,$inout0);
|
||||
&movdqu ($inout3,&QWP(0,$l_,$i3));
|
||||
&movdqa ($inout4,$inout0);
|
||||
&movdqu ($inout5,&QWP(0,$l_,$i5));
|
||||
|
||||
&pxor ($inout0,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout1,$inout0);
|
||||
&movdqa (&QWP(16*0,"esp"),$inout0);
|
||||
&pxor ($inout2,$inout1);
|
||||
&movdqa (&QWP(16*1,"esp"),$inout1);
|
||||
&pxor ($inout3,$inout2);
|
||||
&movdqa (&QWP(16*2,"esp"),$inout2);
|
||||
&pxor ($inout4,$inout3);
|
||||
&movdqa (&QWP(16*3,"esp"),$inout3);
|
||||
&pxor ($inout5,$inout4);
|
||||
&movdqa (&QWP(16*4,"esp"),$inout4);
|
||||
&movdqa (&QWP(16*5,"esp"),$inout5);
|
||||
|
||||
&$movekey ($rndkey0,&QWP(-48,$key,$rounds));
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&movdqu ($inout2,&QWP(16*2,$inp));
|
||||
&movdqu ($inout3,&QWP(16*3,$inp));
|
||||
&movdqu ($inout4,&QWP(16*4,$inp));
|
||||
&movdqu ($inout5,&QWP(16*5,$inp));
|
||||
&lea ($inp,&DWP(16*6,$inp));
|
||||
|
||||
&movdqa (&QWP($checksum,"esp"),$rndkey1);
|
||||
&pxor ($inout0,$rndkey0); # ^ roundkey[0]
|
||||
&pxor ($inout1,$rndkey0);
|
||||
&pxor ($inout2,$rndkey0);
|
||||
&pxor ($inout3,$rndkey0);
|
||||
&pxor ($inout4,$rndkey0);
|
||||
&pxor ($inout5,$rndkey0);
|
||||
|
||||
&$movekey ($rndkey1,&QWP(-32,$key,$rounds));
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($inout2,&QWP(16*2,"esp"));
|
||||
&pxor ($inout3,&QWP(16*3,"esp"));
|
||||
&pxor ($inout4,&QWP(16*4,"esp"));
|
||||
&pxor ($inout5,&QWP(16*5,"esp"));
|
||||
|
||||
&$movekey ($rndkey0,&QWP(-16,$key,$rounds));
|
||||
&aesdec ($inout0,$rndkey1);
|
||||
&aesdec ($inout1,$rndkey1);
|
||||
&aesdec ($inout2,$rndkey1);
|
||||
&aesdec ($inout3,$rndkey1);
|
||||
&aesdec ($inout4,$rndkey1);
|
||||
&aesdec ($inout5,$rndkey1);
|
||||
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&mov ($len,&DWP($end_off,"esp"));
|
||||
&call ("_aesni_decrypt6_enter");
|
||||
|
||||
&movdqa ($rndkey0,&QWP(16*5,"esp")); # pass last offset_i
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&movdqa ($rndkey1,&QWP($checksum,"esp"));
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($inout2,&QWP(16*2,"esp"));
|
||||
&pxor ($inout3,&QWP(16*3,"esp"));
|
||||
&pxor ($inout4,&QWP(16*4,"esp"));
|
||||
&pxor ($inout5,$rndkey0);
|
||||
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&movdqu (&QWP(-16*6,$out,$inp),$inout0);# store output
|
||||
&pxor ($rndkey1,$inout1);
|
||||
&movdqu (&QWP(-16*5,$out,$inp),$inout1);
|
||||
&pxor ($rndkey1,$inout2);
|
||||
&movdqu (&QWP(-16*4,$out,$inp),$inout2);
|
||||
&pxor ($rndkey1,$inout3);
|
||||
&movdqu (&QWP(-16*3,$out,$inp),$inout3);
|
||||
&pxor ($rndkey1,$inout4);
|
||||
&movdqu (&QWP(-16*2,$out,$inp),$inout4);
|
||||
&pxor ($rndkey1,$inout5);
|
||||
&movdqu (&QWP(-16*1,$out,$inp),$inout5);
|
||||
&cmp ($inp,$len); # done yet?
|
||||
&jb (&label("grandloop"));
|
||||
|
||||
&set_label("short");
|
||||
&add ($len,16*6);
|
||||
&sub ($len,$inp);
|
||||
&jz (&label("done"));
|
||||
|
||||
&cmp ($len,16*2);
|
||||
&jb (&label("one"));
|
||||
&je (&label("two"));
|
||||
|
||||
&cmp ($len,16*4);
|
||||
&jb (&label("three"));
|
||||
&je (&label("four"));
|
||||
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&lea ($i3,&DWP(3,$block));
|
||||
&bsf ($i1,$i1);
|
||||
&bsf ($i3,$i3);
|
||||
&shl ($i1,4);
|
||||
&shl ($i3,4);
|
||||
&movdqu ($inout0,&QWP(0,$l_));
|
||||
&movdqu ($inout1,&QWP(0,$l_,$i1));
|
||||
&mov ($rounds,&DWP($rounds_off,"esp"));
|
||||
&movdqa ($inout2,$inout0);
|
||||
&movdqu ($inout3,&QWP(0,$l_,$i3));
|
||||
&movdqa ($inout4,$inout0);
|
||||
|
||||
&pxor ($inout0,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout1,$inout0);
|
||||
&movdqa (&QWP(16*0,"esp"),$inout0);
|
||||
&pxor ($inout2,$inout1);
|
||||
&movdqa (&QWP(16*1,"esp"),$inout1);
|
||||
&pxor ($inout3,$inout2);
|
||||
&movdqa (&QWP(16*2,"esp"),$inout2);
|
||||
&pxor ($inout4,$inout3);
|
||||
&movdqa (&QWP(16*3,"esp"),$inout3);
|
||||
&pxor ($inout5,$inout4);
|
||||
&movdqa (&QWP(16*4,"esp"),$inout4);
|
||||
|
||||
&$movekey ($rndkey0,&QWP(-48,$key,$rounds));
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&movdqu ($inout2,&QWP(16*2,$inp));
|
||||
&movdqu ($inout3,&QWP(16*3,$inp));
|
||||
&movdqu ($inout4,&QWP(16*4,$inp));
|
||||
&pxor ($inout5,$inout5);
|
||||
|
||||
&movdqa (&QWP($checksum,"esp"),$rndkey1);
|
||||
&pxor ($inout0,$rndkey0); # ^ roundkey[0]
|
||||
&pxor ($inout1,$rndkey0);
|
||||
&pxor ($inout2,$rndkey0);
|
||||
&pxor ($inout3,$rndkey0);
|
||||
&pxor ($inout4,$rndkey0);
|
||||
|
||||
&$movekey ($rndkey1,&QWP(-32,$key,$rounds));
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($inout2,&QWP(16*2,"esp"));
|
||||
&pxor ($inout3,&QWP(16*3,"esp"));
|
||||
&pxor ($inout4,&QWP(16*4,"esp"));
|
||||
|
||||
&$movekey ($rndkey0,&QWP(-16,$key,$rounds));
|
||||
&aesdec ($inout0,$rndkey1);
|
||||
&aesdec ($inout1,$rndkey1);
|
||||
&aesdec ($inout2,$rndkey1);
|
||||
&aesdec ($inout3,$rndkey1);
|
||||
&aesdec ($inout4,$rndkey1);
|
||||
&aesdec ($inout5,$rndkey1);
|
||||
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&call ("_aesni_decrypt6_enter");
|
||||
|
||||
&movdqa ($rndkey0,&QWP(16*4,"esp")); # pass last offset_i
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&movdqa ($rndkey1,&QWP($checksum,"esp"));
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($inout2,&QWP(16*2,"esp"));
|
||||
&pxor ($inout3,&QWP(16*3,"esp"));
|
||||
&pxor ($inout4,$rndkey0);
|
||||
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&movdqu (&QWP(16*0,$out,$inp),$inout0); # store output
|
||||
&pxor ($rndkey1,$inout1);
|
||||
&movdqu (&QWP(16*1,$out,$inp),$inout1);
|
||||
&pxor ($rndkey1,$inout2);
|
||||
&movdqu (&QWP(16*2,$out,$inp),$inout2);
|
||||
&pxor ($rndkey1,$inout3);
|
||||
&movdqu (&QWP(16*3,$out,$inp),$inout3);
|
||||
&pxor ($rndkey1,$inout4);
|
||||
&movdqu (&QWP(16*4,$out,$inp),$inout4);
|
||||
|
||||
&jmp (&label("done"));
|
||||
|
||||
&set_label("one",16);
|
||||
&movdqu ($inout5,&QWP(0,$l_));
|
||||
&mov ($key,&DWP($key_off,"esp")); # restore key
|
||||
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&pxor ($inout5,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout0,$inout5); # ^ offset_i
|
||||
|
||||
&movdqa ($inout4,$rndkey1);
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
if ($inline)
|
||||
{ &aesni_inline_generate1("dec"); }
|
||||
else
|
||||
{ &call ("_aesni_decrypt1"); }
|
||||
|
||||
&xorps ($inout0,$inout5); # ^ offset_i
|
||||
&movaps ($rndkey1,$inout4); # pass the checksum
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&xorps ($rndkey1,$inout0); # checksum
|
||||
&movups (&QWP(0,$out,$inp),$inout0);
|
||||
|
||||
&jmp (&label("done"));
|
||||
|
||||
&set_label("two",16);
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&mov ($key,&DWP($key_off,"esp")); # restore key
|
||||
&bsf ($i1,$i1);
|
||||
&shl ($i1,4);
|
||||
&movdqu ($inout4,&QWP(0,$l_));
|
||||
&movdqu ($inout5,&QWP(0,$l_,$i1));
|
||||
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&movdqa ($inout3,$rndkey1);
|
||||
&pxor ($inout4,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout5,$inout4);
|
||||
|
||||
&pxor ($inout0,$inout4); # ^ offset_i
|
||||
&pxor ($inout1,$inout5);
|
||||
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&call ("_aesni_decrypt2");
|
||||
|
||||
&xorps ($inout0,$inout4); # ^ offset_i
|
||||
&xorps ($inout1,$inout5);
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&xorps ($inout3,$inout0); # checksum
|
||||
&movups (&QWP(16*0,$out,$inp),$inout0); # store output
|
||||
&xorps ($inout3,$inout1);
|
||||
&movups (&QWP(16*1,$out,$inp),$inout1);
|
||||
&movaps ($rndkey1,$inout3); # pass the checksum
|
||||
|
||||
&jmp (&label("done"));
|
||||
|
||||
&set_label("three",16);
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&mov ($key,&DWP($key_off,"esp")); # restore key
|
||||
&bsf ($i1,$i1);
|
||||
&shl ($i1,4);
|
||||
&movdqu ($inout3,&QWP(0,$l_));
|
||||
&movdqu ($inout4,&QWP(0,$l_,$i1));
|
||||
&movdqa ($inout5,$inout3);
|
||||
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&movdqu ($inout2,&QWP(16*2,$inp));
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&movdqa (&QWP($checksum,"esp"),$rndkey1);
|
||||
&pxor ($inout3,$rndkey0); # ^ last offset_i
|
||||
&pxor ($inout4,$inout3);
|
||||
&pxor ($inout5,$inout4);
|
||||
|
||||
&pxor ($inout0,$inout3); # ^ offset_i
|
||||
&pxor ($inout1,$inout4);
|
||||
&pxor ($inout2,$inout5);
|
||||
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&call ("_aesni_decrypt3");
|
||||
|
||||
&movdqa ($rndkey1,&QWP($checksum,"esp"));# pass the checksum
|
||||
&xorps ($inout0,$inout3); # ^ offset_i
|
||||
&xorps ($inout1,$inout4);
|
||||
&xorps ($inout2,$inout5);
|
||||
&movups (&QWP(16*0,$out,$inp),$inout0); # store output
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&movups (&QWP(16*1,$out,$inp),$inout1);
|
||||
&pxor ($rndkey1,$inout1);
|
||||
&movups (&QWP(16*2,$out,$inp),$inout2);
|
||||
&pxor ($rndkey1,$inout2);
|
||||
|
||||
&jmp (&label("done"));
|
||||
|
||||
&set_label("four",16);
|
||||
&lea ($i1,&DWP(1,$block));
|
||||
&lea ($i3,&DWP(3,$block));
|
||||
&bsf ($i1,$i1);
|
||||
&bsf ($i3,$i3);
|
||||
&mov ($key,&DWP($key_off,"esp")); # restore key
|
||||
&shl ($i1,4);
|
||||
&shl ($i3,4);
|
||||
&movdqu ($inout2,&QWP(0,$l_));
|
||||
&movdqu ($inout3,&QWP(0,$l_,$i1));
|
||||
&movdqa ($inout4,$inout2);
|
||||
&movdqu ($inout5,&QWP(0,$l_,$i3));
|
||||
|
||||
&pxor ($inout2,$rndkey0); # ^ last offset_i
|
||||
&movdqu ($inout0,&QWP(16*0,$inp)); # load input
|
||||
&pxor ($inout3,$inout2);
|
||||
&movdqu ($inout1,&QWP(16*1,$inp));
|
||||
&pxor ($inout4,$inout3);
|
||||
&movdqa (&QWP(16*0,"esp"),$inout2);
|
||||
&pxor ($inout5,$inout4);
|
||||
&movdqa (&QWP(16*1,"esp"),$inout3);
|
||||
&movdqu ($inout2,&QWP(16*2,$inp));
|
||||
&movdqu ($inout3,&QWP(16*3,$inp));
|
||||
&mov ($rounds,&DWP(240,$key));
|
||||
|
||||
&movdqa (&QWP($checksum,"esp"),$rndkey1);
|
||||
&pxor ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&pxor ($inout1,&QWP(16*1,"esp"));
|
||||
&pxor ($inout2,$inout4);
|
||||
&pxor ($inout3,$inout5);
|
||||
|
||||
&mov ($out,&DWP($out_off,"esp"));
|
||||
&call ("_aesni_decrypt4");
|
||||
|
||||
&movdqa ($rndkey1,&QWP($checksum,"esp"));# pass the checksum
|
||||
&xorps ($inout0,&QWP(16*0,"esp")); # ^ offset_i
|
||||
&xorps ($inout1,&QWP(16*1,"esp"));
|
||||
&xorps ($inout2,$inout4);
|
||||
&movups (&QWP(16*0,$out,$inp),$inout0); # store output
|
||||
&pxor ($rndkey1,$inout0); # checksum
|
||||
&xorps ($inout3,$inout5);
|
||||
&movups (&QWP(16*1,$out,$inp),$inout1);
|
||||
&pxor ($rndkey1,$inout1);
|
||||
&movdqa ($rndkey0,$inout5); # pass last offset_i
|
||||
&movups (&QWP(16*2,$out,$inp),$inout2);
|
||||
&pxor ($rndkey1,$inout2);
|
||||
&movups (&QWP(16*3,$out,$inp),$inout3);
|
||||
&pxor ($rndkey1,$inout3);
|
||||
|
||||
&set_label("done");
|
||||
&mov ($key,&DWP($esp_off,"esp"));
|
||||
&pxor ($inout0,$inout0); # clear register bank
|
||||
&pxor ($inout1,$inout1);
|
||||
&movdqa (&QWP(16*0,"esp"),$inout0); # clear stack
|
||||
&pxor ($inout2,$inout2);
|
||||
&movdqa (&QWP(16*1,"esp"),$inout0);
|
||||
&pxor ($inout3,$inout3);
|
||||
&movdqa (&QWP(16*2,"esp"),$inout0);
|
||||
&pxor ($inout4,$inout4);
|
||||
&movdqa (&QWP(16*3,"esp"),$inout0);
|
||||
&pxor ($inout5,$inout5);
|
||||
&movdqa (&QWP(16*4,"esp"),$inout0);
|
||||
&movdqa (&QWP(16*5,"esp"),$inout0);
|
||||
&movdqa (&QWP(16*6,"esp"),$inout0);
|
||||
|
||||
&lea ("esp",&DWP(0,$key));
|
||||
&mov ($rounds,&wparam(5)); # &offset_i
|
||||
&mov ($rounds_,&wparam(7)); # &checksum
|
||||
&movdqu (&QWP(0,$rounds),$rndkey0);
|
||||
&pxor ($rndkey0,$rndkey0);
|
||||
&movdqu (&QWP(0,$rounds_),$rndkey1);
|
||||
&pxor ($rndkey1,$rndkey1);
|
||||
&function_end("aesni_ocb_decrypt");
|
||||
}
|
||||
}
|
||||
|
||||
######################################################################
|
||||
@ -2419,7 +3294,7 @@ if ($PREFIX eq "aesni") {
|
||||
&pxor ("xmm3","xmm3");
|
||||
&aesenclast ("xmm2","xmm3");
|
||||
|
||||
&movdqa ("xmm3","xmm1")
|
||||
&movdqa ("xmm3","xmm1");
|
||||
&pslldq ("xmm1",4);
|
||||
&pxor ("xmm3","xmm1");
|
||||
&pslldq ("xmm1",4);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -461,6 +461,19 @@ static int aesni_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
|
||||
const unsigned char *in, size_t len);
|
||||
|
||||
# ifndef OPENSSL_NO_OCB
|
||||
void aesni_ocb_encrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t blocks, const void *key,
|
||||
size_t start_block_num,
|
||||
unsigned char offset_i[16],
|
||||
const unsigned char L_[][16],
|
||||
unsigned char checksum[16]);
|
||||
void aesni_ocb_decrypt(const unsigned char *in, unsigned char *out,
|
||||
size_t blocks, const void *key,
|
||||
size_t start_block_num,
|
||||
unsigned char offset_i[16],
|
||||
const unsigned char L_[][16],
|
||||
unsigned char checksum[16]);
|
||||
|
||||
static int aesni_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
|
||||
const unsigned char *iv, int enc)
|
||||
{
|
||||
@ -479,7 +492,9 @@ static int aesni_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
|
||||
if (!CRYPTO_ocb128_init(&octx->ocb,
|
||||
&octx->ksenc.ks, &octx->ksdec.ks,
|
||||
(block128_f) aesni_encrypt,
|
||||
(block128_f) aesni_decrypt))
|
||||
(block128_f) aesni_decrypt,
|
||||
enc ? aesni_ocb_encrypt
|
||||
: aesni_ocb_decrypt))
|
||||
return 0;
|
||||
}
|
||||
while (0);
|
||||
@ -2348,7 +2363,8 @@ static int aes_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
|
||||
if (!CRYPTO_ocb128_init(&octx->ocb,
|
||||
&octx->ksenc.ks, &octx->ksdec.ks,
|
||||
(block128_f) vpaes_encrypt,
|
||||
(block128_f) vpaes_decrypt))
|
||||
(block128_f) vpaes_decrypt,
|
||||
NULL))
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
@ -2358,7 +2374,8 @@ static int aes_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
|
||||
if (!CRYPTO_ocb128_init(&octx->ocb,
|
||||
&octx->ksenc.ks, &octx->ksdec.ks,
|
||||
(block128_f) AES_encrypt,
|
||||
(block128_f) AES_decrypt))
|
||||
(block128_f) AES_decrypt,
|
||||
NULL))
|
||||
return 0;
|
||||
}
|
||||
while (0);
|
||||
|
@ -164,6 +164,7 @@ struct ocb128_context {
|
||||
block128_f decrypt;
|
||||
void *keyenc;
|
||||
void *keydec;
|
||||
ocb128_f stream; /* direction dependent */
|
||||
/* Key dependent variables. Can be reused if key remains the same */
|
||||
size_t l_index;
|
||||
size_t max_l_index;
|
||||
|
@ -159,7 +159,7 @@ static OCB_BLOCK *ocb_lookup_l(OCB128_CONTEXT *ctx, size_t idx)
|
||||
ctx->max_l_index += (idx - ctx->max_l_index + 4) & ~3;
|
||||
ctx->l =
|
||||
OPENSSL_realloc(ctx->l, ctx->max_l_index * sizeof(OCB_BLOCK));
|
||||
if (!ctx->l)
|
||||
if (ctx->l == NULL)
|
||||
return NULL;
|
||||
}
|
||||
while (l_index < idx) {
|
||||
@ -171,35 +171,19 @@ static OCB_BLOCK *ocb_lookup_l(OCB128_CONTEXT *ctx, size_t idx)
|
||||
return ctx->l + idx;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encrypt a block from |in| and store the result in |out|
|
||||
*/
|
||||
static void ocb_encrypt(OCB128_CONTEXT *ctx, OCB_BLOCK *in, OCB_BLOCK *out,
|
||||
void *keyenc)
|
||||
{
|
||||
ctx->encrypt(in->c, out->c, keyenc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decrypt a block from |in| and store the result in |out|
|
||||
*/
|
||||
static void ocb_decrypt(OCB128_CONTEXT *ctx, OCB_BLOCK *in, OCB_BLOCK *out,
|
||||
void *keydec)
|
||||
{
|
||||
ctx->decrypt(in->c, out->c, keydec);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a new OCB128_CONTEXT
|
||||
*/
|
||||
OCB128_CONTEXT *CRYPTO_ocb128_new(void *keyenc, void *keydec,
|
||||
block128_f encrypt, block128_f decrypt)
|
||||
block128_f encrypt, block128_f decrypt,
|
||||
ocb128_f stream)
|
||||
{
|
||||
OCB128_CONTEXT *octx;
|
||||
int ret;
|
||||
|
||||
if ((octx = OPENSSL_malloc(sizeof(*octx))) != NULL) {
|
||||
ret = CRYPTO_ocb128_init(octx, keyenc, keydec, encrypt, decrypt);
|
||||
ret = CRYPTO_ocb128_init(octx, keyenc, keydec, encrypt, decrypt,
|
||||
stream);
|
||||
if (ret)
|
||||
return octx;
|
||||
OPENSSL_free(octx);
|
||||
@ -212,7 +196,8 @@ OCB128_CONTEXT *CRYPTO_ocb128_new(void *keyenc, void *keydec,
|
||||
* Initialise an existing OCB128_CONTEXT
|
||||
*/
|
||||
int CRYPTO_ocb128_init(OCB128_CONTEXT *ctx, void *keyenc, void *keydec,
|
||||
block128_f encrypt, block128_f decrypt)
|
||||
block128_f encrypt, block128_f decrypt,
|
||||
ocb128_f stream)
|
||||
{
|
||||
memset(ctx, 0, sizeof(*ctx));
|
||||
ctx->l_index = 0;
|
||||
@ -228,11 +213,12 @@ int CRYPTO_ocb128_init(OCB128_CONTEXT *ctx, void *keyenc, void *keydec,
|
||||
*/
|
||||
ctx->encrypt = encrypt;
|
||||
ctx->decrypt = decrypt;
|
||||
ctx->stream = stream;
|
||||
ctx->keyenc = keyenc;
|
||||
ctx->keydec = keydec;
|
||||
|
||||
/* L_* = ENCIPHER(K, zeros(128)) */
|
||||
ocb_encrypt(ctx, &ctx->l_star, &ctx->l_star, ctx->keyenc);
|
||||
ctx->encrypt(ctx->l_star.c, ctx->l_star.c, ctx->keyenc);
|
||||
|
||||
/* L_$ = double(L_*) */
|
||||
ocb_double(&ctx->l_star, &ctx->l_dollar);
|
||||
@ -324,11 +310,10 @@ int CRYPTO_ocb128_setiv(OCB128_CONTEXT *ctx, const unsigned char *iv,
|
||||
int CRYPTO_ocb128_aad(OCB128_CONTEXT *ctx, const unsigned char *aad,
|
||||
size_t len)
|
||||
{
|
||||
u64 all_num_blocks, num_blocks;
|
||||
u64 i;
|
||||
u64 i, all_num_blocks;
|
||||
size_t num_blocks, last_len;
|
||||
OCB_BLOCK tmp1;
|
||||
OCB_BLOCK tmp2;
|
||||
int last_len;
|
||||
|
||||
/* Calculate the number of blocks of AAD provided now, and so far */
|
||||
num_blocks = len / 16;
|
||||
@ -341,14 +326,14 @@ int CRYPTO_ocb128_aad(OCB128_CONTEXT *ctx, const unsigned char *aad,
|
||||
|
||||
/* Offset_i = Offset_{i-1} xor L_{ntz(i)} */
|
||||
lookup = ocb_lookup_l(ctx, ocb_ntz(i));
|
||||
if (!lookup)
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
ocb_block16_xor(&ctx->offset_aad, lookup, &ctx->offset_aad);
|
||||
|
||||
/* Sum_i = Sum_{i-1} xor ENCIPHER(K, A_i xor Offset_i) */
|
||||
aad_block = (OCB_BLOCK *)(aad + ((i - ctx->blocks_hashed - 1) * 16));
|
||||
ocb_block16_xor(&ctx->offset_aad, aad_block, &tmp1);
|
||||
ocb_encrypt(ctx, &tmp1, &tmp2, ctx->keyenc);
|
||||
ctx->encrypt(tmp1.c, tmp2.c, ctx->keyenc);
|
||||
ocb_block16_xor(&ctx->sum, &tmp2, &ctx->sum);
|
||||
}
|
||||
|
||||
@ -369,7 +354,7 @@ int CRYPTO_ocb128_aad(OCB128_CONTEXT *ctx, const unsigned char *aad,
|
||||
ocb_block16_xor(&ctx->offset_aad, &tmp1, &tmp2);
|
||||
|
||||
/* Sum = Sum_m xor ENCIPHER(K, CipherInput) */
|
||||
ocb_encrypt(ctx, &tmp2, &tmp1, ctx->keyenc);
|
||||
ctx->encrypt(tmp2.c, tmp1.c, ctx->keyenc);
|
||||
ocb_block16_xor(&ctx->sum, &tmp1, &ctx->sum);
|
||||
}
|
||||
|
||||
@ -386,12 +371,11 @@ int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx,
|
||||
const unsigned char *in, unsigned char *out,
|
||||
size_t len)
|
||||
{
|
||||
u64 i;
|
||||
u64 all_num_blocks, num_blocks;
|
||||
u64 i, all_num_blocks;
|
||||
size_t num_blocks, last_len;
|
||||
OCB_BLOCK tmp1;
|
||||
OCB_BLOCK tmp2;
|
||||
OCB_BLOCK pad;
|
||||
int last_len;
|
||||
|
||||
/*
|
||||
* Calculate the number of blocks of data to be encrypted provided now, and
|
||||
@ -400,28 +384,46 @@ int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx,
|
||||
num_blocks = len / 16;
|
||||
all_num_blocks = num_blocks + ctx->blocks_processed;
|
||||
|
||||
/* Loop through all full blocks to be encrypted */
|
||||
for (i = ctx->blocks_processed + 1; i <= all_num_blocks; i++) {
|
||||
OCB_BLOCK *lookup;
|
||||
OCB_BLOCK *inblock;
|
||||
OCB_BLOCK *outblock;
|
||||
if (num_blocks && all_num_blocks == (size_t)all_num_blocks
|
||||
&& ctx->stream != NULL) {
|
||||
size_t max_idx = 0, top = (size_t)all_num_blocks;
|
||||
|
||||
/* Offset_i = Offset_{i-1} xor L_{ntz(i)} */
|
||||
lookup = ocb_lookup_l(ctx, ocb_ntz(i));
|
||||
if (!lookup)
|
||||
/*
|
||||
* See how many L_{i} entries we need to process data at hand
|
||||
* and pre-compute missing entries in the table [if any]...
|
||||
*/
|
||||
while (top >>= 1)
|
||||
max_idx++;
|
||||
if (ocb_lookup_l(ctx, max_idx) == NULL)
|
||||
return 0;
|
||||
ocb_block16_xor(&ctx->offset, lookup, &ctx->offset);
|
||||
|
||||
/* C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) */
|
||||
inblock = (OCB_BLOCK *)(in + ((i - ctx->blocks_processed - 1) * 16));
|
||||
ocb_block16_xor_misaligned(&ctx->offset, inblock, &tmp1);
|
||||
/* Checksum_i = Checksum_{i-1} xor P_i */
|
||||
ocb_block16_xor_misaligned(&ctx->checksum, inblock, &ctx->checksum);
|
||||
ocb_encrypt(ctx, &tmp1, &tmp2, ctx->keyenc);
|
||||
outblock =
|
||||
(OCB_BLOCK *)(out + ((i - ctx->blocks_processed - 1) * 16));
|
||||
ocb_block16_xor_misaligned(&ctx->offset, &tmp2, outblock);
|
||||
ctx->stream(in, out, num_blocks, ctx->keyenc,
|
||||
(size_t)ctx->blocks_processed + 1, ctx->offset.c,
|
||||
(const unsigned char (*)[16])ctx->l, ctx->checksum.c);
|
||||
} else {
|
||||
/* Loop through all full blocks to be encrypted */
|
||||
for (i = ctx->blocks_processed + 1; i <= all_num_blocks; i++) {
|
||||
OCB_BLOCK *lookup;
|
||||
OCB_BLOCK *inblock;
|
||||
OCB_BLOCK *outblock;
|
||||
|
||||
/* Offset_i = Offset_{i-1} xor L_{ntz(i)} */
|
||||
lookup = ocb_lookup_l(ctx, ocb_ntz(i));
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
ocb_block16_xor(&ctx->offset, lookup, &ctx->offset);
|
||||
|
||||
/* C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) */
|
||||
inblock =
|
||||
(OCB_BLOCK *)(in + ((i - ctx->blocks_processed - 1) * 16));
|
||||
ocb_block16_xor_misaligned(&ctx->offset, inblock, &tmp1);
|
||||
/* Checksum_i = Checksum_{i-1} xor P_i */
|
||||
ocb_block16_xor_misaligned(&ctx->checksum, inblock, &ctx->checksum);
|
||||
ctx->encrypt(tmp1.c, tmp2.c, ctx->keyenc);
|
||||
outblock =
|
||||
(OCB_BLOCK *)(out + ((i - ctx->blocks_processed - 1) * 16));
|
||||
ocb_block16_xor_misaligned(&ctx->offset, &tmp2, outblock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -435,7 +437,7 @@ int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx,
|
||||
ocb_block16_xor(&ctx->offset, &ctx->l_star, &ctx->offset);
|
||||
|
||||
/* Pad = ENCIPHER(K, Offset_*) */
|
||||
ocb_encrypt(ctx, &ctx->offset, &pad, ctx->keyenc);
|
||||
ctx->encrypt(ctx->offset.c, pad.c, ctx->keyenc);
|
||||
|
||||
/* C_* = P_* xor Pad[1..bitlen(P_*)] */
|
||||
ocb_block_xor(in + (len / 16) * 16, (unsigned char *)&pad, last_len,
|
||||
@ -461,12 +463,12 @@ int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx,
|
||||
const unsigned char *in, unsigned char *out,
|
||||
size_t len)
|
||||
{
|
||||
u64 i;
|
||||
u64 all_num_blocks, num_blocks;
|
||||
u64 i, all_num_blocks;
|
||||
size_t num_blocks, last_len;
|
||||
OCB_BLOCK tmp1;
|
||||
OCB_BLOCK tmp2;
|
||||
OCB_BLOCK pad;
|
||||
int last_len;
|
||||
|
||||
/*
|
||||
* Calculate the number of blocks of data to be decrypted provided now, and
|
||||
* so far
|
||||
@ -474,27 +476,46 @@ int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx,
|
||||
num_blocks = len / 16;
|
||||
all_num_blocks = num_blocks + ctx->blocks_processed;
|
||||
|
||||
/* Loop through all full blocks to be decrypted */
|
||||
for (i = ctx->blocks_processed + 1; i <= all_num_blocks; i++) {
|
||||
OCB_BLOCK *inblock;
|
||||
OCB_BLOCK *outblock;
|
||||
if (num_blocks && all_num_blocks == (size_t)all_num_blocks
|
||||
&& ctx->stream != NULL) {
|
||||
size_t max_idx = 0, top = (size_t)all_num_blocks;
|
||||
|
||||
/* Offset_i = Offset_{i-1} xor L_{ntz(i)} */
|
||||
OCB_BLOCK *lookup = ocb_lookup_l(ctx, ocb_ntz(i));
|
||||
if (!lookup)
|
||||
/*
|
||||
* See how many L_{i} entries we need to process data at hand
|
||||
* and pre-compute missing entries in the table [if any]...
|
||||
*/
|
||||
while (top >>= 1)
|
||||
max_idx++;
|
||||
if (ocb_lookup_l(ctx, max_idx) == NULL)
|
||||
return 0;
|
||||
ocb_block16_xor(&ctx->offset, lookup, &ctx->offset);
|
||||
|
||||
/* P_i = Offset_i xor DECIPHER(K, C_i xor Offset_i) */
|
||||
inblock = (OCB_BLOCK *)(in + ((i - ctx->blocks_processed - 1) * 16));
|
||||
ocb_block16_xor_misaligned(&ctx->offset, inblock, &tmp1);
|
||||
ocb_decrypt(ctx, &tmp1, &tmp2, ctx->keydec);
|
||||
outblock =
|
||||
(OCB_BLOCK *)(out + ((i - ctx->blocks_processed - 1) * 16));
|
||||
ocb_block16_xor_misaligned(&ctx->offset, &tmp2, outblock);
|
||||
ctx->stream(in, out, num_blocks, ctx->keydec,
|
||||
(size_t)ctx->blocks_processed + 1, ctx->offset.c,
|
||||
(const unsigned char (*)[16])ctx->l, ctx->checksum.c);
|
||||
} else {
|
||||
/* Loop through all full blocks to be decrypted */
|
||||
for (i = ctx->blocks_processed + 1; i <= all_num_blocks; i++) {
|
||||
OCB_BLOCK *inblock;
|
||||
OCB_BLOCK *outblock;
|
||||
|
||||
/* Checksum_i = Checksum_{i-1} xor P_i */
|
||||
ocb_block16_xor_misaligned(&ctx->checksum, outblock, &ctx->checksum);
|
||||
/* Offset_i = Offset_{i-1} xor L_{ntz(i)} */
|
||||
OCB_BLOCK *lookup = ocb_lookup_l(ctx, ocb_ntz(i));
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
ocb_block16_xor(&ctx->offset, lookup, &ctx->offset);
|
||||
|
||||
/* P_i = Offset_i xor DECIPHER(K, C_i xor Offset_i) */
|
||||
inblock =
|
||||
(OCB_BLOCK *)(in + ((i - ctx->blocks_processed - 1) * 16));
|
||||
ocb_block16_xor_misaligned(&ctx->offset, inblock, &tmp1);
|
||||
ctx->decrypt(tmp1.c, tmp2.c, ctx->keydec);
|
||||
outblock =
|
||||
(OCB_BLOCK *)(out + ((i - ctx->blocks_processed - 1) * 16));
|
||||
ocb_block16_xor_misaligned(&ctx->offset, &tmp2, outblock);
|
||||
|
||||
/* Checksum_i = Checksum_{i-1} xor P_i */
|
||||
ocb_block16_xor_misaligned(&ctx->checksum, outblock, &ctx->checksum);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -508,7 +529,7 @@ int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx,
|
||||
ocb_block16_xor(&ctx->offset, &ctx->l_star, &ctx->offset);
|
||||
|
||||
/* Pad = ENCIPHER(K, Offset_*) */
|
||||
ocb_encrypt(ctx, &ctx->offset, &pad, ctx->keyenc);
|
||||
ctx->encrypt(ctx->offset.c, pad.c, ctx->keyenc);
|
||||
|
||||
/* P_* = C_* xor Pad[1..bitlen(C_*)] */
|
||||
ocb_block_xor(in + (len / 16) * 16, (unsigned char *)&pad, last_len,
|
||||
@ -539,7 +560,7 @@ int CRYPTO_ocb128_finish(OCB128_CONTEXT *ctx, const unsigned char *tag,
|
||||
*/
|
||||
ocb_block16_xor(&ctx->checksum, &ctx->offset, &tmp1);
|
||||
ocb_block16_xor(&tmp1, &ctx->l_dollar, &tmp2);
|
||||
ocb_encrypt(ctx, &tmp2, &tmp1, ctx->keyenc);
|
||||
ctx->encrypt(tmp2.c, tmp1.c, ctx->keyenc);
|
||||
ocb_block16_xor(&tmp1, &ctx->sum, &ctx->tag);
|
||||
|
||||
if (len > 16 || len < 1) {
|
||||
|
@ -167,10 +167,19 @@ size_t CRYPTO_128_unwrap_pad(void *key, const unsigned char *icv,
|
||||
#ifndef OPENSSL_NO_OCB
|
||||
typedef struct ocb128_context OCB128_CONTEXT;
|
||||
|
||||
typedef void (*ocb128_f) (const unsigned char *in, unsigned char *out,
|
||||
size_t blocks, const void *key,
|
||||
size_t start_block_num,
|
||||
unsigned char offset_i[16],
|
||||
const unsigned char L_[][16],
|
||||
unsigned char checksum[16]);
|
||||
|
||||
OCB128_CONTEXT *CRYPTO_ocb128_new(void *keyenc, void *keydec,
|
||||
block128_f encrypt, block128_f decrypt);
|
||||
block128_f encrypt, block128_f decrypt,
|
||||
ocb128_f stream);
|
||||
int CRYPTO_ocb128_init(OCB128_CONTEXT *ctx, void *keyenc, void *keydec,
|
||||
block128_f encrypt, block128_f decrypt);
|
||||
block128_f encrypt, block128_f decrypt,
|
||||
ocb128_f stream);
|
||||
int CRYPTO_ocb128_copy_ctx(OCB128_CONTEXT *dest, OCB128_CONTEXT *src,
|
||||
void *keyenc, void *keydec);
|
||||
int CRYPTO_ocb128_setiv(OCB128_CONTEXT *ctx, const unsigned char *iv,
|
||||
|
@ -1854,6 +1854,46 @@ Tag = 1ad62009901f40cba7cd7156f94a7324
|
||||
Plaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627
|
||||
Ciphertext = 5e2fa7367ffbdb3938845cfd415fcc71ec79634eb31451609d27505f5e2978f43c44213d8fa441ee
|
||||
|
||||
Cipher = aes-128-ocb
|
||||
Key = 000102030405060708090A0B0C0D0E0F
|
||||
IV = 000102030405060708090A0B
|
||||
AAD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627
|
||||
Tag = C203F98CE28F7DAD3F31C021
|
||||
Plaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031
|
||||
Ciphertext = 09A4FD29DE949D9A9AA9924248422097AD4883B4713E6C214FF6567ADA08A967B2176C12F110DD441B7CAA3A509B13C822D6
|
||||
|
||||
Cipher = aes-128-ocb
|
||||
Key = 000102030405060708090A0B0C0D0E0F
|
||||
IV = 000102030405060708090A0B
|
||||
AAD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627
|
||||
Tag = 8346D7D47C5D893ED472F5AB
|
||||
Plaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041
|
||||
Ciphertext = 09A4FD29DE949D9A9AA9924248422097AD4883B4713E6C214FF6567ADA08A967B2176C12F110DD441B7CAA3A509B13C86A023AFCEE998BEE42028D44507B15F714FF
|
||||
|
||||
Cipher = aes-128-ocb
|
||||
Key = 000102030405060708090A0B0C0D0E0F
|
||||
IV = 000102030405060708090A0B
|
||||
AAD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627
|
||||
Tag = 5822A9A70FDF55D29D2984A6
|
||||
Plaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051
|
||||
Ciphertext = 09A4FD29DE949D9A9AA9924248422097AD4883B4713E6C214FF6567ADA08A967B2176C12F110DD441B7CAA3A509B13C86A023AFCEE998BEE42028D44507B15F77C528A1DE6406B519BCEE8FCB8294170634D
|
||||
|
||||
Cipher = aes-128-ocb
|
||||
Key = 000102030405060708090A0B0C0D0E0F
|
||||
IV = 000102030405060708090A0B
|
||||
AAD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627
|
||||
Tag = 81772B6741ABB4ECA9D2DEB2
|
||||
Plaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061
|
||||
Ciphertext = 09A4FD29DE949D9A9AA9924248422097AD4883B4713E6C214FF6567ADA08A967B2176C12F110DD441B7CAA3A509B13C86A023AFCEE998BEE42028D44507B15F77C528A1DE6406B519BCEE8FCB829417001E54E15A7576C4DF32366E0F439C7050FAA
|
||||
|
||||
Cipher = aes-128-ocb
|
||||
Key = 000102030405060708090A0B0C0D0E0F
|
||||
IV = 000102030405060708090A0B
|
||||
AAD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627
|
||||
Tag = 3E52A01D068DE85456DB03B7
|
||||
Plaintext = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071
|
||||
Ciphertext = 09A4FD29DE949D9A9AA9924248422097AD4883B4713E6C214FF6567ADA08A967B2176C12F110DD441B7CAA3A509B13C86A023AFCEE998BEE42028D44507B15F77C528A1DE6406B519BCEE8FCB829417001E54E15A7576C4DF32366E0F439C7051CB4824B8114E9A720CBC1CE0185B156B486
|
||||
|
||||
# AES XTS test vectors from IEEE Std 1619-2007
|
||||
Cipher = aes-128-xts
|
||||
Key = 0000000000000000000000000000000000000000000000000000000000000000
|
||||
|
Loading…
x
Reference in New Issue
Block a user