Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/crypto/external/bsd/netpgp/dist/src/lib check return values ...



details:   https://anonhg.NetBSD.org/src/rev/3f4a81950fb0
branches:  trunk
changeset: 758394:3f4a81950fb0
user:      agc <agc%NetBSD.org@localhost>
date:      Thu Nov 04 01:18:34 2010 +0000

description:
check return values from memory allocation routines in symmetric key
initialisation. return an error if allocation failed.

modify symmetric key initialisation function signature to return an
indication of success or failure.

get rid of one-time typedef for function definitions; their indirection
does not add any extra insight, and just obfuscates the declarations.

diffstat:

 crypto/external/bsd/netpgp/dist/src/lib/crypto.h    |  62 ++++++----------
 crypto/external/bsd/netpgp/dist/src/lib/symmetric.c |  79 +++++++++++++++-----
 2 files changed, 83 insertions(+), 58 deletions(-)

diffs (275 lines):

diff -r e51d346d88fe -r 3f4a81950fb0 crypto/external/bsd/netpgp/dist/src/lib/crypto.h
--- a/crypto/external/bsd/netpgp/dist/src/lib/crypto.h  Wed Nov 03 23:46:35 2010 +0000
+++ b/crypto/external/bsd/netpgp/dist/src/lib/crypto.h  Thu Nov 04 01:18:34 2010 +0000
@@ -62,58 +62,42 @@
 
 #define OPS_MIN_HASH_SIZE      16
 
-typedef int __ops_hash_init_t(__ops_hash_t *);
-typedef void __ops_hash_add_t(__ops_hash_t *, const uint8_t *, unsigned);
-typedef unsigned __ops_hash_finish_t(__ops_hash_t *, uint8_t *);
-
 /** _ops_hash_t */
 struct _ops_hash_t {
        __ops_hash_alg_t         alg;           /* algorithm */
        size_t                   size;          /* size */
        const char              *name;          /* what it's known as */
-       __ops_hash_init_t       *init;          /* initialisation func */
-       __ops_hash_add_t        *add;           /* add text func */
-       __ops_hash_finish_t     *finish;        /* finalise func */
+       int                     (*init)(__ops_hash_t *);
+       void                    (*add)(__ops_hash_t *, const uint8_t *, unsigned);
+       unsigned                (*finish)(__ops_hash_t *, uint8_t *);
        void                    *data;          /* blob for data */
 };
 
-typedef void __ops_setiv_func_t(__ops_crypt_t *, const uint8_t *);
-typedef void __ops_setkey_func_t(__ops_crypt_t *, const uint8_t *);
-typedef void __ops_crypt_init_t(__ops_crypt_t *);
-typedef void __ops_crypt_resync_t(__ops_crypt_t *);
-typedef void __ops_blkenc_t(__ops_crypt_t *, void *, const void *);
-typedef void __ops_blkdec_t(__ops_crypt_t *, void *, const void *);
-typedef void __ops_crypt_cfb_encrypt_t(__ops_crypt_t *, void *, const void *,
-                                       size_t);
-typedef void __ops_crypt_cfb_decrypt_t(__ops_crypt_t *, void *, const void *,
-                                       size_t);
-typedef void __ops_crypt_finish_t(__ops_crypt_t *);
-
 /** _ops_crypt_t */
 struct _ops_crypt_t {
-       __ops_symm_alg_t                alg;
-       size_t                          blocksize;
-       size_t                          keysize;
-       __ops_setiv_func_t              *set_iv;
-       __ops_setkey_func_t             *set_crypt_key;
-       __ops_crypt_init_t              *base_init;
-       __ops_crypt_resync_t            *decrypt_resync;
-       /* encrypt/decrypt one block  */
-       __ops_blkenc_t                  *block_encrypt;
-       __ops_blkdec_t                  *block_decrypt;
+       __ops_symm_alg_t        alg;
+       size_t                  blocksize;
+       size_t                  keysize;
+       void                    (*set_iv)(__ops_crypt_t *, const uint8_t *);
+       void                    (*set_crypt_key)(__ops_crypt_t *, const uint8_t *);
+       int                     (*base_init)(__ops_crypt_t *);
+       void                    (*decrypt_resync)(__ops_crypt_t *);
+       /* encrypt/decrypt one block */
+       void                    (*block_encrypt)(__ops_crypt_t *, void *, const void *);
+       void                    (*block_decrypt)(__ops_crypt_t *, void *, const void *);
        /* Standard CFB encrypt/decrypt (as used by Sym Enc Int Prot packets) */
-       __ops_crypt_cfb_encrypt_t       *cfb_encrypt;
-       __ops_crypt_cfb_decrypt_t       *cfb_decrypt;
-       __ops_crypt_finish_t            *decrypt_finish;
-       uint8_t                         iv[OPS_MAX_BLOCK_SIZE];
-       uint8_t                         civ[OPS_MAX_BLOCK_SIZE];
-       uint8_t                         siv[OPS_MAX_BLOCK_SIZE];
+       void                    (*cfb_encrypt)(__ops_crypt_t *, void *, const void *, size_t);
+       void                    (*cfb_decrypt)(__ops_crypt_t *, void *, const void *, size_t);
+       void                    (*decrypt_finish)(__ops_crypt_t *);
+       uint8_t                 iv[OPS_MAX_BLOCK_SIZE];
+       uint8_t                 civ[OPS_MAX_BLOCK_SIZE];
+       uint8_t                 siv[OPS_MAX_BLOCK_SIZE];
                /* siv is needed for weird v3 resync */
-       uint8_t                         key[OPS_MAX_KEY_SIZE];
-       int                             num;
+       uint8_t                 key[OPS_MAX_KEY_SIZE];
+       int                     num;
                /* num is offset - see openssl _encrypt doco */
-       void                            *encrypt_key;
-       void                            *decrypt_key;
+       void                    *encrypt_key;
+       void                    *decrypt_key;
 };
 
 void __ops_crypto_finish(void);
