2017-05-02 2 views
1

J'essaie de créer un message crypté CMS Enveloped à l'aide de BouncyCastle FIPS 1.0.0 for Java. Je reçois l'erreur suivante indiquant qu'il essaie d'utiliser AES pour la génération de nombres aléatoires (qui n'est pas un algorithme approuvé pour le mode FIPS).FipsUnapprovedOperationError lors de la création d'un message CMS avec BouncyCastle

Exception in thread "main" org.bouncycastle.crypto.fips.FipsUnapprovedOperationError: Attempt to create key with unapproved RNG: AES 
    at org.bouncycastle.crypto.fips.Utils.validateRandom(Unknown Source) 
    at org.bouncycastle.crypto.fips.Utils.validateKeyGenRandom(Unknown Source) 
    at org.bouncycastle.crypto.fips.FipsAES$KeyGenerator.<init>(Unknown Source) 
    at org.bouncycastle.crypto.fips.FipsAES$KeyGenerator.<init>(Unknown Source) 
    at org.bouncycastle.jcajce.provider.ProvAES$39$1.createInstance(Unknown Source) 
    at org.bouncycastle.jcajce.provider.BaseKeyGenerator.engineInit(Unknown Source) 
    at javax.crypto.KeyGenerator.init(KeyGenerator.java:510) 
    at org.bouncycastle.cms.jcajce.JceCMSContentEncryptorBuilder$CMSOutputEncryptor.<init>(Unknown Source) 
    at org.bouncycastle.cms.jcajce.JceCMSContentEncryptorBuilder.build(Unknown Source) 

D'abord, je vous assurer BouncyCastle est chargé en tant que fournisseur et JCE alors je vous assurer qu'il est en cours d'exécution dans FIPS approuvé seule.

if(!CryptoServicesRegistrar.isInApprovedOnlyMode()) { 
    CryptoServicesRegistrar.setApprovedOnlyMode(true); 
} 

Après que je suis fondamentalement juste en utilisant le code comme l'exemple dans le BC FIPS in 100 mini-book. Le code que j'ai jusqu'à présent est la suivante:

private static final String FIPS_PROVIDER = "BCFIPS"; 

public byte[] encrypt(X509Certificate cert, byte[] dataToEncrypt) throws CertificateEncodingException, CMSException, IOException, InvalidAlgorithmParameterException { 
    CMSEnvelopedDataGenerator envelopedGen = new CMSEnvelopedDataGenerator(); 
    JcaAlgorithmParametersConverter paramsConverter = new JcaAlgorithmParametersConverter(); 

    AlgorithmIdentifier algId = paramsConverter.getAlgorithmIdentifier(PKCSObjectIdentifiers.id_RSAES_OAEP, OAEPParameterSpec.DEFAULT); 
    JceKeyTransRecipientInfoGenerator recipientInfo = new JceKeyTransRecipientInfoGenerator(cert, algId); 
    recipientInfo.setProvider(FIPS_PROVIDER); 
    envelopedGen.addRecipientInfoGenerator(recipientInfo); 

    CMSProcessableByteArray processableArray = new CMSProcessableByteArray(dataToEncrypt); 
    JceCMSContentEncryptorBuilder encryptorBuilder = new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES256_CBC); 
    encryptorBuilder.setProvider(FIPS_PROVIDER); 
    OutputEncryptor outputEncryptor = encryptorBuilder.build(); 

    return envelopedGen.generate(processableArray, outputEncryptor).getEncoded(); 
} 

Si je ne mets pas BouncyCastle dans les FIPS approuvés uniquement en mode alors ce code fonctionne très bien, mais je dois être en mesure de fonctionner dans ce mode. Existe-t-il un moyen de dire à CMSOutputEncryptor d'utiliser un algorithme RNG différent?

Répondre

3

Avez-vous essayé de configurer un SecureRandom approuvé par FIPS?

CryptoServicesRegistrar.setSecureRandom(
    new FipsDRBG.Builder(
     new BasicEntropySourceProvider(new SecureRandom(), true)) 
    .build(FipsDRBG.SHA512_HMAC, null, false) 
); 

puis sur votre constructeur (et partout où vous pourriez en avoir besoin):

encryptorBuilder.setSecureRandom(CryptoServicesRegistrar.getSecureRandom()); 
+0

Merci! L'ajout de l'appel 'encryptorBuilder.setSecureRandom()' a fonctionné pour moi. J'avais déjà fait l'appel 'CryptoServicesRegistrar.setSecureRandom()' pour y définir ma propre instance. J'ai mal compris ce que cette fonction a fait et en supposant qu'il définisse un défaut global ... – Michael