Java tutorial
/* * File: SecurityProvidersUtils.java * * Created on 09/09/2009 * * * Copyright 2006-2007 Felix Garcia Borrego (borrego at gmail.com) * * Licensed 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.viafirma.nucleo.inicio; import java.security.Security; import java.util.Arrays; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.impl.Log4JLogger; import org.apache.commons.logging.impl.Log4jFactory; import org.bouncycastle.asn1.DERObjectIdentifier; import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; import org.bouncycastle.jce.provider.BouncyCastleProvider; /** * Corrige problemas de compatibildad en JVM IBM. * java.security.NoSuchAlgorithmException: Algorithm HmacSHA2 not available * @author Felix Garcia Borrego (borrego at gmail.com) * @author Alexis Castilla Armero (pencerval at gmail.com) */ public class SecurityProvidersUtils { private static Log log = LogFactory.getLog(SecurityProvidersUtils.class); /** * Inicializa los proveedores criptograficos para corregir problemas con las * distintas maquinas virtuales */ public static void initProviders() { BouncyCastleProvider bc = new BouncyCastleProvider(); // Eliminamos el proveedor para evitar que se solapen si ya existia uno. Security.removeProvider(bc.getName()); Security.addProvider(bc); log.info("Lista de proveedores disponible:" + Arrays.asList(Security.getProviders())); addHMACAlgorithm(bc, "SHA2", "org.bouncycastle.jce.provider.JCEMac$SHA256", "org.bouncycastle.jce.provider.JCEKeyGenerator$HMACSHA256"); addHMACAlias(bc, "SHA2", PKCSObjectIdentifiers.id_hmacWithSHA256); Security.addProvider(bc); } /** * * Aade un algoritmo concreto al proveedor * * @param bc * @param algorithm * @param algorithmClassName * @param keyGeneratorClassName */ private static void addHMACAlgorithm(BouncyCastleProvider bc, String algorithm, String algorithmClassName, String keyGeneratorClassName) { String mainName = "HMAC" + algorithm; bc.put("Mac." + mainName, algorithmClassName); bc.put("Alg.Alias.Mac.HMAC-" + algorithm, mainName); bc.put("Alg.Alias.Mac.HMAC/" + algorithm, mainName); bc.put("KeyGenerator." + mainName, keyGeneratorClassName); bc.put("Alg.Alias.KeyGenerator.HMAC-" + algorithm, mainName); bc.put("Alg.Alias.KeyGenerator.HMAC/" + algorithm, mainName); } /** * * Asocia un algoritmo concreto a un alias * * @param bc * @param algorithm * @param oid */ private static void addHMACAlias(BouncyCastleProvider bc, String algorithm, DERObjectIdentifier oid) { String mainName = "HMAC" + algorithm; bc.put("Alg.Alias.Mac." + oid, mainName); bc.put("Alg.Alias.KeyGenerator." + oid, mainName); } }