X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/a66fca86b9f81e07161e89c101338968eda9d6c5..ea25e3ec2b5570d009fd64981b6681a68a8c5d7a:/client/loclass/cipherutils.c diff --git a/client/loclass/cipherutils.c b/client/loclass/cipherutils.c index 685a3815..b5e365bf 100644 --- a/client/loclass/cipherutils.c +++ b/client/loclass/cipherutils.c @@ -1,5 +1,17 @@ /***************************************************************************** - * This file is part of iClassCipher. It is a reconstructon of the cipher engine + * WARNING + * + * THIS CODE IS CREATED FOR EXPERIMENTATION AND EDUCATIONAL USE ONLY. + * + * USAGE OF THIS CODE IN OTHER WAYS MAY INFRINGE UPON THE INTELLECTUAL + * PROPERTY OF OTHER PARTIES, SUCH AS INSIDE SECURE AND HID GLOBAL, + * AND MAY EXPOSE YOU TO AN INFRINGEMENT ACTION FROM THOSE PARTIES. + * + * THIS CODE SHOULD NEVER BE USED TO INFRINGE PATENTS OR INTELLECTUAL PROPERTY RIGHTS. + * + ***************************************************************************** + * + * This file is part of loclass. It is a reconstructon of the cipher engine * used in iClass, and RFID techology. * * The implementation is based on the work performed by @@ -10,7 +22,7 @@ * * This is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. + * by the Free Software Foundation, or, at your option, any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,15 +30,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with IClassCipher. If not, see . + * along with loclass. If not, see . + * + * ****************************************************************************/ -#include "cipherutils.h" -#include "../util.h" #include #include #include - +#include "fileutils.h" +#include "cipherutils.h" /** * * @brief Return and remove the first bit (x0) in the stream : @@ -101,6 +114,24 @@ int numBits(BitstreamOut *stream) return stream->numbits; } +void x_num_to_bytes(uint64_t n, size_t len, uint8_t* dest) +{ + while (len--) { + dest[len] = (uint8_t) n; + n >>= 8; + } +} + +uint64_t x_bytes_to_num(uint8_t* src, size_t len) +{ + uint64_t num = 0; + while (len--) + { + num = (num << 8) | (*src); + src++; + } + return num; +} uint8_t reversebytes(uint8_t b) { b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; b = (b & 0xCC) >> 2 | (b & 0x33) << 2; @@ -115,13 +146,76 @@ void reverse_arraybytes(uint8_t* arr, size_t len) arr[i] = reversebytes(arr[i]); } } +void reverse_arraycopy(uint8_t* arr, uint8_t* dest, size_t len) +{ + uint8_t i; + for( i =0; i< len ; i++) + { + dest[i] = reversebytes(arr[i]); + } +} +void printarr(char * name, uint8_t* arr, int len) +{ + int cx; + size_t outsize = 40+strlen(name)+len*5; + char* output = malloc(outsize); + memset(output, 0,outsize); + + int i ; + cx = snprintf(output,outsize, "uint8_t %s[] = {", name); + for(i =0 ; i< len ; i++) + { + cx += snprintf(output+cx,outsize-cx,"0x%02x,",*(arr+i));//5 bytes per byte + } + cx += snprintf(output+cx,outsize-cx,"};"); + prnlog(output); + free(output); +} + +void printvar(char * name, uint8_t* arr, int len) +{ + int cx; + size_t outsize = 40+strlen(name)+len*2; + char* output = malloc(outsize); + memset(output, 0,outsize); + + int i ; + cx = snprintf(output,outsize,"%s = ", name); + for(i =0 ; i< len ; i++) + { + cx += snprintf(output+cx,outsize-cx,"%02x",*(arr+i));//2 bytes per byte + } + + prnlog(output); + free(output); +} + +void printarr_human_readable(char * title, uint8_t* arr, int len) +{ + int cx; + size_t outsize = 100+strlen(title)+len*4; + char* output = malloc(outsize); + memset(output, 0,outsize); + + + int i; + cx = snprintf(output,outsize, "\n\t%s\n", title); + for(i =0 ; i< len ; i++) + { + if(i % 16 == 0) + cx += snprintf(output+cx,outsize-cx,"\n%02x| ", i ); + cx += snprintf(output+cx,outsize-cx, "%02x ",*(arr+i)); + } + prnlog(output); + free(output); +} //----------------------------- // Code for testing below //----------------------------- - +#ifndef ON_DEVICE int testBitStream() { uint8_t input [] = {0xDE,0xAD,0xBE,0xEF,0xDE,0xAD,0xBE,0xEF}; @@ -137,14 +231,14 @@ int testBitStream() } if(memcmp(input, output, sizeof(input)) == 0) { - printf("Bitstream test 1 ok\n"); + prnlog(" Bitstream test 1 ok"); }else { - printf("Bitstream test 1 failed\n"); + prnlog(" Bitstream test 1 failed"); uint8_t i; for(i = 0 ; i < sizeof(input) ; i++) { - printf("IN %02x, OUT %02x\n", input[i], output[i]); + prnlog(" IN %02x, OUT %02x", input[i], output[i]); } return 1; } @@ -171,14 +265,14 @@ int testReversedBitstream() } if(memcmp(input, output, sizeof(input)) == 0) { - printf("Bitstream test 2 ok\n"); + prnlog(" Bitstream test 2 ok"); }else { - printf("Bitstream test 2 failed\n"); + prnlog(" Bitstream test 2 failed"); uint8_t i; for(i = 0 ; i < sizeof(input) ; i++) { - printf("IN %02x, MIDDLE: %02x, OUT %02x\n", input[i],reverse[i], output[i]); + prnlog(" IN %02x, MIDDLE: %02x, OUT %02x", input[i],reverse[i], output[i]); } return 1; } @@ -188,8 +282,10 @@ int testReversedBitstream() int testCipherUtils(void) { + prnlog("[+] Testing some internals..."); int retval = 0; retval |= testBitStream(); retval |= testReversedBitstream(); return retval; } +#endif