Skip to content

Commit e426906

Browse files
committed
tests: add proper ECDH tests
1 parent b37d338 commit e426906

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

Yubico.YubiKey/tests/integration/Yubico/YubiKey/Piv/KeyAgreeTests.cs

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
// limitations under the License.
1414

1515
using System;
16-
using System.IO;
1716
using System.Linq;
1817
using System.Security.Cryptography;
1918
using Xunit;
@@ -40,45 +39,48 @@ public void KeyAgree_Succeeds(
4039
var (testPublicKey, testPrivateKey) = TestKeys.GetKeyPair(keyType);
4140
var testDevice = IntegrationTestDeviceEnumeration.GetTestDevice(testDeviceType);
4241
var privateKeyParameters = AsnPrivateKeyReader.CreateKeyParameters(testPrivateKey.EncodedKey);
43-
IPublicKeyParameters publicKeyPeer;
42+
IPublicKeyParameters peerPublicKey;
43+
var peerPrivateKeyEcParameters = new ECParameters();
44+
4445
if (keyType is KeyType.X25519)
4546
{
4647
var testSelectedPublicKeyPeer = TestKeys.GetTestPublicKey(keyType, 2);
47-
publicKeyPeer = AsnPublicKeyReader.CreateKeyParameters(testSelectedPublicKeyPeer.EncodedKey);
48+
peerPublicKey = Curve25519PublicKeyParameters.CreateFromPkcs8(testSelectedPublicKeyPeer.EncodedKey);
4849
}
4950
else
5051
{
51-
var oid = keyType.ToCurveOid()!;
52-
var curve = ECCurve.CreateFromValue(oid);
53-
publicKeyPeer = ECPublicKeyParameters.CreateFromParameters(ECDsa.Create(curve).ExportParameters(false));
52+
var curve = ECCurve.CreateFromValue(keyType.ToCurveOid()!);
53+
var ecDsa = ECDsa.Create(curve);
54+
peerPrivateKeyEcParameters = ecDsa.ExportParameters(true);
55+
var peerPublicKeyEcParameters = ecDsa.ExportParameters(false);
56+
peerPublicKey = ECPublicKeyParameters.CreateFromParameters(peerPublicKeyEcParameters);
5457
}
5558

59+
// -> Import Private Key
5660
using var pivSession = GetSession(testDevice);
5761
pivSession.ImportPrivateKey(0x85, privateKeyParameters, pinPolicy, PivTouchPolicy.Never);
58-
var metadata = pivSession.GetMetadata(0x85);
59-
62+
6063
// Act
61-
var sharedSecret = pivSession.KeyAgree(0x85, publicKeyPeer);
64+
var yubikeySecret = pivSession.KeyAgree(0x85, peerPublicKey);
6265

6366
// Assert
64-
var publicPoint = metadata.PublicKeyParameters switch
65-
{
66-
ECPublicKeyParameters ecDsa => ecDsa.PublicPoint.ToArray(),
67-
Curve25519PublicKeyParameters edDsa => edDsa.PublicPoint.ToArray(),
68-
_ => throw new ArgumentException("Invalid public key type")
69-
};
70-
71-
Assert.Equal(testPublicKey.GetPublicPoint(), publicPoint);
7267
if (keyType is KeyType.X25519)
7368
{
69+
// We have pre-generated shared secrets for X25519
7470
const string keyAgreeFilename = "x25519_private_and_public2_shared_secret.bin";
7571
var expectedSharedSecret = TestCrypto.ReadTestData(keyAgreeFilename);
76-
Assert.Equal(expectedSharedSecret, sharedSecret);
72+
Assert.Equal(expectedSharedSecret, yubikeySecret);
7773
}
7874
else
7975
{
80-
var expectedSecretLength = publicKeyPeer.KeyDefinition.LengthInBytes;
81-
Assert.Equal(expectedSecretLength, sharedSecret.Length);
76+
// Perform ECDH using generated key and the imported YK public key
77+
using var peerEcdh = ECDiffieHellman.Create(peerPrivateKeyEcParameters);
78+
var yubiKeyParametersPublic = testPublicKey.AsECDsa().ExportParameters(false);
79+
using var yubikeyEcdh = ECDiffieHellman.Create(yubiKeyParametersPublic);
80+
var peerSecret = peerEcdh.DeriveRawSecretAgreement(yubikeyEcdh.PublicKey);
81+
82+
Assert.Equal(yubikeySecret.Length, peerSecret.Length);
83+
Assert.Equal(yubikeySecret, peerSecret);
8284
}
8385
}
8486

0 commit comments

Comments
 (0)