package Ġorg . echo . mobile . framework . support . crypto Ċ Ċ import Ġorg . echo . mobile . bitcoin j . Sha 2 5 6 Hash Ċ import Ġorg . echo . mobile . framework . core . crypto . internal . edd sa . signature . Ed D SA I ro ha Signature Adapter Ċ import Ġorg . echo . mobile . framework . exception . Malformed Transaction Exception Ċ import Ġorg . echo . mobile . framework . model . Transaction Ċ import Ġjava . util . ArrayList Ċ Ċ /** Ċ Ġ* ĠObject Ġused Ġto Ġtransaction ĠEd D SA Ġsigning Ċ Ġ* Ċ Ġ* Ġ@ author ĠD aria ĠP ech kov sk aya Ċ Ġ*/ Ċ object ĠEd DS AS ign ature Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠHEADER _ BYTES Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠR _ BYTES Ġ= Ġ 3 2 ĊĠĠĠ Ġprivate Ġconst Ġval ĠS _ BYTES Ġ= Ġ 3 2 ĊĠĠĠ Ġconst Ġval ĠSIGN _ DATA _ BYTES Ġ= ĠR _ BYTES Ġ+ ĠS _ BYTES ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠHEADER _ POS Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠR _ BYTES _ POS Ġ= ĠHEADER _ POS Ġ+ ĠHEADER _ BYTES ĊĠĠĠ Ġprivate Ġconst Ġval ĠS _ BYTES _ POS Ġ= ĠR _ BYTES _ POS Ġ+ ĠR _ BYTES ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠCHECK ING _ BYTE Ġ= Ġ 0 x 8 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOb t ains Ġa Ġsignature Ġof Ġtransaction . ĠPlease Ġnote Ġthat Ġdue Ġto Ġthe Ġfact Ġthat Ġit Ġuses ĊĠĠĠĠ Ġ* Ġdeterministic ĠEd D SA Ġsignatures , Ġwe Ġare Ġslightly Ġmodifying Ġthe Ġexpiration Ġtime Ġof ĊĠĠĠĠ Ġ* Ġthe Ġtransaction Ġwhile Ġwe Ġlook Ġfor Ġa Ġsignature Ġthat Ġwill Ġbe Ġaccepted Ġby ĊĠĠĠĠ Ġ* Ġthe Ġgraph ene Ġnetwork . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġshould Ġthen Ġbe Ġcalled Ġbefore Ġany Ġother Ġserialization Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return : ĠA Ġvalid Ġsignature Ġof Ġthe Ġtransaction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġsign Transaction ( transaction : ĠTransaction ): ĠArrayList < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Private Keys ( transaction ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Graph ene Canonical Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġsignatures Ġ= ĠArrayList < ByteArray >() ĊĊĠĠĠĠĠĠĠ Ġval Ġsignature Adapter Ġ= ĠEd D SA I ro ha Signature Adapter () ĊĊĠĠĠĠĠĠĠ Ġvar Ġsig Data : ĠByteArray ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! is Graph ene Canonical ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignatures . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserialized Transaction Ġ= Ġtransaction . to Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= ĠSh a 2 5 6 Hash . wrap ( Sha 2 5 6 Hash . hash ( serialized Transaction )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( privateKey Ġin Ġtransaction . private Keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsig Data Ġ= Ġsignature Adapter . sign ( hash . bytes , ĠprivateKey ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Signature Not Valid ( sig Data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignatures . add ( sig Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( signatures . size Ġ== Ġtransaction . private Keys . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Graph ene Canonical Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ transaction . block Data . relative Expiration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsignatures ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Private Keys ( transaction : ĠTransaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( transaction . private Keys . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMal formed Transaction Exception (" Transaction Ġmust Ġhave Ġprivate Ġkey Ġfor Ġsigning .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Signature Not Valid ( sign Data : ĠByteArray ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġsign Data [ HEADER _ POS ]. toInt () Ġand ĠCHECK ING _ BYTE Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġsign Data [ HEADER _ POS ]. toInt () Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġsign Data [ R _ BYTES _ POS ]. toInt () Ġand ĠCHECK ING _ BYTE Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġsign Data [ R _ BYTES ]. toInt () Ġand ĠCHECK ING _ BYTE Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġsign Data [ S _ BYTES ]. toInt () Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġsign Data [ S _ BYTES _ POS ]. toInt () Ġand ĠCHECK ING _ BYTE Ġ!= Ġ 0 Ċ Ċ } Ċ