Skip to content

Commit

Permalink
lib: add an ethereum example implementation (#59)
Browse files Browse the repository at this point in the history
  • Loading branch information
q9f authored Apr 6, 2022
1 parent 2dc17d4 commit 5b96af3
Show file tree
Hide file tree
Showing 74 changed files with 1,025 additions and 200 deletions.
4 changes: 2 additions & 2 deletions .github/coverage/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
var data = {files:[
{"link":"run_coverage.1398bb7a/index.html","title":"run_coverage","summary_name":"run_coverage","covered_class":"lineCov","covered":"97.5","covered_lines":"275","uncovered_lines":"7","total_lines" : "282"},
{"link":"run_coverage.bc5f82c7/index.html","title":"run_coverage","summary_name":"run_coverage","covered_class":"lineCov","covered":"97.7","covered_lines":"292","uncovered_lines":"7","total_lines" : "299"},
], merged_files:[]};
var percent_low = 25;var percent_high = 75;
var header = { "command" : "run_coverage", "date" : "2022-04-06 14:26:02", "instrumented" : 282, "covered" : 275,};
var header = { "command" : "run_coverage", "date" : "2022-04-06 16:56:27", "instrumented" : 299, "covered" : 292,};
2 changes: 1 addition & 1 deletion .github/coverage/run_coverage
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ var data = {lines:[
{"lineNum":" 16","line":"include Secp256k1"},
{"lineNum":" 17","line":""},
{"lineNum":" 18","line":"# An example implementation of a `Bitcoin` account using an `Secp256k1`"},
{"lineNum":" 19","line":"# key-pair and a Bitcoin network version identifier; only for educational"},
{"lineNum":" 19","line":"# keypair and a Bitcoin network version identifier; only for educational"},
{"lineNum":" 20","line":"# purposes and should not be used in production."},
{"lineNum":" 21","line":"module Bitcoin"},
{"lineNum":" 22","line":" # The Base-58 alphabet for `Bitcoin` addresses is a Base-64 alphabet without"},
{"lineNum":" 23","line":" # `0`, `O`, `I`, and `l` to omit similar-looking letters."},
{"lineNum":" 24","line":" BASE_58 = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\""},
{"lineNum":" 25","line":""},
{"lineNum":" 26","line":" # An example implementation of a `Bitcoin` account using an `Secp256k1`"},
{"lineNum":" 27","line":" # key-pair and a Bitcoin network version identifier; only for educational"},
{"lineNum":" 27","line":" # keypair and a Bitcoin network version identifier; only for educational"},
{"lineNum":" 28","line":" # purposes and should not be used in production."},
{"lineNum":" 29","line":" class Account"},
{"lineNum":" 30","line":" # The `Secp256k1` keypair for the account."},
Expand All @@ -41,7 +41,7 @@ var data = {lines:[
{"lineNum":" 40","line":" # The private, compressed wallet-import format."},
{"lineNum":" 41","line":" getter wif_compressed : String"},
{"lineNum":" 42","line":""},
{"lineNum":" 43","line":" # Creates a Bitcoin account from a given `Secp256k1::Key` keypay and for the"},
{"lineNum":" 43","line":" # Creates a Bitcoin account from a given `Secp256k1::Key` keypair and for the"},
{"lineNum":" 44","line":" # specified network version, e.g., `00` for Bitcoin main network. It creates"},
{"lineNum":" 45","line":" # a random account if no parameters are supplied."},
{"lineNum":" 46","line":" #"},
Expand Down Expand Up @@ -140,5 +140,5 @@ var data = {lines:[
{"lineNum":" 139","line":"end"},
]};
var percent_low = 25;var percent_high = 75;
var header = { "command" : "run_coverage", "date" : "2022-04-06 14:26:02", "instrumented" : 44, "covered" : 42,};
var header = { "command" : "run_coverage", "date" : "2022-04-06 16:56:27", "instrumented" : 44, "covered" : 42,};
var merged_data = [];
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<?xml version="1.0" ?>
<!DOCTYPE coverage SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-04.dtd'>
<coverage line-rate="0.975" lines-covered="275" lines-valid="282" branch-rate="1.0" branches-covered="1.0" branches-rate="1.0" complexity="1.0" version="1.9" timestamp="1649247962">
<coverage line-rate="0.977" lines-covered="292" lines-valid="299" branch-rate="1.0" branches-covered="1.0" branches-rate="1.0" complexity="1.0" version="1.9" timestamp="1649256987">
<sources>
<source>/home/user/.opt/q9f/secp256k1.cr/src/</source>
</sources>
<packages>
<package name="run_coverage" line-rate="0.975" lines-covered="275" lines-valid="282" branch-rate="1.0" complexity="1.0">
<package name="run_coverage" line-rate="0.977" lines-covered="292" lines-valid="299" branch-rate="1.0" complexity="1.0">
<classes>
<class name="context_cr" filename="secp256k1/context.cr" branch-rate="1.0" complexity="1.0" line-rate="0.929">
<lines>
Expand Down Expand Up @@ -39,6 +39,27 @@
<line number="102" hits="1"/>
</lines>
</class>
<class name="ethereum_cr" filename="ethereum.cr" branch-rate="1.0" complexity="1.0" line-rate="1.000">
<lines>
<line number="56" hits="3"/>
<line number="57" hits="1"/>
<line number="58" hits="1"/>
<line number="62" hits="2"/>
<line number="63" hits="1"/>
<line number="64" hits="1"/>
<line number="68" hits="2"/>
<line number="69" hits="1"/>
<line number="70" hits="1"/>
<line number="71" hits="1"/>
<line number="72" hits="1"/>
<line number="73" hits="1"/>
<line number="74" hits="1"/>
<line number="75" hits="2"/>
<line number="76" hits="1"/>
<line number="78" hits="1"/>
<line number="80" hits="1"/>
</lines>
</class>
<class name="bitcoin_cr" filename="bitcoin.cr" branch-rate="1.0" complexity="1.0" line-rate="0.955">
<lines>
<line number="79" hits="7"/>
Expand Down Expand Up @@ -89,10 +110,10 @@
</class>
<class name="util_cr" filename="secp256k1/util.cr" branch-rate="1.0" complexity="1.0" line-rate="0.932">
<lines>
<line number="35" hits="6"/>
<line number="36" hits="2"/>
<line number="35" hits="10"/>
<line number="36" hits="3"/>
<line number="38" hits="1"/>
<line number="40" hits="1"/>
<line number="40" hits="2"/>
<line number="59" hits="6"/>
<line number="60" hits="2"/>
<line number="62" hits="1"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,30 +48,30 @@ var data = {lines:[
{"lineNum":" 47","line":" # # @dec=0,"},
{"lineNum":" 48","line":" # # @bin=Bytes[0]>>"},
{"lineNum":" 49","line":" # ```"},
{"lineNum":" 50","line":" def sign(key : Key, hash : Num) : Signature","class":"lineCov","hits":"2","order":"170","possible_hits":"2",},
{"lineNum":" 51","line":" k = Util.deterministic_k key.private_key, hash","class":"lineCov","hits":"1","order":"171","possible_hits":"1",},
{"lineNum":" 52","line":" hash = hash.to_big","class":"lineCov","hits":"1","order":"192","possible_hits":"1",},
{"lineNum":" 53","line":" priv = key.private_key.to_big","class":"lineCov","hits":"1","order":"193","possible_hits":"1",},
{"lineNum":" 54","line":" point = Curve.mul G, k","class":"lineCov","hits":"1","order":"194","possible_hits":"1",},
{"lineNum":" 55","line":" r = point.x.to_big % N.to_big","class":"lineCov","hits":"1","order":"196","possible_hits":"1",},
{"lineNum":" 56","line":" k_inv = Curve.mod_inv k, N","class":"lineCov","hits":"1","order":"197","possible_hits":"1",},
{"lineNum":" 57","line":" s = ((hash + r * priv) * k_inv.to_big) % N.to_big","class":"lineCov","hits":"1","order":"198","possible_hits":"1",},
{"lineNum":" 58","line":" x_mag = point.x.to_big > N.to_big","class":"lineCov","hits":"1","order":"199","possible_hits":"1",},
{"lineNum":" 59","line":" y_parity = (point.y.to_big % 2) == 0","class":"lineCov","hits":"1","order":"200","possible_hits":"1",},
{"lineNum":" 60","line":" rec_id : Int8 = -1","class":"lineCov","hits":"1","order":"201","possible_hits":"1",},
{"lineNum":" 61","line":" if !y_parity && x_mag","class":"lineCov","hits":"2","order":"202","possible_hits":"2",},
{"lineNum":" 50","line":" def sign(key : Key, hash : Num) : Signature","class":"lineCov","hits":"2","order":"190","possible_hits":"2",},
{"lineNum":" 51","line":" k = Util.deterministic_k key.private_key, hash","class":"lineCov","hits":"1","order":"191","possible_hits":"1",},
{"lineNum":" 52","line":" hash = hash.to_big","class":"lineCov","hits":"1","order":"212","possible_hits":"1",},
{"lineNum":" 53","line":" priv = key.private_key.to_big","class":"lineCov","hits":"1","order":"213","possible_hits":"1",},
{"lineNum":" 54","line":" point = Curve.mul G, k","class":"lineCov","hits":"1","order":"214","possible_hits":"1",},
{"lineNum":" 55","line":" r = point.x.to_big % N.to_big","class":"lineCov","hits":"1","order":"216","possible_hits":"1",},
{"lineNum":" 56","line":" k_inv = Curve.mod_inv k, N","class":"lineCov","hits":"1","order":"217","possible_hits":"1",},
{"lineNum":" 57","line":" s = ((hash + r * priv) * k_inv.to_big) % N.to_big","class":"lineCov","hits":"1","order":"218","possible_hits":"1",},
{"lineNum":" 58","line":" x_mag = point.x.to_big > N.to_big","class":"lineCov","hits":"1","order":"219","possible_hits":"1",},
{"lineNum":" 59","line":" y_parity = (point.y.to_big % 2) == 0","class":"lineCov","hits":"1","order":"220","possible_hits":"1",},
{"lineNum":" 60","line":" rec_id : Int8 = -1","class":"lineCov","hits":"1","order":"221","possible_hits":"1",},
{"lineNum":" 61","line":" if !y_parity && x_mag","class":"lineCov","hits":"2","order":"222","possible_hits":"2",},
{"lineNum":" 62","line":" rec_id = 3","class":"lineNoCov","hits":"0","possible_hits":"1",},
{"lineNum":" 63","line":" elsif y_parity && x_mag","class":"lineCov","hits":"2","order":"203","possible_hits":"2",},
{"lineNum":" 63","line":" elsif y_parity && x_mag","class":"lineCov","hits":"2","order":"223","possible_hits":"2",},
{"lineNum":" 64","line":" rec_id = 2","class":"lineNoCov","hits":"0","possible_hits":"1",},
{"lineNum":" 65","line":" elsif !y_parity && !x_mag","class":"lineCov","hits":"2","order":"204","possible_hits":"2",},
{"lineNum":" 66","line":" rec_id = 1","class":"lineCov","hits":"1","order":"205","possible_hits":"1",},
{"lineNum":" 65","line":" elsif !y_parity && !x_mag","class":"lineCov","hits":"2","order":"224","possible_hits":"2",},
{"lineNum":" 66","line":" rec_id = 1","class":"lineCov","hits":"1","order":"225","possible_hits":"1",},
{"lineNum":" 67","line":" else"},
{"lineNum":" 68","line":" rec_id = 0","class":"lineCov","hits":"4","order":"206","possible_hits":"4",},
{"lineNum":" 68","line":" rec_id = 0","class":"lineCov","hits":"4","order":"226","possible_hits":"4",},
{"lineNum":" 69","line":" end"},
{"lineNum":" 70","line":" r = Num.new r","class":"lineCov","hits":"1","order":"207","possible_hits":"1",},
{"lineNum":" 71","line":" s = Num.new s","class":"lineCov","hits":"1","order":"208","possible_hits":"1",},
{"lineNum":" 72","line":" v = Num.new BigInt.new rec_id","class":"lineCov","hits":"1","order":"209","possible_hits":"1",},
{"lineNum":" 73","line":" Signature.new r, s, v","class":"lineCov","hits":"1","order":"210","possible_hits":"1",},
{"lineNum":" 70","line":" r = Num.new r","class":"lineCov","hits":"1","order":"227","possible_hits":"1",},
{"lineNum":" 71","line":" s = Num.new s","class":"lineCov","hits":"1","order":"228","possible_hits":"1",},
{"lineNum":" 72","line":" v = Num.new BigInt.new rec_id","class":"lineCov","hits":"1","order":"229","possible_hits":"1",},
{"lineNum":" 73","line":" Signature.new r, s, v","class":"lineCov","hits":"1","order":"230","possible_hits":"1",},
{"lineNum":" 74","line":" end"},
{"lineNum":" 75","line":""},
{"lineNum":" 76","line":" # Verifies that a given signature for a given message hash matches"},
Expand All @@ -95,15 +95,15 @@ var data = {lines:[
{"lineNum":" 94","line":" # ctx.verify sig, hash, publ"},
{"lineNum":" 95","line":" # # => true"},
{"lineNum":" 96","line":" # ```"},
{"lineNum":" 97","line":" def verify(sig : Signature, hash : Num, publ : Point) : Bool","class":"lineCov","hits":"2","order":"215","possible_hits":"2",},
{"lineNum":" 98","line":" s_inv = Curve.mod_inv sig.s, N","class":"lineCov","hits":"1","order":"216","possible_hits":"1",},
{"lineNum":" 99","line":" p0 = Curve.mul G, (hash.to_big * s_inv.to_big) % N.to_big","class":"lineCov","hits":"1","order":"217","possible_hits":"1",},
{"lineNum":" 100","line":" p1 = Curve.mul publ, (sig.r.to_big * s_inv.to_big) % N.to_big","class":"lineCov","hits":"1","order":"218","possible_hits":"1",},
{"lineNum":" 101","line":" p = Curve.add p0, p1","class":"lineCov","hits":"1","order":"219","possible_hits":"1",},
{"lineNum":" 102","line":" sig.r.to_big === p.x.to_big","class":"lineCov","hits":"1","order":"220","possible_hits":"1",},
{"lineNum":" 97","line":" def verify(sig : Signature, hash : Num, publ : Point) : Bool","class":"lineCov","hits":"2","order":"235","possible_hits":"2",},
{"lineNum":" 98","line":" s_inv = Curve.mod_inv sig.s, N","class":"lineCov","hits":"1","order":"236","possible_hits":"1",},
{"lineNum":" 99","line":" p0 = Curve.mul G, (hash.to_big * s_inv.to_big) % N.to_big","class":"lineCov","hits":"1","order":"237","possible_hits":"1",},
{"lineNum":" 100","line":" p1 = Curve.mul publ, (sig.r.to_big * s_inv.to_big) % N.to_big","class":"lineCov","hits":"1","order":"238","possible_hits":"1",},
{"lineNum":" 101","line":" p = Curve.add p0, p1","class":"lineCov","hits":"1","order":"239","possible_hits":"1",},
{"lineNum":" 102","line":" sig.r.to_big === p.x.to_big","class":"lineCov","hits":"1","order":"240","possible_hits":"1",},
{"lineNum":" 103","line":" end"},
{"lineNum":" 104","line":"end"},
]};
var percent_low = 25;var percent_high = 75;
var header = { "command" : "run_coverage", "date" : "2022-04-06 14:26:02", "instrumented" : 28, "covered" : 26,};
var header = { "command" : "run_coverage", "date" : "2022-04-06 16:56:27", "instrumented" : 28, "covered" : 26,};
var merged_data = [];
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<?xml version="1.0" ?>
<!DOCTYPE coverage SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-04.dtd'>
<coverage line-rate="0.975" lines-covered="275" lines-valid="282" branch-rate="1.0" branches-covered="1.0" branches-rate="1.0" complexity="1.0" version="1.9" timestamp="1649247962">
<coverage line-rate="0.977" lines-covered="292" lines-valid="299" branch-rate="1.0" branches-covered="1.0" branches-rate="1.0" complexity="1.0" version="1.9" timestamp="1649256987">
<sources>
<source>/home/user/.opt/q9f/secp256k1.cr/src/</source>
</sources>
<packages>
<package name="run_coverage" line-rate="0.975" lines-covered="275" lines-valid="282" branch-rate="1.0" complexity="1.0">
<package name="run_coverage" line-rate="0.977" lines-covered="292" lines-valid="299" branch-rate="1.0" complexity="1.0">
<classes>
<class name="context_cr" filename="secp256k1/context.cr" branch-rate="1.0" complexity="1.0" line-rate="0.929">
<lines>
Expand Down Expand Up @@ -39,6 +39,27 @@
<line number="102" hits="1"/>
</lines>
</class>
<class name="ethereum_cr" filename="ethereum.cr" branch-rate="1.0" complexity="1.0" line-rate="1.000">
<lines>
<line number="56" hits="3"/>
<line number="57" hits="1"/>
<line number="58" hits="1"/>
<line number="62" hits="2"/>
<line number="63" hits="1"/>
<line number="64" hits="1"/>
<line number="68" hits="2"/>
<line number="69" hits="1"/>
<line number="70" hits="1"/>
<line number="71" hits="1"/>
<line number="72" hits="1"/>
<line number="73" hits="1"/>
<line number="74" hits="1"/>
<line number="75" hits="2"/>
<line number="76" hits="1"/>
<line number="78" hits="1"/>
<line number="80" hits="1"/>
</lines>
</class>
<class name="bitcoin_cr" filename="bitcoin.cr" branch-rate="1.0" complexity="1.0" line-rate="0.955">
<lines>
<line number="79" hits="7"/>
Expand Down Expand Up @@ -89,10 +110,10 @@
</class>
<class name="util_cr" filename="secp256k1/util.cr" branch-rate="1.0" complexity="1.0" line-rate="0.932">
<lines>
<line number="35" hits="6"/>
<line number="36" hits="2"/>
<line number="35" hits="10"/>
<line number="36" hits="3"/>
<line number="38" hits="1"/>
<line number="40" hits="1"/>
<line number="40" hits="2"/>
<line number="59" hits="6"/>
<line number="60" hits="2"/>
<line number="62" hits="1"/>
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"files": [
{"file": "/home/user/.opt/q9f/secp256k1.cr/src/secp256k1/context.cr", "percent_covered": "92.86", "covered_lines": "26", "total_lines": "28"},
{"file": "/home/user/.opt/q9f/secp256k1.cr/src/ethereum.cr", "percent_covered": "100.00", "covered_lines": "17", "total_lines": "17"},
{"file": "/home/user/.opt/q9f/secp256k1.cr/src/bitcoin.cr", "percent_covered": "95.45", "covered_lines": "42", "total_lines": "44"},
{"file": "/home/user/.opt/q9f/secp256k1.cr/src/secp256k1/util.cr", "percent_covered": "93.18", "covered_lines": "41", "total_lines": "44"},
{"file": "/home/user/.opt/q9f/secp256k1.cr/src/secp256k1/curve.cr", "percent_covered": "100.00", "covered_lines": "56", "total_lines": "56"},
Expand All @@ -10,11 +11,11 @@
{"file": "/home/user/.opt/q9f/secp256k1.cr/src/secp256k1/signature.cr", "percent_covered": "100.00", "covered_lines": "6", "total_lines": "6"},
{"file": "/home/user/.opt/q9f/secp256k1.cr/src/secp256k1.cr", "percent_covered": "100.00", "covered_lines": "5", "total_lines": "5"}
],
"percent_covered": "97.52",
"covered_lines": 275,
"total_lines": 282,
"percent_covered": "97.66",
"covered_lines": 292,
"total_lines": 299,
"percent_low": 25,
"percent_high": 75,
"command": "run_coverage",
"date": "2022-04-06 14:26:02"
"date": "2022-04-06 16:56:27"
}
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,9 @@ var data = {lines:[
{"lineNum":" 160","line":" # # @bin=Bytes[115, 131, 35, 49, 151, 157, 137, 211, 149, 145, 32, 97, 227, 65, 248, 70, 140, 251, 62, 97, 157, 160, 106, 5, 126, 74, 92, 169, 91, 185, 94, 119]>>"},
{"lineNum":" 161","line":" # ```"},
{"lineNum":" 162","line":" def mul(p : Point, s : Num | BigInt) : Point","class":"lineCov","hits":"4","order":"27","possible_hits":"4",},
{"lineNum":" 163","line":" s = s.to_big if s.is_a? Num","class":"lineCov","hits":"1","order":"195","possible_hits":"1",},
{"lineNum":" 163","line":" s = s.to_big if s.is_a? Num","class":"lineCov","hits":"1","order":"215","possible_hits":"1",},
{"lineNum":" 164","line":" if s === 0 || s >= N.to_big","class":"linePartCov","hits":"3","order":"28","possible_hits":"4",},
{"lineNum":" 165","line":" raise \"Invalid scalar: outside of Secp256k1 field dimension.\"","class":"linePartCov","hits":"1","order":"247","possible_hits":"2",},
{"lineNum":" 165","line":" raise \"Invalid scalar: outside of Secp256k1 field dimension.\"","class":"linePartCov","hits":"1","order":"264","possible_hits":"2",},
{"lineNum":" 166","line":" end"},
{"lineNum":" 167","line":" s_bin = s.to_s 2","class":"lineCov","hits":"2","order":"29","possible_hits":"2",},
{"lineNum":" 168","line":" q = p","class":"lineCov","hits":"2","order":"30","possible_hits":"2",},
Expand All @@ -179,5 +179,5 @@ var data = {lines:[
{"lineNum":" 178","line":"end"},
]};
var percent_low = 25;var percent_high = 75;
var header = { "command" : "run_coverage", "date" : "2022-04-06 14:26:02", "instrumented" : 56, "covered" : 56,};
var header = { "command" : "run_coverage", "date" : "2022-04-06 16:56:27", "instrumented" : 56, "covered" : 56,};
var merged_data = [];
Loading

0 comments on commit 5b96af3

Please sign in to comment.