补充rtr-client,完善tls连接等
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
use std::net::{Ipv4Addr, Ipv6Addr};
|
||||
use std::fmt::Write;
|
||||
use std::net::{Ipv4Addr, Ipv6Addr};
|
||||
|
||||
use serde_json::{json, Value};
|
||||
|
||||
use rpki::data_model::resources::ip_resources::{IPAddress, IPAddressPrefix};
|
||||
use rpki::rtr::cache::SerialResult;
|
||||
use rpki::rtr::payload::{Payload, RouteOrigin};
|
||||
use rpki::rtr::pdu::{CacheResponse, EndOfDataV1, IPv4Prefix, IPv6Prefix};
|
||||
use rpki::rtr::cache::SerialResult;
|
||||
|
||||
pub struct RtrDebugDumper {
|
||||
entries: Vec<Value>,
|
||||
@@ -163,12 +163,7 @@ pub fn v4_origin(
|
||||
RouteOrigin::new(prefix, max_len, asn.into())
|
||||
}
|
||||
|
||||
pub fn v6_origin(
|
||||
addr: Ipv6Addr,
|
||||
prefix_len: u8,
|
||||
max_len: u8,
|
||||
asn: u32,
|
||||
) -> RouteOrigin {
|
||||
pub fn v6_origin(addr: Ipv6Addr, prefix_len: u8, max_len: u8, asn: u32) -> RouteOrigin {
|
||||
let prefix = v6_prefix(addr, prefix_len);
|
||||
RouteOrigin::new(prefix, max_len, asn.into())
|
||||
}
|
||||
@@ -236,9 +231,8 @@ pub fn serial_result_to_string(result: &SerialResult) -> String {
|
||||
match result {
|
||||
SerialResult::UpToDate => "UpToDate".to_string(),
|
||||
SerialResult::ResetRequired => "ResetRequired".to_string(),
|
||||
SerialResult::Deltas(deltas) => {
|
||||
let serials: Vec<u32> = deltas.iter().map(|d| d.serial()).collect();
|
||||
format!("Deltas {:?}", serials)
|
||||
SerialResult::Delta(delta) => {
|
||||
format!("Delta serial={}", delta.serial())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -266,12 +260,7 @@ pub fn print_snapshot_hashes(label: &str, snapshot: &rpki::rtr::cache::Snapshot)
|
||||
);
|
||||
}
|
||||
|
||||
pub fn test_report(
|
||||
name: &str,
|
||||
purpose: &str,
|
||||
input: &str,
|
||||
output: &str,
|
||||
) {
|
||||
pub fn test_report(name: &str, purpose: &str, input: &str, output: &str) {
|
||||
println!(
|
||||
"\n==================== TEST REPORT ====================\n测试名称: {}\n测试目的: {}\n\n【输入】\n{}\n【输出】\n{}\n====================================================\n",
|
||||
name, purpose, input, output
|
||||
@@ -307,16 +296,14 @@ pub fn serial_result_detail_to_string(result: &rpki::rtr::cache::SerialResult) -
|
||||
rpki::rtr::cache::SerialResult::ResetRequired => {
|
||||
" result: ResetRequired\n".to_string()
|
||||
}
|
||||
rpki::rtr::cache::SerialResult::Deltas(deltas) => {
|
||||
rpki::rtr::cache::SerialResult::Delta(delta) => {
|
||||
let mut out = String::new();
|
||||
let _ = writeln!(&mut out, " result: Deltas");
|
||||
for (idx, delta) in deltas.iter().enumerate() {
|
||||
let _ = writeln!(&mut out, " delta[{}].serial: {}", idx, delta.serial());
|
||||
let _ = writeln!(&mut out, " delta[{}].announced:", idx);
|
||||
out.push_str(&indent_block(&payloads_to_string(delta.announced()), 4));
|
||||
let _ = writeln!(&mut out, " delta[{}].withdrawn:", idx);
|
||||
out.push_str(&indent_block(&payloads_to_string(delta.withdrawn()), 4));
|
||||
}
|
||||
let _ = writeln!(&mut out, " result: Delta");
|
||||
let _ = writeln!(&mut out, " delta.serial: {}", delta.serial());
|
||||
let _ = writeln!(&mut out, " delta.announced:");
|
||||
out.push_str(&indent_block(&payloads_to_string(delta.announced()), 4));
|
||||
let _ = writeln!(&mut out, " delta.withdrawn:");
|
||||
out.push_str(&indent_block(&payloads_to_string(delta.withdrawn()), 4));
|
||||
out
|
||||
}
|
||||
}
|
||||
|
||||
14
tests/fixtures/tls/client-bad.cnf
vendored
Normal file
14
tests/fixtures/tls/client-bad.cnf
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
[req]
|
||||
distinguished_name = dn
|
||||
prompt = no
|
||||
req_extensions = req_ext
|
||||
|
||||
[dn]
|
||||
CN = RTR Test Client Bad
|
||||
|
||||
[req_ext]
|
||||
subjectAltName = @alt_names
|
||||
extendedKeyUsage = clientAuth
|
||||
|
||||
[alt_names]
|
||||
IP.1 = 127.0.0.2
|
||||
20
tests/fixtures/tls/client-bad.crt
vendored
Normal file
20
tests/fixtures/tls/client-bad.crt
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDMTCCAhmgAwIBAgIUOiwVulOYZB53/kZ6zcqPl0p0g9UwDQYJKoZIhvcNAQEL
|
||||
BQAwHTEbMBkGA1UEAwwSUlRSIFRlc3QgQ2xpZW50IENBMB4XDTI2MDMyMzA4MDUw
|
||||
MFoXDTM2MDMyMDA4MDUwMFowHjEcMBoGA1UEAwwTUlRSIFRlc3QgQ2xpZW50IEJh
|
||||
ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKatGSgyzw0FKy4n5pf6
|
||||
W7UUJCm26WI1+W1GsAkh2EfGofD3ynE6Ne15jRjLc/PeDe0xlEl4wTQm4Gs8kkil
|
||||
JhHzG4fFxUyi4MeRuQPha419hZ+pK1BHUIlURbg1oeXO5g3kwfhLPbVAQcrJdvwz
|
||||
uSEGj22OmqgQFmn0Uwl6xvl/unIIzL2FXGedQA4CitaXk9dqbQWmIFDKuh0q8Kim
|
||||
ePmy+8aHGuD/SeeP31ZvGFv3WcvzsX5aysRdj/WWiJUWbv1vVJ8rApswgH1qC2gY
|
||||
F9lQuEMtfgo+39cUioRzD/lkzl1LnNHr/a21WGOS8ojvAiK3RC49VABVs3fRYGhc
|
||||
cTECAwEAAaNoMGYwDwYDVR0RBAgwBocEfwAAAjATBgNVHSUEDDAKBggrBgEFBQcD
|
||||
AjAdBgNVHQ4EFgQUWk94GyULLgNLb+38lHzbrVEVrIMwHwYDVR0jBBgwFoAUtiTC
|
||||
qdhd2TwFc7JZGWkF8BEcMJwwDQYJKoZIhvcNAQELBQADggEBACHR2a6IkoHt0iOQ
|
||||
DjMi45fgybvddssC1B2aDABziQDabQkrei8leEFptgCCNtMSWkmrfgZJyI2tvuws
|
||||
296kDhkhIEDiwsFh24ZblYaAuKmFBEmw/v6VotFeQ9Hrsf+KKOT3jGibIb2+3ho3
|
||||
q2X2e6ye7SOsfrs4hqeggcBQyzStSPoHE6KWNOHb6vBdJKavFsbff28mQIW3uEDK
|
||||
j6xR7b6+xpuuuqwA41BulCTXIKGzDoIU1bet/7YmrlN69ElN97EfiT6u32dIqUN5
|
||||
dwQKRlTJdf/ZxXVvEemTUcUdRDdLLyG+RMhUfiAr56G+aBn8SzMVEjMGS7bB5dsa
|
||||
FhEqWj4=
|
||||
-----END CERTIFICATE-----
|
||||
28
tests/fixtures/tls/client-bad.key
vendored
Normal file
28
tests/fixtures/tls/client-bad.key
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmrRkoMs8NBSsu
|
||||
J+aX+lu1FCQptuliNfltRrAJIdhHxqHw98pxOjXteY0Yy3Pz3g3tMZRJeME0JuBr
|
||||
PJJIpSYR8xuHxcVMouDHkbkD4WuNfYWfqStQR1CJVEW4NaHlzuYN5MH4Sz21QEHK
|
||||
yXb8M7khBo9tjpqoEBZp9FMJesb5f7pyCMy9hVxnnUAOAorWl5PXam0FpiBQyrod
|
||||
KvCopnj5svvGhxrg/0nnj99Wbxhb91nL87F+WsrEXY/1loiVFm79b1SfKwKbMIB9
|
||||
agtoGBfZULhDLX4KPt/XFIqEcw/5ZM5dS5zR6/2ttVhjkvKI7wIit0QuPVQAVbN3
|
||||
0WBoXHExAgMBAAECggEAEtQwKNngiQSB9cNdKeMG9CRT14CJyeX2CPG41jdEEwut
|
||||
5KZhcLwWNn8KQPhO34hAw4Bb05b4IHeZ15NupRU/AT0Y6ZQeb0NhKDpej8Ep4MCC
|
||||
1WALfBSqVPE3tREd+nOOiphCj1WUoYKiTBHJRsFjEweGMWawMvcqSQroTIRZsPqd
|
||||
uphHGiyF5KGIPMZv6UrdC9pMllQrdYp6edu5Jk/EhX85dFv96eRwI8tutzvJ5gkt
|
||||
itpX9l6reeO6s0FszcgbvzU5VxCOSV1Oo6izjdpocxnnGfO81Lc+DFy0XwJ3PCAz
|
||||
ABE9SVO6TzRMcUAr9x44WffIsG6Ea9tDTHqmGdsm4QKBgQDTsOL2a+yT4bGHwkXl
|
||||
GdlSNk1aLiZR/b6L1KEjsGQ77mGS+EZYouIo7BmAt3pQ/YQ/yqp/+G3RIPSqkg/w
|
||||
n1iloaNAsCS7fIiOMrAKfhX6Y93Yi3orUKx+f9Y8vgTqbVXuyo4n2IvmG0Dqm6uA
|
||||
YuuTvG+J3lu1Tfy6FwcMAsAYOQKBgQDJkCrg+HMkfvSykAFvMw94DEtOiWU4/bF/
|
||||
r6k299i++ubx1hqk48QWuMaXPK9FnsMzCeHukoHxi4JTQvu5rxED8MLg3nKmsl78
|
||||
efLcMKuSkzDtGriI4EMnAPHTcnrc7fxneUg944EOxjb2AAm0mQx95sA+q4qFvEy6
|
||||
Yq06tIJwuQKBgB6o+/Zc40L36VKUXLM17zftDX8GOB6f9b0i6sPUhG/5ssAqnWWx
|
||||
EbiDmZ3+9QRN852ZqOAoBx/G+ijKRuy+54P1yUNRP8C35L9TsBOU93HwjO0UJnmn
|
||||
kZQwx8K8ctHRTCTtyXET+A8320sfiNNrgFtBa5Y4UmgMB5KcSzT+IPxhAoGAEGFk
|
||||
+q92PAsNO820MCNIKItnO1SzIzSKzkOqTstJlAuz5QdvVuMjtm0Bxpyp6dCDMIyn
|
||||
DcpeQREDYFzbNDXj/hv82mV5j86DJaWLdRWHe/v2R+6Z/JWtH2hWPsbY8Udt8cLL
|
||||
eiwY+uhk4w0RvNmLSFgOW4l5UnEBE0ydo120FBECgYEAxTNChdhMIHnFQQHLYI+6
|
||||
SR6LqnjPwqdCQSzy4NrnGJ9O7c+Sed1L5RVg88OKG2dZo+GGjpsSAFRv3gB6rOX9
|
||||
bYxklbPWC65bbWcIMNK2LCJ6+LahZzBwz2tBZOA5GBs0DunQ0PdqLnxdi7QZoHfb
|
||||
pAuCQadp+4BQHVsDwIwpUH4=
|
||||
-----END PRIVATE KEY-----
|
||||
19
tests/fixtures/tls/client-ca.crt
vendored
Normal file
19
tests/fixtures/tls/client-ca.crt
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDGzCCAgOgAwIBAgIUKCaM+eEU12YVn/tC6MEBYPj50oIwDQYJKoZIhvcNAQEL
|
||||
BQAwHTEbMBkGA1UEAwwSUlRSIFRlc3QgQ2xpZW50IENBMB4XDTI2MDMyMzA4MDQy
|
||||
OFoXDTM2MDMyMDA4MDQyOFowHTEbMBkGA1UEAwwSUlRSIFRlc3QgQ2xpZW50IENB
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmmS+gsRZXPaG20Ra2te7
|
||||
WVeqyeFX2lV/RvNsT3WW+EtwuTN2aFJ/pBgSCqgCaFocU5IcgfScybQrjmTWeEot
|
||||
D0F1OOW/TihlBsrU3BS8vOZ4KTuwB9eOgpt7FL8CxLetjNWxZKBsvJMauOUYFLCt
|
||||
DN+78EDqrZ2VyJPfa+7dJKS/JoRgs/WFjvAeb5x1UpKPf/gp1Ji+Vj92Ux9znYF1
|
||||
2Zfs77NsLdwcqyMVj7cb1nucutNf/vMqNi+BoSwC/tQkflda9bLUwto/ZfFPsCFw
|
||||
Ptjwiwm+IGNAKG8r1ujaUVDtxc+NliuAbHERBgZGtYpAE6u28+d8cUAyGGQFNGqb
|
||||
uQIDAQABo1MwUTAdBgNVHQ4EFgQUtiTCqdhd2TwFc7JZGWkF8BEcMJwwHwYDVR0j
|
||||
BBgwFoAUtiTCqdhd2TwFc7JZGWkF8BEcMJwwDwYDVR0TAQH/BAUwAwEB/zANBgkq
|
||||
hkiG9w0BAQsFAAOCAQEATr0wChmDvmw51RQ0kOFP1l3n+O1n/U0xR39YApnmdhtk
|
||||
MyO9gNyqxdUWj4QaRkswr5iMyjsLrT3lYWGfh7oHlhIgkXEy5OK548rhj/PA6d5U
|
||||
M7DDGI06EFfYXcC57Cx1y8Egd9gfkfPk0ned/TG+/dYtyb7sBiIKrOiDExbfZ53U
|
||||
mNtfsdptBoOjee4KggplfVhkUopyO0KKD7twq4dvWgzWZHv7m5wrQA8GP8W4JpPP
|
||||
ZAs8cOLfq4cxAwYFXEaf0x7is2u9KdagPqXkiPMeC8fOHWyRCR7sKN4Dnh57ruqq
|
||||
mQXil9GGFfkDA/bh6+Rs93Yll7yYyA3xif6fSBmgUg==
|
||||
-----END CERTIFICATE-----
|
||||
28
tests/fixtures/tls/client-ca.key
vendored
Normal file
28
tests/fixtures/tls/client-ca.key
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCaZL6CxFlc9obb
|
||||
RFra17tZV6rJ4VfaVX9G82xPdZb4S3C5M3ZoUn+kGBIKqAJoWhxTkhyB9JzJtCuO
|
||||
ZNZ4Si0PQXU45b9OKGUGytTcFLy85ngpO7AH146Cm3sUvwLEt62M1bFkoGy8kxq4
|
||||
5RgUsK0M37vwQOqtnZXIk99r7t0kpL8mhGCz9YWO8B5vnHVSko9/+CnUmL5WP3ZT
|
||||
H3OdgXXZl+zvs2wt3ByrIxWPtxvWe5y601/+8yo2L4GhLAL+1CR+V1r1stTC2j9l
|
||||
8U+wIXA+2PCLCb4gY0AobyvW6NpRUO3Fz42WK4BscREGBka1ikATq7bz53xxQDIY
|
||||
ZAU0apu5AgMBAAECggEABjSKW6McnFnkLaffpvAIvZyCZr7B0yqghO9/qOnm+W++
|
||||
xhLFbYfzTVsSTo9WGW+Vt94leyujqY+uOHjhDdCdYwGUfobtW2zQMqewSnAi7cyt
|
||||
g6q8dnQ5bBJnrfvHVrSzKvfju1GfTSz0Y/4BK8O2ENBlM1DIndW5kWgwEJx3EuPk
|
||||
KzsjeZnWEUWKKcHL6/+jviTgfM7tnMjgtHMeHU/v8hVKBtebWAxvPjTE+HRoWePE
|
||||
uEgvGC9eIHb7fRh0sEt4+vrx5GkKikwj4278yhTJTF4X4kTE8T1kBYaihAiSTyoy
|
||||
jdf7DkGtfC//3k6yc3mSabq7UjMLu1m4HGCSXjs2iQKBgQDW/e+Qx7P/hyeya/gQ
|
||||
JDAsZciBKxBn8gGywRbtEzFz08Wb1WMX0LaioUIVMXUmVzXWgQkaiztzS+AQTr+D
|
||||
sRpbOqkxalUdzyaHzgUTKhyvU2dzPOWWFUwJvBPKShhUibukgl+BIIdXr701qKf5
|
||||
W/sL3e7CMxNfirKfMoXe4q4m1wKBgQC318k5+63TexbP/peY6A+bGudJo/PKE4aD
|
||||
GexJEvUcEV1J5d3SKXZoe2V0fTmFsvdhJIPFg2rnVRy2tV6F1vFzHAiou3tc0skU
|
||||
vlM8nTDwPI80kk44LRMzzqZoe5pziI3tUS/Qwu8FX3MfXkkKd0wnQRhoUc0fMdT2
|
||||
zOuvFehP7wKBgBQNsafeiNKf57sDySqwRXIOuGob+zbG4xOqYRoR/T3hlgAYIlsZ
|
||||
U7/NrN1PNK8z2Ui91nyMWipB/I9o2QJOpbe2vAto8LGMHfry45RLDEvqSq78Eioy
|
||||
qFoMGgh3ateP1Vnd80yXHSi3sr1rkud2he8wb1Hb88WoqUqiKsyEdlwXAoGBAIdN
|
||||
V/rFoRv5BkQUAqx1di7YMQrAkIbTsfbA2Ga7fgunN/pQI94tx8iDsJp4IyKkIW6s
|
||||
OhLecopI2LYba7KjC9aE9laAjP024OjUXlxI8CCO4XJ2jvzHJ8/EMjLJbVXEVXgo
|
||||
fUFuhg11PzwB303FmRV20ijMs2NXAH6XOIoGXJCfAoGALCJ11wdb1m2vzYRLlSqo
|
||||
mcDQ1PltSbnFZ6KyuJM5MnJ/TIwnUQ7Rnsjya5m4HFJtJnPSgrygckjrZwPLZpPz
|
||||
TrKr614Ln4E3YU2IoVTyjjgtkEHn0fRcxvsn9z5vXCrzM4JJF5Ac+nbKEwgugmpu
|
||||
JjMMsfGPFC/cr+SpRZr/Nf8=
|
||||
-----END PRIVATE KEY-----
|
||||
14
tests/fixtures/tls/client-good.cnf
vendored
Normal file
14
tests/fixtures/tls/client-good.cnf
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
[req]
|
||||
distinguished_name = dn
|
||||
prompt = no
|
||||
req_extensions = req_ext
|
||||
|
||||
[dn]
|
||||
CN = RTR Test Client Good
|
||||
|
||||
[req_ext]
|
||||
subjectAltName = @alt_names
|
||||
extendedKeyUsage = clientAuth
|
||||
|
||||
[alt_names]
|
||||
IP.1 = 127.0.0.1
|
||||
20
tests/fixtures/tls/client-good.crt
vendored
Normal file
20
tests/fixtures/tls/client-good.crt
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDMjCCAhqgAwIBAgIUTLfIortKKjsYovPDuDVnUR8i2YMwDQYJKoZIhvcNAQEL
|
||||
BQAwHTEbMBkGA1UEAwwSUlRSIFRlc3QgQ2xpZW50IENBMB4XDTI2MDMyMzA4MDUw
|
||||
MFoXDTM2MDMyMDA4MDUwMFowHzEdMBsGA1UEAwwUUlRSIFRlc3QgQ2xpZW50IEdv
|
||||
b2QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUjnhxQxKUNLjGN6mu
|
||||
/VvoGXfsyvZq38QMlfIauGPQ5Jwpq2BU2gW1zFvjBJaS8ZKY2DOsBKvZMrEiSxVt
|
||||
8WCCgvSucw5Elwniq/Yu8UmkvWEMnk9oXwQuHQeWYSe2eMvwBMTNaj3Vz+xo2Ga/
|
||||
+eGClxPDcKKvOMYz+BRpyMfHzX1LLrM26yDjyxQKxzsrFMQ5IKXkhv4COLAjpLZd
|
||||
oEDSkG+W4fbGTC6bSkskFP62OmnR/Qq6dXBVAJkzHqoiWEmKWBQy9JhEo+N3Jz7D
|
||||
QfOAI/20MD6J4brWS56ciHL67yQjHJW6P0HlcLzefFqspIwvTFyCsF137jJi9sqL
|
||||
y7UlAgMBAAGjaDBmMA8GA1UdEQQIMAaHBH8AAAEwEwYDVR0lBAwwCgYIKwYBBQUH
|
||||
AwIwHQYDVR0OBBYEFJy0O+AR5EdWrUr2UHtPCUVTrRiEMB8GA1UdIwQYMBaAFLYk
|
||||
wqnYXdk8BXOyWRlpBfARHDCcMA0GCSqGSIb3DQEBCwUAA4IBAQB8eavz/Pk3oJBh
|
||||
sgy4ve6nLAqKGcD+zSoBxw/ErZaDNdUZZaFKT9nypfi39jkfjU+CIfhczCs5Cknk
|
||||
EDqYtp1BXkY+auKeYRkoaCKv+ucnIc6JZ70NOQGdDNzU4eb9tVA9Py0j5VzvxWR1
|
||||
yl6vHTc3tTA873RRezvUe+SQDwR+x2dxZ0O0MFZR4CTaTeR+fpD4bE9mBcYN1KVk
|
||||
HdA7USCwOZ0qE+aHTegM4pgGrpHYS5yBpUFADqfJl1yBnnqc10zkphoy6dRsbVuN
|
||||
NkDostGbbfGdGjEPs6i1TMsDTVyOo4nsHACk4q4m/IEVBkiMwxmwyhK1EEWQmQpy
|
||||
h0CqAs3Z
|
||||
-----END CERTIFICATE-----
|
||||
28
tests/fixtures/tls/client-good.key
vendored
Normal file
28
tests/fixtures/tls/client-good.key
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDUjnhxQxKUNLjG
|
||||
N6mu/VvoGXfsyvZq38QMlfIauGPQ5Jwpq2BU2gW1zFvjBJaS8ZKY2DOsBKvZMrEi
|
||||
SxVt8WCCgvSucw5Elwniq/Yu8UmkvWEMnk9oXwQuHQeWYSe2eMvwBMTNaj3Vz+xo
|
||||
2Ga/+eGClxPDcKKvOMYz+BRpyMfHzX1LLrM26yDjyxQKxzsrFMQ5IKXkhv4COLAj
|
||||
pLZdoEDSkG+W4fbGTC6bSkskFP62OmnR/Qq6dXBVAJkzHqoiWEmKWBQy9JhEo+N3
|
||||
Jz7DQfOAI/20MD6J4brWS56ciHL67yQjHJW6P0HlcLzefFqspIwvTFyCsF137jJi
|
||||
9sqLy7UlAgMBAAECggEALmsOkm17WTJKR79QJw7dS0qEjgmk1qIXRkhYns01vyCt
|
||||
mcv7NYyHQrRmPKV73Is04HwWjLJYdQ5E8KBFBcV4tgezN4WY0BHL7txu3sGCu58/
|
||||
2mmYHcriNs/QIF8HNSocH0ZrVBCngFHv5tWbWsFPJh2oCz5FyM41OpQqoQ9f0ZoA
|
||||
PKq3m7dNidFmlQPhhJ9KeLYwDfzTRy4sWBDrgZFDQ6ut9nO8/JpJvxZCSnOdbW1T
|
||||
6pYk3uAKKcmrcdI2fsg7u0J1zkrkDnRdrDv1QCY/h1UXvR4KuMeYRylHWJpOKUiR
|
||||
asxpJO+lh7TmDaEIqO+dSmTHawcKDYuIp0EV4/x7AQKBgQD/cgMhx97bJ3ym0ucc
|
||||
xtt10jo0NTW7SJIXx/eUdBQNA3aGWfsqLrBI5qKrXLxTXF/vAs3LWHiHF6EgRxW/
|
||||
7RbO+NZzAGxg53Y3PMqZ4AQbOm2JCIgT9ZhQc55+qowdtrts3njL+ayy3vWh3nPt
|
||||
G78+rs4ZLCHhEutbkKqU7S3XSQKBgQDVBJ5l9d1QcqFqYnlmyhgfwJwpxo4N2dJR
|
||||
18pCow8Mp8S9ROJx3OF4yNTRa6ipnX0oGdgchT63jXBDoKot3/4tqbjYj/Y3MmKL
|
||||
crZ7dZEiAqkqE975qUfSlQS6BtknRKduzQzAJAKz0A+JbPIisPHIrBnG2PH9h2XA
|
||||
TjA2rHRi/QKBgDIp65+IpqUW/g2swSIPky1yGWgDQwgCWl49MMuAeCeOFIqRxRcl
|
||||
kAzg7fUFAx7Dtzsyq8NRHmo5I7U5AHZuUtpWV5bB8IafLcHvOEI7kdLfCH+uozp4
|
||||
Mm8qJWfuihGTvv7EOaik4VtHGamuC8n2dvoSTfr3hbezhXC32ifg4+2xAoGATbjp
|
||||
snoKzheFHbPgZ8jFFJDKadOwcQ1Q19vMSJQGIa/08Ln5hWH6Qn/EZsTJPVnhGIiV
|
||||
eZKEV6SbmZE9ho97xl1uvFWKmIkhu4+XVWSIF8iwwFGPwbgqJIOKvfVRtioujRbz
|
||||
2AdLlSANCy9dCZtWHMnufccaRE7qqUfd/5TcwmECgYA5md1JZ+p+0yTkjNf4McCe
|
||||
mpZiXXaM8uC3/XiWlfcw3ag88H0XCqt2UPcX03MC9ZzywfTdoEHhPRfr48uRiH7K
|
||||
Pi1T8E2E0GkSfk6zh6wJm8Kmm9+VJd2rUFrb35xDMUfjpS228oH9UBQtwaAV+jmy
|
||||
q/APoG+aWt5YIeYElx9mzA==
|
||||
-----END PRIVATE KEY-----
|
||||
14
tests/fixtures/tls/server-dns.cnf
vendored
Normal file
14
tests/fixtures/tls/server-dns.cnf
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
[req]
|
||||
distinguished_name = dn
|
||||
prompt = no
|
||||
req_extensions = req_ext
|
||||
|
||||
[dn]
|
||||
CN = localhost
|
||||
|
||||
[req_ext]
|
||||
subjectAltName = @alt_names
|
||||
extendedKeyUsage = serverAuth
|
||||
|
||||
[alt_names]
|
||||
DNS.1 = localhost
|
||||
19
tests/fixtures/tls/server-dns.crt
vendored
Normal file
19
tests/fixtures/tls/server-dns.crt
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDLDCCAhSgAwIBAgIUU9TJAAXI1pavsowFKFye0t8gdz4wDQYJKoZIhvcNAQEL
|
||||
BQAwHTEbMBkGA1UEAwwSUlRSIFRlc3QgQ2xpZW50IENBMB4XDTI2MDMyNDAyMzA0
|
||||
N1oXDTM2MDMyMTAyMzA0N1owFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkq
|
||||
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzXLZ2ZeySuuzCDEPXsHMym0py7Tuwizu
|
||||
5a4AKQt+7d8b51x22W+I6ZQXYOCUml+C0PGs5TfQDXs0VbYj08flVxw9732FPqzp
|
||||
PhkZJlEbnu7+nEW4mb+aM+pnPnW7iLeCvePGXicYO9YctQNA9Onxe+63QtEi2OtO
|
||||
24wlqreToA2qQ7UOeNbpcY5p9psgXt9wW+8rq1gXmKsci8DV//1MessDTTX4tgIh
|
||||
lOvKBIqx2E2kIIbZ6BwB7veKCkwqrFeVKzmwCXfkVQZkyfxKTBOvf3VFssnFJ7Ld
|
||||
dYuAMTpl9jCHkNykGNlc0a9ohglEvAjqwgpUdMcuzMMR8Kf0DjqZqwIDAQABo20w
|
||||
azAUBgNVHREEDTALgglsb2NhbGhvc3QwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHQYD
|
||||
VR0OBBYEFOYSmMCX8XUYA9jMGY2M1v5/xaimMB8GA1UdIwQYMBaAFLYkwqnYXdk8
|
||||
BXOyWRlpBfARHDCcMA0GCSqGSIb3DQEBCwUAA4IBAQArYXsdMl+vPyTyv/oRzCo0
|
||||
mWyVO3RZPPRJSrrMz4UjtVMIfq6pnV+AXPEcWL/zEfQNcRPjsJeezkG66AZbI+ug
|
||||
fur90YVDhWfOgde4E3cVhZz90aM/jcRMVvwNj0XiaX4JpxsVhv5T4LC80aXm0r02
|
||||
YfJyqwtNaZlKDntaW56q7nD5eaoqmYa+ogpdqwCIfGvManfRH6v6xmzgQRKnD1lc
|
||||
LZPDZ9dmkQg2N/vdZfVUpB2+EZYF/9BuIvJyGKNYBjJiQGv2kbaFUl13mw7D/yGP
|
||||
Zytpu5AIPl6ScYog8x6dSJMiYM+hO1bD9qOU0Kq48PaLQoQ4poYo7zdbiB8TZaKC
|
||||
-----END CERTIFICATE-----
|
||||
28
tests/fixtures/tls/server-dns.key
vendored
Normal file
28
tests/fixtures/tls/server-dns.key
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDNctnZl7JK67MI
|
||||
MQ9ewczKbSnLtO7CLO7lrgApC37t3xvnXHbZb4jplBdg4JSaX4LQ8azlN9ANezRV
|
||||
tiPTx+VXHD3vfYU+rOk+GRkmURue7v6cRbiZv5oz6mc+dbuIt4K948ZeJxg71hy1
|
||||
A0D06fF77rdC0SLY607bjCWqt5OgDapDtQ541ulxjmn2myBe33Bb7yurWBeYqxyL
|
||||
wNX//Ux6ywNNNfi2AiGU68oEirHYTaQghtnoHAHu94oKTCqsV5UrObAJd+RVBmTJ
|
||||
/EpME69/dUWyycUnst11i4AxOmX2MIeQ3KQY2VzRr2iGCUS8COrCClR0xy7MwxHw
|
||||
p/QOOpmrAgMBAAECggEAKOWyBCS0c0GUNA9AFgbSM4Gjjk+IL9MuAz6t/X2yWLvP
|
||||
HDFF32bahFTcioZqToiwy9MwLbj8i5J5Co7lduUV/E887Q25lo5pJ9lrLjt7GhpN
|
||||
SOKAKur/UVJaFw7ss/yD5DURafCyXEb1E/t/1ME1NwyAIqbrHu9IlV/Cp8c/dd6n
|
||||
BUZHKN38Fs8riUOTW4BwAA1dV0k+g8bKb0byR5WmXbXqWG/XjfUKcI4Dg9ILsTwG
|
||||
QgI/nzRyAV2unVcdNhM4pMTJ4U4x1Dh/rsWyQ4b206namkpfaIH7j8ovRY2OHhzT
|
||||
EuCbn1Cpfmxp68hRrvMIhLvqVkXOSWzKOkHZba/qYQKBgQD0m3WJu5UHXip14gY/
|
||||
SmDm3vEcFjVZa+BmQtojs32ZfT/b1H5U+mfhXlVi0yf7B7nitQ9zOA7A2C8cxdtr
|
||||
X9zd81MHLc7yUEOAlHBqSfBX/DyF1iRsdM7GYYxrsaECM7NIDukDR1Q/DvMZodRx
|
||||
iVpRkNP3s87a1/QwvDKrwOPcCQKBgQDXBH1IZWcl1mrGgfAI7r5wXIJo0IrTlUcT
|
||||
4nFSNv5YnrhnRzmLDRqxwlUs4II87nzsqv7OYryAg4n8us+X6XQv0hvTKcHsM7tl
|
||||
vAO2EeQIER71tEg45HhmAXo2X2bE5kNMTr4COlb8k6R6r5K2F4yVMZim4qPcMYAK
|
||||
tNRXf9JdEwKBgQDEjpOxvPmxdPrbxWfNvgAGJYpMTpBKLgShSAEwhRBdoacKCEQI
|
||||
FzwYfoxQoGtVLk0yHtqudJJuZondLiT2sI60D85dS3MrhlHn5eA7mPS4Tyl3Rq/4
|
||||
Mxjhkwuakp9WPKNJOSoHB29sSKASrdcf8QaR2rZqKqQDeVtxOhnhqFuxuQKBgHrk
|
||||
8/53BteXj/vZtKpGWs658UebOl3oinGREZgeGo3oWhmdmgQh/0nueuRlhcrxvLFA
|
||||
otavlHIXvLyYwaJgKqpSetjcmxw4DTn+llhwLVd3Aa0J1+W8oBwdaA6/xGtx+LEa
|
||||
qHt5gNJoSLBevYoaN53mdQudqm5mVHrKFDvWsRPFAoGBALAkJiXM4y+aTcwREjnO
|
||||
CgebDRru37mprDW2PDa4vpTydxIcXZukTEZqXbVnXNDY/Gkyv06jYoY2R7mzbgfl
|
||||
7RJIFAQffkzoeFadQZqimIAN3sQ6RRzNqmAlS2D6zjylX7N2rDiPcS3LtrJZHEyk
|
||||
gTFx7+6gjfPNqPiAB5su0IJm
|
||||
-----END PRIVATE KEY-----
|
||||
14
tests/fixtures/tls/server.cnf
vendored
Normal file
14
tests/fixtures/tls/server.cnf
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
[req]
|
||||
distinguished_name = dn
|
||||
prompt = no
|
||||
req_extensions = req_ext
|
||||
|
||||
[dn]
|
||||
CN = RTR Test Server
|
||||
|
||||
[req_ext]
|
||||
subjectAltName = @alt_names
|
||||
extendedKeyUsage = serverAuth
|
||||
|
||||
[alt_names]
|
||||
IP.1 = 127.0.0.1
|
||||
20
tests/fixtures/tls/server.crt
vendored
Normal file
20
tests/fixtures/tls/server.crt
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDLTCCAhWgAwIBAgIUOiwVulOYZB53/kZ6zcqPl0p0g9QwDQYJKoZIhvcNAQEL
|
||||
BQAwHTEbMBkGA1UEAwwSUlRSIFRlc3QgQ2xpZW50IENBMB4XDTI2MDMyMzA4MDUw
|
||||
MFoXDTM2MDMyMDA4MDUwMFowGjEYMBYGA1UEAwwPUlRSIFRlc3QgU2VydmVyMIIB
|
||||
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn1qUW0bUWsq9pMNAzukncqyb
|
||||
3sTbVcO+KfZfzBRwFfbWP1HmUziIsBq01b1m6Py6CL/DWBjgw4lJ8ZgxlhbjB9Zu
|
||||
DVCietURIZIGMjuBiKOGW8vkCd3hlZqNph5sp2rUT2RBKym+orIApkt75epZB1cW
|
||||
0KGsgnAhRpY6QAp4xalggtVp3HvUqapnVkRgix9AF3EAJJml+8QhGjgAn5tzFlOU
|
||||
s5PjHeCDawTgfsAcoyRLi2E/OWAqJoEjujIPrkzfTC8d21yavQvIVeP+OyBRBwrw
|
||||
kNZTyYy5LjO4tqZr8yLKdcMtIdAK2+7lEwWpR/LjFTYXwGs5GEb1Obon1ZdxEQID
|
||||
AQABo2gwZjAPBgNVHREECDAGhwR/AAABMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB0G
|
||||
A1UdDgQWBBQQ7EAHYbMAQW6UdIcRjUmpMOyboTAfBgNVHSMEGDAWgBS2JMKp2F3Z
|
||||
PAVzslkZaQXwERwwnDANBgkqhkiG9w0BAQsFAAOCAQEAffuJO/uKj23/3uFCt06+
|
||||
JT/8lozBSCifvileFjMZmNHViWT3cZuD2NM1/0uFNf9k95yyFn8yVeS4RiobX75L
|
||||
rcqILZUesF5bkD7lmPdazR3Cz0BcCGo9+DvgWaX35lBOsuIMXRG3aUs6/x939zyc
|
||||
p/KtDjqAgd26nhefJlZeb+Z9UYdmMXzcD5n8doWmNgYeaVQraBvMazenSmcwLzn6
|
||||
qzHjW5osUILBSl36KxuChHjHSa9aFPIrhoiGMR0w9oOGm6cHE3R4seNJNAX+YoZq
|
||||
9PXgvVAHWvoSUuATY8iySNRiWUOmpybQuw3iqfgGighekZfxukLMSx2jq4WIquDg
|
||||
Aw==
|
||||
-----END CERTIFICATE-----
|
||||
28
tests/fixtures/tls/server.key
vendored
Normal file
28
tests/fixtures/tls/server.key
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCfWpRbRtRayr2k
|
||||
w0DO6SdyrJvexNtVw74p9l/MFHAV9tY/UeZTOIiwGrTVvWbo/LoIv8NYGODDiUnx
|
||||
mDGWFuMH1m4NUKJ61REhkgYyO4GIo4Zby+QJ3eGVmo2mHmynatRPZEErKb6isgCm
|
||||
S3vl6lkHVxbQoayCcCFGljpACnjFqWCC1Wnce9SpqmdWRGCLH0AXcQAkmaX7xCEa
|
||||
OACfm3MWU5Szk+Md4INrBOB+wByjJEuLYT85YComgSO6Mg+uTN9MLx3bXJq9C8hV
|
||||
4/47IFEHCvCQ1lPJjLkuM7i2pmvzIsp1wy0h0Arb7uUTBalH8uMVNhfAazkYRvU5
|
||||
uifVl3ERAgMBAAECggEADNbvCjW4SYJ5akujLqjBmW9H9diVtaDacyYbTOW+rD5h
|
||||
v+NY9A6jkNDuDiS/JHmsgaT11+TVQ1wN/a3eHPJGI60G3ALJvKzrPvG1lxmNU9Wd
|
||||
L0tL2fGrSfMUg7SC27BzX9w7lf88kX5XKA7/8iQCPWGqgG/uZuoi/D2BfwR4+7AL
|
||||
0jPnElGK2PAHBWcEWvAQVfBRxPB96trF58+FLE+blQff2LY3AOR5pVRVwdK6V148
|
||||
4bT6tlPFcUabyVI70mqpw1FjoocEwMb8Fd7uOco5/0FulG3qe9DpZAjM2MWc4LRH
|
||||
K3ZSI/QUp7CGEPcPeah3I/XHdqNrzRwKYj1nM3csoQKBgQDf/1NarvGaJNexjYHn
|
||||
TZOZ6AOZZsP4MqdcNqNzV5K/Gmy1kZ5r7e5eH+SuZ1qH9jNLgNlusGWjmmrivYJo
|
||||
qoiVDzE1tO5m3r08w/5187+TWuhUSOgObKFjtCS+GSR+YbGp/sxoWc5uXm0UZune
|
||||
mWjtPRVwEXBCyrmIAGCGJGYMmQKBgQC2HuzGeJT1e+JxpgvDZKYU9mg0MDYQhejV
|
||||
ibOUfSedSdw2P1vxQWAlQSPHbVpftMqXeM48b/B6IkzvwwSVNxV2I1agxFj0ZLTx
|
||||
MQhDhet0CCFC0UBT9/Ch6JWQ4FbrM5OaNhLVcfeksc8B7cTYZB/lMeSE2r1GH8t1
|
||||
HNqj8+6bOQKBgGwOYKiLYlOI2GB3siXh34VMTogu8fSGgwPR+9GFem4kEjMY10Kb
|
||||
mfTgD9IuW5bhJueSddGW2MEumcddwk45jf/SP1v4N1V6t/FbXyKJfm5YWWFndkKX
|
||||
FtfhLCRkPp2VBT7LgtIIGLRXaul/p+xRNzPS1sekMfKWlx/LhsTPREdpAoGBAKZY
|
||||
UMRnVwdyBD7x/0SVJe13s24Xqwokhaqlf9VdC1XrJKyX6o7Nu9fLS7bX9vf71h/M
|
||||
Q/OH+wpTUhqc8g6opX2mgXWOYgG4Cl1S/81NAOaWlmrFXhBUIwJ/wjz16+4gyezM
|
||||
/x7eXeecUQvd9TIBIfDiRWvjr4XhfKCXnkyqfYJhAoGAGMUedwQLN11NLclbTiVo
|
||||
+xgy1yMeZV8c49+mocwwLgoxINBwygSU3klZZ4Bg+whzaVVlHccrHtEhw+73CbiM
|
||||
xmfIuD0C/U/0FIP2kPm/g8rtH1QVE6Rkshwzzf+txeaGSlXvVtq4zjlVbDi+UrYk
|
||||
qhSRT6NNKMROWj3Mx3CIV/A=
|
||||
-----END PRIVATE KEY-----
|
||||
File diff suppressed because it is too large
Load Diff
204
tests/test_pdu.rs
Normal file
204
tests/test_pdu.rs
Normal file
@@ -0,0 +1,204 @@
|
||||
use std::net::Ipv4Addr;
|
||||
|
||||
use tokio::io::{duplex, AsyncWriteExt};
|
||||
|
||||
use rpki::data_model::resources::as_resources::Asn;
|
||||
use rpki::rtr::error_type::ErrorCode;
|
||||
use rpki::rtr::payload::{Aspa as PayloadAspa, Ski, Timing};
|
||||
use rpki::rtr::pdu::{
|
||||
Aspa, EndOfDataV1, ErrorReport, Flags, Header, IPv4Prefix, RouterKey, SerialNotify,
|
||||
END_OF_DATA_V1_LEN, MAX_PDU_LEN,
|
||||
};
|
||||
|
||||
const ERROR_REPORT_FIXED_PART_LEN: usize = 16;
|
||||
|
||||
#[tokio::test]
|
||||
async fn serial_notify_roundtrip() {
|
||||
let (mut client, mut server) = duplex(1024);
|
||||
let original = SerialNotify::new(1, 42, 100);
|
||||
|
||||
tokio::spawn(async move {
|
||||
original.write(&mut client).await.unwrap();
|
||||
});
|
||||
|
||||
let decoded = SerialNotify::read(&mut server).await.unwrap();
|
||||
|
||||
assert_eq!(decoded.version(), 1);
|
||||
assert_eq!(decoded.session_id(), 42);
|
||||
assert_eq!(decoded.serial_number(), 100);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn ipv4_prefix_roundtrip() {
|
||||
let (mut client, mut server) = duplex(1024);
|
||||
let prefix = IPv4Prefix::new(
|
||||
1,
|
||||
Flags::new(1),
|
||||
24,
|
||||
24,
|
||||
Ipv4Addr::new(192, 168, 0, 0),
|
||||
65000u32.into(),
|
||||
);
|
||||
|
||||
tokio::spawn(async move {
|
||||
prefix.write(&mut client).await.unwrap();
|
||||
});
|
||||
|
||||
let decoded = IPv4Prefix::read(&mut server).await.unwrap();
|
||||
|
||||
assert_eq!(decoded.prefix_len(), 24);
|
||||
assert_eq!(decoded.max_len(), 24);
|
||||
assert_eq!(decoded.prefix(), Ipv4Addr::new(192, 168, 0, 0));
|
||||
assert!(decoded.flag().is_announce());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn error_report_truncates_large_erroneous_pdu() {
|
||||
let pdu = vec![0xAA; MAX_PDU_LEN as usize];
|
||||
let text = b"details";
|
||||
|
||||
let report = ErrorReport::new(1, ErrorCode::CorruptData.as_u16(), &pdu, text);
|
||||
|
||||
assert_eq!(report.as_ref().len(), MAX_PDU_LEN as usize);
|
||||
assert_eq!(
|
||||
report.erroneous_pdu(),
|
||||
&pdu[..(MAX_PDU_LEN as usize - ERROR_REPORT_FIXED_PART_LEN)]
|
||||
);
|
||||
assert!(report.text().is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn error_report_truncates_text_to_fit() {
|
||||
let pdu = [1, 2, 3, 4];
|
||||
let text = vec![b'x'; MAX_PDU_LEN as usize];
|
||||
|
||||
let report = ErrorReport::new(1, ErrorCode::CorruptData.as_u16(), pdu, &text);
|
||||
|
||||
assert_eq!(report.erroneous_pdu(), pdu);
|
||||
assert_eq!(report.as_ref().len(), MAX_PDU_LEN as usize);
|
||||
assert_eq!(
|
||||
report.text().len(),
|
||||
MAX_PDU_LEN as usize - ERROR_REPORT_FIXED_PART_LEN - pdu.len()
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn error_report_rejects_non_utf8_text() {
|
||||
let (mut client, mut server) = duplex(1024);
|
||||
let header = Header::new(1, ErrorReport::PDU, ErrorCode::CorruptData.as_u16(), 17);
|
||||
let mut bytes = Vec::from(header.as_ref());
|
||||
bytes.extend_from_slice(&0u32.to_be_bytes());
|
||||
bytes.extend_from_slice(&1u32.to_be_bytes());
|
||||
bytes.push(0xFF);
|
||||
|
||||
client.write_all(&bytes).await.unwrap();
|
||||
|
||||
let err = ErrorReport::read(&mut server).await.unwrap_err();
|
||||
assert_eq!(err.kind(), std::io::ErrorKind::InvalidData);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn router_key_length_matches_wire_size() {
|
||||
let ski = Ski::default();
|
||||
let spki: std::sync::Arc<[u8]> = std::sync::Arc::from(vec![1u8; 32]);
|
||||
let pdu = RouterKey::new(1, Flags::new(1), ski, Asn::from(64496u32), spki);
|
||||
let (mut client, mut server) = duplex(1024);
|
||||
|
||||
tokio::spawn(async move {
|
||||
pdu.write(&mut client).await.unwrap();
|
||||
});
|
||||
|
||||
let header = Header::read(&mut server).await.unwrap();
|
||||
assert_eq!(header.pdu(), RouterKey::PDU);
|
||||
assert_eq!(header.length(), 8 + 20 + 4 + 32);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn aspa_length_matches_wire_size() {
|
||||
let pdu = Aspa::new(2, Flags::new(1), 64496, vec![64497, 64498]);
|
||||
let (mut client, mut server) = duplex(1024);
|
||||
|
||||
tokio::spawn(async move {
|
||||
pdu.write(&mut client).await.unwrap();
|
||||
});
|
||||
|
||||
let header = Header::read(&mut server).await.unwrap();
|
||||
assert_eq!(header.pdu(), Aspa::PDU);
|
||||
assert_eq!(header.length(), 8 + 4 + 8);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn aspa_announcement_rejects_empty_provider_list() {
|
||||
let err = PayloadAspa::new(Asn::from(64496u32), vec![])
|
||||
.validate_announcement()
|
||||
.unwrap_err();
|
||||
assert_eq!(err.kind(), std::io::ErrorKind::InvalidData);
|
||||
assert!(err.to_string().contains("at least one provider"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn aspa_announcement_rejects_as0() {
|
||||
let err = PayloadAspa::new(Asn::from(0u32), vec![Asn::from(64497u32)])
|
||||
.validate_announcement()
|
||||
.unwrap_err();
|
||||
assert_eq!(err.kind(), std::io::ErrorKind::InvalidData);
|
||||
assert!(err.to_string().contains("AS0"));
|
||||
|
||||
let err = PayloadAspa::new(Asn::from(64496u32), vec![Asn::from(0u32)])
|
||||
.validate_announcement()
|
||||
.unwrap_err();
|
||||
assert_eq!(err.kind(), std::io::ErrorKind::InvalidData);
|
||||
assert!(err.to_string().contains("AS0"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn timing_rejects_out_of_range_refresh() {
|
||||
let err = Timing::new(0, 600, 7200).validate().unwrap_err();
|
||||
assert_eq!(err.kind(), std::io::ErrorKind::InvalidData);
|
||||
assert!(err.to_string().contains("refresh interval"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn timing_rejects_expire_not_greater_than_retry_and_refresh() {
|
||||
let err = Timing::new(600, 600, 600).validate().unwrap_err();
|
||||
assert_eq!(err.kind(), std::io::ErrorKind::InvalidData);
|
||||
assert!(err.to_string().contains("expire interval"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn end_of_data_v1_rejects_invalid_timing() {
|
||||
let err = EndOfDataV1::new(1, 42, 100, Timing::new(600, 8000, 7200)).unwrap_err();
|
||||
assert_eq!(err.kind(), std::io::ErrorKind::InvalidData);
|
||||
assert!(err.to_string().contains("retry interval"));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn end_of_data_v1_read_rejects_invalid_timing() {
|
||||
let (mut client, mut server) = duplex(1024);
|
||||
let header = Header::new(1, EndOfDataV1::PDU, 42, END_OF_DATA_V1_LEN);
|
||||
let mut bytes = Vec::from(header.as_ref());
|
||||
bytes.extend_from_slice(&100u32.to_be_bytes());
|
||||
bytes.extend_from_slice(&600u32.to_be_bytes());
|
||||
bytes.extend_from_slice(&8000u32.to_be_bytes());
|
||||
bytes.extend_from_slice(&7200u32.to_be_bytes());
|
||||
|
||||
client.write_all(&bytes).await.unwrap();
|
||||
|
||||
let err = EndOfDataV1::read(&mut server).await.unwrap_err();
|
||||
assert_eq!(err.kind(), std::io::ErrorKind::InvalidData);
|
||||
assert!(err.to_string().contains("retry interval"));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn end_of_data_v1_read_payload_rejects_invalid_timing() {
|
||||
let (mut client, mut server) = duplex(1024);
|
||||
let header = Header::new(1, EndOfDataV1::PDU, 42, END_OF_DATA_V1_LEN);
|
||||
client.write_all(&100u32.to_be_bytes()).await.unwrap();
|
||||
client.write_all(&600u32.to_be_bytes()).await.unwrap();
|
||||
client.write_all(&600u32.to_be_bytes()).await.unwrap();
|
||||
client.write_all(&600u32.to_be_bytes()).await.unwrap();
|
||||
|
||||
let err = EndOfDataV1::read_payload(header, &mut server).await.unwrap_err();
|
||||
assert_eq!(err.kind(), std::io::ErrorKind::InvalidData);
|
||||
assert!(err.to_string().contains("expire interval"));
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,9 +6,9 @@ use common::test_helper::{
|
||||
indent_block, payloads_to_string, test_report, v4_origin, v6_origin,
|
||||
};
|
||||
|
||||
use rpki::rtr::cache::{Delta, Snapshot};
|
||||
use rpki::rtr::cache::{CacheAvailability, Delta, SessionIds, Snapshot};
|
||||
use rpki::rtr::payload::Payload;
|
||||
use rpki::rtr::store_db::RtrStore;
|
||||
use rpki::rtr::store::RtrStore;
|
||||
|
||||
fn snapshot_to_string(snapshot: &Snapshot) -> String {
|
||||
let payloads = snapshot.payloads_for_rtr();
|
||||
@@ -69,37 +69,52 @@ fn store_db_save_and_get_snapshot() {
|
||||
fn store_db_set_and_get_meta_fields() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let store = RtrStore::open(dir.path()).unwrap();
|
||||
let session_ids = SessionIds::from_array([40, 41, 42]);
|
||||
|
||||
store.set_session_id(42).unwrap();
|
||||
store.set_session_ids(&session_ids).unwrap();
|
||||
store.set_serial(100).unwrap();
|
||||
store.set_delta_window(101, 110).unwrap();
|
||||
|
||||
let session_id = store.get_session_id().unwrap();
|
||||
let loaded_session_ids = store.get_session_ids().unwrap();
|
||||
let serial = store.get_serial().unwrap();
|
||||
let window = store.get_delta_window().unwrap();
|
||||
|
||||
let input = format!(
|
||||
"db_path: {}\nset_session_id=42\nset_serial=100\nset_delta_window=(101, 110)\n",
|
||||
"db_path: {}\nset_session_ids={:?}\nset_serial=100\nset_delta_window=(101, 110)\n",
|
||||
dir.path().display(),
|
||||
session_ids,
|
||||
);
|
||||
|
||||
let output = format!(
|
||||
"get_session_id: {:?}\nget_serial: {:?}\nget_delta_window: {:?}\n",
|
||||
session_id, serial, window,
|
||||
"get_session_ids: {:?}\nget_serial: {:?}\nget_delta_window: {:?}\n",
|
||||
loaded_session_ids, serial, window,
|
||||
);
|
||||
|
||||
test_report(
|
||||
"store_db_set_and_get_meta_fields",
|
||||
"验证 session_id / serial / delta_window 能正确写入并读回。",
|
||||
"验证 session_ids / serial / delta_window 能正确写入并读回。",
|
||||
&input,
|
||||
&output,
|
||||
);
|
||||
|
||||
assert_eq!(session_id, Some(42));
|
||||
assert_eq!(loaded_session_ids, Some(session_ids));
|
||||
assert_eq!(serial, Some(100));
|
||||
assert_eq!(window, Some((101, 110)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn store_db_clear_delta_window_removes_both_bounds() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let store = RtrStore::open(dir.path()).unwrap();
|
||||
|
||||
store.set_delta_window(101, 110).unwrap();
|
||||
assert_eq!(store.get_delta_window().unwrap(), Some((101, 110)));
|
||||
|
||||
store.clear_delta_window().unwrap();
|
||||
|
||||
assert_eq!(store.get_delta_window().unwrap(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn store_db_save_and_get_delta() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
@@ -194,43 +209,220 @@ fn store_db_load_deltas_since_returns_only_newer_deltas_in_order() {
|
||||
fn store_db_save_snapshot_and_meta_writes_all_fields() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let store = RtrStore::open(dir.path()).unwrap();
|
||||
let session_ids = SessionIds::from_array([40, 41, 42]);
|
||||
|
||||
let snapshot = Snapshot::from_payloads(vec![
|
||||
Payload::RouteOrigin(v4_origin(192, 0, 2, 0, 24, 24, 64496)),
|
||||
Payload::RouteOrigin(v4_origin(198, 51, 100, 0, 24, 24, 64497)),
|
||||
]);
|
||||
|
||||
store.save_snapshot_and_meta(&snapshot, 42, 100).unwrap();
|
||||
store
|
||||
.save_snapshot_and_meta(&snapshot, &session_ids, 100)
|
||||
.unwrap();
|
||||
|
||||
let loaded_snapshot = store.get_snapshot().unwrap().expect("snapshot should exist");
|
||||
let loaded_session = store.get_session_id().unwrap();
|
||||
let loaded_session_ids = store.get_session_ids().unwrap();
|
||||
let loaded_serial = store.get_serial().unwrap();
|
||||
|
||||
let input = format!(
|
||||
"db_path: {}\nsnapshot:\n{}session_id=42\nserial=100\n",
|
||||
"db_path: {}\nsnapshot:\n{}session_ids={:?}\nserial=100\n",
|
||||
dir.path().display(),
|
||||
indent_block(&snapshot_to_string(&snapshot), 2),
|
||||
session_ids,
|
||||
);
|
||||
|
||||
let output = format!(
|
||||
"loaded_snapshot:\n{}loaded_session_id: {:?}\nloaded_serial: {:?}\n",
|
||||
"loaded_snapshot:\n{}loaded_session_ids: {:?}\nloaded_serial: {:?}\n",
|
||||
indent_block(&snapshot_to_string(&loaded_snapshot), 2),
|
||||
loaded_session,
|
||||
loaded_session_ids,
|
||||
loaded_serial,
|
||||
);
|
||||
|
||||
test_report(
|
||||
"store_db_save_snapshot_and_meta_writes_all_fields",
|
||||
"验证 save_snapshot_and_meta() 会同时写入 snapshot、session_id 和 serial。",
|
||||
"验证 save_snapshot_and_meta() 会同时写入 snapshot、session_ids 和 serial。",
|
||||
&input,
|
||||
&output,
|
||||
);
|
||||
|
||||
assert!(snapshot.same_content(&loaded_snapshot));
|
||||
assert_eq!(loaded_session, Some(42));
|
||||
assert_eq!(loaded_session_ids, Some(session_ids));
|
||||
assert_eq!(loaded_serial, Some(100));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn store_db_save_cache_state_writes_delta_snapshot_meta_and_window_together() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let store = RtrStore::open(dir.path()).unwrap();
|
||||
let session_ids = SessionIds::from_array([40, 41, 42]);
|
||||
|
||||
let snapshot = Snapshot::from_payloads(vec![
|
||||
Payload::RouteOrigin(v4_origin(192, 0, 2, 0, 24, 24, 64496)),
|
||||
Payload::RouteOrigin(v4_origin(198, 51, 100, 0, 24, 24, 64497)),
|
||||
]);
|
||||
let delta = Delta::new(
|
||||
101,
|
||||
vec![Payload::RouteOrigin(v4_origin(198, 51, 100, 0, 24, 24, 64497))],
|
||||
vec![Payload::RouteOrigin(v4_origin(192, 0, 2, 0, 24, 24, 64496))],
|
||||
);
|
||||
|
||||
store
|
||||
.save_cache_state(
|
||||
CacheAvailability::Ready,
|
||||
&snapshot,
|
||||
&session_ids,
|
||||
101,
|
||||
Some(&delta),
|
||||
Some((101, 101)),
|
||||
false,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let loaded_snapshot = store.get_snapshot().unwrap().expect("snapshot should exist");
|
||||
let loaded_session_ids = store.get_session_ids().unwrap();
|
||||
let loaded_serial = store.get_serial().unwrap();
|
||||
let loaded_availability = store.get_availability().unwrap();
|
||||
let loaded_delta = store.get_delta(101).unwrap().expect("delta should exist");
|
||||
let loaded_window = store.get_delta_window().unwrap();
|
||||
|
||||
assert!(snapshot.same_content(&loaded_snapshot));
|
||||
assert_eq!(loaded_session_ids, Some(session_ids));
|
||||
assert_eq!(loaded_serial, Some(101));
|
||||
assert_eq!(loaded_availability, Some(CacheAvailability::Ready));
|
||||
assert_eq!(loaded_delta.serial(), 101);
|
||||
assert_eq!(loaded_window, Some((101, 101)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn store_db_save_cache_state_prunes_deltas_older_than_window_min() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let store = RtrStore::open(dir.path()).unwrap();
|
||||
let session_ids = SessionIds::from_array([40, 41, 42]);
|
||||
|
||||
let snapshot = Snapshot::from_payloads(vec![
|
||||
Payload::RouteOrigin(v4_origin(192, 0, 2, 0, 24, 24, 64496)),
|
||||
]);
|
||||
|
||||
let d101 = Delta::new(
|
||||
101,
|
||||
vec![Payload::RouteOrigin(v4_origin(192, 0, 2, 0, 24, 24, 64496))],
|
||||
vec![],
|
||||
);
|
||||
let d102 = Delta::new(
|
||||
102,
|
||||
vec![Payload::RouteOrigin(v4_origin(198, 51, 100, 0, 24, 24, 64497))],
|
||||
vec![],
|
||||
);
|
||||
let d103 = Delta::new(
|
||||
103,
|
||||
vec![Payload::RouteOrigin(v4_origin(203, 0, 113, 0, 24, 24, 64498))],
|
||||
vec![],
|
||||
);
|
||||
|
||||
store
|
||||
.save_cache_state(
|
||||
CacheAvailability::Ready,
|
||||
&snapshot,
|
||||
&session_ids,
|
||||
101,
|
||||
Some(&d101),
|
||||
Some((101, 101)),
|
||||
false,
|
||||
)
|
||||
.unwrap();
|
||||
store
|
||||
.save_cache_state(
|
||||
CacheAvailability::Ready,
|
||||
&snapshot,
|
||||
&session_ids,
|
||||
102,
|
||||
Some(&d102),
|
||||
Some((101, 102)),
|
||||
false,
|
||||
)
|
||||
.unwrap();
|
||||
store
|
||||
.save_cache_state(
|
||||
CacheAvailability::Ready,
|
||||
&snapshot,
|
||||
&session_ids,
|
||||
103,
|
||||
Some(&d103),
|
||||
Some((103, 103)),
|
||||
false,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
assert!(store.get_delta(101).unwrap().is_none());
|
||||
assert!(store.get_delta(102).unwrap().is_none());
|
||||
assert_eq!(store.get_delta(103).unwrap().map(|d| d.serial()), Some(103));
|
||||
assert_eq!(store.get_delta_window().unwrap(), Some((103, 103)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn store_db_load_delta_window_restores_wraparound_window_in_serial_order() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let store = RtrStore::open(dir.path()).unwrap();
|
||||
let session_ids = SessionIds::from_array([40, 41, 42]);
|
||||
let snapshot = Snapshot::from_payloads(vec![
|
||||
Payload::RouteOrigin(v4_origin(192, 0, 2, 0, 24, 24, 64496)),
|
||||
]);
|
||||
|
||||
let d_max = Delta::new(
|
||||
u32::MAX,
|
||||
vec![Payload::RouteOrigin(v4_origin(192, 0, 2, 0, 24, 24, 64496))],
|
||||
vec![],
|
||||
);
|
||||
let d_zero = Delta::new(
|
||||
0,
|
||||
vec![Payload::RouteOrigin(v4_origin(198, 51, 100, 0, 24, 24, 64497))],
|
||||
vec![],
|
||||
);
|
||||
let d_one = Delta::new(
|
||||
1,
|
||||
vec![Payload::RouteOrigin(v4_origin(203, 0, 113, 0, 24, 24, 64498))],
|
||||
vec![],
|
||||
);
|
||||
|
||||
store
|
||||
.save_cache_state(
|
||||
CacheAvailability::Ready,
|
||||
&snapshot,
|
||||
&session_ids,
|
||||
u32::MAX,
|
||||
Some(&d_max),
|
||||
Some((u32::MAX, u32::MAX)),
|
||||
false,
|
||||
)
|
||||
.unwrap();
|
||||
store
|
||||
.save_cache_state(
|
||||
CacheAvailability::Ready,
|
||||
&snapshot,
|
||||
&session_ids,
|
||||
0,
|
||||
Some(&d_zero),
|
||||
Some((u32::MAX, 0)),
|
||||
false,
|
||||
)
|
||||
.unwrap();
|
||||
store
|
||||
.save_cache_state(
|
||||
CacheAvailability::Ready,
|
||||
&snapshot,
|
||||
&session_ids,
|
||||
1,
|
||||
Some(&d_one),
|
||||
Some((u32::MAX, 1)),
|
||||
false,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let loaded = store.load_delta_window(u32::MAX, 1).unwrap();
|
||||
|
||||
assert_eq!(loaded.iter().map(Delta::serial).collect::<Vec<_>>(), vec![u32::MAX, 0, 1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn store_db_load_snapshot_and_serial_returns_consistent_pair() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
@@ -349,4 +541,4 @@ fn store_db_load_snapshot_and_serial_errors_on_inconsistent_state() {
|
||||
);
|
||||
|
||||
assert!(result.is_err());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user