New utility 'pkeyutl' a general purpose version of 'rsautl'.
[openssl.git] / crypto / evp / evp_locl.h
index d3a626003f76ba552bc537abb46651426856961b..39930b96694e5a0396625dc11bf7fa06bba943e3 100644 (file)
 /* Wrapper functions for each cipher mode */
 
 #define BLOCK_CIPHER_ecb_loop() \
-       unsigned int i; \
-       if(inl < 8) return 1;\
-       inl -= 8; \
-       for(i=0; i <= inl; i+=8) \
+       unsigned int i, bl; \
+       bl = ctx->cipher->block_size;\
+       if(inl < bl) return 1;\
+       inl -= bl; \
+       for(i=0; i <= inl; i+=bl) \
 
-#define BLOCK_CIPHER_func_ecb(cname, cprefix, kname) \
-static int cname##_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, unsigned char *in, unsigned int inl) \
+#define BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \
+static int cname##_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
 {\
        BLOCK_CIPHER_ecb_loop() \
-               cprefix##_ecb_encrypt(in + i, out + i, &ctx->c.##kname, ctx->encrypt);\
+               cprefix##_ecb_encrypt(in + i, out + i, &((kstruct *)ctx->cipher_data)->ksched, ctx->encrypt);\
        return 1;\
 }
 
-#define BLOCK_CIPHER_func_ofb(cname, cprefix, kname) \
-static int cname##_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, unsigned char *in, unsigned int inl) \
+#define BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched) \
+static int cname##_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
 {\
-       cprefix##_ofb64_encrypt(in, out, (long)inl, &ctx->c.##kname, ctx->iv, &ctx->num);\
+       cprefix##_ofb##cbits##_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num);\
        return 1;\
 }
 
-#define BLOCK_CIPHER_func_cbc(cname, cprefix, kname) \
-static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, unsigned char *in, unsigned int inl) \
+#define BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \
+static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
 {\
-       cprefix##_cbc_encrypt(in, out, (long)inl, &ctx->c.##kname, ctx->iv, ctx->encrypt);\
+       cprefix##_cbc_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, ctx->encrypt);\
        return 1;\
 }
 
-#define BLOCK_CIPHER_func_cfb(cname, cprefix, kname) \
-static int cname##_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, unsigned char *in, unsigned int inl) \
+#define BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \
+static int cname##_cfb##cbits##_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
 {\
-       cprefix##_cfb64_encrypt(in, out, (long)inl, &ctx->c.##kname, ctx->iv, &ctx->num, ctx->encrypt);\
+       cprefix##_cfb##cbits##_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\
        return 1;\
 }
 
-#define BLOCK_CIPHER_all_funcs(cname, cprefix, kname) \
-       BLOCK_CIPHER_func_cbc(cname, cprefix, kname) \
-       BLOCK_CIPHER_func_cfb(cname, cprefix, kname) \
-       BLOCK_CIPHER_func_ecb(cname, cprefix, kname) \
-       BLOCK_CIPHER_func_ofb(cname, cprefix, kname)
+#define BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \
+       BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \
+       BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \
+       BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \
+       BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched)
 
