|
1 | 1 | package org.bouncycastle.openpgp.operator.jcajce; |
2 | 2 |
|
3 | | -import java.security.GeneralSecurityException; |
4 | 3 | import java.security.InvalidAlgorithmParameterException; |
5 | 4 | import java.security.InvalidKeyException; |
6 | 5 | import java.security.Provider; |
7 | 6 |
|
8 | 7 | import javax.crypto.BadPaddingException; |
9 | 8 | import javax.crypto.Cipher; |
10 | 9 | import javax.crypto.IllegalBlockSizeException; |
11 | | -import javax.crypto.SecretKey; |
12 | 10 | import javax.crypto.spec.IvParameterSpec; |
13 | | -import javax.crypto.spec.SecretKeySpec; |
14 | 11 |
|
15 | | -import org.bouncycastle.bcpg.SymmetricKeyUtils; |
16 | | -import org.bouncycastle.crypto.digests.SHA256Digest; |
17 | | -import org.bouncycastle.crypto.generators.HKDFBytesGenerator; |
18 | | -import org.bouncycastle.crypto.params.HKDFParameters; |
19 | 12 | import org.bouncycastle.jcajce.spec.AEADParameterSpec; |
20 | 13 | import org.bouncycastle.jcajce.util.DefaultJcaJceHelper; |
21 | 14 | import org.bouncycastle.jcajce.util.NamedJcaJceHelper; |
|
26 | 19 | import org.bouncycastle.openpgp.operator.PBESecretKeyDecryptor; |
27 | 20 | import org.bouncycastle.openpgp.operator.PGPDigestCalculatorProvider; |
28 | 21 | import org.bouncycastle.openpgp.operator.PGPSecretKeyDecryptorWithAAD; |
29 | | -import org.bouncycastle.util.Arrays; |
30 | 22 |
|
31 | 23 | public class JcePBEProtectionRemoverFactory |
32 | 24 | implements PBEProtectionRemoverFactory |
@@ -121,30 +113,7 @@ public byte[] recoverKeyData(int encAlgorithm, byte[] key, byte[] iv, byte[] aad |
121 | 113 | public byte[] recoverKeyData(int encAlgorithm, int aeadAlgorithm, byte[] s2kKey, byte[] iv, int packetTag, int keyVersion, byte[] keyData, byte[] pubkeyData) |
122 | 114 | throws PGPException |
123 | 115 | { |
124 | | - byte[] hkdfInfo = new byte[] { |
125 | | - (byte) (0xC0 | packetTag), (byte) keyVersion, (byte) encAlgorithm, (byte) aeadAlgorithm |
126 | | - }; |
127 | | - // TODO: Replace HDKF code with JCE based implementation |
128 | | - HKDFParameters hkdfParameters = new HKDFParameters(s2kKey, null, hkdfInfo); |
129 | | - HKDFBytesGenerator hkdfGen = new HKDFBytesGenerator(new SHA256Digest()); |
130 | | - hkdfGen.init(hkdfParameters); |
131 | | - byte[] key = new byte[SymmetricKeyUtils.getKeyLengthInOctets(encAlgorithm)]; |
132 | | - hkdfGen.generateBytes(key, 0, key.length); |
133 | | - |
134 | | - byte[] aad = Arrays.prepend(pubkeyData, (byte) (0xC0 | packetTag)); |
135 | | - |
136 | | - SecretKey secretKey = new SecretKeySpec(key, PGPUtil.getSymmetricCipherName(encAlgorithm)); |
137 | | - final Cipher c = aeadUtil.createAEADCipher(encAlgorithm, aeadAlgorithm); |
138 | | - try |
139 | | - { |
140 | | - JceAEADCipherUtil.setUpAeadCipher(c, secretKey, Cipher.DECRYPT_MODE, iv, 128, aad); |
141 | | - byte[] data = c.doFinal(keyData); |
142 | | - return data; |
143 | | - } |
144 | | - catch (GeneralSecurityException e) |
145 | | - { |
146 | | - throw new PGPException("Cannot extract AEAD protected secret key material", e); |
147 | | - } |
| 116 | + return JceAEADUtil.processAeadKeyData(aeadUtil, Cipher.DECRYPT_MODE, encAlgorithm, aeadAlgorithm, s2kKey, iv, packetTag, keyVersion, keyData, 0, keyData.length, pubkeyData); |
148 | 117 | } |
149 | 118 | }; |
150 | 119 | } |
@@ -184,30 +153,7 @@ public byte[] recoverKeyData(int encAlgorithm, byte[] key, byte[] iv, byte[] key |
184 | 153 | public byte[] recoverKeyData(int encAlgorithm, int aeadAlgorithm, byte[] s2kKey, byte[] iv, int packetTag, int keyVersion, byte[] keyData, byte[] pubkeyData) |
185 | 154 | throws PGPException |
186 | 155 | { |
187 | | - byte[] hkdfInfo = new byte[] { |
188 | | - (byte) (0xC0 | packetTag), (byte) keyVersion, (byte) encAlgorithm, (byte) aeadAlgorithm |
189 | | - }; |
190 | | - // TODO: Replace HDKF code with JCE based implementation |
191 | | - HKDFParameters hkdfParameters = new HKDFParameters(s2kKey, null, hkdfInfo); |
192 | | - HKDFBytesGenerator hkdfGen = new HKDFBytesGenerator(new SHA256Digest()); |
193 | | - hkdfGen.init(hkdfParameters); |
194 | | - byte[] key = new byte[SymmetricKeyUtils.getKeyLengthInOctets(encAlgorithm)]; |
195 | | - hkdfGen.generateBytes(key, 0, key.length); |
196 | | - |
197 | | - byte[] aad = Arrays.prepend(pubkeyData, (byte) (0xC0 | packetTag)); |
198 | | - |
199 | | - SecretKey secretKey = new SecretKeySpec(key, PGPUtil.getSymmetricCipherName(encAlgorithm)); |
200 | | - final Cipher c = aeadUtil.createAEADCipher(encAlgorithm, aeadAlgorithm); |
201 | | - try |
202 | | - { |
203 | | - JceAEADCipherUtil.setUpAeadCipher(c, secretKey, Cipher.DECRYPT_MODE, iv, 128, aad); |
204 | | - byte[] data = c.doFinal(keyData); |
205 | | - return data; |
206 | | - } |
207 | | - catch (GeneralSecurityException e) |
208 | | - { |
209 | | - throw new PGPException("Cannot extract AEAD protected secret key material", e); |
210 | | - } |
| 156 | + return JceAEADUtil.processAeadKeyData(aeadUtil, Cipher.DECRYPT_MODE, encAlgorithm, aeadAlgorithm, s2kKey, iv, packetTag, keyVersion, keyData, 0, keyData.length, pubkeyData); |
211 | 157 | } |
212 | 158 | }; |
213 | 159 |
|
|
0 commit comments