Skip to content

Commit 05d7dda

Browse files
committed
tests: add unit tests for CoseEdDsaPublicKey functionality and validation
1 parent 5217bef commit 05d7dda

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
using System;
2+
using System.Buffers.Text;
3+
using System.Diagnostics;
4+
using System.Linq;
5+
using Xunit;
6+
using Xunit.Abstractions;
7+
using Xunit.Sdk;
8+
using Yubico.YubiKey.Fido2.Cbor;
9+
10+
namespace Yubico.YubiKey.Fido2.Cose
11+
{
12+
public class CoseEdDsaPublicKeyTests
13+
{
14+
private const string ValidEd25519PublicKeyPem = @"
15+
-----BEGIN PUBLIC KEY-----
16+
MCowBQYDK2VwAyEAGD3XimAmDGEYgGkS7BQIi6YJsm8bkJdo6rbHl2z4qao=
17+
-----END PUBLIC KEY-----
18+
";
19+
20+
private static byte[] ValidEd25519PublicKey => Convert
21+
.FromBase64String(ValidEd25519PublicKeyPem
22+
.Replace("-----BEGIN PUBLIC KEY-----", "")
23+
.Replace("-----END PUBLIC KEY-----", "")
24+
.Replace("\n", "")
25+
.Trim()
26+
).Skip(12).ToArray(); // Skip the COSE key header and extract the public key data
27+
28+
[Fact]
29+
public void CreateFromPublicKeyData_ValidKey_ReturnsExpectedKey()
30+
{
31+
// Act
32+
var coseKey = CoseEdDsaPublicKey.CreateFromPublicKeyData(ValidEd25519PublicKey);
33+
34+
// Assert
35+
Assert.Equal(CoseKeyType.Okp, coseKey.Type);
36+
Assert.Equal(CoseEcCurve.Ed25519, coseKey.Curve);
37+
Assert.Equal(CoseAlgorithmIdentifier.EdDSA, coseKey.Algorithm);
38+
Assert.True(coseKey.PublicKey.Span.SequenceEqual(ValidEd25519PublicKey));
39+
}
40+
41+
[Fact]
42+
public void CreateFromPublicKeyData_InvalidLength_ThrowsArgumentException()
43+
{
44+
// Arrange
45+
byte[] invalidKey = new byte[31]; // Wrong length
46+
47+
// Act & Assert
48+
Assert.Throws<ArgumentException>(() => CoseEdDsaPublicKey.CreateFromPublicKeyData(invalidKey));
49+
}
50+
51+
[Fact]
52+
public void EncodingRoundtrip_ReturnsMatchingKey()
53+
{
54+
// Arrange
55+
var originalKey = CoseEdDsaPublicKey.CreateFromPublicKeyData(ValidEd25519PublicKey);
56+
57+
// Act
58+
var encodedKey = originalKey.Encode();
59+
var decodedKey = CoseEdDsaPublicKey.CreateFromEncodedKey(encodedKey);
60+
61+
// Assert
62+
Assert.Equal(originalKey.Type, decodedKey.Type);
63+
Assert.Equal(originalKey.Curve, decodedKey.Curve);
64+
Assert.Equal(originalKey.Algorithm, decodedKey.Algorithm);
65+
Assert.True(originalKey.PublicKey.Span.SequenceEqual(decodedKey.PublicKey.Span));
66+
}
67+
68+
[Fact]
69+
public void Encode_ValidKey_ContainsRequiredMapEntries()
70+
{
71+
// Arrange
72+
var coseKey = CoseEdDsaPublicKey.CreateFromPublicKeyData(ValidEd25519PublicKey);
73+
74+
// Act
75+
var encoded = coseKey.Encode();
76+
var map = new CborMap<int>(encoded);
77+
78+
var keyType = map.ReadInt32(1);
79+
var algorithm = map.ReadInt32(3);
80+
var curve = map.ReadInt32(-1);
81+
var publicKey = map.ReadByteString(-2).Span;
82+
83+
// Assert
84+
Assert.Equal((int)CoseKeyType.Okp, keyType); // kty
85+
Assert.Equal((int)CoseAlgorithmIdentifier.EdDSA, algorithm); // alg
86+
Assert.Equal((int)CoseEcCurve.Ed25519, curve); // crv
87+
Assert.True(publicKey.SequenceEqual(ValidEd25519PublicKey)); // x
88+
}
89+
90+
[Fact]
91+
public void PublicKey_SetInvalidLength_ThrowsArgumentException()
92+
{
93+
// Arrange
94+
var coseKey = CoseEdDsaPublicKey.CreateFromPublicKeyData(ValidEd25519PublicKey);
95+
var invalidKey = new byte[31];
96+
97+
// Act & Assert
98+
Assert.Throws<ArgumentException>(() => coseKey.PublicKey = invalidKey);
99+
}
100+
101+
[Fact]
102+
public void Curve_SetInvalidCurve_ThrowsArgumentException()
103+
{
104+
// Arrange
105+
var coseKey = CoseEdDsaPublicKey.CreateFromPublicKeyData(ValidEd25519PublicKey);
106+
107+
// Act & Assert
108+
Assert.Throws<ArgumentException>(() => coseKey.Curve = CoseEcCurve.P256);
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)