Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java Card > Проблема с MessageDigest


Автор: romul 12.6.2008, 11:21
Привет, всем. Я снова со своей мелочью.

Предполагал использовать MessageDigest приблизительно так:
Код
private short getMD5Hash(APDU apdu, byte[] msg, short msgOffset, short msgLength, byte[] hash) {
  try {
    MessageDigest MD = MessageDigest.getInstance(MessageDigest.ALG_MD5, false);
    if (MD.getLength() > hash.length) { return 1;}
    MD.doFinal(msg, msgOffset, msgLength, hash, (short) 0);
  } catch (CryptoException e) {
    return e.getReason();
  }
  return 0;
}


в строке с getInstance выдает банальное "6F 00 Status: No precise diagnosis" (не отсутствие алгоритма, а именно 6F 00)

Гугль мне предложил изменить алгоритм или перенести getInstance в конструктор. Попытка воспользоваться советами была неудачна. Результат остался тот же. Так же не помогло использование javacard.security.Signature вместо MessageDigest.

На симуляторе все работает как нельзя лучше. На реальных карточках (Global platform 2.1.1) все дохнет.

Кто-то сталкивался с подобной проблемой?

Автор: firstone 17.6.2008, 13:26
Привет!

Какие карты?

Автор: romul 17.6.2008, 18:16
Цитата(firstone @ 17.6.2008,  13:26)
Привет!

Какие карты?

NCR-овские
ATR - 3B 66 00 FF 4A 43 4F 50 32 30

Автор: firstone 18.6.2008, 07:54
Для лучшего понятия проблемы необходимо сделать следующее:
Напишите в коммандной строке JCShell комманду: /identify и перекопируйте сюда результат.
Перекопируйте также лог всех посланных/полученных данных на/с карты/у.
Цитата(romul @  17.6.2008,  18:16 Найти цитируемый пост)
NCR-овские

А какая именно это карта? Есть где-нибудь список ее фич?

Автор: romul 18.6.2008, 11:04
Цитата(firstone @ 18.6.2008,  07:54)
Для лучшего понятия проблемы необходимо сделать следующее:
Напишите в коммандной строке JCShell комманду: /identify и перекопируйте сюда результат.

cm>  /identify
jcshell: Identification failed - unexpected response (CM=com.ibm.jc.CardManager).
cm>  identify
jcshell: No such command: identify

C identify что то не получается. Список фич сегодня поищу.

Цитата(firstone @ 18.6.2008,  07:54)
Перекопируйте также лог всех посланных/полученных данных на/с карты/у.

Не совсем понял что нужно? Вплоть до отсылки cap файла?

Код

cm>  /term "winscard:4|ACS ACR38U 0"
--Opening terminal
>  /card -a a000000003000000 -c com.ibm.jc.CardManager
--Waiting for card...
ATR=3B 66 00 FF 4A 43 4F 50 32 30                      ;f..JCOP20
ATR: T=0, N=-1, Hist="JCOP20"
 => 00 A4 04 00 08 A0 00 00 00 03 00 00 00 00          ..............
 (74944 usec)
 <= 6F 19 84 08 A0 00 00 00 03 00 00 00 A5 0D 9F 6E    o..............n
    06 40 51 30 23 20 17 9F 65 01 FF 90 00             .@Q0# ..e....
Status: No Error
cm>  set-key 255/1/DES-ECB/404142434445464748494a4b4c4d4e4f 255/2/DES-ECB/404142434445464748494a4b4c4d4e4f 255/3/DES-ECB/404142434445464748494a4b4c4d4e4f
cm>  init-update 255
 => 80 50 00 00 08 86 A5 DF 46 AD BC A2 5E 00          .P......F...^.
 (106189 usec)
 <= 00 00 51 75 00 17 22 90 75 90 01 01 D7 9B AA EA    ..Qu..".u.......
    8C BA 71 37 0A C0 18 0A DC 0A DE F3 90 00          ..q7..........
Status: No Error
cm>  ext-auth plain
 => 84 82 00 00 10 4A 56 86 F2 FE 60 2C AD 34 0A 20    .....JV...`,.4. 
    AF D8 1A 1C 0C                                     .....
 (56751 usec)
 <= 90 00                                              ..
Status: No Error


Потом идет delete, upload, install
Потом:

Код

cm>  card-info
 => 80 F2 80 00 02 4F 00 00                            .....O..
 (49437 usec)
 <= 08 A0 00 00 00 03 00 00 00 07 9E 90 00             .............
Status: No Error
 => 80 F2 40 00 02 4F 00 00                            ..@..O..
 (58788 usec)
 <= 10 00 00 10 70 00 FF 00 01 00 01 00 01 00 01 00    ....p...........
    00 07 00 90 00                                     .....
Status: No Error
 => 80 F2 10 00 02 4F 00 00                            .....O..
 (23785 usec)
 <= 6A 86 
Status: Incorrect parameters (P1,P2)
 => 80 F2 20 00 02 4F 00 00                            .. ..O..
 (163756 usec)
 <= 07 A0 00 00 00 62 00 01 01 00 07 A0 00 00 00 62    .....b.........b
    01 01 01 00 07 A0 00 00 00 62 01 02 01 00 07 A0    .........b......
    00 00 00 62 02 01 01 00 07 A0 00 00 00 03 00 00    ...b............
    01 00 07 A0 00 00 00 03 60 10 01 00 05 31 50 41    ........`....1PA
    59 2E 01 00 10 00 00 10 70 00 FF 00 01 00 01 00    Y.......p.......
    00 00 00 00 00 01 00 90 00                         .........
