package Ġme . leon . controller Ċ Ċ import Ġjavax . crypto . Mac Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ import Ġme . leon . base . base 6 4 Ċ import Ġme . leon . ext . G Mac Ċ import Ġme . leon . ext . Poly 1 3 0 5 Serial Ċ import Ġme . leon . ext . catch Ċ import Ġme . leon . ext . init Ċ import Ġme . leon . ext . to Hex Ċ import Ġorg . bouncycastle . crypto . macs . KG Mac Ċ import Ġt orn ad of x . Controller Ċ Ċ class ĠMac Controller Ġ: ĠController () Ġ{ ĊĠĠĠ Ġfun Ġmac ( msg : ĠString , Ġh key : ĠString , Ġalg : ĠString , Ġoutput Encode : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġcatch ({ Ġ" mac Ġerror : Ġ$ it " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" mac Ġ$ msg Ġ Ġ$ alg Ġ$ h key ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMac . getInstance ( alg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( SecretKey Spec ( h key . toByteArray (), Ġalg )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( msg . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Final () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Encode Ġ== Ġ" hex ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . to Hex () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . base 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmac With Iv ( msg : ĠString , Ġkey : ĠString , Ġiv : ĠString , Ġalg : ĠString , Ġoutput Encode : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġcatch ({ Ġ" mac Ġerror : Ġ$ it " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" mac Ġ$ msg Ġ Ġ$ alg Ġ$ key ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmsg . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey ByteArray Ġ= Ġkey . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv ByteArray Ġ= Ġiv . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alg . contains (" POLY 1 3 0 5 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoly 1 3 0 5 Serial . getInstance ( alg ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( key ByteArray , Ġiv ByteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( data , Ġ 0 , Ġdata . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠByteArray ( mac Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Final ( sig , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Encode Ġ== Ġ" hex ") Ġsig . to Hex () Ġelse Ġsig . base 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( alg . contains (" G MAC ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG Mac . getInstance ( alg ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis Ġorg . bouncycastle . crypto . macs . G Mac ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( key ByteArray , Ġiv ByteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( data , Ġ 0 , Ġdata . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠByteArray ( mac Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Final ( sig , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Encode Ġ== Ġ" hex ") Ġsig . to Hex () Ġelse Ġsig . base 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( this Ġis ĠK G Mac ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( key ByteArray , Ġiv ByteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( data , Ġ 0 , Ġdata . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠByteArray ( mac Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Final ( sig , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Encode Ġ== Ġ" hex ") Ġsig . to Hex () Ġelse Ġsig . base 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