summaryrefslogtreecommitdiffstats
path: root/base/kra/src/com
diff options
context:
space:
mode:
authorFraser Tweedale <ftweedal@redhat.com>2017-04-06 13:27:56 +1000
committerMatthew Harmsen <mharmsen@redhat.com>2017-04-29 23:50:07 -0600
commit012718d24aff8c37713f42f2ca69c5bd7aec97df (patch)
tree378cfb8e282b99b50b02c72a5a62fe66ed805476 /base/kra/src/com
parent118f648961e502f55d6997f59f6cf8f355218da5 (diff)
downloadpki-012718d24aff8c37713f42f2ca69c5bd7aec97df.tar.gz
pki-012718d24aff8c37713f42f2ca69c5bd7aec97df.tar.xz
pki-012718d24aff8c37713f42f2ca69c5bd7aec97df.zip
KRA: use AES in PKCS #12 recovery for wrapped keys
The KRA has two private key recovery code paths: one dealing with keys wrapped to the storage key, and one dealing with symmetrically encrypted keys. Each has a separate function for constructing a PKCS #12 file for the recovered key. This commit updates the PKCS #12 generation for wrapped keys to use AES encryption. The JSS PBE facility is not expressive enough to handle PBES2 encryption, which is necessary for many algorithms including AES, so we now use CryptoStore.getEncryptedPrivateKeyInfo. Part of: https://pagure.io/dogtagpki/issue/2610 Change-Id: Iba67f15642338316e4a6d09f78504327e8853b85 (cherry picked from commit 8e663b6270d9a9409a04bfcb445318a6d5622b52)
Diffstat (limited to 'base/kra/src/com')
-rw-r--r--base/kra/src/com/netscape/kra/RecoveryService.java24
1 files changed, 13 insertions, 11 deletions
diff --git a/base/kra/src/com/netscape/kra/RecoveryService.java b/base/kra/src/com/netscape/kra/RecoveryService.java
index 5609b190e..eee800aa8 100644
--- a/base/kra/src/com/netscape/kra/RecoveryService.java
+++ b/base/kra/src/com/netscape/kra/RecoveryService.java
@@ -31,6 +31,7 @@ import java.util.Random;
import org.mozilla.jss.CryptoManager;
import org.mozilla.jss.asn1.ASN1Util;
+import org.mozilla.jss.asn1.ANY;
import org.mozilla.jss.asn1.ASN1Value;
import org.mozilla.jss.asn1.BMPString;
import org.mozilla.jss.asn1.OCTET_STRING;
@@ -38,6 +39,7 @@ import org.mozilla.jss.asn1.SEQUENCE;
import org.mozilla.jss.asn1.SET;
import org.mozilla.jss.crypto.CryptoToken;
import org.mozilla.jss.crypto.PBEAlgorithm;
+import org.mozilla.jss.crypto.EncryptionAlgorithm;
import org.mozilla.jss.crypto.PrivateKey;
import org.mozilla.jss.pkcs12.AuthenticatedSafes;
import org.mozilla.jss.pkcs12.CertBag;
@@ -484,20 +486,20 @@ public class RecoveryService implements IService {
SEQUENCE safeContents = new SEQUENCE();
PasswordConverter passConverter = new
PasswordConverter();
- Random ran = new SecureRandom();
- byte[] salt = new byte[20];
- ran.nextBytes(salt);
- ASN1Value key = EncryptedPrivateKeyInfo.createPBE(
- PBEAlgorithm.PBE_SHA1_DES3_CBC,
- pass, salt, 1, passConverter, priKey, ct);
- CMS.debug("RecoverService: createPFX() EncryptedPrivateKeyInfo.createPBE() returned");
- if (key == null) {
- CMS.debug("RecoverService: createPFX() key null");
- throw new EBaseException("EncryptedPrivateKeyInfo.createPBE() failed");
+ byte[] epkiBytes = ct.getCryptoStore().getEncryptedPrivateKeyInfo(
+ /* NSS has a bug that causes any AES CBC encryption
+ * to use AES-256, but AlgorithmID contains chosen
+ * alg. To avoid mismatch, use AES_256_CBC. */
+ passConverter, pass, EncryptionAlgorithm.AES_256_CBC, 0, priKey);
+ CMS.debug("RecoverService: createPFX() getEncryptedPrivateKeyInfo() returned");
+ if (epkiBytes == null) {
+ CMS.debug("RecoverService: createPFX() epkiBytes null");
+ throw new EBaseException("getEncryptedPrivateKeyInfo returned null");
} else {
- CMS.debug("RecoverService: createPFX() key not null");
+ CMS.debug("RecoverService: createPFX() epkiBytes not null");
}
+ ASN1Value key = new ANY(epkiBytes);
SET keyAttrs = createBagAttrs(
x509cert.getSubjectDN().toString(),