From b4d3d686cc67c2503976ec4c854efc3a20519203 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 18 Feb 2009 22:27:34 +0000 Subject: [PATCH] [crypto] Change cipher_{en,de}crypt() to void functions It is a programming error, not a runtime error, if we attempt to use block ciphers with an incorrect blocksize, so use an assert() rather than an error status return. --- src/crypto/cipher.c | 24 ------------------------ src/include/gpxe/crypto.h | 29 ++++++++++++++++++++--------- src/net/tls.c | 22 +++++----------------- 3 files changed, 25 insertions(+), 50 deletions(-) delete mode 100644 src/crypto/cipher.c diff --git a/src/crypto/cipher.c b/src/crypto/cipher.c deleted file mode 100644 index f83a6d0f..00000000 --- a/src/crypto/cipher.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include - -int cipher_encrypt ( struct cipher_algorithm *cipher, - void *ctx, const void *src, void *dst, - size_t len ) { - if ( ( len & ( cipher->blocksize - 1 ) ) ) { - return -EINVAL; - } - cipher->encrypt ( ctx, src, dst, len ); - return 0; -} - -int cipher_decrypt ( struct cipher_algorithm *cipher, - void *ctx, const void *src, void *dst, - size_t len ) { - if ( ( len & ( cipher->blocksize - 1 ) ) ) { - return -EINVAL; - } - cipher->decrypt ( ctx, src, dst, len ); - return 0; -} - diff --git a/src/include/gpxe/crypto.h b/src/include/gpxe/crypto.h index 42860a9e..10882d37 100644 --- a/src/include/gpxe/crypto.h +++ b/src/include/gpxe/crypto.h @@ -70,7 +70,6 @@ struct cipher_algorithm { * @v src Data to encrypt * @v dst Buffer for encrypted data * @v len Length of data - * @ret rc Return status code * * @v len is guaranteed to be a multiple of @c blocksize. */ @@ -82,7 +81,6 @@ struct cipher_algorithm { * @v src Data to decrypt * @v dst Buffer for decrypted data * @v len Length of data - * @ret rc Return status code * * @v len is guaranteed to be a multiple of @c blocksize. */ @@ -123,17 +121,30 @@ static inline void cipher_setiv ( struct cipher_algorithm *cipher, cipher->setiv ( ctx, iv ); } +static inline void cipher_encrypt ( struct cipher_algorithm *cipher, + void *ctx, const void *src, void *dst, + size_t len ) { + cipher->encrypt ( ctx, src, dst, len ); +} +#define cipher_encrypt( cipher, ctx, src, dst, len ) do { \ + assert ( ( len & ( (cipher)->blocksize - 1 ) ) == 0 ); \ + cipher_encrypt ( (cipher), (ctx), (src), (dst), (len) ); \ + } while ( 0 ) + +static inline void cipher_decrypt ( struct cipher_algorithm *cipher, + void *ctx, const void *src, void *dst, + size_t len ) { + cipher->decrypt ( ctx, src, dst, len ); +} +#define cipher_decrypt( cipher, ctx, src, dst, len ) do { \ + assert ( ( len & ( (cipher)->blocksize - 1 ) ) == 0 ); \ + cipher_decrypt ( (cipher), (ctx), (src), (dst), (len) ); \ + } while ( 0 ) + static inline int is_stream_cipher ( struct cipher_algorithm *cipher ) { return ( cipher->blocksize == 1 ); } -extern int cipher_encrypt ( struct cipher_algorithm *cipher, - void *ctx, const void *src, void *dst, - size_t len ); -extern int cipher_decrypt ( struct cipher_algorithm *cipher, - void *ctx, const void *src, void *dst, - size_t len ); - extern struct digest_algorithm digest_null; extern struct cipher_algorithm cipher_null; extern struct pubkey_algorithm pubkey_null; diff --git a/src/net/tls.c b/src/net/tls.c index 024b45db..73f9ad06 100644 --- a/src/net/tls.c +++ b/src/net/tls.c @@ -1223,15 +1223,9 @@ static int tls_send_plaintext ( struct tls_session *tls, unsigned int type, tlshdr->length = htons ( plaintext_len ); memcpy ( cipherspec->cipher_next_ctx, cipherspec->cipher_ctx, cipherspec->cipher->ctxsize ); - if ( ( rc = cipher_encrypt ( cipherspec->cipher, - cipherspec->cipher_next_ctx, plaintext, - iob_put ( ciphertext, plaintext_len ), - plaintext_len ) ) != 0 ) { - DBGC ( tls, "TLS %p could not encrypt: %s\n", - tls, strerror ( rc ) ); - DBGC_HD ( tls, plaintext, plaintext_len ); - goto done; - } + cipher_encrypt ( cipherspec->cipher, cipherspec->cipher_next_ctx, + plaintext, iob_put ( ciphertext, plaintext_len ), + plaintext_len ); /* Free plaintext as soon as possible to conserve memory */ free ( plaintext ); @@ -1393,14 +1387,8 @@ static int tls_new_ciphertext ( struct tls_session *tls, } /* Decrypt the record */ - if ( ( rc = cipher_decrypt ( cipherspec->cipher, - cipherspec->cipher_ctx, ciphertext, - plaintext, record_len ) ) != 0 ) { - DBGC ( tls, "TLS %p could not decrypt: %s\n", - tls, strerror ( rc ) ); - DBGC_HD ( tls, ciphertext, record_len ); - goto done; - } + cipher_decrypt ( cipherspec->cipher, cipherspec->cipher_ctx, + ciphertext, plaintext, record_len ); /* Split record into content and MAC */ if ( is_stream_cipher ( cipherspec->cipher ) ) {