@@ -46,68 +46,73 @@ static const secp256k1_fe secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CON
46
46
0 , 0 , 0 , 1 , 0x45512319UL , 0x50B75FC4UL , 0x402DA172UL , 0x2FC9BAEEUL
47
47
);
48
48
49
- static int secp256k1_der_read_len (const unsigned char * * sigp , const unsigned char * sigend ) {
50
- int lenleft , b1 ;
51
- size_t ret = 0 ;
49
+ static int secp256k1_der_read_len (size_t * len , const unsigned char * * sigp , const unsigned char * sigend ) {
50
+ size_t lenleft ;
51
+ unsigned char b1 ;
52
+ VERIFY_CHECK (len != NULL );
53
+ * len = 0 ;
52
54
if (* sigp >= sigend ) {
53
- return -1 ;
55
+ return 0 ;
54
56
}
55
57
b1 = * ((* sigp )++ );
56
58
if (b1 == 0xFF ) {
57
59
/* X.690-0207 8.1.3.5.c the value 0xFF shall not be used. */
58
- return -1 ;
60
+ return 0 ;
59
61
}
60
62
if ((b1 & 0x80 ) == 0 ) {
61
63
/* X.690-0207 8.1.3.4 short form length octets */
62
- return b1 ;
64
+ * len = b1 ;
65
+ return 1 ;
63
66
}
64
67
if (b1 == 0x80 ) {
65
68
/* Indefinite length is not allowed in DER. */
66
- return -1 ;
69
+ return 0 ;
67
70
}
68
71
/* X.690-207 8.1.3.5 long form length octets */
69
72
lenleft = b1 & 0x7F ; /* lenleft is at least 1 */
70
- if (lenleft > sigend - * sigp ) {
71
- return -1 ;
73
+ if (lenleft > ( size_t )( sigend - * sigp ) ) {
74
+ return 0 ;
72
75
}
73
76
if (* * sigp == 0 ) {
74
77
/* Not the shortest possible length encoding. */
75
- return -1 ;
78
+ return 0 ;
76
79
}
77
- if (( size_t ) lenleft > sizeof (size_t )) {
80
+ if (lenleft > sizeof (size_t )) {
78
81
/* The resulting length would exceed the range of a size_t, so
79
82
* certainly longer than the passed array size.
80
83
*/
81
- return -1 ;
84
+ return 0 ;
82
85
}
83
86
while (lenleft > 0 ) {
84
- ret = (ret << 8 ) | * * sigp ;
87
+ * len = (* len << 8 ) | * * sigp ;
85
88
(* sigp )++ ;
86
89
lenleft -- ;
87
90
}
88
- if (ret > (size_t )(sigend - * sigp )) {
91
+ if (* len > (size_t )(sigend - * sigp )) {
89
92
/* Result exceeds the length of the passed array. */
90
- return -1 ;
93
+ return 0 ;
91
94
}
92
- if (ret < 128 ) {
95
+ if (* len < 128 ) {
93
96
/* Not the shortest possible length encoding. */
94
- return -1 ;
97
+ return 0 ;
95
98
}
96
- return ret ;
99
+ return 1 ;
97
100
}
98
101
99
102
static int secp256k1_der_parse_integer (secp256k1_scalar * r , const unsigned char * * sig , const unsigned char * sigend ) {
100
103
int overflow = 0 ;
101
104
unsigned char ra [32 ] = {0 };
102
- int rlen ;
105
+ size_t rlen ;
103
106
104
107
if (* sig == sigend || * * sig != 0x02 ) {
105
108
/* Not a primitive integer (X.690-0207 8.3.1). */
106
109
return 0 ;
107
110
}
108
111
(* sig )++ ;
109
- rlen = secp256k1_der_read_len (sig , sigend );
110
- if (rlen <= 0 || (* sig ) + rlen > sigend ) {
112
+ if (secp256k1_der_read_len (& rlen , sig , sigend ) == 0 ) {
113
+ return 0 ;
114
+ }
115
+ if (rlen == 0 || * sig + rlen > sigend ) {
111
116
/* Exceeds bounds or not at least length 1 (X.690-0207 8.3.1). */
112
117
return 0 ;
113
118
}
@@ -144,13 +149,15 @@ static int secp256k1_der_parse_integer(secp256k1_scalar *r, const unsigned char
144
149
145
150
static int secp256k1_ecdsa_sig_parse (secp256k1_scalar * rr , secp256k1_scalar * rs , const unsigned char * sig , size_t size ) {
146
151
const unsigned char * sigend = sig + size ;
147
- int rlen ;
152
+ size_t rlen ;
148
153
if (sig == sigend || * (sig ++ ) != 0x30 ) {
149
154
/* The encoding doesn't start with a constructed sequence (X.690-0207 8.9.1). */
150
155
return 0 ;
151
156
}
152
- rlen = secp256k1_der_read_len (& sig , sigend );
153
- if (rlen < 0 || sig + rlen > sigend ) {
157
+ if (secp256k1_der_read_len (& rlen , & sig , sigend ) == 0 ) {
158
+ return 0 ;
159
+ }
160
+ if (sig + rlen > sigend ) {
154
161
/* Tuple exceeds bounds */
155
162
return 0 ;
156
163
}
0 commit comments