+#define BLOCK_CIPHER_def1(cname, nmode, mode, MODE, kstruct, nid, block_size, \
+                         key_len, iv_len, flags, init_key, cleanup, \
+                         set_asn1, get_asn1, ctrl) \
+static const EVP_CIPHER cname##_##mode = { \
+       nid##_##nmode, block_size, key_len, iv_len, \
+       flags | EVP_CIPH_##MODE##_MODE, \
+       init_key, \
+       cname##_##mode##_cipher, \
+       cleanup, \
+       sizeof(kstruct), \
+       set_asn1, get_asn1,\
+       ctrl, \
+       NULL \
+}; \
+const EVP_CIPHER *EVP_##cname##_##mode(void) { return &cname##_##mode; }
+
+#define BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, \
+                            iv_len, flags, init_key, cleanup, set_asn1, \
+                            get_asn1, ctrl) \
+BLOCK_CIPHER_def1(cname, cbc, cbc, CBC, kstruct, nid, block_size, key_len, \
+                 iv_len, flags, init_key, cleanup, set_asn1, get_asn1, ctrl)
+
+#define BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, \
+                            iv_len, cbits, flags, init_key, cleanup, \
+                            set_asn1, get_asn1, ctrl) \
+BLOCK_CIPHER_def1(cname, cfb##cbits, cfb##cbits, CFB, kstruct, nid, 1, \
+                 key_len, iv_len, flags, init_key, cleanup, set_asn1, \
+                 get_asn1, ctrl)
+
+#define BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, \
+                            iv_len, cbits, flags, init_key, cleanup, \
+                            set_asn1, get_asn1, ctrl) \
+BLOCK_CIPHER_def1(cname, ofb##cbits, ofb, OFB, kstruct, nid, 1, \
+                 key_len, iv_len, flags, init_key, cleanup, set_asn1, \
+                 get_asn1, ctrl)
+
+#define BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, \
+                            iv_len, flags, init_key, cleanup, set_asn1, \
+                            get_asn1, ctrl) \
+BLOCK_CIPHER_def1(cname, ecb, ecb, ECB, kstruct, nid, block_size, key_len, \
+                 iv_len, flags, init_key, cleanup, set_asn1, get_asn1, ctrl)
+
+#define BLOCK_CIPHER_defs(cname, kstruct, \
+                         nid, block_size, key_len, iv_len, cbits, flags, \
+                         init_key, cleanup, set_asn1, get_asn1, ctrl) \
+BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, iv_len, flags, \
+                    init_key, cleanup, set_asn1, get_asn1, ctrl) \
+BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, iv_len, cbits, \
+                    flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \
+BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, iv_len, cbits, \
+                    flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \
+BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, iv_len, flags, \
+                    init_key, cleanup, set_asn1, get_asn1, ctrl)
+
+
+/*
 #define BLOCK_CIPHER_defs(cname, kstruct, \
                                nid, block_size, key_len, iv_len, flags,\
                                 init_key, cleanup, set_asn1, get_asn1, ctrl)\
-static EVP_CIPHER cname##_cbc = {\
+static const EVP_CIPHER cname##_cbc = {\
        nid##_cbc, block_size, key_len, iv_len, \
        flags | EVP_CIPH_CBC_MODE,\
        init_key,\
        cname##_cbc_cipher,\
        cleanup,\
        sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
-               sizeof((((EVP_CIPHER_CTX *)NULL)->c.##kstruct)),\
+               sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
        set_asn1, get_asn1,\
        ctrl, \
        NULL \
 };\
-EVP_CIPHER *EVP_##cname##_cbc(void) { return &cname##_cbc; }\
-static EVP_CIPHER cname##_cfb = {\
+const EVP_CIPHER *EVP_##cname##_cbc(void) { return &cname##_cbc; }\
+static const EVP_CIPHER cname##_cfb = {\
        nid##_cfb64, 1, key_len, iv_len, \
        flags | EVP_CIPH_CFB_MODE,\
        init_key,\
        cname##_cfb_cipher,\
        cleanup,\
        sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
-               sizeof((((EVP_CIPHER_CTX *)NULL)->c.##kstruct)),\
+               sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
        set_asn1, get_asn1,\
        ctrl,\
        NULL \
 };\
-EVP_CIPHER *EVP_##cname##_cfb(void) { return &cname##_cfb; }\
-static EVP_CIPHER cname##_ofb = {\
+const EVP_CIPHER *EVP_##cname##_cfb(void) { return &cname##_cfb; }\
+static const EVP_CIPHER cname##_ofb = {\
        nid##_ofb64, 1, key_len, iv_len, \
        flags | EVP_CIPH_OFB_MODE,\
        init_key,\
        cname##_ofb_cipher,\
        cleanup,\
        sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
-               sizeof((((EVP_CIPHER_CTX *)NULL)->c.##kstruct)),\
+               sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
        set_asn1, get_asn1,\
        ctrl,\
        NULL \
 };\
-EVP_CIPHER *EVP_##cname##_ofb(void) { return &cname##_ofb; }\
-static EVP_CIPHER cname##_ecb = {\
+const EVP_CIPHER *EVP_##cname##_ofb(void) { return &cname##_ofb; }\
+static const EVP_CIPHER cname##_ecb = {\
        nid##_ecb, block_size, key_len, iv_len, \
        flags | EVP_CIPH_ECB_MODE,\
        init_key,\
        cname##_ecb_cipher,\
        cleanup,\
        sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
-               sizeof((((EVP_CIPHER_CTX *)NULL)->c.##kstruct)),\
+               sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
        set_asn1, get_asn1,\
        ctrl,\
        NULL \
 };\
-EVP_CIPHER *EVP_##cname##_ecb(void) { return &cname##_ecb; }
+const EVP_CIPHER *EVP_##cname##_ecb(void) { return &cname##_ecb; }
+*/
+
+#define IMPLEMENT_BLOCK_CIPHER(cname, ksched, cprefix, kstruct, nid, \
+                              block_size, key_len, iv_len, cbits, \
+                              flags, init_key, \
+                              cleanup, set_asn1, get_asn1, ctrl) \
+       BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \
+       BLOCK_CIPHER_defs(cname, kstruct, nid, block_size, key_len, iv_len, \
+                         cbits, flags, init_key, cleanup, set_asn1, \
+                         get_asn1, ctrl)
+
+#define EVP_C_DATA(kstruct, ctx)       ((kstruct *)(ctx)->cipher_data)
+
+#define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len) \
+       BLOCK_CIPHER_func_cfb(cipher##_##keysize,cprefix,cbits,kstruct,ksched) \
+       BLOCK_CIPHER_def_cfb(cipher##_##keysize,kstruct, \
+                            NID_##cipher##_##keysize, keysize/8, iv_len, cbits, \
+                            0, cipher##_init_key, NULL, \
+                            EVP_CIPHER_set_asn1_iv, \
+                            EVP_CIPHER_get_asn1_iv, \
+                            NULL)
+
+
+struct evp_pkey_ctx_st
+       {
+       /* Method associated with this operation */
+       const EVP_PKEY_METHOD *pmeth;
+       /* Key: may be NULL */
+       EVP_PKEY *pkey;
+       /* Actual operation */
+       int operation;
+       /* Algorithm specific data */
+       void *data;
+       } /* EVP_PKEY_CTX */;
+
+struct evp_pkey_method_st
+       {
+       int pkey_id;
+       int flags;
+       int (*init)(EVP_PKEY_CTX *ctx);
+
+       int (*paramgen_init)(EVP_PKEY_CTX *ctx);
+       int (*paramgen)(EVP_PKEY_CTX *ctx);
+
+       int (*keygen_init)(EVP_PKEY_CTX *ctx);
+       int (*keygen)(EVP_PKEY_CTX *ctx);
+
+       int (*sign_init)(EVP_PKEY_CTX *ctx);
+       int (*sign)(EVP_PKEY_CTX *ctx, unsigned char *sig, int *siglen,
+                                       unsigned char *tbs, int tbslen);
+
+       int (*verify_init)(EVP_PKEY_CTX *ctx);
+       int (*verify)(EVP_PKEY_CTX *ctx, unsigned char *sig, int siglen,
+                                       unsigned char *tbs, int tbslen);
+
+       int (*verify_recover_init)(EVP_PKEY_CTX *ctx);
+       int (*verify_recover)(EVP_PKEY_CTX *ctx,
+                                       unsigned char *rout, int *routlen,
+                                       unsigned char *sig, int siglen);
+
+       int (*signctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx);
+       int (*signctx)(EVP_PKEY_CTX *ctx, unsigned char *sig, int *siglen,
+                                       EVP_MD_CTX *mctx);
+
+       int (*verifyctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx);
+       int (*verifyctx)(EVP_PKEY_CTX *ctx, unsigned char *sig, int siglen,
+                                       EVP_MD_CTX *mctx);
+
+       int (*encrypt_init)(EVP_PKEY_CTX *ctx);
+       int (*encrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, int *outlen,
+                                       unsigned char *in, int inlen);
 
+       int (*decrypt_init)(EVP_PKEY_CTX *ctx);
+       int (*decrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, int *outlen,
+                                       unsigned char *in, int inlen);
 
+       int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2);
+       int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value);
 
-#define IMPLEMENT_BLOCK_CIPHER(cname, kname, cprefix, kstruct, \
-                               nid, block_size, key_len, iv_len, flags, \
-                                init_key, cleanup, set_asn1, get_asn1, ctrl) \
-       BLOCK_CIPHER_all_funcs(cname, cprefix, kname) \
-       BLOCK_CIPHER_defs(cname, kstruct, nid, block_size, key_len, iv_len, flags,\
-                init_key, cleanup, set_asn1, get_asn1, ctrl) 
+       void (*cleanup)(EVP_PKEY_CTX *ctx);
 
+       } /* EVP_PKEY_METHOD */;