rbsecp256k1 2.0.0 → 3.0.0
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/ext/rbsecp256k1/extconf.rb +98 -5
- data/ext/rbsecp256k1/rbsecp256k1.c +19 -4
- data/lib/rbsecp256k1/version.rb +1 -1
- metadata +32 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: adc488ad0d13cd01f56ce39b7c323ea57d9226b9380d747ebb8ef0c4cc62d6d1
|
4
|
+
data.tar.gz: 3118c92e72f09ff255483f7c90665236b9b060a881eb4c7d54b9d3a2791df747
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5863c53473f0a162fffc82e319ab255b3e234acd0d425637783177e4c47e38768992b9d712f8957369e2ed53241eee377c31510e486d887e2cb6e9b12bb667b2
|
7
|
+
data.tar.gz: 046edbc96b3864969015ea02b2016fb167ae0c93172621801d7788ea484d3418a5868a8396aea57b4fbd21298157aa5a383b990dce00f2cceff68dd9f12106f0
|
data/ext/rbsecp256k1/extconf.rb
CHANGED
@@ -1,14 +1,107 @@
|
|
1
|
+
require 'mini_portile2'
|
1
2
|
require 'mkmf'
|
3
|
+
require 'zip'
|
4
|
+
|
5
|
+
# Recipe for downloading and building libsecp256k1 as part of installation
|
6
|
+
class Secp256k1Recipe < MiniPortile
|
7
|
+
# Hard-coded URL for libsecp256k1 zipfile (HEAD of master as of 26-11-2018)
|
8
|
+
LIBSECP256K1_ZIP_URL = 'https://github.com/bitcoin-core/secp256k1/archive/e34ceb333b1c0e6f4115ecbb80c632ac1042fa49.zip'.freeze
|
9
|
+
|
10
|
+
# Expected SHA-256 of the zipfile above (computed using sha256sum)
|
11
|
+
LIBSECP256K1_SHA256 = 'd87d3ca7ebc42edbabb0f38e79205040b24b09b3e6d1c9ac89585de9bf302143'.freeze
|
12
|
+
|
13
|
+
WITH_RECOVERY = ENV.fetch('WITH_RECOVERY', '1') == '1'
|
14
|
+
WITH_ECDH = ENV.fetch('WITH_ECDH', '1') == '1'
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
super('libsecp256k1', '0.0.0')
|
18
|
+
@tarball = File.join(Dir.pwd, "/ports/archives/libsecp256k1.zip")
|
19
|
+
@files = ["file://#{@tarball}"]
|
20
|
+
self.configure_options += [
|
21
|
+
"--disable-benchmark",
|
22
|
+
"--disable-exhaustive-tests",
|
23
|
+
"--disable-tests",
|
24
|
+
"--disable-debug",
|
25
|
+
"--enable-experimental",
|
26
|
+
"--with-pic=yes"
|
27
|
+
]
|
28
|
+
|
29
|
+
configure_options << "--enable-module-recovery" if WITH_RECOVERY
|
30
|
+
configure_options << "--enable-module-ecdh" if WITH_ECDH
|
31
|
+
end
|
32
|
+
|
33
|
+
def configure
|
34
|
+
# Need to run autogen.sh before configure since it creates it
|
35
|
+
if RUBY_PLATFORM =~ /mingw|mswin/
|
36
|
+
# Windows doesn't recognize the shebang.
|
37
|
+
execute('autogen', %w[sh ./autogen.sh])
|
38
|
+
else
|
39
|
+
execute('autogen', %w[./autogen.sh])
|
40
|
+
end
|
41
|
+
|
42
|
+
super
|
43
|
+
end
|
44
|
+
|
45
|
+
def download
|
46
|
+
download_file_http(LIBSECP256K1_ZIP_URL, @tarball)
|
47
|
+
verify_file(local_path: @tarball, sha256: LIBSECP256K1_SHA256)
|
48
|
+
end
|
49
|
+
|
50
|
+
def downloaded?
|
51
|
+
File.exist?(@tarball)
|
52
|
+
end
|
53
|
+
|
54
|
+
def extract_zip_file(file, destination)
|
55
|
+
FileUtils.mkdir_p(destination)
|
56
|
+
|
57
|
+
Zip::File.open(file) do |zip_file|
|
58
|
+
zip_file.each do |f|
|
59
|
+
fpath = File.join(destination, f.name)
|
60
|
+
zip_file.extract(f, fpath) unless File.exist?(fpath)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def extract
|
66
|
+
files_hashs.each do |file|
|
67
|
+
extract_zip_file(file[:local_path], tmp_path)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
2
71
|
|
3
72
|
# OpenSSL flags
|
4
73
|
print("checking for OpenSSL\n")
|
5
74
|
results = pkg_config('openssl')
|
6
|
-
abort "missing openssl pkg-config information" unless results[1]
|
75
|
+
abort "missing openssl pkg-config information" unless results && results[1]
|
76
|
+
|
77
|
+
if with_config('system-library')
|
78
|
+
# Require that libsecp256k1 be installed using `make install` or similar.
|
79
|
+
print("checking for libsecp256k1\n")
|
80
|
+
results = pkg_config('libsecp256k1')
|
81
|
+
abort "missing libsecp256k1" unless results && results[1]
|
82
|
+
else
|
83
|
+
# Build the libsecp256k1 dependency
|
84
|
+
recipe = Secp256k1Recipe.new
|
85
|
+
recipe.cook
|
86
|
+
recipe.activate
|
87
|
+
|
88
|
+
# Need to add paths to includes and libraries for library for build
|
89
|
+
append_cflags(
|
90
|
+
[
|
91
|
+
"-I#{recipe.path}/include",
|
92
|
+
"-fPIC",
|
93
|
+
"-Wno-undef",
|
94
|
+
"-Wall"
|
95
|
+
]
|
96
|
+
)
|
97
|
+
# rubocop:disable Style/GlobalVars
|
98
|
+
$LIBPATH = ["#{recipe.path}/lib"] | $LIBPATH
|
99
|
+
# rubocop:enable Style/GlobalVars
|
7
100
|
|
8
|
-
#
|
9
|
-
|
10
|
-
|
11
|
-
|
101
|
+
# Also need to make sure we add the library as part of the build
|
102
|
+
have_library("secp256k1")
|
103
|
+
have_library("gmp")
|
104
|
+
end
|
12
105
|
|
13
106
|
# Check if we have the libsecp256k1 recoverable signature header.
|
14
107
|
have_header('secp256k1_recovery.h')
|
@@ -277,7 +277,7 @@ typedef enum ResultT_dummy {
|
|
277
277
|
* RESULT_FAILURE otherwise.
|
278
278
|
*/
|
279
279
|
static ResultT
|
280
|
-
GenerateRandomBytes(unsigned char *out_bytes,
|
280
|
+
GenerateRandomBytes(unsigned char *out_bytes, int in_size)
|
281
281
|
{
|
282
282
|
// OpenSSL RNG has not been seeded with enough data and is therefore
|
283
283
|
// not usable.
|
@@ -1110,7 +1110,7 @@ Context_public_key_from_data(VALUE self, VALUE in_public_key_data)
|
|
1110
1110
|
return PublicKey_create_from_data(
|
1111
1111
|
context,
|
1112
1112
|
public_key_data,
|
1113
|
-
RSTRING_LEN(in_public_key_data)
|
1113
|
+
(int)RSTRING_LEN(in_public_key_data)
|
1114
1114
|
);
|
1115
1115
|
}
|
1116
1116
|
|
@@ -1156,6 +1156,8 @@ Context_key_pair_from_private_key(VALUE self, VALUE in_private_key_data)
|
|
1156
1156
|
VALUE private_key;
|
1157
1157
|
unsigned char *private_key_data;
|
1158
1158
|
|
1159
|
+
Check_Type(in_private_key_data, T_STRING);
|
1160
|
+
|
1159
1161
|
if (RSTRING_LEN(in_private_key_data) != 32)
|
1160
1162
|
{
|
1161
1163
|
rb_raise(rb_eArgError, "private key data must be 32 bytes in length");
|
@@ -1229,6 +1231,13 @@ Context_signature_from_compact(VALUE self, VALUE in_compact_signature)
|
|
1229
1231
|
VALUE signature_result;
|
1230
1232
|
unsigned char *signature_data;
|
1231
1233
|
|
1234
|
+
Check_Type(in_compact_signature, T_STRING);
|
1235
|
+
|
1236
|
+
if (RSTRING_LEN(in_compact_signature) != 64)
|
1237
|
+
{
|
1238
|
+
rb_raise(rb_eArgError, "compact signature must be 64 bytes");
|
1239
|
+
}
|
1240
|
+
|
1232
1241
|
TypedData_Get_Struct(self, Context, &Context_DataType, context);
|
1233
1242
|
signature_data = (unsigned char*)StringValuePtr(in_compact_signature);
|
1234
1243
|
|
@@ -1393,10 +1402,11 @@ Context_sign_recoverable(VALUE self, VALUE in_private_key, VALUE in_hash32)
|
|
1393
1402
|
*
|
1394
1403
|
* @param in_compact_sig [String] binary string containing compact signature
|
1395
1404
|
* data.
|
1396
|
-
* @param in_recovery_id [Integer] recovery ID
|
1405
|
+
* @param in_recovery_id [Integer] recovery ID (range [0, 3])
|
1397
1406
|
* @return [Secp256k1::RecoverableSignature] signature parsed from data.
|
1398
1407
|
* @raise [RuntimeError] if signature data or recovery ID is invalid.
|
1399
|
-
* @raise [ArgumentError] if compact signature is not 64 bytes
|
1408
|
+
* @raise [ArgumentError] if compact signature is not 64 bytes or recovery ID
|
1409
|
+
* is not in range [0, 3].
|
1400
1410
|
*/
|
1401
1411
|
static VALUE
|
1402
1412
|
Context_recoverable_signature_from_compact(
|
@@ -1420,6 +1430,11 @@ Context_recoverable_signature_from_compact(
|
|
1420
1430
|
rb_raise(rb_eArgError, "compact signature is not 64 bytes");
|
1421
1431
|
}
|
1422
1432
|
|
1433
|
+
if (recovery_id < 0 || recovery_id > 3)
|
1434
|
+
{
|
1435
|
+
rb_raise(rb_eArgError, "invalid recovery ID, must be in range [0, 3]");
|
1436
|
+
}
|
1437
|
+
|
1423
1438
|
result = RecoverableSignature_alloc(Secp256k1_RecoverableSignature_class);
|
1424
1439
|
TypedData_Get_Struct(
|
1425
1440
|
result,
|
data/lib/rbsecp256k1/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbsecp256k1
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Scrivner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: mini_portile2
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubyzip
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.2'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: rake
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -117,5 +145,6 @@ rubyforge_project:
|
|
117
145
|
rubygems_version: 2.7.6
|
118
146
|
signing_key:
|
119
147
|
specification_version: 4
|
120
|
-
summary: Compiled, native ruby extension interfaces to libsecp256k1
|
148
|
+
summary: Compiled, native ruby extension interfaces to libsecp256k1. In rbsecp256k1
|
149
|
+
3.0.0 and later libsecp256k1 is bundled with the gem.
|
121
150
|
test_files: []
|