package Ġno . nav . f amil ie . ef . mot tak . encryption Ċ Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . persistence . Attribute Converter Ċ import Ġkotlin . random . Random ĊĊ Ċ abstract Ġclass ĠAbstract Crypto Converter < T > Ġ: ĠAttribute Converter < T , ĠByteArray > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcipher Initializer Ġ= ĠCipher Initializer () ĊĊĠĠĠ Ġabstract Ġfun ĠbyteArray To Entity Attribute ( db Data : ĠByteArray ?): ĠT ĊĊĠĠĠ Ġabstract Ġfun Ġentity Attribute To ByteArray ( attribute : ĠT ): ĠByteArray ? ĊĊĠĠĠ Ġoverride Ġfun ĠconvertTo Database Column ( attribute : ĠT ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Key Property . DATABASE _ ENCRYPT ION _ KEY . isNotEmpty () Ġ&& Ġattribute Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġencrypt ( attribute ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġentity Attribute To ByteArray ( attribute ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠconvertTo Entity Attribute ( db Data : ĠByteArray ?): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Key Property . DATABASE _ ENCRYPT ION _ KEY . isNotEmpty () Ġ&& Ġdb Data Ġ!= Ġnull Ġ&& Ġdb Data . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdecrypt ( db Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠbyteArray To Entity Attribute ( db Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġencrypt ( attribute : ĠT ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġcipher Initializer . prepare Cipher () ĊĠĠĠĠĠĠĠ Ġval Ġbytes To Encrypt Ġ= Ġentity Attribute To ByteArray ( attribute ) ĊĠĠĠĠĠĠĠ Ġval Ġinitialization Vector Ġ= ĠRandom . next Bytes ( cipher . block Size ) ĊĠĠĠĠĠĠĠ Ġcipher Initializer . init Cipher ( cipher , ĠCipher . ENCRYPT _ MODE , Ġinitialization Vector ) ĊĠĠĠĠĠĠĠ Ġval Ġencrypted Bytes Ġ= Ġcipher . do Final ( bytes To Encrypt ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcipher . iv Ġ+ Ġencrypted Bytes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecrypt ( iv And Encrypted Bytes : ĠByteArray ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġcipher Initializer . prepare Cipher () ĊĠĠĠĠĠĠĠ Ġval Ġinitialization Vector Ġ= Ġiv And Encrypted Bytes . copyOf Range ( 0 , Ġcipher . block Size ) ĊĠĠĠĠĠĠĠ Ġval Ġencrypted Bytes Ġ= Ġiv And Encrypted Bytes . copyOf Range ( cipher . block Size , Ġiv And Encrypted Bytes . size ) ĊĠĠĠĠĠĠĠ Ġcipher Initializer . init Cipher ( cipher , ĠCipher . DE CRYPT _ MODE , Ġinitialization Vector ) ĊĠĠĠĠĠĠĠ Ġval Ġdecrypted Bytes Ġ= Ġcipher . do Final ( encrypted Bytes ) ĊĠĠĠĠĠĠĠ Ġreturn ĠbyteArray To Entity Attribute ( de crypted Bytes ) ĊĠĠĠ Ġ} Ċ } Ċ