int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
{
switch (type) {
+#if 0
case EVP_CTRL_INIT:
{
struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
}
return gost_cipher_set_param(c, arg);
}
+#endif
case EVP_CTRL_RAND_KEY:
{
if (RAND_bytes((unsigned char *)ptr, ctx->key_len) <= 0) {
return 0;
}
+ case EVP_CTRL_SET_SBOX:
+ if (ptr) {
+ struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
+ int nid;
+ int cur_meshing;
+ int ret;
+
+ if (c == NULL) {
+ return -1;
+ }
+
+ if (c->count != 0) {
+ return -1;
+ }
+
+ nid = OBJ_txt2nid(ptr);
+ if (nid == NID_undef) {
+ return 0;
+ }
+
+ cur_meshing = c->key_meshing;
+ ret = gost_cipher_set_param(c, nid);
+ c->key_meshing = cur_meshing;
+ return ret;
+ } else {
+ return 0;
+ }
+ case EVP_CTRL_KEY_MESH:
+ {
+ struct ossl_gost_cipher_ctx *c = ctx->cipher_data;
+
+ if (c == NULL) {
+ return -1;
+ }
+
+ if (c->count != 0) {
+ return -1;
+ }
+
+ c->key_meshing = arg;
+ return 1;
+ }
default:
GOSTerr(GOST_F_GOST_CIPHER_CTL,
GOST_R_UNSUPPORTED_CIPHER_CTL_COMMAND);