* Some datatype fixing (was that correct?)
authorDavor Ocelic <docelic@spinlock.hr>
Thu, 29 Jan 2009 00:47:26 +0000 (01:47 +0100)
committerDavor Ocelic <docelic@spinlock.hr>
Thu, 29 Jan 2009 00:47:26 +0000 (01:47 +0100)
* Aes now works through enctest
* Stuff here and there

README
src/Makefile
src/Makefile.ctapi
src/aes.c
src/aes.h
src/auth.c
src/authtest.c
src/config.h
src/crypt.h
src/enctest.c
src/hal-emu.c

diff --git a/README b/README
index ad423cd..686db69 100644 (file)
--- a/README
+++ b/README
@@ -106,27 +106,27 @@ Let's take a look at each build type:
  To ease debugging, you can compile the package for the usual
  desktop computer (no any smart card hardware necessary).
 
- Install texinfo, automake libssl
+ Install texinfo, automake, libssl (and libssl-dev)
 
- Then obtain SCEZ-ng:
-   Info: http://www.freshmeat.net/projects/scez
+ Two optional libraries can be downloaded and built, but
+   won't be covered here as we don't need them:
+     Keeper: http://www.inf.bme.hu/~mszeredi/keeper/
+     SCEZ-ng: http://www.freshmeat.net/projects/scez
+     All files can also be downloade from:
+     ftp://ftp.franken.de/pub/crypt/chipcards/scez/
 
- Then compile scez-ng
- ./configure
- make
- make install
-
- make -f Makefile.emu
+ Compile with 'make -f Makefile.emu'
 
  Result are atmos-emu, authtest, enctest, fstest
 
-* CT-API driver emulating card in a terminal
 
- Add -I/tmp/scez-ng to cflags
+* CT-API driver emulating card in a terminal
 
  make -f Makefile.ctapi
 
-------------------------------------------------------------------------
+-------------------------------------------------------------------------
 
 ATMOS is copyright 2008-2009 Davor Ocelic <docelic@spinlocksolutions.com>
 
index 1df3c31..ff67f12 100644 (file)
@@ -1,7 +1,7 @@
 
 #
 # ATMOS Makefile
-# C 2008 Davor Ocelic, docelic@spinlocksolutions.com
+# C 2008-2009 Davor Ocelic, docelic@spinlocksolutions.com
 # http://techpubs.spinlocksolutions.com/atmos/
 #
 
@@ -18,7 +18,8 @@ PORT=/dev/ttyS0
 
 # Size of the external EEPROM on the smartcard. Atmel's sizes are
 # usually in kilobits (i.e. AT90(256) and 24C256 are both 32 KByte).
-# Here we set it in kilobytes, so divide chip spec by 8.
+# Here we set it in kilobytes, so divide chip spec by 8, then find
+# the appropriate code in the below list.
 # 00: none, 01: 16KB, 02: 32KB, 03: 64KB, 04: 128KB,
 # 05: 256KB, 06: 512KB, 07: 1024KB, 08: 2048KB, FF: unspec.,
 EXT_EEPROM_SIZE=0x02
index 249346b..ee9a922 100644 (file)
@@ -2,7 +2,7 @@ CC=gcc
 AS=as
 OBJCOPY=objcopy
 
-CFLAGS=-Wall -I. -O6 -g -fpic -DCTAPI -I../../scez-ng
+CFLAGS+=-Wall -I. -O6 -g -fpic -DCTAPI
 
 SRC=\
        aes.c \
index 01633f0..a375137 100644 (file)
--- a/src/aes.c
+++ b/src/aes.c
@@ -97,6 +97,14 @@ void aes_enc( iu8 *v, iu8 *k, iu32 data_length )
                        state[counter] = state[counter]^round_key[counter];
        }
 
+#ifdef DEBUG
+  printf( "result( %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX, %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX %.2hX )\n",
+    v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7],
+    v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15],
+    k[0], k[1], k[2], k[3], k[4], k[4], k[6], k[7],
+    k[8], k[9], k[10], k[11], k[12], k[13], k[14], k[15]);
+#endif
+
 }
 
 void aes_dec( iu8 *v, iu8 *k, iu32 data_length )
