Provided by: rabbitsign_2.1+dmca1-1build1_amd64 bug

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>