/* * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of Hyra nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include int gen_x25519_keypair(struct x25519_keypair *res) { EVP_PKEY_CTX *ctx; EVP_PKEY *keypair_raw = NULL; struct x25519_keypair keypair; int retor; if (res == NULL) { return -1; } ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_X25519, NULL); if (ctx == NULL) { printf("ecdh: Failed to create X25519 keygen context\n"); return -1; } if (EVP_PKEY_keygen_init(ctx) <= 0) { printf("ecdh: Failed to init X25519 keygen context\n"); EVP_PKEY_CTX_free(ctx); return -1; } /* Create X25519 key pair */ if (EVP_PKEY_keygen(ctx, &keypair_raw) <= 0) { printf("ecdh: Failed to generate X25519 keypair\n"); EVP_PKEY_CTX_free(ctx); return -1; } /* Allocate a buffer for the public key */ EVP_PKEY_get_raw_public_key(keypair_raw, NULL, &keypair.pubkey_len); keypair.pubkey = malloc(keypair.pubkey_len); if (keypair.pubkey == NULL) { printf(" ecdh: Failed to allocate memory for public key\n"); EVP_PKEY_free(keypair_raw); EVP_PKEY_CTX_free(ctx); return -1; } /* Allocate a buffer for the private key */ EVP_PKEY_get_raw_private_key(keypair_raw, NULL, &keypair.privkey_len); keypair.privkey = malloc(keypair.privkey_len); if (keypair.privkey == NULL) { printf("ecdh: Failed allocating memory for private key\n"); EVP_PKEY_free(keypair_raw); EVP_PKEY_CTX_free(ctx); return -1; } retor = EVP_PKEY_get_raw_private_key(keypair_raw, keypair.privkey, &keypair.privkey_len); if (retor <= 0) { printf("Failed to extract private key\n"); EVP_PKEY_free(keypair_raw); EVP_PKEY_CTX_free(ctx); } retor = EVP_PKEY_get_raw_public_key(keypair_raw, keypair.pubkey, &keypair.pubkey_len); if (retor <= 0) { printf("Failed to extract public key\n"); EVP_PKEY_free(keypair_raw); EVP_PKEY_CTX_free(ctx); } EVP_PKEY_free(keypair_raw); EVP_PKEY_CTX_free(ctx); *res = keypair; return 0; } int free_x25519_keypair(struct x25519_keypair *xkp) { if (xkp == NULL) { return -1; } free(xkp->pubkey); free(xkp->privkey); return 0; }