LCOV - code coverage report
Current view: top level - test/oscore_unit_tests - unit_test_security_context.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 85 97 87.6 %
Date: 2024-09-16 20:15:30 Functions: 6 7 85.7 %
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 1.14