Zuc256算法验证完毕,applet中测试加解密38字节文本成功;位置加密调用zuc256算法,返回值符合预期,与样例程序一致。
This commit is contained in:
@@ -56,7 +56,10 @@ public final class Method {
|
||||
// 运行时缓冲:放RAM,避免写EEPROM
|
||||
byte[] ctx_buf;
|
||||
short ctx_buflen;
|
||||
|
||||
//todo test
|
||||
byte[] buf1; // Enc(Input)
|
||||
//todo test
|
||||
byte[] buf2; // Enc(Enc(Input)) -> 应为 Input
|
||||
|
||||
// LFSR: 原 int[16] -> hi/lo 各 16
|
||||
@@ -242,7 +245,8 @@ public final class Method {
|
||||
}
|
||||
|
||||
|
||||
public void processData(APDU apdu) {
|
||||
//todo test
|
||||
public void testZuc256(APDU apdu) {
|
||||
|
||||
byte[] apduBuf = apdu.getBuffer();
|
||||
|
||||
@@ -270,21 +274,20 @@ public final class Method {
|
||||
}
|
||||
|
||||
/**
|
||||
* fake数据生成函数
|
||||
* encryptLocationZuc256
|
||||
* 输入: stmsi[6], data[5]
|
||||
* 输出: fakedata[5]
|
||||
* 输出: out[5]
|
||||
*/
|
||||
private void makeFakeData(byte[] stmsi, byte[] data, byte[] fakedata) {
|
||||
// 示例:逐字节异或 stmsi 前5字节
|
||||
for (short i = 0; i < (short)5; i++) {
|
||||
fakedata[i] = (byte)(data[i]);
|
||||
}
|
||||
private void encryptLocationZuc256(byte[] stmsi, byte[] data, byte[] out) {
|
||||
initZuc256EncryptCtx(KEY32, IV25);
|
||||
updateZuc256EncryptCtx(data, (short) 5, out);
|
||||
finishZuc256EncryptCtx(out, (short) 5); // 若 Input 长度为 4 的倍数则通常无副作用,留着更稳妥
|
||||
}
|
||||
|
||||
/**
|
||||
* APDU处理函数
|
||||
*/
|
||||
public short processDataFake(byte[] buffer, short off, short len, byte[] key_store) {
|
||||
public short locationEncryptZuc(byte[] buffer, short off, short len, byte[] key_store) {
|
||||
// 至少要有 12 个字节:1+1+1+6+5
|
||||
if (len < (short)12) {
|
||||
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
|
||||
@@ -302,7 +305,7 @@ public final class Method {
|
||||
Util.arrayCopyNonAtomic(buffer, (short)(off + 9), location_data, (short)0, (short)5);
|
||||
|
||||
// === 生成 fakedata ===
|
||||
makeFakeData(stmsi, location_data, location_res_data);
|
||||
encryptLocationZuc256(stmsi, location_data, location_res_data);
|
||||
|
||||
// === 出参组装 ===
|
||||
buffer[(short)(off + 0)] = (byte)0xA1; // 类型
|
||||
|
||||
@@ -13,7 +13,8 @@ import org.globalplatform.SecureChannel;
|
||||
*/
|
||||
public class XwSecurity extends Applet {
|
||||
|
||||
public static final byte INS_PROCESS_DATA = (byte)0xE3;
|
||||
//todo test
|
||||
public static final byte INS_PROCESS_DATA_TEST = (byte)0xE3;
|
||||
|
||||
public static final byte INS_LOCATION_ENCRYPT = (byte)0xCA;
|
||||
|
||||
@@ -72,13 +73,14 @@ public class XwSecurity extends Applet {
|
||||
// break;
|
||||
|
||||
|
||||
case INS_PROCESS_DATA:
|
||||
method.processData(apdu);
|
||||
//todo test
|
||||
case INS_PROCESS_DATA_TEST:
|
||||
method.testZuc256(apdu);
|
||||
break;
|
||||
|
||||
|
||||
case INS_LOCATION_ENCRYPT:
|
||||
len = method.processDataFake(buf, off, len, key_store_byte);
|
||||
len = method.locationEncryptZuc(buf, off, len, key_store_byte);
|
||||
apdu.setOutgoingAndSend(off, len);
|
||||
break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user