From 265b0aca555d9880361b754b6a18ce70b5be28cd Mon Sep 17 00:00:00 2001 From: mcentner Date: Wed, 16 Jun 2010 11:19:41 +0000 Subject: Refactored smart card unit tests to use Spring to configure smart card emulators. git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@754 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../smcc/test/spring/ByteArrayFactoryBean.java | 48 +++++ .../test/spring/ByteArrayPropertyDependable.java | 38 ++++ .../smcc/test/spring/ByteArrayPropertyEditor.java | 49 +++++ .../spring/ByteArrayPropertyEditorRegistrar.java | 32 +++ .../test/spring/ByteArrayPropertyEditorTest.java | 53 +++++ .../test/spring/CertificateFileFactoryBean.java | 118 +++++++++++ .../spring/InfoboxContainerFileFactoryBean.java | 236 +++++++++++++++++++++ .../smcc/test/spring/PrivateKeyFactoryBean.java | 62 ++++++ .../smcc/test/spring/PublicKeyFactoryBean.java | 62 ++++++ 9 files changed, 698 insertions(+) create mode 100644 smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayFactoryBean.java create mode 100644 smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyDependable.java create mode 100644 smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditor.java create mode 100644 smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorRegistrar.java create mode 100644 smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorTest.java create mode 100644 smcc/src/test/java/at/gv/egiz/smcc/test/spring/CertificateFileFactoryBean.java create mode 100644 smcc/src/test/java/at/gv/egiz/smcc/test/spring/InfoboxContainerFileFactoryBean.java create mode 100644 smcc/src/test/java/at/gv/egiz/smcc/test/spring/PrivateKeyFactoryBean.java create mode 100644 smcc/src/test/java/at/gv/egiz/smcc/test/spring/PublicKeyFactoryBean.java (limited to 'smcc/src/test/java/at/gv/egiz/smcc/test/spring') diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayFactoryBean.java new file mode 100644 index 00000000..91cb7cfb --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayFactoryBean.java @@ -0,0 +1,48 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.smcc.test.spring; + +import org.springframework.beans.factory.FactoryBean; + +public class ByteArrayFactoryBean implements FactoryBean { + + private byte[] bytes; + + /** + * @param bytes the bytes to set + */ + public void setBytes(byte[] bytes) { + this.bytes = bytes; + } + + @Override + public Object getObject() throws Exception { + return bytes; + } + + @Override + public Class getObjectType() { + return byte[].class; + } + + @Override + public boolean isSingleton() { + return false; + } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyDependable.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyDependable.java new file mode 100644 index 00000000..dcae3391 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyDependable.java @@ -0,0 +1,38 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.smcc.test.spring; + +public class ByteArrayPropertyDependable { + + private byte[] bytes; + + /** + * @return the bytes + */ + public byte[] getBytes() { + return bytes; + } + + /** + * @param bytes the bytes to set + */ + public void setBytes(byte[] bytes) { + this.bytes = bytes; + } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditor.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditor.java new file mode 100644 index 00000000..78dd3f88 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditor.java @@ -0,0 +1,49 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.smcc.test.spring; + +import java.beans.PropertyEditorSupport; +import java.io.ByteArrayOutputStream; + +public class ByteArrayPropertyEditor extends PropertyEditorSupport { + + @Override + public void setAsText(String text) throws IllegalArgumentException { + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + + int hi = 0, n = 0; + for (int i = 0; i < text.length(); i++) { + int digit = Character.digit(text.charAt(i), 16); + if (digit != -1) { + if (n++ % 2 == 0) { + hi = digit << 4; + } else { + os.write(hi + digit); + } + } + } + + if (n % 2 != 0) { + throw new IllegalArgumentException(); + } + + setValue(os.toByteArray()); + } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorRegistrar.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorRegistrar.java new file mode 100644 index 00000000..7a2bb30c --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorRegistrar.java @@ -0,0 +1,32 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.smcc.test.spring; + +import org.springframework.beans.PropertyEditorRegistrar; +import org.springframework.beans.PropertyEditorRegistry; + + +public class ByteArrayPropertyEditorRegistrar implements + PropertyEditorRegistrar { + + @Override + public void registerCustomEditors(PropertyEditorRegistry registry) { + registry.registerCustomEditor(byte[].class, new ByteArrayPropertyEditor()); + } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorTest.java new file mode 100644 index 00000000..6c10c705 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorTest.java @@ -0,0 +1,53 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.smcc.test.spring; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + + +public class ByteArrayPropertyEditorTest { + + public byte[] bytes = { (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, + (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, + (byte) 0x09, (byte) 0x0a, (byte) 0x0b, (byte) 0x0c, (byte) 0x0d, + (byte) 0x0e, (byte) 0x0f, (byte) 0xf0, (byte) 0xe0, (byte) 0xd0, + (byte) 0xc0, (byte) 0xb0, (byte) 0xa0, (byte) 0x90, (byte) 0x80, + (byte) 0x70, (byte) 0x60, (byte) 0x50, (byte) 0x40, (byte) 0x30, + (byte) 0x20, (byte) 0x10, (byte) 0x00 }; + + @Test + public void testByteArrayPropertyEditor() { + + ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( + "at/gv/egiz/smcc/spring/PropertyEditorTest.xml"); + + ByteArrayPropertyDependable testBean = (ByteArrayPropertyDependable) applicationContext + .getBean("testBean", ByteArrayPropertyDependable.class); + assertNotNull(testBean); + + assertArrayEquals(bytes, testBean.getBytes()); + + System.out.println("" + byte[].class); + + } + + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/CertificateFileFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/CertificateFileFactoryBean.java new file mode 100644 index 00000000..8bfd5bd4 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/CertificateFileFactoryBean.java @@ -0,0 +1,118 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.smcc.test.spring; + +import org.springframework.beans.factory.FactoryBean; + +import at.gv.egiz.smcc.File; + +public class CertificateFileFactoryBean implements FactoryBean { + + private byte[] fid; + + private byte[] fcx; + + private byte[] certificate; + + private int fileSize; + + /** + * @return the certificate + */ + public byte[] getCertificate() { + return certificate; + } + + /** + * @param certificate the certificate to set + */ + public void setCertificate(byte[] certificate) { + this.certificate = certificate; + } + + /** + * @return the fid + */ + public byte[] getFid() { + return fid; + } + + /** + * @param fid the fid to set + */ + public void setFid(byte[] fid) { + this.fid = fid; + } + + /** + * @return the fcx + */ + public byte[] getFcx() { + return fcx; + } + + /** + * @param fcx the fcx to set + */ + public void setFcx(byte[] fcx) { + this.fcx = fcx; + } + + /** + * @return the fileSize + */ + public int getFileSize() { + return fileSize; + } + + /** + * @param fileSize the fileSize to set + */ + public void setFileSize(int fileSize) { + this.fileSize = fileSize; + } + + @Override + public Object getObject() throws Exception { + + byte[] file = new byte[fileSize]; + + if (certificate != null) { + System.arraycopy(certificate, 0, file, 0, Math.min(certificate.length, file.length)); + } + + File f = new File(); + f.setFile(file); + f.setFid(fid); + f.setFcx(fcx); + + return f; + + } + + @Override + public Class getObjectType() { + return File.class; + } + + @Override + public boolean isSingleton() { + return false; + } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/InfoboxContainerFileFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/InfoboxContainerFileFactoryBean.java new file mode 100644 index 00000000..6dbccc2a --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/InfoboxContainerFileFactoryBean.java @@ -0,0 +1,236 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.smcc.test.spring; + +import java.nio.charset.Charset; +import java.security.GeneralSecurityException; +import java.security.PublicKey; +import java.util.Arrays; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +import org.springframework.beans.factory.FactoryBean; + +import at.gv.egiz.smcc.File; + +public class InfoboxContainerFileFactoryBean implements FactoryBean { + + private byte[] fid; + + private byte[] fcx; + + private int kid = -1; + + private PublicKey publicKey; + + private boolean container; + + private byte[] identityLink; + + private int fileSize; + + /** + * @return the container + */ + public boolean isContainer() { + return container; + } + + /** + * @param container the container to set + */ + public void setContainer(boolean container) { + this.container = container; + } + + /** + * @return the identityLink + */ + public byte[] getIdentityLink() { + return identityLink; + } + + /** + * @param identityLink the identityLink to set + */ + public void setIdentityLink(byte[] identityLink) { + this.identityLink = identityLink; + } + + /** + * @return the fid + */ + public byte[] getFid() { + return fid; + } + + /** + * @param fid the fid to set + */ + public void setFid(byte[] fid) { + this.fid = fid; + } + + /** + * @return the fcx + */ + public byte[] getFcx() { + return fcx; + } + + /** + * @param fcx the fcx to set + */ + public void setFcx(byte[] fcx) { + this.fcx = fcx; + } + + /** + * @return the kid + */ + public int getKid() { + return kid; + } + + /** + * @param kid the kid to set + */ + public void setKid(int kid) { + this.kid = kid; + } + + /** + * @return the publicKey + */ + public PublicKey getPublicKey() { + return publicKey; + } + + /** + * @param publicKey the publicKey to set + */ + public void setPublicKey(PublicKey publicKey) { + this.publicKey = publicKey; + } + + /** + * @return the fileSize + */ + public int getFileSize() { + return fileSize; + } + + /** + * @param fileSize the fileSize to set + */ + public void setFileSize(int fileSize) { + this.fileSize = fileSize; + } + + @Override + public Object getObject() throws Exception { + + byte[] file = new byte[fileSize]; + + if (container) { + + int offset = 0; + + // HEADER 'AIK' + version + byte[] header = "AIK".getBytes(Charset.forName("ASCII")); + System.arraycopy(header, 0, file, offset, header.length); + offset += header.length; + file[offset++] = 1; + + // HEADER identity link + file[offset++] = (byte) 0x01; // Personenbindung + if (publicKey != null) { + file[offset++] = (byte) 0x01; // Modifier + + 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(identityLink); + + cipher = Cipher.getInstance(publicKey.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + encKey = cipher.doFinal(keyBytes); + + } catch (GeneralSecurityException e) { + throw new RuntimeException(e); + } + + int len = encKey.length + cipherText.length + 2; + + file[offset++] = (byte) (0xFF & len); + file[offset++] = (byte) (0xFF & len >> 8); + + file[offset++] = (byte) (0xFF & encKey.length); + file[offset++] = (byte) (0xFF & encKey.length >> 8); + + System.arraycopy(encKey, 0, file, offset, encKey.length); + offset += encKey.length; + + System.arraycopy(cipherText, 0, file, offset, cipherText.length); + + } else { + file[offset++] = (byte) 0x00; // Modifier + file[offset++] = (byte) (0xFF & identityLink.length); + file[offset++] = (byte) (0xFF & identityLink.length >> 8); + System.arraycopy(identityLink, 0, file, offset, identityLink.length); + offset += identityLink.length; + } + + } else if (identityLink != null) { + System.arraycopy(identityLink, 0, file, 0, Math.min(identityLink.length, file.length)); + } + + File f = new File(); + f.setFile(file); + f.setFid(fid); + f.setFcx(fcx); + f.setKid(kid); + + return f; + + } + + @Override + public Class getObjectType() { + return File.class; + } + + @Override + public boolean isSingleton() { + return false; + } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PrivateKeyFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PrivateKeyFactoryBean.java new file mode 100644 index 00000000..6470b5ca --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PrivateKeyFactoryBean.java @@ -0,0 +1,62 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.smcc.test.spring; + +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; + +import org.springframework.beans.factory.FactoryBean; + +public class PrivateKeyFactoryBean implements FactoryBean { + + private byte[] encodedKey; + + private String algorithm; + + /** + * @param encodedKey the encodedKey to set + */ + public void setEncodedKey(byte[] encodedKey) { + this.encodedKey = encodedKey; + } + + /** + * @param algorithm the algorithm to set + */ + public void setAlgorithm(String algorithm) { + this.algorithm = algorithm; + } + + @Override + public Object getObject() throws Exception { + KeyFactory keyFactory = KeyFactory.getInstance(algorithm); + return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey)); + } + + @Override + public Class getObjectType() { + return PrivateKey.class; + } + + @Override + public boolean isSingleton() { + return false; + } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PublicKeyFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PublicKeyFactoryBean.java new file mode 100644 index 00000000..83b552cf --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PublicKeyFactoryBean.java @@ -0,0 +1,62 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.smcc.test.spring; + +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.X509EncodedKeySpec; + +import org.springframework.beans.factory.FactoryBean; + +public class PublicKeyFactoryBean implements FactoryBean { + + private byte[] encodedKey; + + private String algorithm; + + /** + * @param encodedKey the encodedKey to set + */ + public void setEncodedKey(byte[] encodedKey) { + this.encodedKey = encodedKey; + } + + /** + * @param algorithm the algorithm to set + */ + public void setAlgorithm(String algorithm) { + this.algorithm = algorithm; + } + + @Override + public Object getObject() throws Exception { + KeyFactory keyFactory = KeyFactory.getInstance(algorithm); + return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey)); + } + + @Override + public Class getObjectType() { + return PublicKey.class; + } + + @Override + public boolean isSingleton() { + return false; + } + +} -- cgit v1.2.3