package Ġde . b coding . lt c . w itness . model Ċ Ċ import Ġde . b coding . lt c . w itness . serialization . Data Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlinx . serialization . Transient Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . json . Json Configuration Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ Serializable Ċ data Ġclass ĠHash Code ( val Ġalgorithm : ĠString , Ġval Ġdata : ĠData ) Ċ Ċ val Ġjson Ġ= ĠJson ( Json Configuration . Stable ) Ċ Ċ @ Serializable Ċ data Ġclass ĠSignature ( ĊĠĠĠ Ġval ĠhashCode : ĠHash Code , ĊĠĠĠ Ġval Ġaccess Key : ĠPublicKey Ċ ) Ġ: ĠEn crypted < HashCode >( ĊĠĠĠ Ġfalse , ĊĠĠĠ ĠData ( json . stringify ( HashCode . serializer (), ĠhashCode ). toByteArray ()), ĊĠĠĠ Ġaccess Key , ĊĠĠĠ ĠHash Code :: class Ċ ) ĊĊ Ċ /** Ċ Ġ* Ġdata Ġcontains Ġa Ġserialized Ġversion Ġof Ġthe Ġobject Ċ Ġ*/ Ċ @ Serializable Ċ open Ġclass ĠEn crypted < OBJ Ġ: ĠAny >( ĊĠĠĠ Ġval Ġis PublicKey Encrypted : ĠBoolean , ĊĠĠĠ Ġval Ġdata : ĠData , ĊĠĠĠ Ġval ĠpublicKey : ĠPublicKey , ĊĠĠĠ Ġ@ Transient ĊĠĠĠ Ġvar Ġtype : ĠK Class < OBJ >? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġdecrypt ( key : ĠPrivate Key , Ġcrypto : ĠCrypto ): ĠOBJ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto . decrypt ( this , Ġkey ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Serializable Ċ data Ġclass ĠPublicKey ( val Ġalgorithm : ĠString , Ġval Ġkey : ĠData ) Ċ Ċ @ Serializable Ċ data Ġclass ĠPrivate Key ( val Ġalgorithm : ĠString , Ġval Ġkey : ĠData ) Ċ Ċ @ Serializable Ċ class ĠKey Pair ( ĊĠĠĠ Ġval ĠpublicKey : ĠPublicKey , ĊĠĠĠ Ġval ĠprivateKey : ĠPrivate Key Ċ ) Ċ Ċ interface ĠCrypto Ġ{ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġdecrypt ( encrypted : ĠEn crypted < T >, Ġpub Key : ĠPublicKey ): ĠT ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġdecrypt ( encrypted : ĠEn crypted < T >, Ġpub Key : ĠPrivate Key ): ĠT ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġencrypt ( pub Key : ĠPublicKey , Ġsubject : ĠT ): ĠEn crypted < T > ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġencrypt ( keys : ĠKey Pair , Ġsubject : ĠT ): ĠEn crypted < T > ĊĠĠĠ Ġfun Ġrandom String ( size : ĠInt ): ĠString ĊĠĠĠ Ġfun Ġcalculate HashCode ( document : ĠEn crypted < *> ): ĠHash Code ĊĠĠĠ Ġfun Ġcalculate HashCode ( document : ĠDocument ): ĠHash Code ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġtest ify ( subject : ĠT , Ġkeys : ĠKey Pair ): ĠTest ified < T > ĊĠĠĠ Ġfun Ġcreate KeyPair (): ĠKey Pair Ċ }