blob: 44939f1c2a1c5ca360544dadbe3c90f7db48d5fd [file] [log] [blame]
Valerio Setti4f4ade92024-05-03 17:28:04 +02001/* psasim test server */
2
3/*
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 */
7
8#include <unistd.h>
9#include <stdio.h>
10
Valerio Setti655b9792024-05-09 12:20:40 +020011/* Includes from psasim */
Valerio Setti66fb1c12024-05-10 06:51:16 +020012#include "service.h"
13#include "error_ext.h"
14#include "util.h"
Valerio Setti4f4ade92024-05-03 17:28:04 +020015#include "psa_manifest/manifest.h"
Valerio Setti655b9792024-05-09 12:20:40 +020016#include "psa_functions_codes.h"
Valerio Setti4f4ade92024-05-03 17:28:04 +020017
Valerio Setti655b9792024-05-09 12:20:40 +020018/* Includes from mbedtls */
Valerio Setti4362aae2024-05-09 09:15:39 +020019#include "mbedtls/version.h"
Valerio Setti655b9792024-05-09 12:20:40 +020020#include "psa/crypto.h"
Valerio Setti4362aae2024-05-09 09:15:39 +020021
Tom Cosgrove99195432024-05-28 14:07:10 +030022#ifdef DEBUG
Valerio Setti4f4ade92024-05-03 17:28:04 +020023#define SERVER_PRINT(fmt, ...) \
24 PRINT("Server: " fmt, ##__VA_ARGS__)
Tom Cosgrove99195432024-05-28 14:07:10 +030025#else
26#define SERVER_PRINT(...)
27#endif
Valerio Setti4f4ade92024-05-03 17:28:04 +020028
29#define BUF_SIZE 25
30
31static int kill_on_disconnect = 0; /* Kill the server on client disconnection. */
32
33void parse_input_args(int argc, char *argv[])
34{
35 int opt;
36
37 while ((opt = getopt(argc, argv, "k")) != -1) {
38 switch (opt) {
39 case 'k':
40 kill_on_disconnect = 1;
41 break;
42 default:
43 fprintf(stderr, "Usage: %s [-k]\n", argv[0]);
44 exit(EXIT_FAILURE);
45 }
46 }
47}
48
Valerio Setti655b9792024-05-09 12:20:40 +020049int psa_server_main(int argc, char *argv[])
Valerio Setti4f4ade92024-05-03 17:28:04 +020050{
51 psa_status_t ret = PSA_ERROR_PROGRAMMER_ERROR;
52 psa_msg_t msg = { -1 };
Valerio Setti4f4ade92024-05-03 17:28:04 +020053 const int magic_num = 66;
54 int client_disconnected = 0;
Tom Cosgrove3ebb8802024-05-29 10:29:39 +010055 extern psa_status_t psa_crypto_call(psa_msg_t msg);
Valerio Setti2fd95722024-06-17 17:34:03 +020056 extern psa_status_t psa_crypto_close(void);
Valerio Setti4362aae2024-05-09 09:15:39 +020057
Harry Ramseyd6172832024-10-07 11:27:39 +010058#if defined(MBEDTLS_VERSION_C)
59 char mbedtls_version[18];
Valerio Setti4362aae2024-05-09 09:15:39 +020060 mbedtls_version_get_string_full(mbedtls_version);
61 SERVER_PRINT("%s", mbedtls_version);
Harry Ramseyd6172832024-10-07 11:27:39 +010062#endif
Valerio Setti4f4ade92024-05-03 17:28:04 +020063
64 parse_input_args(argc, argv);
65 SERVER_PRINT("Starting");
66
67 while (!(kill_on_disconnect && client_disconnected)) {
68 psa_signal_t signals = psa_wait(PSA_WAIT_ANY, PSA_BLOCK);
69
70 if (signals > 0) {
71 SERVER_PRINT("Signals: 0x%08x", signals);
72 }
73
Valerio Setti655b9792024-05-09 12:20:40 +020074 if (signals & PSA_CRYPTO_SIGNAL) {
75 if (PSA_SUCCESS == psa_get(PSA_CRYPTO_SIGNAL, &msg)) {
76 SERVER_PRINT("handle: %d - rhandle: %p", msg.handle, (int *) msg.rhandle);
Valerio Setti4f4ade92024-05-03 17:28:04 +020077 switch (msg.type) {
78 case PSA_IPC_CONNECT:
79 SERVER_PRINT("Got a connection message");
80 psa_set_rhandle(msg.handle, (void *) &magic_num);
81 ret = PSA_SUCCESS;
82 break;
83 case PSA_IPC_DISCONNECT:
84 SERVER_PRINT("Got a disconnection message");
85 ret = PSA_SUCCESS;
86 client_disconnected = 1;
Valerio Setti2fd95722024-06-17 17:34:03 +020087 psa_crypto_close();
Valerio Setti4f4ade92024-05-03 17:28:04 +020088 break;
Valerio Setti4f4ade92024-05-03 17:28:04 +020089 default:
90 SERVER_PRINT("Got an IPC call of type %d", msg.type);
Tom Cosgrove3ebb8802024-05-29 10:29:39 +010091 ret = psa_crypto_call(msg);
Valerio Setti655b9792024-05-09 12:20:40 +020092 SERVER_PRINT("Internal function call returned %d", ret);
Valerio Setti4f4ade92024-05-03 17:28:04 +020093
94 if (msg.client_id > 0) {
95 psa_notify(msg.client_id);
96 } else {
97 SERVER_PRINT("Client is non-secure, so won't notify");
98 }
Valerio Setti4f4ade92024-05-03 17:28:04 +020099 }
100
101 psa_reply(msg.handle, ret);
102 } else {
103 SERVER_PRINT("Failed to retrieve message");
104 }
105 } else if (SIGSTP_SIG & signals) {
106 SERVER_PRINT("Recieved SIGSTP signal. Gonna EOI it.");
107 psa_eoi(SIGSTP_SIG);
108 } else if (SIGINT_SIG & signals) {
109 SERVER_PRINT("Handling interrupt!");
110 SERVER_PRINT("Gracefully quitting");
111 psa_panic();
112 } else {
113 SERVER_PRINT("No signal asserted");
114 }
115 }
116
117 return 0;
118}