// multiple_signatures — Two signatures; one verifies, one does not.

///|
fn main {
  let h = @hsig.OrderedHeaders::new()
  let _ = h.append("content-type", "application/json")
  let req = @hsig.RequestContext::new_default(
    "POST",
    "https",
    "example.com",
    "/p",
    None,
    h,
    None,
  ).unwrap()
  let k1 : @hsig.KeyRecord = {
    keyid: "k1",
    algorithm: "hmac-sha256",
    material: @hsig.SharedSecret(@utf8.encode("secret-one")),
  }
  let k2 : @hsig.KeyRecord = {
    keyid: "k2",
    algorithm: "hmac-sha256",
    material: @hsig.SharedSecret(@utf8.encode("secret-two")),
  }
  let p : @hsig.SignatureParameters = {
    created: Some(1700000000L),
    expires: None,
    keyid: None,
    alg: None,
    nonce: None,
    tag: None,
    extensions: Array::new(),
  }
  let o1 : @hsig.SignOptions = {
    label: "sig-a",
    components: [@hsig.covered_derived(@hsig.DerivedComponent::Method)],
    parameters: { ..p, keyid: Some("k1") },
    algorithm: "hmac-sha256",
    key: k1,
  }
  let o2 : @hsig.SignOptions = {
    label: "sig-b",
    components: [@hsig.covered_derived(@hsig.DerivedComponent::Path)],
    parameters: { ..p, keyid: Some("k2") },
    algorithm: "hmac-sha256",
    key: k2,
  }
  let s1 = @hsig.sign_request(req, o1, @hsig.Limits::default()).unwrap()
  let s2 = @hsig.sign_request(req, o2, @hsig.Limits::default()).unwrap()
  // The verifier knows k1's secret but a WRONG secret for k2.
  let resolver = @hsig.InMemoryKeyResolver::new()
  let _ = resolver.add(k1, @hsig.Limits::default())
  let _ = resolver.add(
    {
      keyid: "k2",
      algorithm: "hmac-sha256",
      material: @hsig.SharedSecret(@utf8.encode("wrong")),
    },
    @hsig.Limits::default(),
  )
  let report = @hsig.verify_request(
    req,
    s1.signature_input + ", " + s2.signature_input,
    s1.signature + ", " + s2.signature,
    resolver,
    @hsig.VerificationPolicy::hmac_only(),
    @hsig.FixedClock::new(1700000000L),
    @hsig.InMemoryNonceStore::new(),
    @hsig.Limits::default(),
    @hsig.MultiSignaturePolicy::AnyValid,
  ).unwrap()
  println(
    "verified: " +
    report.verified.length().to_string() +
    "  rejected: " +
    report.rejected.length().to_string(),
  )
  for r in report.rejected {
    println(
      "  FAIL: " + r.label.unwrap_or("?") + " (" + r.error.kind_name() + ")",
    )
  }
}