~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to source4/heimdal/lib/hcrypto/aes.c

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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)
 
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)
 
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)
 
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)
 
75
{
 
76
    rijndaelDecrypt(key->key, key->rounds, in, out);
 
77
}
 
78
 
 
79
void
 
80
AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
 
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
}