package Ġcom . wallet connect . wallet connect v 2 . crypto . data . repository Ċ Ċ import Ġcom . wallet connect . wallet connect v 2 . core . model . vo . PrivateKey Ċ import Ġcom . wallet connect . wallet connect v 2 . core . model . vo . PublicKey Ċ import Ġcom . wallet connect . wallet connect v 2 . core . model . vo . SecretKey Ċ import Ġcom . wallet connect . wallet connect v 2 . core . model . vo . Topic VO Ċ import Ġcom . wallet connect . wallet connect v 2 . crypto . Crypto Repository Ċ import Ġcom . wallet connect . wallet connect v 2 . crypto . KeyStore Ċ import Ġcom . wallet connect . wallet connect v 2 . util . bytes To Hex Ċ import Ġcom . wallet connect . wallet connect v 2 . util . hex ToBytes Ċ import Ġorg . bouncycastle . crypto . digest s . SHA 2 5 6 Digest Ċ import Ġorg . bouncycastle . crypto . generators . HK DF Bytes Generator Ċ import Ġorg . bouncycastle . crypto . params . HK DF Parameters Ċ import Ġorg . bouncycastle . math . ec . rfc 7 7 4 8 . X 2 5 5 1 9 Ċ import Ġjava . security . Message Digest Ċ import Ġjava . security . Secure Random Ċ import Ġjavax . crypto . Key Generator Ċ import Ġcom . wallet connect . wallet connect v 2 . core . model . vo . Key Ġas ĠWC Key Ċ Ċ internal Ġclass ĠBo unc y Castle Crypto Repository ( private Ġval Ġkey Chain : ĠKey Store ) Ġ: ĠCrypto Repository Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Symmetric Key ( topic : ĠTopic VO ): ĠSecret Key Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsymmetric Key Ġ= Ġcreate Symmetric Key (). bytes To Hex () ĊĠĠĠĠĠĠĠ Ġkey Chain . set SecretKey ( topic . value , ĠSecret Key ( symmetric Key )) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSecret Key ( symmetric Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Symmetric Key ( topic : ĠTopic VO , Ġsymmetric Key : ĠSecret Key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġkey Chain . set SecretKey ( topic . value , Ġsymmetric Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Symmetric Key ( topic : ĠTopic VO ): ĠSecret Key Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsymmetric Key Ġ= Ġkey Chain . get SecretKey ( topic . value ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSecret Key ( symmetric Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate KeyPair (): ĠPublicKey Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠByteArray ( KEY _ SIZE ) ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= ĠByteArray ( KEY _ SIZE ) ĊĠĠĠĠĠĠĠ ĠX 2 5 5 1 9 . generate PrivateKey ( Secure Random ( ByteArray ( KEY _ SIZE )), ĠprivateKey ) ĊĠĠĠĠĠĠĠ ĠX 2 5 5 1 9 . generate PublicKey ( privateKey , Ġ 0 , ĠpublicKey , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġset KeyPair ( PublicKey ( publicKey . bytes To Hex (). lowercase ()), ĠPrivate Key ( privateKey . bytes To Hex (). lowercase ())) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPublicKey ( publicKey . bytes To Hex (). lowercase ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Shared Key ( self Private : ĠPrivate Key , Ġpeer Public : ĠPublicKey ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshared Key Bytes Ġ= ĠByteArray ( KEY _ SIZE ) ĊĠĠĠĠĠĠĠ ĠX 2 5 5 1 9 . scalar Mult ( self Private . key As Hex . hex ToBytes (), Ġ 0 , Ġpeer Public . key As Hex . hex ToBytes (), Ġ 0 , Ġshared Key Bytes , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġshared Key Bytes . bytes To Hex () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Topic And Shared Key ( self : ĠPublicKey , Ġpeer : ĠPublicKey ): ĠPair < SecretKey , ĠTopic VO > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, ĠprivateKey ) Ġ= Ġget KeyPair ( self ) ĊĠĠĠĠĠĠĠ Ġval Ġshared Secret Bytes Ġ= ĠByteArray ( KEY _ SIZE ) ĊĠĠĠĠĠĠĠ ĠX 2 5 5 1 9 . scalar Mult ( privateKey . key As Hex . hex ToBytes (), Ġ 0 , Ġpeer . key As Hex . hex ToBytes (), Ġ 0 , Ġshared Secret Bytes , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġshared Secret Ġ= Ġshared Secret Bytes . bytes To Hex () ĊĠĠĠĠĠĠĠ Ġval Ġshared Key Bytes Ġ= Ġderive HK DF Key ( shared Secret ) ĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Ġ= ĠSecret Key ( shared Key Bytes . bytes To Hex ()) ĊĠĠĠĠĠĠĠ Ġval Ġtopic Ġ= ĠTopic VO ( sha 2 5 6 ( secret Key . key As Hex )) ĊĠĠĠĠĠĠĠ Ġkey Chain . set SecretKey ( topic . value . lowercase (), Ġsecret Key ) ĊĠĠĠĠĠĠĠ Ġset Key Agreement ( topic , Ġself , Ġpeer ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( secret Key , Ġtopic ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Keys ( tag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, ĠpublicKey ) Ġ= Ġkey Chain . get Keys ( tag ) ĊĠĠĠĠĠĠĠ Ġwith ( key Chain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Keys ( publicKey . lowercase ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Keys ( tag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetKey Agreement ( topic : ĠTopic VO ): ĠPair < PublicKey , ĠPublicKey > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġ"$ key Agreement Context ${ topic . value }" ĊĠĠĠĠĠĠĠ Ġval Ġ( self Public , Ġpeer Public ) Ġ= Ġkey Chain . get Keys ( tag ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( PublicKey ( self Public ), ĠPublicKey ( peer Public )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Key Agreement ( topic : ĠTopic VO , Ġself : ĠPublicKey , Ġpeer : ĠPublicKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġ"$ key Agreement Context ${ topic . value }" ĊĠĠĠĠĠĠĠ Ġkey Chain . set Keys ( tag , Ġself , Ġpeer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġset KeyPair ( publicKey : ĠPublicKey , ĠprivateKey : ĠPrivate Key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġkey Chain . set Keys ( publicKey . key As Hex , ĠpublicKey , ĠprivateKey ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget KeyPair ( wc Key : ĠWC Key ): ĠPair < PublicKey , ĠPrivate Key > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( publicKey Hex , ĠprivateKey Hex ) Ġ= Ġkey Chain . get Keys ( wc Key . key As Hex ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( PublicKey ( publicKey Hex ), ĠPrivate Key ( privateKey Hex )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Symmetric Key (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Generator : ĠKey Generator Ġ= ĠKey Generator . getInstance ( AES ) ĊĠĠĠĠĠĠĠ Ġkey Generator . init ( SYM _ KEY _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkey Generator . generate Key (). encoded ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsha 2 5 6 ( key : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Digest : ĠMessage Digest Ġ= ĠMessage Digest . getInstance ( SHA _ 2 5 6 ) ĊĠĠĠĠĠĠĠ Ġval Ġhashed Bytes : ĠByteArray Ġ= Ġmessage Digest . digest ( key . hex ToBytes ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhashed Bytes . bytes To Hex () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġderive HK DF Key ( shared Secret : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġh k df Ġ= ĠH K DF Bytes Generator ( SHA 2 5 6 Digest ()) ĊĠĠĠĠĠĠĠ Ġval Ġinput Key Material Ġ= Ġshared Secret . hex ToBytes () ĊĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= ĠByteArray ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠByteArray ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġh k df Parameters Ġ= ĠH K DF Parameters ( input Key Material , Ġsalt , Ġinfo ) ĊĠĠĠĠĠĠĠ Ġval Ġderived Key Ġ= ĠByteArray ( KEY _ SIZE ) ĊĠĠĠĠĠĠĠ Ġh k df . init ( hk df Parameters ) ĊĠĠĠĠĠĠĠ Ġh k df . generate Bytes ( derived Key , Ġ 0 , ĠKEY _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġderived Key ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ SIZE : ĠInt Ġ= Ġ 3 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSYM _ KEY _ SIZE : ĠInt Ġ= Ġ 2 5 6 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSHA _ 2 5 6 : ĠString Ġ= Ġ" SHA - 2 5 6 " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAES : ĠString Ġ= Ġ" AES " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġkey Agreement Context Ġ= Ġ" key _ agreement /" ĊĠĠĠ Ġ} Ċ }