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