diff -r e51d346d88fe -r 3f4a81950fb0 crypto/external/bsd/netpgp/dist/src/lib/symmetric.c
--- a/crypto/external/bsd/netpgp/dist/src/lib/symmetric.c       Wed Nov 03 23:46:35 2010 +0000
+++ b/crypto/external/bsd/netpgp/dist/src/lib/symmetric.c       Thu Nov 04 01:18:34 2010 +0000
@@ -54,7 +54,7 @@
 
 #if defined(__NetBSD__)
 __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$NetBSD: symmetric.c,v 1.11 2010/08/15 07:52:27 agc Exp $");
+__RCSID("$NetBSD: symmetric.c,v 1.12 2010/11/04 01:18:34 agc Exp $");
 #endif
 
 #include "crypto.h"
@@ -122,16 +122,23 @@
        }
 }
 
-static void 
+static int 
 cast5_init(__ops_crypt_t *crypt)
 {
        if (crypt->encrypt_key) {
                free(crypt->encrypt_key);
        }
-       crypt->encrypt_key = calloc(1, sizeof(CAST_KEY));
+       if ((crypt->encrypt_key = calloc(1, sizeof(CAST_KEY))) == NULL) {
+               (void) fprintf(stderr, "cast5_init: alloc failure\n");
+               return 0;
+       }
        CAST_set_key(crypt->encrypt_key, (int)crypt->keysize, crypt->key);
-       crypt->decrypt_key = calloc(1, sizeof(CAST_KEY));
+       if ((crypt->decrypt_key = calloc(1, sizeof(CAST_KEY))) == NULL) {
+               (void) fprintf(stderr, "cast5_init: alloc failure\n");
+               return 0;
+       }
        CAST_set_key(crypt->decrypt_key, (int)crypt->keysize, crypt->key);
+       return 1;
 }
 
 static void 
@@ -182,18 +189,21 @@
 };
 
 #ifndef OPENSSL_NO_IDEA
-static void 
+static int 
 idea_init(__ops_crypt_t *crypt)
 {
        if (crypt->keysize != IDEA_KEY_LENGTH) {
                (void) fprintf(stderr, "idea_init: keysize wrong\n");
-               return;
+               return 0;
        }
 
        if (crypt->encrypt_key) {
                free(crypt->encrypt_key);
        }
-       crypt->encrypt_key = calloc(1, sizeof(IDEA_KEY_SCHEDULE));
+       if ((crypt->encrypt_key = calloc(1, sizeof(IDEA_KEY_SCHEDULE))) == NULL) {
+               (void) fprintf(stderr, "idea_init: alloc failure\n");
+               return 0;
+       }
 
        /* note that we don't invert the key when decrypting for CFB mode */
        idea_set_encrypt_key(crypt->key, crypt->encrypt_key);
@@ -201,9 +211,13 @@
        if (crypt->decrypt_key) {
                free(crypt->decrypt_key);
        }
-       crypt->decrypt_key = calloc(1, sizeof(IDEA_KEY_SCHEDULE));
+       if ((crypt->decrypt_key = calloc(1, sizeof(IDEA_KEY_SCHEDULE))) == NULL) {
+               (void) fprintf(stderr, "idea_init: alloc failure\n");
+               return 0;
+       }
 
        idea_set_decrypt_key(crypt->encrypt_key, crypt->decrypt_key);
+       return 1;
 }
 
 static void 
@@ -256,13 +270,16 @@
 
 #define KEYBITS_AES128 128
 
-static void 
+static int 
 aes128_init(__ops_crypt_t *crypt)
 {
        if (crypt->encrypt_key) {
                free(crypt->encrypt_key);
        }
-       crypt->encrypt_key = calloc(1, sizeof(AES_KEY));
+       if ((crypt->encrypt_key = calloc(1, sizeof(AES_KEY))) == NULL) {
+               (void) fprintf(stderr, "aes128_init: alloc failure\n");
+               return 0;
+       }
        if (AES_set_encrypt_key(crypt->key, KEYBITS_AES128,
                        crypt->encrypt_key)) {
                fprintf(stderr, "aes128_init: Error setting encrypt_key\n");
@@ -271,11 +288,15 @@
        if (crypt->decrypt_key) {
                free(crypt->decrypt_key);
        }
-       crypt->decrypt_key = calloc(1, sizeof(AES_KEY));
+       if ((crypt->decrypt_key = calloc(1, sizeof(AES_KEY))) == NULL) {
+               (void) fprintf(stderr, "aes128_init: alloc failure\n");
+               return 0;
+       }
        if (AES_set_decrypt_key(crypt->key, KEYBITS_AES128,
                                crypt->decrypt_key)) {
                fprintf(stderr, "aes128_init: Error setting decrypt_key\n");
        }
+       return 1;
 }
 
 static void 
@@ -327,25 +348,42 @@
 
 #define KEYBITS_AES256 256
 
-static void 
+static int 
 aes256_init(__ops_crypt_t *crypt)
 {
        if (crypt->encrypt_key) {
                free(crypt->encrypt_key);
        }
-       crypt->encrypt_key = calloc(1, sizeof(AES_KEY));
+       if ((crypt->encrypt_key = calloc(1, sizeof(AES_KEY))) == NULL) {
+               (void) fprintf(stderr, "aes256_init: alloc failure\n");
+               return 0;
+       }
        if (AES_set_encrypt_key(crypt->key, KEYBITS_AES256,
                        crypt->encrypt_key)) {
                fprintf(stderr, "aes256_init: Error setting encrypt_key\n");
+               free(crypt->encrypt_key);
+               crypt->encrypt_key = NULL;
+               return 0;
        }
-
-       if (crypt->decrypt_key)
+       if (crypt->decrypt_key) {
                free(crypt->decrypt_key);
-       crypt->decrypt_key = calloc(1, sizeof(AES_KEY));
+       }
+       if ((crypt->decrypt_key = calloc(1, sizeof(AES_KEY))) == NULL) {
+               (void) fprintf(stderr, "aes256_init: alloc failure\n");
+               free(crypt->encrypt_key);
+               crypt->encrypt_key = NULL;
+               return 0;
+       }
        if (AES_set_decrypt_key(crypt->key, KEYBITS_AES256,
                        crypt->decrypt_key)) {
                fprintf(stderr, "aes256_init: Error setting decrypt_key\n");
+               free(crypt->encrypt_key);
+               crypt->encrypt_key = NULL;
+               free(crypt->decrypt_key);
+               crypt->decrypt_key = NULL;
+               return 0;
        }
+       return 1;
 }
 
 static const __ops_crypt_t aes256 =
@@ -367,7 +405,7 @@
 
 /* Triple DES */
 
-static void 
+static int 
 tripledes_init(__ops_crypt_t *crypt)
 {
        DES_key_schedule *keys;
@@ -376,12 +414,15 @@
        if (crypt->encrypt_key) {
                free(crypt->encrypt_key);
        }
-       keys = crypt->encrypt_key = calloc(1, 3 * sizeof(DES_key_schedule));
-
+       if ((keys = crypt->encrypt_key = calloc(1, 3 * sizeof(DES_key_schedule))) == NULL) {
+               (void) fprintf(stderr, "tripledes_init: alloc failure\n");
+               return 0;
+       }
        for (n = 0; n < 3; ++n) {
                DES_set_key((DES_cblock *)(void *)(crypt->key + n * 8),
                        &keys[n]);
        }
+       return 1;
 }
 
 static void 



Home | Main Index | Thread Index | Old Index