Changeset 3080

Show
Ignore:
Timestamp:
12/18/06 21:58:16 (2 years ago)
Author:
aj
Message:

update to latest muscle code.

Location:
trunk/src/libopensc
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/libopensc/card-muscle.c

    r3068 r3080  
    460460        priv->fs->udata = card; 
    461461        priv->fs->listFile = _listFile; 
     462 
     463        card->cla = 0xB0; 
    462464         
    463465        card->flags |= SC_CARD_FLAG_ONBOARD_KEY_GEN; 
     
    515517{ 
    516518        muscle_private_t* priv = MUSCLE_DATA(card); 
     519        const int bufferLength = MSC_MAX_PIN_COMMAND_LENGTH; 
     520        u8 buffer[bufferLength]; 
    517521        switch(cmd->cmd) { 
    518522        case SC_PIN_CMD_VERIFY: 
     
    521525                        sc_apdu_t apdu; 
    522526                        int r; 
    523                         msc_verify_pin_apdu(card, &apdu, cmd->pin_reference, cmd->pin1.data, cmd->pin1.len); 
     527                        msc_verify_pin_apdu(card, &apdu, buffer, bufferLength, cmd->pin_reference, cmd->pin1.data, cmd->pin1.len); 
    524528                        cmd->apdu = &apdu; 
    525529                        cmd->pin1.offset = 5; 
     
    541545                case SC_AC_CHV: { 
    542546                        sc_apdu_t apdu; 
    543                         msc_change_pin_apdu(card, &apdu, cmd->pin_reference, cmd->pin1.data, cmd->pin1.len, cmd->pin2.data, cmd->pin2.len); 
     547                        msc_change_pin_apdu(card, &apdu, buffer, bufferLength, cmd->pin_reference, cmd->pin1.data, cmd->pin1.len, cmd->pin2.data, cmd->pin2.len); 
    544548                        cmd->apdu = &apdu; 
    545549                        return iso_pin_cmd(card, cmd, tries_left); 
     
    557561                case SC_AC_CHV: { 
    558562                        sc_apdu_t apdu; 
    559                         msc_unblock_pin_apdu(card, &apdu, cmd->pin_reference, cmd->pin1.data, cmd->pin1.len); 
     563                        msc_unblock_pin_apdu(card, &apdu, buffer, bufferLength, cmd->pin_reference, cmd->pin1.data, cmd->pin1.len); 
    560564                        cmd->apdu = &apdu; 
    561565                        return iso_pin_cmd(card, cmd, tries_left); 
  • trunk/src/libopensc/muscle-filesystem.h

    r3069 r3080  
    2929        u8 id[4]; 
    3030} msc_id; 
    31  
    3231 
    3332typedef struct mscfs_file { 
  • trunk/src/libopensc/muscle.c

    r3069 r3080  
    2323#include <string.h> 
    2424 
    25 #define MSC_MAX_WRITE_UNIT 255 
    26 #define MSC_MAX_READ_UNIT 246 
    27  
    28 #define MSC_MAX_CRYPTINIT_DATA (255 - 5) 
    29 #define MSC_MAX_CRYPTPROCESS_DATA (255 - 3) 
    30  
    3125#define MSC_RSA_PUBLIC          0x01 
    3226#define MSC_RSA_PRIVATE         0x02 
     
    5145 
    5246        sc_format_apdu(card, &apdu, SC_APDU_CASE_2, 0x58, next, 0x00); 
    53         apdu.cla = 0xB0; 
    5447        apdu.le = 14; 
    5548        apdu.resplen = 14; 
     
    125118        int r; 
    126119        size_t i; 
    127         for(i = 0; i < dataLength; i += MSC_MAX_WRITE_UNIT) { 
    128                 r = msc_partial_read_object(card, objectId, offset + i, data + i, MIN(dataLength - i, MSC_MAX_WRITE_UNIT)); 
     120        size_t max_read_unit = MSC_MAX_READ; 
     121 
     122        for(i = 0; i < dataLength; i += max_read_unit) { 
     123                r = msc_partial_read_object(card, objectId, offset + i, data + i, MIN(dataLength - i, max_read_unit)); 
    129124                SC_TEST_RET(card->ctx, r, "Error in partial object read"); 
    130125        } 
     
    134129int msc_zero_object(sc_card_t *card, msc_id objectId, size_t dataLength) 
    135130{ 
    136         u8 zeroBuffer[MSC_MAX_WRITE_UNIT]; 
     131        u8 zeroBuffer[MSC_MAX_APDU]; 
    137132        size_t i; 
    138         memset(zeroBuffer, 0, MSC_MAX_WRITE_UNIT); 
    139         for(i = 0; i < dataLength; i += MSC_MAX_WRITE_UNIT) { 
    140                 int r = msc_partial_update_object(card, objectId, i, zeroBuffer, MIN(dataLength - i, MSC_MAX_WRITE_UNIT)); 
     133        size_t max_write_unit = MSC_MAX_SEND - 9; /* - 9 for object ID+length */ 
     134 
     135        memset(zeroBuffer, 0, max_write_unit); 
     136        for(i = 0; i < dataLength; i += max_write_unit) { 
     137                int r = msc_partial_update_object(card, objectId, i, zeroBuffer, MIN(dataLength - i, max_write_unit)); 
    141138                SC_TEST_RET(card->ctx, r, "Error in zeroing file update"); 
    142139        } 
     
    182179} 
    183180 
    184 /* Update up to 246 bytes */ 
     181/* Update up to MSC_MAX_READ - 9 bytes */ 
    185182int msc_partial_update_object(sc_card_t *card, msc_id objectId, int offset, const u8 *data, size_t dataLength) 
    186183{ 
    187         u8 buffer[256]; 
     184        u8 buffer[MSC_MAX_APDU]; 
    188185        sc_apdu_t apdu; 
    189186        int r; 
     
    225222        int r; 
    226223        size_t i; 
    227         for(i = 0; i < dataLength; i += MSC_MAX_READ_UNIT) { 
    228                 r = msc_partial_update_object(card, objectId, offset + i, data + i, MIN(dataLength - i, MSC_MAX_READ_UNIT)); 
     224        size_t max_write_unit = MSC_MAX_SEND - 9; 
     225        for(i = 0; i < dataLength; i += max_write_unit) { 
     226                r = msc_partial_update_object(card, objectId, offset + i, data + i, MIN(dataLength - i, max_write_unit)); 
    229227                SC_TEST_RET(card->ctx, r, "Error in partial object update"); 
    230228        } 
     
    279277} 
    280278 
     279/* Truncate the nulls at the end of a PIN, useful in padding is unnecessarily added */ 
     280static void truncatePinNulls(const u8* pin, int *pinLength) { 
     281        for(; *pinLength > 0; (*pinLength)--) { 
     282                if(pin[*pinLength - 1]) break; 
     283        } 
     284} 
     285 
    281286int msc_verify_pin(sc_card_t *card, int pinNumber, const u8 *pinValue, int pinLength, int *tries) 
    282287{ 
     
    284289        int r; 
    285290 
    286         msc_verify_pin_apdu(card, &apdu, pinNumber, pinValue, pinLength); 
     291        const int bufferLength = MSC_MAX_PIN_LENGTH; 
     292        u8 buffer[bufferLength]; 
     293        assert(pinLength <= MSC_MAX_PIN_LENGTH); 
     294 
     295        msc_verify_pin_apdu(card, &apdu, buffer, bufferLength, pinNumber, pinValue, pinLength); 
    287296        if(tries) 
    288297                *tries = -1; 
     
    305314 
    306315/* USE ISO_VERIFY due to tries return */ 
    307 void msc_verify_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, int pinNumber, const u8 *pinValue, int pinLength) 
    308 { 
    309         /* FORCE PIN TO END AFTER LAST NULL */ 
    310         for(; pinLength > 0; pinLength--) { 
    311                 if(pinValue[pinLength - 1]) break; 
    312         } 
     316void msc_verify_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, u8* buffer, size_t bufferLength, int pinNumber, const u8 *pinValue, int pinLength) 
     317{ 
     318        assert(buffer); 
     319        assert(bufferLength >= pinLength); 
     320        assert(pinLength <= MSC_MAX_PIN_LENGTH); 
     321 
     322        truncatePinNulls(pinValue, &pinLength); 
     323 
     324        memcpy(buffer, pinValue, pinLength); 
    313325        sc_format_apdu(card, apdu, SC_APDU_CASE_3_SHORT, 0x42, pinNumber, 0); 
    314326        apdu->lc = pinLength; 
    315         apdu->data = pinValue; 
     327        apdu->data = buffer; 
    316328        apdu->datalen = pinLength; 
    317329} 
     
    321333        sc_apdu_t apdu; 
    322334        int r; 
    323  
    324         msc_unblock_pin_apdu(card, &apdu, pinNumber, pukValue, pukLength); 
     335        const int bufferLength = MSC_MAX_PIN_LENGTH; 
     336        u8 buffer[bufferLength]; 
     337 
     338        assert(pukLength <= MSC_MAX_PIN_LENGTH); 
     339 
     340        msc_unblock_pin_apdu(card, &apdu, buffer, bufferLength, pinNumber, pukValue, pukLength); 
    325341        if(tries) 
    326342                *tries = -1; 
     
    342358} 
    343359 
    344 void msc_unblock_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, int pinNumber, const u8 *pukValue, int pukLength) 
    345 { 
     360void msc_unblock_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, u8* buffer, size_t bufferLength, int pinNumber, const u8 *pukValue, int pukLength) 
     361{ 
     362        assert(buffer); 
     363        assert(bufferLength >= pukLength); 
     364        assert(pukLength <= MSC_MAX_PIN_LENGTH); 
     365 
     366        truncatePinNulls(pukValue, &pukLength); 
     367 
     368        memcpy(buffer, pukValue, pukLength); 
    346369        sc_format_apdu(card, apdu, SC_APDU_CASE_3_SHORT, 0x46, pinNumber, 0); 
    347370        apdu->lc = pukLength; 
    348         apdu->data = pukValue; 
     371        apdu->data = buffer; 
    349372        apdu->datalen = pukLength; 
    350373} 
     
    354377        sc_apdu_t apdu; 
    355378        int r; 
    356  
    357         msc_change_pin_apdu(card, &apdu, pinNumber, pinValue, pinLength, newPin, newPinLength); 
     379        const int bufferLength = (MSC_MAX_PIN_LENGTH + 1) * 2; 
     380        u8 buffer[bufferLength]; 
     381 
     382        msc_change_pin_apdu(card, &apdu, buffer, bufferLength, pinNumber, pinValue, pinLength, newPin, newPinLength); 
    358383        if(tries) 
    359384                *tries = -1; 
     
    376401 
    377402/* USE ISO_VERIFY due to tries return */ 
    378 void msc_change_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, int pinNumber, const u8 *pinValue, int pinLength, const u8 *newPin, int newPinLength) 
    379 { 
    380         u8 pinData[512]; /* Absolute max size 255 * 2 + 2 */ 
    381         u8 *ptr = pinData; 
     403void msc_change_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, u8* buffer, size_t bufferLength, int pinNumber, const u8 *pinValue, int pinLength, const u8 *newPin, int newPinLength) 
     404{ 
     405        u8 *ptr; 
     406        assert(pinLength <= MSC_MAX_PIN_LENGTH); 
     407        assert(newPinLength <= MSC_MAX_PIN_LENGTH); 
     408        assert(buffer); 
     409        assert(bufferLength >= pinLength + newPinLength + 2); 
     410 
     411        truncatePinNulls(pinValue, &pinLength); 
     412        truncatePinNulls(newPin, &newPinLength); 
     413 
     414        ptr = buffer; 
    382415 
    383416        sc_format_apdu(card, apdu, SC_APDU_CASE_3_SHORT, 0x44, pinNumber, 0); 
     
    392425        apdu->lc = pinLength + newPinLength + 2; 
    393426        apdu->datalen = apdu->lc; 
    394         apdu->data = pinData; 
     427        apdu->data = buffer; 
    395428} 
    396429 
     
    401434        u8 *buffer, *ptr; 
    402435         
    403         location = (dataLength < 255) ? 1 : 2; /* 1 == APDU, 2 == (seed in 0xFFFFFFFE, out in 0xFFFFFFFF) */ 
     436        location = (dataLength < MSC_MAX_READ) ? 1 : 2; /* 1 == APDU, 2 == (seed in 0xFFFFFFFE, out in 0xFFFFFFFF) */ 
    404437        cse = (location == 1) ? SC_APDU_CASE_4_SHORT : SC_APDU_CASE_3_SHORT; 
    405438        len = seedLength + 4; 
    406  
    407         assert(seedLength < 251); 
    408         assert(dataLength < 255); /* Output buffer doesn't seem to operate as desired.... nobody can read/delete */ 
     439         
     440        assert(seedLength < MSC_MAX_SEND - 4); 
     441        assert(dataLength < MSC_MAX_READ - 9); /* Output buffer doesn't seem to operate as desired.... nobody can read/delete */ 
    409442         
    410443        buffer = malloc(len); 
     
    476509{ 
    477510        sc_apdu_t apdu; 
    478         u8 buffer[256]; 
     511        u8 buffer[16]; /* Keypair payload length */ 
    479512        u8 *ptr = buffer; 
    480513        int r; 
     
    570603        if(r < 0) SC_FUNC_RETURN(card->ctx, 0, r); 
    571604         
    572         /* Read keyType, keySize, and what should be the modulus size */         
     605        /* Read keyType, keySize, and what should be the modulus size */ 
    573606        r = msc_read_object(card, inputId, fileLocation, buffer, 5); 
    574607        fileLocation += 5; 
     
    617650{ 
    618651        sc_apdu_t apdu; 
    619         u8 buffer[255]; 
     652        u8 buffer[MSC_MAX_APDU]; 
    620653        u8 *ptr; 
    621654        int r; 
    622655 
    623         u8 outputBuffer[255]; 
     656        u8 outputBuffer[MSC_MAX_APDU]; 
    624657        sc_format_apdu(card, &apdu, SC_APDU_CASE_4_SHORT, 0x36, keyLocation, 0x01); /* Init */ 
    625658        apdu.data = buffer; 
     
    645678                 *outputDataLength = receivedData; 
    646679                *outputDataLength = 0; 
    647                 assert(receivedData <= 255); 
     680                assert(receivedData <= MSC_MAX_APDU); 
    648681                memcpy(outputData, outputBuffer + 2, receivedData); 
    649682                return 0; 
     
    669702{ 
    670703        sc_apdu_t apdu; 
    671         u8 buffer[255]; 
    672         u8 outputBuffer[255]; 
     704        u8 buffer[MSC_MAX_APDU]; 
     705        u8 outputBuffer[MSC_MAX_APDU]; 
    673706        u8 *ptr; 
    674707        int r; 
     708 
     709        if(dataLength > MSC_MAX_SEND - 3) 
     710                return SC_ERROR_INVALID_ARGUMENTS; 
    675711 
    676712        sc_format_apdu(card, &apdu, SC_APDU_CASE_4_SHORT, 0x36, keyLocation, 0x02); /* Process */ 
     
    683719        memset(outputBuffer, 0, sizeof(outputBuffer)); 
    684720        apdu.resp = outputBuffer; 
    685         apdu.resplen = 255; 
     721        apdu.resplen = MSC_MAX_READ; 
    686722        apdu.le = dataLength; 
    687723        ptr = buffer; 
     
    697733                 *outputDataLength = receivedData; 
    698734                *outputDataLength = 0; 
    699                 assert(receivedData <= 255); 
     735                assert(receivedData <= MSC_MAX_APDU); 
    700736                memcpy(outputData, outputBuffer + 2, receivedData); 
    701737                return 0; 
     
    721757{ 
    722758        sc_apdu_t apdu; 
    723         u8 buffer[255]; 
    724         u8 outputBuffer[255]; 
     759        u8 buffer[MSC_MAX_APDU]; 
     760        u8 outputBuffer[MSC_MAX_APDU]; 
    725761        u8 *ptr; 
    726762        int r; 
     
    734770        memset(outputBuffer, 0, sizeof(outputBuffer)); 
    735771        apdu.resp = outputBuffer; 
    736         apdu.resplen = 255; 
    737         apdu.le = 255; 
     772        apdu.resplen = MSC_MAX_READ; 
     773        apdu.le = MSC_MAX_READ; 
    738774        ptr = buffer; 
    739775        *ptr = 0x01; ptr++; /* DATA LOCATION: APDU */ 
     
    747783                short receivedData = outputBuffer[0] << 8 | outputBuffer[1]; 
    748784                *outputDataLength = receivedData; 
    749                 assert(receivedData <= 255); 
     785                assert(receivedData <= MSC_MAX_APDU); 
    750786                memcpy(outputData, outputBuffer + 2, receivedData); 
    751787                return 0; 
     
    794830        inPtr += toSend; 
    795831        outPtr += received; 
    796         while(left > MSC_MAX_CRYPTPROCESS_DATA) { 
    797                 toSend = MIN(left, MSC_MAX_CRYPTINIT_DATA); 
     832        while(left > (MSC_MAX_SEND - 5)) { 
     833                toSend = MIN(left, (MSC_MAX_SEND - 5)); 
    798834                r = msc_compute_crypt_process(card, 
    799835                        keyLocation, 
     
    807843                outPtr += received; 
    808844        } 
    809         toSend = MIN(left, MSC_MAX_CRYPTINIT_DATA); 
     845        toSend = MIN(left, (MSC_MAX_SEND - 5)); 
    810846        r = msc_compute_crypt_final(card, 
    811847                keyLocation, 
  • trunk/src/libopensc/muscle.h

    r3067 r3080  
    2929#include "muscle-filesystem.h" 
    3030 
     31#define MSC_MAX_APDU 256 /* Max APDU send/recv, used for stack allocation */ 
     32#define MSC_MAX_PIN_LENGTH 8 
     33#define MSC_MAX_PIN_COMMAND_LENGTH ((1 + MSC_MAX_PIN_LENGTH) * 2) 
     34 
     35/* Currently max size handled by muscle driver is 255 ... */ 
     36#define MSC_MAX_READ (MIN(card->reader->driver->max_recv_size,255)) 
     37#define MSC_MAX_SEND (MIN(card->reader->driver->max_send_size,255)) 
     38 
    3139int msc_list_objects(sc_card_t* card, u8 next, mscfs_file_t* file); 
    3240int msc_partial_read_object(sc_card_t *card, msc_id objectId, int offset, u8 *data, size_t dataLength); 
     
    4149 
    4250int msc_verify_pin(sc_card_t *card, int pinNumber, const u8 *pinValue, int pinLength, int *tries); 
    43 void msc_verify_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, int pinNumber, const u8 *pinValue, int pinLength); 
     51void msc_verify_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, u8* buffer, size_t bufferLength, int pinNumber, const u8 *pinValue, int pinLength); 
    4452int msc_unblock_pin(sc_card_t *card, int pinNumber, const u8 *pukValue, int pukLength, int *tries); 
    45 void msc_unblock_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, int pinNumber, const u8 *pukValue, int pukLength); 
     53void msc_unblock_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, u8* buffer, size_t bufferLength, int pinNumber, const u8 *pukValue, int pukLength); 
    4654int msc_change_pin(sc_card_t *card, int pinNumber, const u8 *pinValue, int pinLength, const u8 *newPin, int newPinLength, int *tries); 
    47 void msc_change_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, int pinNumber, const u8 *pinValue, int pinLength, const u8 *newPin, int newPinLength); 
     55void msc_change_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, u8* buffer, size_t bufferLength, int pinNumber, const u8 *pinValue, int pinLength, const u8 *newPin, int newPinLength); 
    4856 
    4957int msc_get_challenge(sc_card_t *card, short dataLength, short seedLength, u8 *seedData, u8* outputData);