root/source4/heimdal/lib/hcrypto/aes.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. AES_set_encrypt_key
  2. AES_set_decrypt_key
  3. AES_encrypt
  4. AES_decrypt
  5. AES_cbc_encrypt

   1 /*
   2  * Copyright (c) 2003 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 #ifdef HAVE_CONFIG_H
  35 #include "config.h"
  36 
  37 RCSID("$Id$");
  38 #endif
  39 
  40 #ifdef KRB5
  41 #include <krb5-types.h>
  42 #endif
  43 
  44 #include <string.h>
  45 
  46 #include "rijndael-alg-fst.h"
  47 #include "aes.h"
  48 
  49 int
  50 AES_set_encrypt_key(const unsigned char *userkey, const int bits, AES_KEY *key)
     /* [<][>][^][v][top][bottom][index][help] */
  51 {
  52     key->rounds = rijndaelKeySetupEnc(key->key, userkey, bits);
  53     if (key->rounds == 0)
  54         return -1;
  55     return 0;
  56 }
  57 
  58 int
  59 AES_set_decrypt_key(const unsigned char *userkey, const int bits, AES_KEY *key)
     /* [<][>][^][v][top][bottom][index][help] */
  60 {
  61     key->rounds = rijndaelKeySetupDec(key->key, userkey, bits);
  62     if (key->rounds == 0)
  63         return -1;
  64     return 0;
  65 }
  66 
  67 void
  68 AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key)
     /* [<][>][^][v][top][bottom][index][help] */
  69 {
  70     rijndaelEncrypt(key->key, key->rounds, in, out);
  71 }
  72 
  73 void
  74 AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key)
     /* [<][>][^][v][top][bottom][index][help] */
  75 {
  76     rijndaelDecrypt(key->key, key->rounds, in, out);
  77 }
  78 
  79 void
  80 AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
     /* [<][>][^][v][top][bottom][index][help] */
  81                 unsigned long size, const AES_KEY *key,
  82                 unsigned char *iv, int forward_encrypt)
  83 {
  84     unsigned char tmp[AES_BLOCK_SIZE];
  85     int i;
  86 
  87     if (forward_encrypt) {
  88         while (size >= AES_BLOCK_SIZE) {
  89             for (i = 0; i < AES_BLOCK_SIZE; i++)
  90                 tmp[i] = in[i] ^ iv[i];
  91             AES_encrypt(tmp, out, key);
  92             memcpy(iv, out, AES_BLOCK_SIZE);
  93             size -= AES_BLOCK_SIZE;
  94             in += AES_BLOCK_SIZE;
  95             out += AES_BLOCK_SIZE;
  96         }
  97         if (size) {
  98             for (i = 0; i < size; i++)
  99                 tmp[i] = in[i] ^ iv[i];
 100             for (i = size; i < AES_BLOCK_SIZE; i++)
 101                 tmp[i] = iv[i];
 102             AES_encrypt(tmp, out, key);
 103             memcpy(iv, out, AES_BLOCK_SIZE);
 104         }
 105     } else {
 106         while (size >= AES_BLOCK_SIZE) {
 107             memcpy(tmp, in, AES_BLOCK_SIZE);
 108             AES_decrypt(tmp, out, key);
 109             for (i = 0; i < AES_BLOCK_SIZE; i++)
 110                 out[i] ^= iv[i];
 111             memcpy(iv, tmp, AES_BLOCK_SIZE);
 112             size -= AES_BLOCK_SIZE;
 113             in += AES_BLOCK_SIZE;
 114             out += AES_BLOCK_SIZE;
 115         }
 116         if (size) {
 117             memcpy(tmp, in, AES_BLOCK_SIZE);
 118             AES_decrypt(tmp, out, key);
 119             for (i = 0; i < size; i++)
 120                 out[i] ^= iv[i];
 121             memcpy(iv, tmp, AES_BLOCK_SIZE);
 122         }
 123     }
 124 }

/* [<][>][^][v][top][bottom][index][help] */