#include #include #include #ifdef HAVE_STRINGS_H #include #endif #ifdef WITH_CONTIKI #include "contiki.h" #include "contiki-lib.h" #include "contiki-net.h" #endif /* WITH_CONTIKI */ //#include "debug.h" #include "numeric.h" #include "ccm.h" #include "ccm-testdata.c" #ifndef HAVE_FLS int fls(unsigned int i) { int n; for (n = 0; i; n++) i >>= 1; return n; } #endif void dump(unsigned char *buf, size_t len) { size_t i = 0; while (i < len) { printf("%02x ", buf[i++]); if (i % 4 == 0) printf(" "); if (i % 16 == 0) printf("\n\t"); } printf("\n"); } #ifdef WITH_CONTIKI PROCESS(ccm_test_process, "CCM test process"); AUTOSTART_PROCESSES(&ccm_test_process); PROCESS_THREAD(ccm_test_process, ev, d) { #else /* WITH_CONTIKI */ int main(int argc, char **argv) { #endif /* WITH_CONTIKI */ long int len; int n; rijndael_ctx ctx; #ifdef WITH_CONTIKI PROCESS_BEGIN(); #endif /* WITH_CONTIKI */ for (n = 0; n < sizeof(data)/sizeof(struct test_vector); ++n) { if (rijndael_set_key_enc_only(&ctx, data[n].key, 8*sizeof(data[n].key)) < 0) { fprintf(stderr, "cannot set key\n"); return -1; } len = dtls_ccm_encrypt_message(&ctx, data[n].M, data[n].L, data[n].nonce, data[n].msg + data[n].la, data[n].lm - data[n].la, data[n].msg, data[n].la); len += + data[n].la; printf("Packet Vector #%d ", n+1); if (len != data[n].r_lm || memcmp(data[n].msg, data[n].result, len)) printf("FAILED, "); else printf("OK, "); printf("result is (total length = %lu):\n\t", len); dump(data[n].msg, len); len = dtls_ccm_decrypt_message(&ctx, data[n].M, data[n].L, data[n].nonce, data[n].msg + data[n].la, len - data[n].la, data[n].msg, data[n].la); if (len < 0) printf("Packet Vector #%d: cannot decrypt message\n", n+1); else printf("\t*** MAC verified (total length = %lu) ***\n", len + data[n].la); } #ifdef WITH_CONTIKI PROCESS_END(); #else /* WITH_CONTIKI */ return 0; #endif /* WITH_CONTIKI */ }