package Ġorg . open rs 2 . crypto Ċ Ċ import Ġcom . google . common . base . Preconditions Ċ import Ġio . netty . buffer . Byte Buf Ċ import Ġio . netty . buffer . Byte Buf Util Ċ Ċ public Ġfun ĠByte Buf . wh irl pool (): ĠByteArray Ġ{ ĊĠĠĠ Ġreturn Ġwh irl pool ( reader Index (), Ġreadable Bytes ()) Ċ } Ċ Ċ public Ġfun ĠByte Buf . wh irl pool ( index : ĠInt , Ġlen : ĠInt ): ĠByteArray Ġ{ ĊĠĠĠ ĠPreconditions . check Position Indexes ( index , Ġindex Ġ+ Ġlen , Ġcapacity ()) ĊĊĠĠĠ Ġreturn Ġif Ġ( has Array ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠWh irl pool . wh irl pool ( array (), Ġarray Offset () Ġ+ Ġindex , Ġlen ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠWh irl pool . wh irl pool ( Byte Buf Util . getBytes ( this , Ġindex , Ġlen , Ġfalse )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġclass ĠWh irl pool Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbit Length Ġ= ĠByteArray ( 3 2 ) ĊĠĠĠ Ġprivate Ġval Ġbuffer Ġ= ĠByteArray ( 6 4 ) ĊĠĠĠ Ġprivate Ġvar Ġbuffer Bits Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġbuffer Pos Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġhash Ġ= ĠLong Array ( 8 ) ĊĠĠĠ Ġprivate Ġval ĠK Ġ= ĠLong Array ( 8 ) ĊĠĠĠ Ġprivate Ġval ĠL Ġ= ĠLong Array ( 8 ) ĊĠĠĠ Ġprivate Ġval Ġblock Ġ= ĠLong Array ( 8 ) ĊĠĠĠ Ġprivate Ġval Ġstate Ġ= ĠLong Array ( 8 ) ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Buffer () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock [ i ] Ġ= Ġ( buffer [ j ]. to Long () Ġshl Ġ 5 6 ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( buffer [ j Ġ+ Ġ 1 ]. to Long () Ġand Ġ 0 xFF L ) Ġshl Ġ 4 8 ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( buffer [ j Ġ+ Ġ 2 ]. to Long () Ġand Ġ 0 xFF L ) Ġshl Ġ 4 0 ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( buffer [ j Ġ+ Ġ 3 ]. to Long () Ġand Ġ 0 xFF L ) Ġshl Ġ 3 2 ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( buffer [ j Ġ+ Ġ 4 ]. to Long () Ġand Ġ 0 xFF L ) Ġshl Ġ 2 4 ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( buffer [ j Ġ+ Ġ 5 ]. to Long () Ġand Ġ 0 xFF L ) Ġshl Ġ 1 6 ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( buffer [ j Ġ+ Ġ 6 ]. to Long () Ġand Ġ 0 xFF L ) Ġshl Ġ 8 ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( buffer [ j Ġ+ Ġ 7 ]. to Long () Ġand Ġ 0 xFF L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ+= Ġ 8 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK [ i ] Ġ= Ġhash [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate [ i ] Ġ= Ġblock [ i ] Ġxor ĠK [ i ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġ 1 .. R ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL [ i ] Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġ 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( t Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL [ i ] Ġ= ĠL [ i ] Ġxor ĠC [ t ][ ( K [( i Ġ- Ġt ) Ġand Ġ 7 ] Ġ ush r Ġs ). toInt () Ġand Ġ 0 xFF ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ-= Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK [ i ] Ġ= ĠL [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠK [ 0 ] Ġ= ĠK [ 0 ] Ġxor Ġrc [ r ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL [ i ] Ġ= ĠK [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġ 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( t Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL [ i ] Ġ= ĠL [ i ] Ġxor ĠC [ t ][ ( state [( i Ġ- Ġt ) Ġand Ġ 7 ] Ġ ush r Ġs ). toInt () Ġand Ġ 0 xFF ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ-= Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate [ i ] Ġ= ĠL [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash [ i ] Ġ= Ġhash [ i ] Ġxor Ġstate [ i ] Ġxor Ġblock [ i ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun ĠN ES SI E init () Ġ{ ĊĠĠĠĠĠĠĠ Ġbit Length . fill ( 0 ) ĊĠĠĠĠĠĠĠ Ġbuffer Bits Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġbuffer Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġbuffer [ 0 ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġhash . fill ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun ĠN ES SI E add ( source : ĠByteArray , Ġbits : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsource Bits Ġ= Ġbits ĊĠĠĠĠĠĠĠ Ġvar Ġsource Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġsource Gap Ġ= Ġ( 8 Ġ- Ġ( source Bits . toInt () Ġand Ġ 7 )) Ġand Ġ 7 ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Rem Ġ= Ġbuffer Bits Ġand Ġ 7 ĊĠĠĠĠĠĠĠ Ġvar Ġb : ĠInt ĊĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġsource Bits ĊĠĠĠĠĠĠĠ Ġvar Ġcarry Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 3 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcarry Ġ+= Ġ( bit Length [ i ]. toInt () Ġand Ġ 0 xFF ) Ġ+ Ġ( value . toInt () Ġand Ġ 0 xFF ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit Length [ i ] Ġ= Ġcarry . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcarry Ġ= Ġcarry Ġ ush r Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue Ġ ush r Ġ 8 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( source Bits Ġ> Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġ(( source [ source Pos ]. toInt () Ġshl Ġsource Gap ) Ġand Ġ 0 xFF ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( source [ source Pos Ġ+ Ġ 1 ]. toInt () Ġand Ġ 0 xFF ) Ġ ush r Ġ( 8 Ġ- Ġsource Gap )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( b Ġin Ġ 0 .. 2 5 5 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer [ buffer Pos ] Ġ= Ġ( buffer [ buffer Pos ]. toInt () Ġor Ġ( b Ġ ush r Ġbuffer Rem )). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Pos ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Bits Ġ+= Ġ 8 Ġ- Ġbuffer Rem ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer Bits Ġ== Ġ 5 1 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Bits Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer [ buffer Pos ] Ġ= Ġ(( b Ġshl Ġ( 8 Ġ- Ġbuffer Rem )) Ġand Ġ 0 xFF ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Bits Ġ+= Ġbuffer Rem ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Bits Ġ-= Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Pos ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( source Bits Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġ( source [ source Pos ]. toInt () Ġshl Ġsource Gap ) Ġand Ġ 0 xFF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer [ buffer Pos ] Ġ= Ġ( buffer [ buffer Pos ]. toInt () Ġor Ġ( b Ġ ush r Ġbuffer Rem )). to Byte () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( buffer Rem Ġ+ Ġsource Bits Ġ< Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Bits Ġ+= Ġsource Bits . toInt () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Pos ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Bits Ġ+= Ġ 8 Ġ- Ġbuffer Rem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Bits Ġ-= Ġ 8 Ġ- Ġbuffer Rem ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer Bits Ġ== Ġ 5 1 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Bits Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer [ buffer Pos ] Ġ= Ġ(( b Ġshl Ġ( 8 Ġ- Ġbuffer Rem )) Ġand Ġ 0 xFF ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Bits Ġ+= Ġsource Bits . toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun ĠN ES SI E finalize ( digest : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer [ buffer Pos ] Ġ= Ġ( buffer [ buffer Pos ]. toInt () Ġor Ġ( 0 x 8 0 Ġ ush r Ġ( buffer Bits Ġand Ġ 7 ))). to Byte () ĊĠĠĠĠĠĠĠ Ġbuffer Pos ++ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( buffer Pos Ġ> Ġ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( buffer Pos Ġ< Ġ 6 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer [ buffer Pos ++] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( buffer Pos Ġ< Ġ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer [ buffer Pos ++] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbit Length . copy Into ( buffer , Ġdestination Offset Ġ= Ġ 3 2 , ĠstartIndex Ġ= Ġ 0 , Ġend Index Ġ= Ġ 3 2 ) ĊĠĠĠĠĠĠĠ Ġprocess Buffer () ĊĊĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġhash [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigest [ j ] Ġ= Ġ( h Ġ ush r Ġ 5 6 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigest [ j Ġ+ Ġ 1 ] Ġ= Ġ( h Ġ ush r Ġ 4 8 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigest [ j Ġ+ Ġ 2 ] Ġ= Ġ( h Ġ ush r Ġ 4 0 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigest [ j Ġ+ Ġ 3 ] Ġ= Ġ( h Ġ ush r Ġ 3 2 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigest [ j Ġ+ Ġ 4 ] Ġ= Ġ( h Ġ ush r Ġ 2 4 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigest [ j Ġ+ Ġ 5 ] Ġ= Ġ( h Ġ ush r Ġ 1 6 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigest [ j Ġ+ Ġ 6 ] Ġ= Ġ( h Ġ ush r Ġ 8 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigest [ j Ġ+ Ġ 7 ] Ġ= Ġh . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ+= Ġ 8 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDIG EST BITS Ġ= Ġ 5 1 2 ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠDIG EST BYTES : ĠInt Ġ= ĠDIG EST BITS Ġ ush r Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠR Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġs box Ġ= Ġ"\ u 1 8 2 3 \ u C 6 E 8 \ u 8 7 B 8 \ u 0 1 4 F \ u 3 6 A 6 \ uD 2 F 5 \ u 7 9 6 F \ u 9 1 5 2 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 6 0 BC \ u 9 B 8 E \ u A 3 0 C \ u 7 B 3 5 \ u 1 DE 0 \ uD 7 C 2 \ u 2 E 4 B \ u FE 5 7 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 1 5 7 7 \ u 3 7 E 5 \ u 9 FF 0 \ u 4 ADA \ u 5 8 C 9 \ u 2 9 0 A \ u B 1 A 0 \ u 6 B 8 5 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u BD 5 D \ u 1 0 F 4 \ u CB 3 E \ u 0 5 6 7 \ uE 4 2 7 \ u 4 1 8 B \ u A 7 7 D \ u 9 5 D 8 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u FB EE \ u 7 C 6 6 \ u DD 1 7 \ u 4 7 9 E \ u CA 2 D \ u BF 0 7 \ u AD 5 A \ u 8 3 3 3 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 6 3 0 2 \ u AA 7 1 \ u C 8 1 9 \ u 4 9 D 9 \ uF 2 E 3 \ u 5 B 8 8 \ u 9 A 2 6 \ u 3 2 B 0 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ uE 9 0 F \ uD 5 8 0 \ u BE CD \ u 3 4 4 8 \ uFF 7 A \ u 9 0 5 F \ u 2 0 6 8 \ u 1 AA E " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u B 4 5 4 \ u 9 3 2 2 \ u 6 4 F 1 \ u 7 3 1 2 \ u 4 0 0 8 \ u C 3 EC \ u DB A 1 \ u 8 D 3 D " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 9 7 0 0 \ u CF 2 B \ u 7 6 8 2 \ uD 6 1 B \ u B 5 AF \ u 6 A 5 0 \ u 4 5 F 3 \ u 3 0 EF " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 3 F 5 5 \ u A 2 EA \ u 6 5 BA \ u 2 FC 0 \ u DE 1 C \ u FD 4 D \ u 9 2 7 5 \ u 0 6 8 A " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u B 2 E 6 \ u 0 E 1 F \ u 6 2 D 4 \ u A 8 9 6 \ uF 9 C 5 \ u 2 5 5 9 \ u 8 4 7 2 \ u 3 9 4 C " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 5 E 7 8 \ u 3 8 8 C \ uD 1 A 5 \ uE 2 6 1 \ u B 3 2 1 \ u 9 C 1 E \ u 4 3 C 7 \ u FC 0 4 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 5 1 9 9 \ u 6 D 0 D \ uF ADF \ u 7 E 2 4 \ u 3 B AB \ u CE 1 1 \ u 8 F 4 E \ u B 7 EB " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 3 C 8 1 \ u 9 4 F 7 \ u B 9 1 3 \ u 2 CD 3 \ uE 7 6 E \ u C 4 0 3 \ u 5 6 4 4 \ u 7 FA 9 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 2 ABB \ u C 1 5 3 \ u DC 0 B \ u 9 D 6 C \ u 3 1 7 4 \ uF 6 4 6 \ u AC 8 9 \ u 1 4 E 1 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 1 6 3 A \ u 6 9 0 9 \ u 7 0 B 6 \ uD 0 ED \ u CC 4 2 \ u 9 8 A 4 \ u 2 8 5 C \ uF 8 8 6 " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠC Ġ= ĠArray ( 8 ) Ġ{ ĠLong Array ( 2 5 6 ) Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrc Ġ= ĠLong Array ( R Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġ 2 5 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġs box [ x Ġ/ Ġ 2 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġif Ġ(( x Ġand Ġ 1 ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . code . to Long () Ġ ush r Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . code . to Long () Ġand Ġ 0 xFF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv 2 Ġ= Ġv 1 Ġshl Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 2 Ġ>= Ġ 0 x 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 2 Ġ= Ġv 2 Ġxor Ġ 0 x 1 1 D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv 4 Ġ= Ġv 2 Ġshl Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 4 Ġ>= Ġ 0 x 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 4 Ġ= Ġv 4 Ġxor Ġ 0 x 1 1 D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 5 Ġ= Ġv 4 Ġxor Ġv 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv 8 Ġ= Ġv 4 Ġshl Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 8 Ġ>= Ġ 0 x 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 8 Ġ= Ġv 8 Ġxor Ġ 0 x 1 1 D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 9 Ġ= Ġv 8 Ġxor Ġv 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC [ 0 ][ x ] Ġ= Ġ( v 1 Ġshl Ġ 5 6 ) Ġor Ġ( v 1 Ġshl Ġ 4 8 ) Ġor Ġ( v 4 Ġshl Ġ 4 0 ) Ġor Ġ( v 1 Ġshl Ġ 3 2 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( v 8 Ġshl Ġ 2 4 ) Ġor Ġ( v 5 Ġshl Ġ 1 6 ) Ġor Ġ( v 2 Ġshl Ġ 8 ) Ġor Ġv 9 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( t Ġin Ġ 1 Ġuntil Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC [ t ][ x ] Ġ= Ġ( C [ t Ġ- Ġ 1 ][ x ] Ġ ush r Ġ 8 ) Ġor Ġ( C [ t Ġ- Ġ 1 ][ x ] Ġshl Ġ 5 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrc [ 0 ] Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġ 1 .. R ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġ 8 Ġ* Ġ( r Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrc [ r ] Ġ= Ġ( C [ 0 ][ i ] Ġand Ġ- 0 x 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 L ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( C [ 1 ][ i Ġ+ Ġ 1 ] Ġand Ġ 0 x 0 0 FF 0 0 0 0 0 0 0 0 0 0 0 0 L ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( C [ 2 ][ i Ġ+ Ġ 2 ] Ġand Ġ 0 x 0 0 0 0 FF 0 0 0 0 0 0 0 0 0 0 L ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( C [ 3 ][ i Ġ+ Ġ 3 ] Ġand Ġ 0 x 0 0 0 0 0 0 FF 0 0 0 0 0 0 0 0 L ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( C [ 4 ][ i Ġ+ Ġ 4 ] Ġand Ġ 0 x 0 0 0 0 0 0 0 0 FF 0 0 0 0 0 0 L ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( C [ 5 ][ i Ġ+ Ġ 5 ] Ġand Ġ 0 x 0 0 0 0 0 0 0 0 0 0 FF 0 0 0 0 L ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( C [ 6 ][ i Ġ+ Ġ 6 ] Ġand Ġ 0 x 0 0 0 0 0 0 0 0 0 0 0 0 FF 0 0 L ) Ġxor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( C [ 7 ][ i Ġ+ Ġ 7 ] Ġand Ġ 0 x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FF L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġwh irl pool ( data : ĠByteArray , Ġoff : ĠInt Ġ= Ġ 0 , Ġlen : ĠInt Ġ= Ġdata . size ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource : ĠByteArray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( off Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= ĠByteArray ( len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource [ i ] Ġ= Ġdata [ off Ġ+ Ġi ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwh irl pool Ġ= ĠWh irl pool () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwh irl pool . N ES SI E init () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwh irl pool . N ES SI E add ( source , Ġ( len Ġ* Ġ 8 ). to Long ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= ĠByteArray ( DIG EST BYTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwh irl pool . N ES SI E finalize ( digest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdigest ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