package Ġio . pro venance . scope . examples . app . utils Ċ Ċ import Ġio . pro venance . scope . encryption . crypto . Signer Impl Ċ import Ġio . pro venance . scope . object store . util . base 6 4 Decode Ċ import Ġorg . bouncycastle . j ca j ce . provider . as ymmetric . ec . B CE CP ublic Key Ċ import Ġorg . ke thereum . crypto . CUR VE Ċ import Ġorg . ke thereum . crypto . api . ec . EC DS AS ign ature Ċ import Ġorg . ke thereum . crypto . impl . ec . canonical ise Ċ import Ġjava . math . BigInteger Ċ import Ġkotlin . experimental . and Ċ Ċ // ĠNOTE : Ċ // ĠThis Ġwhole Ġnamespace Ġwould Ġnot Ġbe Ġneeded Ġonce Ġthe Ġpro venance Ġh dw allet Ġis Ġready . Ċ Ċ data Ġclass ĠStd Signature ( ĊĠĠĠ Ġval Ġpub _ key : ĠStd PubKey , ĊĠĠĠ Ġval Ġsignature : ĠByteArray , Ċ ) Ċ Ċ data Ġclass ĠStd PubKey ( ĊĠĠĠ Ġval Ġtype : ĠString , ĊĠĠĠ Ġval Ġvalue : ĠByteArray , Ċ ) Ċ Ċ fun ĠBigInteger . get Unsigned Bytes (): ĠByteArray Ġ{ ĊĠĠĠ Ġval Ġbytes Ġ= Ġthis . toByteArray () ĊĊĠĠĠ Ġif Ġ( bytes [ 0 ] Ġ== Ġ 0 x 0 . to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbytes . drop ( 1 ). toByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġbytes Ċ } Ċ Ċ /** Ċ Ġ* Ġencode As BTC Ġreturns Ġthe ĠE CD SA Ġsignature Ġas Ġa ĠByteArray Ġof Ġr Ġ|| Ġs , Ċ Ġ* Ġwhere Ġboth Ġr Ġand Ġs Ġare Ġencoded Ġinto Ġ 3 2 Ġbyte Ġbig Ġendian Ġintegers . Ċ Ġ*/ Ċ fun ĠEC DS AS ign ature . encode As BTC (): ĠByteArray Ġ{ ĊĠĠĠ Ġ// ĠCan onical ize Ġ- ĠIn Ġorder Ġto Ġremove Ġm alle ability , ĊĠĠĠ Ġ// Ġwe Ġset Ġs Ġ= Ġcurve _ order Ġ- Ġs , Ġif Ġs Ġis Ġgreater Ġthan Ġcurve . Order () Ġ/ Ġ 2 . ĊĠĠĠ Ġvar Ġsig S Ġ= Ġthis . s ĊĠĠĠ Ġval ĠHAL F _ CUR VE _ ORDER Ġ= ĠCUR VE . n . shift Right ( 1 ) ĊĠĠĠ Ġif Ġ( sig S Ġ> ĠHAL F _ CUR VE _ ORDER ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsig S Ġ= ĠCUR VE . n . subtract ( sig S ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġs Bytes Ġ= Ġsig S . get Unsigned Bytes () ĊĠĠĠ Ġval Ġr Bytes Ġ= Ġthis . r . get Unsigned Bytes () ĊĊĠĠĠ Ġrequire ( r Bytes . size Ġ<= Ġ 3 2 ) Ġ{ Ġ" cannot Ġencode Ġr Ġinto ĠBTC ĠFormat , Ġsize Ġoverflow Ġ(${ r Bytes . size } Ġ> Ġ 3 2 )" Ġ} ĊĠĠĠ Ġrequire ( s Bytes . size Ġ<= Ġ 3 2 ) Ġ{ Ġ" cannot Ġencode Ġs Ġinto ĠBTC ĠFormat , Ġsize Ġoverflow Ġ(${ s Bytes . size } Ġ> Ġ 3 2 )" Ġ} ĊĊĠĠĠ Ġval Ġsignature Ġ= ĠByteArray ( 6 4 ) ĊĠĠĠ Ġ// Ġ 0 Ġpad Ġthe Ġbyte Ġarrays Ġfrom Ġthe Ġleft Ġif Ġthey Ġaren 't Ġbig Ġenough . ĊĠĠĠ ĠSystem . arraycopy ( r Bytes , Ġ 0 , Ġsignature , Ġ 3 2 Ġ- Ġr Bytes . size , Ġr Bytes . size ) ĊĠĠĠ ĠSystem . arraycopy ( s Bytes , Ġ 0 , Ġsignature , Ġ 6 4 Ġ- Ġs Bytes . size , Ġs Bytes . size ) ĊĊĠĠĠ Ġreturn Ġsignature Ċ } Ċ Ċ type alias ĠSign er Fn Ġ= Ġ( ByteArray ) Ġ-> ĠList < Std Signature > Ċ object ĠP b Signer Ġ{ ĊĠĠĠ Ġfun Ġsigner For ( signer : ĠSign er Impl ): ĠSign er Fn Ġ= Ġ{ Ġbytes Ġ-> ĊĠĠĠĠĠĠĠ ĠStd Signature ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpub _ key Ġ= ĠStd PubKey (" tender mint / PubKey Sec p 2 5 6 k 1 ", Ġ( signer . get PublicKey () Ġas ĠB CE CP ublic Key ). q . get Encoded ( true )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Ġ= Ġsigner . sign ( bytes ). signature . base 6 4 Decode (). to EC DS AS ign ature ( true ). encode As BTC () ĊĠĠĠĠĠĠĠ Ġ). let Ġ{ ĠlistOf ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠByteArray . extract R And S (): ĠPair < BigInteger , ĠBigInteger > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart R Ġ= Ġif Ġ( this [ 1 ] Ġand Ġ 0 x 8 0 . to Byte () Ġ!= Ġ 0 . to Byte ()) Ġ 3 Ġelse Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġlength R Ġ= Ġthis [ start R Ġ+ Ġ 1 ]. toInt () ĊĠĠĠĠĠĠĠ Ġval Ġstart S Ġ= Ġstart R Ġ+ Ġ 2 Ġ+ Ġlength R ĊĠĠĠĠĠĠĠ Ġval Ġlength S Ġ= Ġthis [ start S Ġ+ Ġ 1 ]. toInt () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBigInteger ( this , Ġstart R Ġ+ Ġ 2 , Ġlength R ) Ġto ĠBigInteger ( this , Ġstart S Ġ+ Ġ 2 , Ġlength S ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠByteArray . to EC DS AS ign ature ( canonical : ĠBoolean ) Ġ= Ġextract R And S (). let Ġ{ Ġ( r , Ġs ) Ġ-> ĊĠĠĠĠĠĠĠ ĠEC DS AS ign ature ( r , Ġs ) ĊĠĠĠ Ġ}. let Ġ{ Ġif Ġ( canonical ) Ġ{ Ġit . canonical ise () Ġ} Ġelse Ġ{ Ġit Ġ} Ġ} Ċ } Ċ