Edit

kc3-lang/kc3/libtls_server_example.c

Branch :

  • libtls_server_example.c
  • #include <sys/socket.h>
    #include <netinet/in.h>
    #include <tls.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        struct tls_config *config;
        struct tls *ctx;
        int server_fd, client_fd;
        struct sockaddr_in addr;
        char buffer[1024];
        ssize_t len;
        
        // Create socket
        server_fd = socket(AF_INET, SOCK_STREAM, 0);
        if (server_fd < 0) {
            perror("socket");
            exit(1);
        }
        
        // Bind to port 8443
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_port = htons(8443);
        
        if (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
            perror("bind");
            exit(1);
        }
        
        listen(server_fd, 5);
        
        // Initialize TLS
        if (tls_init() != 0) {
            fprintf(stderr, "tls_init failed\n");
            exit(1);
        }
        
        // Create TLS configuration
        config = tls_config_new();
        if (!config) {
            fprintf(stderr, "tls_config_new failed\n");
            exit(1);
        }
        
        // Set server certificate and key
        if (tls_config_set_cert_file(config, "/etc/ssl/server.crt") != 0) {
            fprintf(stderr, "Failed to set cert: %s\n", tls_config_error(config));
            exit(1);
        }
        
        if (tls_config_set_key_file(config, "/etc/ssl/server.key") != 0) {
            fprintf(stderr, "Failed to set key: %s\n", tls_config_error(config));
            exit(1);
        }
        
        // Create TLS server context
        ctx = tls_server();
        if (!ctx) {
            fprintf(stderr, "tls_server failed\n");
            exit(1);
        }
        
        if (tls_configure(ctx, config) != 0) {
            fprintf(stderr, "tls_configure: %s\n", tls_error(ctx));
            exit(1);
        }
        
        printf("TLS server listening on port 8443\n");
        
        // Accept connections
        while ((client_fd = accept(server_fd, NULL, NULL)) >= 0) {
            struct tls *client_ctx;
            
            // Accept TLS handshake on client socket
            if (tls_accept_socket(ctx, &client_ctx, client_fd) != 0) {
                fprintf(stderr, "tls_accept_socket: %s\n", tls_error(ctx));
                close(client_fd);
                continue;
            }
            
            printf("TLS connection established\n");
            
            // Read client data
            len = tls_read(client_ctx, buffer, sizeof(buffer) - 1);
            if (len > 0) {
                buffer[len] = '\0';
                printf("Received: %s", buffer);
                
                // Send response
                const char *response = "HTTP/1.1 200 OK\r\n"
                                     "Content-Length: 13\r\n"
                                     "Content-Type: text/plain\r\n\r\n"
                                     "Hello, TLS!\r\n";
                tls_write(client_ctx, response, strlen(response));
            }
            
            // Close TLS connection
            tls_close(client_ctx);
            tls_free(client_ctx);
            close(client_fd);
        }
        
        tls_free(ctx);
        tls_config_free(config);
        close(server_fd);
        return 0;
    }
    
    /*
     * Compile with:
     * cc -o tlsserver libtls_server_example.c -ltls -lssl -lcrypto
     *
     * Generate test certificates:
     * openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes
     */