Annotation of qemu/roms/ipxe/src/crypto/cbc.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.