|
2 | 2 | using System.Collections.Generic; |
3 | 3 | using System.Linq; |
4 | 4 | using System.Net; |
| 5 | +using System.Security.Cryptography; |
| 6 | +using System.Security.Cryptography.X509Certificates; |
5 | 7 | using System.Text; |
6 | 8 | using DnsClient.Internal; |
7 | 9 | using DnsClient.Protocol; |
8 | 10 | using Xunit; |
| 11 | +using Xunit.Abstractions; |
9 | 12 |
|
10 | 13 | namespace DnsClient.Tests |
11 | 14 | { |
@@ -301,6 +304,66 @@ public void DnsRecordFactory_NAPTRRecord() |
301 | 304 | Assert.Equal("", result.RegularExpression); |
302 | 305 | } |
303 | 306 |
|
| 307 | + [Fact] |
| 308 | + public void DnsRecordFactory_CertRecord() |
| 309 | + { |
| 310 | + var expectedPublicKey = @"-----BEGIN CERTIFICATE----- |
| 311 | +MIIEMzCCAxugAwIBAgIBAzANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDDBtkY2R0 |
| 312 | +MzEuaGVhbHRoaXQuZ292X2NhX3Jvb3QwHhcNMjIwMjA0MTUzNzUxWhcNMzIwMjA1 |
| 313 | +MDE0OTUxWjBBMS0wKwYJKoZIhvcNAQkBFh5kMUBkb21haW4xLmRjZHQzMS5oZWFs |
| 314 | +dGhpdC5nb3YxEDAOBgNVBAMMB0QxX3ZhbEEwggEiMA0GCSqGSIb3DQEBAQUAA4IB |
| 315 | +DwAwggEKAoIBAQDHPWJogAq6zCU1zU6ar4GAvRb6bjCTSzm19E98E3dCCG8ZSgWH |
| 316 | +yZh3w6M/btu7qMDStrpzMGD1H5TiqS/mEFNNcJP2r8C6T8RKV2xEqhsJlwOoguzJ |
| 317 | +4MyePoVYG84/gm5v03BCp91uoz4O1WFrppu439njipv8wUwsvf6ukidhAgP9mEoN |
| 318 | +w1sCB1U9zOtpPmbRczMrYyDBWqFaxiaDD9xYaYqal7Ph7adKohBDZA1P7H/Jkxdf |
| 319 | +uCwULVDn+bcHD3eW9NToeZ7gc0CV75kVnI/7WbJ6mfx72zOIzEm1AFed36yuEpal |
| 320 | +VjCzhJO4ZmmfJxfXr36UICKHQIM/xwSEXqJtAgMBAAGjggFPMIIBSzAfBgNVHSME |
| 321 | +GDAWgBSIM9vz74ArTwMFMk3q5ShNOYQhMjApBgNVHQ4EIgQg1WLu98WJoAtR1X7K |
| 322 | +ZiHWfIcONgrBBtzuLgNWkQklJugwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCBaAw |
| 323 | +KQYDVR0RBCIwIIEeZDFAZG9tYWluMS5kY2R0MzEuaGVhbHRoaXQuZ292MFUGA1Ud |
| 324 | +HwROMEwwSqBIoEaGRGh0dHA6Ly9wa2kuZGNkdDMxLmhlYWx0aGl0LmdvdjoxMDA4 |
| 325 | +MC9kY2R0MzEuaGVhbHRoaXQuZ292X2NhX3Jvb3QuY3JsMGAGCCsGAQUFBwEBBFQw |
| 326 | +UjBQBggrBgEFBQcwAoZEaHR0cDovL3BraS5kY2R0MzEuaGVhbHRoaXQuZ292OjEw |
| 327 | +MDgwL2RjZHQzMS5oZWFsdGhpdC5nb3ZfY2Ffcm9vdC5jZXIwDQYJKoZIhvcNAQEL |
| 328 | +BQADggEBAGqMC2kEA6acNgmUueCbPuLj7uePRGaRk6x0rSEY6mTGoBXci+s9EXbx |
| 329 | +a7d/glNFNgQC9KP35esriqSfUn2bsDmtlTs+A79+ldMRH5SWvEmI5f7s9SitLIYR |
| 330 | +uRBLE693R7/1DjyUrEFxpdL16O8Y2kIKO9S8lrscNBOg7hW0RKYb4VBnlsNw3jk2 |
| 331 | +rXyGcFZ63D8VsdgUJTh2BKhpiY37gd/+ILUcylpmC5Uf3yWM2wYRMS6IVACllv+U |
| 332 | +PoPWSE2fsrMpfCtDFeUL71gn8g6TYIctVHTn4OeuhHQ6Yt21rgQnlpDFVt0p9sGl |
| 333 | +H+L10KwE7wqqmkxwfib5kwgNyrlXtx0= |
| 334 | +-----END CERTIFICATE-----"; |
| 335 | + |
| 336 | + var expectedBytes = Encoding.UTF8.GetBytes(expectedPublicKey); |
| 337 | + var name = DnsString.Parse("example.com"); |
| 338 | + using var memory = new PooledBytes(expectedBytes.Length); |
| 339 | + |
| 340 | + var writer = new DnsDatagramWriter(new ArraySegment<byte>(memory.Buffer)); |
| 341 | + writer.WriteInt16NetworkOrder((short)CertificateType.PKIX); // 2 bytes |
| 342 | + writer.WriteInt16NetworkOrder((short)27891); // 2 bytes |
| 343 | + writer.WriteByte((byte)DnsSecurityAlgorithm.RSASHA256); // 1 byte |
| 344 | + writer.WriteBytes(expectedBytes, expectedBytes.Length); |
| 345 | + |
| 346 | + var factory = GetFactory(writer.Data); |
| 347 | + |
| 348 | + var info = new ResourceRecordInfo(name, ResourceRecordType.CERT, QueryClass.IN, 0, writer.Data.Count); |
| 349 | + |
| 350 | + var result = factory.GetRecord(info) as CertRecord; |
| 351 | + Assert.NotNull(result); |
| 352 | + Assert.Equal(27891, result.KeyTag); |
| 353 | + Assert.Equal(CertificateType.PKIX, result.CertType); |
| 354 | + Assert.Equal(DnsSecurityAlgorithm.RSASHA256, result.Algorithm); |
| 355 | + Assert.Equal(expectedBytes, result.PublicKey); |
| 356 | + |
| 357 | + var cert = new X509Certificate2(Convert.FromBase64String(result.PublicKeyAsString)); |
| 358 | + Assert.Equal("sha256RSA", cert.SignatureAlgorithm.FriendlyName); |
| 359 | + Assert.Equal("CN=D1_valA, [email protected]", cert.Subject); |
| 360 | + |
| 361 | + var x509Extension = cert.Extensions["2.5.29.17"]; |
| 362 | + Assert.NotNull(x509Extension); |
| 363 | + var asnData = new AsnEncodedData(x509Extension.Oid, x509Extension.RawData); |
| 364 | + Assert.Equal("RFC822 [email protected]", asnData.Format(false)); |
| 365 | + } |
| 366 | + |
304 | 367 | [Fact] |
305 | 368 | public void DnsRecordFactory_TXTRecordEmpty() |
306 | 369 | { |
|
0 commit comments