А тут просто возникло не допонимание, карта то не мобильника, простая карта Сименс, там хранятся данные толи пациентов толи еще кого-то. Так что я делаю все чисто по IS0-7816. :-)
по ИСО 7816-4 если 9000 то комманда успешна.
Вот еще здесь что-то я не врубился, тут в ИСО для переключения передачи от карты к ридеру нуно сбросить карту, А какой командой?:-)
Люди помогите любителю:-)
Выбирая файл на карте все нормально возвращает 90:00
Начинаю считывать на х.. ошибка CT-API 11(типа выделенный буфер слишком мал для читаемых данных) бл.. увеличиваю буфер он мне возвращает Err Parametr. Бл. какой буфер у меня карта(Сименс) на х.. позволяет читать файл целиком на х.. Если кто встречался с такой бородой помогите.
Каким API пользуешся ?24.06.02 10:01 Автор: PS <PS> Статус: Elderman Отредактировано 24.06.02 10:27 Количество правок: 1
Какой ридер ? Пример программы можешь дать ?
И еще: почему у тебя select выдает 90 00 ? Такой код он не должен возвращать. При нормальном завершении операции он возвращает 9F xx.
[C++] Каким API пользуешся ?25.06.02 04:15 Автор: Full shrize Статус: Незарегистрированный пользователь
> Какой ридер ? Пример программы можешь дать ? > И еще: почему у тебя select выдает 90 00 ? Такой код он не > должен возвращать. При нормальном завершении операции он > возвращает 9F xx. 1) Я извиняюсь да он возвращает 9F.:-)
2)ридер ECO5000 (ORGA).
синхронная передача
3)
sad=2;
dad=00;
fprintf(fil_out,"SELECT FILE\n");
command[0]=0x00; // CLA
command[1]=0xA4; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=0x02; // L
command[5]=0x2F;
command[6]=0x00;
res=CT_data (ctn,&dad,&sad,7,command,&lenr,response);
command[0]=0x00; // CLA
command[1]=0xB0; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=0x00; // L
//command1[5]=0x00;
//command1[6]=0x00;
res=CT_data (ctn,&dad,&sad,5,command,&lenr,response);
Здесь вызываю CT_API.dll
Наскоко мне удалось найти то READ BINARY не читает МФ и Дир секции(но это у GSM)у карты нет никаких security. Вот и как прочитать эту Дир потому что мне кажется на этой карте до х.. апликаций:-) (карта -страховой полис)
> command[0]=0x00; // CLA правильно A0
> command[1]=0xA4; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > command[4]=0x02; // L > command[5]=0x2F; > command[6]=0x00; Что за файл ?
> command[0]=0x00; // CLA A0
> command[1]=0xB0; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > command[4]=0x00; // L тут длинна
> //command1[5]=0x00; > //command1[6]=0x00; Эти два нафиг не нужны.
> Наскоко мне удалось найти то READ BINARY не читает МФ и Дир > секции(но это у GSM) Не читает, только двоичные файлы. Для MF используй READ RECORD.
Какой именно файл - GET RESPONSE после SELECT. Там же и длинна доступная для чтения.
Прочесть дирестории нельзя. Узнать файлы в директории - можно, но комманда специфична для каждого производителя. Либо полным перебором.
Еще один Так26.06.02 09:11 Автор: Full shrize Статус: Незарегистрированный пользователь
command[0]=0x00; // CLA
или опять A0
command[1]=0xC0; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=0x10; // L
res=CT_data (ctn,&dad,&sad,5,command,&lenr,response);
после этого в lenr будет хранится длина файла?
fprintf(fil_out,"READ RECORD\n");
sad=2; /* source = host */
dad=00;
command[0]=0xA0; // CLA
command[1]=0xB2; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=lenr; // L
res=CT_data (ctn,&dad,&sad,5,command,&lenr,response);
тут вопрос на счет длины у меня карта считывает все сразу, не указывая длины поэтому command[4] должен быть равен Empty?
Не так :)26.06.02 10:20 Автор: PS <PS> Статус: Elderman
Не так.
SELECT
Получаешь 9F XX
command[0]=0xA0; // CLA
command[1]=0xC0; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=0xXX; // L
> res=CT_data (ctn,&dad,&sad,5,command,&lenr,response); > после этого в lenr будет хранится длина файла? НЕТ, в len будет ко-во байт в response
Далее расскладываешь этот response по полочкам. Его формат можно найти в спецификации.
Выгребаешь из него тип файла и количество байт доступных для чтения.
И после этого делаешь либо READ BINARY, либо READ RECORD.
Но можно сделать и более криво. Для чтения в P3 засунуть FF. Тогда тебе вернется 67 YY, где YY то количество байт которое карточка от тебя ждала.
> тут вопрос на счет длины у меня карта считывает все сразу, > не указывая длины поэтому command[4] должен быть равен > Empty? Не встречались такие карточки. По идее рекорд файлы можно читать только по одному рекорду. Бинарники - тем количеством, которое карточка может вернуть за раз.
В любом случае - более чем 256 байт за раз ты не прочтешь ;)
Ну а если карточка действительно позволяет прочесть сразу все, неограниченного размера - тут надо смотреть спецификацию именно к этой карте.
Совет, не лезь пока в специфик, пользуйся стандартом. Читай по столько, по сколько тебя просят в респонсе или во втором байте ошибки 67.
Перебором - это почти шутка. Тебе нужно перебрать имена файлов от 0000 до FFFF, исключив жестко заданные в стандартах, и сделать на каждый SELECT. Причем все это сделать для каждой директории. Только карточка у тебя не третий пень, да и ридер - вещь тормозная.
походу что-то не так:-)27.06.02 05:10 Автор: Full shrize Статус: Незарегистрированный пользователь
for (i=0;i<7;i++){
fprintf(fil_out,"response [ %d ] %c\n",i,response[i]);
}
После выбора MF у меня возвращаются в HEX вот такие числа 90, 00, 10, 88, 90, 00
вот эти 10, 88 у меня находятся в ATR header.
sad=2;
dad=00;
command[0]=0xA0; // CLA
command[1]=0xC0; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
тогда какое число в ?
command[4]=0x??; // L
res=CT_data (ctn,&dad,&sad,5,command,&lenr,response);
for (i=0;i<7;i++){
fprintf(fil_out,"response [ %d ] %d\n",i,response[i]);
}
После get responce. responce мне ничего возвращает
очень странно27.06.02 16:39 Автор: PS <PS> Статус: Elderman
> command[0]=0xA0; // CLA > command[1]=0xA4; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > command[4]=0x02; // L > command[5]=0x3F; > command[6]=0x00; > res=CT_data > (ctn,&dad,&sad,7,command,&lenr,response); > > > if( res==-1)fprintf(fil_out,"ERR_INVALID PARAMETR\n"); > else fprintf(fil_out,"res %d\n",res); > > for (i=0;i<7;i++){ > fprintf(fil_out,"response [ %d ] %c\n",i,response[i]); > } > После выбора MF у меня возвращаются в HEX вот такие числа > 90, 00, 10, 88, 90, 00 > вот эти 10, 88 у меня находятся в ATR header.
Command code: A0 A4
Parameters: P1: 00 P2: 00 P3: 02
Command data: Directory/EF identifier
Response data: None
Return codes:
67 02 Wrong P3
6B 00 Wrong P1 or P2
94 04 Wrong identifier
9F xx Successful, xx = number of response data available for GET RESPONSE
Как видишь 90 00 в стандарте нет (gsm), и response data быть не должно. Если ты ничего не напутал - значит у тебя совершенно не gsm карта.
Попробуй ради прикола в ридер засунуть карточку от своего мобильника.
> sad=2; > dad=00; > > command[0]=0xA0; // CLA > command[1]=0xC0; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > тогда какое число в ? > command[4]=0x??; // L > res=CT_data (ctn,&dad,&sad,5,command,&lenr,response); > for (i=0;i<7;i++){ > fprintf(fil_out,"response [ %d ] %d\n",i,response[i]); > } > После get responce. responce мне ничего возвращает
Тады ой. Попробуй command[4]=0xff и посмотри, если вернет 67 xx, то xx и будет то что тебе надо.
Но это с 3f00, а на другие файлы ? Тебе же нужно было прочитать данные. Попробуй с другими файлами сделать чтение так как я в предыдущем ответе описал.
А тут просто возникло не допонимание28.06.02 04:06 Автор: Full shrize Статус: Незарегистрированный пользователь
А тут просто возникло не допонимание, карта то не мобильника, простая карта Сименс, там хранятся данные толи пациентов толи еще кого-то. Так что я делаю все чисто по IS0-7816. :-)
по ИСО 7816-4 если 9000 то комманда успешна.
Вот еще здесь что-то я не врубился, тут в ИСО для переключения передачи от карты к ридеру нуно сбросить карту, А какой командой?:-)
Так26.06.02 08:49 Автор: Full shrize Статус: Незарегистрированный пользователь
> Прочесть дирестории нельзя. Узнать файлы в директории - > можно, но комманда специфична для каждого производителя. > Либо полным перебором. Ух ты, а как это перебором?