|
|
1.1 root 1: /*
2: * Copyright (C) 2009 Michael Brown <[email protected]>.
3: *
4: * This program is free software; you can redistribute it and/or
5: * modify it under the terms of the GNU General Public License as
6: * published by the Free Software Foundation; either version 2 of the
7: * License, or any later version.
8: *
9: * This program is distributed in the hope that it will be useful, but
10: * WITHOUT ANY WARRANTY; without even the implied warranty of
11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12: * General Public License for more details.
13: *
14: * You should have received a copy of the GNU General Public License
15: * along with this program; if not, write to the Free Software
16: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17: */
18:
19: FILE_LICENCE ( GPL2_OR_LATER );
20:
21: #include <string.h>
22: #include <assert.h>
23: #include <ipxe/crypto.h>
24: #include <ipxe/cbc.h>
25:
26: /** @file
27: *
28: * Cipher-block chaining
29: *
30: */
31:
32: /**
33: * XOR data blocks
34: *
35: * @v src Input data
36: * @v dst Second input data and output data buffer
37: * @v len Length of data
38: */
39: static void cbc_xor ( const void *src, void *dst, size_t len ) {
40: const uint32_t *srcl = src;
41: uint32_t *dstl = dst;
42: unsigned int i;
43:
44: /* Assume that block sizes will always be dword-aligned, for speed */
45: assert ( ( len % sizeof ( *srcl ) ) == 0 );
46:
47: for ( i = 0 ; i < ( len / sizeof ( *srcl ) ) ; i++ )
48: dstl[i] ^= srcl[i];
49: }
50:
51: /**
52: * Encrypt data
53: *
54: * @v ctx Context
55: * @v src Data to encrypt
56: * @v dst Buffer for encrypted data
57: * @v len Length of data
58: * @v raw_cipher Underlying cipher algorithm
59: * @v cbc_ctx CBC context
60: */
61: void cbc_encrypt ( void *ctx, const void *src, void *dst, size_t len,
62: struct cipher_algorithm *raw_cipher, void *cbc_ctx ) {
63: size_t blocksize = raw_cipher->blocksize;
64:
65: assert ( ( len % blocksize ) == 0 );
66:
67: while ( len ) {
68: cbc_xor ( src, cbc_ctx, blocksize );
69: cipher_encrypt ( raw_cipher, ctx, cbc_ctx, dst, blocksize );
70: memcpy ( cbc_ctx, dst, blocksize );
71: dst += blocksize;
72: src += blocksize;
73: len -= blocksize;
74: }
75: }
76:
77: /**
78: * Decrypt data
79: *
80: * @v ctx Context
81: * @v src Data to decrypt
82: * @v dst Buffer for decrypted data
83: * @v len Length of data
84: * @v raw_cipher Underlying cipher algorithm
85: * @v cbc_ctx CBC context
86: */
87: void cbc_decrypt ( void *ctx, const void *src, void *dst, size_t len,
88: struct cipher_algorithm *raw_cipher, void *cbc_ctx ) {
89: size_t blocksize = raw_cipher->blocksize;
90:
91: assert ( ( len % blocksize ) == 0 );
92:
93: while ( len ) {
94: cipher_decrypt ( raw_cipher, ctx, src, dst, blocksize );
95: cbc_xor ( cbc_ctx, dst, blocksize );
96: memcpy ( cbc_ctx, src, blocksize );
97: dst += blocksize;
98: src += blocksize;
99: len -= blocksize;
100: }
101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.