Module Name: src
Committed By: agc
Date: Thu Nov 4 01:18:35 UTC 2010
Modified Files:
src/crypto/external/bsd/netpgp/dist/src/lib: crypto.h symmetric.c
Log Message:
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.
To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 \
src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h
cvs rdiff -u -r1.11 -r1.12 \
src/crypto/external/bsd/netpgp/dist/src/lib/symmetric.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h:1.21 src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h:1.22
--- src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h:1.21 Wed Sep 8 03:21:22 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h Thu Nov 4 01:18:34 2010
@@ -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);
Index: src/crypto/external/bsd/netpgp/dist/src/lib/symmetric.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/symmetric.c:1.11 src/crypto/external/bsd/netpgp/dist/src/lib/symmetric.c:1.12
--- src/crypto/external/bsd/netpgp/dist/src/lib/symmetric.c:1.11 Sun Aug 15 07:52:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/symmetric.c Thu Nov 4 01:18:34 2010
@@ -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