package Ġcom . en ec uum . lib Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġcom . en ec uum . lib . api . Leader Beacon Data M Block Tx Ċ import Ġorg . bouncycastle . math . ec . ECC ur ve Ċ import Ġorg . bouncycastle . math . ec . EC Point Ċ import Ġorg . bouncycastle . util . en coders . Hex Ċ import Ġorg . sp ong ycastle . j ca j ce . provider . as ymmetric . ec . B CE CP rivate Key Ċ import Ġorg . sp ong ycastle . j ca j ce . provider . as ymmetric . ec . B CE CP ublic Key Ċ import Ġorg . sp ong ycastle . j ce . EC Named Curve Table Ċ import Ġorg . sp ong ycastle . j ce . spec . E CP rivate KeySpec Ċ import Ġorg . sp ong ycastle . j ce . spec . E CP ublic KeySpec Ċ import Ġjava . math . BigInteger Ċ import Ġjava . security .* Ċ import Ġjava . security . spec . EC Gen Parameter Spec Ċ import Ġjava . security . spec . X 5 0 9 Encoded KeySpec Ċ import Ġjava . util .* Ċ Ċ object ĠS age Sign Ġ{ ĊĠĠĠ Ġfun Ġverify ( ĊĠĠĠĠĠĠĠ Ġk blocks _ hash : ĠString , ĊĠĠĠĠĠĠĠ Ġm _ hash : ĠString , ĊĠĠĠĠĠĠĠ Ġleader _ id : ĠString , ĊĠĠĠĠĠĠĠ Ġnonce : ĠLong , ĊĠĠĠĠĠĠĠ Ġs 1 x : ĠBigInteger , ĊĠĠĠĠĠĠĠ Ġs 1 y : ĠBigInteger , ĊĠĠĠĠĠĠĠ Ġs 2 x : ĠBigInteger , ĊĠĠĠĠĠĠĠ Ġs 2 y : ĠBigInteger ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġprepare Q and H ( k blocks _ hash , Ġm _ hash , Ġleader _ id , Ġnonce ) ĊĠĠĠĠĠĠĠ Ġval ĠQ Ġ= Ġpair . first ĊĠĠĠĠĠĠĠ Ġval ĠH Ġ= Ġpair . second ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠBigInteger . valueOf ( calc ( 2 4 7 , Ġ 9 7 6 )) ĊĠĠĠĠĠĠĠ Ġval ĠE Ġ= ĠE CC ur ve . Fp ( p , ĠBigInteger . valueOf ( calc ( 1 3 , Ġ 1 2 )), ĠBigInteger . valueOf ( calc ( 7 4 1 , Ġ 2 3 7 ))) ĊĠĠĠĠĠĠĠ Ġval ĠS Ġ= ĠE . create Point ( BigInteger . valueOf ( 0 ), ĠBigInteger . valueOf ( calc ( 5 1 2 , Ġ 1 0 ))). normalize () ĊĠĠĠĠĠĠĠ Ġval ĠS 1 Ġ= ĠE . create Point ( s 1 x , Ġs 1 y ). normalize () ĊĠĠĠĠĠĠĠ Ġval ĠS 2 Ġ= ĠE . create Point ( s 2 x , Ġs 2 y ). normalize () ĊĠĠĠĠĠĠĠ Ġval ĠM PK Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠE . create Point ( BigInteger . valueOf ( calc ( 3 8 1 , Ġ 1 3 1 )), ĠBigInteger . valueOf ( calc ( 4 7 6 , Ġ 3 8 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. normalize () ĊĠĠĠĠĠĠĠ Ġval ĠG 0 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠE . create Point ( BigInteger . valueOf ( calc ( 1 1 5 , Ġ 8 5 7 )), ĠBigInteger . valueOf ( calc ( 2 1 3 , Ġ 5 8 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. normalize () ĊĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" Q =${ Q . normalize (). x Coord }:${ Q . normalize (). y Coord }") ĊĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" H =${ H . normalize (). x Coord }:${ H . normalize (). y Coord }") ĊĊĠĠĠĠĠĠĠ Ġval Ġr 1 Ġ= Ġwe il Pair ing ( G 0 . normalize (), ĠS 2 !!. normalize (), ĠS . normalize ()) ĊĠĠĠĠĠĠĠ Ġval Ġb 1 Ġ= Ġwe il Pair ing ( MP K . normalize (), ĠQ . normalize (), ĠS . normalize ()) ĊĠĠĠĠĠĠĠ Ġval Ġc 1 Ġ= Ġwe il Pair ing ( S 1 . normalize (), ĠH . normalize (), ĠS . normalize ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġb 1 c 1 Ġ= Ġ( b 1 Ġ* Ġc 1 ). mod ( p ) ĊĊĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" Verified : Ġ${ r 1 Ġ== Ġb 1 c 1 }") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġr 1 Ġ== Ġb 1 c 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Keys (): ĠGenerated Data Ġ{ ĊĠĠĠĠĠĠĠ ĠSecurity . insert Provider At ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . sp ong ycastle . j ce . provider . Bo unc y Castle Provider () Ġas ĠProvider ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Gen Ġ= ĠKey Pair Generator . getInstance (" ECD SA ", Ġ" SC ") ĊĠĠĠĠĠĠĠ Ġval Ġec Spec Ġ= ĠEC Gen Parameter Spec (" secp 2 5 6 k 1 ") ĊĠĠĠĠĠĠĠ Ġkey Gen . initialize ( ec Spec , ĠSecure Random ()) ĊĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġkey Gen . generate KeyPair () ĊĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġpair . private . toString ()) ĊĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġpair . public . toString ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠÐļ Ð¾Ð½ Ð²ÐµÑĢ ÑĤ Ð°ÑĨÐ¸Ñı ĠÐ¾ÑĤ Ðº ÑĢÑĭ ÑĤ Ð¾Ð³Ð¾ ĠÐº Ð»ÑİÑĩ Ð° ĠÐ² ĠÐ¿ Ð¾Ð½ ÑıÑĤ Ð½ÑĭÐ¹ ĠÑĦ Ð¾ÑĢÐ¼ Ð°ÑĤ ĊĠĠĠĠĠĠĠ Ġval Ġe pub Ġ= Ġpair . public Ġas ĠB CE CP ublic Key ĊĠĠĠĠĠĠĠ Ġval Ġpt Ġ= Ġe pub . q ĊĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Custom Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompress PubKey ( pt . affine X Coord . to BigInteger (), Ġpt . affine Y Coord . to BigInteger ()) ĊĊĠĠĠĠĠĠĠ Ġ// do Ġnot Ġuse Ġto ByteArray () Ġinstead Ġof ĠtoString ( radix ) Ġas Ġit Ġapp ends Ġsign Ġbit ĊĠĠĠĠĠĠĠ Ġval Ġsecret Ġ= Ġ( pair . private Ġas ĠB CE CP rivate Key ). d . toString ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġreturn ĠGenerated Data ( secret , ĠpublicKey Custom , ĠHex . to HexString ( pair . public . encoded )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconvert Secret ( private As D : ĠString ): ĠPrivate Key Ġ{ ĊĠĠĠĠĠĠĠ ĠSecurity . insert Provider At ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . sp ong ycastle . j ce . provider . Bo unc y Castle Provider () Ġas ĠProvider ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Factory Ġ= ĠKey Factory . getInstance (" ECD SA ", Ġ" SC ") ĊĠĠĠĠĠĠĠ Ġval Ġec Spec Ġ= ĠEC Named Curve Table . getParameter Spec (" secp 2 5 6 k 1 ") ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Spec Ġ= ĠE CP rivate KeySpec ( BigInteger ( private As D , Ġ 1 6 ), Ġec Spec ) ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Factory . generate Private ( privateKey Spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġretrieve PublicKey ( privateKey : ĠString ): ĠGenerated Data Ġ{ ĊĠĠĠĠĠĠĠ ĠSecurity . insert Provider At ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . sp ong ycastle . j ce . provider . Bo unc y Castle Provider () Ġas ĠProvider ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Factory Ġ= ĠKey Factory . getInstance (" ECD SA ", Ġ" SC ") ĊĠĠĠĠĠĠĠ Ġval Ġec Spec Ġ= ĠEC Named Curve Table . getParameter Spec (" secp 2 5 6 k 1 ") ĊĠĠĠĠĠĠĠ Ġval ĠQ Ġ= Ġec Spec . g . multiply ( BigInteger ( privateKey , Ġ 1 6 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġpub Spec Ġ= ĠE CP ublic KeySpec ( Q , Ġec Spec ) ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Generated Ġ= Ġkey Factory . generate Public ( pub Spec ) ĊĊĠĠĠĠĠĠĠ Ġval Ġe pub Ġ= ĠpublicKey Generated Ġas ĠB CE CP ublic Key ĊĠĠĠĠĠĠĠ Ġval Ġpt Ġ= Ġe pub . q ĊĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Custom Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompress PubKey ( pt . affine X Coord . to BigInteger (), Ġpt . affine Y Coord . to BigInteger ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGenerated Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprivateKey , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Custom , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHex . to HexString ( publicKey Generated . encoded ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠÐ¢ Ð¸Ð¿ Ð¸Ñĩ Ð½Ð°Ñı ĠÐ³ ÐµÐ½ ÐµÑĢ Ð°ÑĨÐ¸Ñı ĠÐº Ð»ÑİÑĩ ÐµÐ¹ , Ġbo unc ycastle ĠÐ²ÑĭÐ± ÑĢÐ°Ð½ ĠÐ² ĠÐº Ð°Ñĩ ÐµÑģÑĤÐ² Ðµ ĠÐ¿ÑĢ Ð¾Ð² Ð°Ð¹ Ð´ ÐµÑĢÐ° ĊĠĠĠ Ġfun Ġsign ( context : ĠContext , Ġmessage : ĠByteArray ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠÐŁ Ð¾ÑģÑĤ Ð°Ð½ Ð¾Ð² ÐºÐ° ĠÐ¿Ð¾Ð´ Ð¿Ð¸Ñģ Ð¸ ĊĠĠĠĠĠĠĠ ĠSecurity . insert Provider At ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . sp ong ycastle . j ce . provider . Bo unc y Castle Provider () Ġas ĠProvider ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Data Ġ= Ġhex StringTo ByteArray ( KeyStore . sign Key ( context )) ĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= ĠX 5 0 9 Encoded KeySpec ( publicKey Data ) ĊĠĠĠĠĠĠĠ Ġval Ġk f Ġ= ĠKey Factory . getInstance (" EC ") ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġk f . generate Public ( spec ) ĊĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Data Ġ= ĠKey Store . secret Key ( context ) ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġconvert Secret ( privateKey Data ) ĊĊĠĠĠĠĠĠĠ Ġval Ġe cd sa Sign Ġ= ĠSignature . getInstance (" SHA 2 5 6 with ECD SA ", Ġ" SC ") ĊĠĠĠĠĠĠĠ Ġe cd sa Sign . init Sign ( privateKey ) ĊĠĠĠĠĠĠĠ Ġe cd sa Sign . update ( message ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠÐŁ Ð¾Ð´ Ð¿Ð¸Ñģ ÑĮ ĊĠĠĠĠĠĠĠ Ġval Ġsigned Ġ= Ġe cd sa Sign . sign () ĊĠĠĠĠĠĠĠ Ġval Ġsigned Hex Ġ= ĠHex . to HexString ( signed ) ĊĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" Sign : Ġ$ signed Hex ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠÐŁ ÑĢ Ð¾ÑģÑĤ Ð¾ ĠÐ¿ÑĢ Ð¾Ð²ÐµÑĢ ÐºÐ° ĠÐ¿Ð¾Ð´ Ð¿Ð¸Ñģ Ð¸ ĊĠĠĠĠĠĠĠ Ġe cd sa Sign . init Verify ( publicKey ) ĊĠĠĠĠĠĠĠ Ġe cd sa Sign . update ( message ) ĊĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġe cd sa Sign . verify ( signed ). toString ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsigned Hex ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconstruct T xs Hash ( tx s : ĠList < Leader Beacon Data M Block Tx >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġt xs Hash Ġ= ĠArrayList < String >() ĊĊĠĠĠĠĠĠĠ Ġt xs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" amount ", Ġit . amount . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" data ", Ġit . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" from ", Ġit . from ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" nonce ", Ġit . nonce . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" sign ", Ġit . sign ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" ticker ", Ġit . ticker ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" to ", Ġit . to ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CONCAT _ STR ", Ġit . amount . toString () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . data Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . from Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . nonce . toString () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . sign Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . ticker Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems List Ġ= Ġarray ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . amount . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . from , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . nonce . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . sign , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . ticker , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitems Hash Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems List . forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Hash Ġ+= Ġget Sha 2 5 6 ( item . toLowerCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġt xs Hash . add ( get Sha 2 5 6 ( items Hash )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġt xs Hash . sort () ĊĠĠĠĠĠĠĠ Ġvar Ġt xs Hash String Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġt xs Hash . forEach Ġ{ Ġt xs Hash String Ġ+= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget Sha 2 5 6 ( tx s Hash String ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sha 2 5 6 ( message : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= ĠMessage Digest . getInstance (" SHA - 2 5 6 ") ĊĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġdigest . digest ( message . toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠHex . to HexString ( hash ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompress PubKey ( x : ĠBigInteger , Ġy : ĠBigInteger ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpub Key Y Prefix Ġ= Ġif Ġ( y . test Bit ( 0 )) Ġ" 0 3 " Ġelse Ġ" 0 2 " ĊĠĠĠĠĠĠĠ Ġval Ġpub Key Hex Ġ= Ġadjust To 6 4 ( x . toString ( 1 6 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġpub Key Y Prefix Ġ+ Ġpub Key Hex ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhex StringTo ByteArray ( s : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠByteArray ( s . length Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdata . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( Character . digit ( s [ i Ġ* Ġ 2 ], Ġ 1 6 ) Ġshl Ġ 4 ) Ġ+ ĠCharacter . digit ( s [ i Ġ* Ġ 2 Ġ+ Ġ 1 ], Ġ 1 6 )). to Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠÐĴ ÑģÐ¿ Ð¾Ð¼ Ð¾Ð³ Ð°ÑĤÐµÐ»ÑĮ Ð½Ð°Ñı ĠÑĦÑĥÐ½Ðº ÑĨÐ¸Ñı ĠÐ´Ð»Ñı ĠÐ²ÐµÑĢ Ð½Ð¾Ð³Ð¾ ĠÑĦ Ð¾ÑĢÐ¼ Ð°ÑĤÐ° ĠÐº Ð»ÑİÑĩ Ð° ĊĠĠĠ Ġprivate Ġfun Ġadjust To 6 4 ( s : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( s . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 6 2 Ġ-> Ġ" 0 0 $ s " ĊĠĠĠĠĠĠĠĠĠĠĠĠ 6 3 Ġ-> Ġ" 0 $ s " ĊĠĠĠĠĠĠĠĠĠĠĠĠ 6 4 Ġ-> Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" not Ġa Ġvalid Ġkey : Ġ$ s ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc ( a : ĠLong , Ġb : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġmid Ġ= Ġa . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġ 5 1 2 ĊĠĠĠĠĠĠĠ Ġval Ġlength Left Ġ= Ġmid Ġ- Ġa . toInt () Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġlength Right Ġ= Ġarray . size ĊĊĠĠĠĠĠĠĠ Ġif Ġ((( a Ġ+ Ġb ) Ġ>= Ġ 0 ) Ġ|| Ġ(( a Ġ- Ġb ) Ġ<= Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġa Ġ+ Ġb ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Array Ġ= ĠInt Array ( length Left ) ĊĠĠĠĠĠĠĠ Ġval Ġright Array Ġ= ĠInt Array ( length Right ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength Left ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Array [ i ] Ġ= Ġarray [ left Ġ+ Ġi ] ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength Right ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Array [ i ] Ġ= Ġarray [ mid Ġ+ Ġi Ġ+ Ġ 1 ] ĊĊĠĠĠĠĠĠĠ Ġvar Ġleft Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġright Index Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġleft Ġuntil Ġright Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Index Ġ< Ġlength Left Ġ&& Ġright Index Ġ< Ġlength Right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Array [ left Index ] Ġ< Ġright Array [ right Index ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i ] Ġ= Ġleft Array [ left Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i ] Ġ= Ġright Array [ right Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( left Index Ġ< Ġlength Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i ] Ġ= Ġleft Array [ left Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( right Index Ġ< Ġlength Right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i ] Ġ= Ġright Array [ right Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmid . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Q and H ( ĊĠĠĠĠĠĠĠ Ġk blocks _ hash : ĠString , ĊĠĠĠĠĠĠĠ Ġm _ hash : ĠString , ĊĠĠĠĠĠĠĠ Ġleader _ id : ĠString , ĊĠĠĠĠĠĠĠ Ġnonce : ĠLong ĊĠĠĠ Ġ): ĠPair < EC Point , ĠEC Point > Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" pre paring ĠQ Ġand ĠH ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" k Hash : Ġk blocks _ hash ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" m Hash : Ġ$ m _ hash ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" leader Id : Ġ$ leader _ id ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" sha 2 5 6 ĠQ Ġparam : Ġ$ k blocks _ hash $ leader _ id ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" sha 2 5 6 ĠH Ġparam : Ġ$ m _ hash $ leader _ id ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" sha 2 5 6 ĠQ : Ġ${ get Sha 2 5 6 ("$ k blocks _ hash $ leader _ id "). substring ( 0 , Ġ 5 )} ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" sha 2 5 6 ĠH : Ġ${ get Sha 2 5 6 ("$ m _ hash $ leader _ id "). substring ( 0 , Ġ 5 )} ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" multiplier ĠQ : Ġ${ BigInteger ( get Sha 2 5 6 ("$ k blocks _ hash $ leader _ id "). substring ( 0 , Ġ 5 ), Ġ 1 6 )} ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" multiplier ĠH : Ġ${ BigInteger ( get Sha 2 5 6 ("$ m _ hash $ leader _ id "). substring ( 0 , Ġ 5 ), Ġ 1 6 )} ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" G Ġ= Ġ${ G . normalize (). x Coord }:${ G . normalize (). y Coord }") ĊĠĠĠĠĠĠĠ Ġval ĠE Ġ= ĠE CC ur ve . Fp ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger . valueOf ( calc ( 7 2 2 , Ġ 5 0 1 )), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger . valueOf ( calc ( 9 , Ġ 1 6 )), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger . valueOf ( calc ( 4 7 , Ġ 9 3 1 )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠG Ġ= ĠE . create Point ( BigInteger . valueOf ( calc ( 9 1 , Ġ 1 0 6 7 )), ĠBigInteger . valueOf ( calc ( 9 1 , Ġ 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. normalize () ĊĊĠĠĠĠĠĠĠ Ġval ĠQ Ġ= ĠG . normalize (). multiply ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Sha 2 5 6 ("$ k blocks _ hash $ leader _ id $ nonce ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring ( 0 , Ġ 5 ), Ġ 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval ĠH Ġ= ĠG . normalize (). multiply ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Sha 2 5 6 ("$ m _ hash $ leader _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring ( 0 , Ġ 5 ), Ġ 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( H . normalize (). x Coord Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" null ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" Q =${ Q . normalize (). x Coord }:${ Q . normalize (). y Coord }") ĊĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" H =${ H . normalize (). x Coord }:${ H . normalize (). y Coord }") ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( Q , ĠH ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwe il Pair ing ( P : ĠEC Point , ĠQ : ĠEC Point , ĠS : ĠEC Point ): ĠBigInteger Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" we il Ġpair ing ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" P =${ P . normalize (). x Coord }:${ P . normalize (). y Coord }") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" Q =${ Q . normalize (). x Coord }:${ Q . normalize (). y Coord }") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" S =${ S . normalize (). x Coord }:${ S . normalize (). y Coord }") ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠBigInteger . valueOf ( calc ( 9 8 7 , Ġ 2 3 6 )) ĊĠĠĠĠĠĠĠ Ġval Ġn 1 Ġ= Ġeval M iller ( P . normalize (), ĠQ . add ( S . normalize ()). normalize ()). mod ( p ) ĊĠĠĠĠĠĠĠ Ġval Ġn 2 Ġ= Ġeval M iller ( P . normalize (), ĠS . normalize ()). mod ( p ) ĊĠĠĠĠĠĠĠ Ġval Ġnum Ġ= Ġ( n 1 Ġ* Ġ( n 2 . mod Inverse ( p ))). mod ( p ) ĊĊĠĠĠĠĠĠĠ Ġval Ġm 1 Ġ= Ġeval M iller ( Q . normalize (), ĠP . subtract ( S . normalize ()). normalize ()). mod ( p ) ĊĠĠĠĠĠĠĠ Ġval Ġm 2 Ġ= Ġeval M iller ( Q . normalize (), ĠS . neg ate (). normalize ()). mod ( p ) ĊĠĠĠĠĠĠĠ Ġval Ġden Ġ= Ġ( m 1 Ġ* Ġm 2 . mod Inverse ( p )). mod ( p ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( num Ġ* Ġden . mod Inverse ( p )). mod ( p ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġeval M iller ( P : ĠEC Point , ĠQ : ĠEC Point ): ĠBigInteger Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" eval Ġm iller ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" P =${ P . normalize (). x Coord }:${ P . normalize (). y Coord }") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" Q =${ Q . normalize (). x Coord }:${ Q . normalize (). y Coord }") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġm iller ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQ . normalize (). x Coord . to BigInteger (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP . normalize (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQ . normalize (). x Coord . to BigInteger (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQ . normalize (). y Coord . to BigInteger () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġm iller ( m E : ĠBigInteger , ĠP : ĠEC Point , Ġx 1 : ĠBigInteger , Ġy 1 : ĠBigInteger ): ĠBigInteger Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠBigInteger . valueOf ( calc ( 3 7 , Ġ 5 4 )). toByteArray () ĊĠĠĠĠĠĠĠ Ġval Ġbinary Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġm E Ġ+ ĠBigInteger . valueOf ( 1 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( b Ġin Ġbytes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ` val ` Ġ= Ġb . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary . append ( if Ġ(` val ` Ġand Ġ 1 2 8 Ġ== Ġ 0 ) Ġ 0 Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` val ` Ġ= Ġ` val ` Ġshl Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġbinary . toString (). drop ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġm . length ĊĠĠĠĠĠĠĠ Ġvar ĠT Ġ= ĠP . normalize () ĊĠĠĠĠĠĠĠ Ġvar Ġf Ġ= ĠBigInteger . valueOf ( 1 ) Ċ Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" m iller ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" P =${ P . normalize (). x Coord }:${ P . normalize (). y Coord }") ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠBigInteger . valueOf ( calc ( 7 6 8 , Ġ 4 5 5 )) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" T =${ T . normalize (). x Coord }:${ T . normalize (). y Coord }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg Ġ= Ġg ( T . normalize (), ĠT . normalize (), Ġx 1 , Ġy 1 ). mod ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf 2 Ġ= Ġf . pow ( 2 ). mod ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ= Ġ( f 2 Ġ* Ġg ). mod ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT Ġ= ĠT . add ( T ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġim Ġ= Ġm [ i ]. toString (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( im Ġ== Ġ 1 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" im = 1 ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" im = 1 ĠT =${ T . normalize (). x Coord }:${ T . normalize (). y Coord }") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" im = 1 ĠP =${ P . normalize (). x Coord }:${ P . normalize (). y Coord }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ= Ġ( f Ġ* Ġ( g ( T . normalize (), ĠP . normalize (), Ġx 1 , Ġy 1 ). mod ( p ))). mod ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT Ġ= ĠT . add ( P . normalize ()). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġf ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġg ( P : ĠEC Point , ĠQ : ĠEC Point , Ġx 1 : ĠBigInteger , Ġy 1 : ĠBigInteger ): ĠBigInteger Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" g ") Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" S age Sign ", Ġ" P =${ P . normalize (). x Coord }:${ P . normalize (). y Coord }\ n " Ġ+ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Q =${ Q . normalize (). x Coord }:${ Q . normalize (). y Coord }\ nx 1 =$ x 1 Ġy 1 =$ y 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠBigInteger . valueOf ( calc ( 2 4 , Ġ 1 1 9 9 )) ĊĠĠĠĠĠĠĠ Ġval Ġslope : ĠBigInteger Ġ= Ġif Ġ( P . normalize (). x Coord Ġ== ĠQ . normalize (). x Coord Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP . normalize (). y Coord . add ( Q . normalize (). y Coord ). is Zero ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( x 1 Ġ- Ġ( P . normalize (). x Coord . to BigInteger ())). mod ( p ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( P . normalize () Ġ== ĠQ . normalize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum 1 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP . normalize (). x Coord . square (). to BigInteger () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( BigInteger . valueOf ( calc ( 1 , Ġ 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( BigInteger . valueOf ( calc ( 1 8 , Ġ 7 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. mod ( p ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= ĠBigInteger . valueOf ( 2 ) Ġ* ĠP . normalize (). y Coord . to BigInteger () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġden 1 Ġ= Ġz . mod ( p ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( num 1 Ġ* Ġden 1 . mod Inverse ( p )). mod ( p ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum 2 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( P . normalize (). y Coord . to BigInteger () Ġ- ĠQ . normalize (). y Coord . to BigInteger ()). mod ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġden 2 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( P . normalize (). x Coord . to BigInteger () Ġ- ĠQ . normalize (). x Coord . to BigInteger ()). mod ( p ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( num 2 Ġ* Ġden 2 . mod Inverse ( p )). mod ( p ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġx ps lp Ġ= Ġ( x 1 Ġ- ĠP . x Coord . to BigInteger ()). mod ( p ) ĊĠĠĠĠĠĠĠ Ġx ps lp Ġ= Ġ( slope Ġ* Ġx ps lp ). mod ( p ) ĊĠĠĠĠĠĠĠ Ġval Ġy p Ġ= Ġ( y 1 Ġ- ĠP . y Coord . to BigInteger ()). mod ( p ) ĊĊĠĠĠĠĠĠĠ Ġval Ġs lp 2 Ġ= Ġslope . pow ( 2 ). mod ( p ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnum Ġ= Ġ( yp Ġ- Ġx ps lp ). mod ( p ) ĊĠĠĠĠĠĠĠ Ġval Ġden Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ((( x 1 Ġ+ ĠP . normalize (). x Coord . to BigInteger ()). mod ( p ) Ġ+ ĠQ . normalize (). x Coord . to BigInteger ()). mod ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ- Ġs lp 2 ). mod ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( num Ġ* Ġden . mod Inverse ( p )). mod ( p ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠGenerated Data ( val Ġsecret Key : ĠString , Ġval ĠpublicKey : ĠString , Ġval Ġsign Key : ĠString ) Ċ }