summaryrefslogtreecommitdiff
path: root/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java
diff options
context:
space:
mode:
Diffstat (limited to 'smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java')
-rw-r--r--smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java114
1 files changed, 8 insertions, 106 deletions
diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java
index e38a8e80..b264bcae 100644
--- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java
+++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java
@@ -16,39 +16,20 @@
*/
package at.gv.egiz.smcc.acos;
-import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
-import java.security.PublicKey;
import java.security.Signature;
-import java.security.interfaces.RSAPrivateKey;
-import java.security.interfaces.RSAPublicKey;
import java.util.Arrays;
-import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.KeyGenerator;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
import javax.smartcardio.CardException;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import at.gv.egiz.smcc.CardChannelEmul;
-import at.gv.egiz.smcc.File;
import at.gv.egiz.smcc.PIN;
-@SuppressWarnings("restriction")
public class A04ApplDEC extends ACOSApplDEC {
private static final byte[] SEC_ENV_INTERNAL_AUTHENTICATE = new byte[] { (byte) 0x84,
@@ -57,91 +38,10 @@ public class A04ApplDEC extends ACOSApplDEC {
private static final byte[] SEC_ENV_DECIPHER = new byte[] { (byte) 0x84,
(byte) 0x01, (byte) 0x88, (byte) 0x80, (byte) 0x01, (byte) 0x02 };
- private static final RSAPrivateKey SK_CH_EKEY;
-
- private static final RSAPublicKey PK_CH_EKEY;
-
- static {
- try {
- KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
- gen.initialize(1536);
- KeyPair keyPair = gen.generateKeyPair();
- SK_CH_EKEY = (RSAPrivateKey) keyPair.getPrivate();
- PK_CH_EKEY = (RSAPublicKey) keyPair.getPublic();
- } catch (NoSuchAlgorithmException e) {
- throw new RuntimeException(e);
- }
- }
-
- public A04ApplDEC() {
- this(false);
- }
-
- public A04ApplDEC(boolean encrypt) {
-
- int offset = 0;
-
- // HEADER 'AIK' + version
- byte[] header;
- try {
- header = "AIK".getBytes("ASCII");
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException(e);
- }
- System.arraycopy(header, 0, EF_INFOBOX, offset, header.length);
- offset += header.length;
- EF_INFOBOX[offset++] = 1;
-
- // HEADER identity link
- EF_INFOBOX[offset++] = (byte) 0x01; // Personenbindung
- if (encrypt) {
- EF_INFOBOX[offset++] = (byte) 0x01; // Modifier
+ protected PrivateKey privateKey;
- byte[] cipherText;
- byte[] encKey;
- try {
- KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
- SecretKey secretKey = keyGenerator.generateKey();
-
- byte[] keyBytes = secretKey.getEncoded();
-
- Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
- byte[] iv = new byte[8];
- Arrays.fill(iv, (byte) 0x00);
- IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
- cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
- cipherText = cipher.doFinal(IDLINK);
-
- cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.ENCRYPT_MODE, PK_CH_EKEY);
- encKey = cipher.doFinal(keyBytes);
-
- } catch (GeneralSecurityException e) {
- throw new RuntimeException(e);
- }
-
- int len = encKey.length + cipherText.length + 2;
-
- EF_INFOBOX[offset++] = (byte) (0xFF & len);
- EF_INFOBOX[offset++] = (byte) (0xFF & len >> 8);
-
- EF_INFOBOX[offset++] = (byte) (0xFF & encKey.length);
- EF_INFOBOX[offset++] = (byte) (0xFF & encKey.length >> 8);
-
- System.arraycopy(encKey, 0, EF_INFOBOX, offset, encKey.length);
- offset += encKey.length;
-
- System.arraycopy(cipherText, 0, EF_INFOBOX, offset, cipherText.length);
-
- } else {
- EF_INFOBOX[offset++] = (byte) 0x00; // Modifier
- EF_INFOBOX[offset++] = (byte) (0xFF & IDLINK.length);
- EF_INFOBOX[offset++] = (byte) (0xFF & IDLINK.length >> 8);
- System.arraycopy(IDLINK, 0, EF_INFOBOX, offset, IDLINK.length);
- offset += IDLINK.length;
- }
-
- putFile(new File(FID_EF_INFOBOX, EF_INFOBOX, FCI_EF_INFOBOX));
+ public void setPrivateKey(PrivateKey privateKey) {
+ this.privateKey = privateKey;
}
@Override
@@ -197,6 +97,8 @@ public class A04ApplDEC extends ACOSApplDEC {
if (command.getP1() == 0x80 && command.getP2() == 0x86) {
+ // DECIPHER
+
byte[] data = command.getData();
if (!Arrays.equals(securityEnv, SEC_ENV_DECIPHER)) {
@@ -217,7 +119,7 @@ public class A04ApplDEC extends ACOSApplDEC {
byte[] plainText;
try {
Cipher cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.DECRYPT_MODE, SK_CH_EKEY);
+ cipher.init(Cipher.DECRYPT_MODE, privateKey);
plainText = cipher.doFinal(cipherText);
} catch (GeneralSecurityException e) {
throw new CardException(e);
@@ -268,8 +170,8 @@ public class A04ApplDEC extends ACOSApplDEC {
byte[] sig;
try {
- Signature signature = Signature.getInstance("RSA");
- signature.initSign(SK_CH_EKEY);
+ Signature signature = Signature.getInstance(privateKey.getAlgorithm());
+ signature.initSign(privateKey);
signature.update(digest);
sig = signature.sign();
} catch (GeneralSecurityException e) {