From 5d40822ea54b113229d41eec18dbfadd54e0acc7 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 2 Feb 2018 02:27:33 +0100 Subject: [PATCH] make sure CommandApdu consistently copies input data --- .../keychain/securitytoken/CommandApdu.java | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/CommandApdu.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/CommandApdu.java index 5efdd2ee6..48ffe39bb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/CommandApdu.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/CommandApdu.java @@ -42,43 +42,39 @@ public abstract class CommandApdu { } public static CommandApdu create(int cla, int ins, int p1, int p2) { - return create(cla, ins, p1, p2, null, 0); + return create(cla, ins, p1, p2, null, 0, 0, 0); } public static CommandApdu create(int cla, int ins, int p1, int p2, int ne) { - return create(cla, ins, p1, p2, null, ne); + return create(cla, ins, p1, p2, null, 0, 0, ne); } public static CommandApdu create(int cla, int ins, int p1, int p2, byte[] data) { - return create(cla, ins, p1, p2, data, 0); + return create(cla, ins, p1, p2, data, 0, data.length, 0); } public static CommandApdu create(int cla, int ins, int p1, int p2, byte[] data, int dataOffset, int dataLength) { - if (data != null) { - data = Arrays.copyOfRange(data, dataOffset, dataOffset + dataLength); - } - return create(cla, ins, p1, p2, data, 0); - } - - public static CommandApdu create(int cla, int ins, int p1, int p2, byte[] data, int dataOffset, int dataLength, - int ne) { - if (data != null) { - data = Arrays.copyOfRange(data, dataOffset, dataOffset + dataLength); - } - return create(cla, ins, p1, p2, data, ne); + return create(cla, ins, p1, p2, data, dataOffset, dataLength,0); } public static CommandApdu create(int cla, int ins, int p1, int p2, byte[] data, int ne) { + return create(cla, ins, p1, p2, data, 0, data.length, ne); + } + + public static CommandApdu create( + int cla, int ins, int p1, int p2, byte[] data, int dataOffset, int dataLength, int ne) { if (ne < 0) { throw new IllegalArgumentException("ne must not be negative"); } if (ne > 65536) { throw new IllegalArgumentException("ne is too large"); } - - if (data == null) { + if (data != null) { + data = Arrays.copyOfRange(data, dataOffset, dataOffset + dataLength); + } else { data = new byte[0]; } + return new AutoValue_CommandApdu(cla, ins, p1, p2, data, ne); }