FreeCalypso > hg > freecalypso-tools
diff rvinterf/etmsync/pirimei.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 Jun 2016 00:13:35 +0000 |
parents | |
children | 3d148edb87c2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/etmsync/pirimei.c Sat Jun 11 00:13:35 2016 +0000 @@ -0,0 +1,44 @@ +/* + * Reading and decryption of Pirelli's factory IMEI record + */ + +#include <sys/types.h> +#include <openssl/des.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "exitcodes.h" + +u_char pirelli_imeisv[8]; + +get_pirelli_imei() +{ + DES_cblock ciphertext[2], dieid_key, decrypted[2]; + DES_key_schedule keysched; + int rc; + static char failmsg[] = + "decryption failed: no valid IMEI record or incompatible firmware\n"; + + printf("Requesting Calypso die ID\n"); + rc = do_dieid_read(dieid_key); + if (rc) + return(rc); + printf("Reading IMEI record in Pirelli's factory data block\n"); + rc = do_memory_read(0x027F0504, ciphertext, 16); + if (rc) + return(rc); + DES_set_key_unchecked(&dieid_key, &keysched); + DES_ecb_encrypt(&ciphertext[0], &decrypted[0], &keysched, DES_DECRYPT); + DES_ecb_encrypt(&ciphertext[1], &decrypted[1], &keysched, DES_DECRYPT); + if (bcmp(decrypted[1], dieid_key, 8)) { + printf(failmsg); + return(ERROR_TARGET); + } + bcopy(decrypted[0], pirelli_imeisv, 8); + printf("Factory IMEISV is %02X%02X%02X%02X-%02X%02X%02X-%02X\n", + pirelli_imeisv[0], pirelli_imeisv[1], pirelli_imeisv[2], + pirelli_imeisv[3], pirelli_imeisv[4], pirelli_imeisv[5], + pirelli_imeisv[6], pirelli_imeisv[7]); + return(0); +}