X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/86724c17c9914f495e2a7df729d4fe65a9746d82..c7ea35a9fbdb39825afbcce51088ba90f903b147:/armsrc/des.c

diff --git a/armsrc/des.c b/armsrc/des.c
index a81df9c8..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);
 }
 
 /******************************************************************************/
@@ -378,32 +387,32 @@ void tdes_dec(void* out, void* in, const uint8_t* key){
 	des_dec(out, out, (uint8_t*)key + 0);
 }
 
-void tdes_2key_enc(void* out, const void* in, size_t length, const void* key, unsigned char iv[8]){
+ void tdes_2key_enc(void* out, const void* in, size_t length, const void* key, unsigned char iv[8]){
 
 	if( length % 8 ) return; 
-	
+
 	uint8_t i;
 	uint8_t* tin = (uint8_t*) in;
 	uint8_t* tout = (uint8_t*) out;
 	
 	while( length > 0 )
 	{
-		for ( i = 0; i < 8; i++ )
-			tout[i] = (unsigned char)(tin[i] ^ iv[i]);
-
+		for( i = 0; i < 8; i++ )
+				tout[i] = (unsigned char)( tin[i] ^ iv[i] );
+		
 		des_enc(tout,  tin, (uint8_t*)key + 0);
 		des_dec(tout, tout, (uint8_t*)key + 8);
 		des_enc(tout, tout, (uint8_t*)key + 0);
 		
-		memcpy(iv, tout, 8);
-
+		memcpy( iv, tout, 8 );
+		
 		tin  += 8;
 		tout += 8;
 		length -= 8;
 	}
-}
-
-void tdes_2key_dec(void* out, const void* in, size_t length, const void* key, unsigned char iv[8]){
+ }
+ 
+ void tdes_2key_dec(void* out, const void* in, size_t length, const void* key, unsigned char iv[8]){
 	
 	if( length % 8 ) return; 
 
@@ -414,22 +423,22 @@ void tdes_2key_dec(void* out, const void* in, size_t length, const void* key, un
 	
 	while( length > 0 )
 	{
-		memcpy(temp, tin, 8);
-
+		memcpy( temp, tin, 8 );
+		
 		des_dec(tout,  tin, (uint8_t*)key + 0);
 		des_enc(tout, tout, (uint8_t*)key + 8);
 		des_dec(tout, tout, (uint8_t*)key + 0);	 	 
 
-		for (i = 0; i < 8; i++)
-			tout[i] = (unsigned char)(tout[i] ^ iv[i]);
+		for( i = 0; i < 8; i++ )
+			tout[i] = (unsigned char)( tout[i] ^ iv[i] );
 
-		memcpy(iv, temp, 8);
+		memcpy( iv, temp, 8 );
 		
 		tin  += 8;
 		tout += 8;
 		length -= 8;
 	}
-}
+ }
 
 
 /******************************************************************************/