Skip to content

Commit f2859f9

Browse files
afk11Thomas Kerin
authored andcommitted
Remove sudo requirement for building extension
1 parent 1a5f83e commit f2859f9

4 files changed

Lines changed: 162 additions & 6 deletions

File tree

.travis.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ install:
3737
&& ./configure --enable-tests=no --enable-benchmark=no \
3838
--enable-experimental --enable-module-{ecdh,recovery} \
3939
&& make -j$(nproc) && sudo make install && cd ..
40-
- |
41-
phpize && ./configure && make && sudo make install
40+
- phpize && ./configure && make
41+
- ls modules/
42+
- ls .libs/
4243
- composer update
4344

4445
before_script:
@@ -50,8 +51,9 @@ before_script:
5051
5152
script:
5253
- travis/verify_stubs.sh
53-
- cd secp256k1/ && REPORT_EXIT_STATUS=1 make test || (find tests/*.log -type f -exec cat {} + ; exit 1) && cd ..
54+
- REPORT_EXIT_STATUS=1 make test || (find tests/*.log -type f -exec cat {} + ; exit 1)
5455
- travis/run_coverage_test.sh || exit 1
5556
- travis/validate_examples.sh || exit 1
57+
5658
after_script:
57-
- bash <(curl -s https://codecov.io/bash)
59+
- bash <(curl -s https://codecov.io/bash)

lax_der.h

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
#include <stdlib.h>
2+
#include <stdint.h>
3+
4+
/* Parse a DER signature with arbitrary
5+
/** This function is taken from the libsecp256k1 distribution and implements
6+
* DER parsing for ECDSA signatures, while supporting an arbitrary subset of
7+
* format violations.
8+
*
9+
* Supported violations include negative integers, excessive padding, garbage
10+
* at the end, and overly long length descriptors. This is safe to use in
11+
* Bitcoin because since the activation of BIP66, signatures are verified to be
12+
* strict DER before being passed to this module, and we know it supports all
13+
* violations present in the blockchain before that point.
14+
*/
15+
int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) {
16+
size_t rpos, rlen, spos, slen;
17+
size_t pos = 0;
18+
size_t lenbyte;
19+
unsigned char tmpsig[64] = {0};
20+
int overflow = 0;
21+
22+
/* Hack to initialize sig with a correctly-parsed but invalid signature. */
23+
secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig);
24+
25+
/* Sequence tag byte */
26+
if (pos == inputlen || input[pos] != 0x30) {
27+
return 0;
28+
}
29+
pos++;
30+
31+
/* Sequence length bytes */
32+
if (pos == inputlen) {
33+
return 0;
34+
}
35+
lenbyte = input[pos++];
36+
if (lenbyte & 0x80) {
37+
lenbyte -= 0x80;
38+
if (pos + lenbyte > inputlen) {
39+
return 0;
40+
}
41+
pos += lenbyte;
42+
}
43+
44+
/* Integer tag byte for R */
45+
if (pos == inputlen || input[pos] != 0x02) {
46+
return 0;
47+
}
48+
pos++;
49+
50+
/* Integer length for R */
51+
if (pos == inputlen) {
52+
return 0;
53+
}
54+
lenbyte = input[pos++];
55+
if (lenbyte & 0x80) {
56+
lenbyte -= 0x80;
57+
if (pos + lenbyte > inputlen) {
58+
return 0;
59+
}
60+
while (lenbyte > 0 && input[pos] == 0) {
61+
pos++;
62+
lenbyte--;
63+
}
64+
if (lenbyte >= sizeof(size_t)) {
65+
return 0;
66+
}
67+
rlen = 0;
68+
while (lenbyte > 0) {
69+
rlen = (rlen << 8) + input[pos];
70+
pos++;
71+
lenbyte--;
72+
}
73+
} else {
74+
rlen = lenbyte;
75+
}
76+
if (rlen > inputlen - pos) {
77+
return 0;
78+
}
79+
rpos = pos;
80+
pos += rlen;
81+
82+
/* Integer tag byte for S */
83+
if (pos == inputlen || input[pos] != 0x02) {
84+
return 0;
85+
}
86+
pos++;
87+
88+
/* Integer length for S */
89+
if (pos == inputlen) {
90+
return 0;
91+
}
92+
lenbyte = input[pos++];
93+
if (lenbyte & 0x80) {
94+
lenbyte -= 0x80;
95+
if (pos + lenbyte > inputlen) {
96+
return 0;
97+
}
98+
while (lenbyte > 0 && input[pos] == 0) {
99+
pos++;
100+
lenbyte--;
101+
}
102+
if (lenbyte >= sizeof(size_t)) {
103+
return 0;
104+
}
105+
slen = 0;
106+
while (lenbyte > 0) {
107+
slen = (slen << 8) + input[pos];
108+
pos++;
109+
lenbyte--;
110+
}
111+
} else {
112+
slen = lenbyte;
113+
}
114+
if (slen > inputlen - pos) {
115+
return 0;
116+
}
117+
spos = pos;
118+
pos += slen;
119+
120+
/* Ignore leading zeroes in R */
121+
while (rlen > 0 && input[rpos] == 0) {
122+
rlen--;
123+
rpos++;
124+
}
125+
/* Copy R value */
126+
if (rlen > 32) {
127+
overflow = 1;
128+
} else {
129+
memcpy(tmpsig + 32 - rlen, input + rpos, rlen);
130+
}
131+
132+
/* Ignore leading zeroes in S */
133+
while (slen > 0 && input[spos] == 0) {
134+
slen--;
135+
spos++;
136+
}
137+
/* Copy S value */
138+
if (slen > 32) {
139+
overflow = 1;
140+
} else {
141+
memcpy(tmpsig + 64 - slen, input + spos, slen);
142+
}
143+
144+
if (!overflow) {
145+
overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig);
146+
}
147+
if (overflow) {
148+
/* Overwrite the result again with a correctly-parsed but invalid
149+
signature if parsing failed. */
150+
memset(tmpsig, 0, 64);
151+
secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig);
152+
}
153+
return 1;
154+
}

travis/generate_stubs.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ else
2222
[ -d "${_STUBSOUT}" ] || mkdir output
2323
fi
2424

25-
php -dextension=secp256k1.so php-extension-stub-generator/bin/docblock-stub-generator dump-files --docBlock=config.json secp256k1 ${_STUBSOUT} <<< $'y'
25+
php -dextension=../../modules/secp256k1.so php-extension-stub-generator/bin/docblock-stub-generator dump-files --docBlock=config.json secp256k1 ${_STUBSOUT} <<< $'y'
2626

travis/validate_examples.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/bash
22
if [ "${COVERAGE}" = "true" ]; then
33
for i in $(git rev-parse --show-toplevel)/examples/*.php; do
4-
php -dextension=secp256k1.so $i > /dev/null
4+
php -d"extension=$(git rev-parse --show-toplevel)/modules/secp256k1.so" $i > /dev/null
55
if [ $? -ne 0 ]; then
66
echo "Error running example code: $i";
77
exit -1

0 commit comments

Comments
 (0)