/*
* Copyright (C) 2014 Intel Corporation
* All rights reserved.
*/
package test.crypto;
import com.intel.dcsg.cpg.codec.HexUtil;
import com.intel.dcsg.cpg.crypto.CryptographyException;
import com.intel.dcsg.cpg.crypto.RsaUtil;
import com.intel.dcsg.cpg.crypto.Sha256Digest;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.RSAPublicKeySpec;
import org.junit.Test;
/**
*
* @author jbuhacoff
*/
public class PublicKeyTest {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(PublicKeyTest.class);
/**
* Cannot create a PublicKey object from just the modulus:
* <pre>
* com.intel.dcsg.cpg.crypto.CryptographyException: java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=41, too big.
* </pre>
* @throws CryptographyException
*/
@Test(expected=CryptographyException.class)
public void testDecodePublicKeyFromModulusWrong() throws CryptographyException {
String publicKeyModulusHex = "97a9ef016a9b9c6fa1089a1bb6e6c08909847f36670bcb50397fd5dae350cb62490c344d02fc19002c23974975a63590d78addf4f2f446c70b30c6c83c8a6f04befeaeedf46e4bc9abebd1c298120361520ed5057c67b00a9fadecc1e340c05eb0d8037550aaddda153b369e245b32366a5936df04fea383363b3b0448c8f9ca0282b06c59ed14b00a2ab7ef59394c9e65643683292c47b29ae714bc602c6e4efb7c9a70ee9480af8b38a085ac1b32c2ee8eb90462183add5dbe26a924c223688b2ea8fc73c985b75b2a73e61f9eef71b33b3821549918c7281a54b57b14aad9569d54f3300e93fdf4f734822dd633c83e6a8f3e3e3aeaf3b37737bae69533d3";
byte[] publicKeyBytes = HexUtil.toByteArray(publicKeyModulusHex);
PublicKey publicKey = RsaUtil.decodeDerPublicKey(publicKeyBytes);
log.debug("public key: {}", publicKey);
}
@Test
public void testDecodePublicKeyFromModulusCorrect() throws NoSuchAlgorithmException, InvalidKeySpecException {
String publicKeyModulusHex = "97a9ef016a9b9c6fa1089a1bb6e6c08909847f36670bcb50397fd5dae350cb62490c344d02fc19002c23974975a63590d78addf4f2f446c70b30c6c83c8a6f04befeaeedf46e4bc9abebd1c298120361520ed5057c67b00a9fadecc1e340c05eb0d8037550aaddda153b369e245b32366a5936df04fea383363b3b0448c8f9ca0282b06c59ed14b00a2ab7ef59394c9e65643683292c47b29ae714bc602c6e4efb7c9a70ee9480af8b38a085ac1b32c2ee8eb90462183add5dbe26a924c223688b2ea8fc73c985b75b2a73e61f9eef71b33b3821549918c7281a54b57b14aad9569d54f3300e93fdf4f734822dd633c83e6a8f3e3e3aeaf3b37737bae69533d3";
BigInteger modulus = new BigInteger(publicKeyModulusHex, 16);
BigInteger exponent = new BigInteger("65537", 10); // 65537 = 2^16 + 1 = public key exponent required by TCG Spec for TPM RSA keys
RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory factory = KeyFactory.getInstance("RSA"); // throws NoSuchAlgorithmException
PublicKey publicKey = factory.generatePublic(spec); // throws InvalidKeySpecException
log.debug("public key: {}", publicKey);
}
@Test
public void testSha256OfPublicKeyModulus() {
String publicKeyModulusHex = "97a9ef016a9b9c6fa1089a1bb6e6c08909847f36670bcb50397fd5dae350cb62490c344d02fc19002c23974975a63590d78addf4f2f446c70b30c6c83c8a6f04befeaeedf46e4bc9abebd1c298120361520ed5057c67b00a9fadecc1e340c05eb0d8037550aaddda153b369e245b32366a5936df04fea383363b3b0448c8f9ca0282b06c59ed14b00a2ab7ef59394c9e65643683292c47b29ae714bc602c6e4efb7c9a70ee9480af8b38a085ac1b32c2ee8eb90462183add5dbe26a924c223688b2ea8fc73c985b75b2a73e61f9eef71b33b3821549918c7281a54b57b14aad9569d54f3300e93fdf4f734822dd633c83e6a8f3e3e3aeaf3b37737bae69533d3";
byte[] publicKeyModulus = HexUtil.toByteArray(publicKeyModulusHex);
log.debug("sha256 of ek modulus: {}", Sha256Digest.digestOf(publicKeyModulus).toHexString());
}
}