Changeset 3401 for trunk/src/libopensc/asn1.c
- Timestamp:
- 02/29/08 15:37:46 (11 months ago)
- Files:
-
- 1 modified
-
trunk/src/libopensc/asn1.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/libopensc/asn1.c
r3225 r3401 534 534 if (inlen > sizeof(int)) 535 535 return SC_ERROR_INVALID_ASN1_OBJECT; 536 if (inbuf[0] & 0x80) 537 a = -1; 536 538 for (i = 0; i < inlen; i++) { 537 539 a <<= 8; … … 544 546 static int asn1_encode_integer(int in, u8 ** obj, size_t * objsize) 545 547 { 546 int i = sizeof(in) * 8, skip = 1;548 int i = sizeof(in) * 8, skip_zero, skip_sign; 547 549 u8 *p, b; 548 550 549 *obj = p = (u8 *) malloc(sizeof(in)); 551 if (in < 0) 552 { 553 skip_sign = 1; 554 skip_zero= 0; 555 } 556 else 557 { 558 skip_sign = 0; 559 skip_zero= 1; 560 } 561 *obj = p = (u8 *) malloc(sizeof(in)+1); 550 562 if (*obj == NULL) 551 563 return SC_ERROR_OUT_OF_MEMORY; … … 553 565 i -= 8; 554 566 b = in >> i; 555 if (b == 0 && skip) 567 if (skip_sign) 568 { 569 if (b != 0xff) 570 skip_sign = 0; 571 if (b & 0x80) 572 { 573 *p = b; 574 if (0xff == b) 575 continue; 576 } 577 else 578 { 579 p++; 580 skip_sign = 0; 581 } 582 } 583 if (b == 0 && skip_zero) 556 584 continue; 557 skip = 0; 585 if (skip_zero) { 586 skip_zero = 0; 587 /* prepend 0x00 if MSb is 1 and integer positive */ 588 if ((b & 0x80) != 0 && in > 0) 589 *p++ = 0; 590 } 558 591 *p++ = b; 559 592 } while (i > 0); 593 if (skip_sign) 594 p++; 560 595 *objsize = p - *obj; 561 596 if (*objsize == 0) {
