/*
* oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.
*
* Copyright (c) 2014, Gluu
*/
package org.xdi.oxauth.model.jwk;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.xdi.oxauth.model.crypto.signature.ECEllipticCurve;
import org.xdi.oxauth.model.crypto.signature.SignatureAlgorithm;
import org.xdi.oxauth.model.util.StringUtils;
import org.xdi.oxauth.model.util.Util;
import java.util.List;
import static org.xdi.oxauth.model.jwk.JWKParameter.*;
/**
* @author Javier Rojas Blum
* @version September 30, 2016
*/
public class JSONWebKey implements Comparable<JSONWebKey> {
private String kid;
private KeyType kty;
private Use use;
private SignatureAlgorithm alg;
private Long exp;
private ECEllipticCurve crv;
private List<String> x5c;
/**
* Modulus
*/
private String n;
/**
* Exponent
*/
private String e;
private String x;
private String y;
public JSONWebKey() {
}
/**
* Returns the Key ID. The Key ID member can be used to match a specific key. This can be used, for instance,
* to choose among a set of keys within the JWK during key rollover.
*
* @return The Key ID.
*/
public String getKid() {
return kid;
}
/**
* Sets the Key ID.
*
* @param kid The Key ID.
*/
public void setKid(String kid) {
this.kid = kid;
}
public KeyType getKty() {
return kty;
}
public void setKty(KeyType kty) {
this.kty = kty;
}
/**
* Returns the intended use of the key: signature or encryption.
*
* @return The intended use of the key.
*/
public Use getUse() {
return use;
}
/**
* Sets the intended use of the key: signature or encryption.
*
* @param use The intended use of the key.
*/
public void setUse(Use use) {
this.use = use;
}
public SignatureAlgorithm getAlg() {
return alg;
}
public void setAlg(SignatureAlgorithm alg) {
this.alg = alg;
}
public Long getExp() {
return exp;
}
public void setExp(Long exp) {
this.exp = exp;
}
/**
* Returns the curve member that identifies the cryptographic curve used with the key.
*
* @return The curve member that identifies the cryptographic curve used with the key.
*/
public ECEllipticCurve getCrv() {
return crv;
}
/**
* Sets the curve member that identifies the cryptographic curve used with the key.
*
* @param crv The curve member that identifies the cryptographic curve used with the key.
*/
public void setCrv(ECEllipticCurve crv) {
this.crv = crv;
}
public List<String> getX5c() {
return x5c;
}
public void setX5c(List<String> x5c) {
this.x5c = x5c;
}
/**
* Returns the modulus value for the RSA public key. It is represented as the base64url encoding of the value's
* representation.
*
* @return The modulus value for the RSA public key.
*/
public String getN() {
return n;
}
/**
* Sets the modulus value for the RSA public key.
*
* @param n The modulus value for the RSA public key.
*/
public void setN(String n) {
this.n = n;
}
/**
* Returns the exponent value for the RSA public key.
*
* @return The exponent value for the RSA public key.
*/
public String getE() {
return e;
}
/**
* Sets the exponent value for the RSA public key.
*
* @param e The exponent value for the RSA public key.
*/
public void setE(String e) {
this.e = e;
}
/**
* Returns the x member that contains the x coordinate for the elliptic curve point. It is represented as the
* base64url encoding of the coordinate's big endian representation.
*
* @return The x member that contains the x coordinate for the elliptic curve point.
*/
public String getX() {
return x;
}
/**
* Sets the x member that contains the x coordinate for the elliptic curve point.
*
* @param x The x member that contains the x coordinate for the elliptic curve point.
*/
public void setX(String x) {
this.x = x;
}
/**
* Returns the y member that contains the x coordinate for the elliptic curve point. It is represented as the
* base64url encoding of the coordinate's big endian representation.
*
* @return The y member that contains the x coordinate for the elliptic curve point.
*/
public String getY() {
return y;
}
/**
* Sets the y member that contains the y coordinate for the elliptic curve point.
*
* @param y The y member that contains the y coordinate for the elliptic curve point.
*/
public void setY(String y) {
this.y = y;
}
public JSONObject toJSONObject() throws JSONException {
JSONObject jsonObj = new JSONObject();
jsonObj.put(KEY_ID, kid);
jsonObj.put(KEY_TYPE, kty);
jsonObj.put(KEY_USE, use);
jsonObj.put(ALGORITHM, alg);
jsonObj.put(EXPIRATION_TIME, exp);
jsonObj.put(CURVE, crv);
if (!Util.isNullOrEmpty(n)) {
jsonObj.put(MODULUS, n);
}
if (!Util.isNullOrEmpty(e)) {
jsonObj.put(EXPONENT, e);
}
if (!Util.isNullOrEmpty(x)) {
jsonObj.put(X, x);
}
if (!Util.isNullOrEmpty(y)) {
jsonObj.put(Y, y);
}
if (x5c != null && !x5c.isEmpty()) {
jsonObj.put(CERTIFICATE_CHAIN, StringUtils.toJSONArray(x5c));
}
return jsonObj;
}
@Override
public int compareTo(JSONWebKey o) {
if (this.getExp() == null || o.getExp() == null) {
return 0;
}
return getExp().compareTo(o.getExp());
}
public static JSONWebKey fromJSONObject(JSONObject jwkJSONObject) throws JSONException {
JSONWebKey jwk = new JSONWebKey();
jwk.setKid(jwkJSONObject.optString(KEY_ID));
jwk.setKty(KeyType.fromString(jwkJSONObject.optString(KEY_TYPE)));
jwk.setUse(Use.fromString(jwkJSONObject.optString(KEY_USE)));
jwk.setAlg(SignatureAlgorithm.fromString(jwkJSONObject.optString(ALGORITHM)));
if (jwkJSONObject.has(EXPIRATION_TIME)) {
jwk.setExp(jwkJSONObject.optLong(EXPIRATION_TIME));
}
jwk.setCrv(ECEllipticCurve.fromString(jwkJSONObject.optString(CURVE)));
if (jwkJSONObject.has(MODULUS)) {
jwk.setN(jwkJSONObject.optString(MODULUS));
}
if (jwkJSONObject.has(EXPONENT)) {
jwk.setE(jwkJSONObject.optString(EXPONENT));
}
if (jwkJSONObject.has(X)) {
jwk.setX(jwkJSONObject.optString(X));
}
if (jwkJSONObject.has(Y)) {
jwk.setY(jwkJSONObject.optString(Y));
}
if (jwkJSONObject.has(CERTIFICATE_CHAIN)) {
jwk.setX5c(StringUtils.toList(jwkJSONObject.optJSONArray(CERTIFICATE_CHAIN)));
}
return jwk;
}
}