cleaned up signer initialization calls and algorithm-setting code, cleaned up algorithm names, renamed encrypter/decrypter classes
parent
d204ff1e69
commit
8b848af0fb
|
@ -3,7 +3,7 @@ package org.mitre.jwt.encryption;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
public abstract class AbstractJweDecrypter implements JwtDecrypter {
|
public abstract class AbstractJweDecrypter implements JweDecrypter {
|
||||||
|
|
||||||
long MAX_HASH_INPUTLEN = Long.MAX_VALUE;
|
long MAX_HASH_INPUTLEN = Long.MAX_VALUE;
|
||||||
long UNSIGNED_INT_MAX_VALUE = 4294967395L;
|
long UNSIGNED_INT_MAX_VALUE = 4294967395L;
|
||||||
|
|
|
@ -3,7 +3,7 @@ package org.mitre.jwt.encryption;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
public abstract class AbstractJweEncrypter implements JwtEncrypter {
|
public abstract class AbstractJweEncrypter implements JweEncrypter {
|
||||||
|
|
||||||
public MessageDigest md;
|
public MessageDigest md;
|
||||||
|
|
||||||
|
@ -45,7 +45,8 @@ public abstract class AbstractJweEncrypter implements JwtEncrypter {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] intToFourBytes(int i) {
|
// this is a utility function, shouldn't be in the public interface for this class
|
||||||
|
protected byte[] intToFourBytes(int i) {
|
||||||
byte[] res = new byte[4];
|
byte[] res = new byte[4];
|
||||||
res[0] = (byte) (i >>> 24);
|
res[0] = (byte) (i >>> 24);
|
||||||
res[1] = (byte) ((i >>> 16) & 0xFF);
|
res[1] = (byte) ((i >>> 16) & 0xFF);
|
||||||
|
|
|
@ -11,7 +11,7 @@ import javax.crypto.NoSuchPaddingException;
|
||||||
|
|
||||||
import org.mitre.jwe.model.Jwe;
|
import org.mitre.jwe.model.Jwe;
|
||||||
|
|
||||||
public interface JwtDecrypter {
|
public interface JweDecrypter {
|
||||||
|
|
||||||
public Jwe decrypt(String encryptedJwe, Key privateKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException;
|
public Jwe decrypt(String encryptedJwe, Key privateKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException;
|
||||||
|
|
|
@ -17,7 +17,7 @@ import com.google.gson.JsonIOException;
|
||||||
import com.google.gson.JsonSyntaxException;
|
import com.google.gson.JsonSyntaxException;
|
||||||
|
|
||||||
|
|
||||||
public interface JwtEncrypter {
|
public interface JweEncrypter {
|
||||||
|
|
||||||
public byte[] encryptKey(Jwe jwe, byte[] cmk, Key publicKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException;
|
public byte[] encryptKey(Jwe jwe, byte[] cmk, Key publicKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException;
|
||||||
|
|
||||||
|
@ -27,6 +27,4 @@ public interface JwtEncrypter {
|
||||||
|
|
||||||
public byte[] generateContentKey(byte[] cmk, int keyDataLen, byte[] type) throws NoSuchAlgorithmException;
|
public byte[] generateContentKey(byte[] cmk, int keyDataLen, byte[] type) throws NoSuchAlgorithmException;
|
||||||
|
|
||||||
public byte[] intToFourBytes(int i);
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -25,6 +25,7 @@ import com.google.common.collect.Lists;
|
||||||
|
|
||||||
public abstract class AbstractJwtSigner implements JwtSigner {
|
public abstract class AbstractJwtSigner implements JwtSigner {
|
||||||
|
|
||||||
|
// TODO: make this a JwsAlgorithm enum value?
|
||||||
private String algorithm;
|
private String algorithm;
|
||||||
|
|
||||||
public AbstractJwtSigner(String algorithm) {
|
public AbstractJwtSigner(String algorithm) {
|
||||||
|
|
|
@ -24,6 +24,9 @@ import org.apache.commons.lang.StringUtils;
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public enum JwsAlgorithm {
|
public enum JwsAlgorithm {
|
||||||
|
|
||||||
|
// PLAINTEXT
|
||||||
|
NONE("plaintext"),
|
||||||
|
|
||||||
// HMAC
|
// HMAC
|
||||||
HS256("HMACSHA256"),
|
HS256("HMACSHA256"),
|
||||||
|
|
|
@ -21,6 +21,8 @@ import org.mitre.jwt.model.Jwt;
|
||||||
|
|
||||||
public interface JwtSigner {
|
public interface JwtSigner {
|
||||||
|
|
||||||
|
public String getAlgorithm();
|
||||||
|
|
||||||
public Jwt sign(Jwt jwt) throws NoSuchAlgorithmException;
|
public Jwt sign(Jwt jwt) throws NoSuchAlgorithmException;
|
||||||
|
|
||||||
public boolean verify(String jwtString) throws NoSuchAlgorithmException;
|
public boolean verify(String jwtString) throws NoSuchAlgorithmException;
|
||||||
|
|
|
@ -137,7 +137,7 @@ public class HmacSigner extends AbstractJwtSigner implements InitializingBean {
|
||||||
@Override
|
@Override
|
||||||
public String generateSignature(String signatureBase) throws NoSuchAlgorithmException {
|
public String generateSignature(String signatureBase) throws NoSuchAlgorithmException {
|
||||||
|
|
||||||
afterPropertiesSet();
|
initializeMac();
|
||||||
|
|
||||||
if (passphrase == null) {
|
if (passphrase == null) {
|
||||||
throw new IllegalArgumentException("Passphrase cannot be null");
|
throw new IllegalArgumentException("Passphrase cannot be null");
|
||||||
|
@ -176,7 +176,7 @@ public class HmacSigner extends AbstractJwtSigner implements InitializingBean {
|
||||||
this.passphrase = passphrase;
|
this.passphrase = passphrase;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initializeMac() {
|
private void initializeMac() {
|
||||||
// TODO: check if it's already been done
|
// TODO: check if it's already been done
|
||||||
try {
|
try {
|
||||||
mac = Mac.getInstance(JwsAlgorithm.getByName(super.getAlgorithm()).getStandardName());
|
mac = Mac.getInstance(JwsAlgorithm.getByName(super.getAlgorithm()).getStandardName());
|
||||||
|
@ -185,21 +185,22 @@ public class HmacSigner extends AbstractJwtSigner implements InitializingBean {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: nuke and clean up
|
// TODO: nuke and clean up
|
||||||
public void initializeMacJwe(String signatureBase) {
|
// public void initializeMacJwe(String signatureBase) {
|
||||||
List<String> parts = Lists.newArrayList(Splitter.on(".").split(signatureBase));
|
// List<String> parts = Lists.newArrayList(Splitter.on(".").split(signatureBase));
|
||||||
String header = parts.get(0);
|
// String header = parts.get(0);
|
||||||
JsonParser parser = new JsonParser();
|
// JsonParser parser = new JsonParser();
|
||||||
JsonObject object = (JsonObject) parser.parse(header);
|
// JsonObject object = (JsonObject) parser.parse(header);
|
||||||
|
//
|
||||||
try {
|
// try {
|
||||||
mac = Mac.getInstance(JwsAlgorithm.getByName(object.get("int").getAsString())
|
// mac = Mac.getInstance(JwsAlgorithm.getByName(object.get("int").getAsString())
|
||||||
.getStandardName());
|
// .getStandardName());
|
||||||
} catch (NoSuchAlgorithmException e) {
|
// } catch (NoSuchAlgorithmException e) {
|
||||||
// TODO Auto-generated catch block
|
// // TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
// e.printStackTrace();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -16,14 +16,12 @@
|
||||||
package org.mitre.jwt.signer.impl;
|
package org.mitre.jwt.signer.impl;
|
||||||
|
|
||||||
import org.mitre.jwt.signer.AbstractJwtSigner;
|
import org.mitre.jwt.signer.AbstractJwtSigner;
|
||||||
|
import org.mitre.jwt.signer.JwsAlgorithm;
|
||||||
|
|
||||||
public class PlaintextSigner extends AbstractJwtSigner {
|
public class PlaintextSigner extends AbstractJwtSigner {
|
||||||
|
|
||||||
// Todo: should this be a JwsAlgorithm?
|
|
||||||
public static final String PLAINTEXT = "none";
|
|
||||||
|
|
||||||
public PlaintextSigner() {
|
public PlaintextSigner() {
|
||||||
super(PLAINTEXT);
|
super(JwsAlgorithm.NONE.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -143,12 +143,18 @@ public class RsaSigner extends AbstractJwtSigner implements InitializingBean {
|
||||||
* Load the public and private keys from the keystore, identified with the configured alias and accessed with the configured password.
|
* Load the public and private keys from the keystore, identified with the configured alias and accessed with the configured password.
|
||||||
* @throws GeneralSecurityException
|
* @throws GeneralSecurityException
|
||||||
*/
|
*/
|
||||||
private void loadKeysFromKeystore() throws GeneralSecurityException {
|
private void loadKeysFromKeystore() {
|
||||||
Assert.notNull(keystore, "An keystore must be supplied");
|
Assert.notNull(keystore, "An keystore must be supplied");
|
||||||
Assert.notNull(alias, "A alias must be supplied");
|
Assert.notNull(alias, "A alias must be supplied");
|
||||||
Assert.notNull(password, "A password must be supplied");
|
Assert.notNull(password, "A password must be supplied");
|
||||||
|
|
||||||
KeyPair keyPair = keystore.getKeyPairForAlias(alias, password);
|
KeyPair keyPair = null;
|
||||||
|
try {
|
||||||
|
keyPair = keystore.getKeyPairForAlias(alias, password);
|
||||||
|
} catch (GeneralSecurityException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
Assert.notNull(keyPair, "Either alias and/or password is not correct for keystore");
|
Assert.notNull(keyPair, "Either alias and/or password is not correct for keystore");
|
||||||
|
|
||||||
|
@ -167,12 +173,8 @@ public class RsaSigner extends AbstractJwtSigner implements InitializingBean {
|
||||||
public String generateSignature(String signatureBase) throws NoSuchAlgorithmException {
|
public String generateSignature(String signatureBase) throws NoSuchAlgorithmException {
|
||||||
|
|
||||||
String sig = null;
|
String sig = null;
|
||||||
try {
|
|
||||||
afterPropertiesSet();
|
initializeSigner();
|
||||||
} catch (GeneralSecurityException e1) {
|
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e1.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
signer.initSign(privateKey);
|
signer.initSign(privateKey);
|
||||||
|
@ -226,7 +228,12 @@ public class RsaSigner extends AbstractJwtSigner implements InitializingBean {
|
||||||
this.privateKey = privateKey;
|
this.privateKey = privateKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initializeSigner() throws NoSuchAlgorithmException{
|
private void initializeSigner() throws NoSuchAlgorithmException{
|
||||||
|
if (this.keystore != null && this.alias != null && this.password != null) {
|
||||||
|
// if it looks like we're configured with a keystore, load it here
|
||||||
|
loadKeysFromKeystore();
|
||||||
|
}
|
||||||
|
|
||||||
signer = Signature.getInstance(JwsAlgorithm.getByName(super.getAlgorithm()).getStandardName());
|
signer = Signature.getInstance(JwsAlgorithm.getByName(super.getAlgorithm()).getStandardName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -135,6 +135,9 @@ public class JwtSigningAndValidationServiceDefault extends AbstractJwtSigningAnd
|
||||||
|
|
||||||
JwtSigner signer = getSigners().get(signerId);
|
JwtSigner signer = getSigners().get(signerId);
|
||||||
|
|
||||||
|
// set the signing algorithm in the JWT
|
||||||
|
jwt.getHeader().setAlgorithm(signer.getAlgorithm());
|
||||||
|
|
||||||
signer.sign(jwt);
|
signer.sign(jwt);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,4 +82,6 @@ public class RsaEncrypterDecrypterTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: add independent unit test for encryption and decryption
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue