// EPOS Simmetric Implementation // // Author: fabio // Documentation: $EPOS/doc/crypter Date: 29 Jun 2004 #include "rc5.h" // TODO: No such file (?!?!) - ver como meter o -I na parada //#include #include __BEGIN_SYS // TODO: fazer isso ser um atributo (ver como mete no xml) RC5 rc5; // Class attributes // type Simmetric::attribute; // Constructors Simmetric::Simmetric() { db(TRC) << "Simmetric()\n"; // TODO: Gerar chave randomica a primeira vez e gravar na flash para as leituras futuras unsigned char key[16] = "&hr65#l%"; this->seedKey(key, 8); } Simmetric::~Simmetric() { db(TRC) << "~Simmetric()\n"; } // Methods /** ********************************************************************* * EnCrypt ********************************************************************/ void Simmetric::encrypt(unsigned char * data_in, int size_in, unsigned char * data_out, int size_out) { db(TRC) << "Simmetric::encrypt(data_in= " << data_in << ", size_in= " << size_in << ", data_out= " << data_out << ", size_out= " << size_out << ")\n"; int block_size = WSIZE/8 * 2; // TODO: assert undeclared (WTF?!?!!?) // assert(size_in % block_size == 0); // assert(size_out >= size_in); int nblocks = size_in / block_size; UCHAR *data_in_ptr = (UCHAR*)data_in; UCHAR *data_out_ptr = (UCHAR*)data_out; for (int i = 0; i < nblocks; i++) { RC5::Block in_block((UCHAR*)data_in_ptr); data_in_ptr += block_size; RC5::Block out_block = rc5.encrypt(in_block); out_block.extract(data_out_ptr); data_out_ptr += block_size; } } /** ********************************************************************* * DeCrypt ********************************************************************/ void Simmetric::decrypt(unsigned char * data_in, int size_in, unsigned char * data_out, int size_out) { db(TRC) << "Simmetric::decrypt(data_in= " << data_in << ", size_in= " << size_in << ", data_out= " << data_out << ", size_out= " << size_out << ")\n"; int block_size = WSIZE/8 * 2; // TODO: assert undeclared (WTF?!?!!?) // assert(size_in % block_size == 0); // assert(size_out >= size_in); int nblocks = size_in / block_size; UCHAR *data_in_ptr = (UCHAR*)data_in; UCHAR *data_out_ptr = (UCHAR*)data_out; for (int i = 0; i < nblocks; i++) { RC5::Block in_block((UCHAR*)data_in_ptr); data_in_ptr += block_size; RC5::Block out_block = rc5.decrypt(in_block); out_block.extract(data_out_ptr); data_out_ptr += block_size; } } /** ********************************************************************* * seedKey ********************************************************************/ void Simmetric::seedKey(unsigned char * key_data, int key_size) { db(TRC) << "Simmetric::seedKey(key_data= " << key_data << ", key_size= " << key_size << ")\n"; RC5::Key key((UCHAR*)key_data, key_size); rc5.setKey(key); } // Class methods __END_SYS