Explainable RPKI route origin validation for MoonBit.
git clone https://github.com/Wyh123456559/MoonRouteGuard.git
cd MoonRouteGuard
moon test --target js
moon run --target js src/cmd/routeguard -- --help
moon run --target js src/cmd/routeguard -- examples/before.csv examples/after.csv examples/routes.csvlet payload = @moonrouteguard.Vrp::new(
@moonrouteguard.Ipv4Prefix::parse("203.0.113.0/24").unwrap(),
24,
64496U,
).unwrap()
let route = @moonrouteguard.RouteAnnouncement::new(
@moonrouteguard.Ipv4Prefix::parse("203.0.113.0/24").unwrap(),
64496U,
)
let decision = @moonrouteguard.validate_route(route, [payload])
println(decision.summary())let csv =
#|ASN,IP Prefix,Max Length,Trust Anchor
#|AS64496,203.0.113.0/24,24,arin
let parsed = @moonrouteguard.parse_vrp_csv(csv)
if parsed.is_valid() {
let payloads = parsed.records.map(record => record.vrp)
let decisions = @moonrouteguard.validate_routes([route], payloads)
println(decisions[0].summary())
}moon run --target js src/cmd/routeguard -- examples/before.csv examples/after.csv examples/routes.csv
moon run --target js src/cmd/routeguard -- --json examples/before-dual.csv examples/after-dual.csv examples/routes-dual.csv
moon run --target js src/cmd/routeguard -- --json --slurm examples/slurm-dual.json examples/before-dual.csv examples/after-dual.csv examples/routes-dual.csv
moon run --target js src/cmd/routeguard -- --fail-on-valid-loss examples/before.csv examples/withdrawn.csv examples/routes.csv
moon check --target wasm --deny-warn
moon test --target wasm --deny-warn
moon test --target js --deny-warnlet prefix = @moonrouteguard.Ipv6Prefix::parse("2001:db8::/32").unwrap()
let payload = @moonrouteguard.Ipv6Vrp::new(prefix, 48, 64496U).unwrap()
let route = @moonrouteguard.Ipv6RouteAnnouncement::new(
@moonrouteguard.Ipv6Prefix::parse("2001:db8:1::/48").unwrap(),
64496U,
)
let index = @moonrouteguard.Ipv6VrpIndex::new([payload])
println(index.validate(route).summary())ASN,IP Prefix
AS64496,203.0.113.0/24
AS64500,198.51.100.0/24let output = @moonrouteguard.write_vrp_csv(
parsed.records,
@moonrouteguard.RoutinatorCsvCompat,
).unwrap()let diff = @moonrouteguard.compare_snapshots(old.records, current.records)
println(diff.summary()) // +12 -3 (148921 unchanged)let vrps = current.records.map(record => record.vrp)
let index = @moonrouteguard.VrpIndex::new(vrps)
let decision = index.validate(route)let impact = @moonrouteguard.assess_snapshot_impact(
routes,
old_payloads,
current_payloads,
)
for change in impact.changed {
println(change.summary())
}let filter = @moonrouteguard.SlurmPrefixFilter::by_asn(64496U)
let assertion = @moonrouteguard.slurm_assertion(prefix, 64500U).unwrap()
let local = @moonrouteguard.apply_slurm(payloads, [filter], [assertion])
let index = @moonrouteguard.VrpIndex::new(local.vrps)let policy = @moonrouteguard.parse_slurm_json(source).unwrap()
let local = policy.apply(payloads)
let ipv6_local = policy.apply_ipv6(ipv6_payloads)let normalized = @moonrouteguard.write_slurm_json(policy)let query = @moonrouteguard.encode_rtr_pdu(
@moonrouteguard.SerialQuery(42, 7U),
).unwrap()
let response = @moonrouteguard.decode_rtr_pdus(received_bytes).unwrap()pub(all) struct DualStackRouteCsvResult {
ipv4_routes : Array[RouteAnnouncement]
ipv6_routes : Array[Ipv6RouteAnnouncement]
diagnostics : Array[CsvDiagnostic]
}pub(all) struct DualStackVrpCsvResult {
ipv4_records : Array[VrpRecord]
ipv6_records : Array[Ipv6VrpRecord]
diagnostics : Array[CsvDiagnostic]
}pub(all) struct Ipv6RouteImpact {
previous : Ipv6ValidationDecision
current : Ipv6ValidationDecision
}pub(all) struct Ipv6SnapshotDiff {
added : Array[Ipv6VrpRecord]
removed : Array[Ipv6VrpRecord]
unchanged : Int
}pub(all) struct Ipv6ValidationDecision {
route : Ipv6RouteAnnouncement
validity : RouteValidity
matches : Array[Ipv6VrpMatch]
} derive(Eq, Debug)fn Ipv6ValidationDecision::not_equal(x : Ipv6ValidationDecision, y : Ipv6ValidationDecision) -> Boolfn Ipv6VrpIndex::validate(self : Ipv6VrpIndex, route : Ipv6RouteAnnouncement) -> Ipv6ValidationDecisionfn Ipv6VrpIndex::validate_all(self : Ipv6VrpIndex, routes : Array[Ipv6RouteAnnouncement]) -> Array[Ipv6ValidationDecision]pub(all) struct RouteCsvResult {
routes : Array[RouteAnnouncement]
diagnostics : Array[CsvDiagnostic]
}pub(all) struct RouteImpact {
previous : ValidationDecision
current : ValidationDecision
} derive(Eq, Debug)test {
let prefix = @moonrouteguard.Ipv6Prefix::parse("2001:db8::/32").unwrap()
let vrp = @moonrouteguard.Ipv6Vrp::new(prefix, 48, 64496U).unwrap()
let pdu = @moonrouteguard.RtrPdu::Ipv6PrefixPdu(true, vrp)
assert_eq(
@moonrouteguard.decode_rtr_pdu(@moonrouteguard.encode_rtr_pdu(pdu).unwrap()).unwrap(),
pdu,
)
}pub struct SlurmPrefixFilter {
prefix : Ipv4Prefix?
ipv6_prefix : Ipv6Prefix?
asn : UInt?
comment : String
} derive(Eq, Debug)fn SlurmPrefixFilter::by_ipv6_prefix_and_asn(prefix : Ipv6Prefix, asn : UInt, comment? : String) -> SlurmPrefixFilterfn SlurmPrefixFilter::by_prefix_and_asn(prefix : Ipv4Prefix, asn : UInt, comment? : String) -> SlurmPrefixFilterpub(all) struct ValidationDecision {
route : RouteAnnouncement
validity : RouteValidity
matches : Array[VrpMatch]
} derive(Eq, Debug)fn VrpIndex::validate_all(self : VrpIndex, routes : Array[RouteAnnouncement]) -> Array[ValidationDecision]fn apply_ipv6_slurm(validated : Array[Ipv6Vrp], filters : Array[SlurmPrefixFilter], assertions : Array[Ipv6Vrp]) -> Ipv6SlurmApplyResultfn apply_slurm(validated : Array[Vrp], filters : Array[SlurmPrefixFilter], assertions : Array[Vrp]) -> SlurmApplyResultfn assess_ipv6_snapshot_impact(routes : Array[Ipv6RouteAnnouncement], previous_vrps : Array[Ipv6Vrp], current_vrps : Array[Ipv6Vrp]) -> Ipv6SnapshotImpactfn assess_snapshot_impact(routes : Array[RouteAnnouncement], previous_vrps : Array[Vrp], current_vrps : Array[Vrp]) -> SnapshotImpactfn compare_ipv6_snapshots(previous : Array[Ipv6VrpRecord], current : Array[Ipv6VrpRecord]) -> Ipv6SnapshotDifffn ipv6_slurm_assertion(prefix : Ipv6Prefix, asn : UInt, max_length? : Int) -> Result[Ipv6Vrp, String]fn validate_ipv6_route(route : Ipv6RouteAnnouncement, vrps : Array[Ipv6Vrp]) -> Ipv6ValidationDecisionfn validate_ipv6_routes(routes : Array[Ipv6RouteAnnouncement], vrps : Array[Ipv6Vrp]) -> Array[Ipv6ValidationDecision]fn validate_routes(routes : Array[RouteAnnouncement], vrps : Array[Vrp]) -> Array[ValidationDecision]fn write_assessment_json(diff : SnapshotDiff, impact : SnapshotImpact, slurm? : (SlurmApplyResult?, SlurmApplyResult?), ipv6_slurm? : (Ipv6SlurmApplyResult?, Ipv6SlurmApplyResult?), ipv6? : (Ipv6SnapshotDiff, Ipv6SnapshotImpact)) -> StringInstall
Download zipExplainable RPKI route origin validation for MoonBit.