comparison doc/IMEI @ 17:4644799cb515

doc/IMEI written
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 19 Oct 2016 01:26:12 +0000
parents
children 232e36a227dd
comparison
equal deleted inserted replaced
16:cc204f908f32 17:4644799cb515
1 IMEI vs. IMEISV
2 ===============
3
4 There is a subtle distinction between an IMEI and an IMEISV. The first 14
5 digits are the same between the two: the supposedly-world-unique number of a
6 given piece of hardware. In a traditional IMEI 15-digit number the significant
7 14 digits are followed by a Luhn check digit, whereas an IMEISV has 16 digits:
8 the 14 significant digits of the IMEI, *no* Luhn check digit, and two digits of
9 "software version".
10
11 It is up to device manufacturers and firmware designers to decide whether or
12 not to store the Luhn check digit in the GSM device's flash or EEPROM or
13 whatever, but it is not sent over the air: instead the IMEISV is sent. It
14 appears that the GSM standard authors' intent was that the IMEI part is stored
15 immutably in each manufactured device whereas the SV digits are added by the
16 running firmware to indicate its version, but the IMEI handling scheme
17 implemented in TI's reference firmware and retained by many of the TI-based GSM
18 device manufacturers (at least FIC/Openmoko and Foxconn/Pirelli) dispenses away
19 with the IMEI vs. IMEISV distinction.
20
21 IMEI storage and retrieval in TI's reference firmware
22 =====================================================
23
24 When running on the plain Calypso as opposed to Calypso+, TI's TCS211 reference
25 firmware supports two ways of storing and retrieving the IMEI: obfuscated and
26 unobfuscated. In both schemes the IMEI datum is stored as a file in the
27 device's flash file system (FFS), and even though the FFS filename calls it the
28 IMEI, the content of this file is really treated as the IMEISV: 16 digits are
29 stored, the firmware function responsible for reading the IMEI datum out of FFS
30 and passing it on to the rest of the fw is called cl_get_imeisv(), the code in
31 this function does not transform the 16 digits in any way, and the downstream
32 recipients of these digits treat them as the IMEISV.
33
34 The two specific schemes offered by TCS211 fw are as follows:
35
36 In the unobfuscated scheme (FF_PROTECTED_IMEI not defined), the so-called IMEI
37 but really IMEISV is stored in an FFS file named /pcm/IMEI. The file is 8 bytes
38 long, each byte stores two IMEISV digits, and the order of the digits within
39 each byte is reversed relative to the natural order: first the least significant
40 nibble is used, then the most significant nibble.
41
42 In the obfuscated scheme (FF_PROTECTED_IMEI is defined), the so-called IMEI but
43 really IMEISV is stored in an FFS file named /gsm/imei.enc. The file is 16
44 bytes long: the first 8 bytes store the 16-digit IMEISV encrypted with DES,
45 using the Calypso die ID as the key, and the last 8 bytes store that Calypso die
46 ID DES-encrypted with itself. Underneath the obfuscation, the 16 IMEISV digits
47 are stored in the 8 bytes in the natural order: first the most significant
48 nibble is used, then the least significant nibble.
49
50 IMEI storage and retrieval schemes implemented by device manufacturers
51 ======================================================================
52
53 Openmoko devices use the unobfuscated IMEI storage method unchanged from TI's
54 reference fw: the factory-assigned IMEI is stored in an FFS file named
55 /pcm/IMEI, and that is where the original mokoN firmwares look for it. Further
56 blurring the distinction between the IMEI and the IMEISV, the 16 digits stored
57 in /pcm/IMEI (which the fw treats as the IMEISV) were factory-programmed as the
58 15-digit IMEI (with the Luhn check digit) with an appended 0, i.e., the SV
59 digits get set to x0 where x is the Luhn check digit.
60
61 Foxconn, the makers of the Pirelli DP-L10, have used the obfuscated version of
62 TI's IMEI handling mechanism instead, with an additional twist: instead of
63 storing the 16-byte encrypted datum in /gsm/imei.enc in FFS, they have moved it
64 into their own factory data record stored in a non-FFS sector of the flash.
65 The content of the 16 digits treated as the IMEISV by the G23M component of the
66 fw is the same as Openmoko's: 15-digit IMEI with the Luhn check digit followed
67 by a 0 digit.
68
69 Compal, the makers of Motorola C1xx phones, have similarly moved their IMEI out
70 of FFS into their own proprietary flash data structures, and we have never
71 decoded the latter, hence we don't know exactly where and how their IMEI is
72 stored. If you wish to run FreeCalypso firmware on these phones, you have to
73 set your own IMEISV for our fw even if you are not seeking to make it different
74 from the factory-assigned one, as we don't know how to retrieve the latter.
75
76 Changing the IMEI
77 =================
78
79 When someone says that they wish to change the IMEI on their phone, they need
80 to be a little clearer as to what they really mean, as there are two possible
81 interpretations of the just-stated wish:
82
83 1. Transmitting a different IMEISV toward the network by running your own
84 firmware on the device,
85
86 or
87
88 2. Changing the IMEI seen by the device's original proprietary firmware.
89
90 Interpretation 1 is much easier than interpretation 2: when you are writing your
91 own firmware for an "alien" GSM device (hardware designed and made by someone
92 other than you), it is much easier to just set your own IMEISV and be done with
93 it than to figure out how to retrieve the factory-assigned one. Thus those
94 device manufacturers who try to make it more difficult to change their IMEIs
95 are actually creating the opposite effect: people will just set their own IMEISV
96 when running their own fw on their hw.
97
98 Openmoko devices are a rare exception in that if you write your own IMEISV into
99 /pcm/IMEI in FFS, your new IMEISV will take effect not only with FreeCalypso
100 firmware, but also with the legacy mokoN fw versions, because they all look in
101 /pcm/IMEI. The same does NOT hold with Compal/Motorola or Foxconn/Pirelli
102 phones, however: if you wish to change their IMEI to be seen by their original
103 proprietary firmwares, you are on your own, as we do not currently have any
104 tools for accomplishing such a feat.
105
106 IMEI handling in FreeCalypso
107 ============================
108
109 The FreeCalypso family of projects has adopted the following IMEI storage and
110 retrieval scheme both for our own FreeCalypso-made hardware and for FreeCalypso
111 firmwares running on alien hardware: all of our firmware versions regardless of
112 target will look first in /etc/IMEISV, then in /pcm/IMEI when needing to obtain
113 the IMEISV for GSM operation. This is the new unified convention; previously
114 we used varying IMEISV retrieval schemes depending on the target and in
115 different FC firmware projects. The new unified convention is backward-
116 compatible with our previous schemes on every target.
117
118 The /etc/IMEISV file is a FreeCalypso invention. The file is 8 bytes long, and
119 stores the 16 digits of the IMEISV in the natural order: first the most
120 significant nibble is used, then the least significant nibble. This nibble
121 order makes the IMEISV number directly readable in a hex dump of the file, and
122 the filename /etc/IMEISV makes it clear that the last two digits are the SV and
123 are not required to be equal to the Luhn check digit and 0.
124
125 Both /etc/IMEISV and /pcm/IMEI can be written with the fc-fsio utility's
126 set-imeisv command:
127
128 set-imeisv fc XXXXXXXX-YYYYYY-ZZ # write /etc/IMEISV
129 set-imeisv pcm XXXXXXXX-YYYYYY-ZZ # write /pcm/IMEI
130
131 When working on Openmoko devices, we recommend writing your IMEISV into
132 /pcm/IMEI (set-imeisv pcm command) and not creating an /etc/IMEISV file: newer
133 FC firmware versions will look in both locations, but older FC fw versions and
134 the legacy mokoN ones look only in /pcm/IMEI. On all other targets we recommend
135 using the new /etc/IMEISV storage format, i.e., you should use the set-imeisv fc
136 variant.