1 /*
2  * Copyright (c) 2023, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 
8 #include <CppUTestExt/MockSupport.h>
9 #include "rpmb_platform_mock.h"
10 
rpmb_platform_mock_expect_derive_key(void * context,const uint8_t * data,size_t data_length,const uint8_t * key,size_t key_length,psa_status_t result)11 void rpmb_platform_mock_expect_derive_key(void *context, const uint8_t *data, size_t data_length,
12 					  const uint8_t *key, size_t key_length,
13 					  psa_status_t result)
14 {
15 	mock().expectOneCall("derive_key").
16 		onObject(context).
17 		withMemoryBufferParameter("data", data, data_length).
18 		withOutputParameterReturning("key", key, key_length).
19 		withUnsignedIntParameter("key_length", key_length).
20 		andReturnValue(result);
21 }
22 
rpmb_platform_derive_key(void * context,const uint8_t * data,size_t data_length,uint8_t * key,size_t key_length)23 static psa_status_t rpmb_platform_derive_key(void *context, const uint8_t *data, size_t data_length,
24 					     uint8_t *key, size_t key_length)
25 {
26 	return mock().actualCall("derive_key").
27 		onObject(context).
28 		withMemoryBufferParameter("data", data, data_length).
29 		withOutputParameter("key", key).
30 		withUnsignedIntParameter("key_length", key_length).
31 		returnIntValue();
32 }
33 
rpmb_platform_mock_expect_get_nonce(void * context,const uint8_t * nonce,size_t nonce_length,psa_status_t result)34 void rpmb_platform_mock_expect_get_nonce(void *context, const uint8_t *nonce, size_t nonce_length,
35 					 psa_status_t result)
36 {
37 	mock().expectOneCall("get_nonce").
38 		onObject(context).
39 		withOutputParameterReturning("nonce", nonce, nonce_length).
40 		withUnsignedIntParameter("nonce_length", nonce_length).
41 		andReturnValue(result);
42 }
43 
rpmb_platform_get_nonce(void * context,uint8_t * nonce,size_t nonce_length)44 static psa_status_t rpmb_platform_get_nonce(void *context, uint8_t *nonce, size_t nonce_length)
45 {
46 	return mock().actualCall("get_nonce").
47 		onObject(context).
48 		withOutputParameter("nonce", nonce).
49 		withUnsignedIntParameter("nonce_length", nonce_length).
50 		returnIntValue();
51 }
52 
rpmb_platform_mock_expect_calculate_mac(void * context,const uint8_t * key,size_t key_length,const struct rpmb_data_frame * frames,size_t frame_count,const uint8_t * mac,size_t mac_length,psa_status_t result)53 void rpmb_platform_mock_expect_calculate_mac(void *context, const uint8_t *key, size_t key_length,
54 					     const struct rpmb_data_frame *frames,
55 					     size_t frame_count, const uint8_t *mac,
56 					     size_t mac_length, psa_status_t result)
57 {
58 	mock().expectOneCall("calculate_mac").
59 		onObject(context).
60 		withMemoryBufferParameter("key", key, key_length).
61 		withMemoryBufferParameter("frames", (const unsigned char *)frames, sizeof(*frames) * frame_count).
62 		withOutputParameterReturning("mac", mac, mac_length).
63 		withUnsignedIntParameter("mac_length", mac_length).
64 		andReturnValue(result);
65 }
66 
rpmb_platform_calculate_mac(void * context,const uint8_t * key,size_t key_length,const struct rpmb_data_frame * frames,size_t frame_count,uint8_t * mac,size_t mac_length)67 static psa_status_t rpmb_platform_calculate_mac(void *context, const uint8_t *key,
68 						size_t key_length,
69 						const struct rpmb_data_frame *frames,
70 						size_t frame_count, uint8_t *mac, size_t mac_length)
71 {
72 	return mock().actualCall("calculate_mac").
73 		onObject(context).
74 		withMemoryBufferParameter("key", key, key_length).
75 		withMemoryBufferParameter("frames", (const unsigned char *)frames, sizeof(*frames) * frame_count).
76 		withOutputParameter("mac", mac).
77 		withUnsignedIntParameter("mac_length", mac_length).
78 		returnIntValue();
79 }
80 
rpmb_platform_mock_init(struct rpmb_platform_mock * context)81 struct rpmb_platform *rpmb_platform_mock_init(struct rpmb_platform_mock *context)
82 {
83 	static struct rpmb_platform_interface interface = {
84 		rpmb_platform_derive_key,
85 		rpmb_platform_get_nonce,
86 		rpmb_platform_calculate_mac
87 	};
88 
89 	if (!context)
90 		return NULL;
91 
92 	context->platform.context = context;
93 	context->platform.interface = &interface;
94 
95 	return &context->platform;
96 }
97 
rpmb_platform_mock_deinit(struct rpmb_platform_mock * context)98 void rpmb_platform_mock_deinit(struct rpmb_platform_mock *context)
99 {
100 	*context = (struct rpmb_platform_mock) { 0 };
101 }
102