/* -*-c-*-
*
- * $Id: blowfish.c,v 1.1 1999/09/03 08:41:11 mdw Exp $
+ * $Id: blowfish.c,v 1.2 2000/06/17 10:47:56 mdw Exp $
*
* The Blowfish block cipher
*
/*----- Revision history --------------------------------------------------*
*
* $Log: blowfish.c,v $
+ * Revision 1.2 2000/06/17 10:47:56 mdw
+ * Tidy round function a little. Support new key size interface.
+ *
* Revision 1.1 1999/09/03 08:41:11 mdw
* Initial import.
*
#include <mLib/bits.h>
#include "blowfish.h"
-#include "bf_ikey.h"
+#include "blowfish-tab.h"
#include "blkc.h"
+#include "gcipher.h"
#include "paranoia.h"
/*----- Global variables --------------------------------------------------*/
static blowfish_ctx ikey = BLOWFISH_IKEY;
+const octet blowfish_keysz[] = { KSZ_RANGE, BLOWFISH_KEYSZ, 1, 56, 1 };
+
/*----- Macros ------------------------------------------------------------*/
-#define ROUND(k, x, y, r) \
- ((x) ^= (k)->p[(r)], \
- (y) ^= (((((k)->s0[((x) >> 24) & MASK8]) + \
- ((k)->s1[((x) >> 16) & MASK8])) ^ \
- ((k)->s2[((x) >> 8) & MASK8])) + \
- ((k)->s3[((x) >> 0) & MASK8])))
+#define ROUND(k, x, y, r) do { \
+ x ^= *r; \
+ y ^= ((k->s0[U8(x >> 24)] + \
+ k->s1[U8(x >> 16)]) ^ \
+ k->s2[U8(x >> 8)]) + \
+ k->s3[U8(x >> 0)]; \
+} while (0)
#define EBLK(k, a, b, c, d) do { \
- uint32 _x = (a); \
- uint32 _y = (b); \
- ROUND((k), _x, _y, 0); \
- ROUND((k), _y, _x, 1); \
- ROUND((k), _x, _y, 2); \
- ROUND((k), _y, _x, 3); \
- ROUND((k), _x, _y, 4); \
- ROUND((k), _y, _x, 5); \
- ROUND((k), _x, _y, 6); \
- ROUND((k), _y, _x, 7); \
- ROUND((k), _x, _y, 8); \
- ROUND((k), _y, _x, 9); \
- ROUND((k), _x, _y, 10); \
- ROUND((k), _y, _x, 11); \
- ROUND((k), _x, _y, 12); \
- ROUND((k), _y, _x, 13); \
- ROUND((k), _x, _y, 14); \
- ROUND((k), _y, _x, 15); \
- (c) = _y ^ (k)->p[17]; \
- (d) = _x ^ (k)->p[16]; \
+ const uint32 *_r = k->p; \
+ uint32 _x = a; \
+ uint32 _y = b; \
+ ROUND(k, _x, _y, _r++); \
+ ROUND(k, _y, _x, _r++); \
+ ROUND(k, _x, _y, _r++); \
+ ROUND(k, _y, _x, _r++); \
+ ROUND(k, _x, _y, _r++); \
+ ROUND(k, _y, _x, _r++); \
+ ROUND(k, _x, _y, _r++); \
+ ROUND(k, _y, _x, _r++); \
+ ROUND(k, _x, _y, _r++); \
+ ROUND(k, _y, _x, _r++); \
+ ROUND(k, _x, _y, _r++); \
+ ROUND(k, _y, _x, _r++); \
+ ROUND(k, _x, _y, _r++); \
+ ROUND(k, _y, _x, _r++); \
+ ROUND(k, _x, _y, _r++); \
+ ROUND(k, _y, _x, _r++); \
+ c = _y ^ k->p[17]; \
+ d = _x ^ k->p[16]; \
} while (0)
#define DBLK(k, a, b, c, d) do { \
- uint32 _x = (a); \
- uint32 _y = (b); \
- ROUND((k), _x, _y, 17); \
- ROUND((k), _y, _x, 16); \
- ROUND((k), _x, _y, 15); \
- ROUND((k), _y, _x, 14); \
- ROUND((k), _x, _y, 13); \
- ROUND((k), _y, _x, 12); \
- ROUND((k), _x, _y, 11); \
- ROUND((k), _y, _x, 10); \
- ROUND((k), _x, _y, 9); \
- ROUND((k), _y, _x, 8); \
- ROUND((k), _x, _y, 7); \
- ROUND((k), _y, _x, 6); \
- ROUND((k), _x, _y, 5); \
- ROUND((k), _y, _x, 4); \
- ROUND((k), _x, _y, 3); \
- ROUND((k), _y, _x, 2); \
- (c) = _y ^ (k)->p[0]; \
- (d) = _x ^ (k)->p[1]; \
+ const uint32 *_r = k->p + 18; \
+ uint32 _x = a; \
+ uint32 _y = b; \
+ ROUND(k, _x, _y, --_r); \
+ ROUND(k, _y, _x, --_r); \
+ ROUND(k, _x, _y, --_r); \
+ ROUND(k, _y, _x, --_r); \
+ ROUND(k, _x, _y, --_r); \
+ ROUND(k, _y, _x, --_r); \
+ ROUND(k, _x, _y, --_r); \
+ ROUND(k, _y, _x, --_r); \
+ ROUND(k, _x, _y, --_r); \
+ ROUND(k, _y, _x, --_r); \
+ ROUND(k, _x, _y, --_r); \
+ ROUND(k, _y, _x, --_r); \
+ ROUND(k, _x, _y, --_r); \
+ ROUND(k, _y, _x, --_r); \
+ ROUND(k, _x, _y, --_r); \
+ ROUND(k, _y, _x, --_r); \
+ c = _y ^ k->p[0]; \
+ d = _x ^ k->p[1]; \
} while (0)
/*----- Low-level encryption interface ------------------------------------*/
void blowfish_init(blowfish_ctx *k, const void *buf, size_t sz)
{
+ KSZ_ASSERT(blowfish, sz);
+
/* --- Copy the initial value over --- */
memcpy(k, &ikey, sizeof(ikey));