package Ġorg . gal o is . core . provider . p pe . hpc bc Ċ Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjavax . crypto . SecretKey Ċ Ċ class ĠH PC BC SecretKey Ġ: ĠSecret Key Ġ{ ĊĠĠĠ Ġprivate Ġval Ġencoded : ĠByteArray ĊĠĠĠ Ġval Ġcipher Key : ĠByteArray ĊĠĠĠ Ġval Ġcipher T weak : ĠByteArray ĊĠĠĠ Ġval Ġintegrity Key : ĠByteArray ĊĠĠĠ Ġval Ġintegrity T weak : ĠByteArray ĊĠĠĠ Ġval Ġhash Key : ĠByteArray ĊĊĠĠĠ Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcipher Key : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġcipher T weak : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġintegrity Key : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġintegrity T weak : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġhash Key : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġintegrity Check : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . cipher Key Ġ= Ġcipher Key ĊĠĠĠĠĠĠĠ Ġthis . cipher T weak Ġ= Ġcipher T weak ĊĠĠĠĠĠĠĠ Ġthis . integrity Key Ġ= Ġintegrity Key ĊĠĠĠĠĠĠĠ Ġthis . integrity T weak Ġ= Ġintegrity T weak ĊĠĠĠĠĠĠĠ Ġthis . hash Key Ġ= Ġhash Key ĊĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( integrity Check ) ĠByteBuffer . allocate ( KEY _ SIZ ES [ 1 ] Ġ/ Ġ 8 ) Ġelse ĠByteBuffer . allocate ( KEY _ SIZ ES [ 0 ] Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġbuffer . put ( cipher Key ). put ( cipher T weak ). put ( hash Key ) ĊĠĠĠĠĠĠĠ Ġif Ġ( integrity Check ) Ġbuffer . put ( integrity Key ). put ( integrity T weak ) ĊĊĠĠĠĠĠĠĠ Ġthis . encoded Ġ= Ġbuffer . array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcipher Key : ĠByteArray , Ġcipher T weak : ĠByteArray , Ġhash Key : ĠByteArray ĊĠĠĠ Ġ) Ġ: Ġthis ( cipher Key , Ġcipher T weak , ĠByteArray ( 0 ), ĠByteArray ( 0 ), Ġhash Key , Ġfalse ) ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcipher Key : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġcipher T weak : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġintegrity Key : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġintegrity T weak : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġhash Key : ĠByteArray ĊĠĠĠ Ġ) Ġ: Ġthis ( cipher Key , Ġcipher T weak , Ġintegrity Key , Ġintegrity T weak , Ġhash Key , Ġtrue ) ĊĊĠĠĠ Ġconstructor ( encoded : ĠByteArray , Ġintegrity Check : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( is Key Size Valid ( encoded . size Ġ* Ġ 8 , Ġintegrity Check )) Ġ{ ĠgetKey Size Error ( encoded . size Ġ* Ġ 8 , Ġintegrity Check ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . wrap ( encoded ) ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Parts Sizes Ġ= ĠgetKey Parts Sizes ( integrity Check ) ĊĠĠĠĠĠĠĠ Ġthis . cipher Key Ġ= ĠByteArray ( key Parts Sizes . first Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġthis . cipher T weak Ġ= ĠByteArray ( key Parts Sizes . second Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġthis . integrity Key Ġ= ĠByteArray ( key Parts Sizes . first Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġthis . integrity T weak Ġ= ĠByteArray ( key Parts Sizes . second Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġthis . hash Key Ġ= ĠByteArray ( key Parts Sizes . third Ġ/ Ġ 8 ) ĊĊĠĠĠĠĠĠĠ Ġbuffer [ cipher Key ][ cipher T weak ][ hash Key ] ĊĠĠĠĠĠĠĠ Ġif Ġ( integrity Check ) Ġbuffer [ integrity Key ][ integrity T weak ] ĊĊĠĠĠĠĠĠĠ Ġthis . encoded Ġ= Ġencoded . clone () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Algorithm () Ġ= ĠH PC BC _ ALGORITHM _ NAME ĊĊĠĠĠ Ġoverride Ġfun Ġget Format () Ġ= Ġ" RAW " ĊĊĠĠĠ Ġoverride Ġfun Ġget Encoded () Ġ= Ġencoded . clone () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠC IP HER _ ALGORITHM Ġ= Ġ" FF 3 " ĊĠĠĠĠĠĠĠ Ġval ĠKEY _ SIZ ES Ġ= Ġint ArrayOf ( 2 5 6 , Ġ 5 1 2 ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Key Size Valid ( len : ĠInt , Ġintegrity Check : ĠBoolean ) Ġ= Ġif Ġ( integrity Check ) Ġlen Ġ== ĠKEY _ SIZ ES [ 1 ] ĊĠĠĠĠĠĠĠ Ġelse Ġlen Ġ== ĠKEY _ SIZ ES [ 0 ] ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetKey Size Error ( len : ĠInt , Ġintegrity Check : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( integrity Check ) Ġ" ĠWith Ġintegrity Ġcheck Ġkey Ġsize Ġcan Ġonly Ġbe Ġ${ KEY _ SIZ ES [ 1 ]}, Ġwas Ġ$ len " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ" Without Ġintegrity Ġcheck Ġkey Ġsize Ġcan Ġonly Ġbe Ġ${ KEY _ SIZ ES [ 0 ]}, Ġwas Ġ$ len " ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetKey Parts Sizes ( integrity Check : ĠBoolean ) Ġ= Ġif Ġ( integrity Check ) ĠTrip le ( 1 2 8 , Ġ 6 4 , Ġ 1 2 8 ) ĊĠĠĠĠĠĠĠ Ġelse ĠTrip le ( 1 2 8 , Ġ 6 4 , Ġ 6 4 ) ĊĊĠĠĠ Ġ} Ċ }