From 7a3836b775f33fcb0bda0aa49e1fe398a2313166 Mon Sep 17 00:00:00 2001 From: Arnaud Fontaine Date: Fri, 17 Feb 2017 14:19:40 +0100 Subject: [PATCH] Fix IllegalArgumentException in SecurityTokenUtils #2036 --- .../securitytoken/SecurityTokenUtils.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenUtils.java index 7fe625434..d8077c615 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenUtils.java @@ -82,33 +82,35 @@ public class SecurityTokenUtils { template.write(new byte[]{(byte) 0x91, (byte) expLengthBytes}); writeBits(data, secretKey.getPublicExponent(), expLengthBytes); - // Prime P, length 128 - template.write(Hex.decode("928180")); - writeBits(data, secretKey.getPrimeP(), 128); + final int modLengthBytes = format.getModulusLength() / 8; - // Prime Q, length 128 + // Prime P, length modLengthBytes / 2 + template.write(Hex.decode("928180")); + writeBits(data, secretKey.getPrimeP(), modLengthBytes / 2); + + // Prime Q, length modLengthBytes / 2 template.write(Hex.decode("938180")); - writeBits(data, secretKey.getPrimeQ(), 128); + writeBits(data, secretKey.getPrimeQ(), modLengthBytes / 2); if (format.getAlgorithmFormat().isIncludeCrt()) { - // Coefficient (1/q mod p), length 128 + // Coefficient (1/q mod p), length modLengthBytes / 2 template.write(Hex.decode("948180")); - writeBits(data, secretKey.getCrtCoefficient(), 128); + writeBits(data, secretKey.getCrtCoefficient(), modLengthBytes / 2); - // Prime exponent P (d mod (p - 1)), length 128 + // Prime exponent P (d mod (p - 1)), length modLengthBytes / 2 template.write(Hex.decode("958180")); - writeBits(data, secretKey.getPrimeExponentP(), 128); + writeBits(data, secretKey.getPrimeExponentP(), modLengthBytes / 2); - // Prime exponent Q (d mod (1 - 1)), length 128 + // Prime exponent Q (d mod (1 - 1)), length modLengthBytes / 2 template.write(Hex.decode("968180")); - writeBits(data, secretKey.getPrimeExponentQ(), 128); + writeBits(data, secretKey.getPrimeExponentQ(), modLengthBytes / 2); } if (format.getAlgorithmFormat().isIncludeModulus()) { - // Modulus, length 256, last item in private key template + // Modulus, length modLengthBytes, last item in private key template template.write(Hex.decode("97820100")); - writeBits(data, secretKey.getModulus(), 256); + writeBits(data, secretKey.getModulus(), modLengthBytes); } // Bundle up