in java/remoteprovisioning/CryptoUtil.java [314:349]
public static PublicKey oneKeyToP256PublicKey(OneKey key) throws CborException, CryptoException {
if (!key.get(KeyKeys.KeyType).equals(KeyKeys.KeyType_EC2)) {
throw new CborException(
"Key has unexpected key type (kty)",
KeyKeys.KeyType_EC2.AsInt32(),
key.get(KeyKeys.KeyType).AsInt32(),
CborException.INCORRECT_COSE_TYPE);
}
if (!key.get(KeyKeys.Algorithm).equals(AlgorithmID.ECDSA_256.AsCBOR())) {
throw new CborException(
"Key has unexpected algorithm",
AlgorithmID.ECDSA_256.AsCBOR().AsInt32(),
key.get(KeyKeys.Algorithm).AsInt32(),
CborException.INCORRECT_COSE_TYPE);
}
if (!key.get(KeyKeys.EC2_Curve).equals(KeyKeys.EC2_P256)) {
throw new CborException(
"Key has unexpected curve",
KeyKeys.EC2_P256.AsInt32(),
key.get(KeyKeys.EC2_Curve).AsInt32(),
CborException.INCORRECT_COSE_TYPE);
}
try {
BigInteger x = new BigInteger(1 /* positive */, key.get(KeyKeys.EC2_X).GetByteString());
BigInteger y = new BigInteger(1 /* positive */, key.get(KeyKeys.EC2_Y).GetByteString());
AlgorithmParameters parameters = AlgorithmParameters.getInstance("EC");
parameters.init(new ECGenParameterSpec("secp256r1"));
ECParameterSpec ecParameters = parameters.getParameterSpec(ECParameterSpec.class);
ECPoint point = new ECPoint(x, y);
ECPublicKeySpec keySpec = new ECPublicKeySpec(point, ecParameters);
KeyFactory keyFactory = KeyFactory.getInstance("EC");
return keyFactory.generatePublic(keySpec);
} catch (NoSuchAlgorithmException | InvalidParameterSpecException | InvalidKeySpecException e) {
throw new CryptoException("No support for P256.", e, CryptoException.NO_SUCH_ALGORITHM);
}
}