package Ġpw . bin om . crypto Ċ Ċ import Ġkotlinx . c interop .* Ċ import Ġplatform . openssl .* Ċ import Ġpw . bin om . ByteBuffer Ċ import Ġpw . bin om . io . Message Digest Ċ Ċ abstract Ġclass ĠOpenSSL Message Digest Ġ: ĠMessage Digest Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġptr : ĠC Pointer < E VP _ MD _ CTX >? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcreate E vp (): ĠC Pointer < E VP _ MD > ĊĠĠĠ Ġprotected Ġabstract Ġval Ġfinal ByteArray Size : Int ĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ptr Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEVP _ MD _ CTX _ free ( ptr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġptr Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Init () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Init () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ptr Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġptr Ġ= ĠEVP _ MD _ CTX _ new () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEVP _ Digest Init _ ex ( ptr , Ġcreate E vp (), Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( byte : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Init () ĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġar Ġ= Ġalloc Array < U Byte Var >( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġar [ 0 ] Ġ= Ġbyte . to U Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEVP _ Digest Update ( ptr , Ġar , Ġ 1 . convert ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( input : ĠByteArray , Ġoffset : ĠInt , Ġlen : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Init () ĊĠĠĠĠĠĠĠ ĠEVP _ Digest Update ( ptr , Ġinput . ref To ( offset ), Ġlen . convert ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( buffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Init () ĊĠĠĠĠĠĠĠ Ġbuffer . ref Ġ{ Ġbuffer Ptr , Ġremaining Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEVP _ Digest Update ( ptr , Ġbuffer Ptr , Ġremaining . convert ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuffer . position Ġ= Ġbuffer . limit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfinish (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Init () ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠByteArray ( final ByteArray Size ) ĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġalloc < UInt Var >() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEVP _ Digest Final ( ptr , Ġout . ref To ( 0 ). get Pointer ( this ). reinterpret (), Ġsize . ptr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size . value Ġ!= Ġout . size . convert < UInt >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠEVP _ MD _ CTX _ free ( ptr ) ĊĠĠĠĠĠĠĠ Ġptr Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} Ċ }