index 21a2682..a1d468a 100644 (file)
--- a/src/aes.h
+++ b/src/aes.h
 #define AES_KEY_LEN   16  //!< AES key size.
 #define AES_BLOCK_LEN 16  //!< AES block length.
 
+#define AES_TEST_VAL 0x33, 0x22, 0x11, 0x00, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22
+#define AES_TEST_KEY 0x00, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
+#define AES_TEST_CHK 0x99, 0x3E, 0xB3, 0x30, 0x14, 0x5E, 0xC6, 0x59, 0x2F, 0x57, 0x26, 0xC6, 0xCC, 0xF8, 0x70, 0xF0
+
 /*! \brief AES encryption function.
 
        This function encrypts <EM>v</EM> with <EM>k</EM> and returns the
index e13feda..5bb2c63 100644 (file)
@@ -369,8 +369,8 @@ bool auth_createVerifyCryptogram( iu8 *cry, iu8 crylen, bool create,
 
        if( create ) {
 #if CONF_WITH_DECRYPT==1
-               if( enc ) crypt_enc( cry, key );
-               else crypt_dec( cry, key );
+               if( enc ) crypt_enc( cry, (iu8*)key );
+               else crypt_dec( cry, (iu8*)key );
 #else /* CONF_WITH_DECRYPT!=1 */
                crypt_enc( cry, key );
 #endif /* CONF_WITH_DECRYPT!=1 */
@@ -379,7 +379,7 @@ bool auth_createVerifyCryptogram( iu8 *cry, iu8 crylen, bool create,
        }
 
        /* Encrypt challenge */
