mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-01-17 07:17:12 +00:00
655b9793c0
This commit implements the first useful IPC communication between the client and the server. The implemented command is simple, psa_crypto_init(), and its return value is sent back to the client. Note: the newly added file psa_functions_codes.h is temporary and it's probably the one that needs to be automatically generated by a python script to support all crypto functions. Signed-off-by: Valerio Setti <valerio.setti@nordicsemi.no>
117 lines
3.6 KiB
C
117 lines
3.6 KiB
C
/* psasim test server */
|
|
|
|
/*
|
|
* Copyright The Mbed TLS Contributors
|
|
* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
*/
|
|
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
|
|
/* Includes from psasim */
|
|
#include "psa/service.h"
|
|
#include "psa/error_ext.h"
|
|
#include "psa/util.h"
|
|
#include "psa_manifest/manifest.h"
|
|
#include "psa_functions_codes.h"
|
|
|
|
/* Includes from mbedtls */
|
|
#include "mbedtls/version.h"
|
|
#include "psa/crypto.h"
|
|
|
|
#define SERVER_PRINT(fmt, ...) \
|
|
PRINT("Server: " fmt, ##__VA_ARGS__)
|
|
|
|
#define BUF_SIZE 25
|
|
|
|
static int kill_on_disconnect = 0; /* Kill the server on client disconnection. */
|
|
|
|
void parse_input_args(int argc, char *argv[])
|
|
{
|
|
int opt;
|
|
|
|
while ((opt = getopt(argc, argv, "k")) != -1) {
|
|
switch (opt) {
|
|
case 'k':
|
|
kill_on_disconnect = 1;
|
|
break;
|
|
default:
|
|
fprintf(stderr, "Usage: %s [-k]\n", argv[0]);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|
|
}
|
|
|
|
int psa_server_main(int argc, char *argv[])
|
|
{
|
|
psa_status_t ret = PSA_ERROR_PROGRAMMER_ERROR;
|
|
psa_msg_t msg = { -1 };
|
|
const int magic_num = 66;
|
|
int client_disconnected = 0;
|
|
char mbedtls_version[18];
|
|
|
|
mbedtls_version_get_string_full(mbedtls_version);
|
|
SERVER_PRINT("%s", mbedtls_version);
|
|
|
|
parse_input_args(argc, argv);
|
|
SERVER_PRINT("Starting");
|
|
|
|
while (!(kill_on_disconnect && client_disconnected)) {
|
|
psa_signal_t signals = psa_wait(PSA_WAIT_ANY, PSA_BLOCK);
|
|
|
|
if (signals > 0) {
|
|
SERVER_PRINT("Signals: 0x%08x", signals);
|
|
}
|
|
|
|
if (signals & PSA_CRYPTO_SIGNAL) {
|
|
if (PSA_SUCCESS == psa_get(PSA_CRYPTO_SIGNAL, &msg)) {
|
|
SERVER_PRINT("handle: %d - rhandle: %p", msg.handle, (int *) msg.rhandle);
|
|
switch (msg.type) {
|
|
case PSA_IPC_CONNECT:
|
|
SERVER_PRINT("Got a connection message");
|
|
psa_set_rhandle(msg.handle, (void *) &magic_num);
|
|
ret = PSA_SUCCESS;
|
|
break;
|
|
case PSA_IPC_DISCONNECT:
|
|
SERVER_PRINT("Got a disconnection message");
|
|
ret = PSA_SUCCESS;
|
|
client_disconnected = 1;
|
|
break;
|
|
default:
|
|
SERVER_PRINT("Got an IPC call of type %d", msg.type);
|
|
switch (msg.type) {
|
|
case PSA_CRYPTO_INIT:
|
|
ret = psa_crypto_init();
|
|
break;
|
|
default:
|
|
SERVER_PRINT("Unknown PSA function code");
|
|
break;
|
|
}
|
|
SERVER_PRINT("Internal function call returned %d", ret);
|
|
|
|
if (msg.client_id > 0) {
|
|
psa_notify(msg.client_id);
|
|
} else {
|
|
SERVER_PRINT("Client is non-secure, so won't notify");
|
|
}
|
|
}
|
|
|
|
psa_reply(msg.handle, ret);
|
|
} else {
|
|
SERVER_PRINT("Failed to retrieve message");
|
|
}
|
|
} else if (SIGSTP_SIG & signals) {
|
|
SERVER_PRINT("Recieved SIGSTP signal. Gonna EOI it.");
|
|
psa_eoi(SIGSTP_SIG);
|
|
} else if (SIGINT_SIG & signals) {
|
|
SERVER_PRINT("Handling interrupt!");
|
|
SERVER_PRINT("Gracefully quitting");
|
|
psa_panic();
|
|
} else {
|
|
SERVER_PRINT("No signal asserted");
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|