Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(640)

Side by Side Diff: nss/lib/util/dersubr.c

Issue 1843333003: Update NSPR to 4.12 and NSS to 3.23 on iOS (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/nss.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* This Source Code Form is subject to the terms of the Mozilla Public 1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this 2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 4
5 #include "secder.h" 5 #include "secder.h"
6 #include <limits.h> 6 #include <limits.h>
7 #include "secerr.h" 7 #include "secerr.h"
8 8
9 int 9 int
10 DER_LengthLength(PRUint32 len) 10 DER_LengthLength(PRUint32 len)
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 } 172 }
173 173
174 /* 174 /*
175 ** Convert a der encoded *signed* integer into a machine integral value. 175 ** Convert a der encoded *signed* integer into a machine integral value.
176 ** If an underflow/overflow occurs, sets error code and returns min/max. 176 ** If an underflow/overflow occurs, sets error code and returns min/max.
177 */ 177 */
178 long 178 long
179 DER_GetInteger(const SECItem *it) 179 DER_GetInteger(const SECItem *it)
180 { 180 {
181 long ival = 0; 181 long ival = 0;
182 unsigned len = it->len; 182 PRBool negative = PR_FALSE;
183 unsigned int len = it->len;
184 unsigned int originalLength = len;
183 unsigned char *cp = it->data; 185 unsigned char *cp = it->data;
184 unsigned long overflow = 0x1ffUL << (((sizeof(ival) - 1) * 8) - 1); 186 unsigned long overflow = 0x1ffUL << (((sizeof(ival) - 1) * 8) - 1);
185 unsigned long ofloinit; 187 unsigned long mask = 1;
186 188
187 PORT_Assert(len); 189 PORT_Assert(len);
188 if (!len) { 190 if (!len) {
189 PORT_SetError(SEC_ERROR_INPUT_LEN); 191 PORT_SetError(SEC_ERROR_INPUT_LEN);
190 return 0; 192 return 0;
191 } 193 }
192 194
193 if (*cp & 0x80) 195 if (*cp & 0x80) {
194 » ival = -1L; 196 » negative = PR_TRUE;
195 ofloinit = ival & overflow; 197 » overflow <<= 1;
198 }
196 199
197 while (len) { 200 while (len) {
198 » if ((ival & overflow) != ofloinit) { 201 » if ((ival & overflow) != 0) {
199 PORT_SetError(SEC_ERROR_BAD_DER); 202 PORT_SetError(SEC_ERROR_BAD_DER);
200 » if (ival < 0) { 203 » if (negative) {
201 return LONG_MIN; 204 return LONG_MIN;
202 } 205 }
203 return LONG_MAX; 206 return LONG_MAX;
204 } 207 }
205 ival = ival << 8; 208 ival = ival << 8;
206 ival |= *cp++; 209 ival |= *cp++;
207 --len; 210 --len;
208 } 211 }
212 if (negative && ival && (overflow & ival) == 0) {
213 mask <<= ((originalLength * 8) - 1);
214 ival &= ~mask;
215 ival -= mask;
216 }
209 return ival; 217 return ival;
210 } 218 }
211 219
212 /* 220 /*
213 ** Convert a der encoded *unsigned* integer into a machine integral value. 221 ** Convert a der encoded *unsigned* integer into a machine integral value.
214 ** If an overflow occurs, sets error code and returns max. 222 ** If an overflow occurs, sets error code and returns max.
215 */ 223 */
216 unsigned long 224 unsigned long
217 DER_GetUInteger(SECItem *it) 225 DER_GetUInteger(SECItem *it)
218 { 226 {
(...skipping 18 matching lines...) Expand all
237 if (ival & overflow) { 245 if (ival & overflow) {
238 PORT_SetError(SEC_ERROR_BAD_DER); 246 PORT_SetError(SEC_ERROR_BAD_DER);
239 return ULONG_MAX; 247 return ULONG_MAX;
240 } 248 }
241 ival = ival << 8; 249 ival = ival << 8;
242 ival |= *cp++; 250 ival |= *cp++;
243 --len; 251 --len;
244 } 252 }
245 return ival; 253 return ival;
246 } 254 }
OLDNEW
« no previous file with comments | « nss/lib/ssl/sslerr.h ('k') | nss/lib/util/dertime.c » ('j') | nss/lib/util/secoid.c » ('J')

Powered by Google App Engine
This is Rietveld 408576698