ic-platform 0.31.0

Controlled Candid and IC runtime dependency boundary
Documentation
use super::*;

#[test]
fn key_encodings_preserve_issuer_and_seed() {
    for issuer in [vec![], vec![4], vec![0xab; 29]] {
        for seed in [vec![], vec![0, 1, 255], vec![0x42; 256]] {
            let key = CanisterSigPublicKey::new(Principal::from_slice(&issuer), seed.clone());
            let mut expected = vec![issuer.len() as u8];
            expected.extend_from_slice(&issuer);
            expected.extend_from_slice(&seed);
            assert_eq!(key.to_raw(), expected);
            assert_eq!(
                CanisterSigPublicKey::try_from_raw(&expected),
                Ok(key.clone())
            );
            let der = key.to_der();
            assert_eq!(&der[19..], expected);
            if der.len() < 130 {
                assert_eq!(CanisterSigPublicKey::try_from(der.as_slice()), Ok(key));
            } else {
                assert!(CanisterSigPublicKey::try_from(der.as_slice()).is_err());
            }
        }
    }
}

#[test]
fn raw_admission_rejects_missing_or_oversized_issuer() {
    assert!(CanisterSigPublicKey::try_from_raw(&[]).is_err());
    assert!(CanisterSigPublicKey::try_from_raw(&[2, 1]).is_err());
    let mut oversized = vec![30];
    oversized.extend_from_slice(&[0; 30]);
    assert!(CanisterSigPublicKey::try_from_raw(&oversized).is_err());
}

#[test]
fn der_admission_checks_every_envelope_field() {
    let valid = CanisterSigPublicKey::new(Principal::anonymous(), vec![9]).to_der();
    for index in [0, 1, 2, 3, 4, 15, 16, 17, 18] {
        let mut malformed = valid.clone();
        malformed[index] ^= 1;
        assert!(CanisterSigPublicKey::try_from(malformed.as_slice()).is_err());
    }
    for end in 0..valid.len() {
        assert!(CanisterSigPublicKey::try_from(&valid[..end]).is_err());
    }
    let mut trailing = valid;
    trailing.push(0);
    assert!(CanisterSigPublicKey::try_from(trailing.as_slice()).is_err());
}

#[test]
fn short_form_limit_does_not_change_historical_encoder() {
    for seed_len in [108, 109, 110, 127, 255, 256] {
        let key = CanisterSigPublicKey::new(Principal::management_canister(), vec![3; seed_len]);
        let der = key.to_der();
        assert_eq!(der[1], (18 + seed_len) as u8);
        assert_eq!(der[17], (2 + seed_len) as u8);
        assert_eq!(
            CanisterSigPublicKey::try_from(der.as_slice()).is_ok(),
            seed_len <= 109
        );
    }
}

#[test]
fn protocol_hashes_use_external_sha256_with_exact_framing() {
    for domain in [vec![], b"ic-state-root".to_vec(), vec![42; 256]] {
        let payload = b"opaque protocol bytes";
        let mut framed = vec![domain.len() as u8];
        framed.extend_from_slice(&domain);
        framed.extend_from_slice(payload);
        assert_eq!(hash_with_domain(&domain, payload), hash_bytes(framed));
    }
}

#[test]
fn root_key_admission_is_exact() {
    let key = extract_raw_root_pk_from_der(IC_ROOT_PK_DER).unwrap();
    assert_eq!(key.len(), 96);
    assert_eq!(key[0], 0x81);
    assert_eq!(key[95], 0xae);
    assert!(extract_raw_root_pk_from_der(&IC_ROOT_PK_DER[1..]).is_err());
    let mut changed = *IC_ROOT_PK_DER;
    changed[0] ^= 1;
    assert!(extract_raw_root_pk_from_der(&changed).is_err());
}