206 lines
6.5 KiB
Java
206 lines
6.5 KiB
Java
/**
|
|
*
|
|
*/
|
|
package org.mitre.util;
|
|
|
|
import java.security.Key;
|
|
import java.security.KeyFactory;
|
|
import java.security.PublicKey;
|
|
import java.security.cert.CertificateFactory;
|
|
import java.security.cert.X509Certificate;
|
|
import java.security.interfaces.ECKey;
|
|
import java.security.interfaces.ECPublicKey;
|
|
import java.security.interfaces.RSAPublicKey;
|
|
import java.security.spec.RSAPublicKeySpec;
|
|
import java.util.List;
|
|
import java.io.BufferedReader;
|
|
import java.io.InputStreamReader;
|
|
import java.math.BigInteger;
|
|
import java.net.URL;
|
|
|
|
import junit.framework.TestCase;
|
|
|
|
import org.junit.After;
|
|
import org.junit.Before;
|
|
import org.junit.Test;
|
|
import org.mitre.jwk.model.Jwk;
|
|
import org.mitre.jwk.model.Rsa;
|
|
import org.mitre.jwk.model.EC;
|
|
import org.mitre.util.Utility;
|
|
|
|
import com.google.gson.JsonArray;
|
|
import com.google.gson.JsonObject;
|
|
import com.google.gson.JsonParser;
|
|
|
|
import org.apache.commons.codec.binary.*;
|
|
import org.bouncycastle.jce.ECNamedCurveTable;
|
|
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
|
|
import org.bouncycastle.math.ec.ECCurve;
|
|
import org.bouncycastle.jce.provider.JCEECPublicKey;
|
|
|
|
/**
|
|
* @author DERRYBERRY
|
|
*
|
|
*/
|
|
public class UtilityTest extends TestCase{
|
|
|
|
URL url = this.getClass().getResource("/jwk/jwkSuccess");
|
|
URL certUrl = this.getClass().getResource("/x509/x509Cert");
|
|
URL rsaUrl = this.getClass().getResource("/jwk/rsaOnly");
|
|
|
|
/**
|
|
* @throws java.lang.Exception
|
|
*/
|
|
@Before
|
|
public void setUp() throws Exception {
|
|
super.setUp();
|
|
}
|
|
|
|
/**
|
|
* @throws java.lang.Exception
|
|
*/
|
|
@After
|
|
public void tearDown() throws Exception {
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link org.mitre.util.Utility#retrieveJwk(java.lang.String)}.
|
|
* @throws Exception
|
|
*/
|
|
@Test
|
|
public void testRetrieveJwk() throws Exception {
|
|
|
|
JsonParser parser = new JsonParser();
|
|
JsonObject json = parser.parse(new BufferedReader(new InputStreamReader(url.openStream()))).getAsJsonObject();
|
|
JsonArray getArray = json.getAsJsonArray("jwk");
|
|
|
|
List<Jwk> list = Utility.retrieveJwk(url);
|
|
|
|
for(int i = 0; i < list.size(); i++){
|
|
|
|
Jwk jwk = list.get(i);
|
|
JsonObject object = getArray.get(i).getAsJsonObject();
|
|
|
|
assertEquals(object.get("alg").getAsString(), jwk.getAlg());
|
|
if(object.get("kid") != null){
|
|
assertEquals(object.get("kid").getAsString(), jwk.getKid());
|
|
}
|
|
if(object.get("use") != null){
|
|
assertEquals(object.get("use").getAsString(), jwk.getUse());
|
|
}
|
|
|
|
if(jwk instanceof Rsa){
|
|
assertEquals(object.get("mod").getAsString(), ((Rsa) jwk).getMod());
|
|
assertEquals(object.get("exp").getAsString(), ((Rsa) jwk).getExp());
|
|
}
|
|
else {
|
|
assertEquals(object.get("crv").getAsString(), ((EC) jwk).getCrv());
|
|
assertEquals(object.get("x").getAsString(), ((EC) jwk).getX());
|
|
assertEquals(object.get("y").getAsString(), ((EC) jwk).getY());
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testMakeRsa() throws Exception{
|
|
|
|
JsonParser parser = new JsonParser();
|
|
JsonObject json = parser.parse(new BufferedReader(new InputStreamReader(url.openStream()))).getAsJsonObject();
|
|
JsonArray getArray = json.getAsJsonArray("jwk");
|
|
|
|
List<Jwk> list = Utility.retrieveJwk(url);
|
|
|
|
for(int i = 0; i < list.size(); i++){
|
|
Jwk jwk = list.get(i);
|
|
JsonObject object = getArray.get(i).getAsJsonObject();
|
|
|
|
if(jwk instanceof Rsa){
|
|
|
|
RSAPublicKey key = ((RSAPublicKey) ((Rsa) jwk).getKey());
|
|
|
|
byte[] mod = Base64.decodeBase64(object.get("mod").getAsString());
|
|
BigInteger modInt = new BigInteger(mod);
|
|
assertEquals(modInt, key.getModulus());
|
|
|
|
byte[] exp = Base64.decodeBase64(object.get("exp").getAsString());
|
|
BigInteger expInt = new BigInteger(exp);
|
|
assertEquals(expInt, key.getPublicExponent());
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testRetriveX509Key() throws Exception {
|
|
CertificateFactory factory = CertificateFactory.getInstance("X.509");
|
|
X509Certificate x509 = (X509Certificate) factory.generateCertificate(certUrl.openStream());
|
|
Key key = Utility.retrieveX509Key(certUrl);
|
|
assertEquals(x509.getPublicKey(), key);
|
|
assertEquals("RSA", key.getAlgorithm());
|
|
assertEquals("X.509", key.getFormat());
|
|
}
|
|
|
|
public void testRetriveJwkKey() throws Exception {
|
|
Key key = Utility.retrieveJwkKey(rsaUrl);
|
|
|
|
JsonParser parser = new JsonParser();
|
|
JsonObject json = parser.parse(new BufferedReader(new InputStreamReader(rsaUrl.openStream()))).getAsJsonObject();
|
|
JsonArray getArray = json.getAsJsonArray("jwk");
|
|
JsonObject object = getArray.get(0).getAsJsonObject();
|
|
|
|
byte[] modulusByte = Base64.decodeBase64(object.get("mod").getAsString());
|
|
BigInteger modulus = new BigInteger(modulusByte);
|
|
byte[] exponentByte = Base64.decodeBase64(object.get("exp").getAsString());
|
|
BigInteger exponent = new BigInteger(exponentByte);
|
|
|
|
RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, exponent);
|
|
KeyFactory factory = KeyFactory.getInstance("RSA");
|
|
PublicKey pub = factory.generatePublic(spec);
|
|
|
|
assertEquals(pub, key);
|
|
}
|
|
|
|
//@Test
|
|
//public void testMakeEC() throws Exception{
|
|
|
|
/*JsonParser parser = new JsonParser();
|
|
JsonObject json = parser.parse(new BufferedReader(new InputStreamReader(url.openStream()))).getAsJsonObject();
|
|
JsonArray getArray = json.getAsJsonArray("jwk");
|
|
|
|
List<Jwk> list = Utility.retrieveJwk(url);
|
|
|
|
for(int i = 0; i < list.size(); i++){
|
|
Jwk jwk = list.get(i);
|
|
JsonObject object = getArray.get(i).getAsJsonObject();
|
|
|
|
if(jwk instanceof EC){
|
|
|
|
ECPublicKey key = ((ECPublicKey) ((EC) jwk).getKey());
|
|
|
|
byte[] xArray = Base64.decodeBase64(object.get("x").getAsString());
|
|
BigInteger xInt = new BigInteger(xArray);
|
|
byte[] yArray = Base64.decodeBase64(object.get("y").getAsString());
|
|
BigInteger yInt = new BigInteger(yArray);
|
|
|
|
String curveName = object.get("crv").getAsString();
|
|
ECNamedCurveParameterSpec curveSpec = ECNamedCurveTable.getParameterSpec(curveName);
|
|
ECCurve crv = curveSpec.getCurve();
|
|
BigInteger a = crv.getA().toBigInteger();
|
|
BigInteger b = crv.getB().toBigInteger();
|
|
int fieldSize = crv.getFieldSize();
|
|
BigInteger orderOfGen = curveSpec.getH();
|
|
int cofactor = Math.abs(curveSpec.getN().intValue());
|
|
|
|
assertEquals(a, key.getParams().getCurve().getA());
|
|
assertEquals(b, key.getParams().getCurve().getB());
|
|
assertEquals(fieldSize, key.getParams().getCurve().getField());
|
|
assertEquals(orderOfGen, key.getParams().getOrder());
|
|
assertEquals(cofactor, key.getParams().getCofactor());
|
|
assertEquals(xInt, key.getW().getAffineX());
|
|
assertEquals(yInt, key.getW().getAffineY());
|
|
}
|
|
}*/
|
|
//fail("method not implemented");
|
|
//}
|
|
|
|
|
|
} |