blob: 4efa54abe0f8e103847ac4c706c47e8f43bf0996 [file] [log] [blame]
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.encryption.internal;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import org.jclouds.javax.annotation.Nullable;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.crypto.Crypto;
/**
*
* @author Adrian Cole
*/
@Singleton
public class JCECrypto implements Crypto {
private final KeyPairGenerator rsaKeyPairGenerator;
private final KeyFactory rsaKeyFactory;
private final CertificateFactory certFactory;
private final Provider provider;
@Inject
public JCECrypto() throws NoSuchAlgorithmException, CertificateException {
this(null);
}
public JCECrypto(@Nullable Provider provider) throws NoSuchAlgorithmException, CertificateException {
this.rsaKeyPairGenerator = provider == null ? KeyPairGenerator.getInstance("RSA") : KeyPairGenerator.getInstance(
"RSA", provider);
this.rsaKeyFactory = provider == null ? KeyFactory.getInstance("RSA") : KeyFactory.getInstance("RSA", provider);
this.certFactory = provider == null ? CertificateFactory.getInstance("X.509") : CertificateFactory.getInstance(
"X.509", provider);
this.provider = provider;
}
@Override
public Mac hmac(String algorithm, byte[] key) throws NoSuchAlgorithmException, InvalidKeyException {
Mac mac = null;
if(provider != null) {
try {
mac = Mac.getInstance(algorithm, provider);
} catch(Exception e) {
//Provider does not function.
//Do nothing and let it fallback to the default way.
}
}
if(mac == null) {
mac = Mac.getInstance(algorithm);
}
SecretKeySpec signingKey = new SecretKeySpec(key, algorithm);
mac.init(signingKey);
return mac;
}
@Override
public MessageDigest digest(String algorithm) throws NoSuchAlgorithmException {
return provider == null ? MessageDigest.getInstance(algorithm) : MessageDigest.getInstance(algorithm, provider);
}
public final static String MD5 = "MD5";
public final static String SHA1 = "SHA1";
public final static String SHA256 = "SHA-256";
public final static String SHA512 = "SHA-512";
@Override
public MessageDigest md5() {
try {
return digest(MD5);
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("MD5 must be supported", e);
}
}
@Override
public MessageDigest sha1() {
try {
return digest(SHA1);
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("MD5 must be supported", e);
}
}
@Override
public MessageDigest sha256() {
try {
return digest(SHA256);
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException(SHA256 + " must be supported", e);
}
}
@Override
public MessageDigest sha512() {
try {
return digest(SHA512);
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException(SHA512 + " must be supported", e);
}
}
public final static String HmacSHA256 = "HmacSHA256";
public final static String HmacSHA1 = "HmacSHA1";
@Override
public Mac hmacSHA1(byte[] key) throws InvalidKeyException {
try {
return hmac(HmacSHA1, key);
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("HmacSHA1 must be supported", e);
}
}
@Override
public Mac hmacSHA256(byte[] key) throws InvalidKeyException {
try {
return hmac(HmacSHA256, key);
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("HmacSHA256 must be supported", e);
}
}
@Override
public CertificateFactory certFactory() {
return certFactory;
}
@Override
public KeyFactory rsaKeyFactory() {
return rsaKeyFactory;
}
@Override
public KeyPairGenerator rsaKeyPairGenerator() {
return rsaKeyPairGenerator;
}
}