~ubuntu-branches/ubuntu/utopic/openssl/utopic

« back to all changes in this revision

Viewing changes to crypto/aes/aes_cbc.c

  • Committer: Bazaar Package Importer
  • Author(s): Kurt Roeckx
  • Date: 2011-04-02 13:19:19 UTC
  • mfrom: (1.2.1 upstream) (11.2.2 experimental)
  • mto: This revision was merged to the branch mainline in revision 55.
  • Revision ID: james.westby@ubuntu.com-20110402131919-anszuslper64ey9e
Tags: 1.0.0d-1
* New upstream version
  - Fixes CVE-2011-0014
* Make libssl-doc Replaces/Breaks with old libssl-dev packages
  (Closes: #607609)
* Only export the symbols we should, instead of all.
* Add symbol file.
* Upload to unstable

Show diffs side-by-side

added added

removed removed

Lines of Context:
49
49
 *
50
50
 */
51
51
 
52
 
#ifndef AES_DEBUG
53
 
# ifndef NDEBUG
54
 
#  define NDEBUG
55
 
# endif
56
 
#endif
57
 
#include <assert.h>
58
 
 
59
52
#include <openssl/aes.h>
60
 
#include "aes_locl.h"
 
53
#include <openssl/modes.h>
61
54
 
62
 
#if !defined(OPENSSL_FIPS_AES_ASM)
63
55
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
64
 
                     const unsigned long length, const AES_KEY *key,
 
56
                     size_t len, const AES_KEY *key,
65
57
                     unsigned char *ivec, const int enc) {
66
58
 
67
 
        unsigned long n;
68
 
        unsigned long len = length;
69
 
        unsigned char tmp[AES_BLOCK_SIZE];
70
 
        const unsigned char *iv = ivec;
71
 
 
72
 
        assert(in && out && key && ivec);
73
 
        assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc));
74
 
 
75
 
        if (AES_ENCRYPT == enc) {
76
 
                while (len >= AES_BLOCK_SIZE) {
77
 
                        for(n=0; n < AES_BLOCK_SIZE; ++n)
78
 
                                out[n] = in[n] ^ iv[n];
79
 
                        AES_encrypt(out, out, key);
80
 
                        iv = out;
81
 
                        len -= AES_BLOCK_SIZE;
82
 
                        in += AES_BLOCK_SIZE;
83
 
                        out += AES_BLOCK_SIZE;
84
 
                }
85
 
                if (len) {
86
 
                        for(n=0; n < len; ++n)
87
 
                                out[n] = in[n] ^ iv[n];
88
 
                        for(n=len; n < AES_BLOCK_SIZE; ++n)
89
 
                                out[n] = iv[n];
90
 
                        AES_encrypt(out, out, key);
91
 
                        iv = out;
92
 
                }
93
 
                memcpy(ivec,iv,AES_BLOCK_SIZE);
94
 
        } else if (in != out) {
95
 
                while (len >= AES_BLOCK_SIZE) {
96
 
                        AES_decrypt(in, out, key);
97
 
                        for(n=0; n < AES_BLOCK_SIZE; ++n)
98
 
                                out[n] ^= iv[n];
99
 
                        iv = in;
100
 
                        len -= AES_BLOCK_SIZE;
101
 
                        in  += AES_BLOCK_SIZE;
102
 
                        out += AES_BLOCK_SIZE;
103
 
                }
104
 
                if (len) {
105
 
                        AES_decrypt(in,tmp,key);
106
 
                        for(n=0; n < len; ++n)
107
 
                                out[n] = tmp[n] ^ iv[n];
108
 
                        iv = in;
109
 
                }
110
 
                memcpy(ivec,iv,AES_BLOCK_SIZE);
111
 
        } else {
112
 
                while (len >= AES_BLOCK_SIZE) {
113
 
                        memcpy(tmp, in, AES_BLOCK_SIZE);
114
 
                        AES_decrypt(in, out, key);
115
 
                        for(n=0; n < AES_BLOCK_SIZE; ++n)
116
 
                                out[n] ^= ivec[n];
117
 
                        memcpy(ivec, tmp, AES_BLOCK_SIZE);
118
 
                        len -= AES_BLOCK_SIZE;
119
 
                        in += AES_BLOCK_SIZE;
120
 
                        out += AES_BLOCK_SIZE;
121
 
                }
122
 
                if (len) {
123
 
                        memcpy(tmp, in, AES_BLOCK_SIZE);
124
 
                        AES_decrypt(tmp, out, key);
125
 
                        for(n=0; n < len; ++n)
126
 
                                out[n] ^= ivec[n];
127
 
                        for(n=len; n < AES_BLOCK_SIZE; ++n)
128
 
                                out[n] = tmp[n];
129
 
                        memcpy(ivec, tmp, AES_BLOCK_SIZE);
130
 
                }
131
 
        }
 
59
        if (enc)
 
60
                CRYPTO_cbc128_encrypt(in,out,len,key,ivec,(block128_f)AES_encrypt);
 
61
        else
 
62
                CRYPTO_cbc128_decrypt(in,out,len,key,ivec,(block128_f)AES_decrypt);
132
63
}
133
 
#endif