Skip to content

Commit 41e622e

Browse files
committed
Preliminary support for SDK release 25.0
1 parent a3362c4 commit 41e622e

File tree

6 files changed

+72
-26
lines changed

6 files changed

+72
-26
lines changed

capfile/src/main/java/pro/javacard/sdk/JavaCardSDK.java

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,33 @@ public static Optional<JavaCardSDK> detectSDK(Path path) {
5959
private static SDKVersion detectSDKVersion(Path root) {
6060
SDKVersion version = null;
6161
Path libDir = root.resolve("lib");
62-
if (Files.exists(libDir.resolve("tools.jar"))) {
63-
if (Files.exists(libDir.resolve("api_classic-3.2.0.jar")))
64-
return SDKVersion.V320;
65-
if (Files.exists(libDir.resolve("api_classic-3.1.0.jar")))
66-
return SDKVersion.V310;
67-
Path api = libDir.resolve("api_classic.jar");
68-
try (ZipFile apiZip = new ZipFile(api.toFile())) {
69-
if (apiZip.getEntry("javacard/framework/SensitiveArrays.class") != null) {
70-
return SDKVersion.V305;
71-
}
72-
if (apiZip.getEntry("javacardx/framework/string/StringUtil.class") != null) {
73-
return SDKVersion.V304;
62+
Path tools = libDir.resolve("tools.jar");
63+
if (Files.exists(tools)) {
64+
try (ZipFile apiZip = new ZipFile(tools.toFile())) {
65+
ZipEntry toolsver = apiZip.getEntry("com/sun/javacard/toolsversion.properties");
66+
if (toolsver != null) {
67+
Properties verprop = new Properties();
68+
verprop.load(apiZip.getInputStream(toolsver));
69+
String ver = verprop.getProperty("converter.version");
70+
switch (ver) {
71+
case "3.0.3":
72+
return SDKVersion.V301; // XXX
73+
case "3.0.4":
74+
return SDKVersion.V304;
75+
case "3.0.5":
76+
return SDKVersion.V305;
77+
case "3.1.0":
78+
return SDKVersion.V310;
79+
case "3.2.0":
80+
return SDKVersion.V320; // 24.0
81+
case "24.1":
82+
return SDKVersion.V320_24_1;
83+
case "25.0":
84+
return SDKVersion.V320_25_0;
85+
default:
86+
throw new IllegalStateException("Unknown SDK release: " + ver);
87+
}
7488
}
75-
return SDKVersion.V301;
7689
} catch (IOException e) {
7790
throw new RuntimeException(e);
7891
}
@@ -141,7 +154,7 @@ public Path getExportDir() {
141154

142155
// This is for build and verification tools
143156
public JavaCardSDK target(SDKVersion targetVersion) {
144-
if (version.isOneOf(SDKVersion.V310, SDKVersion.V320) && targetVersion.isOneOf(SDKVersion.V304, SDKVersion.V305, SDKVersion.V310)) {
157+
if ((version == SDKVersion.V310 || version.isV32()) && targetVersion.isOneOf(SDKVersion.V304, SDKVersion.V305, SDKVersion.V310, SDKVersion.V320)) {
145158
List<Path> apiJars = new ArrayList<>();
146159
apiJars.add(Paths.get("lib", "api_classic-" + targetVersion.v + ".jar"));
147160
apiJars.add(Paths.get("lib", "api_classic_annotations-" + targetVersion.v + ".jar"));
@@ -155,6 +168,9 @@ public JavaCardSDK target(SDKVersion targetVersion) {
155168
// This indicates the highest class file version edible by SDK-s converter
156169
public static String getJavaVersion(SDKVersion version) {
157170
switch (version) {
171+
case V320_25_0:
172+
return "1.8";
173+
case V320_24_1:
158174
case V320:
159175
case V310:
160176
return "1.7";
@@ -248,6 +264,8 @@ public static List<Path> getApiJars(SDKVersion version) {
248264
break;
249265
case V310:
250266
case V320:
267+
case V320_24_1:
268+
case V320_25_0:
251269
jars.add(Paths.get("lib", String.format("api_classic-%s.jar", version.v)));
252270
jars.add(Paths.get("lib", String.format("api_classic_annotations-%s.jar", version.v)));
253271
break;
@@ -280,7 +298,7 @@ public static List<Path> getCompilerJars(SDKVersion version) {
280298
if (version.isOneOf(SDKVersion.V304, SDKVersion.V305)) {
281299
jars.add(Paths.get("lib", "tools.jar"));
282300
jars.add(Paths.get("lib", "api_classic_annotations.jar"));
283-
} else if (version == SDKVersion.V310 || version == SDKVersion.V320) {
301+
} else if (version == SDKVersion.V310 || version.isV32()) {
284302
jars.add(Paths.get("lib", "tools.jar"));
285303
jars.add(Paths.get("lib", String.format("api_classic_annotations-%s.jar", version.v)));
286304
}

capfile/src/main/java/pro/javacard/sdk/OffCardVerifier.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ public void verifyAgainst(File f, JavaCardSDK target, Vector<File> exps) throws
5959

6060
public void verifyAgainst(Path f, JavaCardSDK target, List<Path> exps) throws VerifierError, IOException {
6161
// Warn about recommended usage
62-
if (target.getVersion().isOneOf(V304, V305, V310) && sdk.getVersion() != V320) {
63-
System.err.println("NB! Please use JavaCard SDK 3.2.0 for verifying!");
62+
if (target.getVersion().isOneOf(V304, V305, V310) && sdk.getVersion() != V320_25_0) {
63+
System.err.println("NB! Please use JavaCard SDK 3.2.0 / 25.0 for verifying!");
6464
} else {
6565
if (!sdk.getRelease().equals("3.0.5u4")) {
6666
System.err.println("NB! Please use JavaCard SDK 3.0.5u4 or later for verifying!");
@@ -99,7 +99,7 @@ public void verify(Path f, List<Path> exps) throws VerifierError, IOException {
9999

100100
try (FileInputStream input = new FileInputStream(f.toFile())) {
101101
// 3.0.5u1 still uses old signature
102-
if (sdk.getRelease().equals("3.0.5u3") || sdk.getRelease().equals("3.0.5u2") || sdk.getVersion().isOneOf(V310, V320)) {
102+
if (sdk.getRelease().equals("3.0.5u3") || sdk.getRelease().equals("3.0.5u2") || sdk.getVersion().isOneOf(V310) || sdk.getVersion().isV32()) {
103103
Method m = verifier.getMethod("verifyCap", File.class, String.class, Vector.class);
104104
m.invoke(null, f.toFile(), packagename, expfiles);
105105
} else {

capfile/src/main/java/pro/javacard/sdk/SDKVersion.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ public enum SDKVersion {
3333
V304("3.0.4"),
3434
V305("3.0.5"),
3535
V310("3.1.0"),
36-
V320("3.2.0");
36+
V320("3.2.0"),
37+
V320_24_1("3.2.0"),
38+
V320_25_0("3.2.0");
3739

3840
final String v;
3941

@@ -50,6 +52,10 @@ public boolean isV3() {
5052
return this.name().startsWith("V3");
5153
}
5254

55+
public boolean isV32() {
56+
return this.v.startsWith("3.2");
57+
}
58+
5359
public boolean isOneOf(SDKVersion... versions) {
5460
for (SDKVersion v : versions)
5561
if (this.equals(v))

kits.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@
1212
<property name="JC305_3" value="sdks/jc305u3_kit"/>
1313
<property name="JC305" value="sdks/jc305u4_kit"/>
1414
<property name="JC310" value="sdks/jc310r20210706_kit"/>
15-
<property name="JC320" value="sdks/jc320v24.1_kit"/>
15+
<property name="JC320" value="sdks/jc320v24.0_kit"/>
16+
<property name="JC320_1" value="sdks/jc320v24.1_kit"/>
17+
<property name="JC320_2" value="sdks/jc320v25.0_kit"/>
1618
</project>

task/src/main/java/pro/javacard/ant/JCCap.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,10 @@ private void check() {
225225

226226
if (raw_targetsdk != null) {
227227
Optional<SDKVersion> targetVersion = SDKVersion.fromVersion(raw_targetsdk);
228-
if (jckit != null && jckit.getVersion().isOneOf(V310, V320) && targetVersion.isPresent()) {
228+
if (jckit != null && (jckit.getVersion().isOneOf(V310) || jckit.getVersion().isV32()) && targetVersion.isPresent()) {
229229
SDKVersion target = targetVersion.get();
230230
// FIXME: can't target 3.2.0 with 3.1.0
231+
// FIXME: really need a table structure, this is getting out of hand.
231232
if (target.isOneOf(V304, V305, V310, V320)) {
232233
targetsdk = jckit.target(target);
233234
} else {
@@ -438,17 +439,17 @@ private void compile() {
438439
// Warn in human readable way if Java not compatible with JC Kit
439440
// See https://github.com/martinpaljak/ant-javacard/issues/79
440441
int jdkver = Misc.getCurrentJDKVersion();
441-
if (jdkver > 17) {
442+
if (jdkver > 17 && !jckit.getVersion().isOneOf(V320_25_0)) {
442443
// JDK 21 can't create 1.7 class files, last version supported by JC kit 3.2
443444
throw new HelpingBuildException("JDK 17 is the latest supported JDK.");
444445
} else if (jckit.getVersion().isOneOf(V211, V212, V221, V222) && jdkver > 8) {
445446
// JDK 8 is the last version capable of creating 1.2 class files, latest version supported by all 2.x JC kits
446447
throw new HelpingBuildException("Use JDK 8 with JavaCard kit v2.x");
447-
} else if (jdkver > 11 && !jckit.getVersion().isOneOf(V310, V320)) {
448+
} else if (jdkver > 11 && !jckit.getVersion().isOneOf(V310, V320, V320_24_1, V320_25_0)) {
448449
// JDK 17+ minimal class file target is 1.7, but need 1.6
449450
throw new HelpingBuildException(String.format("Can't use JDK %d with JavaCard kit %s (use JDK 11)", jdkver, jckit.getVersion()));
450451
} else if (jdkver == 8 && jckit.getVersion().isOneOf(V320)) {
451-
// 24.1 requires JDK-11 to run (while 24.0 can work with JDK-8, encourage updating)
452+
// 24.1 requires JDK-11 to run (while 24.0 and 25.1 can work with JDK-8, encourage updating)
452453
throw new HelpingBuildException(String.format("Can't use JDK %d with JavaCard kit %s (use JDK 11 or 17)", jdkver, jckit.getVersion()));
453454
}
454455

tests-21.xml

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,26 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<project basedir="." default="test" name="ant-javacard tests">
3+
<import file="kits.xml"/>
4+
35
<!-- Build test applets -->
4-
<target name="test">
5-
<echo message="JDK 21 does not work with any JavaCard kit. See https://github.com/martinpaljak/ant-javacard/wiki/JavaCard-SDK-and-JDK-version-compatibility"/>
6+
<target name="test" depends="jcpro,test-sdks"/>
7+
8+
<!-- Different SDK-s-->
9+
<target name="test-sdks">
10+
<javacard>
11+
<!-- JC 3.2.0 -->
12+
<cap jckit="${JC320_2}" sources="src/testapplets/integer" ints="true">
13+
<applet class="testapplets.integer.EmptyInt" aid="0102030405060708"/>
14+
</cap>
15+
<cap jckit="${JC320_2}" targetsdk="3.0.4" sources="src/testapplets/integer" ints="true">
16+
<applet class="testapplets.integer.EmptyInt" aid="0102030405060708"/>
17+
</cap>
18+
<cap jckit="${JC320_2}" targetsdk="3.0.5" sources="src/testapplets/integer" ints="true">
19+
<applet class="testapplets.integer.EmptyInt" aid="0102030405060708"/>
20+
</cap>
21+
<cap jckit="${JC320_2}" targetsdk="3.1.0" sources="src/testapplets/integer" ints="true">
22+
<applet class="testapplets.integer.EmptyInt" aid="0102030405060708"/>
23+
</cap>
24+
</javacard>
625
</target>
726
</project>

0 commit comments

Comments
 (0)