The IMEI (International Mobile Station Equipment Identity) is a 15-digit number to uniquely identify a mobile phone device. IMEISV (IMEI Software Version) is a 16-digit number with the IMEI and an additional software version number.

As of 2004, the formats of the IMEI and IMEISV are `AA-BBBBBB-CCCCCC-D` and `AA-BBBBBB-CCCCCC-EE` respectively. The definition of the formats can be found below.

AABB-BB-BBCC-CC-CCDEE
TACTACSNCDSVN
• TAC : Type Allocation Code
• SN : Serial Number
• CD : Check Digit based on Luhn algorithm
• SVN : Software Version Number

If you notice the format, the 15th digit of the IMEI is a check digit and the IMEISV has a 2-digit software version number but without the check digit.

To retrieve information of a mobile device, we normally perform an IMEI lookup rather than an IMEISV lookup. To retrieve the IMEI from the IMEISV , we need to perform the following steps:

1. Remove the last 2 digits (SVN) from IMEISV, leaving us with the IMEI but without the check digit
2. Compute the check digit based on the Luhn algorithm

## Luhn Algorithm Check Digit Computation

1. Starting from the right, double every other digit (e.g., 8 → 16).
2. Sum the digits (e.g., 16 → 1 + 6).
3. The sum plus the check digit must be divisable by 10 (e.g., sum is 52, check digit must be 8, since 60 is divisable by 10).

For IMEI `35576205279323?`, the check digit computation is as follows.

IMEI35576205279323?
Double every other310514640102149626?
Sum digits3 +1 + 05 +1 + 4 +6 +4 +0 +1 + 0 +2 +1 + 4 +9 +6 +2 +6 +? = 55 + ?

For the sum to be divisible by 10, we need to set ? = 5, so the IMEI is `355762052793235`.

### Mohamed Ibrahim ibrahim = { interested_in(unix, linux, android, open_source, reverse_engineering); coding(c, shell, php, python, java, javascript, nodejs, react, vuejs); plays_on(xbox, ps4); linux_desktop_user(true); }