views:

177

answers:

1

The jar (bcprov-jdk16-145.jar) has been added to the project, Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()) has been added to the class, and BouncyCastleProvider.PROVIDER_NAME does return "BC" but AesFileIo.writeFile() still throws java.security.NoSuchProviderException No such provider: BC. Any ideas?

import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class AesFileIo {

    private static final String AES_ALGORITHM = "AES/CTR/NoPadding";
    private static final String PROVIDER = BouncyCastleProvider.PROVIDER_NAME;
    private static final byte[] AES_KEY_128 = { // Hard coded for now
        78, -90, 42, 70, -5, 20, -114, 103,
        -99, -25, 76, 95, -85, 94, 57, 54};
    private static final byte[] IV = { // Hard coded for now
        -85, -67, -5, 88, 28, 49, 49, 85,
        114, 83, -40, 119, -65, 91, 76, 108};
    private static final SecretKeySpec secretKeySpec =
            new SecretKeySpec(AES_KEY_128, "AES");
    private static final IvParameterSpec ivSpec = new IvParameterSpec(IV);

    public void AesFileIo() {
        Security.addProvider(new org.bouncycastle.jce.provider
                .BouncyCastleProvider());
    }

    public void writeFile(String fileName, String theFile) {
        try {
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);
            byte[] encrypted = cipher.doFinal(theFile.getBytes());
            ObjectOutputStream os = new ObjectOutputStream(
                new FileOutputStream(fileName));
            os.write(encrypted);
            os.flush();
            os.close();
        } catch (Exception e) {
            StackTraceElement se = new Exception().getStackTrace()[0];
            System.err.println(se.getFileName() + " " + se.getLineNumber()
                    + " " + e);
        }
    }
}
+1  A: 

Im not very familiar with the android sdk, but it seeems that the android-sdk comes with the BouncyCastle provider already added to the security.

What you will have to do in the PC environment is just add it manually,

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

if you have access to the policy file, just add an entry like:

security.provider.5=org.bouncycastle.jce.provider.BouncyCastleProvider 

Please notice the .5 it is equal to a sequential number of the already added providers.

Garis Suero
Does this need to be manually added to the PC environment for all PCs that run this application or can this be accomplished programmatically (bcprov-jdk16-145.jar has already been added to the project)?
JackN
You will need to code the `Security.addProvider` in your code, just to make sure it is loaded, and maybe you will need to add your `jar` to your project :)
Garis Suero
I have added `private static final String PROVIDER = BouncyCastleProvider.PROVIDER_NAME` (which resolves to "BC") as a field in the code, and I have added the jar to the project but continue to get `java.security.NoSuchProviderException: No such provider: BC`. I'll edit my original question by including the entire class.
JackN
Got it. Needed `Cipher cipher = Cipher.getInstance(AES_ALGORITHM);` rather than `Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);`. I suppose the `Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());` forces the "BC" and the `Cipher.getInstance(AES_ALGORITHM, PROVIDER);` is just not understood in this context.
JackN