FreeCalypso > hg > freecalypso-sw
diff rvinterf/etmsync/pirimei.c @ 916:8e1c55cf7989
fc-getpirimei implemented, compiles
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Tue, 08 Sep 2015 18:59:29 +0000 |
parents | |
children | 9b4b0fcddc77 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/etmsync/pirimei.c Tue Sep 08 18:59:29 2015 +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[1], 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); +}