LCOV - code coverage report
Current view: top level - test/oscore_unit_tests - unit_test_security_context.c (source / functions) Coverage Total Hit
Test: lcov.info Lines: 87.6 % 97 85
Test Date: 2026-03-12 12:01:18 Functions: 85.7 % 7 6
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /*
       2                 :             :    Copyright (c) 2022 Eriptic Technologies. See the COPYRIGHT
       3                 :             :    file at the top-level directory of this distribution.
       4                 :             : 
       5                 :             :    Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
       6                 :             :    http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
       7                 :             :    <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
       8                 :             :    option. This file may not be copied, modified, or distributed
       9                 :             :    except according to those terms.
      10                 :             : */
      11                 :             : 
      12                 :             : #include <zephyr/kernel.h>
      13                 :             : #include <zephyr/ztest.h>
      14                 :             : 
      15                 :             : #include "common/unit_test.h"
      16                 :             : 
      17                 :             : #include "oscore.h"
      18                 :             : #include "oscore/security_context.h"
      19                 :             : 
      20                 :           7 : static void test_single_piv2ssn(uint8_t *piv_ptr, uint32_t piv_size, uint64_t expected_ssn)
      21                 :             : {
      22                 :           7 :         uint64_t ssn;
      23                 :           7 :         struct byte_array piv = BYTE_ARRAY_INIT(piv_ptr, piv_size);
      24                 :           7 :         enum err result = piv2ssn(&piv, &ssn);
      25                 :           7 :         zassert_equal(result, ok, "Error in piv2ssn (code=%d)", result);
      26                 :           7 :         zassert_equal(ssn, expected_ssn, "wrong SSN calculation");
      27                 :           7 : }
      28                 :             : 
      29                 :           5 : static void test_single_ssn2piv(uint64_t ssn, uint8_t *expected_piv, uint32_t expected_size)
      30                 :             : {
      31                 :           5 :         static uint8_t buf[5];
      32                 :           5 :         struct byte_array piv = BYTE_ARRAY_INIT(buf, sizeof(buf));
      33                 :           5 :         enum err result = ssn2piv(ssn, &piv);
      34                 :             : 
      35                 :           5 :         zassert_equal(result, ok, "Error in ssn2piv (code=%d)", result);
      36                 :           5 :         zassert_equal(piv.len, expected_size, "wrong PIV size");
      37                 :           5 :         zassert_mem_equal(piv.ptr, expected_piv, expected_size, "wrong PIV value");
      38                 :           5 : }
      39                 :             : 
      40                 :           1 : void t500_oscore_context_init_corner_cases(void)
      41                 :             : {
      42                 :           1 :         enum err r;
      43                 :           1 :         struct context c;
      44                 :             : 
      45                 :             :         /*test unsupported AEAD algorithm*/
      46                 :           1 :         struct oscore_init_params params = {
      47                 :             :                 .aead_alg = 15, //15 is not supported. Only 10 is supported
      48                 :             :         };
      49                 :             : 
      50                 :           1 :         r = oscore_context_init(&params, &c);
      51                 :           1 :         zassert_equal(r, oscore_invalid_algorithm_aead,
      52                 :             :                       "Error in oscore_context_init. r: %d", r);
      53                 :             : 
      54                 :             :         /*test unsupported SHA algorithm*/
      55                 :           1 :         struct oscore_init_params params1 = {
      56                 :             :                 .aead_alg = 10,
      57                 :             :                 .hkdf = 15, //15 is not supported. Only 10 is supported
      58                 :             :         };
      59                 :             : 
      60                 :           1 :         r = oscore_context_init(&params1, &c);
      61                 :           1 :         zassert_equal(r, oscore_invalid_algorithm_hkdf,
      62                 :             :                       "Error in oscore_context_init. r: %d", r);
      63                 :           1 : }
      64                 :             : 
      65                 :           1 : void t501_piv2ssn(void)
      66                 :             : {
      67                 :           1 :         enum err r;
      68                 :           1 :         uint64_t ssn;
      69                 :           1 :         uint8_t piv1[] = { 0x00 };
      70                 :           1 :         uint8_t piv2[] = { 0xFF };
      71                 :           1 :         uint8_t piv3[] = { 0x02, 0xF0 };
      72                 :           1 :         uint8_t piv4[] = { 0xDE, 0xAD, 0xBE, 0xEF };
      73                 :           1 :         uint8_t piv5[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
      74                 :             : 
      75                 :             :         /*test with valid parameters*/
      76                 :           1 :         test_single_piv2ssn(piv1, sizeof(piv1), 0x00);
      77                 :           1 :         test_single_piv2ssn(piv2, sizeof(piv2), 0xFF);
      78                 :           1 :         test_single_piv2ssn(piv3, sizeof(piv3), 0x02F0);
      79                 :           1 :         test_single_piv2ssn(piv4, sizeof(piv4), 0xDEADBEEF);
      80                 :           1 :         test_single_piv2ssn(piv5, sizeof(piv5), MAX_PIV_FIELD_VALUE);
      81                 :           1 :         test_single_piv2ssn(NULL, 0, 0);
      82                 :           1 :         test_single_piv2ssn(NULL, 1, 0);
      83                 :             : 
      84                 :             :         /*test with invalid parameters*/
      85                 :           1 :         r = piv2ssn(NULL, &ssn);
      86                 :           1 :         zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //nullpointer for input value
      87                 :             : 
      88                 :           1 :         struct byte_array piv_ba1 = BYTE_ARRAY_INIT(piv1, sizeof(piv1));
      89                 :           1 :         r = piv2ssn(&piv_ba1, NULL);
      90                 :           1 :         zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //nullpointer for output value
      91                 :             : 
      92                 :           1 :         struct byte_array piv_ba2 = BYTE_ARRAY_INIT(piv1, 10);
      93                 :           1 :         r = piv2ssn(&piv_ba2, &ssn);
      94                 :           1 :         zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //buffer size exceeds maximum
      95                 :           1 : }
      96                 :             : 
      97                 :           1 : void t502_ssn2piv(void)
      98                 :             : {
      99                 :           1 :         enum err r;
     100                 :           1 :         uint8_t piv1[] = { 0x00 };
     101                 :           1 :         uint8_t piv2[] = { 0x20 };
     102                 :           1 :         uint8_t piv3[] = { 0x20, 0xAA };
     103                 :           1 :         uint8_t piv4[] = { 0xDE, 0xAD, 0xBE, 0xEF };
     104                 :           1 :         uint8_t piv5[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
     105                 :             : 
     106                 :             :         /*test with valid parameters*/
     107                 :           1 :         test_single_ssn2piv(0, piv1, sizeof(piv1));
     108                 :           1 :         test_single_ssn2piv(0x20, piv2, sizeof(piv2));
     109                 :           1 :         test_single_ssn2piv(0x20AA, piv3, sizeof(piv3));
     110                 :           1 :         test_single_ssn2piv(0xDEADBEEF, piv4, sizeof(piv4));
     111                 :           1 :         test_single_ssn2piv(MAX_PIV_FIELD_VALUE, piv5, sizeof(piv5));
     112                 :             : 
     113                 :             :         /*test with invalid parameters*/
     114                 :           1 :         r = ssn2piv(0, NULL);
     115                 :           1 :         zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //nullpointer for input value
     116                 :             : 
     117                 :           1 :         struct byte_array piv_ba1 = BYTE_ARRAY_INIT(NULL, 10);
     118                 :           1 :         r = ssn2piv(0, &piv_ba1);
     119                 :           1 :         zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //nullpointer for input value
     120                 :             : 
     121                 :           1 :         struct byte_array piv_ba2 = BYTE_ARRAY_INIT(piv5, sizeof(piv5));
     122                 :           1 :         r = ssn2piv(MAX_PIV_FIELD_VALUE + 1, &piv_ba2);
     123                 :           1 :         zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //max value of ssn exceeded
     124                 :           1 : }
     125                 :             : 
     126                 :             : /*
     127                 :             : * @brief test with wrong kdf
     128                 :             : */
     129                 :           1 : void t503_derive_corner_case(void)
     130                 :             : {
     131                 :           1 :         enum err r;
     132                 :           1 :         struct common_context cc;
     133                 :             : 
     134                 :           1 :         uint8_t id_buf[] = { 5 };
     135                 :           1 :         uint8_t id_context[] = { 5 };
     136                 :           1 :         uint8_t out_buf[40];
     137                 :             : 
     138                 :           1 :         struct byte_array id = BYTE_ARRAY_INIT(id_buf, sizeof(id_buf));
     139                 :           1 :         struct byte_array out = BYTE_ARRAY_INIT(out_buf, sizeof(out_buf));
     140                 :             : 
     141                 :           1 :         cc.kdf = 15;
     142                 :           1 :         cc.aead_alg = 10;
     143                 :           1 :         cc.id_context.ptr = id_context;
     144                 :           1 :         cc.id_context.len = sizeof(id_context);
     145                 :             : 
     146                 :           1 :         r = derive(&cc, &id, KEY, &out);
     147                 :           1 :         zassert_equal(r, oscore_unknown_hkdf, "Error in derive. r: %d", r);
     148                 :           1 : }
     149                 :             : 
     150                 :             : /**
     151                 :             :  * @brief Test catching the SSN overflow event.
     152                 :             :  * 
     153                 :             :  */
     154                 :           0 : void t504_context_freshness(void)
     155                 :             : {
     156                 :           0 :         enum err result;
     157                 :           0 :         struct context security_context;
     158                 :             : 
     159                 :           0 :         result = check_context_freshness(NULL);
     160                 :           0 :         zassert_equal(result, wrong_parameter, "");
     161                 :             : 
     162                 :           0 :         security_context.sc.ssn = 100;
     163                 :           0 :         result = check_context_freshness(&security_context);
     164                 :           0 :         zassert_equal(result, ok, "");
     165                 :             : 
     166                 :             :         /* mimic reaching final value of SSN */
     167                 :           0 :         security_context.sc.ssn = OSCORE_SSN_OVERFLOW_VALUE;
     168                 :           0 :         result = check_context_freshness(&security_context);
     169                 :           0 :         zassert_equal(result, oscore_ssn_overflow, "");
     170                 :           0 : }
        

Generated by: LCOV version 2.0-1