| From | David Howells <> | Subject | Trivial TLS server | Date | Fri, 31 Mar 2023 17:27:44 +0100 |
| |
Here's a trivial TLS server that can be used to test this.
David --- /* * TLS-over-TCP sink server */
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <linux/tls.h>
#define OSERROR(X, Y) do { if ((long)(X) == -1) { perror(Y); exit(1); } } while(0)
static unsigned char buffer[512 * 1024] __attribute__((aligned(4096)));
static void set_tls(int sock) { struct tls12_crypto_info_aes_gcm_128 crypto_info;
crypto_info.info.version = TLS_1_2_VERSION; crypto_info.info.cipher_type = TLS_CIPHER_AES_GCM_128; memset(crypto_info.iv, 0, TLS_CIPHER_AES_GCM_128_IV_SIZE); memset(crypto_info.rec_seq, 0, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE); memset(crypto_info.key, 0, TLS_CIPHER_AES_GCM_128_KEY_SIZE); memset(crypto_info.salt, 0, TLS_CIPHER_AES_GCM_128_SALT_SIZE);
OSERROR(setsockopt(sock, SOL_TCP, TCP_ULP, "tls", sizeof("tls")), "TCP_ULP"); OSERROR(setsockopt(sock, SOL_TLS, TLS_TX, &crypto_info, sizeof(crypto_info)), "TLS_TX"); OSERROR(setsockopt(sock, SOL_TLS, TLS_RX, &crypto_info, sizeof(crypto_info)), "TLS_RX"); }
int main(int argc, char *argv[]) { struct sockaddr_in sin = { .sin_family = AF_INET, .sin_port = htons(5556) }; int sfd, afd;
sfd = socket(AF_INET, SOCK_STREAM, 0); OSERROR(sfd, "socket"); OSERROR(bind(sfd, (struct sockaddr *)&sin, sizeof(sin)), "bind"); OSERROR(listen(sfd, 1), "listen");
for (;;) { afd = accept(sfd, NULL, NULL); if (afd != -1) { set_tls(afd); while (read(afd, buffer, sizeof(buffer)) > 0) {} close(afd); } } }
|