/*
* Copyright 2011 Licel LLC.
*
* 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 com.licel.jcardsim.crypto;
import javacard.security.ECPublicKey;
import javacard.security.KeyAgreement;
import javacard.security.KeyBuilder;
import javacard.security.KeyPair;
import javacard.security.PrivateKey;
import junit.framework.TestCase;
import org.bouncycastle.util.Arrays;
/**
* Test for <code>KeyAgreementImpl</code>
* Test data from NXP JCOP31-36 JavaCard
*/
public class KeyAgreementImplTest extends TestCase {
public KeyAgreementImplTest(String testName) {
super(testName);
}
protected void setUp() throws Exception {
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* SelfTest of generateSecret method with ECDH algorithm,
* of class KeyAgreementImpl.
*/
public void testGenerateSecretECDH() {
System.out.println("test ecdh");
testGenerateSecret(KeyPair.ALG_EC_F2M, KeyBuilder.LENGTH_EC_F2M_113, KeyAgreement.ALG_EC_SVDP_DH);
testGenerateSecret(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_112, KeyAgreement.ALG_EC_SVDP_DH);
System.out.println("test ecdhc");
testGenerateSecret(KeyPair.ALG_EC_F2M, KeyBuilder.LENGTH_EC_F2M_113, KeyAgreement.ALG_EC_SVDP_DHC);
testGenerateSecret(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_112, KeyAgreement.ALG_EC_SVDP_DHC);
}
/**
* Base method generateSecret
* @param keyAlg - key generation algorithm
* @param keySize - key size
* @param keyAgreementAlg - key agreement algorithm
*/
public void testGenerateSecret(byte keyAlg, short keySize, byte keyAgreementAlg) {
// generate keys
KeyPair kp = new KeyPair(keyAlg, keySize);
kp.genKeyPair();
PrivateKey privateKey1 = kp.getPrivate();
ECPublicKey publicKey1 = (ECPublicKey) kp.getPublic();
kp.genKeyPair();
PrivateKey privateKey2 = kp.getPrivate();
ECPublicKey publicKey2 = (ECPublicKey) kp.getPublic();
// generate first secret
KeyAgreement ka = KeyAgreement.getInstance(keyAgreementAlg, false);
byte[] secret1 = new byte[20];
byte[] public2 = new byte[128];
short publicKeyLength = publicKey2.getW(public2, (short) 0);
ka.init(privateKey1);
short secret1Size = ka.generateSecret(public2, (short) 0, publicKeyLength, secret1, (short) 0);
// generate second secret
byte[] secret2 = new byte[20];
byte[] public1 = new byte[128];
publicKeyLength = publicKey1.getW(public1, (short) 0);
ka.init(privateKey2);
short secret2Size = ka.generateSecret(public1, (short) 0, publicKeyLength, secret2, (short) 0);
// sha1 size = 20
assertEquals(secret1Size, 20);
assertEquals(secret2Size, 20);
assertEquals(true, Arrays.areEqual(secret1, secret2));
}
}