Skip to content

Commit 011e041

Browse files
committed
Refactor ECDHKEKGenerator
1 parent 119071a commit 011e041

3 files changed

Lines changed: 22 additions & 9 deletions

File tree

core/src/main/java/org/bouncycastle/crypto/agreement/kdf/ECDHKEKGenerator.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
import java.io.IOException;
44

5-
import org.bouncycastle.asn1.ASN1EncodableVector;
65
import org.bouncycastle.asn1.ASN1Encoding;
76
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
7+
import org.bouncycastle.asn1.ASN1OctetString;
8+
import org.bouncycastle.asn1.ASN1Sequence;
89
import org.bouncycastle.asn1.DERNull;
910
import org.bouncycastle.asn1.DEROctetString;
1011
import org.bouncycastle.asn1.DERSequence;
@@ -58,16 +59,18 @@ public int generateBytes(byte[] out, int outOff, int len)
5859
throw new DataLengthException("output buffer too small");
5960
}
6061

61-
// TODO Create an ASN.1 class for this (RFC3278)
62-
// ECC-CMS-SharedInfo
63-
ASN1EncodableVector v = new ASN1EncodableVector();
62+
AlgorithmIdentifier keyInfo = new AlgorithmIdentifier(algorithm, DERNull.INSTANCE);
63+
ASN1OctetString suppPubInfo = DEROctetString.withContents(Pack.intToBigEndian(keySize));
6464

65-
v.add(new AlgorithmIdentifier(algorithm, DERNull.INSTANCE));
66-
v.add(new DERTaggedObject(true, 2, new DEROctetString(Pack.intToBigEndian(keySize))));
65+
// TODO org.bouncycastle.asn1.cms.ecc.ECCCMSSharedInfo exists, but is located in the 'util' jar.
66+
// TODO Should the optional DHKDFParameters.getExtraInfo be used for ECCCMSSharedInfo.entityUInfo?
67+
ASN1Sequence eccCMSSharedInfo = new DERSequence(keyInfo, new DERTaggedObject(2, suppPubInfo));
6768

6869
try
6970
{
70-
kdf.init(new KDFParameters(z, new DERSequence(v).getEncoded(ASN1Encoding.DER)));
71+
byte[] iv = eccCMSSharedInfo.getEncoded(ASN1Encoding.DER);
72+
73+
kdf.init(new KDFParameters(z, iv));
7174
}
7275
catch (IOException e)
7376
{

core/src/test/java/org/bouncycastle/crypto/test/DHKEKGeneratorTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.bouncycastle.crypto.test;
22

3+
import java.security.SecureRandom;
4+
35
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
46
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
57
import org.bouncycastle.crypto.DerivationFunction;
@@ -16,6 +18,8 @@
1618
public class DHKEKGeneratorTest
1719
extends SimpleTest
1820
{
21+
private static final SecureRandom RANDOM = new SecureRandom();
22+
1923
private byte[] seed1 = Hex.decode("000102030405060708090a0b0c0d0e0f10111213");
2024
private ASN1ObjectIdentifier alg1 = PKCSObjectIdentifiers.id_alg_CMS3DESwrap;
2125
private byte[] result1 = Hex.decode("a09661392376f7044d9052a397883246b67f5f1ef63eb5fb");
@@ -45,7 +49,8 @@ private void checkMask(
4549
DerivationParameters params,
4650
byte[] result)
4751
{
48-
byte[] data = new byte[result.length];
52+
byte[] data = new byte[result.length];
53+
RANDOM.nextBytes(data);
4954

5055
kdf.init(params);
5156

core/src/test/java/org/bouncycastle/crypto/test/ECDHKEKGeneratorTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.bouncycastle.crypto.test;
22

3+
import java.security.SecureRandom;
4+
35
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
46
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
57
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
@@ -17,6 +19,8 @@
1719
public class ECDHKEKGeneratorTest
1820
extends SimpleTest
1921
{
22+
private static final SecureRandom RANDOM = new SecureRandom();
23+
2024
private byte[] seed1 = Hex.decode("db4a8daba1f98791d54e940175dd1a5f3a0826a1066aa9b668d4dc1e1e0790158dcad1533c03b44214d1b61fefa8b579");
2125
private ASN1ObjectIdentifier alg1 = NISTObjectIdentifiers.id_aes256_wrap;
2226
private byte[] result1 = Hex.decode("8ecc6d85caf25eaba823a7d620d4ab0d33e4c645f2");
@@ -46,7 +50,8 @@ private void checkMask(
4650
DerivationParameters params,
4751
byte[] result)
4852
{
49-
byte[] data = new byte[result.length];
53+
byte[] data = new byte[result.length];
54+
RANDOM.nextBytes(data);
5055

5156
kdf.init(params);
5257

0 commit comments

Comments
 (0)