Привет, я работаю с Java-картой. В приведенном ниже коде я хочу настроить пин-код. Когда я выполняю команду apdu C0010200050430303030, чтобы установить пин-код, ответ равен 9000, что означает Успешно, но когда я выполните команду C00200000430303030, чтобы проверить вывод, я получил ответ 63C2, что означает Проверка не удалась, осталось 2 попытки. Пожалуйста, помогите мне исправить этот код, чтобы он не прошел проверку.
private void initialSetup(APDU apdu) {
if (isSetupDone) {
ISOException.throwIt(SW_SETUP_ALREADY_DONE);
}
byte[] buffer = apdu.getBuffer();
byte p1 = buffer[ISO7816.OFFSET_P1];
short offset = buffer[ISO7816.OFFSET_CDATA];
short bytesRemaining = apdu.setIncomingAndReceive();
short outBufferLen = 0;
byte[] outBuffer = new byte[outBufferLen];
short outBufferOffset = 0;
byte[] pinData = new byte[STANDARD_PIN_LEN + 1];
byte[] pukData = new byte[STANDARD_PUK_LEN + 1];
// Handling PIN
if ((p1 & 0x02) == 1) {
byte pinLength = buffer[offset++];
if (bytesRemaining < pinLength) {
ISOException.throwIt(SW_WRONG_LENGTH);
}
Util.arrayCopyNonAtomic(buffer, offset, pinData, (short) 0, pinLength);
pin.update(buffer, offset, pinLength);
offset += pinLength;
bytesRemaining -= pinLength;
} else {
pinData[0] = STANDARD_PIN_LEN;
random.nextBytes(pinData, (short) 1, STANDARD_PIN_LEN);
pin.update(pinData, (short) 1, STANDARD_PIN_LEN);
}
if (p1 == 0) {
outBufferLen = (short) (pinData.length);
outBuffer = new byte[outBufferLen];
short outOffset = 0;
Util.arrayCopyNonAtomic(pinData, (short) 0, outBuffer, outOffset, (short) pinData.length);
outOffset += pinData.length;
}
isSetupDone = true;
apdu.setOutgoing();
apdu.setOutgoingLength(outBufferLen);
apdu.sendBytesLong(outBuffer, (short) 0, outBufferLen);
}
private void VerifyPIN(APDU apdu, byte[] buffer) {
short bytesRemaining = apdu.setIncomingAndReceive();
if (bytesRemaining != STANDARD_PIN_LEN) {
ISOException.throwIt(SW_WRONG_LENGTH);
}
boolean isValid = pin.check(buffer, ISO7816.OFFSET_CDATA, STANDARD_PIN_LEN);
if (!isValid) {
if (pin.getTriesRemaining() == 0) {
ISOException.throwIt(SW_LOCKED_PIN);
} else {
short remainingTries = pin.getTriesRemaining();
ISOException.throwIt((short) (SW_PIN_FAILED | remainingTries));
}
}
apdu.setOutgoingAndSend((short) 0, (short) 0);
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... pin-failed
Почему проверка PIN-кода не удалась? ⇐ JAVA
Программисты JAVA общаются здесь
1732786643
Anonymous
Привет, я работаю с Java-картой. В приведенном ниже коде я хочу настроить пин-код. Когда я выполняю команду apdu C0010200050430303030, чтобы установить пин-код, ответ равен 9000, что означает [b]Успешно[/b], но когда я выполните команду C00200000430303030, чтобы проверить вывод, я получил ответ 63C2, что означает [b]Проверка не удалась, осталось 2 попытки[/b]. Пожалуйста, помогите мне исправить этот код, чтобы он не прошел проверку.
private void initialSetup(APDU apdu) {
if (isSetupDone) {
ISOException.throwIt(SW_SETUP_ALREADY_DONE);
}
byte[] buffer = apdu.getBuffer();
byte p1 = buffer[ISO7816.OFFSET_P1];
short offset = buffer[ISO7816.OFFSET_CDATA];
short bytesRemaining = apdu.setIncomingAndReceive();
short outBufferLen = 0;
byte[] outBuffer = new byte[outBufferLen];
short outBufferOffset = 0;
byte[] pinData = new byte[STANDARD_PIN_LEN + 1];
byte[] pukData = new byte[STANDARD_PUK_LEN + 1];
// Handling PIN
if ((p1 & 0x02) == 1) {
byte pinLength = buffer[offset++];
if (bytesRemaining < pinLength) {
ISOException.throwIt(SW_WRONG_LENGTH);
}
Util.arrayCopyNonAtomic(buffer, offset, pinData, (short) 0, pinLength);
pin.update(buffer, offset, pinLength);
offset += pinLength;
bytesRemaining -= pinLength;
} else {
pinData[0] = STANDARD_PIN_LEN;
random.nextBytes(pinData, (short) 1, STANDARD_PIN_LEN);
pin.update(pinData, (short) 1, STANDARD_PIN_LEN);
}
if (p1 == 0) {
outBufferLen = (short) (pinData.length);
outBuffer = new byte[outBufferLen];
short outOffset = 0;
Util.arrayCopyNonAtomic(pinData, (short) 0, outBuffer, outOffset, (short) pinData.length);
outOffset += pinData.length;
}
isSetupDone = true;
apdu.setOutgoing();
apdu.setOutgoingLength(outBufferLen);
apdu.sendBytesLong(outBuffer, (short) 0, outBufferLen);
}
private void VerifyPIN(APDU apdu, byte[] buffer) {
short bytesRemaining = apdu.setIncomingAndReceive();
if (bytesRemaining != STANDARD_PIN_LEN) {
ISOException.throwIt(SW_WRONG_LENGTH);
}
boolean isValid = pin.check(buffer, ISO7816.OFFSET_CDATA, STANDARD_PIN_LEN);
if (!isValid) {
if (pin.getTriesRemaining() == 0) {
ISOException.throwIt(SW_LOCKED_PIN);
} else {
short remainingTries = pin.getTriesRemaining();
ISOException.throwIt((short) (SW_PIN_FAILED | remainingTries));
}
}
apdu.setOutgoingAndSend((short) 0, (short) 0);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79233271/why-verifying-the-pin-failed[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия