[crypto] Move AES_convert_key() hack into axtls_aes.c
authorMichael Brown <mcb30@etherboot.org>
Wed, 18 Feb 2009 21:33:54 +0000 (21:33 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 18 Feb 2009 21:33:54 +0000 (21:33 +0000)
Although the nature of the hack is essentially unchanged, this allows
us to remove the hardcoded assumption in tls.c that the RX cipher is
AES.

src/crypto/axtls_aes.c
src/net/tls.c

index f36a230..278f933 100644 (file)
@@ -4,8 +4,13 @@
 #include <gpxe/crypto.h>
 #include <gpxe/aes.h>
 
 #include <gpxe/crypto.h>
 #include <gpxe/aes.h>
 
+struct aes_cbc_context {
+       AES_CTX ctx;
+       int decrypting;
+};
+
 static int aes_cbc_setkey ( void *ctx, const void *key, size_t keylen ) {
 static int aes_cbc_setkey ( void *ctx, const void *key, size_t keylen ) {
-       AES_CTX *aesctx = ctx;
+       struct aes_cbc_context *aesctx = ctx;
        AES_MODE mode;
 
        switch ( keylen ) {
        AES_MODE mode;
 
        switch ( keylen ) {
@@ -19,33 +24,44 @@ static int aes_cbc_setkey ( void *ctx, const void *key, size_t keylen ) {
                return -EINVAL;
        }
 
                return -EINVAL;
        }
 
-       AES_set_key ( aesctx, key, aesctx->iv, mode );
+       AES_set_key ( &aesctx->ctx, key, aesctx->ctx.iv, mode );
+
+       aesctx->decrypting = 0;
+
        return 0;
 }
 
 static void aes_cbc_setiv ( void *ctx, const void *iv ) {
        return 0;
 }
 
 static void aes_cbc_setiv ( void *ctx, const void *iv ) {
-       AES_CTX *aesctx = ctx;
+       struct aes_cbc_context *aesctx = ctx;
 
 
-       memcpy ( aesctx->iv, iv, sizeof ( aesctx->iv ) );
+       memcpy ( aesctx->ctx.iv, iv, sizeof ( aesctx->ctx.iv ) );
 }
 
 static void aes_cbc_encrypt ( void *ctx, const void *data, void *dst,
                              size_t len ) {
 }
 
 static void aes_cbc_encrypt ( void *ctx, const void *data, void *dst,
                              size_t len ) {
-       AES_CTX *aesctx = ctx;
+       struct aes_cbc_context *aesctx = ctx;
 
 
-       AES_cbc_encrypt ( aesctx, data, dst, len );
+       if ( aesctx->decrypting )
+               assert ( 0 );
+
+       AES_cbc_encrypt ( &aesctx->ctx, data, dst, len );
 }
 
 static void aes_cbc_decrypt ( void *ctx, const void *data, void *dst,
                              size_t len ) {
 }
 
 static void aes_cbc_decrypt ( void *ctx, const void *data, void *dst,
                              size_t len ) {
-       AES_CTX *aesctx = ctx;
+       struct aes_cbc_context *aesctx = ctx;
+
+       if ( ! aesctx->decrypting ) {
+               AES_convert_key ( &aesctx->ctx );
+               aesctx->decrypting = 1;
+       }
 
 
-       AES_cbc_decrypt ( aesctx, data, dst, len );
+       AES_cbc_decrypt ( &aesctx->ctx, data, dst, len );
 }
 
 struct crypto_algorithm aes_cbc_algorithm = {
        .name           = "aes_cbc",
 }
 
 struct crypto_algorithm aes_cbc_algorithm = {
        .name           = "aes_cbc",
-       .ctxsize        = sizeof ( AES_CTX ),
+       .ctxsize        = sizeof ( struct aes_cbc_context ),
        .blocksize      = 16,
        .setkey         = aes_cbc_setkey,
        .setiv          = aes_cbc_setiv,
        .blocksize      = 16,
        .setkey         = aes_cbc_setkey,
        .setiv          = aes_cbc_setiv,
index df872d4..f8e5318 100644 (file)
@@ -372,10 +372,6 @@ static int tls_generate_keys ( struct tls_session *tls ) {
                       tls, strerror ( rc ) );
                return rc;
        }
                       tls, strerror ( rc ) );
                return rc;
        }
-
-       /* FIXME: AES needs to be fixed to not require this */
-       AES_convert_key ( rx_cipherspec->cipher_ctx );
-
        DBGC ( tls, "TLS %p RX key:\n", tls );
        DBGC_HD ( tls, key, key_size );
        key += key_size;
        DBGC ( tls, "TLS %p RX key:\n", tls );
        DBGC_HD ( tls, key, key_size );
        key += key_size;