1238384Sjkim/********************************************************************** 2238384Sjkim * gost_ctl.c * 3238384Sjkim * Copyright (c) 2005-2006 Cryptocom LTD * 4238384Sjkim * This file is distributed under the same license as OpenSSL * 5238384Sjkim * * 6238384Sjkim * Implementation of control commands for GOST engine * 7238384Sjkim * OpenSSL 0.9.9 libraries required * 8280304Sjkim **********************************************************************/ 9238384Sjkim#include <stdlib.h> 10238384Sjkim#include <string.h> 11238384Sjkim#include <openssl/crypto.h> 12238384Sjkim#include <openssl/err.h> 13238384Sjkim#include <openssl/engine.h> 14238384Sjkim#include <openssl/buffer.h> 15238384Sjkim#include "gost_lcl.h" 16238384Sjkim 17280304Sjkimstatic char *gost_params[GOST_PARAM_MAX + 1] = { NULL }; 18280304Sjkimstatic const char *gost_envnames[] = { "CRYPT_PARAMS" }; 19238384Sjkim 20280304Sjkimconst ENGINE_CMD_DEFN gost_cmds[] = { 21280304Sjkim/*- { GOST_CTRL_RNG, 22280304Sjkim "RNG", 23280304Sjkim "Type of random number generator to use", 24280304Sjkim ENGINE_CMD_FLAG_STRING 25280304Sjkim }, 26280304Sjkim { GOST_CTRL_RNG_PARAMS, 27280304Sjkim "RNG_PARAMS", 28280304Sjkim "Parameter for random number generator", 29280304Sjkim ENGINE_CMD_FLAG_STRING 30280304Sjkim }, 31280304Sjkim*/ {GOST_CTRL_CRYPT_PARAMS, 32280304Sjkim "CRYPT_PARAMS", 33280304Sjkim "OID of default GOST 28147-89 parameters", 34280304Sjkim ENGINE_CMD_FLAG_STRING}, 35280304Sjkim {0, NULL, NULL, 0} 36280304Sjkim}; 37280304Sjkim 38280304Sjkimvoid gost_param_free() 39238384Sjkim{ 40280304Sjkim int i; 41280304Sjkim for (i = 0; i <= GOST_PARAM_MAX; i++) 42280304Sjkim if (gost_params[i] != NULL) { 43280304Sjkim OPENSSL_free(gost_params[i]); 44280304Sjkim gost_params[i] = NULL; 45280304Sjkim } 46280304Sjkim 47238384Sjkim} 48238384Sjkim 49280304Sjkimint gost_control_func(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) 50280304Sjkim{ 51280304Sjkim int param = cmd - ENGINE_CMD_BASE; 52280304Sjkim int ret = 0; 53280304Sjkim if (param < 0 || param > GOST_PARAM_MAX) 54280304Sjkim return -1; 55280304Sjkim ret = gost_set_default_param(param, p); 56280304Sjkim return ret; 57280304Sjkim} 58238384Sjkim 59280304Sjkimconst char *get_gost_engine_param(int param) 60280304Sjkim{ 61280304Sjkim char *tmp; 62280304Sjkim if (param < 0 || param > GOST_PARAM_MAX) 63280304Sjkim return NULL; 64280304Sjkim if (gost_params[param] != NULL) { 65280304Sjkim return gost_params[param]; 66280304Sjkim } 67280304Sjkim tmp = getenv(gost_envnames[param]); 68280304Sjkim if (tmp) { 69280304Sjkim if (gost_params[param]) 70280304Sjkim OPENSSL_free(gost_params[param]); 71280304Sjkim gost_params[param] = BUF_strdup(tmp); 72280304Sjkim return gost_params[param]; 73280304Sjkim } 74280304Sjkim return NULL; 75280304Sjkim} 76238384Sjkim 77280304Sjkimint gost_set_default_param(int param, const char *value) 78280304Sjkim{ 79280304Sjkim const char *tmp; 80280304Sjkim if (param < 0 || param > GOST_PARAM_MAX) 81280304Sjkim return 0; 82280304Sjkim tmp = getenv(gost_envnames[param]); 83280304Sjkim /* 84280304Sjkim * if there is value in the environment, use it, else -passed string * 85280304Sjkim */ 86280304Sjkim if (!tmp) 87280304Sjkim tmp = value; 88280304Sjkim if (gost_params[param]) 89280304Sjkim OPENSSL_free(gost_params[param]); 90280304Sjkim gost_params[param] = BUF_strdup(tmp); 91238384Sjkim 92280304Sjkim return 1; 93280304Sjkim} 94