Skip to content

Commit 5bbb742

Browse files
committed
Force fully reading U2F makeCredential
1 parent 54fd227 commit 5bbb742

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/main/java/us/q3q/fido2/FIDO2Applet.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4095,11 +4095,12 @@ private void u2FRegister(APDU apdu) {
40954095
throwException(ISO7816.SW_COMMAND_NOT_ALLOWED);
40964096
}
40974097

4098-
apdu.setIncomingAndReceive();
4098+
final short amtRead = apdu.setIncomingAndReceive();
40994099
short lc = apdu.getIncomingLength();
41004100
if (lc != (short)(CLIENT_DATA_HASH_LEN + RP_HASH_LEN)) {
41014101
throwException(ISO7816.SW_WRONG_LENGTH);
41024102
}
4103+
final byte[] reqBuffer = fullyReadReq(apdu, lc, amtRead, true);
41034104

41044105
// TODO: handle very long certificates
41054106
short attCertLen = 0;
@@ -4116,27 +4117,26 @@ private void u2FRegister(APDU apdu) {
41164117
throwException(ISO7816.SW_DATA_INVALID);
41174118
}
41184119

4119-
final byte[] apduBuffer = apdu.getBuffer();
4120+
short readOffset = 0;
41204121
bufferManager.initializeAPDU(apdu);
41214122

4122-
final short scratchClientDataHashHandle = bufferManager.allocate(apdu, CLIENT_DATA_HASH_LEN, BufferManager.ANYWHERE);
4123+
final short scratchClientDataHashHandle = bufferManager.allocate(apdu, CLIENT_DATA_HASH_LEN, BufferManager.NOT_APDU_BUFFER);
41234124
final short scratchClientDataHashOffset = bufferManager.getOffsetForHandle(scratchClientDataHashHandle);
41244125
final byte[] scratchClientDataHashBuffer = bufferManager.getBufferForHandle(apdu, scratchClientDataHashHandle);
4125-
final short scratchRPIDHashHandle = bufferManager.allocate(apdu, RP_HASH_LEN, BufferManager.ANYWHERE);
4126+
final short scratchRPIDHashHandle = bufferManager.allocate(apdu, RP_HASH_LEN, BufferManager.NOT_APDU_BUFFER);
41264127
final short scratchRPIDHashOffset = bufferManager.getOffsetForHandle(scratchRPIDHashHandle);
41274128
final byte[] scratchRPIDHashBuffer = bufferManager.getBufferForHandle(apdu, scratchRPIDHashHandle);
4128-
final short publicKeyHandle = bufferManager.allocate(apdu, PUB_KEY_LENGTH, BufferManager.NOT_LOWER_APDU);
4129+
final short publicKeyHandle = bufferManager.allocate(apdu, PUB_KEY_LENGTH, BufferManager.NOT_APDU_BUFFER);
41294130
final short publicKeyOffset = bufferManager.getOffsetForHandle(publicKeyHandle);
41304131
final byte[] publicKeyBuffer = bufferManager.getBufferForHandle(apdu, publicKeyHandle);
4131-
final short scratchCredHandle = bufferManager.allocate(apdu, CREDENTIAL_ID_LEN, BufferManager.ANYWHERE);
4132+
final short scratchCredHandle = bufferManager.allocate(apdu, CREDENTIAL_ID_LEN, BufferManager.NOT_APDU_BUFFER);
41324133
final short scratchCredOffset = bufferManager.getOffsetForHandle(scratchCredHandle);
41334134
final byte[] scratchCredBuffer = bufferManager.getBufferForHandle(apdu, scratchCredHandle);
41344135

4135-
short readOffset = apdu.getOffsetCdata();
4136-
Util.arrayCopyNonAtomic(apduBuffer, readOffset,
4136+
Util.arrayCopyNonAtomic(reqBuffer, readOffset,
41374137
scratchClientDataHashBuffer, scratchClientDataHashOffset, CLIENT_DATA_HASH_LEN);
41384138
readOffset += CLIENT_DATA_HASH_LEN;
4139-
Util.arrayCopyNonAtomic(apduBuffer, readOffset,
4139+
Util.arrayCopyNonAtomic(reqBuffer, readOffset,
41404140
scratchRPIDHashBuffer, scratchRPIDHashOffset, RP_HASH_LEN);
41414141

41424142
// Out of the APDU buffer; it's all free!

0 commit comments

Comments
 (0)