Skip to content

Commit

Permalink
Merge pull request #4 from martinpaljak/next
Browse files Browse the repository at this point in the history
Read in block sizes, more undersandable and more boradly supported.
  • Loading branch information
martinpaljak committed Jul 10, 2023
2 parents 41c44df + 4d63d2a commit 6438bd7
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 22 deletions.
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @martinpaljak
14 changes: 11 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.14'
id 'com.palantir.git-version' version '3.0.0' // for gitVersion()
id 'org.beryx.jlink' version '2.25.0'
// id 'com.gluonhq.client-gradle-plugin' version '0.1.42'
// id 'com.gluonhq.gluonfx-gradle-plugin' version '1.0.16'
}

group 'pro.javacard.nfc4pc'
version '230707'
version '230708-next'

repositories {
mavenLocal()
Expand All @@ -27,19 +28,26 @@ javafx {
modules = ['javafx.controls', 'javafx.graphics', 'javafx.swing']
//configuration = 'compileOnly'
}

jlink {
launcher {
name = 'nfc4pc'
}
}

//gluonClient {
// reflectionList = ["pro.javacard.nfc4pc.MainWrapper"]
//}


application {
mainClass = "$moduleName/pro.javacard.nfc4pc.MainWrapper"
mainModule = "pro.javacard.nfc4pc"
mainClass = "pro.javacard.nfc4pc.MainWrapper"
}

jar {
manifest {
attributes 'Main-Class': 'pro.javacard.nfc4pc.MainWrapper'
attributes 'Main-Class': application.mainClass
attributes 'Implementation-Version': gitVersion()
}
from {
Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
3 changes: 2 additions & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
12 changes: 8 additions & 4 deletions gradlew
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
Expand All @@ -80,10 +80,10 @@ do
esac
done

APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit

APP_NAME="Gradle"
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
Expand Down Expand Up @@ -143,12 +143,16 @@ fi
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
Expand Down
1 change: 1 addition & 0 deletions gradlew.bat
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

Expand Down
9 changes: 9 additions & 0 deletions src/main/java/pro/javacard/nfc4pc/CLIOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,15 @@ protected static OptionSet parseArguments(String[] argv) throws IOException {
}

if (args.has(OPT_VERSION)) {
if (args.has(OPT_DEBUG)) {
if (System.getProperty("os.name").equalsIgnoreCase("Mac OS X")) {
ProcessBuilder pb = new ProcessBuilder(List.of("/usr/sbin/sysctl", "-n", "machdep.cpu.brand_string"));
Process process = pb.start();
String result = new String(process.getInputStream().readAllBytes()).trim();
System.out.printf("# Running Java %s (%s) from %s on %s %s (%s)%n", System.getProperty("java.version"), System.getProperty("os.arch"), System.getProperty("java.vendor"), System.getProperty("os.name"), System.getProperty("os.version"), result);
} else
System.out.printf("# Running Java %s (%s) from %s on %s %s%n", System.getProperty("java.version"), System.getProperty("os.arch"), System.getProperty("java.vendor"), System.getProperty("os.name"), System.getProperty("os.version"));
}
System.out.println("NFC4PC version " + CLIOptions.class.getPackage().getImplementationVersion());
System.exit(0);
}
Expand Down
26 changes: 12 additions & 14 deletions src/main/java/pro/javacard/nfc4pc/NDEF.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,33 +35,31 @@ static boolean isNull(byte[] b) {
return true;
}

// Returns the NDEF message
// Returns the NDEF message, if any
static Optional<byte[]> getType2(APDUBIBO b) throws BIBOException {
try {
// Read initial block
ResponseAPDU initial = b.transmit(new CommandAPDU(0xFF, 0xB0, 0x00, 3, 0x10));
if (initial.getSW() == 0x9000 && initial.getData().length == 0x10) {
// Read capability container
ResponseAPDU initial = b.transmit(new CommandAPDU(0xFF, 0xB0, 0x00, 3, 0x04));
if (initial.getSW() == 0x9000 && initial.getData().length == 4) {
var init = initial.getData();
log.debug("Initial read (blocks 3, 4, 5, 6): {}", HexUtils.bin2hex(init));
log.debug("Capability container: {}", HexUtils.bin2hex(init));
if (init[0] == (byte) 0xE1 && init[1] == 0x10) {
int total = (init[2] & 0xFF) * 8;
log.info("NDEF payload of {} bytes", total);
int toRead = total - init.length - 4; // So that we don't read the OTP?
ByteArrayOutputStream payload = new ByteArrayOutputStream();
payload.write(Arrays.copyOfRange(init, 4, init.length));
for (int i = 7; (i - 3) * 4 < total; i += 4) {
log.debug("Reading from block {} to {}, bytes {} to {}", i, i + 3, (i - 3) * 4, (i - 3) * 4 + 16);
for (int i = 4; i * 4 < total; i++) {
log.debug("Reading block {}", i);
log.debug("Current payload: ({} bytes) {}", payload.toByteArray().length, HexUtils.bin2hex(payload.toByteArray()));

var block = b.transmit(new CommandAPDU(0xFF, 0xB0, 0x00, i, 0x10));
var uid_bytes = block.getData();
var block = b.transmit(new CommandAPDU(0xFF, 0xB0, 0x00, i, 4));
var bytes = block.getData();
if (block.getSW() == 0x9000) {
log.debug("Block: {}", HexUtils.bin2hex(uid_bytes));
if (isNull(uid_bytes)) {
log.debug("Block: {}", HexUtils.bin2hex(bytes));
if (isNull(bytes)) {
log.debug("Empty block, not reading more");
break;
}
payload.write(uid_bytes);
payload.write(bytes);
} else {
log.warn("Read returned {}", HexUtils.bin2hex(block.getBytes()));
return Optional.empty();
Expand Down

0 comments on commit 6438bd7

Please sign in to comment.