1 /* crypto/evp/evp_lib.c */
   2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
   3  * All rights reserved.
   4  *
   5  * This package is an SSL implementation written
   6  * by Eric Young (eay@cryptsoft.com).
   7  * The implementation was written so as to conform with Netscapes SSL.
   8  *
   9  * This library is free for commercial and non-commercial use as long as
  10  * the following conditions are aheared to.  The following conditions
  11  * apply to all code found in this distribution, be it the RC4, RSA,
  12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
  13  * included with this distribution is covered by the same copyright terms
  14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  15  *
  16  * Copyright remains Eric Young's, and as such any Copyright notices in
  17  * the code are not to be removed.
  18  * If this package is used in a product, Eric Young should be given attribution
  19  * as the author of the parts of the library used.
  20  * This can be in the form of a textual message at program startup or
  21  * in documentation (online or textual) provided with the package.
  22  *
  23  * Redistribution and use in source and binary forms, with or without
  24  * modification, are permitted provided that the following conditions
  25  * are met:
  26  * 1. Redistributions of source code must retain the copyright
  27  *    notice, this list of conditions and the following disclaimer.
  28  * 2. Redistributions in binary form must reproduce the above copyright
  29  *    notice, this list of conditions and the following disclaimer in the
  30  *    documentation and/or other materials provided with the distribution.
  31  * 3. All advertising materials mentioning features or use of this software
  32  *    must display the following acknowledgement:
  33  *    "This product includes cryptographic software written by
  34  *     Eric Young (eay@cryptsoft.com)"
  35  *    The word 'cryptographic' can be left out if the rouines from the library
  36  *    being used are not cryptographic related :-).
  37  * 4. If you include any Windows specific code (or a derivative thereof) from
  38  *    the apps directory (application code) you must include an acknowledgement:
  39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  40  *
  41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51  * SUCH DAMAGE.
  52  *
  53  * The licence and distribution terms for any publically available version or
  54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
  55  * copied and put under another distribution licence
  56  * [including the GNU Public Licence.]
  57  */
  58 
  59 #include <stdio.h>
  60 #include "cryptlib.h"
  61 #include <openssl/evp.h>
  62 #include <openssl/objects.h>
  63 
  64 int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
  65         {
  66         int ret;
  67 
  68         if (c->cipher->set_asn1_parameters != NULL)
  69                 ret=c->cipher->set_asn1_parameters(c,type);
  70         else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
  71                 ret=EVP_CIPHER_set_asn1_iv(c, type);
  72         else
  73                 ret=-1;
  74         return(ret);
  75         }
  76 
  77 int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
  78         {
  79         int ret;
  80 
  81         if (c->cipher->get_asn1_parameters != NULL)
  82                 ret=c->cipher->get_asn1_parameters(c,type);
  83         else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
  84                 ret=EVP_CIPHER_get_asn1_iv(c, type);
  85         else
  86                 ret=-1;
  87         return(ret);
  88         }
  89 
  90 int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
  91         {
  92         int i=0;
  93         unsigned int l;
  94 
  95         if (type != NULL)
  96                 {
  97                 l=EVP_CIPHER_CTX_iv_length(c);
  98                 OPENSSL_assert(l <= sizeof(c->iv));
  99                 i=ASN1_TYPE_get_octetstring(type,c->oiv,l);
 100                 if (i != (int)l)
 101                         return(-1);
 102                 else if (i > 0)
 103                         memcpy(c->iv,c->oiv,l);
 104                 }
 105         return(i);
 106         }
 107 
 108 int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
 109         {
 110         int i=0;
 111         unsigned int j;
 112 
 113         if (type != NULL)
 114                 {
 115                 j=EVP_CIPHER_CTX_iv_length(c);
 116                 OPENSSL_assert(j <= sizeof(c->iv));
 117                 i=ASN1_TYPE_set_octetstring(type,c->oiv,j);
 118                 }
 119         return(i);
 120         }
 121 
 122 /* Convert the various cipher NIDs and dummies to a proper OID NID */
 123 int EVP_CIPHER_type(const EVP_CIPHER *ctx)
 124 {
 125         int nid;
 126         ASN1_OBJECT *otmp;
 127         nid = EVP_CIPHER_nid(ctx);
 128 
 129         switch(nid) {
 130 
 131                 case NID_rc2_cbc:
 132                 case NID_rc2_64_cbc:
 133                 case NID_rc2_40_cbc:
 134 
 135                 return NID_rc2_cbc;
 136 
 137                 case NID_rc4:
 138                 case NID_rc4_40:
 139 
 140                 return NID_rc4;
 141 
 142                 case NID_aes_128_cfb128:
 143                 case NID_aes_128_cfb8:
 144                 case NID_aes_128_cfb1:
 145 
 146                 return NID_aes_128_cfb128;
 147 
 148                 case NID_aes_192_cfb128:
 149                 case NID_aes_192_cfb8:
 150                 case NID_aes_192_cfb1:
 151 
 152                 return NID_aes_192_cfb128;
 153 
 154                 case NID_aes_256_cfb128:
 155                 case NID_aes_256_cfb8:
 156                 case NID_aes_256_cfb1:
 157 
 158                 return NID_aes_256_cfb128;
 159 
 160                 case NID_des_cfb64:
 161                 case NID_des_cfb8:
 162                 case NID_des_cfb1:
 163 
 164                 return NID_des_cfb64;
 165 
 166                 case NID_des_ede3_cfb64:
 167                 case NID_des_ede3_cfb8:
 168                 case NID_des_ede3_cfb1:
 169 
 170                 return NID_des_cfb64;
 171 
 172                 default:
 173                 /* Check it has an OID and it is valid */
 174                 otmp = OBJ_nid2obj(nid);
 175                 if(!otmp || !otmp->data) nid = NID_undef;
 176                 ASN1_OBJECT_free(otmp);
 177                 return nid;
 178         }
 179 }
 180 
 181 int EVP_CIPHER_block_size(const EVP_CIPHER *e)
 182         {
 183         return e->block_size;
 184         }
 185 
 186 int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
 187         {
 188         return ctx->cipher->block_size;
 189         }
 190 
 191 int EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl)
 192         {
 193         return ctx->cipher->do_cipher(ctx,out,in,inl);
 194         }
 195 
 196 const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx)
 197         {
 198         return ctx->cipher;
 199         }
 200 
 201 unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher)
 202         {
 203         return cipher->flags;
 204         }
 205 
 206 unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx)
 207         {
 208         return ctx->cipher->flags;
 209         }
 210 
 211 void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx)
 212         {
 213         return ctx->app_data;
 214         }
 215 
 216 void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
 217         {
 218         ctx->app_data = data;
 219         }
 220 
 221 int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher)
 222         {
 223         return cipher->iv_len;
 224         }
 225 
 226 int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
 227         {
 228         return ctx->cipher->iv_len;
 229         }
 230 
 231 int EVP_CIPHER_key_length(const EVP_CIPHER *cipher)
 232         {
 233         return cipher->key_len;
 234         }
 235 
 236 int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
 237         {
 238         return ctx->key_len;
 239         }
 240 
 241 int EVP_CIPHER_nid(const EVP_CIPHER *cipher)
 242         {
 243         return cipher->nid;
 244         }
 245 
 246 int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx)
 247         {
 248         return ctx->cipher->nid;
 249         }
 250 
 251 int EVP_MD_block_size(const EVP_MD *md)
 252         {
 253         return md->block_size;
 254         }
 255 
 256 int EVP_MD_type(const EVP_MD *md)
 257         {
 258         return md->type;
 259         }
 260 
 261 int EVP_MD_pkey_type(const EVP_MD *md)
 262         {
 263         return md->pkey_type;
 264         }
 265 
 266 int EVP_MD_size(const EVP_MD *md)
 267         {
 268         if (!md)
 269                 {
 270                 EVPerr(EVP_F_EVP_MD_SIZE, EVP_R_MESSAGE_DIGEST_IS_NULL);
 271                 return -1;
 272                 }
 273         return md->md_size;
 274         }
 275 
 276 unsigned long EVP_MD_flags(const EVP_MD *md)
 277         {
 278         return md->flags;
 279         }
 280 
 281 const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx)
 282         {
 283         if (!ctx)
 284                 return NULL;
 285         return ctx->digest;
 286         }
 287 
 288 void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags)
 289         {
 290         ctx->flags |= flags;
 291         }
 292 
 293 void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags)
 294         {
 295         ctx->flags &= ~flags;
 296         }
 297 
 298 int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags)
 299         {
 300         return (ctx->flags & flags);
 301         }
 302 
 303 void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags)
 304         {
 305         ctx->flags |= flags;
 306         }
 307 
 308 void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags)
 309         {
 310         ctx->flags &= ~flags;
 311         }
 312 
 313 int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags)
 314         {
 315         return (ctx->flags & flags);
 316         }