Status: No Error

Автор: romul 18.6.2008, 14:46
Цитата(firstone @ 18.6.2008,  07:54)
А какая именно это карта? Есть где-нибудь список ее фич?

Нарыл пока только это:
-----------------------------------------
Карты JCOP 
Стандарты : Java Card 2.2.1, Global Platform 2.1.1, EMV 
Протоколы : ISO 7816 T=0, ISO 7816 T=1
Операционная система I BM 
JCOP 21
VSDC 2.5.1, 10-72 EEPROM, Triple-DES coprocessor, FameX RSA coprocessor.

Автор: neutrino 19.6.2008, 09:27
Секунду, так это карты JCOP или NCR?

Автор: romul 19.6.2008, 17:25
Прошу меня простить.
Карточка NXP (филипсовская). NCR это только производитель пластика в которую чип вгонялся. Внутренности карточки JCOP.

Автор: neutrino 20.6.2008, 12:30
Если это JCOP, то нужная реализация должна быть.

Вот накопал кое-что посмотрите, может поможет:
Код

/**
* 
*/*
*package hash_test;*
 
*import javacard.framework.*;
import javacard.security.*;
 
/**
* @author Jeffreyc
* /select A00000000002
* /send 00AA010000
* <= 01 01 90 00
*/
public class hash extends javacard.framework.Applet
{
//globals
//final short dataOffset = (short) ISO7816.OFFSET_CDATA;
MessageDigest MD5;
MessageDigest RIPEMD160;
MessageDigest SHA;
 
//constructor
private hash (byte bArray[], short bOffset, byte bLength)
{
//MD5 = MessageDigest.getInstance(MessageDigest.ALG_MD5, false); 
//SHA = MessageDigest.getInstance(MessageDigest.ALG_SHA, false);
register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
//install
public static void install(byte bArray[], short bOffset, byte bLength)
{
new hash (bArray, bOffset, bLength);
}
 
public void process(APDU apdu)
{
byte[] buf = apdu.getBuffer();
if (selectingApplet())
{
return;
}
if (buf[ISO7816.OFFSET_CLA] != 0) ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
 
if (buf[ISO7816.OFFSET_INS] != (byte) (0xAA)) ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
 
switch (buf[ISO7816.OFFSET_P1])
{
case (byte) 0x01:
//byte[] a = new byte[(short) 2];
short b= (short)0;
try {
//RIPEMD160 = MessageDigest.getInstance(MessageDigest.ALG_RIPEMD160, false);
MD5 = MessageDigest.getInstance(MessageDigest.ALG_MD5, false);
b= (short) (b+1) ;
}
catch(Exception e) {
//ISOException.throwIt((short) 0x9999 );
}
finally {
b= (short) ((short) b << 4 ) ;
}
try {
RIPEMD160 = MessageDigest.getInstance(MessageDigest.ALG_RIPEMD160, false);
//MD5 = MessageDigest.getInstance(MessageDigest.ALG_MD5, false);
b= (short) (b+1) ;
}
catch(Exception e) {
//ISOException.throwIt((short) 0x9999 );
}
 
finally {
b= (short) ((short) b << 4 ) ;
}
 
try {
SHA = MessageDigest.getInstance(MessageDigest.ALG_SHA, false);
//MD5 = MessageDigest.getInstance(MessageDigest.ALG_MD5, false);
b= (short) (b+1) ;
}
catch(Exception e) {
//ISOException.throwIt((short) 0x9999 );
}
 
finally {
//b= (short) ((short) b << 4 ) ;
}
Util.setShort(apdu.getBuffer(), (short)0, b);
apdu.setOutgoingAndSend((short)0, (short)2); 
return;
default:
ISOException.throwIt(ISO7816.SW_WRONG_P1P2);
}
}
 
 
 
}


Автор: romul 20.6.2008, 18:52
Цитата(neutrino @ 20.6.2008,  12:30)
Если это JCOP, то нужная реализация должна быть.
Вот накопал кое-что посмотрите, может поможет:

Спасибо. Я следил за вашей темой там. Тут приведена стандартная реализация как бы можно было реализовать это по хелпу. Но, к сожалению, она у меня не проходит. Ищу кого-то, кто мог бы мне подсказать почему может быть затык.

Теоретически возможно, что карта не поддерживает вообще дайджесты. Но что-то мне подсказывает, что это врядли.

Автор: neutrino 21.6.2008, 16:59
Цитата(romul @  20.6.2008,  17:52 Найти цитируемый пост)
Спасибо. Я следил за вашей темой там. 

smile
Тогда посмотрите на это:
Цитата

You probably have an old JCOP version: v2.
- It does not understand the IDENTIFY command.
- Supports only SCP 01. Looking at your INIT-UPD command, this is the case.
- Also the ATR historical characters indicate JCOP20.
- The ATR itself is according to Visa.

According to the data sheet it supports MD5. Be aware that this JCOP version supports Java Card 2.1.1 and OpenPlatform 2.0.1'.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)