OpenEUICC/libs/lpad-sm-dp-plus-connector/src/main/java/com/truphone/lpa/apdu/ApduUtils.java

370 lines
16 KiB
Java

package com.truphone.lpa.apdu;
import com.truphone.util.TextUtil;
import com.truphone.util.ToTLV;
import com.truphone.util.Tools;
import java.util.ArrayList;
import java.util.List;
public class ApduUtils {
private static final String CLA = "81";
private static final String INSTRUCTION = "E2";
private static final String P1_11 = "11";
private static final String P1_91 = "91";
private static final String P2 = "00";
private static final int len = 120;
public static String getEuiccInfo1Apdu() {
String data = ToTLV.toTLV("BF20", "");
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getEuiccInfo2Apdu() {
String data = ToTLV.toTLV("BF22", "");
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getEUICCChallengeApdu() {
String data = ToTLV.toTLV("BF2E", "");
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String generateCtxParams1(String matchingId, String imei) {
String tac = imei.substring(0, 8);
return ToTLV.toTLV("A0",
ToTLV.toTLV("80", matchingId) + ToTLV.toTLV("A1",
ToTLV.toTLV("80", tac) + ToTLV.toTLV("A1", "") + ToTLV.toTLV("82", imei + "F")
));
}
public static List<String> authenticateServerApdu(String smdpSigned1, String smdpSignature1, String euiccCiPKIdToBeUsed,
String cert, String sctxParams1) {
String data = ToTLV.toTLV("BF38", smdpSigned1 + smdpSignature1 + euiccCiPKIdToBeUsed + cert + sctxParams1);
return subCommandData(data, len, false);
}
public static List<String> prepareDownloadApdu(String smdpSigned2, String smdpSignature2, String cert, String hashCc) {
StringBuilder data = new StringBuilder().append(smdpSigned2).append(smdpSignature2);
if (hashCc != null) {
data.append(ToTLV.toTLV("04", hashCc));
}
data.append(cert);
return subCommandData(ToTLV.toTLV("BF21", data.toString()), len, false);
}
public static List<String> loadInitialiseSecureChannelApdu(List<String[]> data) {
if (data.size() != 4 && data.size() != 5) {
throw new RuntimeException("SBPP Error");
}
return subCommandData(data.get(0)[0], len, true);
}
public static List<String> loadConfigureISDPApdu(List<String[]> data) {
if (data.size() != 4 && data.size() != 5) {
throw new RuntimeException("SBPP Error");
}
List<String> SBPPList = new ArrayList<>();
String configureISDP = data.get(1)[0];
String configureISDPLength = Tools.toHex(String.valueOf(configureISDP.length() / 2));
StringBuilder configureISDPApdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2)
.append(configureISDPLength).append(configureISDP);
SBPPList.add(configureISDPApdu.toString());
return SBPPList;
}
public static List<String> loadStoreMetadataApdu(List<String[]> data) {
if (data.size() != 4 && data.size() != 5) {
throw new RuntimeException("SBPP Error");
}
List<String> SBPPList = new ArrayList<>();
String[] storeMetadata = data.get(2);
for (int i = 0; i < storeMetadata.length; i++) {
List<String> storeMetadataList = subCommandData(storeMetadata[i], len, true);
SBPPList.addAll(storeMetadataList);
}
return SBPPList;
}
public static List<String> loadProfileProtectionKeys(List<String[]> data) {
if (data.size() != 5) {
throw new RuntimeException("SBPP Error");
}
List<String> SBPPList = new ArrayList<>();
String[] profileProtectionKeys = data.get(3);
for (int i = 0; i < profileProtectionKeys.length; i++) {
List<String> loadProfileElementsList = subCommandData(profileProtectionKeys[i], len, true);
SBPPList.addAll(loadProfileElementsList);
}
return SBPPList;
}
public static List<String> loadBoundProfilePackageApdu(List<String[]> data) {
if (data.size() != 4 && data.size() != 5) {
throw new RuntimeException("SBPP Error");
}
List<String> SBPPList = new ArrayList<>();
String[] loadProfileElements = (data.size() == 4) ? data.get(3) : data.get(4);
for (int i = 0; i < loadProfileElements.length; i++) {
List<String> loadProfileElementsList = subCommandData(loadProfileElements[i], len, true);
SBPPList.addAll(loadProfileElementsList);
}
return SBPPList;
}
public static String removeNotificationFromListApdu(int notifycounter) {
String data = ToTLV.toTLV("BF30", ToTLV.integerToTLV("80", notifycounter));
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String listNotificationApdu(String notificationType) {
String data;
if (TextUtil.isNotBlank(notificationType)) {
data = ToTLV.toTLV("BF28", ToTLV.toTLV("81", "04" + notificationType));
} else {
data = ToTLV.toTLV("BF28", "");
}
return new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data)).toString();
}
public static String retrievePendingNotificationsListApdu(int notifyCounter) {
String data = ToTLV.toTLV("BF2B", ToTLV.toTLV("A0", ToTLV.integerToTLV("80", notifyCounter)));
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getProfilesInfoApdu(String isdp1) {
String searchCriteria = "";
if (TextUtil.isNotEmpty(isdp1)) {
searchCriteria = ToTLV.toTLV("A0", ToTLV.toTLV("4F", isdp1));
}
String data = ToTLV.toTLV("BF2D", searchCriteria);// + tagList);
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getEIDApdu() {
String data = ToTLV.toTLV("BF3E", ToTLV.toTLV("5C", "5A"));
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String setNicknameApdu(String iccid, String profileNickname) {
String data = ToTLV.toTLV("BF29", ToTLV.toTLV("5A", iccid) + ToTLV.toTLV("90", profileNickname));
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String enableProfileApdu(String iccidOrISDPaid, String refreshflag) {
String data;
if (iccidOrISDPaid.length() / 2 == 10) {
data = ToTLV.toTLV("BF31", ToTLV.toTLV("A0", ToTLV.toTLV("5A", iccidOrISDPaid)) + ToTLV.toTLV("81", refreshflag));
} else if (iccidOrISDPaid.length() / 2 == 16) {
data = ToTLV.toTLV("BF31", ToTLV.toTLV("A0", ToTLV.toTLV("4F", iccidOrISDPaid)) + ToTLV.toTLV("81", refreshflag));
} else {
throw new RuntimeException("No iccid Or ISDPaid supplied");
}
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String disableProfileApdu(String iccidOrISDPaid, String refreshflag) {
String data;
if (iccidOrISDPaid.length() / 2 == 10) {
data = ToTLV.toTLV("BF32", ToTLV.toTLV("A0", ToTLV.toTLV("5A", iccidOrISDPaid)) + ToTLV.toTLV("81", refreshflag));
} else if (iccidOrISDPaid.length() / 2 == 16) {
data = ToTLV.toTLV("BF32", ToTLV.toTLV("A0", ToTLV.toTLV("4F", iccidOrISDPaid)) + ToTLV.toTLV("81", refreshflag));
} else {
throw new RuntimeException("No iccid Or ISDPaid supplied");
}
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String deleteProfileApdu(String iccidOrISDPaid) {
String data;
if (iccidOrISDPaid.length() / 2 == 10) {
data = ToTLV.toTLV("BF33", ToTLV.toTLV("5A", iccidOrISDPaid));
} else if (iccidOrISDPaid.length() / 2 == 16) {
data = ToTLV.toTLV("BF33", ToTLV.toTLV("4F", iccidOrISDPaid));
} else {
throw new RuntimeException("No iccid Or ISDPaid supplied");
}
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getEuiccConfiguredAddressesApdu() {
String data = "BF3C00";
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String setDefaultDpAddressApdu(String dpAddrNew) {
String data = ToTLV.toTLV("BF3F", ToTLV.toTLV("80", dpAddrNew));
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getProfilesInfo_profileStateApdu(String iccidOrISDPaid) {
String taglist = ToTLV.toTLV("5C", "9F70");
String searchCriteria = null;
if (iccidOrISDPaid.length() / 2 == 10) {
searchCriteria = ToTLV.toTLV("A0", ToTLV.toTLV("5A", iccidOrISDPaid));
} else if (iccidOrISDPaid.length() / 2 == 16) {
searchCriteria = ToTLV.toTLV("A0", ToTLV.toTLV("4F", iccidOrISDPaid));
}
String data = ToTLV.toTLV("BF2D", searchCriteria + taglist);
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getEUICCInfo_spaceApdu() {
String data = ToTLV.toTLV("BF22", "");
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getProfilesInfo_ISDPaidApdu(String iccid) {
String taglist = ToTLV.toTLV("5C", "4F");
String searchCriteria = ToTLV.toTLV("A0", ToTLV.toTLV("5A", iccid));
String data = ToTLV.toTLV("BF2D", searchCriteria + taglist);
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String checkIfAnyEnabledProfileApdu() {
String taglist = ToTLV.toTLV("5C", "9F70");
String searchCriteria = "";
String data = ToTLV.toTLV("BF2D", searchCriteria + taglist);
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getNotifyCounterApdu() {
String data = ToTLV.toTLV("BF28", "");
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String getNotifyTypeApdu() {
String data = ToTLV.toTLV("BF28", "");
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String removeNotificationApdu(String notifyCounter) {
String data = ToTLV.toTLV("BF30", ToTLV.toTLV("80", notifyCounter));
StringBuilder apdu = new StringBuilder().append(CLA).append(INSTRUCTION).append(P1_91).append(P2).append(ToTLV.toTLV(data));
return apdu.toString();
}
public static String nextNotifyCounterApdu(String iccGp_notifycounter) {
String nextNotifyCounter = "";
int inotifycounter = Integer.valueOf(iccGp_notifycounter, 16);
String inotifycounterHex = Tools.toHex(String.valueOf(++inotifycounter));
inotifycounterHex = "000000" + inotifycounterHex;
if (inotifycounter < 127) {
nextNotifyCounter = inotifycounterHex.substring(inotifycounterHex.length() - 2);
} else if (inotifycounter < 32767) {
nextNotifyCounter = inotifycounterHex.substring(inotifycounterHex.length() - 4);
} else if (inotifycounter < 8388607) {
nextNotifyCounter = inotifycounterHex.substring(inotifycounterHex.length() - 6);
} else {
nextNotifyCounter = inotifycounterHex.substring(inotifycounterHex.length() - 8);
}
return nextNotifyCounter;
}
private static List<String> subCommandData(String data, int len, boolean isLenSub) {
List<String> commandDataList = new ArrayList<>();
int dataLen = data.length() / 2;
int cP2 = 0;
while (dataLen != 0) {
if (dataLen > len) {
String subData = data.substring(0, 2 * len);
StringBuilder apdu = new StringBuilder();
if (isLenSub) {
apdu.append(CLA).append(INSTRUCTION).append(P1_11).append(Tools.toHex(String.valueOf(cP2))).append(Tools.itoa(len, 1)).append(subData);
} else {
apdu.append(CLA).append(INSTRUCTION).append(P1_11).append(Tools.toHex(String.valueOf(cP2))).append(Tools.toHex(String.valueOf(len))).append(subData);
}
commandDataList.add(apdu.toString());
data = data.substring(2 * len);
dataLen = dataLen - len;
cP2++;
} else {
StringBuilder apdu = new StringBuilder();
if (isLenSub) {
apdu.append(CLA).append(INSTRUCTION).append(P1_91).append(Tools.toHex(String.valueOf(cP2))).append(Tools.itoa(dataLen, 1)).append(data);
} else {
apdu.append(CLA).append(INSTRUCTION).append(P1_91).append(Tools.toHex(String.valueOf(cP2))).append(Tools.toHex(String.valueOf(dataLen))).append(data);
}
dataLen = 0;
commandDataList.add(apdu.toString());
}
}
return commandDataList;
}
public static String getResponse() {
StringBuilder apdu = new StringBuilder();
apdu.append(CLA).append("C0").append("00").append("00").append("00");
return apdu.toString();
}
/**
* * Proprietary Commands *
*/
public static String getLPAeDownloadProfileApdu() {
StringBuilder apdu = new StringBuilder();
apdu.append(CLA).append("B0").append("00").append("00").append("01").append("02");
return apdu.toString();
}
public static String getLPAeGetProgressInfoApdu() {
StringBuilder apdu = new StringBuilder();
apdu.append(CLA).append("B0").append("00").append("00").append("01").append("08");
return apdu.toString();
}
public static String getLPAeMemoryResetApdu() {
StringBuilder apdu = new StringBuilder();
apdu.append(CLA).append("B0").append("00").append("00").append("01").append("06");
return apdu.toString();
}
public static String getLPAeSetLPAModeApdu(String mode) {
StringBuilder apdu = new StringBuilder();
apdu.append(CLA).append("B0").append("00").append("00").append("02").append("09").append(mode);
return apdu.toString();
}
public static String getSendStatusAPDU() {
return "80F20100";
}
}