package common;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;
import org.codehaus.jackson.map.ser.FilterProvider;
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
import statemachine.StateMachine;
import java.io.IOException;
import java.security.*;
/**
* Created by sctu on 11/30/14.
*/
public final class CryptoUtil {
private static final boolean NO_CRYPTO = false;
private static Logger LOG = LogManager.getLogger(CryptoUtil.class.getName());
private static final ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY);; // thread-safe
private static final String[] IGNORED_FIELD = {"messageSignature"};
private static final FilterProvider FIELD_FILTER = new SimpleFilterProvider()
.addFilter("pre-prepare filter",
SimpleBeanPropertyFilter.serializeAllExcept(IGNORED_FIELD));
public static final String ALGORITHM = "DSA";
public static final String PROVIDER = "SUN";
public static final String DIGEST_TYPE = "SHA-256";
public static final String KEY_PAIR_TYPE = "RSA";
public static final String PRNG_TYPE = "SHA1PRNG";
private CryptoUtil() {
// don't instantiate
}
private static byte[] computeSignature(byte[] byteRep, Signature sig) {
if (NO_CRYPTO) return new byte[10];
try {
sig.update(byteRep);
return sig.sign();
} catch (SignatureException e) {
e.printStackTrace();
System.exit(1);
return null;
}
}
public static Digest computeDigest(Object value) {
if (NO_CRYPTO) return new Digest(new byte[10]);
try {
ObjectWriter writer = mapper.writer();
MessageDigest digest = MessageDigest.getInstance(DIGEST_TYPE);
return new Digest(digest.digest(writer.writeValueAsString(value).getBytes()));
} catch (NoSuchAlgorithmException | IOException e) {
e.printStackTrace();
}
return null;
}
public static byte[] convertToJsonByteArray(Object message) {
ObjectWriter writer = mapper.writer(FIELD_FILTER);
try {
return writer.writeValueAsString(message).getBytes();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static MessageSignature computeMessageSignature(Object message, PrivateKey privateKey) {
Signature signature = null;
if (NO_CRYPTO) return new MessageSignature(new byte[10]);
try {
signature = Signature.getInstance(ALGORITHM, PROVIDER);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
try {
signature.initSign(privateKey);
} catch (InvalidKeyException e) {
e.printStackTrace();
}
ObjectWriter writer = mapper.writer(FIELD_FILTER);
return new MessageSignature(computeSignature(convertToJsonByteArray(message), signature));
}
public static KeyPair generateNewKeyPair() {
try {
KeyPairGenerator generator = KeyPairGenerator.getInstance(ALGORITHM, PROVIDER);
SecureRandom random = SecureRandom.getInstance(PRNG_TYPE, PROVIDER);
generator.initialize(1024, random);
return generator.generateKeyPair();
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
e.printStackTrace();
}
return null;
}
}