/* psasim test server */ /* * Copyright The Mbed TLS Contributors * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */ #include #include "psa_manifest/manifest.h" #include #include void printbits(uint32_t num) { for (int i = 0; i < 32; i++) { if ((num >> (31-i) & 0x1)) { printf("1"); } else { printf("0"); } } printf("\n"); } #define BUF_SIZE 25 int psa_sha256_main() { psa_status_t ret = PSA_ERROR_PROGRAMMER_ERROR; psa_msg_t msg = { -1 }; char foo[BUF_SIZE] = { 0 }; const int magic_num = 66; puts("Starting"); while (1) { puts("Calling psa_wait"); psa_signal_t signals = psa_wait(PSA_WAIT_ANY, PSA_BLOCK); if (signals > 0) { printbits(signals); } if (signals & PSA_SHA256_SIGNAL) { puts("Oooh a signal!"); if (PSA_SUCCESS == psa_get(PSA_SHA256_SIGNAL, &msg)) { printf("My handle is %d\n", msg.handle); printf("My rhandle is %p\n", (int *) msg.rhandle); switch (msg.type) { case PSA_IPC_CONNECT: puts("Got a connection message"); psa_set_rhandle(msg.handle, (void *) &magic_num); ret = PSA_SUCCESS; break; case PSA_IPC_DISCONNECT: puts("Got a disconnection message"); ret = PSA_SUCCESS; break; default: printf("Got an IPC call of type %d\n", msg.type); ret = 42; size_t size = msg.in_size[0]; if ((size > 0) && (size <= sizeof(foo))) { psa_read(msg.handle, 0, foo, 6); foo[(BUF_SIZE-1)] = '\0'; printf("Reading payload: %s\n", foo); psa_read(msg.handle, 0, foo+6, 6); foo[(BUF_SIZE-1)] = '\0'; printf("Reading payload: %s\n", foo); } size = msg.out_size[0]; if ((size > 0)) { puts("Writing response"); psa_write(msg.handle, 0, "RESP", 4); psa_write(msg.handle, 0, "ONSE", 4); } if (msg.client_id > 0) { psa_notify(msg.client_id); } else { puts("Client is non-secure, so won't notify"); } } psa_reply(msg.handle, ret); } else { puts("Failed to retrieve message"); } } else if (SIGSTP_SIG & signals) { puts("Recieved SIGSTP signal. Gonna EOI it."); psa_eoi(SIGSTP_SIG); } else if (SIGINT_SIG & signals) { puts("Handling interrupt!\n"); puts("Gracefully quitting"); psa_panic(); } else { puts("No signal asserted"); } } }