crypto-lite 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Manifest.txt +4 -1
- data/README.md +100 -65
- data/lib/crypto-lite.rb +50 -214
- data/lib/crypto-lite/helper.rb +25 -0
- data/lib/crypto-lite/metal.rb +128 -0
- data/lib/crypto-lite/sign_rsa.rb +29 -0
- data/lib/crypto-lite/version.rb +1 -1
- data/test/test_base58.rb +4 -3
- data/test/test_hash.rb +47 -0
- data/test/test_hash_sha.rb +25 -16
- metadata +6 -3
- data/test/test_hash_keccak.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7326c07c1553f4f15d79ddbfa19df2ad5dd04bb18e769ccbf564ee521aa97405
|
4
|
+
data.tar.gz: 9602382da425f288147cc4a1a9e5f0fc373dc9f8838204886c990a9e4b611be6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b607671748a9035dce0b505ec757397416f2a70193e8d5890a90815bba03bbeff874ec878462b950427a372657889344f16b04c8349286165a70a61fd48fa86
|
7
|
+
data.tar.gz: bc6ad174e2d5fe8c0b75853bd66e7b69ee963024c33f797b9043a836cbe25fee7b5ada35c2c5c144fc5dad93b80859de4e9b3fb09fe34b5390c0a58b654c7363
|
data/Manifest.txt
CHANGED
@@ -4,12 +4,15 @@ README.md
|
|
4
4
|
Rakefile
|
5
5
|
lib/crypto-lite.rb
|
6
6
|
lib/crypto-lite/config.rb
|
7
|
+
lib/crypto-lite/helper.rb
|
8
|
+
lib/crypto-lite/metal.rb
|
9
|
+
lib/crypto-lite/sign_rsa.rb
|
7
10
|
lib/crypto-lite/version.rb
|
8
11
|
lib/crypto.rb
|
9
12
|
lib/crypto/lite.rb
|
10
13
|
test/helper.rb
|
11
14
|
test/test_base58.rb
|
12
15
|
test/test_bitcoin_addr.rb
|
13
|
-
test/
|
16
|
+
test/test_hash.rb
|
14
17
|
test/test_hash_sha.rb
|
15
18
|
test/test_version.rb
|
data/README.md
CHANGED
@@ -24,23 +24,33 @@ sha256( "abc".b ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb
|
|
24
24
|
sha256( "\x61\x62\x63" ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
25
25
|
sha256( 0x616263 ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
sha256( hex: '616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
28
|
+
sha256( hex: '0x616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
29
|
+
sha256( hex: '0X616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
30
30
|
|
31
31
|
# "auto-magic" hex string to binary string conversion heuristic
|
32
32
|
sha256( '0x616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
33
33
|
sha256( '0X616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
34
|
+
```
|
35
|
+
|
36
|
+
|
37
|
+
Bonus Back Stage Tip: How does SHA256 work?
|
38
|
+
|
39
|
+
Try this [amazing animation of the SHA256 hash function in your very own terminal](https://github.com/in3rsha/sha256-animation) by Greg Walker.
|
34
40
|
|
35
41
|
|
42
|
+
|
43
|
+
Onwards with more sha256 examples:
|
44
|
+
|
45
|
+
``` ruby
|
36
46
|
## try a
|
37
47
|
sha256( "a" ) #=> "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
38
48
|
sha256( "\x61" ) #=> "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
39
49
|
sha256( 0b01100001 ) #=> "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
40
50
|
sha256( 0x61 ) #=> "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
41
51
|
|
42
|
-
|
43
|
-
|
52
|
+
sha256( hex: '61' ) #=> "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
53
|
+
sha256( hex: '0x61' ) #=> "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
44
54
|
|
45
55
|
# "auto-magic" hex string to binary string conversion heuristic
|
46
56
|
sha256( '0x61' ) #=> "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
@@ -51,6 +61,67 @@ sha256( "Hello, Cryptos!" ) #=> "33eedea60b0662c66c289ceba71863a864cf84b00e1000
|
|
51
61
|
```
|
52
62
|
|
53
63
|
|
64
|
+
**SHA3-256 - Secure Hashing Algorthim (SHA) 3, 256-Bit (32 Bytes)**
|
65
|
+
|
66
|
+
``` ruby
|
67
|
+
sha3_256( "Hello, Cryptos!" ) #=> "7dddf4bc9b86352b67e8823e5010ddbd2a90a854469e2517992ca7ca89e5bd58"
|
68
|
+
```
|
69
|
+
|
70
|
+
Note: Yes, SHA256 vs SHA3-256 / SHA-2 vs SHA-3 the hashing functions are
|
71
|
+
different (although the 256-bit hash size output is the same).
|
72
|
+
The sha256 hashing function is part of the Secure Hash Algorithm (SHA) 2 family / standards first published in 2001.
|
73
|
+
The sha3_256 is part of the (newer) Secure Hash Algorithm (SHA) 3 family / standards first published in 2015
|
74
|
+
(and uses the Keccak cryptographic primitive "under the hood").
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
**Keccak 256-Bit**
|
79
|
+
|
80
|
+
``` ruby
|
81
|
+
keccak256( "Hello, Cryptos!" ) #=> "2cf14baa817e931f5cc2dcb63c889619d6b7ae0794fc2223ebadf8e672c776f5"
|
82
|
+
```
|
83
|
+
|
84
|
+
|
85
|
+
#### Aside - Keccak vs SHA3 / Original vs Official
|
86
|
+
|
87
|
+
In 2004 the U.S. National Institute of Standards and Technology (NIST)
|
88
|
+
changed the padding to `SHA3-256(M) = KECCAK [512] (M || 01, 256)`.
|
89
|
+
This is different from the padding proposed by the Keccak team in
|
90
|
+
the original Keccak SHA-3 submission version 3 (the final, winning version).
|
91
|
+
The difference is the additional `'01'` bits appended to the message.
|
92
|
+
|
93
|
+
To help avoid confusion the "submitted original version 3" SHA-3 Keccak
|
94
|
+
hashing is now called "Keccak"
|
95
|
+
and the finalized NIST SHA-3 standard "SHA3".
|
96
|
+
|
97
|
+
Tip: If you don't know what variant of the hash function you have -
|
98
|
+
original or official? - check your hash:
|
99
|
+
|
100
|
+
For keccak 256-bit:
|
101
|
+
|
102
|
+
``` ruby
|
103
|
+
keccak256( '' ) #=> "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
|
104
|
+
```
|
105
|
+
|
106
|
+
For sha3 256-bit:
|
107
|
+
|
108
|
+
``` ruby
|
109
|
+
sha3_256( '' ) #=> "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"
|
110
|
+
```
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
**RMD / RIPE-MD - RACE¹ Integrity Primitives Evaluation Message Digest 160-Bit**
|
115
|
+
|
116
|
+
¹: Research and development in Advanced Communications technologies in Europe
|
117
|
+
|
118
|
+
|
119
|
+
``` ruby
|
120
|
+
rmd160( "Hello, Cryptos!" ) #=>"4d65f7b740bbade4097e1348e15d2a7d52ac5f53"
|
121
|
+
# or use the alias / alternate name
|
122
|
+
ripemd160( "Hello, Cryptos!" ) #=>"4d65f7b740bbade4097e1348e15d2a7d52ac5f53"
|
123
|
+
```
|
124
|
+
|
54
125
|
|
55
126
|
#### Aside - Hex String `"0x616263"` vs Binary String `"\x61\x62\x63" == "abc"`
|
56
127
|
|
@@ -84,15 +155,18 @@ Note: The standard `Array#pack` conversion
|
|
84
155
|
will NOT "auto-magically" cut-off the `0x` or `0X` prefix.
|
85
156
|
|
86
157
|
|
87
|
-
If you know you have a hex string use the hex
|
158
|
+
If you know you have a hex string use the `hex:` keyword to pass
|
159
|
+
in the arg(ument)
|
160
|
+
to the hash function and that will "automagically"
|
161
|
+
handle the hex-to-bin conversion for you. Example:
|
88
162
|
|
89
163
|
``` ruby
|
90
|
-
|
91
|
-
|
164
|
+
sha256( hex: '61' ) #=> "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
165
|
+
sha256( hex: '0x61' ) #=> "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
|
92
166
|
|
93
|
-
|
94
|
-
|
95
|
-
|
167
|
+
sha256( hex: '616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
168
|
+
sha256( hex: '0x616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
169
|
+
sha256( hex: '0X616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
96
170
|
```
|
97
171
|
|
98
172
|
What about the built-in "auto-magic" hex-to-bin conversion / heuristic?
|
@@ -121,59 +195,6 @@ hash256( '6fe6b145a3908a4d6616b13c1109717add8672c900' )
|
|
121
195
|
```
|
122
196
|
|
123
197
|
|
124
|
-
|
125
|
-
**Keccak 256-Bit**
|
126
|
-
|
127
|
-
``` ruby
|
128
|
-
keccak256( "Hello, Cryptos!" ) #=> "2cf14baa817e931f5cc2dcb63c889619d6b7ae0794fc2223ebadf8e672c776f5"
|
129
|
-
keccak256( '' ) #=> "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
|
130
|
-
```
|
131
|
-
|
132
|
-
|
133
|
-
#### Aside - Keccak vs SHA3 / Original vs Official
|
134
|
-
|
135
|
-
In 2004 the U.S. National Institute of Standards and Technology (NIST)
|
136
|
-
changed the padding to `SHA3-256(M) = KECCAK [512] (M || 01, 256)`.
|
137
|
-
This is different from the padding proposed by the Keccak team in
|
138
|
-
the original Keccak SHA-3 submission version 3 (the final, winning version).
|
139
|
-
The difference is the additional `'01'` bits appended to the message.
|
140
|
-
|
141
|
-
To help avoid confusion the "submitted original version 3" SHA-3 Keccak
|
142
|
-
hashing is now called "Keccak"
|
143
|
-
and the finalized NIST SHA-3 standard "SHA3".
|
144
|
-
|
145
|
-
Tip: If you don't know what variant of the hash function you have -
|
146
|
-
original or official? - check your hash:
|
147
|
-
|
148
|
-
For keccak 256-bit:
|
149
|
-
|
150
|
-
``` ruby
|
151
|
-
keccak256( '' ) #=> "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
|
152
|
-
keccak256( 'Hello, Cryptos!' ) #=> "2cf14baa817e931f5cc2dcb63c889619d6b7ae0794fc2223ebadf8e672c776f5"
|
153
|
-
```
|
154
|
-
|
155
|
-
For sha3 256-bit:
|
156
|
-
|
157
|
-
``` ruby
|
158
|
-
sha3_256( '' ) #=> "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"
|
159
|
-
sha3_256( 'Hello, Cryptos!' ) #=> "7dddf4bc9b86352b67e8823e5010ddbd2a90a854469e2517992ca7ca89e5bd58"
|
160
|
-
```
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
**RMD - RACE¹ Integrity Primitives Evaluation Message Digest 160-Bit**
|
165
|
-
|
166
|
-
¹: Research and development in Advanced Communications technologies in Europe
|
167
|
-
|
168
|
-
|
169
|
-
``` ruby
|
170
|
-
rmd160( "Hello, Cryptos!" ) #=>"4d65f7b740bbade4097e1348e15d2a7d52ac5f53"
|
171
|
-
# or use the alias / alternate name
|
172
|
-
ripemd160( "Hello, Cryptos!" ) #=>"4d65f7b740bbade4097e1348e15d2a7d52ac5f53"
|
173
|
-
```
|
174
|
-
|
175
|
-
|
176
|
-
|
177
198
|
#### Hash Function Helpers
|
178
199
|
|
179
200
|
**HASH160 - RMD160(SHA256(X))**
|
@@ -204,7 +225,7 @@ hash256( '6fe6b145a3908a4d6616b13c1109717add8672c900' )
|
|
204
225
|
#=> "02335f08b8fe4ddad263a50b7a33c5d38ea1cbd8fd2056a1320a3ddece541711"
|
205
226
|
```
|
206
227
|
|
207
|
-
|
228
|
+
#### Base58 Encoding / Decoding Helpers
|
208
229
|
|
209
230
|
**BASE58**
|
210
231
|
|
@@ -443,6 +464,20 @@ References
|
|
443
464
|
- [How to create Bitcoin Address](https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses#How_to_create_Bitcoin_Address)
|
444
465
|
- [Ruby Quiz #15 - Generate the Bitcoin (Base58) Address from the (Elliptic Curve) Public Key](https://github.com/planetruby/quiz/tree/master/015)
|
445
466
|
|
467
|
+
Bonus: Bitcon Tip - How to Buy Bitcoin (The CO₂-Friendly Way)
|
468
|
+
|
469
|
+
> 1. Take one $50 bill, five $10 bills, or ten $5 bills (I wouldn't recommend change - stay with paper money).
|
470
|
+
> 2. Go to the bathroom.
|
471
|
+
> 3. Lift the lid of the loo.
|
472
|
+
> 4. Throw money in.
|
473
|
+
> 5. Flush down water.
|
474
|
+
>
|
475
|
+
> Congrats! You just purchased $50 worth of Bitcoin - without fucking the planet!
|
476
|
+
>
|
477
|
+
> -- Trolly McTrollface, Bitcon Greater Fool Court Jester
|
478
|
+
|
479
|
+
Read more [Crypto Quotes »](https://github.com/openblockchains/crypto-quotes)
|
480
|
+
|
446
481
|
|
447
482
|
|
448
483
|
|
data/lib/crypto-lite.rb
CHANGED
@@ -17,199 +17,89 @@ require 'base58-alphabets'
|
|
17
17
|
## our own code
|
18
18
|
require 'crypto-lite/version' # note: let version always go first
|
19
19
|
require 'crypto-lite/config'
|
20
|
+
require 'crypto-lite/metal'
|
20
21
|
|
21
22
|
|
22
23
|
|
23
24
|
|
24
25
|
module Crypto
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
def self.base58bin( input )
|
33
|
-
## todo/check: input must be a (binary) string - why? why not?
|
34
|
-
Base58::Bitcoin.encode_bin( input )
|
27
|
+
def self.base58( *args, **kwargs )
|
28
|
+
input = args_to_input( args, kwargs )
|
29
|
+
Metal.base58bin( input )
|
35
30
|
end
|
36
31
|
|
37
|
-
def self.
|
38
|
-
input =
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.base58hex( input )
|
43
|
-
raise ArgumentError, "expected hex string (0-9a-f) - got >#{input}< - can't pack string; sorry" unless input =~ HEX_RE
|
44
|
-
|
45
|
-
input = strip0x( input ) ## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
46
|
-
base58bin( [input].pack( 'H*' ) )
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
def self.base58bin_check( input )
|
51
|
-
## todo/check: input must be a (binary) string - why? why not?
|
52
|
-
hash256 = hash256bin( input )
|
53
|
-
base58bin( input + hash256[0,4] )
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.base58check( input )
|
57
|
-
input = hex_to_bin_automagic( input ) ## add automagic hex (string) to bin (string) check - why? why not?
|
58
|
-
base58bin_check( input )
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.base58hex_check( input )
|
62
|
-
raise ArgumentError, "expected hex string (0-9a-f) - got >#{input}< - can't pack string; sorry" unless input =~ HEX_RE
|
63
|
-
|
64
|
-
input = strip0x( input ) ## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
65
|
-
base58bin_check( [input].pack( 'H*' ) )
|
32
|
+
def self.base58check( *args, **kwargs )
|
33
|
+
input = args_to_input( args, kwargs )
|
34
|
+
Metal.base58bin_check( input )
|
66
35
|
end
|
67
36
|
|
68
37
|
|
69
38
|
########################
|
70
39
|
# (secure) hash functions
|
71
40
|
|
72
|
-
def self.
|
73
|
-
|
74
|
-
|
75
|
-
"#{input.class.name}/#{input.encoding}"
|
76
|
-
else
|
77
|
-
input.class.name
|
78
|
-
end
|
79
|
-
puts " input: #{input} (#{input_type})"
|
80
|
-
end
|
81
|
-
|
82
|
-
message = if input.is_a?( Integer ) ## assume byte if single (unsigned) integer
|
83
|
-
raise ArgumentError, "expected unsigned byte (0-255) - got #{input} (0x#{input.to_s(16)}) - can't pack negative number; sorry" if input < 0
|
84
|
-
## note: pack - H (String) => hex string (high nibble first)
|
85
|
-
## todo/check: is there a better way to convert integer number to (binary) string!!!
|
86
|
-
[input.to_s(16)].pack('H*')
|
87
|
-
else ## assume (binary) string
|
88
|
-
input
|
89
|
-
end
|
90
|
-
|
91
|
-
if debug?
|
92
|
-
bytes = message.bytes
|
93
|
-
bin = bytes.map {|byte| byte.to_s(2).rjust(8, "0")}.join( ' ' )
|
94
|
-
hex = bytes.map {|byte| byte.to_s(16).rjust(2, "0")}.join( ' ' )
|
95
|
-
puts " #{pluralize( bytes.size, 'byte')}: #{bytes.inspect}"
|
96
|
-
puts " binary: #{bin}"
|
97
|
-
puts " hex: #{hex}"
|
98
|
-
end
|
99
|
-
|
100
|
-
message
|
41
|
+
def self.keccak256( *args, **kwargs )
|
42
|
+
input = args_to_input( args, kwargs )
|
43
|
+
Metal.keccak256bin( input ).unpack( 'H*' )[0]
|
101
44
|
end
|
102
45
|
|
103
46
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
Digest::SHA3.digest( message, 256 )
|
108
|
-
end
|
109
|
-
|
110
|
-
def self.keccak256( input )
|
111
|
-
input = hex_to_bin_automagic( input ) ## add automagic hex (string) to bin (string) check - why? why not?
|
112
|
-
keccak256bin( input ).unpack( 'H*' )[0]
|
113
|
-
end
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
def self.rmd160bin( input )
|
118
|
-
message = message( input ) ## "normalize" / convert to (binary) string
|
119
|
-
Digest::RMD160.digest( message )
|
120
|
-
end
|
121
|
-
|
122
|
-
def self.rmd160( input )
|
123
|
-
input = hex_to_bin_automagic( input ) ## add automagic hex (string) to bin (string) check - why? why not?
|
124
|
-
rmd160bin( input ).unpack( 'H*' )[0]
|
47
|
+
def self.rmd160( *args, **kwargs )
|
48
|
+
input = args_to_input( args, kwargs )
|
49
|
+
Metal.rmd160bin( input ).unpack( 'H*' )[0]
|
125
50
|
end
|
126
51
|
|
127
52
|
## add alias RIPEMD160 - why? why not?
|
128
53
|
class << self
|
129
54
|
alias_method :ripemd160, :rmd160
|
130
|
-
alias_method :ripemd160bin, :rmd160bin
|
131
55
|
end
|
132
56
|
|
133
57
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
if engine && ['openssl'].include?( engine.to_s.downcase )
|
139
|
-
puts " engine: #{engine}" if debug?
|
140
|
-
digest = OpenSSL::Digest::SHA256.new
|
141
|
-
digest.update( message )
|
142
|
-
digest.digest
|
143
|
-
else ## use "built-in" hash function from digest module
|
144
|
-
Digest::SHA256.digest( message )
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def self.sha256( input, engine=nil )
|
149
|
-
input = hex_to_bin_automagic( input ) ## add automagic hex (string) to bin (string) check - why? why not?
|
150
|
-
sha256bin( input, engine ).unpack( 'H*' )[0]
|
58
|
+
def self.sha256( *args, **kwargs )
|
59
|
+
input = args_to_input( args, kwargs )
|
60
|
+
engine = kwargs[:engine]
|
61
|
+
Metal.sha256bin( input, engine ).unpack( 'H*' )[0]
|
151
62
|
end
|
152
63
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
input = strip0x( input ) ## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
158
|
-
sha256bin( [input].pack( 'H*' ), engine ).unpack( 'H*' )[0]
|
64
|
+
def self.sha3_256( *args, **kwargs )
|
65
|
+
input = args_to_input( args, kwargs )
|
66
|
+
Metal.sha3_256bin( input ).unpack( 'H*' )[0]
|
159
67
|
end
|
160
68
|
|
161
69
|
|
162
70
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
# binary = [pubkey].pack( "H*" ) # Convert to binary first before hashing
|
167
|
-
# sha256 = Digest::SHA256.digest( binary )
|
168
|
-
# ripemd160 = Digest::RMD160.digest( sha256 )
|
169
|
-
# ripemd160.unpack( "H*" )[0] # Convert back to hex
|
170
|
-
# end
|
171
|
-
|
172
|
-
def self.hash160bin( input )
|
173
|
-
message = message( input ) ## "normalize" / convert to (binary) string
|
174
|
-
|
175
|
-
rmd160bin(sha256bin( message ))
|
71
|
+
def self.hash160( *args, **kwargs )
|
72
|
+
input = args_to_input( args, kwargs )
|
73
|
+
Metal.hash160bin( input ).unpack( 'H*' )[0]
|
176
74
|
end
|
177
75
|
|
178
|
-
def self.
|
179
|
-
input =
|
180
|
-
|
181
|
-
end
|
182
|
-
|
183
|
-
def self.hash160hex( input ) ## convenience helper - lets you pass in hex string
|
184
|
-
raise ArgumentError, "expected hex string (0-9a-f) - got >#{input}< - can't pack string; sorry" unless input =~ HEX_RE
|
185
|
-
|
186
|
-
input = strip0x( input ) ## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
187
|
-
hash160bin( [input].pack( 'H*' ) ).unpack( 'H*' )[0]
|
76
|
+
def self.hash256( *args, **kwargs )
|
77
|
+
input = args_to_input( args, kwargs )
|
78
|
+
Metal.hash256bin( input ).unpack( 'H*' )[0]
|
188
79
|
end
|
189
80
|
|
190
81
|
|
191
82
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
def self.hash256( input )
|
199
|
-
input = hex_to_bin_automagic( input ) ## add automagic hex (string) to bin (string) check - why? why not?
|
200
|
-
hash256bin( input ).unpack( 'H*' )[0]
|
201
|
-
end
|
202
|
-
|
203
|
-
def self.hash256hex( input ) ## convenience helper - lets you pass in hex string
|
204
|
-
raise ArgumentError, "expected hex string (0-9a-f) - got >#{input}< - can't pack string; sorry" unless input =~ HEX_RE
|
83
|
+
########
|
84
|
+
# more helpers
|
85
|
+
## check if it is a hex (string)
|
86
|
+
## - allow optiona 0x or 0X and allow abcdef and ABCDEF
|
87
|
+
HEX_RE = /\A(?:0x)?[0-9a-f]+\z/i
|
205
88
|
|
206
|
-
|
207
|
-
|
89
|
+
def self.args_to_input( args, kwargs )
|
90
|
+
if kwargs[:hex]
|
91
|
+
hex = kwargs[:hex]
|
92
|
+
raise ArgumentError, "expected hex string (0-9a-f) - got >#{hex}< - can't pack string; sorry" unless hex =~ HEX_RE
|
93
|
+
|
94
|
+
hex = strip0x( hex ) ## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
95
|
+
[hex].pack( 'H*' )
|
96
|
+
else ## assume single input arg for now
|
97
|
+
input = args[0]
|
98
|
+
input = hex_to_bin_automagic( input ) ## add automagic hex (string) to bin (string) check - why? why not?
|
99
|
+
input
|
100
|
+
end
|
208
101
|
end
|
209
102
|
|
210
|
-
|
211
|
-
########
|
212
|
-
# more helpers
|
213
103
|
def self.hex_to_bin_automagic( input )
|
214
104
|
## todo/check/fix: add configure setting to turn off automagic - why? why not?
|
215
105
|
if input.is_a?( String ) && input =~ HEX_RE
|
@@ -234,78 +124,24 @@ module Crypto
|
|
234
124
|
(str[0,2] == '0x' || str[0,2] == '0X') ? str[2..-1] : str
|
235
125
|
end
|
236
126
|
|
237
|
-
def self.hex_to_bin( str )
|
238
|
-
str = strip0x( str ) ## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
239
|
-
[str].pack( 'H*' )
|
240
|
-
end
|
241
|
-
|
242
|
-
def self.pluralize( count, noun )
|
243
|
-
count == 1 ? "#{count} #{noun}" : "#{count} #{noun}s"
|
244
|
-
end
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
module RSA
|
250
|
-
def self.generate_keys ## todo/check: add a generate alias - why? why not?
|
251
|
-
key_pair = OpenSSL::PKey::RSA.new( 2048 )
|
252
|
-
private_key = key_pair.export
|
253
|
-
public_key = key_pair.public_key.export
|
127
|
+
# def self.hex_to_bin( str )
|
128
|
+
# str = strip0x( str ) ## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
129
|
+
# [str].pack( 'H*' )
|
130
|
+
# end
|
254
131
|
|
255
|
-
[private_key, public_key]
|
256
|
-
end
|
257
|
-
|
258
|
-
|
259
|
-
def self.sign( plaintext, private_key )
|
260
|
-
private_key = OpenSSL::PKey::RSA.new( private_key ) ## note: convert/wrap into to obj from exported text format
|
261
|
-
Base64.encode64( private_key.private_encrypt( plaintext ))
|
262
|
-
end
|
263
|
-
|
264
|
-
def self.decrypt( ciphertext, public_key )
|
265
|
-
public_key = OpenSSL::PKey::RSA.new( public_key ) ## note: convert/wrap into to obj from exported text format
|
266
|
-
public_key.public_decrypt( Base64.decode64( ciphertext ))
|
267
|
-
end
|
268
|
-
|
269
|
-
|
270
|
-
def self.valid_signature?( plaintext, ciphertext, public_key )
|
271
|
-
plaintext == decrypt( ciphertext, public_key )
|
272
|
-
end
|
273
|
-
end # module RSA
|
274
132
|
end # module Crypto
|
275
133
|
|
276
134
|
|
277
135
|
|
278
136
|
|
279
|
-
|
280
|
-
|
281
|
-
def sha256hex( input, engine=nil ) Crypto.sha256hex( input, engine ); end
|
282
|
-
|
283
|
-
def keccak256( input ) Crypto.keccak256( input ); end
|
284
|
-
|
285
|
-
def rmd160( input ) Crypto.rmd160( input ); end
|
286
|
-
def ripemd160( input ) Crypto.rmd160( input ); end
|
287
|
-
## alias_method :ripemd160, :rmd160
|
288
|
-
|
289
|
-
def hash160( input ) Crypto.hash160( input ); end
|
290
|
-
def hash160hex( input ) Crypto.hash160hex( input ); end
|
291
|
-
|
292
|
-
def hash256( input ) Crypto.hash256( input ); end
|
293
|
-
def hash256hex( input ) Crypto.hash256hex( input ); end
|
294
|
-
|
295
|
-
|
296
|
-
def base58( input ) Crypto.base58( input ); end
|
297
|
-
def base58hex( input ) Crypto.base58hex( input ); end
|
298
|
-
|
299
|
-
|
300
|
-
def base58check( input ) Crypto.base58check( input ); end
|
301
|
-
|
137
|
+
require 'crypto-lite/helper'
|
138
|
+
include CryptoHelper # add convenience "top-level" / global helpers
|
302
139
|
|
303
140
|
|
141
|
+
require 'crypto-lite/sign_rsa'
|
304
142
|
RSA = Crypto::RSA
|
305
143
|
|
306
144
|
|
307
145
|
|
308
146
|
|
309
|
-
|
310
|
-
|
311
147
|
puts CryptoLite.banner ## say hello
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
module CryptoHelper
|
3
|
+
### note: use include CryptoHelper
|
4
|
+
## to get "top-level" / global helpers
|
5
|
+
|
6
|
+
## add convenience "top-level" helpers
|
7
|
+
def sha256( *args, **kwargs ) Crypto.sha256( *args, **kwargs ); end
|
8
|
+
def sha3_256( *args, **kwargs ) Crypto.sha3_256( *args, **kwargs ); end
|
9
|
+
|
10
|
+
def keccak256( *args, **kwargs ) Crypto.keccak256( *args, **kwargs ); end
|
11
|
+
|
12
|
+
def rmd160( *args, **kwargs ) Crypto.rmd160( *args, **kwargs ); end
|
13
|
+
## def ripemd160( input ) Crypto.rmd160( input ); end
|
14
|
+
alias_method :ripemd160, :rmd160
|
15
|
+
|
16
|
+
def hash160( *args, **kwargs ) Crypto.hash160( *args, **kwargs ); end
|
17
|
+
|
18
|
+
def hash256( *args, **kwargs ) Crypto.hash256( *args, **kwargs ); end
|
19
|
+
|
20
|
+
|
21
|
+
def base58( *args, **kwargs ) Crypto.base58( *args, **kwargs ); end
|
22
|
+
def base58check( *args, **kwargs ) Crypto.base58check( *args, **kwargs ); end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Crypto
|
2
|
+
module Metal
|
3
|
+
|
4
|
+
def self.debug?() Crypto.debug?; end
|
5
|
+
|
6
|
+
########################
|
7
|
+
### to the "metal" crypto primitives
|
8
|
+
## work with binary strings (aka byte arrays) / data
|
9
|
+
|
10
|
+
##
|
11
|
+
## todo/check: use/keep bin-suffix in name - why? why not?
|
12
|
+
|
13
|
+
|
14
|
+
def self.base58bin( input )
|
15
|
+
## todo/check: input must be a (binary) string - why? why not?
|
16
|
+
Base58::Bitcoin.encode_bin( input )
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.base58bin_check( input )
|
20
|
+
## todo/check: input must be a (binary) string - why? why not?
|
21
|
+
hash256 = hash256bin( input )
|
22
|
+
base58bin( input + hash256[0,4] )
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
########################
|
27
|
+
# (secure) hash functions
|
28
|
+
|
29
|
+
def self.keccak256bin( input )
|
30
|
+
message = message( input ) ## "normalize" / convert to (binary) string
|
31
|
+
Digest::SHA3.digest( message, 256 )
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.rmd160bin( input )
|
35
|
+
message = message( input ) ## "normalize" / convert to (binary) string
|
36
|
+
Digest::RMD160.digest( message )
|
37
|
+
end
|
38
|
+
|
39
|
+
## add alias RIPEMD160 - why? why not?
|
40
|
+
class << self
|
41
|
+
alias_method :ripemd160bin, :rmd160bin
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def self.sha256bin( input, engine=nil ) ## todo/check: add alias sha256b or such to - why? why not?
|
46
|
+
message = message( input ) ## "normalize" / convert to (binary) string
|
47
|
+
|
48
|
+
if engine && ['openssl'].include?( engine.to_s.downcase )
|
49
|
+
puts " engine: #{engine}" if debug?
|
50
|
+
digest = OpenSSL::Digest::SHA256.new
|
51
|
+
## or use OpenSSL::Digest.new( 'SHA256' )
|
52
|
+
digest.update( message )
|
53
|
+
digest.digest
|
54
|
+
else ## use "built-in" hash function from digest module
|
55
|
+
Digest::SHA256.digest( message )
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.sha3_256bin( input )
|
60
|
+
message = message( input ) ## "normalize" / convert to (binary) string
|
61
|
+
|
62
|
+
digest = OpenSSL::Digest.new( 'SHA3-256' )
|
63
|
+
digest.update( message )
|
64
|
+
digest.digest
|
65
|
+
end
|
66
|
+
|
67
|
+
####
|
68
|
+
## helper
|
69
|
+
# def hash160( pubkey )
|
70
|
+
# binary = [pubkey].pack( "H*" ) # Convert to binary first before hashing
|
71
|
+
# sha256 = Digest::SHA256.digest( binary )
|
72
|
+
# ripemd160 = Digest::RMD160.digest( sha256 )
|
73
|
+
# ripemd160.unpack( "H*" )[0] # Convert back to hex
|
74
|
+
# end
|
75
|
+
|
76
|
+
def self.hash160bin( input )
|
77
|
+
message = message( input ) ## "normalize" / convert to (binary) string
|
78
|
+
|
79
|
+
rmd160bin(sha256bin( message ))
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def self.hash256bin( input )
|
84
|
+
message = message( input ) ## "normalize" / convert to (binary) string
|
85
|
+
|
86
|
+
sha256bin(sha256bin( message ))
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
##############################
|
91
|
+
## helpers
|
92
|
+
def self.message( input ) ## convert input to (binary) string
|
93
|
+
if debug?
|
94
|
+
input_type = if input.is_a?( String )
|
95
|
+
"#{input.class.name}/#{input.encoding}"
|
96
|
+
else
|
97
|
+
input.class.name
|
98
|
+
end
|
99
|
+
puts " input: #{input} (#{input_type})"
|
100
|
+
end
|
101
|
+
|
102
|
+
message = if input.is_a?( Integer ) ## assume byte if single (unsigned) integer
|
103
|
+
raise ArgumentError, "expected unsigned byte (0-255) - got #{input} (0x#{input.to_s(16)}) - can't pack negative number; sorry" if input < 0
|
104
|
+
## note: pack - H (String) => hex string (high nibble first)
|
105
|
+
## todo/check: is there a better way to convert integer number to (binary) string!!!
|
106
|
+
[input.to_s(16)].pack('H*')
|
107
|
+
else ## assume (binary) string
|
108
|
+
input
|
109
|
+
end
|
110
|
+
|
111
|
+
if debug?
|
112
|
+
bytes = message.bytes
|
113
|
+
bin = bytes.map {|byte| byte.to_s(2).rjust(8, "0")}.join( ' ' )
|
114
|
+
hex = bytes.map {|byte| byte.to_s(16).rjust(2, "0")}.join( ' ' )
|
115
|
+
puts " #{pluralize( bytes.size, 'byte')}: #{bytes.inspect}"
|
116
|
+
puts " binary: #{bin}"
|
117
|
+
puts " hex: #{hex}"
|
118
|
+
end
|
119
|
+
|
120
|
+
message
|
121
|
+
end
|
122
|
+
|
123
|
+
def self.pluralize( count, noun )
|
124
|
+
count == 1 ? "#{count} #{noun}" : "#{count} #{noun}s"
|
125
|
+
end
|
126
|
+
|
127
|
+
end # module Metal
|
128
|
+
end # module Crypto
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Crypto
|
2
|
+
|
3
|
+
|
4
|
+
module RSA
|
5
|
+
def self.generate_keys ## todo/check: add a generate alias - why? why not?
|
6
|
+
key_pair = OpenSSL::PKey::RSA.new( 2048 )
|
7
|
+
private_key = key_pair.export
|
8
|
+
public_key = key_pair.public_key.export
|
9
|
+
|
10
|
+
[private_key, public_key]
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def self.sign( plaintext, private_key )
|
15
|
+
private_key = OpenSSL::PKey::RSA.new( private_key ) ## note: convert/wrap into to obj from exported text format
|
16
|
+
Base64.encode64( private_key.private_encrypt( plaintext ))
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.decrypt( ciphertext, public_key )
|
20
|
+
public_key = OpenSSL::PKey::RSA.new( public_key ) ## note: convert/wrap into to obj from exported text format
|
21
|
+
public_key.public_decrypt( Base64.decode64( ciphertext ))
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def self.valid_signature?( plaintext, ciphertext, public_key )
|
26
|
+
plaintext == decrypt( ciphertext, public_key )
|
27
|
+
end
|
28
|
+
end # module RSA
|
29
|
+
end # module Crypto
|
data/lib/crypto-lite/version.rb
CHANGED
data/test/test_base58.rb
CHANGED
@@ -15,7 +15,7 @@ HEX_TESTS = [
|
|
15
15
|
|
16
16
|
def test_hex
|
17
17
|
HEX_TESTS.each do |item|
|
18
|
-
assert_equal item[1],
|
18
|
+
assert_equal item[1], base58( hex: item[0] )
|
19
19
|
assert_equal item[1], base58( item[0] )
|
20
20
|
end
|
21
21
|
end
|
@@ -27,9 +27,10 @@ def test_bitcoin_addr
|
|
27
27
|
pkh = 'f54a5851e9372b87810a8e60cdd2e7cfd80b6e31'
|
28
28
|
|
29
29
|
## all-in-one
|
30
|
+
assert_equal addr_exp, base58check( hex: '00' + pkh )
|
30
31
|
assert_equal addr_exp, base58check( '00' + pkh )
|
31
|
-
|
32
|
-
assert_equal addr_exp, Crypto.base58bin_check( "\x00" + [pkh].pack('H*') )
|
32
|
+
|
33
|
+
assert_equal addr_exp, Crypto::Metal.base58bin_check( "\x00" + [pkh].pack('H*') )
|
33
34
|
end
|
34
35
|
|
35
36
|
end # class TestBase58
|
data/test/test_hash.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_hash.rb
|
4
|
+
|
5
|
+
|
6
|
+
require 'helper'
|
7
|
+
|
8
|
+
|
9
|
+
class TestHash < MiniTest::Test
|
10
|
+
|
11
|
+
KECCAK256_TESTS = [
|
12
|
+
['', 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'],
|
13
|
+
['testing', '5f16f4c7f149ac4f9510d9cf8cf384038ad348b3bcdc01915f95de12df9d1b02'],
|
14
|
+
['Hello, Cryptos!', '2cf14baa817e931f5cc2dcb63c889619d6b7ae0794fc2223ebadf8e672c776f5'],
|
15
|
+
]
|
16
|
+
|
17
|
+
SHA3_256_TESTS = [
|
18
|
+
['', 'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a'],
|
19
|
+
['Hello, Cryptos!', '7dddf4bc9b86352b67e8823e5010ddbd2a90a854469e2517992ca7ca89e5bd58'],
|
20
|
+
]
|
21
|
+
|
22
|
+
RIPEMD160_TESTS = [
|
23
|
+
['Hello, Cryptos!', '4d65f7b740bbade4097e1348e15d2a7d52ac5f53'],
|
24
|
+
]
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
def test_keccak256
|
29
|
+
KECCAK256_TESTS.each do |item|
|
30
|
+
assert_equal item[1], keccak256( item[0].b )
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_sha3_256
|
35
|
+
SHA3_256_TESTS.each do |item|
|
36
|
+
assert_equal item[1], sha3_256( item[0].b )
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_ripemd160
|
41
|
+
RIPEMD160_TESTS.each do |item|
|
42
|
+
assert_equal item[1], ripemd160( item[0].b )
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
end # class TestHash
|
data/test/test_hash_sha.rb
CHANGED
@@ -6,21 +6,35 @@
|
|
6
6
|
require 'helper'
|
7
7
|
|
8
8
|
|
9
|
-
class
|
9
|
+
class TestHashSha < MiniTest::Test
|
10
10
|
|
11
|
-
SHA256_EMPTY = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
|
12
11
|
SHA256_ABC = 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'
|
13
12
|
SHA256_A = 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb'
|
14
13
|
SHA256_B = '3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d'
|
15
14
|
SHA256_C = '2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6'
|
16
|
-
SHA256_HELLO_CRYPTOS = '33eedea60b0662c66c289ceba71863a864cf84b00e10002ca1069bf58f9362d5'
|
17
15
|
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
BIN_TESTS = [
|
18
|
+
['', 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'],
|
19
|
+
['Hello, Cryptos!', '33eedea60b0662c66c289ceba71863a864cf84b00e10002ca1069bf58f9362d5'],
|
20
|
+
|
21
|
+
['Blockchain 1', '223aae3830e87aff41db07714983671429a74fb7064646e27ab62adbdc892cd1'],
|
22
|
+
['Blockchain 2', '8f4b5a896e78f680de2c141d25533e8c9207c9ee0d9b09c22a5a01d7992e7d1b'],
|
23
|
+
['Blockchain 3', 'f9f5e7d64f3a93f071900a73d34b2b722867adcb09345a21a25b5cd7f8b41254'],
|
24
|
+
['Blockchain 4', '69580cfb9a134395106ac27de53595cc41fb9940dcc298082c87144932a983a9'],
|
25
|
+
['Blockchain 12', 'f94455d34e7b32dc7dac780fb94a5e958f0d7e2da4cc6500505d5daed719c227'],
|
26
|
+
['Blockchain 13', '0cedb5e229c9582a35ec291ccb172b3f7c76a20c7f645e08d24ece8d5692e153'],
|
27
|
+
]
|
28
|
+
|
29
|
+
|
30
|
+
def test_bin
|
31
|
+
BIN_TESTS.each do |item|
|
32
|
+
assert_equal item[1], sha256( item[0].b )
|
33
|
+
assert_equal item[1], sha256( item[0].b, engine: 'openssl' )
|
34
|
+
end
|
22
35
|
end
|
23
36
|
|
37
|
+
|
24
38
|
def test_abc
|
25
39
|
['abc',
|
26
40
|
'abc'.b,
|
@@ -28,14 +42,14 @@ def test_abc
|
|
28
42
|
0x616263
|
29
43
|
].each do |input|
|
30
44
|
assert_equal SHA256_ABC, sha256( input )
|
31
|
-
assert_equal SHA256_ABC, sha256( input, :openssl )
|
45
|
+
assert_equal SHA256_ABC, sha256( input, engine: 'openssl' )
|
32
46
|
end
|
33
47
|
|
34
48
|
['616263',
|
35
49
|
'0x616263',
|
36
50
|
'0X616263'
|
37
51
|
].each do |input|
|
38
|
-
assert_equal SHA256_ABC,
|
52
|
+
assert_equal SHA256_ABC, sha256( hex: input )
|
39
53
|
end
|
40
54
|
## pp sha256hex( 'hello' ) -- fails - uses non-hex chars
|
41
55
|
|
@@ -47,14 +61,14 @@ def test_abc
|
|
47
61
|
0x61
|
48
62
|
].each do |input|
|
49
63
|
assert_equal SHA256_A, sha256( input )
|
50
|
-
assert_equal SHA256_A, sha256( input, :openssl )
|
64
|
+
assert_equal SHA256_A, sha256( input, engine: 'openssl' )
|
51
65
|
end
|
52
66
|
|
53
67
|
['61',
|
54
68
|
'0x61',
|
55
69
|
'0X61'
|
56
70
|
].each do |input|
|
57
|
-
assert_equal SHA256_A,
|
71
|
+
assert_equal SHA256_A, sha256( hex: input )
|
58
72
|
end
|
59
73
|
|
60
74
|
[ 'b',
|
@@ -70,9 +84,4 @@ def test_abc
|
|
70
84
|
end
|
71
85
|
end
|
72
86
|
|
73
|
-
|
74
|
-
def test_misc
|
75
|
-
assert_equal SHA256_HELLO_CRYPTOS, sha256( 'Hello, Cryptos!' )
|
76
|
-
end
|
77
|
-
|
78
|
-
end # class TestHash
|
87
|
+
end # class TestHashSha
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crypto-lite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: digest-sha3-patched
|
@@ -102,13 +102,16 @@ files:
|
|
102
102
|
- Rakefile
|
103
103
|
- lib/crypto-lite.rb
|
104
104
|
- lib/crypto-lite/config.rb
|
105
|
+
- lib/crypto-lite/helper.rb
|
106
|
+
- lib/crypto-lite/metal.rb
|
107
|
+
- lib/crypto-lite/sign_rsa.rb
|
105
108
|
- lib/crypto-lite/version.rb
|
106
109
|
- lib/crypto.rb
|
107
110
|
- lib/crypto/lite.rb
|
108
111
|
- test/helper.rb
|
109
112
|
- test/test_base58.rb
|
110
113
|
- test/test_bitcoin_addr.rb
|
111
|
-
- test/
|
114
|
+
- test/test_hash.rb
|
112
115
|
- test/test_hash_sha.rb
|
113
116
|
- test/test_version.rb
|
114
117
|
homepage: https://github.com/rubycoco/blockchain
|
data/test/test_hash_keccak.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
###
|
2
|
-
# to run use
|
3
|
-
# ruby -I ./lib -I ./test test/test_hash_keccak.rb
|
4
|
-
|
5
|
-
|
6
|
-
require 'helper'
|
7
|
-
|
8
|
-
|
9
|
-
class TestHashKeccak < MiniTest::Test
|
10
|
-
|
11
|
-
KECCAK256_EMPTY = 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'
|
12
|
-
KECCAK256_TESTING = '5f16f4c7f149ac4f9510d9cf8cf384038ad348b3bcdc01915f95de12df9d1b02'
|
13
|
-
KECCAK256_HELLO_CRYPTOS = '2cf14baa817e931f5cc2dcb63c889619d6b7ae0794fc2223ebadf8e672c776f5'
|
14
|
-
|
15
|
-
|
16
|
-
def test_empty
|
17
|
-
assert_equal KECCAK256_EMPTY, keccak256( '' )
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_misc
|
21
|
-
assert_equal KECCAK256_TESTING, keccak256( 'testing' )
|
22
|
-
assert_equal KECCAK256_HELLO_CRYPTOS, keccak256( 'Hello, Cryptos!' )
|
23
|
-
end
|
24
|
-
|
25
|
-
end # class TestHashKeccak
|