X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=serpent.c;h=7c5850535f24f87655f2508b0c4045f89e3dcd9a;hp=3847437f1d8cfe9ee7f0041257f83732062d1ce0;hb=12fc2c3186aef381820305e290981d620da47fe1;hpb=4a1a591973e0be6f33a55b8f1fc5abc827f6969d diff --git a/serpent.c b/serpent.c index 3847437..7c58505 100644 --- a/serpent.c +++ b/serpent.c @@ -22,12 +22,46 @@ #include +#include "hexdebug.h" #include "serpent.h" #include "serpentsboxes.h" +#ifdef SERPENT_BIGENDIAN + #define GETPUT_CP(bytenum) \ (((basep) + (lenbytes) - (offset) - 4)[(bytenum)]) +#define SERPENT_DECORATE(func) serpentbe_##func + +#else /* !defined(SERPENT_BIGENDIAN) */ + +#define GETPUT_CP(bytenum) \ + (((basep) + (offset))[3-(bytenum)]) + +#define SERPENT_DECORATE(func) serpent_##func + +#endif /* !defined(SERPENT_BIGENDIAN) */ + +#if 0 + +#include + +static void SERP_DEBUG(const char *str1, + const void *ary, int sz, + const char *str2) +{ + fprintf(stderr,"%s",str1); + hexdebug(stderr,ary,sz); + fprintf(stderr,"%s",str2); +} + +#else + +#define SERP_DEBUG(str1,aryv,sz,str2) /*empty*/ + +#endif + + static uint32_t serpent_get_32bit(const uint8_t *basep, int lenbytes, int offset) { @@ -45,13 +79,15 @@ static void serpent_put_32bit(uint8_t *basep, int lenbytes, int offset, uint32_t GETPUT_CP(3) = (char)(value); } -void serpent_makekey(struct keyInstance *key, int keyLen, +void SERPENT_DECORATE(makekey)(struct keyInstance *key, int keyLen, const uint8_t *keyMaterial) { int i; uint32_t j; uint32_t w[132],k[132]; + SERP_DEBUG("SERPENT makekey ",keyMaterial,keyLen/8,"\n"); + for(i=0; isubkeys[i][j] = k[4*i+j]; } -void serpent_encrypt(struct keyInstance *key, +void SERPENT_DECORATE(encrypt)(struct keyInstance *key, const uint8_t plaintext[16], uint8_t ciphertext[16]) { register uint32_t x0, x1, x2, x3; register uint32_t y0, y1, y2, y3; + SERP_DEBUG("SERPENT encrypt ",plaintext,16," ->"); + x0=serpent_get_32bit(plaintext,16,+0); x1=serpent_get_32bit(plaintext,16,+4); x2=serpent_get_32bit(plaintext,16,+8); @@ -221,15 +259,19 @@ void serpent_encrypt(struct keyInstance *key, serpent_put_32bit(ciphertext,16,+4, x1); serpent_put_32bit(ciphertext,16,+8, x2); serpent_put_32bit(ciphertext,16,12, x3); + + SERP_DEBUG(" ",ciphertext,16,"\n"); } -void serpent_decrypt(struct keyInstance *key, +void SERPENT_DECORATE(decrypt)(struct keyInstance *key, const uint8_t ciphertext[16], uint8_t plaintext[16]) { register uint32_t x0, x1, x2, x3; register uint32_t y0, y1, y2, y3; + SERP_DEBUG("SERPENT decrypt ",ciphertext,16," ->"); + x0=serpent_get_32bit(ciphertext,16,+0); x1=serpent_get_32bit(ciphertext,16,+4); x2=serpent_get_32bit(ciphertext,16,+8); @@ -339,4 +381,6 @@ void serpent_decrypt(struct keyInstance *key, serpent_put_32bit(plaintext,16,+4, x1); serpent_put_32bit(plaintext,16,+8, x2); serpent_put_32bit(plaintext,16,12, x3); + + SERP_DEBUG(" ",plaintext,16,"\n"); }