/extern/spongycastle/pkix/src/main/java/org/spongycastle/pkcs/bc/BcPKCS12PBEOutputEncryptorBuilder.java

https://gitlab.com/vizilo/fdroidclient · Java · 77 lines · 62 code · 15 blank · 0 comment · 2 complexity · 1589e22bdc9012f54756bb892a52a77b MD5 · raw file

  1. package org.spongycastle.pkcs.bc;
  2. import java.io.OutputStream;
  3. import java.security.SecureRandom;
  4. import org.spongycastle.asn1.ASN1ObjectIdentifier;
  5. import org.spongycastle.asn1.pkcs.PKCS12PBEParams;
  6. import org.spongycastle.asn1.x509.AlgorithmIdentifier;
  7. import org.spongycastle.crypto.BlockCipher;
  8. import org.spongycastle.crypto.BufferedBlockCipher;
  9. import org.spongycastle.crypto.CipherParameters;
  10. import org.spongycastle.crypto.ExtendedDigest;
  11. import org.spongycastle.crypto.digests.SHA1Digest;
  12. import org.spongycastle.crypto.generators.PKCS12ParametersGenerator;
  13. import org.spongycastle.crypto.io.CipherOutputStream;
  14. import org.spongycastle.crypto.paddings.PKCS7Padding;
  15. import org.spongycastle.crypto.paddings.PaddedBufferedBlockCipher;
  16. import org.spongycastle.operator.GenericKey;
  17. import org.spongycastle.operator.OutputEncryptor;
  18. public class BcPKCS12PBEOutputEncryptorBuilder
  19. {
  20. private ExtendedDigest digest;
  21. private BufferedBlockCipher engine;
  22. private ASN1ObjectIdentifier algorithm;
  23. private SecureRandom random;
  24. public BcPKCS12PBEOutputEncryptorBuilder(ASN1ObjectIdentifier algorithm, BlockCipher engine)
  25. {
  26. this(algorithm, engine, new SHA1Digest());
  27. }
  28. public BcPKCS12PBEOutputEncryptorBuilder(ASN1ObjectIdentifier algorithm, BlockCipher engine, ExtendedDigest pbeDigest)
  29. {
  30. this.algorithm = algorithm;
  31. this.engine = new PaddedBufferedBlockCipher(engine, new PKCS7Padding());
  32. this.digest = pbeDigest;
  33. }
  34. public OutputEncryptor build(final char[] password)
  35. {
  36. if (random == null)
  37. {
  38. random = new SecureRandom();
  39. }
  40. final byte[] salt = new byte[20];
  41. final int iterationCount = 1024;
  42. random.nextBytes(salt);
  43. final PKCS12PBEParams pbeParams = new PKCS12PBEParams(salt, iterationCount);
  44. CipherParameters params = PKCS12PBEUtils.createCipherParameters(algorithm, digest, engine.getBlockSize(), pbeParams, password);
  45. engine.init(true, params);
  46. return new OutputEncryptor()
  47. {
  48. public AlgorithmIdentifier getAlgorithmIdentifier()
  49. {
  50. return new AlgorithmIdentifier(algorithm, pbeParams);
  51. }
  52. public OutputStream getOutputStream(OutputStream out)
  53. {
  54. return new CipherOutputStream(out, engine);
  55. }
  56. public GenericKey getKey()
  57. {
  58. return new GenericKey(new AlgorithmIdentifier(algorithm, pbeParams), PKCS12ParametersGenerator.PKCS12PasswordToBytes(password));
  59. }
  60. };
  61. }
  62. }