]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_cryptkit/lib/ByteRep.txt
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_cryptkit / lib / ByteRep.txt
diff --git a/Security/libsecurity_cryptkit/lib/ByteRep.txt b/Security/libsecurity_cryptkit/lib/ByteRep.txt
new file mode 100644 (file)
index 0000000..2ed4610
--- /dev/null
@@ -0,0 +1,293 @@
+       FEE Portable Byte Representation of Public Key Strings and Signatures
+                                               Last Modified 15 March 2001
+
+This defines portable data formats shared by the C and Java implementation of FEE. This definition supercedes formats used prior to 20 Feb 2001.
+
+
+Primitive Data Types
+--------------------
+
+    int, unsigned int:
+       4 bytes, M.S. byte first
+
+    short, feeUnichar, Java char:
+       2 bytes, M.S. byte first
+
+    giant, GiantInteger:
+
+       type     contents       comment
+    ------      --------       ---------------------------------------
+       int              numBytes       abs(numBytes) indicates size of n[] to
+                                                       follow, in BYTES
+                                                       sign of numBytes is sign bit of result
+       byte     data           n[0], MSB first for each element
+
+
+Curve Parameters (curveParams, Java CurveParams)
+------------------------------------------------
+
+    CURVE_PARAM_VERSION = 1:
+
+       type     contents
+       ------   --------
+       int              CURVE_PARAM_VERSION = 1
+       int      minVersion of code to parse this struct = 1
+       unsigned q
+       int              k
+       int              spare
+       giant    a
+       giant    b
+       giant    c
+       giant    x1Plus
+       giant    x1Minus
+       giant    cOrderPlus
+       giant    cOrderMinus
+       giant    x1OrderPlus
+       giant    x1OrderMinus
+
+       The last four fields are not always known; a value of (giant)0
+       indicates a "not known" condition. In this case, 4 bytes of
+       zero are written, indicating a giant with a length of zero.
+
+    CURVE_PARAM_VERSION = 2 (20 Jan 1998)
+
+       type     contents
+       ------   --------
+       int              CURVE_PARAM_VERSION = 2
+       int      minVersion of code to parse this struct = 2
+       byte     primeType      /* new for version 2 */
+       unsigned q
+       int              k
+       unsigned m              /* new for version 2 */
+       int              spare
+       giant    a
+       giant    b
+       giant    c
+       giant    x1Plus
+       giant    x1Minus
+       giant    cOrderPlus
+       giant    cOrderMinus
+       giant    x1OrderPlus
+       giant    x1OrderMinus
+       giant    basePrime, if primeType == PT_GENERAL  /* new */
+
+       Note that as of version 2, the cOrder* and x1Order* fields are always
+       known.
+
+    CURVE_PARAM_VERSION = 3 (1 Sep 1998)
+
+       type     contents
+       ------   --------
+       int              CURVE_PARAM_VERSION = 3
+       int      minVersion of code to parse this struct = 3
+       byte     primeType
+       byte     curveType      /* new for version 3 */
+       unsigned q
+       int              k
+       unsigned m
+       int              spare
+       giant    a
+       giant    b
+       giant    c
+       giant    x1Plus
+       giant    x1Minus
+       giant    cOrderPlus
+       giant    cOrderMinus
+       giant    x1OrderPlus
+       giant    x1OrderMinus
+       giant    basePrime, if primeType == PT_GENERAL
+
+
+Public Key String
+-----------------
+
+       PUBLIC_KEY_STRING_VERSION = 3:
+
+       A public key string is always encoded via enc64(); the raw data before 
+       enc64() is as follows.
+
+       type            contents
+    ------             --------
+       int                     PUBLIC_KEY_STRING_MAGIC (0xfeeddeef)
+       int             PUBLIC_KEY_STRING_VERSION = 3
+       int             minVersion of code to parse this key = 3
+       int                     spare
+       curveParams     curve parameters
+       giant           plusX (public key, plus curve)
+       giant           minusX (public key, minus curve)
+       int                     usageName length in unichars
+       feeUnichar[] usageName as array of unichars
+
+       PUBLIC_KEY_BLOB_VERSION = 4 (23 Mar 1998)
+
+       New for version 4 - exported blobs for both public and private keys. 
+       Public key strings are merely enc64() encoded versions of public 
+       key blobs and are identical to PUBLIC_KEY_STRING_VERSION 3 public 
+       key strings.
+
+    PUBLIC_KEY_BLOB_MAGIC : 0xfeeddeef - public
+                            0xfeeddeed - private
+    minVersion : 3 for public, 4 for private
+
+       type            contents
+    ------             --------
+       int                     PUBLIC_KEY_BLOB_MAGIC
+       int             PUBLIC_KEY_BLOB_VERSION = 4
+       int             minVersion of code to parse this key = 3 or 4
+       int                     spare
+       curveParams     curve parameters
+
+       public key blob:
+         giant         plusX (public key, plus curve)
+         giant         minusX (public key, minus curve)
+       private key blob:
+         int           privDataLen
+         unsigned char privData[]
+
+       both private and public:
+
+       int                             usageName length in unichars
+       feeUnichar[]    usageName as array of unichars
+
+       PUBLIC_KEY_BLOB_VERSION = 5 (2 Sep 1998)
+
+       Added plusY.
+       minVersion = 5.
+
+       type            contents
+    ------             --------
+       int                     PUBLIC_KEY_BLOB_MAGIC_{PRIV,PUB}
+       int             PUBLIC_KEY_BLOB_VERSION = 5
+       int             minVersion of code to parse this key = 5
+       int                     spare
+       curveParams     curve parameters
+
+       public key blob:
+         giant         plusX (public key, plus curve)
+         giant         plusY (y-coord of public key, plus curve, may be zero)
+         giant         minusX (public key, minus curve)
+       private key blob:
+         giant         privGiant
+
+       both private and public:
+
+       int                             usageName length in unichars
+       feeUnichar[]    usageName as array of unichars
+
+       PUBLIC_KEY_BLOB_VERSION = 6 (14 Mar 2001)
+
+    Deleted usageName.
+
+       type            contents
+    ------             --------
+       int                     PUBLIC_KEY_BLOB_MAGIC_{PRIV,PUB}
+       int             PUBLIC_KEY_BLOB_VERSION = 5
+       int             minVersion of code to parse this key = 5
+       int                     spare
+       curveParams     curve parameters
+
+       public key blob:
+         giant         plusX (public key, plus curve)
+         giant         plusY (y-coord of public key, plus curve, may be zero)
+         giant         minusX (public key, minus curve)
+       private key blob:
+         giant         privGiant
+
+
+Digital Signature, ElGamal style
+--------------------------------
+
+       type                    contents
+       ------                  --------
+       int             FEE_SIG_MAGIC (0xfee00516)
+       int             FEE_SIG_VERSION = 3
+       int             minVersion of code to parse this signature = 3
+       int             spare
+       int                             signer length in unichars (DELETED 2/20/01)
+       feeUnichar[]    signer as array of unichars (DELETED 2/20/01)
+       giant                   u
+       giant                   Pm.x
+
+       FEE_SIG_VERSION = 4 (15 March 2001)
+       Deleted signer.
+       
+       type                    contents
+       ------                  --------
+       int             FEE_SIG_MAGIC (0xfee00516)
+       int             FEE_SIG_VERSION = 4
+       int             minVersion of code to parse this signature = 4
+       int             spare
+       giant                   u
+       giant                   Pm.x
+
+Digital Signature, ECDSA style
+--------------------------------
+
+       type            contents
+    ------             --------
+       int         FEE_ECDSA_MAGIC (0xfee00517)
+       int         FEE_ECDSA_VERSION = 1
+       int         minVersion of code to parse this signature = 1
+       int         spare
+       int                     signer length in unichars (DELETED 2/20/01)
+       feeUnichar[] signer as array of unichars (DELETED 2/20/01)
+       giant           s
+       giant           x0
+
+       FEE_ECDSA_VERSION = 2 (15 March 2001)
+       Deleted signer.
+
+       type            contents
+    ------             --------
+       int         FEE_ECDSA_MAGIC (0xfee00517)
+       int         FEE_ECDSA_VERSION = 2
+       int         minVersion of code to parse this signature = 2
+       int         spare
+       giant           s
+       giant           x0
+
+
+
+FEED (2:1) CipherText
+---------------------
+
+This data type uses an optimized form of Giants in that the sign, and hence 
+the number of 16-bit shorts (i.e., the size of n[]), is implied by the size 
+of p used in encryption and decryption. For a given curve parameter q (as 
+in p = 2**q - k), the number of shorts per giant transmitted is ((q/8 + 1)/2). 
+As in normal giants, the n[] array is transmitted m.s. byte first. During 
+encoding, unused elements in n[] - i.e., those appearing after 
+n[abs(sign) - 1] - are zero. Upon decoding, the sign of an incoming n[] 
+array can be inferred from the number of non-zero shorts.
+
+One block of ciphertext is formatted as follows. See "Fast Elliptic 
+Encryption (FEE) Algorithms", by Richard E. Crandall, July 1996, for 
+descriptions of Xm, Xc, and g.
+
+       type                      contents
+       ---------------   -----------------
+       optimized giant   Xm
+       optimized giant   Xc
+       byte                      g
+
+
+FEED (1:1) CipherText
+---------------------
+
+The first cipherblock is a FEED(2:1) encrypted copy of the initial 
+R and S arrays; this is basically a bunch of random bytes which are 
+used to cook up the giants R and S at both encrypt and decrypt time. 
+In 1:1 FEED ciphertext, this is encrypted with the recipient's public 
+key; the result is padded out to one 1:1 FEED Cipherblock.
+
+Subsequent cipherblocks are:
+
+       type                      contents
+       ---------------   -----------------
+       optimized giant   Xm
+       byte                      clueByte
+
+       clueByte contents:
+           bit 0 : 0 ==> minus
+                   1 ==> plus
+           bit 1 : 's' arg to elliptic_add()