LCOV - code coverage report
Current view: top level - third_party/heimdal/lib/hcrypto - evp-hcrypto.c (source / functions) Hit Total Coverage
Test: coverage report for v4-17-test 1498b464 Lines: 50 113 44.2 %
Date: 2024-06-13 04:01:37 Functions: 13 35 37.1 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan
       3             :  * (Royal Institute of Technology, Stockholm, Sweden).
       4             :  * All rights reserved.
       5             :  *
       6             :  * Redistribution and use in source and binary forms, with or without
       7             :  * modification, are permitted provided that the following conditions
       8             :  * are met:
       9             :  *
      10             :  * 1. Redistributions of source code must retain the above copyright
      11             :  *    notice, this list of conditions and the following disclaimer.
      12             :  *
      13             :  * 2. Redistributions in binary form must reproduce the above copyright
      14             :  *    notice, this list of conditions and the following disclaimer in the
      15             :  *    documentation and/or other materials provided with the distribution.
      16             :  *
      17             :  * 3. Neither the name of the Institute nor the names of its contributors
      18             :  *    may be used to endorse or promote products derived from this software
      19             :  *    without specific prior written permission.
      20             :  *
      21             :  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
      22             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      23             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      24             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
      25             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      26             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      27             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      28             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      29             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      30             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      31             :  * SUCH DAMAGE.
      32             :  */
      33             : 
      34             : #include <config.h>
      35             : #include <roken.h>
      36             : 
      37             : #define HC_DEPRECATED
      38             : 
      39             : #include <assert.h>
      40             : 
      41             : #include <evp.h>
      42             : #include <evp-hcrypto.h>
      43             : 
      44             : #include <krb5-types.h>
      45             : 
      46             : #include <des.h>
      47             : #include "camellia.h"
      48             : #include <aes.h>
      49             : 
      50             : #include <rc2.h>
      51             : #include <rc4.h>
      52             : 
      53             : #include <sha.h>
      54             : #include <md2.h>
      55             : #include <md4.h>
      56             : #include <md5.h>
      57             : 
      58             : /*
      59             :  *
      60             :  */
      61             : 
      62             : static int
      63     8885230 : aes_init(EVP_CIPHER_CTX *ctx,
      64             :          const unsigned char * key,
      65             :          const unsigned char * iv,
      66             :          int encp)
      67             : {
      68     8885230 :     AES_KEY *k = ctx->cipher_data;
      69     8885230 :     if (ctx->encrypt || EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_CFB8_MODE)
      70     4698204 :         AES_set_encrypt_key(key, ctx->cipher->key_len * 8, k);
      71             :     else
      72     4187026 :         AES_set_decrypt_key(key, ctx->cipher->key_len * 8, k);
      73     8885230 :     return 1;
      74             : }
      75             : 
      76             : static int
      77    15502205 : aes_do_cipher(EVP_CIPHER_CTX *ctx,
      78             :               unsigned char *out,
      79             :               const unsigned char *in,
      80             :               unsigned int size)
      81             : {
      82    15502205 :     AES_KEY *k = ctx->cipher_data;
      83    15502205 :     if (EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_CFB8_MODE)
      84           0 :         AES_cfb8_encrypt(in, out, size, k, ctx->iv, ctx->encrypt);
      85             :     else
      86    15502205 :         AES_cbc_encrypt(in, out, size, k, ctx->iv, ctx->encrypt);
      87    15502205 :     return 1;
      88             : }
      89             : 
      90             : /**
      91             :  * The AES-128 cipher type (hcrypto)
      92             :  *
      93             :  * @return the AES-128 EVP_CIPHER pointer.
      94             :  *
      95             :  * @ingroup hcrypto_evp
      96             :  */
      97             : 
      98             : const EVP_CIPHER *
      99       23295 : EVP_hcrypto_aes_128_cbc(void)
     100             : {
     101             :     static const EVP_CIPHER aes_128_cbc = {
     102             :         0,
     103             :         16,
     104             :         16,
     105             :         16,
     106             :         EVP_CIPH_CBC_MODE,
     107             :         aes_init,
     108             :         aes_do_cipher,
     109             :         NULL,
     110             :         sizeof(AES_KEY),
     111             :         NULL,
     112             :         NULL,
     113             :         NULL,
     114             :         NULL
     115             :     };
     116             : 
     117       23295 :     return &aes_128_cbc;
     118             : }
     119             : 
     120             : /**
     121             :  * The AES-192 cipher type (hcrypto)
     122             :  *
     123             :  * @return the AES-192 EVP_CIPHER pointer.
     124             :  *
     125             :  * @ingroup hcrypto_evp
     126             :  */
     127             : 
     128             : const EVP_CIPHER *
     129           0 : EVP_hcrypto_aes_192_cbc(void)
     130             : {
     131             :     static const EVP_CIPHER aes_192_cbc = {
     132             :         0,
     133             :         16,
     134             :         24,
     135             :         16,
     136             :         EVP_CIPH_CBC_MODE,
     137             :         aes_init,
     138             :         aes_do_cipher,
     139             :         NULL,
     140             :         sizeof(AES_KEY),
     141             :         NULL,
     142             :         NULL,
     143             :         NULL,
     144             :         NULL
     145             :     };
     146           0 :     return &aes_192_cbc;
     147             : }
     148             : 
     149             : /**
     150             :  * The AES-256 cipher type (hcrypto)
     151             :  *
     152             :  * @return the AES-256 EVP_CIPHER pointer.
     153             :  *
     154             :  * @ingroup hcrypto_evp
     155             :  */
     156             : 
     157             : const EVP_CIPHER *
     158     4674909 : EVP_hcrypto_aes_256_cbc(void)
     159             : {
     160             :     static const EVP_CIPHER aes_256_cbc = {
     161             :         0,
     162             :         16,
     163             :         32,
     164             :         16,
     165             :         EVP_CIPH_CBC_MODE,
     166             :         aes_init,
     167             :         aes_do_cipher,
     168             :         NULL,
     169             :         sizeof(AES_KEY),
     170             :         NULL,
     171             :         NULL,
     172             :         NULL,
     173             :         NULL
     174             :     };
     175     4674909 :     return &aes_256_cbc;
     176             : }
     177             : 
     178             : /**
     179             :  * The AES-128 CFB8 cipher type (hcrypto)
     180             :  *
     181             :  * @return the AES-128 EVP_CIPHER pointer.
     182             :  *
     183             :  * @ingroup hcrypto_evp
     184             :  */
     185             : 
     186             : const EVP_CIPHER *
     187           0 : EVP_hcrypto_aes_128_cfb8(void)
     188             : {
     189             :     static const EVP_CIPHER aes_128_cfb8 = {
     190             :         0,
     191             :         1,
     192             :         16,
     193             :         16,
     194             :         EVP_CIPH_CFB8_MODE,
     195             :         aes_init,
     196             :         aes_do_cipher,
     197             :         NULL,
     198             :         sizeof(AES_KEY),
     199             :         NULL,
     200             :         NULL,
     201             :         NULL,
     202             :         NULL
     203             :     };
     204             : 
     205           0 :     return &aes_128_cfb8;
     206             : }
     207             : 
     208             : /**
     209             :  * The AES-192 CFB8 cipher type (hcrypto)
     210             :  *
     211             :  * @return the AES-192 EVP_CIPHER pointer.
     212             :  *
     213             :  * @ingroup hcrypto_evp
     214             :  */
     215             : 
     216             : const EVP_CIPHER *
     217           0 : EVP_hcrypto_aes_192_cfb8(void)
     218             : {
     219             :     static const EVP_CIPHER aes_192_cfb8 = {
     220             :         0,
     221             :         1,
     222             :         24,
     223             :         16,
     224             :         EVP_CIPH_CFB8_MODE,
     225             :         aes_init,
     226             :         aes_do_cipher,
     227             :         NULL,
     228             :         sizeof(AES_KEY),
     229             :         NULL,
     230             :         NULL,
     231             :         NULL,
     232             :         NULL
     233             :     };
     234           0 :     return &aes_192_cfb8;
     235             : }
     236             : 
     237             : /**
     238             :  * The AES-256 CFB8 cipher type (hcrypto)
     239             :  *
     240             :  * @return the AES-256 EVP_CIPHER pointer.
     241             :  *
     242             :  * @ingroup hcrypto_evp
     243             :  */
     244             : 
     245             : const EVP_CIPHER *
     246           0 : EVP_hcrypto_aes_256_cfb8(void)
     247             : {
     248             :     static const EVP_CIPHER aes_256_cfb8 = {
     249             :         0,
     250             :         1,
     251             :         32,
     252             :         16,
     253             :         EVP_CIPH_CFB8_MODE,
     254             :         aes_init,
     255             :         aes_do_cipher,
     256             :         NULL,
     257             :         sizeof(AES_KEY),
     258             :         NULL,
     259             :         NULL,
     260             :         NULL,
     261             :         NULL
     262             :     };
     263           0 :     return &aes_256_cfb8;
     264             : }
     265             : 
     266             : /**
     267             :  * The message digest SHA256 - hcrypto
     268             :  *
     269             :  * @return the message digest type.
     270             :  *
     271             :  * @ingroup hcrypto_evp
     272             :  */
     273             : 
     274             : const EVP_MD *
     275           0 : EVP_hcrypto_sha256(void)
     276             : {
     277             :     static const struct hc_evp_md sha256 = {
     278             :         32,
     279             :         64,
     280             :         sizeof(SHA256_CTX),
     281             :         (hc_evp_md_init)SHA256_Init,
     282             :         (hc_evp_md_update)SHA256_Update,
     283             :         (hc_evp_md_final)SHA256_Final,
     284             :         NULL
     285             :     };
     286           0 :     return &sha256;
     287             : }
     288             : 
     289             : /**
     290             :  * The message digest SHA384 - hcrypto
     291             :  *
     292             :  * @return the message digest type.
     293             :  *
     294             :  * @ingroup hcrypto_evp
     295             :  */
     296             : 
     297             : const EVP_MD *
     298           0 : EVP_hcrypto_sha384(void)
     299             : {
     300             :     static const struct hc_evp_md sha384 = {
     301             :         48,
     302             :         128,
     303             :         sizeof(SHA384_CTX),
     304             :         (hc_evp_md_init)SHA384_Init,
     305             :         (hc_evp_md_update)SHA384_Update,
     306             :         (hc_evp_md_final)SHA384_Final,
     307             :         NULL
     308             :     };
     309           0 :     return &sha384;
     310             : }
     311             : 
     312             : /**
     313             :  * The message digest SHA512 - hcrypto
     314             :  *
     315             :  * @return the message digest type.
     316             :  *
     317             :  * @ingroup hcrypto_evp
     318             :  */
     319             : 
     320             : const EVP_MD *
     321           0 : EVP_hcrypto_sha512(void)
     322             : {
     323             :     static const struct hc_evp_md sha512 = {
     324             :         64,
     325             :         128,
     326             :         sizeof(SHA512_CTX),
     327             :         (hc_evp_md_init)SHA512_Init,
     328             :         (hc_evp_md_update)SHA512_Update,
     329             :         (hc_evp_md_final)SHA512_Final,
     330             :         NULL
     331             :     };
     332           0 :     return &sha512;
     333             : }
     334             : 
     335             : /**
     336             :  * The message digest SHA1 - hcrypto
     337             :  *
     338             :  * @return the message digest type.
     339             :  *
     340             :  * @ingroup hcrypto_evp
     341             :  */
     342             : 
     343             : const EVP_MD *
     344     4480053 : EVP_hcrypto_sha1(void)
     345             : {
     346             :     static const struct hc_evp_md sha1 = {
     347             :         20,
     348             :         64,
     349             :         sizeof(SHA_CTX),
     350             :         (hc_evp_md_init)SHA1_Init,
     351             :         (hc_evp_md_update)SHA1_Update,
     352             :         (hc_evp_md_final)SHA1_Final,
     353             :         NULL
     354             :     };
     355     4480053 :     return &sha1;
     356             : }
     357             : 
     358             : /**
     359             :  * The message digest MD5 - hcrypto
     360             :  *
     361             :  * @return the message digest type.
     362             :  *
     363             :  * @ingroup hcrypto_evp
     364             :  */
     365             : 
     366             : const EVP_MD *
     367     2075355 : EVP_hcrypto_md5(void)
     368             : {
     369             :     static const struct hc_evp_md md5 = {
     370             :         16,
     371             :         64,
     372             :         sizeof(MD5_CTX),
     373             :         (hc_evp_md_init)MD5_Init,
     374             :         (hc_evp_md_update)MD5_Update,
     375             :         (hc_evp_md_final)MD5_Final,
     376             :         NULL
     377             :     };
     378     2075355 :     return &md5;
     379             : }
     380             : 
     381             : /**
     382             :  * The message digest MD4 - hcrypto
     383             :  *
     384             :  * @return the message digest type.
     385             :  *
     386             :  * @ingroup hcrypto_evp
     387             :  */
     388             : 
     389             : const EVP_MD *
     390        1181 : EVP_hcrypto_md4(void)
     391             : {
     392             :     static const struct hc_evp_md md4 = {
     393             :         16,
     394             :         64,
     395             :         sizeof(MD4_CTX),
     396             :         (hc_evp_md_init)MD4_Init,
     397             :         (hc_evp_md_update)MD4_Update,
     398             :         (hc_evp_md_final)MD4_Final,
     399             :         NULL
     400             :     };
     401        1181 :     return &md4;
     402             : }
     403             : 
     404             : /**
     405             :  * The message digest MD2 - hcrypto
     406             :  *
     407             :  * @return the message digest type.
     408             :  *
     409             :  * @ingroup hcrypto_evp
     410             :  */
     411             : 
     412             : const EVP_MD *
     413           0 : EVP_hcrypto_md2(void)
     414             : {
     415             :     static const struct hc_evp_md md2 = {
     416             :         16,
     417             :         16,
     418             :         sizeof(MD2_CTX),
     419             :         (hc_evp_md_init)MD2_Init,
     420             :         (hc_evp_md_update)MD2_Update,
     421             :         (hc_evp_md_final)MD2_Final,
     422             :         NULL
     423             :     };
     424           0 :     return &md2;
     425             : }
     426             : 
     427             : /*
     428             :  *
     429             :  */
     430             : 
     431             : static int
     432           0 : des_cbc_init(EVP_CIPHER_CTX *ctx,
     433             :              const unsigned char * key,
     434             :              const unsigned char * iv,
     435             :              int encp)
     436             : {
     437           0 :     DES_key_schedule *k = ctx->cipher_data;
     438             :     DES_cblock deskey;
     439           0 :     memcpy(&deskey, key, sizeof(deskey));
     440           0 :     DES_set_key_unchecked(&deskey, k);
     441           0 :     return 1;
     442             : }
     443             : 
     444             : static int
     445           0 : des_cbc_do_cipher(EVP_CIPHER_CTX *ctx,
     446             :                   unsigned char *out,
     447             :                   const unsigned char *in,
     448             :                   unsigned int size)
     449             : {
     450           0 :     DES_key_schedule *k = ctx->cipher_data;
     451           0 :     DES_cbc_encrypt(in, out, size,
     452           0 :                     k, (DES_cblock *)ctx->iv, ctx->encrypt);
     453           0 :     return 1;
     454             : }
     455             : 
     456             : /**
     457             :  * The DES cipher type
     458             :  *
     459             :  * @return the DES-CBC EVP_CIPHER pointer.
     460             :  *
     461             :  * @ingroup hcrypto_evp
     462             :  */
     463             : 
     464             : const EVP_CIPHER *
     465           0 : EVP_hcrypto_des_cbc(void)
     466             : {
     467             :     static const EVP_CIPHER des_cbc = {
     468             :         0,
     469             :         8,
     470             :         8,
     471             :         8,
     472             :         EVP_CIPH_CBC_MODE,
     473             :         des_cbc_init,
     474             :         des_cbc_do_cipher,
     475             :         NULL,
     476             :         sizeof(DES_key_schedule),
     477             :         NULL,
     478             :         NULL,
     479             :         NULL,
     480             :         NULL
     481             :     };
     482           0 :     return &des_cbc;
     483             : }
     484             : 
     485             : /*
     486             :  *
     487             :  */
     488             : 
     489             : struct des_ede3_cbc {
     490             :     DES_key_schedule ks[3];
     491             : };
     492             : 
     493             : static int
     494       21874 : des_ede3_cbc_init(EVP_CIPHER_CTX *ctx,
     495             :                   const unsigned char * key,
     496             :                   const unsigned char * iv,
     497             :                   int encp)
     498             : {
     499       21874 :     struct des_ede3_cbc *k = ctx->cipher_data;
     500             :     DES_cblock deskey;
     501             : 
     502       21874 :     memcpy(&deskey, key, sizeof(deskey));
     503       21874 :     DES_set_odd_parity(&deskey);
     504       21874 :     DES_set_key_unchecked(&deskey, &k->ks[0]);
     505             : 
     506       21874 :     memcpy(&deskey, key + 8, sizeof(deskey));
     507       21874 :     DES_set_odd_parity(&deskey);
     508       21874 :     DES_set_key_unchecked(&deskey, &k->ks[1]);
     509             : 
     510       21874 :     memcpy(&deskey, key + 16, sizeof(deskey));
     511       21874 :     DES_set_odd_parity(&deskey);
     512       21874 :     DES_set_key_unchecked(&deskey, &k->ks[2]);
     513             : 
     514       21874 :     return 1;
     515             : }
     516             : 
     517             : static int
     518       21874 : des_ede3_cbc_do_cipher(EVP_CIPHER_CTX *ctx,
     519             :                        unsigned char *out,
     520             :                        const unsigned char *in,
     521             :                        unsigned int size)
     522             : {
     523       21874 :     struct des_ede3_cbc *k = ctx->cipher_data;
     524       43748 :     DES_ede3_cbc_encrypt(in, out, size,
     525             :                          &k->ks[0], &k->ks[1], &k->ks[2],
     526       21874 :                          (DES_cblock *)ctx->iv, ctx->encrypt);
     527       21874 :     return 1;
     528             : }
     529             : 
     530             : /**
     531             :  * The triple DES cipher type - hcrypto
     532             :  *
     533             :  * @return the DES-EDE3-CBC EVP_CIPHER pointer.
     534             :  *
     535             :  * @ingroup hcrypto_evp
     536             :  */
     537             : 
     538             : const EVP_CIPHER *
     539       10937 : EVP_hcrypto_des_ede3_cbc(void)
     540             : {
     541             :     static const EVP_CIPHER des_ede3_cbc = {
     542             :         0,
     543             :         8,
     544             :         24,
     545             :         8,
     546             :         EVP_CIPH_CBC_MODE,
     547             :         des_ede3_cbc_init,
     548             :         des_ede3_cbc_do_cipher,
     549             :         NULL,
     550             :         sizeof(struct des_ede3_cbc),
     551             :         NULL,
     552             :         NULL,
     553             :         NULL,
     554             :         NULL
     555             :     };
     556       10937 :     return &des_ede3_cbc;
     557             : }
     558             : 
     559             : /*
     560             :  *
     561             :  */
     562             : 
     563             : struct rc2_cbc {
     564             :     unsigned int maximum_effective_key;
     565             :     RC2_KEY key;
     566             : };
     567             : 
     568             : static int
     569           0 : rc2_init(EVP_CIPHER_CTX *ctx,
     570             :          const unsigned char * key,
     571             :          const unsigned char * iv,
     572             :          int encp)
     573             : {
     574           0 :     struct rc2_cbc *k = ctx->cipher_data;
     575           0 :     k->maximum_effective_key = EVP_CIPHER_CTX_key_length(ctx) * 8;
     576           0 :     RC2_set_key(&k->key,
     577           0 :                 EVP_CIPHER_CTX_key_length(ctx),
     578             :                 key,
     579           0 :                 k->maximum_effective_key);
     580           0 :     return 1;
     581             : }
     582             : 
     583             : static int
     584           0 : rc2_do_cipher(EVP_CIPHER_CTX *ctx,
     585             :               unsigned char *out,
     586             :               const unsigned char *in,
     587             :               unsigned int size)
     588             : {
     589           0 :     struct rc2_cbc *k = ctx->cipher_data;
     590           0 :     RC2_cbc_encrypt(in, out, size, &k->key, ctx->iv, ctx->encrypt);
     591           0 :     return 1;
     592             : }
     593             : 
     594             : /**
     595             :  * The RC2 cipher type - hcrypto
     596             :  *
     597             :  * @return the RC2 EVP_CIPHER pointer.
     598             :  *
     599             :  * @ingroup hcrypto_evp
     600             :  */
     601             : 
     602             : const EVP_CIPHER *
     603           0 : EVP_hcrypto_rc2_cbc(void)
     604             : {
     605             :     static const EVP_CIPHER rc2_cbc = {
     606             :         0,
     607             :         RC2_BLOCK_SIZE,
     608             :         RC2_KEY_LENGTH,
     609             :         RC2_BLOCK_SIZE,
     610             :         EVP_CIPH_CBC_MODE|EVP_CIPH_VARIABLE_LENGTH,
     611             :         rc2_init,
     612             :         rc2_do_cipher,
     613             :         NULL,
     614             :         sizeof(struct rc2_cbc),
     615             :         NULL,
     616             :         NULL,
     617             :         NULL,
     618             :         NULL
     619             :     };
     620           0 :     return &rc2_cbc;
     621             : }
     622             : 
     623             : /**
     624             :  * The RC2-40 cipher type
     625             :  *
     626             :  * @return the RC2-40 EVP_CIPHER pointer.
     627             :  *
     628             :  * @ingroup hcrypto_evp
     629             :  */
     630             : 
     631             : const EVP_CIPHER *
     632           0 : EVP_hcrypto_rc2_40_cbc(void)
     633             : {
     634             :     static const EVP_CIPHER rc2_40_cbc = {
     635             :         0,
     636             :         RC2_BLOCK_SIZE,
     637             :         5,
     638             :         RC2_BLOCK_SIZE,
     639             :         EVP_CIPH_CBC_MODE,
     640             :         rc2_init,
     641             :         rc2_do_cipher,
     642             :         NULL,
     643             :         sizeof(struct rc2_cbc),
     644             :         NULL,
     645             :         NULL,
     646             :         NULL,
     647             :         NULL
     648             :     };
     649           0 :     return &rc2_40_cbc;
     650             : }
     651             : 
     652             : /**
     653             :  * The RC2-64 cipher type
     654             :  *
     655             :  * @return the RC2-64 EVP_CIPHER pointer.
     656             :  *
     657             :  * @ingroup hcrypto_evp
     658             :  */
     659             : 
     660             : const EVP_CIPHER *
     661           0 : EVP_hcrypto_rc2_64_cbc(void)
     662             : {
     663             :     static const EVP_CIPHER rc2_64_cbc = {
     664             :         0,
     665             :         RC2_BLOCK_SIZE,
     666             :         8,
     667             :         RC2_BLOCK_SIZE,
     668             :         EVP_CIPH_CBC_MODE,
     669             :         rc2_init,
     670             :         rc2_do_cipher,
     671             :         NULL,
     672             :         sizeof(struct rc2_cbc),
     673             :         NULL,
     674             :         NULL,
     675             :         NULL,
     676             :         NULL
     677             :     };
     678           0 :     return &rc2_64_cbc;
     679             : }
     680             : 
     681             : static int
     682           0 : camellia_init(EVP_CIPHER_CTX *ctx,
     683             :          const unsigned char * key,
     684             :          const unsigned char * iv,
     685             :          int encp)
     686             : {
     687           0 :     CAMELLIA_KEY *k = ctx->cipher_data;
     688           0 :     k->bits = ctx->cipher->key_len * 8;
     689           0 :     CAMELLIA_set_key(key, ctx->cipher->key_len * 8, k);
     690           0 :     return 1;
     691             : }
     692             : 
     693             : static int
     694           0 : camellia_do_cipher(EVP_CIPHER_CTX *ctx,
     695             :               unsigned char *out,
     696             :               const unsigned char *in,
     697             :               unsigned int size)
     698             : {
     699           0 :     CAMELLIA_KEY *k = ctx->cipher_data;
     700           0 :     CAMELLIA_cbc_encrypt(in, out, size, k, ctx->iv, ctx->encrypt);
     701           0 :     return 1;
     702             : }
     703             : 
     704             : /**
     705             :  * The Camellia-128 cipher type - hcrypto
     706             :  *
     707             :  * @return the Camellia-128 EVP_CIPHER pointer.
     708             :  *
     709             :  * @ingroup hcrypto_evp
     710             :  */
     711             : 
     712             : const EVP_CIPHER *
     713           0 : EVP_hcrypto_camellia_128_cbc(void)
     714             : {
     715             :     static const EVP_CIPHER cipher = {
     716             :         0,
     717             :         16,
     718             :         16,
     719             :         16,
     720             :         EVP_CIPH_CBC_MODE,
     721             :         camellia_init,
     722             :         camellia_do_cipher,
     723             :         NULL,
     724             :         sizeof(CAMELLIA_KEY),
     725             :         NULL,
     726             :         NULL,
     727             :         NULL,
     728             :         NULL
     729             :     };
     730           0 :     return &cipher;
     731             : }
     732             : 
     733             : /**
     734             :  * The Camellia-198 cipher type - hcrypto
     735             :  *
     736             :  * @return the Camellia-198 EVP_CIPHER pointer.
     737             :  *
     738             :  * @ingroup hcrypto_evp
     739             :  */
     740             : 
     741             : const EVP_CIPHER *
     742           0 : EVP_hcrypto_camellia_192_cbc(void)
     743             : {
     744             :     static const EVP_CIPHER cipher = {
     745             :         0,
     746             :         16,
     747             :         24,
     748             :         16,
     749             :         EVP_CIPH_CBC_MODE,
     750             :         camellia_init,
     751             :         camellia_do_cipher,
     752             :         NULL,
     753             :         sizeof(CAMELLIA_KEY),
     754             :         NULL,
     755             :         NULL,
     756             :         NULL,
     757             :         NULL
     758             :     };
     759           0 :     return &cipher;
     760             : }
     761             : 
     762             : /**
     763             :  * The Camellia-256 cipher type - hcrypto
     764             :  *
     765             :  * @return the Camellia-256 EVP_CIPHER pointer.
     766             :  *
     767             :  * @ingroup hcrypto_evp
     768             :  */
     769             : 
     770             : const EVP_CIPHER *
     771           0 : EVP_hcrypto_camellia_256_cbc(void)
     772             : {
     773             :     static const EVP_CIPHER cipher = {
     774             :         0,
     775             :         16,
     776             :         32,
     777             :         16,
     778             :         EVP_CIPH_CBC_MODE,
     779             :         camellia_init,
     780             :         camellia_do_cipher,
     781             :         NULL,
     782             :         sizeof(CAMELLIA_KEY),
     783             :         NULL,
     784             :         NULL,
     785             :         NULL,
     786             :         NULL
     787             :     };
     788           0 :     return &cipher;
     789             : }
     790             : 
     791             : static int
     792      637721 : rc4_init(EVP_CIPHER_CTX *ctx,
     793             :          const unsigned char *key,
     794             :          const unsigned char *iv,
     795             :          int enc)
     796             : {
     797      637721 :     RC4_KEY *k = ctx->cipher_data;
     798      637721 :     RC4_set_key(k, ctx->key_len, key);
     799      637721 :     return 1;
     800             : }
     801             : 
     802             : static int
     803      422562 : rc4_do_cipher(EVP_CIPHER_CTX *ctx,
     804             :               unsigned char *out,
     805             :               const unsigned char *in,
     806             :               unsigned int size)
     807             : {
     808      422562 :     RC4_KEY *k = ctx->cipher_data;
     809      422562 :     RC4(k, size, in, out);
     810      422562 :     return 1;
     811             : }
     812             : 
     813             : const EVP_CIPHER *
     814      463208 : EVP_hcrypto_rc4(void)
     815             : {
     816             :     static const EVP_CIPHER rc4 = {
     817             :         0,
     818             :         1,
     819             :         16,
     820             :         0,
     821             :         EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH,
     822             :         rc4_init,
     823             :         rc4_do_cipher,
     824             :         NULL,
     825             :         sizeof(RC4_KEY),
     826             :         NULL,
     827             :         NULL,
     828             :         NULL,
     829             :         NULL
     830             :     };
     831      463208 :     return &rc4;
     832             : }
     833             : 
     834             : 
     835             : const EVP_CIPHER *
     836           0 : EVP_hcrypto_rc4_40(void)
     837             : {
     838             :     static const EVP_CIPHER rc4_40 = {
     839             :         0,
     840             :         1,
     841             :         5,
     842             :         0,
     843             :         EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH,
     844             :         rc4_init,
     845             :         rc4_do_cipher,
     846             :         NULL,
     847             :         sizeof(RC4_KEY),
     848             :         NULL,
     849             :         NULL,
     850             :         NULL,
     851             :         NULL
     852             :     };
     853           0 :     return &rc4_40;
     854             : }

Generated by: LCOV version 1.13