static void test_rsa(const char *pemstr) { char buffer[2048]; int ret; rsakey_t *rsakey; rsakey = rsakey_init_pem(pemstr); if (!rsakey) { printf("Initializing RSA failed\n"); return; } rsakey_sign(rsakey, buffer, sizeof(buffer), CHALLENGE, ipaddr, sizeof(ipaddr), hwaddr, sizeof(hwaddr)); printf("Signature:\n%s\n", buffer); ret = rsakey_decrypt(rsakey, (unsigned char *)buffer, sizeof(buffer), AESENC); printf("Decrypted length: %d\n", ret); rsakey_destroy(rsakey); }
raop_t * raop_init(int max_clients, raop_callbacks_t *callbacks, const char *pemkey, int *error) { raop_t *raop; httpd_t *httpd; rsakey_t *rsakey; httpd_callbacks_t httpd_cbs; assert(callbacks); assert(max_clients > 0); assert(max_clients < 100); assert(pemkey); /* Initialize the network */ if (netutils_init() < 0) { return NULL; } /* Validate the callbacks structure */ if (!callbacks->audio_init || !callbacks->audio_process || !callbacks->audio_destroy) { return NULL; } /* Allocate the raop_t structure */ raop = calloc(1, sizeof(raop_t)); if (!raop) { return NULL; } /* Initialize the logger */ raop->logger = logger_init(); /* Set HTTP callbacks to our handlers */ memset(&httpd_cbs, 0, sizeof(httpd_cbs)); httpd_cbs.opaque = raop; httpd_cbs.conn_init = &conn_init; httpd_cbs.conn_request = &conn_request; httpd_cbs.conn_destroy = &conn_destroy; /* Initialize the http daemon */ httpd = httpd_init(raop->logger, &httpd_cbs, max_clients); if (!httpd) { free(raop); return NULL; } /* Copy callbacks structure */ memcpy(&raop->callbacks, callbacks, sizeof(raop_callbacks_t)); /* Initialize RSA key handler */ rsakey = rsakey_init_pem(pemkey); if (!rsakey) { free(httpd); free(raop); return NULL; } raop->httpd = httpd; raop->rsakey = rsakey; return raop; }