package Ġorg . kode in . memory . crypto Ċ Ċ import Ġkotlinx . c interop .* Ċ import Ġorg . kode in . memory . crypto . lib ssl .* Ċ import Ġorg . kode in . memory . io .* Ċ import Ġorg . kode in . memory . use OrNull Ċ import Ġplatform . posix . memcpy ĊĊ Ċ private Ġinline Ġfun Ġoutput ( maxSize : ĠInt , Ġoutput Ptr : ĠC Pointer <* >, Ġoutput Size : ĠInt , Ġblock : Ġ( output Ptr : ĠC Pointer <* >) Ġ-> ĠInt ): ĠInt Ġ{ ĊĠĠĠ Ġif Ġ( output Size Ġ>= ĠmaxSize ) Ġreturn Ġblock ( output Ptr ) ĊĊĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġalloc Array < Byte Var >( maxSize ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġblock ( buffer ) ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġoutput Size ) Ġerror (" Output Ġmemory Ġtoo Ġsmall Ġ( missing Ġat Ġleast Ġ${ size Ġ- Ġoutput Size } Ġbytes ). ") ĊĠĠĠĠĠĠĠ Ġmemcpy ( output Ptr , Ġbuffer , Ġsize . convert ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠLinux Cipher Encrypt Write able ( private Ġval Ġctx : ĠC Values Ref < E VP _ CIPHER _ CTX >, Ġkey : ĠAl location , Ġoutput : ĠWrite able ) Ġ: ĠNative Cipher Write able ( key , Ġoutput ) Ġ{ ĊĠĠĠ Ġval Ġout Len Ġ= Ġnative Heap . alloc < Int Var >() ĊĊĠĠĠ Ġoverride Ġfun Ġdo Update ( input Ptr : ĠC Pointer <* >, Ġinput Length : ĠInt , Ġoutput Ptr : ĠC Pointer <* >, Ġoutput Size : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġoutput ( input Length Ġ+ Ġ 1 6 Ġ- Ġ 1 , Ġoutput Ptr , Ġoutput Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Len . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEVP _ Encrypt Update ( ctx , Ġit . reinterpret (), Ġout Len . ptr , Ġinput Ptr . reinterpret (), Ġinput Length ). require Open SSL Success (" E VP _ Encrypt Update ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Len . value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo Final ( output Ptr : ĠC Pointer <* >, Ġoutput Size : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġoutput ( 1 6 , Ġoutput Ptr , Ġoutput Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Len . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEVP _ Encrypt Final _ ex ( ctx , Ġit . reinterpret (), Ġout Len . ptr ). require Open SSL Success (" E VP _ Encrypt Final _ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout Len . value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo Close () Ġ{ ĊĠĠĠĠĠĠĠ Ġnative Heap . free ( out Len ) ĊĠĠĠĠĠĠĠ ĠEVP _ CIPHER _ CTX _ free ( ctx ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠLinux Cipher Decrypt Write able ( private Ġval Ġctx : ĠC Values Ref < E VP _ CIPHER _ CTX >, Ġkey : ĠAl location , Ġoutput : ĠWrite able ) Ġ: ĠNative Cipher Write able ( key , Ġoutput ) Ġ{ ĊĠĠĠ Ġval Ġout Len Ġ= Ġnative Heap . alloc < Int Var >() ĊĊĠĠĠ Ġoverride Ġfun Ġdo Update ( input Ptr : ĠC Pointer <* >, Ġinput Length : ĠInt , Ġoutput Ptr : ĠC Pointer <* >, Ġoutput Size : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġoutput ( input Length Ġ+ Ġ 1 6 , Ġoutput Ptr , Ġoutput Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Len . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEVP _ Decrypt Update ( ctx , Ġit . reinterpret (), Ġout Len . ptr , Ġinput Ptr . reinterpret (), Ġinput Length ). require Open SSL Success (" E VP _ Decrypt Update ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Len . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo Final ( output Ptr : ĠC Pointer <* >, Ġoutput Size : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġoutput ( 1 6 , Ġoutput Ptr , Ġoutput Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Len . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEVP _ Decrypt Final _ ex ( ctx , Ġit . reinterpret (), Ġout Len . ptr ). require Open SSL Success (" E VP _ Decrypt Final _ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout Len . value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo Close () Ġ{ ĊĠĠĠĠĠĠĠ Ġnative Heap . free ( out Len ) ĊĠĠĠĠĠĠĠ ĠEVP _ CIPHER _ CTX _ free ( ctx ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġtype alias Ġcipher Init Ġ= Ġ( C Values Ref < E VP _ CIPHER _ CTX > ?, ĠC Values Ref < E VP _ CIPHER > ?, ĠC Values Ref < ENGINE > ?, ĠC Values Ref < U Byte Var > ?, ĠC Values Ref < U Byte Var > ?) Ġ-> ĠInt Ċ Ċ @ Opt In ( Experimental Unsigned Types :: class ) Ċ public Ġactual Ġobject ĠAES 1 2 8 Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġget Cipher ( ĊĠĠĠĠĠĠĠ Ġcipher Mode : ĠCipher Mode , ĊĠĠĠĠĠĠĠ Ġkey : ĠRead Memory , ĊĠĠĠĠĠĠĠ Ġoutput : ĠWrite able , ĊĠĠĠĠĠĠĠ Ġinit Function : Ġcipher Init , ĊĠĠĠĠĠĠĠ Ġinit FunctionName : ĠString , ĊĠĠĠĠĠĠĠ Ġfactory : Ġ( C Values Ref < E VP _ CIPHER _ CTX >, ĠAl location , ĠWrite able ) Ġ-> ĠNative Cipher Write able ĊĠĠĠ Ġ): ĠNative Cipher Write able Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( key . size Ġin ĠarrayOf ( 1 6 , Ġ 2 4 , Ġ 3 2 )) Ġ{ Ġ" Key Ġmust Ġbe Ġ 1 6 , Ġ 2 4 Ġor Ġ 3 2 Ġbytes Ġ( not Ġ${ key . size }). " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Copy Ġ= ĠAl location . native Copy ( key ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( cipher , Ġiv ) Ġ= Ġwhen Ġ( cipher Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCipher Mode . CBC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġwhen Ġ( key . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 6 Ġ-> ĠEVP _ aes _ 1 2 8 _ cbc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 4 Ġ-> ĠEVP _ aes _ 1 9 2 _ cbc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 2 Ġ-> ĠEVP _ aes _ 2 5 6 _ cbc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Bad Ġkey Ġlength ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Ġ= Ġcipher Mode . iv ?. let Ġ{ Ġiv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( iv . size Ġ== Ġ 1 6 ) Ġ{ Ġ" IV Ġmust Ġbe Ġ 1 6 Ġbytes ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAl location . native Copy ( iv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher Ġto Ġiv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCipher Mode . E CB Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġwhen Ġ( key . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 6 Ġ-> ĠEVP _ aes _ 1 2 8 _ ecb () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 4 Ġ-> ĠEVP _ aes _ 1 9 2 _ ecb () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 2 Ġ-> ĠEVP _ aes _ 2 5 6 _ ecb () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Bad Ġkey Ġlength ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġiv . use OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠEVP _ CIPHER _ CTX _ new () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Function ( ctx , Ġcipher , Ġnull , Ġkey Copy . memory . pointer . reinterpret (), Ġiv ?. memory ?. pointer ?. reinterpret ()). require Open SSL Success ( init FunctionName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfactory ( ctx , Ġkey Copy , Ġoutput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġactual Ġfun Ġencrypt ( mode : ĠCipher Mode , Ġkey : ĠRead Memory , Ġoutput : ĠWrite able ): ĠCipher Write able Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Cipher ( mode , Ġkey , Ġoutput , Ġ:: E VP _ Encrypt Init _ ex , Ġ" E VP _ Encrypt Init _ ex ", Ġ:: Linux Cipher Encrypt Write able ) ĊĊĠĠĠ Ġpublic Ġactual Ġfun Ġdecrypt ( mode : ĠCipher Mode , Ġkey : ĠRead Memory , Ġoutput : ĠWrite able ): ĠCipher Write able Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Cipher ( mode , Ġkey , Ġoutput , Ġ:: E VP _ Decrypt Init _ ex , Ġ" E VP _ Decrypt Init _ ex ", Ġ:: Linux Cipher Decrypt Write able ) Ċ } Ċ