Skip to content

Commit 225fcaf

Browse files
author
gefeili
committed
create generateHKDFBytes, isX25519. Refactor: makeKeyFromPassPhrase
1 parent 185ed7f commit 225fcaf

16 files changed

+53
-69
lines changed

pg/src/main/java/org/bouncycastle/bcpg/SymmetricKeyEncSessionPacket.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ else if (version == VERSION_5 || version == VERSION_6)
7171

7272
// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.3.2-3.5
7373
int s2kOctetCount = in.read();
74+
75+
//TODO: use this line to replace the following code?
76+
//s2k = new S2K(in);
7477
s2kBytes = new byte[s2kOctetCount];
7578
in.readFully(s2kBytes);
7679
try

pg/src/main/java/org/bouncycastle/openpgp/operator/PGPUtil.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ else if (s2k.getHashAlgorithm() != digestCalculator.getAlgorithm())
9494

9595
try
9696
{
97+
byte[] iv = s2k != null? s2k.getIV() : null;
9798
while (generatedBytes < keyBytes.length)
9899
{
99100
if (s2k != null)
@@ -103,8 +104,6 @@ else if (s2k.getHashAlgorithm() != digestCalculator.getAlgorithm())
103104
dOut.write(0);
104105
}
105106

106-
byte[] iv = s2k.getIV();
107-
108107
switch (s2k.getType())
109108
{
110109
case S2K.SIMPLE:

pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcAEADUtil.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,21 +91,25 @@ protected static long getChunkLength(int chunkSize)
9191
* @param salt salt
9292
* @param hkdfInfo HKDF info
9393
* @return message key and separate IV
94-
* @throws PGPException
9594
*/
9695
static byte[][] deriveMessageKeyAndIv(int aeadAlgo, int cipherAlgo, byte[] sessionKey, byte[] salt, byte[] hkdfInfo)
97-
throws PGPException
96+
{
97+
int keyLen = SymmetricKeyUtils.getKeyLengthInOctets(cipherAlgo);
98+
int ivLen = AEADUtils.getIVLength(aeadAlgo);
99+
byte[] messageKeyAndIv = generateHKDFBytes(sessionKey, salt, hkdfInfo, keyLen + ivLen - 8);
100+
101+
return new byte[][]{Arrays.copyOfRange(messageKeyAndIv, 0, keyLen), Arrays.copyOfRange(messageKeyAndIv, keyLen, keyLen + ivLen)};
102+
}
103+
104+
static byte[] generateHKDFBytes(byte[] sessionKey, byte[] salt, byte[] hkdfInfo, int len)
98105
{
99106
HKDFParameters hkdfParameters = new HKDFParameters(sessionKey, salt, hkdfInfo);
100107
HKDFBytesGenerator hkdfGen = new HKDFBytesGenerator(new SHA256Digest());
101108

102109
hkdfGen.init(hkdfParameters);
103-
int keyLen = SymmetricKeyUtils.getKeyLengthInOctets(cipherAlgo);
104-
int ivLen = AEADUtils.getIVLength(aeadAlgo);
105-
byte[] messageKeyAndIv = new byte[keyLen + ivLen - 8];
110+
byte[] messageKeyAndIv = new byte[len];
106111
hkdfGen.generateBytes(messageKeyAndIv, 0, messageKeyAndIv.length);
107-
108-
return new byte[][]{Arrays.copyOfRange(messageKeyAndIv, 0, keyLen), Arrays.copyOfRange(messageKeyAndIv, keyLen, keyLen + ivLen)};
112+
return messageKeyAndIv;
109113
}
110114

111115
public static AEADBlockCipher createAEADCipher(int encAlgorithm, int aeadAlgorithm)

pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPBEDataDecryptorFactory.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@
88
import org.bouncycastle.crypto.BlockCipher;
99
import org.bouncycastle.crypto.BufferedBlockCipher;
1010
import org.bouncycastle.crypto.InvalidCipherTextException;
11-
import org.bouncycastle.crypto.digests.SHA256Digest;
12-
import org.bouncycastle.crypto.engines.CamelliaEngine;
13-
import org.bouncycastle.crypto.generators.HKDFBytesGenerator;
1411
import org.bouncycastle.crypto.modes.AEADBlockCipher;
1512
import org.bouncycastle.crypto.params.AEADParameters;
16-
import org.bouncycastle.crypto.params.HKDFParameters;
1713
import org.bouncycastle.crypto.params.KeyParameter;
1814
import org.bouncycastle.openpgp.PGPException;
1915
import org.bouncycastle.openpgp.PGPSessionKey;
@@ -94,13 +90,10 @@ public byte[] recoverAEADEncryptedSessionData(SymmetricKeyEncSessionPacket keyDa
9490

9591
byte[] hkdfInfo = keyData.getAAData(); // Between v5 and v6, these bytes differ
9692
int kekLen = SymmetricKeyUtils.getKeyLengthInOctets(keyData.getEncAlgorithm());
97-
byte[] kek = new byte[kekLen];
9893

9994
// HKDF
10095
// secretKey := HKDF_sha256(ikm, hkdfInfo).generate()
101-
HKDFBytesGenerator hkdfGen = new HKDFBytesGenerator(new SHA256Digest());
102-
hkdfGen.init(new HKDFParameters(ikm, null, hkdfInfo));
103-
hkdfGen.generateBytes(kek, 0, kek.length);
96+
byte[] kek = BcAEADUtil.generateHKDFBytes(ikm, null, hkdfInfo, kekLen);
10497
final KeyParameter secretKey = new KeyParameter(kek);
10598

10699
// AEAD

pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPBEKeyEncryptionMethodGenerator.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,8 @@
77
import org.bouncycastle.crypto.BlockCipher;
88
import org.bouncycastle.crypto.BufferedBlockCipher;
99
import org.bouncycastle.crypto.InvalidCipherTextException;
10-
import org.bouncycastle.crypto.digests.SHA256Digest;
11-
import org.bouncycastle.crypto.engines.CamelliaEngine;
12-
import org.bouncycastle.crypto.generators.HKDFBytesGenerator;
1310
import org.bouncycastle.crypto.modes.AEADCipher;
1411
import org.bouncycastle.crypto.params.AEADParameters;
15-
import org.bouncycastle.crypto.params.HKDFParameters;
1612
import org.bouncycastle.crypto.params.KeyParameter;
1713
import org.bouncycastle.openpgp.PGPException;
1814
import org.bouncycastle.openpgp.operator.PBEKeyEncryptionMethodGenerator;
@@ -113,15 +109,8 @@ protected byte[] encryptSessionInfo(int encAlgorithm, byte[] key, byte[] session
113109
}
114110

115111
protected byte[] generateV6KEK(int kekAlgorithm, byte[] ikm, byte[] info)
116-
throws PGPException
117112
{
118-
HKDFBytesGenerator hkdf = new HKDFBytesGenerator(new SHA256Digest());
119-
hkdf.init(new HKDFParameters(ikm, null, info));
120-
121-
int kekLen = SymmetricKeyUtils.getKeyLengthInOctets(kekAlgorithm);
122-
byte[] kek = new byte[kekLen];
123-
hkdf.generateBytes(kek, 0, kek.length);
124-
return kek;
113+
return BcAEADUtil.generateHKDFBytes(ikm, null, info, SymmetricKeyUtils.getKeyLengthInOctets(kekAlgorithm));
125114
}
126115

127116
protected byte[] getEskAndTag(int kekAlgorithm, int aeadAlgorithm, byte[] sessionInfo, byte[] key, byte[] iv, byte[] info)

pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPGPKeyConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public AsymmetricKeyParameter getPrivateKey(PGPPrivateKey privKey)
122122
{
123123
ECDHPublicBCPGKey ecdhPub = (ECDHPublicBCPGKey)pubPk.getKey();
124124

125-
if (CryptlibObjectIdentifiers.curvey25519.equals(ecdhPub.getCurveOID()))
125+
if (BcUtil.isX25519(ecdhPub.getCurveOID()))
126126
{
127127
return PrivateKeyFactory.createKey(getPrivateKeyInfo(EdECObjectIdentifiers.id_X25519,
128128
Arrays.reverseInPlace(BigIntegers.asUnsignedByteArray(((ECSecretBCPGKey)privPk).getX()))));
@@ -209,7 +209,7 @@ public AsymmetricKeyParameter getPublicKey(PGPPublicKey publicKey)
209209
{
210210
ECDHPublicBCPGKey ecdhK = (ECDHPublicBCPGKey)publicPk.getKey();
211211

212-
if (ecdhK.getCurveOID().equals(CryptlibObjectIdentifiers.curvey25519))
212+
if (BcUtil.isX25519(ecdhK.getCurveOID()))
213213
{
214214
byte[] pEnc = BigIntegers.asUnsignedByteArray(ecdhK.getEncodedPoint());
215215
// skip the 0x40 header byte.

pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPublicKeyDataDecryptorFactory.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.io.IOException;
44
import java.math.BigInteger;
55

6-
import org.bouncycastle.asn1.cryptlib.CryptlibObjectIdentifiers;
76
import org.bouncycastle.bcpg.AEADEncDataPacket;
87
import org.bouncycastle.bcpg.ECDHPublicBCPGKey;
98
import org.bouncycastle.bcpg.HashAlgorithmTags;
@@ -110,7 +109,7 @@ else if (keyAlgorithm == PublicKeyAlgorithmTags.ECDH)
110109

111110
ECDHPublicBCPGKey ecPubKey = (ECDHPublicBCPGKey)pgpPrivKey.getPublicKeyPacket().getKey();
112111
// XDH
113-
if (ecPubKey.getCurveOID().equals(CryptlibObjectIdentifiers.curvey25519))
112+
if (BcUtil.isX25519(ecPubKey.getCurveOID()))
114113
{
115114
if (pEnc.length != 1 + X25519PublicKeyParameters.KEY_SIZE || 0x40 != pEnc[0])
116115
{

pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPublicKeyKeyEncryptionMethodGenerator.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.math.BigInteger;
55
import java.security.SecureRandom;
66

7-
import org.bouncycastle.asn1.cryptlib.CryptlibObjectIdentifiers;
87
import org.bouncycastle.bcpg.ECDHPublicBCPGKey;
98
import org.bouncycastle.bcpg.HashAlgorithmTags;
109
import org.bouncycastle.bcpg.PublicKeyAlgorithmTags;
@@ -13,7 +12,6 @@
1312
import org.bouncycastle.crypto.AsymmetricBlockCipher;
1413
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
1514
import org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator;
16-
import org.bouncycastle.crypto.InvalidCipherTextException;
1715
import org.bouncycastle.crypto.KeyGenerationParameters;
1816
import org.bouncycastle.crypto.RawAgreement;
1917
import org.bouncycastle.crypto.Wrapper;
@@ -32,7 +30,6 @@
3230
import org.bouncycastle.crypto.params.X25519PublicKeyParameters;
3331
import org.bouncycastle.crypto.params.X448KeyGenerationParameters;
3432
import org.bouncycastle.crypto.params.X448PublicKeyParameters;
35-
import org.bouncycastle.internal.asn1.edec.EdECObjectIdentifiers;
3633
import org.bouncycastle.openpgp.PGPException;
3734
import org.bouncycastle.openpgp.PGPPublicKey;
3835
import org.bouncycastle.openpgp.operator.PGPPad;
@@ -86,7 +83,7 @@ protected byte[] encryptSessionInfo(PGPPublicKey pubKey, byte[] sessionInfo)
8683
{
8784
ECDHPublicBCPGKey ecPubKey = (ECDHPublicBCPGKey)pubKeyPacket.getKey();
8885
byte[] userKeyingMaterial = RFC6637Utils.createUserKeyingMaterial(pubKeyPacket, new BcKeyFingerprintCalculator());
89-
if (ecPubKey.getCurveOID().equals(CryptlibObjectIdentifiers.curvey25519) || ecPubKey.getCurveOID().equals(EdECObjectIdentifiers.id_X25519))
86+
if (BcUtil.isX25519(ecPubKey.getCurveOID()))
9087
{
9188
AsymmetricCipherKeyPair ephKp = getAsymmetricCipherKeyPair(new X25519KeyPairGenerator(), new X25519KeyGenerationParameters(random));
9289

pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcUtil.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import java.math.BigInteger;
55

66
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
7+
import org.bouncycastle.asn1.cryptlib.CryptlibObjectIdentifiers;
8+
import org.bouncycastle.asn1.edec.EdECObjectIdentifiers;
79
import org.bouncycastle.asn1.x9.ECNamedCurveTable;
810
import org.bouncycastle.asn1.x9.X9ECParameters;
911
import org.bouncycastle.bcpg.AEADEncDataPacket;
@@ -125,4 +127,9 @@ static byte[] getSecret(RawAgreement agreement, AsymmetricKeyParameter privKey,
125127
agreement.calculateAgreement(ephPub, secret, 0);
126128
return secret;
127129
}
130+
131+
static boolean isX25519(ASN1ObjectIdentifier curveID)
132+
{
133+
return curveID.equals(CryptlibObjectIdentifiers.curvey25519) || curveID.equals(EdECObjectIdentifiers.id_X25519);
134+
}
128135
}

pg/src/main/java/org/bouncycastle/openpgp/operator/jcajce/JcaJcePGPUtil.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import javax.crypto.spec.SecretKeySpec;
1313

1414
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
15+
import org.bouncycastle.asn1.cryptlib.CryptlibObjectIdentifiers;
16+
import org.bouncycastle.asn1.edec.EdECObjectIdentifiers;
1517
import org.bouncycastle.asn1.x9.ECNamedCurveTable;
1618
import org.bouncycastle.asn1.x9.X9ECParameters;
1719
import org.bouncycastle.bcpg.PublicKeyPacket;
@@ -79,4 +81,9 @@ static Key getSecret(OperatorHelper helper, PublicKey cryptoPublicKey, String ke
7981
agreement.doPhase(cryptoPublicKey, true);
8082
return agreement.generateSecret(keyEncryptionOID);
8183
}
84+
85+
static boolean isX25519(ASN1ObjectIdentifier curveID)
86+
{
87+
return curveID.equals(CryptlibObjectIdentifiers.curvey25519) || curveID.equals(EdECObjectIdentifiers.id_X25519);
88+
}
8289
}

0 commit comments

Comments
 (0)