Как правило, вы отправляете байты через интерфейс APDU.Java или Java Card byte[]
- это конструкция, которая может содержать эти байты.Вот тут и вступает в силу буфер APDU: это байтовый массив, который содержит байты, отправленные через интерфейс APDU - или, по крайней мере, часть из них после вызова setIncomingAndReceive()
.
. Таким образом, проблема заключается в в пределах буфер APDU;вместо того, чтобы звонить:
short sigLength = signature.sign(challenge, offset,length, output, x);
, поэтому вы можете просто позвонить:
short sigLength = signature.sign(buffer, apdu.getOffsetCdata(), CHALLENGE_SIZE, buffer, START);
, где CHALLENGE_SIZE
равно 20, а START
просто равно нулю.
Тогда выможно использовать:
apdu.getOutgoingAndSend(START, sigLength);
, чтобы отправить обратно подписанный вызов.
Если вам нужно сохранить вызов на более позднем этапе, вам следует создать байтовый массив в ОЗУ, используя JCSystem.makeTransientByteArray()
во время построения апплета, а затем используйте Util.arrayCopy()
для перемещения значений байтов в буфер вызова.Тем не менее, поскольку проблема генерируется автономной системой, в этом нет никакой необходимости.Оффкартная система должна удерживать вызов, а не карточку.
Вам больше не следует использовать ISO7816.OFFSET_CDATA
;он не вернет правильный результат, если вы будете использовать ключи большего размера, которые генерируют сигнатуры большего размера и, следовательно, требуют использования APDU расширенной длины.