diff options
-rw-r--r-- | smcc/src/main/java/at/gv/egiz/smcc/GemaltoNetV2_0Card.java | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/smcc/src/main/java/at/gv/egiz/smcc/GemaltoNetV2_0Card.java b/smcc/src/main/java/at/gv/egiz/smcc/GemaltoNetV2_0Card.java index 3bea0753..daa391b4 100644 --- a/smcc/src/main/java/at/gv/egiz/smcc/GemaltoNetV2_0Card.java +++ b/smcc/src/main/java/at/gv/egiz/smcc/GemaltoNetV2_0Card.java @@ -4,6 +4,7 @@ import iaik.me.security.CryptoBag; import iaik.me.security.CryptoException; import iaik.me.security.MessageDigest; import iaik.me.security.cipher.TripleDES; +import iaik.pkcs.pkcs7.DigestInfo; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -39,6 +40,19 @@ public class GemaltoNetV2_0Card extends AbstractSignatureCard implements PinInfo pinPinInfo; PinInfo pukPinInfo; + + private final byte[] SHA1_PADDING = new byte[] { + + (byte) 0x30, (byte) 0x21, (byte) 0x30, (byte) 0x09, (byte) 0x06, + (byte) 0x05, (byte) 0x2B, (byte) 0x0E, (byte) 0x03, (byte) 0x02, + (byte) 0x1A, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x14 }; + + private final byte[] SHA256_PADDING = new byte[] { + + (byte) 0x30, (byte) 0x31, (byte) 0x30, (byte) 0x0d, (byte) 0x06, + (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01, + (byte) 0x65, (byte) 0x03, (byte) 0x04, (byte) 0x02, (byte) 0x01, + (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x20 }; public void init(Card card, CardTerminal cardTerminal) { super.init(card, cardTerminal); @@ -111,12 +125,14 @@ public class GemaltoNetV2_0Card extends AbstractSignatureCard implements PINGUI pinGUI, String alg) throws SignatureCardException, InterruptedException, IOException { + boolean sha1 = false; MessageDigest md; try { if (KeyboxName.SECURE_SIGNATURE_KEYPAIR.equals(keyboxName) && (alg == null || "http://www.w3.org/2000/09/xmldsig#rsa-sha1" .equals(alg))) { md = MessageDigest.getInstance("SHA-1"); + sha1 = true; } else if (KeyboxName.SECURE_SIGNATURE_KEYPAIR.equals(keyboxName) && ("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" .equals(alg))) { @@ -145,8 +161,19 @@ public class GemaltoNetV2_0Card extends AbstractSignatureCard implements MSCMService service = new MSCMService(channel); verifyPINLoop(channel, pinPinInfo, pinGUI); - - byte[] paded = padding.pad(digest); + + ByteArrayOutputStream fdata = new ByteArrayOutputStream(); + + + if(sha1) { + fdata.write(SHA1_PADDING); + } else { + fdata.write(SHA256_PADDING); + } + fdata.write(digest); + fdata.close(); + byte[] msg = fdata.toByteArray(); + byte[] paded = padding.pad(msg); byte[] sign = service.privateKeyDecrypt((byte) 0, (byte) 2, paded); return sign; } catch (Throwable e) { |