package Ġcom . small raw . crypto . p add ings Ċ Ċ import Ġjava . security . Secure Random ĊĊ Ċ /** Ċ Ġ* ĠA Ġpad der Ġthat Ġadds ĠTr ailing - Bit - Comp li ment Ġpadding Ġto Ġa Ġblock . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThis Ġpadding Ġp ads Ġthe Ġblock Ġout Ġwith Ġthe Ġcomp li ment Ġof Ġthe Ġlast Ġbit Ċ Ġ* Ġof Ġthe Ġplain Ġtext . Ċ Ġ* Ċ Ġ*/ Ċ class ĠTB CP adding Ġ: ĠBlock Cipher Padding Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitial ise Ġthe Ġpad der . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrandom Ġ- Ġa ĠSecure Random Ġif Ġavailable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġinit ( random : ĠSecure Random ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnothing Ġto Ġdo . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġname Ġof Ġthe Ġalgorithm Ġthe Ġpad der Ġimplements . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġname Ġof Ġthe Ġalgorithm Ġthe Ġpad der Ġimplements . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġpadding Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" T BC " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġadd Ġthe Ġpad Ġbytes Ġto Ġthe Ġpassed Ġin Ġblock , Ġreturning Ġthe ĊĠĠĠĠ Ġ* Ġnumber Ġof Ġbytes Ġadded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : Ġthis Ġassumes Ġthat Ġthe Ġlast Ġblock Ġof Ġplain Ġtext Ġis Ġalways ĊĠĠĠĠ Ġ* Ġpassed Ġto Ġit Ġinside Ġin . Ġi . e . Ġif Ġin Off Ġis Ġzero , Ġindicating Ġthe ĊĠĠĠĠ Ġ* Ġentire Ġblock Ġis Ġto Ġbe Ġoverwritten Ġwith Ġpadding Ġthe Ġvalue Ġof Ġin ĊĠĠĠĠ Ġ* Ġshould Ġbe Ġthe Ġsame Ġas Ġthe Ġlast Ġblock Ġof Ġplain Ġtext . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġadd Padding ( ĊĠĠĠĠĠĠĠ Ġinput Byte : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġin Off : ĠInt ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġin Off Ġ= Ġin Off ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġinput Byte . size Ġ- Ġin Off ĊĠĠĠĠĠĠĠ Ġval Ġcode : ĠByte Ġ= Ġif Ġ( in Off Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( input Byte [ in Off Ġ- Ġ 1 ]. toInt () Ġand Ġ 0 x 0 1 Ġ== Ġ 0 ) Ġ 0 xff Ġelse Ġ 0 x 0 0 ). to Byte () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( input Byte [ input Byte . size Ġ- Ġ 1 ]. toInt () Ġand Ġ 0 x 0 1 Ġ== Ġ 0 ) Ġ 0 xff Ġelse Ġ 0 x 0 0 ). to Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhile Ġ( in Off Ġ< Ġinput Byte . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Byte [ in Off ] Ġ= Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Off ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturn Ġthe Ġnumber Ġof Ġpad Ġbytes Ġpresent Ġin Ġthe Ġblock . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġpad Count ( input Byte : ĠByteArray ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġinput Byte [ input Byte . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġinput Byte . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ> Ġ 0 Ġ&& Ġinput Byte [ index Ġ- Ġ 1 ] Ġ== Ġcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinput Byte . size Ġ- Ġindex ĊĠĠĠ Ġ} Ċ }