-       crypt_enc( challenge, key );
+       crypt_enc( challenge, (iu8*)key );
 
        /* Compare result */
        if( memcmp( cry, challenge, crylen ) ) {
index b890a3c..e3d1688 100644 (file)
@@ -62,50 +62,50 @@ int main( int argc, char *argv[] )
        if( !auth_init() ) goto reterror;
 
        printf( "auth_verifyPin( PIN_TYPE_PIN, \"12341234\", 8 )\n" );
-       if( !auth_verifyPin( PIN_TYPE_PIN, "12341234", 8 ) ) goto reterror;
+       if( !auth_verifyPin( PIN_TYPE_PIN, (iu8*)"12341234", 8 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
 
        printf( "auth_verifyPin( PIN_TYPE_PIN, \"1234123\", 7 )\n" );
-       if( auth_verifyPin( PIN_TYPE_PIN, "1234123", 7 ) ) goto reterror;
+       if( auth_verifyPin( PIN_TYPE_PIN, (iu8*)"1234123", 7 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
        printf( "sw=%.4X\n", sw );
 
        printf( "auth_verifyPin( PIN_TYPE_PIN, \"12941234\", 8 )\n" );
-       if( auth_verifyPin( PIN_TYPE_PIN, "12941234", 8 ) ) goto reterror;
+       if( auth_verifyPin( PIN_TYPE_PIN, (iu8*)"12941234", 8 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
        printf( "sw=%.4X\n", sw );
 
        printf( "auth_verifyPin( PIN_TYPE_PIN, \"12341234\", 8 )\n" );
-       if( !auth_verifyPin( PIN_TYPE_PIN, "12341234", 8 ) ) goto reterror;
+       if( !auth_verifyPin( PIN_TYPE_PIN, (iu8*)"12341234", 8 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
 
        printf( "auth_verifyPin( PIN_TYPE_PIN, \"12941234\", 8 )\n" );
-       if( auth_verifyPin( PIN_TYPE_PIN, "12941234", 8 ) ) goto reterror;
+       if( auth_verifyPin( PIN_TYPE_PIN, (iu8*)"12941234", 8 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
        printf( "sw=%.4X\n", sw );
 
        printf( "auth_verifyPin( PIN_TYPE_PIN, \"12941234\", 8 )\n" );
-       if( auth_verifyPin( PIN_TYPE_PIN, "12941234", 8 ) ) goto reterror;
+       if( auth_verifyPin( PIN_TYPE_PIN, (iu8*)"12941234", 8 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
        printf( "sw=%.4X\n", sw );
 
        printf( "auth_verifyPin( PIN_TYPE_PIN, \"12941234\", 8 )\n" );
-       if( auth_verifyPin( PIN_TYPE_PIN, "12941234", 8 ) ) goto reterror;
+       if( auth_verifyPin( PIN_TYPE_PIN, (iu8*)"12941234", 8 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
        printf( "sw=%.4X\n", sw );
 
        printf( "auth_verifyPin( PIN_TYPE_PIN, \"12941234\", 8 )\n" );
-       if( auth_verifyPin( PIN_TYPE_PIN, "12941234", 8 ) ) goto reterror;
+       if( auth_verifyPin( PIN_TYPE_PIN, (iu8*)"12941234", 8 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
        printf( "sw=%.4X\n", sw );
 
        printf( "auth_verifyPin( PIN_TYPE_PIN, \"12941234\", 8 )\n" );
-       if( auth_verifyPin( PIN_TYPE_PIN, "12941234", 8 ) ) goto reterror;
+       if( auth_verifyPin( PIN_TYPE_PIN, (iu8*)"12941234", 8 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
        printf( "sw=%.4X\n", sw );
 
        printf( "auth_setPin( PIN_TYPE_PIN, \"56781234\", 8 )\n" );
-       if( !auth_setPin( PIN_TYPE_PIN, "56781234", 8 ) ) goto reterror;
+       if( !auth_setPin( PIN_TYPE_PIN, (iu8*)"56781234", 8 ) ) goto reterror;
 #else
  printf("Skipping disabled auth_init()\n" );
  printf("Skipping disabled auth_verifyPin( PIN_TYPE_PIN, \"12941234\", 8 )\n");
@@ -131,21 +131,25 @@ int main( int argc, char *argv[] )
 
 #if (CONF_WITH_PINAUTH==1) || (CONF_WITH_KEYAUTH==1)
        printf( "auth_verifyPin( PIN_TYPE_PUK, \"12345678\", 8 )\n" );
-       if( !auth_verifyPin( PIN_TYPE_PUK, "12345678", 8 ) ) goto reterror;
+       if( !auth_verifyPin( PIN_TYPE_PUK, (iu8*)"12345678", 8 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
        printf( "sw=%.4X\n", sw );
 
        challvalidity=1;
        challenge[0]=ntohl(0x9D75A946);
        challenge[1]=ntohl(0x0156A8C1);
+#if CONF_WITH_RETCODEMGR==1
+       sw=0x90;
+#else
        sw=0x9000;
+#endif
        printf( "auth_createVerifyCryptogram( ..., 8, FALSE, 0 )\n" );
-       if( !auth_createVerifyCryptogram( "\x01\x01\xE2\x1F\x05\x2A\xE1\xF3", 8, FALSE, 0 ) )
+       if( !auth_createVerifyCryptogram( (iu8*)"\x01\x01\xE2\x1F\x05\x2A\xE1\xF3", 8, FALSE, 0 ) )
                goto reterror;
        printf( "sw=%.4X\n", sw );
 
        printf( "auth_verifyPin( PIN_TYPE_KEY, \"...\", 8 )\n" );
-       if( !auth_verifyPin( PIN_TYPE_EXT, "\x01\x23\x45\x67\x89\xAB\xCD\xEF\x01\x23\x45\x67\x89\xAB\xCD\xEF", 16 ) ) goto reterror;
+       if( !auth_verifyPin( PIN_TYPE_EXT, (iu8*)"\x01\x23\x45\x67\x89\xAB\xCD\xEF\x01\x23\x45\x67\x89\xAB\xCD\xEF", 16 ) ) goto reterror;
        printf( "authstate=%.2X\n", authstate );
        printf( "sw=%.4X\n", sw );
 #else
index f0f9eeb..47ae728 100644 (file)
   - 2: NEWDES-SK
   - 3: AES
 */
-#define CONF_WITH_CRYPT_ALGO    2
+#define CONF_WITH_CRYPT_ALGO    3
 
 /* Verify dependencies */
 
index 60d7132..0ba462f 100644 (file)
@@ -38,7 +38,7 @@
 //#define CRYPT_ALGO_AES    3 //!< Algorithm ID: AES
 
 #if CONF_WITH_CRYPT_ALGO==0
-/* TEA */
+#define CRYPT_ALGO "TEA"
 #include <tea.h>
 //! Length of key in octets.
 #define CRYPT_KEY_LEN TEA_KEY_LEN
@@ -55,7 +55,7 @@
 #define crypt_dec(v,k) tea_dec((iu32*)(v),(iu32*)(k))
 
 #elif CONF_WITH_CRYPT_ALGO==1
-/* SKIPJACK */
+#define CRYPT_ALGO "SKIPJACK"
 #include <skipjack.h>
 #define CRYPT_KEY_LEN SKIPJACK_KEY_LEN
 #define CRYPT_BLOCK_LEN SKIPJACK_BLOCK_LEN
@@ -66,7 +66,7 @@
 #define crypt_dec(v,k) skipjack_dec((iu8*)(v),(iu8*)(k))
 
 #elif CONF_WITH_CRYPT_ALGO==2
-/* NEWDES-SK */
+#define CRYPT_ALGO "NEWDES-SK"
 #include <newdes-sk.h>
 #define CRYPT_KEY_LEN NEWDESSK_KEY_LEN
 #define CRYPT_BLOCK_LEN NEWDESSK_BLOCK_LEN
 #define crypt_dec(v,k) newdessk_dec((iu8*)(v),(iu8*)(k))
 
 #elif CONF_WITH_CRYPT_ALGO==3
-/* AES */
+#define CRYPT_ALGO "AES"
 #include <aes.h>
 #define CRYPT_KEY_LEN AES_KEY_LEN
 #define CRYPT_BLOCK_LEN AES_BLOCK_LEN
 #define CRYPT_TEST_VAL AES_TEST_VAL
 #define CRYPT_TEST_KEY AES_TEST_KEY
 #define CRYPT_TEST_CHK AES_TEST_CHK
-#define crypt_enc(v,k) aes_enc((iu8*)(v),(iu16*)(k),8)
-#define crypt_dec(v,k) aes_dec((iu8*)(v),(iu16*)(k),8)
+#define crypt_enc(v,k) aes_enc(v,k,1)
+#define crypt_dec(v,k) aes_dec(v,k,1)
 
 #else
 #error No valid crypto algorithm selected.
 #endif
 
+#define TO_STRING(x) #x
+
 #endif /* ATMOS_CRYPT_H */
 
index 2f66cc7..2369625 100644 (file)
@@ -17,14 +17,17 @@ int main() {
        clock_t elapsed;
 #endif
 
-       printf("Using crypt algorithm ID %d\n", CONF_WITH_CRYPT_ALGO);
+       printf("Using crypt algorithm %s, block size %d, key length %d\n",
+               CRYPT_ALGO, CRYPT_BLOCK_LEN, CRYPT_KEY_LEN);
 
-       memcpy( enc, inp, );
+       memcpy( enc, inp, CRYPT_BLOCK_LEN);
        crypt_enc( enc, key );
-       printf((memcmp(enc, chk, 8) == 0) ? "encryption OK!\n" : "encryption failure!\n");
-       memcpy( dec, enc, 8 );
+       printf((memcmp(enc, chk, CRYPT_BLOCK_LEN) == 0) ?
+               "encryption OK!\n" : "encryption failure!\n");
+       memcpy( dec, enc, CRYPT_BLOCK_LEN);
        crypt_dec( dec, key );
-       printf((memcmp(dec, inp, 8) == 0) ? "decryption OK!\n" : "decryption failure!\n");
+       printf((memcmp(dec, inp, CRYPT_BLOCK_LEN) == 0) ?
+               "decryption OK!\n" : "decryption failure!\n");
 
 #ifdef BENCHMARK
        elapsed = -clock();
index 9908724..6afa83c 100644 (file)
@@ -320,12 +320,12 @@ bool hal_rnd_getBlock( iu8 *dst )
        key[2]=key[1];
        key[3]=key[0];
 
-       crypt_enc( block, key );
+       crypt_enc( (iu8*)block, (iu8*)key );
 
        if( !hal_eeprom_write( RAND_STATE_ADDR, (iu8*)block, RAND_STATE_LEN ) )
                return FALSE;
 
-       crypt_enc( block, key );
+       crypt_enc( (iu8*)block, (iu8*)key );
 
        memcpy( dst, block, sizeof(block) );