NAME
rabbitsign - sign applications for TI graphing calculators
SYNOPSIS
rabbitsign [ options ] [ -o appfile ] [ -k keyfile ] hexfile ...
rabbitsign [ options ] [ -k keyfile ] -c hexfile ...
DESCRIPTION
rabbitsign is an implementation of Texas Instruments’ Rabin and RSA
signing algorithms, as used on the TI-73, TI-83 Plus, TI-84 Plus,
TI-89, and TI-92 Plus graphing calculators. These algorithms are used
to sign Flash applications and operating systems so that the calculator
can recognize them as valid.
rabbitsign, like Texas Instruments’ official signing programs, needs a
private key (a pair of large prime numbers) to sign apps. In order for
the app to be accepted, the corresponding public key (their product)
must be present on the calculator. As of this writing, the
‘‘shareware’’ private key number 0104, used for signing applications
for the TI-83 Plus and TI-84 Plus, is available through TI’s SDK.
Unfortunately, the OS signing keys, as well as the app signing keys for
the TI-73, TI-89, and TI-92 Plus, have not been released, which means
that only TI can sign apps and OSes for those calculators.
OPTIONS
-a Attempt to match the output of Peter-Martijn Kuipers’ appsign
program, for testing purposes. The resulting output file will
have Unix-style line termination, and hence will not be
compatible with all programs. This option is not recommended
for ordinary use.
-b Assume input files are raw binary files. If this option is not
given, the file type is detected automatically.
-c Do not sign apps; instead, check that the signatures of the
specified apps are valid. Exit status is 0 if all apps are
valid, 1 if one or more apps fail, or 2 if there is a non-
mathematical error.
-f Ignore non-fatal errors, and force the application to be signed
if possible. (All of these messages are there for a reason,
though, and chances are that if your app generates any of them,
it will also either fail validation or crash the calculator.
You have been warned.)
-g Write the output file in GraphLink ‘‘TIFL’’ format. (By default
and for historical reasons, apps and OSes for the TI-73 and
TI-83 Plus are written in plain TI Hex format instead; you can
use packxxk(1) to convert these files into TIFL format.) Apps
and OSes for the TI-89 and TI-92 Plus are always written in TIFL
format. See APPLICATION FILE FORMATS below for more
information.
-k keyfile
Read signing and/or validation keys from the given file. This
file must be in one of the formats used by TI’s SDK tools. (See
KEY FILE FORMATS below.) By default, rabbitsign searches for
the key named in the app header (for example, 0104.key for
‘‘shareware’’ TI-83 Plus apps.)
-K id Search for the key with the given id (a small hexadecimal
number) rather than the ID specified in the app header.
-n Attempt to sign the program as-is, without modifying the header.
(This option may not produce a file that the calculator will
actually accept; it is intended for testing and special-purpose
signatures, not for ordinary app signing.)
-o outfile
Specify the output file. By default, output files are named by
taking the name of the input file, removing any suffix, and
adding a ‘.app’ or ‘.8xk’ suffix depending on whether -g is
specified. (If the input file already has a ‘.app’ or ‘.8xk’
suffix, ‘-signed’ is inserted, so ‘myapp.8xk’ becomes ‘myapp-
signed.8xk’.)
If ‘-’ is specified as an input file, that indicates the
standard input, and the signed result is written by default to
the standard output.
-p Fix the app pages header. This is not done by default because
an incorrect pages header is generally a sign of a much more
serious problem.
-P If the application ends close to a page boundary, add an
additional page to hold the signature. (Application signatures
on the TI-73 and TI-83 Plus are not allowed to span a page
boundary.) Keep in mind that this is extremely wasteful, as it
consumes 16384 bytes of Flash to hold approximately 69 bytes of
data; if your application is in this situation, you should
consider trying to reduce its size slightly, or alternatively,
adding more data to take advantage of the extra Flash page.
-q Do not print non-fatal warning messages.
-r Re-sign a previously signed app (i.e., discard the previous
signature before signing.)
-R n For signing TI-73 and TI-83 Plus applications, use root number n
(0 ≤ n ≤ 3) rather than the default, root number 0. All four
roots are valid, though distinct, signatures, so this option is
mainly for debugging.
Root 0 is computed so as to be congruent to m^[(p+1)/4] modulo p
and m^[(q+1)/4] modulo q. Root 1 is the negation of root 0
modulo p, root 2 the negation modulo q, and root 3 the negation
both modulo p and modulo q.
This option has no effect when signing OSes or TI-89/92 Plus
applications, which use the RSA algorithm rather than Rabin.
-t type
Explicitly specify the type of program (e.g., ‘8xk’ for a TI-83
Plus application, or ‘73u’ for a TI-73 operating system.) The
default behavior is to infer the program type from the name of
the input file. (If the input file does not have a recognized
suffix, the type is guessed based on the contents of the program
header.)
-u Disable automatic page detection, and assume input files are
unsorted. This means that page boundaries must be defined
explicitly. (See APPLICATION FILE FORMATS below.) This option
has no effect in binary (-b) mode.
-v Be verbose; print out the names of apps and their signatures as
they are signed. Use -vv for more detailed information about
the computation.
--help Print out a summary of options.
--version
Print out version information.
APPLICATION FILE FORMATS
Intel Hex
Intel hex is a standard ASCII file format used by many PROM
programmers, and a common assembler output format. Each line (or
‘‘record’’) consists of the following:
:NNAAAATTDDDDDD...CC
: The first character of the line is a colon; this is just used to
identify the format.
NN The next two characters are the number of data bytes on this
line, written in uppercase ASCII hexadecimal.
AAAA The next four digits are the address of the data on this line.
rabbitsign only looks at the low 14 bits of this value.
TT These two digits identify the ‘‘type’’ of the record. Intel hex
defines several record types for various addressing models; the
only types which are meaningful for TI calculators are types 00
(ordinary data) and 01 (end of file.)
DD... 2*NN hex digits follow, the actual data.
CC Finally, the inverted checksum is added, so that adding up all
the bytes on the line gives a total of zero modulo 256. (As an
extension, rabbitsign permits you to use two uppercase ‘X’s in
place of a checksum.)
Since the address is only 16 bits, this format cannot unambiguously
represent applications larger than 64 kilobytes. To enable multi-page
applications to be created, rabbitsign attempts to detect page
boundaries automatically, starting a new page for each field with a
zero address. Thus to create a multi-page app, you can simply
concatenate several Intel Hex files, e.g.
cat page0.hex page1.hex | rabbitsign - -o complete.app
This will only work if the records are correctly sorted within each
page. (If the assembler does not generate records in order, you can
sort the fields yourself using a command such as ‘sort -k1.8,1.9
-k1.4,1.7’.)
To turn off this automatic page detection, use the -u option. In this
case, you must define page boundaries explicitly using the TI Hex
format.
TI Hex
‘‘TI’’ hex is an extension to Intel hex which provides unambiguous
representation of multi-page apps. It adds records of the form
:0200000200NNCC
which indicate that subsequent data is placed on relative page number
NN. (Keep in mind that the TI-83 and 84 Plus install applications
‘‘backwards,’’ so if relative page 0 is stored on absolute page 69,
relative page 1 will be stored on absolute page 68, and so forth.)
Some assemblers can generate multi-page data using type 4 records
instead of type 2; rabbitsign treats these as equivalent to type 2.
For compatibility with other software which makes certain assumptions
about the format, rabbitsign will write 32 bytes per line, and will end
lines with a DOS-style carriage return and line feed.
GraphLink TIFL
The standard (newer) GraphLink format consists of a 78-byte binary
header which is added to the start of a hex or binary file. The
contents of this header are as follows:
0x00-07
The string ‘**TIFL**’.
0x08 The major version number (‘‘App ID’’) of the application.
0x09 The minor version number (‘‘App Build’’) of the application.
0x0A Flags; apparently intended to indicate whether the contents of
the file are binary (0) or TI Hex (1). This value is not,
however, set consistently by other software.
0x0B ‘‘Object Type’’ field; apparently indicates something about the
type of data. Set to 0x88 in most TI-73 and TI-83 Plus files;
set to 0 in TI-89 and TI-92 Plus files.
0x0C-0F
Binary-coded decimal month (one byte), day (one byte), and year
(two bytes, big endian) when the app was signed.
0x10 Length of the app’s name.
0x11-18
Name of the app.
0x19-2F
Reserved, always set to zero.
0x30 Calculator type (0x73 = TI-83 Plus, 0x74 = TI-73, 0x88 = TI-92
Plus, 0x98 = TI-89.)
0x31 Type of data (0x23 = OS upgrade, 0x24 = application, 0x25 =
certificate.)
0x32-49
Reserved, always set to zero.
0x4A-4D
Little endian length of the following data (the length of the
hex file, not the on-calculator size of the application.)
There also exist multi-part TIFL files, which simply consist of two or
more TIFL files concatentated together. (For instance, a software
license agreement or a certificate file can be attached to an
application.) rabbitsign handles these files in a limited way: it will
read only the first section with a recognized data type, ignoring any
other data in the file. rabbitsign cannot create multi-part TIFL
files, but they can be created using packxxk(1) (or simply using
cat(1).)
Binary
rabbitsign can also read binary app files; they are assumed to be
contiguous, so when signing a multi-page app, each page except the last
must be filled to a full 16k.
KEY FILE FORMATS
Key files contain the data needed for signing and validating
applications. (The portion of the key file used for validating is
known as the ‘‘public’’ key; the portion used for signing is the
‘‘private’’ key. Only the public key is stored on the calculator
itself.) Official key files from TI come in two varieties, known as
‘‘Rabin’’ and ‘‘RSA’’ formats. Note that rabbitsign currently supports
using Rabin-type key files to generate RSA signatures, but not the
other way around.
Rabin key format
The Rabin key file format is typically used for TI-73 and TI-83 Plus
application signing keys. It consists of three lines, each containing
a big integer. The first line is the public key, n; the second and
third are its two factors, p and q.
Each line begins with two hexadecimal digits, giving the length of the
number in bytes, followed by the bytes themselves, written in
hexadecimal in little-endian order.
RSA key format
The RSA key file format is typically used for TI-89 and TI-92 Plus
application signing keys. It consists of three lines: the key ID, the
public key n, and the signing exponent d. (d is the inverse of the
validation exponent, 17, modulo φ(n), and thus calculating d is
computationally equivalent to factoring n.)
The key ID is a short hexadecimal number, which should match the
contents of the 811x header field. The numbers n and d are written as
big integers, as in the Rabin key format.
FILES
/usr/local/share/rabbitsign/*.key
Private key files which will be used if the requested key is not
found in the current directory.
BUGS
Who needs them?
rabbitsign accepts keys, applications, and even file names which cause
TI’s programs to crash or generate invalid signatures.
Some apps which come very close to filling the last page may not be
usable with TI-Connect. This is a bug in TI-Connect. Try TiLP.
rabbitsign does not always generate the same signature as do TI’s
programs. This is not a bug; it is simply due to the differences in
implementation. There are in fact four valid signatures for every
application hash; all four are accepted by the calculator.
If you encounter a valid app which rabbitsign is unable to sign, or
worse, generates an invalid signature, this is a serious bug, and I
would like to know about it.
SEE ALSO
packxxk(1), rskeygen(1)
AUTHOR
Benjamin Moody <floppusmaximus@users.sf.net>