Show
Ignore:
Timestamp:
02/29/08 15:37:46 (11 months ago)
Author:
ludovic.rousseau
Message:

sc_asn1_decode_integer/asn1_encode_integer: correctly manage negative
numbers and some positive numbers like 128

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/libopensc/asn1.c

    r3225 r3401  
    534534        if (inlen > sizeof(int)) 
    535535                return SC_ERROR_INVALID_ASN1_OBJECT; 
     536        if (inbuf[0] & 0x80) 
     537                a = -1; 
    536538        for (i = 0; i < inlen; i++) { 
    537539                a <<= 8; 
     
    544546static int asn1_encode_integer(int in, u8 ** obj, size_t * objsize) 
    545547{ 
    546         int i = sizeof(in) * 8, skip = 1; 
     548        int i = sizeof(in) * 8, skip_zero, skip_sign; 
    547549        u8 *p, b; 
    548550 
    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); 
    550562        if (*obj == NULL) 
    551563                return SC_ERROR_OUT_OF_MEMORY; 
     
    553565                i -= 8; 
    554566                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) 
    556584                        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                } 
    558591                *p++ = b; 
    559592        } while (i > 0); 
     593        if (skip_sign) 
     594                p++; 
    560595        *objsize = p - *obj; 
    561596        if (*objsize == 0) {