Changeset 3080
- Timestamp:
- 12/18/06 21:58:16 (2 years ago)
- Location:
- trunk/src/libopensc
- Files:
-
- 4 modified
-
card-muscle.c (modified) (5 diffs)
-
muscle-filesystem.h (modified) (1 diff)
-
muscle.c (modified) (27 diffs)
-
muscle.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/libopensc/card-muscle.c
r3068 r3080 460 460 priv->fs->udata = card; 461 461 priv->fs->listFile = _listFile; 462 463 card->cla = 0xB0; 462 464 463 465 card->flags |= SC_CARD_FLAG_ONBOARD_KEY_GEN; … … 515 517 { 516 518 muscle_private_t* priv = MUSCLE_DATA(card); 519 const int bufferLength = MSC_MAX_PIN_COMMAND_LENGTH; 520 u8 buffer[bufferLength]; 517 521 switch(cmd->cmd) { 518 522 case SC_PIN_CMD_VERIFY: … … 521 525 sc_apdu_t apdu; 522 526 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); 524 528 cmd->apdu = &apdu; 525 529 cmd->pin1.offset = 5; … … 541 545 case SC_AC_CHV: { 542 546 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); 544 548 cmd->apdu = &apdu; 545 549 return iso_pin_cmd(card, cmd, tries_left); … … 557 561 case SC_AC_CHV: { 558 562 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); 560 564 cmd->apdu = &apdu; 561 565 return iso_pin_cmd(card, cmd, tries_left); -
trunk/src/libopensc/muscle-filesystem.h
r3069 r3080 29 29 u8 id[4]; 30 30 } msc_id; 31 32 31 33 32 typedef struct mscfs_file { -
trunk/src/libopensc/muscle.c
r3069 r3080 23 23 #include <string.h> 24 24 25 #define MSC_MAX_WRITE_UNIT 25526 #define MSC_MAX_READ_UNIT 24627 28 #define MSC_MAX_CRYPTINIT_DATA (255 - 5)29 #define MSC_MAX_CRYPTPROCESS_DATA (255 - 3)30 31 25 #define MSC_RSA_PUBLIC 0x01 32 26 #define MSC_RSA_PRIVATE 0x02 … … 51 45 52 46 sc_format_apdu(card, &apdu, SC_APDU_CASE_2, 0x58, next, 0x00); 53 apdu.cla = 0xB0;54 47 apdu.le = 14; 55 48 apdu.resplen = 14; … … 125 118 int r; 126 119 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)); 129 124 SC_TEST_RET(card->ctx, r, "Error in partial object read"); 130 125 } … … 134 129 int msc_zero_object(sc_card_t *card, msc_id objectId, size_t dataLength) 135 130 { 136 u8 zeroBuffer[MSC_MAX_ WRITE_UNIT];131 u8 zeroBuffer[MSC_MAX_APDU]; 137 132 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)); 141 138 SC_TEST_RET(card->ctx, r, "Error in zeroing file update"); 142 139 } … … 182 179 } 183 180 184 /* Update up to 246bytes */181 /* Update up to MSC_MAX_READ - 9 bytes */ 185 182 int msc_partial_update_object(sc_card_t *card, msc_id objectId, int offset, const u8 *data, size_t dataLength) 186 183 { 187 u8 buffer[ 256];184 u8 buffer[MSC_MAX_APDU]; 188 185 sc_apdu_t apdu; 189 186 int r; … … 225 222 int r; 226 223 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)); 229 227 SC_TEST_RET(card->ctx, r, "Error in partial object update"); 230 228 } … … 279 277 } 280 278 279 /* Truncate the nulls at the end of a PIN, useful in padding is unnecessarily added */ 280 static void truncatePinNulls(const u8* pin, int *pinLength) { 281 for(; *pinLength > 0; (*pinLength)--) { 282 if(pin[*pinLength - 1]) break; 283 } 284 } 285 281 286 int msc_verify_pin(sc_card_t *card, int pinNumber, const u8 *pinValue, int pinLength, int *tries) 282 287 { … … 284 289 int r; 285 290 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); 287 296 if(tries) 288 297 *tries = -1; … … 305 314 306 315 /* 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 } 316 void 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); 313 325 sc_format_apdu(card, apdu, SC_APDU_CASE_3_SHORT, 0x42, pinNumber, 0); 314 326 apdu->lc = pinLength; 315 apdu->data = pinValue;327 apdu->data = buffer; 316 328 apdu->datalen = pinLength; 317 329 } … … 321 333 sc_apdu_t apdu; 322 334 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); 325 341 if(tries) 326 342 *tries = -1; … … 342 358 } 343 359 344 void msc_unblock_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, int pinNumber, const u8 *pukValue, int pukLength) 345 { 360 void 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); 346 369 sc_format_apdu(card, apdu, SC_APDU_CASE_3_SHORT, 0x46, pinNumber, 0); 347 370 apdu->lc = pukLength; 348 apdu->data = pukValue;371 apdu->data = buffer; 349 372 apdu->datalen = pukLength; 350 373 } … … 354 377 sc_apdu_t apdu; 355 378 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); 358 383 if(tries) 359 384 *tries = -1; … … 376 401 377 402 /* 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; 403 void 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; 382 415 383 416 sc_format_apdu(card, apdu, SC_APDU_CASE_3_SHORT, 0x44, pinNumber, 0); … … 392 425 apdu->lc = pinLength + newPinLength + 2; 393 426 apdu->datalen = apdu->lc; 394 apdu->data = pinData;427 apdu->data = buffer; 395 428 } 396 429 … … 401 434 u8 *buffer, *ptr; 402 435 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) */ 404 437 cse = (location == 1) ? SC_APDU_CASE_4_SHORT : SC_APDU_CASE_3_SHORT; 405 438 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 */ 409 442 410 443 buffer = malloc(len); … … 476 509 { 477 510 sc_apdu_t apdu; 478 u8 buffer[ 256];511 u8 buffer[16]; /* Keypair payload length */ 479 512 u8 *ptr = buffer; 480 513 int r; … … 570 603 if(r < 0) SC_FUNC_RETURN(card->ctx, 0, r); 571 604 572 /* Read keyType, keySize, and what should be the modulus size */ 605 /* Read keyType, keySize, and what should be the modulus size */ 573 606 r = msc_read_object(card, inputId, fileLocation, buffer, 5); 574 607 fileLocation += 5; … … 617 650 { 618 651 sc_apdu_t apdu; 619 u8 buffer[ 255];652 u8 buffer[MSC_MAX_APDU]; 620 653 u8 *ptr; 621 654 int r; 622 655 623 u8 outputBuffer[ 255];656 u8 outputBuffer[MSC_MAX_APDU]; 624 657 sc_format_apdu(card, &apdu, SC_APDU_CASE_4_SHORT, 0x36, keyLocation, 0x01); /* Init */ 625 658 apdu.data = buffer; … … 645 678 *outputDataLength = receivedData; 646 679 *outputDataLength = 0; 647 assert(receivedData <= 255);680 assert(receivedData <= MSC_MAX_APDU); 648 681 memcpy(outputData, outputBuffer + 2, receivedData); 649 682 return 0; … … 669 702 { 670 703 sc_apdu_t apdu; 671 u8 buffer[ 255];672 u8 outputBuffer[ 255];704 u8 buffer[MSC_MAX_APDU]; 705 u8 outputBuffer[MSC_MAX_APDU]; 673 706 u8 *ptr; 674 707 int r; 708 709 if(dataLength > MSC_MAX_SEND - 3) 710 return SC_ERROR_INVALID_ARGUMENTS; 675 711 676 712 sc_format_apdu(card, &apdu, SC_APDU_CASE_4_SHORT, 0x36, keyLocation, 0x02); /* Process */ … … 683 719 memset(outputBuffer, 0, sizeof(outputBuffer)); 684 720 apdu.resp = outputBuffer; 685 apdu.resplen = 255;721 apdu.resplen = MSC_MAX_READ; 686 722 apdu.le = dataLength; 687 723 ptr = buffer; … … 697 733 *outputDataLength = receivedData; 698 734 *outputDataLength = 0; 699 assert(receivedData <= 255);735 assert(receivedData <= MSC_MAX_APDU); 700 736 memcpy(outputData, outputBuffer + 2, receivedData); 701 737 return 0; … … 721 757 { 722 758 sc_apdu_t apdu; 723 u8 buffer[ 255];724 u8 outputBuffer[ 255];759 u8 buffer[MSC_MAX_APDU]; 760 u8 outputBuffer[MSC_MAX_APDU]; 725 761 u8 *ptr; 726 762 int r; … … 734 770 memset(outputBuffer, 0, sizeof(outputBuffer)); 735 771 apdu.resp = outputBuffer; 736 apdu.resplen = 255;737 apdu.le = 255;772 apdu.resplen = MSC_MAX_READ; 773 apdu.le = MSC_MAX_READ; 738 774 ptr = buffer; 739 775 *ptr = 0x01; ptr++; /* DATA LOCATION: APDU */ … … 747 783 short receivedData = outputBuffer[0] << 8 | outputBuffer[1]; 748 784 *outputDataLength = receivedData; 749 assert(receivedData <= 255);785 assert(receivedData <= MSC_MAX_APDU); 750 786 memcpy(outputData, outputBuffer + 2, receivedData); 751 787 return 0; … … 794 830 inPtr += toSend; 795 831 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)); 798 834 r = msc_compute_crypt_process(card, 799 835 keyLocation, … … 807 843 outPtr += received; 808 844 } 809 toSend = MIN(left, MSC_MAX_CRYPTINIT_DATA);845 toSend = MIN(left, (MSC_MAX_SEND - 5)); 810 846 r = msc_compute_crypt_final(card, 811 847 keyLocation, -
trunk/src/libopensc/muscle.h
r3067 r3080 29 29 #include "muscle-filesystem.h" 30 30 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 31 39 int msc_list_objects(sc_card_t* card, u8 next, mscfs_file_t* file); 32 40 int msc_partial_read_object(sc_card_t *card, msc_id objectId, int offset, u8 *data, size_t dataLength); … … 41 49 42 50 int 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);51 void msc_verify_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, u8* buffer, size_t bufferLength, int pinNumber, const u8 *pinValue, int pinLength); 44 52 int 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);53 void msc_unblock_pin_apdu(sc_card_t *card, sc_apdu_t *apdu, u8* buffer, size_t bufferLength, int pinNumber, const u8 *pukValue, int pukLength); 46 54 int 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);55 void 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); 48 56 49 57 int msc_get_challenge(sc_card_t *card, short dataLength, short seedLength, u8 *seedData, u8* outputData);
