1e1051a39Sopenharmony_ci/*- 2e1051a39Sopenharmony_ci * Copyright 2022 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci/* 11e1051a39Sopenharmony_ci * Example showing how to load DSA params from raw data 12e1051a39Sopenharmony_ci * using EVP_PKEY_fromdata() 13e1051a39Sopenharmony_ci */ 14e1051a39Sopenharmony_ci 15e1051a39Sopenharmony_ci#include <openssl/param_build.h> 16e1051a39Sopenharmony_ci#include <openssl/evp.h> 17e1051a39Sopenharmony_ci#include <openssl/core_names.h> 18e1051a39Sopenharmony_ci#include "dsa.inc" 19e1051a39Sopenharmony_ci 20e1051a39Sopenharmony_ciint main(int argc, char **argv) 21e1051a39Sopenharmony_ci{ 22e1051a39Sopenharmony_ci int rv = EXIT_FAILURE; 23e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx = NULL; 24e1051a39Sopenharmony_ci const char *propq = NULL; 25e1051a39Sopenharmony_ci EVP_PKEY_CTX *ctx = NULL; 26e1051a39Sopenharmony_ci EVP_PKEY *dsaparamkey = NULL; 27e1051a39Sopenharmony_ci OSSL_PARAM_BLD *bld = NULL; 28e1051a39Sopenharmony_ci OSSL_PARAM *params = NULL; 29e1051a39Sopenharmony_ci BIGNUM *p = NULL, *q = NULL, *g = NULL; 30e1051a39Sopenharmony_ci 31e1051a39Sopenharmony_ci p = BN_bin2bn(dsa_p, sizeof(dsa_p), NULL); 32e1051a39Sopenharmony_ci q = BN_bin2bn(dsa_q, sizeof(dsa_q), NULL); 33e1051a39Sopenharmony_ci g = BN_bin2bn(dsa_g, sizeof(dsa_g), NULL); 34e1051a39Sopenharmony_ci if (p == NULL || q == NULL || g == NULL) 35e1051a39Sopenharmony_ci goto cleanup; 36e1051a39Sopenharmony_ci 37e1051a39Sopenharmony_ci /* Use OSSL_PARAM_BLD if you need to handle BIGNUM Parameters */ 38e1051a39Sopenharmony_ci bld = OSSL_PARAM_BLD_new(); 39e1051a39Sopenharmony_ci if (bld == NULL) 40e1051a39Sopenharmony_ci goto cleanup; 41e1051a39Sopenharmony_ci if (!OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p) 42e1051a39Sopenharmony_ci || !OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q) 43e1051a39Sopenharmony_ci || !OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g)) 44e1051a39Sopenharmony_ci goto cleanup; 45e1051a39Sopenharmony_ci params = OSSL_PARAM_BLD_to_param(bld); 46e1051a39Sopenharmony_ci if (params == NULL) 47e1051a39Sopenharmony_ci goto cleanup; 48e1051a39Sopenharmony_ci 49e1051a39Sopenharmony_ci ctx = EVP_PKEY_CTX_new_from_name(libctx, "DSA", propq); 50e1051a39Sopenharmony_ci if (ctx == NULL) { 51e1051a39Sopenharmony_ci fprintf(stderr, "EVP_PKEY_CTX_new_from_name() failed\n"); 52e1051a39Sopenharmony_ci goto cleanup; 53e1051a39Sopenharmony_ci } 54e1051a39Sopenharmony_ci 55e1051a39Sopenharmony_ci if (EVP_PKEY_fromdata_init(ctx) <= 0 56e1051a39Sopenharmony_ci || EVP_PKEY_fromdata(ctx, &dsaparamkey, EVP_PKEY_KEY_PARAMETERS, params) <= 0) { 57e1051a39Sopenharmony_ci fprintf(stderr, "EVP_PKEY_fromdata() failed\n"); 58e1051a39Sopenharmony_ci goto cleanup; 59e1051a39Sopenharmony_ci } 60e1051a39Sopenharmony_ci 61e1051a39Sopenharmony_ci if (!dsa_print_key(dsaparamkey, 0, libctx, propq)) 62e1051a39Sopenharmony_ci goto cleanup; 63e1051a39Sopenharmony_ci 64e1051a39Sopenharmony_ci rv = EXIT_SUCCESS; 65e1051a39Sopenharmony_cicleanup: 66e1051a39Sopenharmony_ci EVP_PKEY_free(dsaparamkey); 67e1051a39Sopenharmony_ci EVP_PKEY_CTX_free(ctx); 68e1051a39Sopenharmony_ci OSSL_PARAM_free(params); 69e1051a39Sopenharmony_ci OSSL_PARAM_BLD_free(bld); 70e1051a39Sopenharmony_ci BN_free(g); 71e1051a39Sopenharmony_ci BN_free(q); 72e1051a39Sopenharmony_ci BN_free(p); 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ci return rv; 75e1051a39Sopenharmony_ci} 76