X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/7838f4beba79370f94c7a3de2cf34278f5d481c8..62cdba0568c0b5ab2bbd5156f29e9418e121d0e9:/armsrc/des.c

diff --git a/armsrc/des.c b/armsrc/des.c
index e72ebb2a..78ae8744 100644
--- a/armsrc/des.c
+++ b/armsrc/des.c
@@ -25,8 +25,8 @@
  * \license	 GPLv3 or later
  * 
  */
-#include <stdint.h>
-#include <string.h>
+
+#include "des.h"
 
 const uint8_t sbox[256]  = {
   /* S-box 1 */
@@ -210,7 +210,7 @@ void permute(const uint8_t *ptable, const uint8_t *in, uint8_t *out){
 	for(byte=0; byte<ob; ++byte){
 		uint8_t x,t=0;
 		for(bit=0; bit<8; ++bit){
-			x=*ptable++ -1 ;
+			x = *ptable++ - 1;
 				t<<=1;
 			if((in[x/8]) & (0x80>>(x%8)) ){
 				t|=0x01;
@@ -274,7 +274,7 @@ uint32_t des_f(uint32_t r, uint8_t* kr){
 	uint64_t data;
 	uint8_t *sbp; /* sboxpointer */ 
 	permute((uint8_t*)e_permtab, (uint8_t*)&r, (uint8_t*)&data);
-	for(i=0; i<7; ++i)
+	for(i=0; i<6; ++i)
 		((uint8_t*)&data)[i] ^= kr[i];
 	
 	/* Sbox substitution */
@@ -296,15 +296,24 @@ uint32_t des_f(uint32_t r, uint8_t* kr){
 
 /******************************************************************************/
 
+typedef struct {
+	union {
+		uint8_t  v8[8];
+		uint32_t v32[2];
+	} d;
+} data_t;
+#define R (data.d.v32[1])
+#define L (data.d.v32[0])
+
 void des_enc(void* out, const void* in, const void* key){
-#define R *((uint32_t*)&(data[4]))
-#define L *((uint32_t*)&(data[0]))
 
-	uint8_t data[8],kr[6],k[7];
+	uint8_t kr[6], k[7];
 	uint8_t i;
+	data_t data;
 	
-	permute((uint8_t*)ip_permtab, (uint8_t*)in, data);
+	permute((uint8_t*)ip_permtab, (uint8_t*)in, data.d.v8);
 	permute((uint8_t*)pc1_permtab, (const uint8_t*)key, k);
+
 	for(i=0; i<8; ++i){
 		shiftkey(k);
 		if(ROTTABLE&((1<<((i<<1)+0))) )
@@ -324,18 +333,18 @@ void des_enc(void* out, const void* in, const void* key){
 	L ^= R;
 	R ^= L;
 	
-	permute((uint8_t*)inv_ip_permtab, data, (uint8_t*)out);
+	permute((uint8_t*)inv_ip_permtab, data.d.v8, (uint8_t*)out);
 }
 
 /******************************************************************************/
 
 void des_dec(void* out, const void* in, const uint8_t* key){
-#define R *((uint32_t*)&(data[4]))
-#define L *((uint32_t*)&(data[0]))
 
-	uint8_t data[8],kr[6],k[7];
+	uint8_t kr[6],k[7];
 	int8_t i;
-	permute((uint8_t*)ip_permtab, (uint8_t*)in, data);
+	data_t data;
+	
+	permute((uint8_t*)ip_permtab, (uint8_t*)in, data.d.v8);
 	permute((uint8_t*)pc1_permtab, (const uint8_t*)key, k);
 	for(i=7; i>=0; --i){
 		
@@ -359,7 +368,7 @@ void des_dec(void* out, const void* in, const uint8_t* key){
 	L ^= R;
 	R ^= L;
 	
-	permute((uint8_t*)inv_ip_permtab, data, (uint8_t*)out);
+	permute((uint8_t*)inv_ip_permtab, data.d.v8, (uint8_t*)out);
 }
 
 /******************************************************************************/