blob: 0ad2b36e8b2baf62015826c5acfde3addf3782ee [file] [log] [blame] [edit]
// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
use super::*;
use crate::{iana, util::expect_err, CborSerializable, HeaderBuilder};
use alloc::vec;
#[test]
fn test_context_encode() {
let tests = vec![
(
CoseKdfContext::default(),
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
),
(
CoseKdfContextBuilder::new()
.algorithm(iana::Algorithm::A128GCM)
.build(),
concat!(
"84", // 4-tuple
"01", // int : AES-128-GCM
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
),
(
CoseKdfContextBuilder::new()
.algorithm(iana::Algorithm::A128GCM)
.party_u_info(PartyInfoBuilder::new().identity(vec![]).build())
.build(),
concat!(
"84", // 4-tuple
"01", // int : AES-128-GCM
"83", "40f6f6", // 3-tuple: [0-bstr, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
),
(
CoseKdfContextBuilder::new()
.algorithm(iana::Algorithm::A128GCM)
.party_u_info(
PartyInfoBuilder::new()
.identity(vec![3, 6])
.nonce(Nonce::Integer(7))
.build(),
)
.build(),
concat!(
"84", // 4-tuple
"01", // int : AES-128-GCM
"83", "420306", "07f6", // 3-tuple: [2-bstr, int, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
),
(
CoseKdfContextBuilder::new()
.algorithm(iana::Algorithm::A128GCM)
.party_u_info(
PartyInfoBuilder::new()
.identity(vec![3, 6])
.nonce(Nonce::Integer(-2))
.build(),
)
.build(),
concat!(
"84", // 4-tuple
"01", // int : AES-128-GCM
"83", "420306", "21f6", // 3-tuple: [2-bstr, nint, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
),
(
CoseKdfContextBuilder::new()
.algorithm(iana::Algorithm::A128GCM)
.party_v_info(
PartyInfoBuilder::new()
.identity(vec![3, 6])
.nonce(Nonce::Bytes(vec![7, 3]))
.build(),
)
.build(),
concat!(
"84", // 4-tuple
"01", // int : AES-128-GCM
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "420306", "420703", "f6", // 3-tuple: [2-bstr, 2-bstr, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
),
(
CoseKdfContextBuilder::new()
.algorithm(iana::Algorithm::A128GCM)
.party_v_info(
PartyInfoBuilder::new()
.identity(vec![3, 6])
.other(vec![7, 3])
.build(),
)
.build(),
concat!(
"84", // 4-tuple
"01", // int : AES-128-GCM
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "420306", "f6", "420703", // 3-tuple: [2-bstr, nil, 2-bstr]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
),
(
CoseKdfContextBuilder::new()
.supp_pub_info(
SuppPubInfoBuilder::new()
.key_data_length(10)
.protected(
HeaderBuilder::new()
.algorithm(iana::Algorithm::A128GCM)
.build(),
)
.build(),
)
.build(),
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0a43", "a10101" // 2-tuple: [10, 3-bstr]
),
),
(
CoseKdfContextBuilder::new()
.supp_pub_info(
SuppPubInfoBuilder::new()
.key_data_length(10)
.other(vec![1, 3, 5])
.build(),
)
.build(),
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "0a40", "43010305", // 3-tuple: [10, 0-bstr, 3-bstr]
),
),
(
CoseKdfContextBuilder::new()
.add_supp_priv_info(vec![1, 2, 3])
.build(),
concat!(
"85", // 5-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
"43", "010203", // 3-bstr
),
),
(
CoseKdfContextBuilder::new()
.add_supp_priv_info(vec![1, 2, 3])
.add_supp_priv_info(vec![2, 3])
.add_supp_priv_info(vec![3])
.build(),
concat!(
"87", // 7-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
"43", "010203", // 3-bstr
"42", "0203", // 2-bstr
"41", "03", // 1-bstr
),
),
];
for (i, (key, key_data)) in tests.iter().enumerate() {
let got = key.clone().to_vec().unwrap();
assert_eq!(*key_data, hex::encode(&got), "case {}", i);
let mut got = CoseKdfContext::from_slice(&got).unwrap();
got.supp_pub_info.protected.original_data = None;
assert_eq!(*key, got);
}
}
#[test]
fn test_context_decode_fail() {
let tests = vec![
(
concat!(
"a2", // 2-map
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
"expected array",
),
(
concat!(
"83", // 3-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
),
"expected array with at least 4 items",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
),
"decode CBOR failure: Io(EndOfFile",
),
(
concat!(
"84", // 4-tuple
"08", // int : unassigned value
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
"expected value in IANA or private use range",
),
(
concat!(
"84", // 4-tuple
"40", // 0-bstr : invalid
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
"expected int/tstr",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"a1", "f6f6", // 1-map
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
"expected array",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"84", "f6f6f6f6", // 4-tuple: [nil, nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
"expected array with 3 items",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f660f6", // 3-tuple: [nil, 0-tstr, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
"expected bstr / int / nil",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f660", // 3-tuple: [nil, nil, 0-tstr]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
"expected bstr / nil",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "60f6f6", // 3-tuple: [0-tstr, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
),
"expected bstr / nil",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"a1", "0040", // 1-map: {0: 0-bstr}
),
"expected array",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"81", "00", // 2-tuple: [0]
),
"expected array with 2 or 3 items",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "4040", // 2-tuple: [0-bstr, 0-bstr]
),
"expected int",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0060", // 2-tuple: [0, 0-tstr]
),
"expected bstr",
),
(
concat!(
"84", // 4-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "004060", // 3-tuple: [0, 0-bstr, 0-tstr]
),
"expected bstr",
),
(
concat!(
"85", // 5-tuple
"00", // int : reserved
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"83", "f6f6f6", // 3-tuple: [nil, nil, nil]
"82", "0040", // 2-tuple: [0, 0-bstr]
"60", // 0-tstr
),
"expected bstr",
),
(
concat!(
"84", // 4-tuple
"01", // int : AES-128-GCM
"83", // 3-tuple: [0-bstr, out-of-range int, nil]
"401b8000000000000000f6",
"83", // 3-tuple: [nil, nil, nil]
"f6f6f6",
"82", // 2-tuple: [0, 0-bstr]
"0040",
),
"out of range integer value",
),
];
for (context_data, err_msg) in tests.iter() {
let data = hex::decode(context_data).unwrap();
let result = CoseKdfContext::from_slice(&data);
expect_err(result, err_msg);
}
}