DF-3568 / fix.diff
--- a/sys/crypto/rijndael/rijndael-api.c +++ b/sys/crypto/rijndael/rijndael-api.c @@ -34,10 +34,17 @@ #include <crypto/rijndael/rijndael.h> +#define RIJNDAEL_VALID_NR(n) ((n) == 10 || (n) == 12 || (n) == 14) + void rijndael_set_key(rijndael_ctx *ctx, const u_char *key, int bits) { + if (bits != 128 && bits != 192 && bits != 256) { + KASSERT(0, ("rijndael_set_key: invalid key size (%d)", bits)); + ctx->Nr = 0; /* marked unusable */ + return; /* NB: no key material is read */ + } ctx->Nr = rijndaelKeySetupEnc(ctx->ek, key, bits); rijndaelKeySetupDec(ctx->dk, key, bits); } @@ -46,6 +53,8 @@ rijndael_decrypt(const rijndael_ctx *ctx, const u_char *src, u_char *dst) { + if (!RIJNDAEL_VALID_NR(ctx->Nr)) + return; /* refuse unusable schedule */ rijndaelDecrypt(ctx->dk, ctx->Nr, src, dst); } @@ -53,5 +62,7 @@ rijndael_encrypt(const rijndael_ctx *ctx, const u_char *src, u_char *dst) { + if (!RIJNDAEL_VALID_NR(ctx->Nr)) + return; /* refuse unusable schedule */ rijndaelEncrypt(ctx->ek, ctx->Nr, src, dst); } |