svn commit: r198157 - in projects/mips/sys/dev/rmi: sec xlr

Randall Stewart rrs at FreeBSD.org
Thu Oct 15 21:08:07 UTC 2009


Author: rrs
Date: Thu Oct 15 21:08:06 2009
New Revision: 198157
URL: http://svn.freebsd.org/changeset/base/198157

Log:
  Adds the untouched code from the RMI 6.4 stuff.
  This has a security device and the gig ethernet device.
  Note the 10gig device driver is yet missing.

Added:
  projects/mips/sys/dev/rmi/sec/desc.h   (contents, props changed)
  projects/mips/sys/dev/rmi/sec/rmilib.c
  projects/mips/sys/dev/rmi/sec/rmilib.h
  projects/mips/sys/dev/rmi/sec/rmisec.c
  projects/mips/sys/dev/rmi/sec/stats.h
  projects/mips/sys/dev/rmi/xlr/atx_cpld.h
  projects/mips/sys/dev/rmi/xlr/rge.c
  projects/mips/sys/dev/rmi/xlr/rge.h
  projects/mips/sys/dev/rmi/xlr/xgmac_mdio.h

Added: projects/mips/sys/dev/rmi/sec/desc.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/mips/sys/dev/rmi/sec/desc.h	Thu Oct 15 21:08:06 2009	(r198157)
@@ -0,0 +1,3066 @@
+/*-
+ * Copyright (c) 2003-2009 RMI Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of RMI Corporation, nor the names of its contributors,
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * RMI_BSD */
+#ifndef _DESC_H_
+#define _DESC_H_
+
+
+#define ONE_BIT              0x0000000000000001ULL
+#define TWO_BITS             0x0000000000000003ULL
+#define THREE_BITS           0x0000000000000007ULL
+#define FOUR_BITS            0x000000000000000fULL
+#define FIVE_BITS            0x000000000000001fULL
+#define SIX_BITS             0x000000000000003fULL
+#define SEVEN_BITS           0x000000000000007fULL
+#define EIGHT_BITS           0x00000000000000ffULL
+#define NINE_BITS            0x00000000000001ffULL
+#define ELEVEN_BITS          0x00000000000007ffULL
+#define TWELVE_BITS          0x0000000000000fffULL
+#define FOURTEEN_BITS        0x0000000000003fffULL
+#define TWENTYFOUR_BITS      0x0000000000ffffffULL
+#define THIRTY_TWO_BITS      0x00000000ffffffffULL
+#define THIRTY_FIVE_BITS     0x00000007ffffffffULL
+#define FOURTY_BITS          0x000000ffffffffffULL
+
+#define MSG_IN_CTL_LEN_BASE  40
+#define MSG_IN_CTL_ADDR_BASE 0
+
+#define GET_FIELD(word,field) \
+ ((word) & (field ## _MASK)) >> (field ## _LSB)
+
+#define FIELD_VALUE(field,value) (((value) & (field ## _BITS)) << (field ## _LSB))
+
+/*
+ * NOTE: this macro expects 'word' to be uninitialized (i.e. zeroed)
+ */
+#define SET_FIELD(word,field,value) \
+ { (word) |=  (((value) & (field ## _BITS)) << (field ## _LSB)); }
+
+/*
+ * This macro clears 'word', then sets the value
+ */
+#define CLEAR_SET_FIELD(word,field,value) \
+ { (word) &= ~((field ## _BITS) << (field ## _LSB)); \
+   (word) |=  (((value) & (field ## _BITS)) << (field ## _LSB)); }
+
+/*
+ * NOTE: May be used to build value specific mask 
+ *        (e.g.  GEN_MASK(CTL_DSC_CPHR_3DES,CTL_DSC_CPHR_LSB)
+ */
+#define GEN_MASK(bits,lsb) ((bits) << (lsb))
+
+
+
+
+/*
+ * Security block data and control exchange
+ *
+ * A 2-word message ring descriptor is used to pass a pointer to the control descriptor data structure
+ * and a pointer to the packet descriptor data structure:
+ *
+ *  63  61 60                 54      53      52    49 48            45 44    40
+ *  39                                                     5 4                 0
+ *  ---------------------------------------------------------------------------------------------------------------------------------------------------------
+ * | Ctrl | Resp Dest Id Entry0 | IF_L2ALLOC | UNUSED | Control Length | UNUSED
+ * | 35 MSB of address of control descriptor data structure | Software Scratch0
+ * |
+ *  ---------------------------------------------------------------------------------------------------------------------------------------------------------
+ *    3              7                1          4             4           5
+ *    35                                       5
+ *
+ *  63  61 60    54     53          52             51        50    46      45       44    40 39                                                    5 4      0
+ *  ---------------------------------------------------------------------------------------------------------------------------------------------------------
+ * | Ctrl | UNUSED | WRB_COH | WRB_L2ALLOC | DF_PTR_L2ALLOC | UNUSED | Data Length | UNUSED | 35 MSB of address of packet descriptor data structure | UNUSED |
+ *  ---------------------------------------------------------------------------------------------------------------------------------------------------------
+ *    3       7         1          1               1            5           1          5                                35                              5
+ *
+ * Addresses assumed to be cache-line aligned, i.e., Address[4:0] ignored (using 5'h00 instead)
+ *
+ * Control length is the number of control cachelines to be read so user needs
+ * to round up
+ * the control length to closest integer multiple of 32 bytes. Note that at
+ * present (08/12/04)
+ * the longest (sensical) ctrl structure is <= 416 bytes, i.e., 13 cachelines.
+ *
+ * The packet descriptor data structure size is fixed at 1 cacheline (32 bytes).
+ * This effectively makes "Data Length" a Load/NoLoad bit. NoLoad causes an abort.
+ *
+ *
+ * Upon completion of operation, the security block returns a 2-word free descriptor
+ * in the following format:
+ *
+ *  63  61 60            54 53   52 51       49   48   47               40 39                                                  0
+ *  ----------------------------------------------------------------------------------------------------------------------------
+ * | Ctrl | Destination Id | 2'b00 | Desc Ctrl | 1'b0 | Instruction Error |    Address of control descriptor data structure     |
+ *  ----------------------------------------------------------------------------------------------------------------------------
+ * | Ctrl | Destination Id | 2'b00 | Desc Ctrl | 1'b0 |     Data Error    |    Address of packet descriptor data structure      |
+ *  ----------------------------------------------------------------------------------------------------------------------------
+ *
+ * The Instruction and Data Error codes are enumerated in the 
+ * ControlDescriptor and PacketDescriptor sections below
+ *
+ */
+
+
+/*
+ * Operating assumptions
+ * =====================
+ *
+ * 
+ *	        -> For all IpSec ops, I assume that all the IP/IPSec/TCP headers
+ *		   and the data are present at the specified source addresses.
+ *		   I also assume that all necessary header data already exists
+ *		   at the destination. Additionally, in AH I assume that all
+ *		   mutable fields (IP.{TOS, Flags, Offset, TTL, Header_Checksum}) 
+ *		   and the AH.Authentication_Data have been zeroed by the client.
+ *
+ *
+ *		-> In principle, the HW can calculate TCP checksums on both
+ *		   incoming and outgoing data; however, since the TCP header
+ *		   contains the TCP checksum of the plain payload and the header
+ *		   is encrypted, two passes would be necessary to do checksum + encryption
+ *                 for outgoing messages;
+ *		   therefore the checksum engine will likely only be used during decryption
+ *                 (incoming).
+ *
+ *
+ *		-> For all operations involving TCP checksum, I assume the client has filled
+ *		   the TCP checksum field with the appropriate value:
+ *
+ *			    - 0 for generation phase
+ *			    - actual value for verification phase (expecting 0 result)
+ *
+ *
+ *		-> For ESP tunnel, the original IP header exists between the end of the
+ *		   ESP header and the beginning of the TCP header; it is assumed that the
+ *		   maximum length of this header is 16 k(32bit)words (used in CkSum_Offset).
+ *
+ *
+ *		-> The authentication data is merely written to the destination address;
+ *		   the client is left with the task of comparing to the data in packet
+ *		   in decrypt.
+ *
+ *              -> PacketDescriptor_t.dstLLWMask relevant to AES CTR mode only but it will
+ *                 affect all AES-related operations. It will not affect DES/3DES/bypass ops.
+ *                 The mask is applied to data as it emerges from the AES engine for the sole
+ *                 purpose of providing the authenticator and cksum engines with correct data.
+ *                 CAVEAT: the HW does not mask the incoming data. It is the user's responsibility
+ *                 to set to 0 the corresponding data in memory. If the surplus data is not masked
+ *                 in memory, cksum/auth results will be incorrect if those engines receive data
+ *                 straight from memory (i.e., not from cipher, as it happens while decoding)
+ */
+
+/*
+ * Fragmentation and offset related notes
+ * ======================================
+ *
+ *
+ *      A) Rebuilding packets from fragments on dword boundaries. The discussion
+ *         below is exemplified by tests memcpy_all_off_frags and memcpy_same_off_frags
+ * 
+ *	        1) The Offset before data/iv on first fragment is ALWAYS written back
+ *                 Non-zero dst dword or global offsets may cause more data to be 
+ *                 written than the user-specified length.
+ *
+ *
+ *                 Example:
+ *                 --------
+ *
+ *                 Below is a source (first fragment) packet (@ ADD0 cache-aligned address).
+ *                 Assume we just copy it and relevant data starts on
+ *                 dword 3 so Cipher_Offset = IV_Offset = 3 (dwords).
+ *                 D0X denotes relevant data and G denotes dont care data.
+ *                 Offset data is also copied so Packet_Legth = 9 (dwords) * 8 = 72 (bytes)
+ *                 Segment_src_address = ADD0
+ *
+ *                 If we want to, e.g., copy so that the relevant (i.e., D0X) data
+ *                 starts at (cache-aligned address) ADD1, we need to specify
+ *                 Dst_dword_offset = 1 so D00 is moved from dword position 3 to 0 on next cache-line
+ *                 Cipher_dst_address = ADD1 - 0x20 so D00 is written to ADD1
+ *
+ *                 Note that the security engine always writes full cachelines
+ *                 therefore, data written to dword0 0 of ADD1 (denoted w/ ?) is what the sec pipe
+ *                 write back buffer contained from previous op.
+ *
+ *
+ *                      SOURCE:                                                 DESTINATION:
+ *                      -------                                                 ------------
+ *
+ *                      Segment_src_address = ADD0                              Cipher_dst_address = ADD1 - 0x20
+ *                      Packet_Legth        = 72                                Dst_dword_offset   = 1
+ *                      Cipher_Offset       = 3
+ *                      IV_Offset           = 3
+ *                      Use_IV              = ANY
+ *                      
+ *
+ *
+ *                         3     2     1     0                                  3     2     1     0
+ *                       -----------------------                              -----------------------
+ *                      | D00 | G   | G   | G   | <- ADD0                    | G   | G   | G   | ?   | <- ADD1 - 0x20
+ *                       -----------------------                              -----------------------
+ *                      | D04 | D03 | D02 | D01 |                            | D03 | D02 | D01 | D00 | <- ADD1
+ *                       -----------------------                              -----------------------
+ *                      |     |     |     | D05 |                            |     |     | D05 | D04 |
+ *                       -----------------------                              -----------------------
+ * 
+ *	        2) On fragments following the first, IV_Offset is overloaded to mean data offset
+ *                 (number of dwords to skip from beginning of cacheline before starting processing)
+ *                 and Use_IV is overloaded to mean do writeback the offset (in the clear).
+ *                 These fields in combination with Dst_dword_offset allow packet fragments with
+ *                 arbitrary boundaries/lengthd to be reasembled.
+ *
+ *
+ *                 Example:
+ *                 --------
+ *
+ *                 Assume data above was first fragment of a packet we'd like to merge to
+ *                 (second) fragment below located at ADD2. The written data should follow
+ *                 the previous data without gaps or overwrites. To achieve this, one should
+ *                 assert the "Next" field on the previous fragment and use self-explanatory
+ *                 set of parameters below
+ *
+ *
+ *                      SOURCE:                                                 DESTINATION:
+ *                      -------                                                 ------------
+ *
+ *                      Segment_src_address = ADD2                              Cipher_dst_address = ADD1 + 0x20
+ *                      Packet_Legth        = 104                               Dst_dword_offset   = 1
+ *                      IV_Offset           = 1
+ *                      Use_IV              = 0
+ *                      
+ *
+ *
+ *                         3     2     1     0                                  3     2     1     0
+ *                       -----------------------                              -----------------------
+ *                      | D12 | D11 | D10 | G   | <- ADD2                    | G   | G   | G   | ?   | <- ADD1 - 0x20
+ *                       -----------------------                              -----------------------
+ *                      | D16 | D15 | D14 | D13 |                            | D03 | D02 | D01 | D00 | <- ADD1
+ *                       -----------------------                              -----------------------
+ *                      | D1a | D19 | D18 | D17 |                            | D11 | D10 | D05 | D04 | <- ADD1 + 0x20
+ *                       -----------------------                              -----------------------
+ *                      |     |     |     | D1b |                            | D15 | D14 | D13 | D12 |
+ *                       -----------------------                              -----------------------
+ *                                                                           | D19 | D18 | D17 | D16 |
+ *                                                                            -----------------------
+ *                                                                           |     |     | D1b | D1a |
+ *                                                                            -----------------------
+ *
+ *                 It is note-worthy that the merging can only be achieved if Use_IV is 0. Indeed, the security
+ *                 engine always writes full lines, therefore ADD1 + 0x20 will be re-written. Setting Use_IV to 0
+ *                 will allow the sec pipe write back buffer to preserve D04, D05 from previous frag and only
+ *                 receive D10, D11 thereby preserving the integrity of the previous data.
+ * 
+ *	        3) On fragments following the first, !UseIV in combination w/ Dst_dword_offset >= (4 - IV_Offset)
+ *                 will cause a wraparound of the write thus achieving all 16 possible (Initial_Location, Final_Location)
+ *                 combinations for the data.
+ *
+ *
+ *                 Example:
+ *                 --------
+ *
+ *                 Contiguously merging 2 data sets above with a third located at ADD3. If this is the last fragment, 
+ *                 reset its Next bit.
+ *
+ *
+ *                      SOURCE:                                                 DESTINATION:
+ *                      -------                                                 ------------
+ *
+ *                      Segment_src_address = ADD3                              Cipher_dst_address = ADD1 + 0x80
+ *                      Packet_Legth        = 152                               Dst_dword_offset   = 3
+ *                      IV_Offset           = 3
+ *                      Use_IV              = 0
+ *                      
+ *
+ *
+ *                         3     2     1     0                                  3     2     1     0
+ *                       -----------------------                              -----------------------
+ *                      | D20 | G   | G   | G   | <- ADD2                    | G   | G   | G   | ?   | <- ADD1 - 0x20
+ *                       -----------------------                              -----------------------
+ *                      | D24 | D23 | D22 | D21 |                            | D03 | D02 | D01 | D00 | <- ADD1
+ *                       -----------------------                              -----------------------
+ *                      | D28 | D27 | D26 | D25 |                            | D11 | D10 | D05 | D04 | <- ADD1 + 0x20
+ *                       -----------------------                              -----------------------
+ *                      | D2c | D2b | D2a | D29 |                            | D15 | D14 | D13 | D12 |
+ *                       -----------------------                              -----------------------
+ *                      |     | D2f | D2e | D2d |                            | D19 | D18 | D17 | D16 |
+ *                       -----------------------                              -----------------------
+ *                                                                           | D21 | D20 | D1b | D1a | <- ADD1 + 0x80
+ *                                                                            -----------------------
+ *                                                                           | D25 | D24 | D23 | D22 | 
+ *                                                                            -----------------------
+ *                                                                           | D29 | D28 | D27 | D26 | 
+ *                                                                            -----------------------
+ *                                                                           | D2d | D2c | D2b | D2a | 
+ *                                                                            -----------------------
+ *                                                                           |(D2d)|(D2c)| D2f | D2e | 
+ *                                                                            -----------------------
+ *
+ *                 It is worth noticing that always writing full-lines causes the last 2 dwords in the reconstituted
+ *                 packet to be unnecessarily written: (D2d) and (D2c)
+ *
+ *
+ *
+ *      B) Implications of fragmentation on AES
+ * 
+ *	        1) AES is a 128 bit block cipher; therefore it requires an even dword total data length
+ *                 Data fragments (provided there are more than 1) are allowed to have odd dword
+ *                 data lengths provided the total length (cumulated over fragments) is an even dword
+ *                 count; an error will be generated otherwise, upon receiving the last fragment descriptor
+ *                 (see error conditions below).
+ *
+ *              2) While using fragments with AES, a fragment (other than first) starting with a != 0 (IV) offset
+ *                 while the subsequent total dword count given to AES is odd may not be required to write
+ *                 its offset (UseIV). Doing so will cause an error (see error conditions below).
+ *
+ *
+ *                 Example:
+ *                 --------
+ *
+ *                 Suppose the first fragment has an odd DATA dword count and USES AES (as seen below)
+ *
+ *                      SOURCE:                                                 DESTINATION:
+ *                      -------                                                 ------------
+ *
+ *                      Segment_src_address = ADD0                              Cipher_dst_address = ADD1
+ *                      Packet_Legth        = 64                                Dst_dword_offset   = 1
+ *                      Cipher_Offset       = 3
+ *                      IV_Offset           = 1
+ *                      Use_IV              = 1
+ *                      Cipher              = Any AES
+ *                      Next                = 1
+ *                      
+ *
+ * 
+ *
+ *                         3     2     1     0                                  3     2     1     0
+ *                       -----------------------                              -----------------------
+ *                      | D00 | IV1 | IV0 | G   | <- ADD0                    | E00 | IV1 | IV0 | G   | <- ADD1
+ *                       -----------------------                              -----------------------
+ *                      | D04 | D03 | D02 | D01 |                            | X   | E03 | E02 | E01 |
+ *                       -----------------------                              -----------------------
+ *
+ *                 At the end of processing of the previous fragment, the AES engine input buffer has D04
+ *                 and waits for next dword, therefore the writeback buffer cannot finish writing the fragment
+ *                 to destination (X instead of E04).
+ *
+ *                 If a second fragment now arrives with a non-0 offset and requires the offset data to be
+ *                 written to destination, the previous write (still needing the arrival of the last dword
+ *                 required by the AES to complete the previous operation) cannot complete before the present
+ *                 should start causing a deadlock.
+ */
+
+/*
+ *  Command Control Word for Message Ring Descriptor
+ */
+
+/* #define MSG_CMD_CTL_CTL       */
+#define MSG_CMD_CTL_CTL_LSB   61
+#define MSG_CMD_CTL_CTL_BITS  THREE_BITS
+#define MSG_CMD_CTL_CTL_MASK  (MSG_CMD_CTL_CTL_BITS << MSG_CMD_CTL_CTL_LSB)
+
+/* #define MSG_CMD_CTL_ID */
+#define MSG_CMD_CTL_ID_LSB    54
+#define MSG_CMD_CTL_ID_BITS   SEVEN_BITS
+#define MSG_CMD_CTL_ID_MASK   (MSG_CMD_CTL_ID_BITS << MSG_CMD_CTL_ID_LSB)
+
+/* #define MSG_CMD_CTL_LEN */
+#define MSG_CMD_CTL_LEN_LSB   45
+#define MSG_CMD_CTL_LEN_BITS  FOUR_BITS
+#define MSG_CMD_CTL_LEN_MASK  (MSG_CMD_CTL_LEN_BITS << MSG_CMD_CTL_LEN_LSB)
+
+
+/* #define MSG_CMD_CTL_ADDR */
+#define MSG_CMD_CTL_ADDR_LSB  0 
+#define MSG_CMD_CTL_ADDR_BITS FOURTY_BITS
+#define MSG_CMD_CTL_ADDR_MASK (MSG_CMD_CTL_ADDR_BITS << MSG_CMD_CTL_ADDR_LSB)
+
+#define MSG_CMD_CTL_MASK      (MSG_CMD_CTL_CTL_MASK | \
+                               MSG_CMD_CTL_LEN_MASK | MSG_CMD_CTL_ADDR_MASK)
+
+/*
+ *  Command Data Word for Message Ring Descriptor
+ */
+
+/* #define MSG_IN_DATA_CTL */
+#define MSG_CMD_DATA_CTL_LSB   61
+#define MSG_CMD_DATA_CTL_BITS  THREE_BITS
+#define MSG_CMD_DATA_CTL_MASK  (MSG_CMD_DATA_CTL_BITS  << MSG_CMD_DATA_CTL_LSB)
+
+/* #define MSG_CMD_DATA_LEN */
+#define MSG_CMD_DATA_LEN_LOAD  1
+#define MSG_CMD_DATA_LEN_LSB   45
+#define MSG_CMD_DATA_LEN_BITS  ONE_BIT
+#define MSG_CMD_DATA_LEN_MASK  (MSG_CMD_DATA_LEN_BITS << MSG_CMD_DATA_LEN_LSB)
+
+/* #define MSG_CMD_DATA_ADDR */
+#define MSG_CMD_DATA_ADDR_LSB  0 
+#define MSG_CMD_DATA_ADDR_BITS FOURTY_BITS 
+#define MSG_CMD_DATA_ADDR_MASK (MSG_CMD_DATA_ADDR_BITS << MSG_CMD_DATA_ADDR_LSB)
+
+#define MSG_CMD_DATA_MASK      (MSG_CMD_DATA_CTL_MASK | \
+                               MSG_CMD_DATA_LEN_MASK | MSG_CMD_DATA_ADDR_MASK)
+
+
+/*
+ * Upon completion of operation, the Sec block returns a 2-word free descriptor
+ * in the following format:
+ *
+ *  63  61 60            54 53   52 51       49  48          40 39             0
+ *  ----------------------------------------------------------------------------
+ * | Ctrl | Destination Id | 2'b00 | Desc Ctrl | Control Error | Source Address |
+ *  ----------------------------------------------------------------------------
+ * | Ctrl | Destination Id | 2'b00 | Desc Ctrl |   Data Error  | Dest Address   |
+ *  ----------------------------------------------------------------------------
+ *
+ * The Control and Data Error codes are enumerated below
+ *
+ *                                Error conditions
+ *                                ================
+ *
+ *             Control Error Code                  Control Error Condition
+ *             ------------------                  ---------------------------
+ *             9'h000                              No Error
+ *             9'h001                              Unknown Cipher Op                      ( Cipher == 3'h{6,7})
+ *             9'h002                              Unknown or Illegal Mode                ((Mode   == 3'h{2,3,4} & !AES) | (Mode   == 3'h{5,6,7}))
+ *             9'h004                              Unsupported CkSum Src                  (CkSum_Src   == 2'h{2,3} & CKSUM)
+ *             9'h008                              Forbidden CFB Mask                     (AES & CFBMode & UseNewKeysCFBMask & CFBMask[7] & (| CFBMask[6:0]))
+ *             9'h010                              Unknown Ctrl Op                        ((| Ctrl[63:37]) | (| Ctrl[15:14]))
+ *             9'h020                              UNUSED
+ *             9'h040                              UNUSED
+ *             9'h080                              Data Read Error
+ *             9'h100                              Descriptor Ctrl Field Error            (D0.Ctrl != SOP || D1.Ctrl != EOP)
+ *
+ *             Data Error Code                     Data Error Condition
+ *             ---------------                     --------------------
+ *             9'h000                              No Error
+ *             9'h001                              Insufficient Data To Cipher            (Packet_Length <= (Cipher_Offset or IV_Offset))
+ *             9'h002                              Illegal IV Location                    ((Cipher_Offset <  IV_Offset) | (Cipher_Offset <= IV_Offset & AES & ~CTR))
+ *             9'h004                              Illegal Wordcount To AES               (Packet_Length[3] != Cipher_Offset[0] & AES)
+ *             9'h008                              Illegal Pad And ByteCount Spec         (Hash_Byte_Count != 0 & !Pad_Hash)
+ *             9'h010                              Insufficient Data To CkSum             ({Packet_Length, 1'b0} <= CkSum_Offset)
+ *             9'h020                              Unknown Data Op                        ((| dstLLWMask[63:60]) | (| dstLLWMask[57:40]) | (| authDst[63:40]) | (| ckSumDst[63:40]))
+ *             9'h040                              Insufficient Data To Auth              ({Packet_Length} <= Auth_Offset)
+ *             9'h080                              Data Read Error
+ *             9'h100                              UNUSED
+ */
+
+/*
+ * Result Control Word for Message Ring Descriptor
+ */
+
+/* #define MSG_RSLT_CTL_CTL */
+#define MSG_RSLT_CTL_CTL_LSB      61
+#define MSG_RSLT_CTL_CTL_BITS     THREE_BITS
+#define MSG_RSLT_CTL_CTL_MASK \
+ (MSG_RSLT_CTL_CTL_BITS << MSG_RSLT_CTL_CTL_LSB)
+
+/* #define MSG_RSLT_CTL_DST_ID */
+#define MSG_RSLT_CTL_DST_ID_LSB   54
+#define MSG_RSLT_CTL_DST_ID_BITS  SEVEN_BITS
+#define MSG_RSLT_CTL_DST_ID_MASK \
+ (MSG_RSLT_CTL_DST_ID_BITS << MSG_RSLT_CTL_DST_ID_LSB)
+
+/* #define MSG_RSLT_CTL_DSC_CTL */
+#define MSG_RSLT_CTL_DSC_CTL_LSB  49
+#define MSG_RSLT_CTL_DSC_CTL_BITS THREE_BITS
+#define MSG_RSLT_CTL_DSC_CTL_MASK \
+ (MSG_RSLT_CTL_DSC_CTL_BITS << MSG_RSLT_CTL_DSC_CTL_LSB)
+
+/* #define MSG_RSLT_CTL_INST_ERR */
+#define MSG_RSLT_CTL_INST_ERR_LSB      40
+#define MSG_RSLT_CTL_INST_ERR_BITS     NINE_BITS
+#define MSG_RSLT_CTL_INST_ERR_MASK \
+ (MSG_RSLT_CTL_INST_ERR_BITS << MSG_RSLT_CTL_INST_ERR_LSB)
+
+/* #define MSG_RSLT_CTL_DSC_ADDR */
+#define MSG_RSLT_CTL_DSC_ADDR_LSB      0
+#define MSG_RSLT_CTL_DSC_ADDR_BITS     FOURTY_BITS
+#define MSG_RSLT_CTL_DSC_ADDR_MASK \
+ (MSG_RSLT_CTL_DSC_ADDR_BITS << MSG_RSLT_CTL_DSC_ADDR_LSB)
+
+/* #define MSG_RSLT_CTL_MASK */
+#define MSG_RSLT_CTL_MASK \
+ (MSG_RSLT_CTL_CTRL_MASK | MSG_RSLT_CTL_DST_ID_MASK | \
+  MSG_RSLT_CTL_DSC_CTL_MASK | MSG_RSLT_CTL_INST_ERR_MASK | \
+  MSG_RSLT_CTL_DSC_ADDR_MASK)
+
+/*
+ * Result Data Word for Message Ring Descriptor
+ */
+/* #define MSG_RSLT_DATA_CTL */
+#define MSG_RSLT_DATA_CTL_LSB     61
+#define MSG_RSLT_DATA_CTL_BITS    THREE_BITS
+#define MSG_RSLT_DATA_CTL_MASK \
+ (MSG_RSLT_DATA_CTL_BITS << MSG_RSLT_DATA_CTL_LSB)
+
+/* #define MSG_RSLT_DATA_DST_ID */
+#define MSG_RSLT_DATA_DST_ID_LSB  54
+#define MSG_RSLT_DATA_DST_ID_BITS SEVEN_BITS
+#define MSG_RSLT_DATA_DST_ID_MASK \
+ (MSG_RSLT_DATA_DST_ID_BITS << MSG_RSLT_DATA_DST_ID_LSB)
+
+/* #define MSG_RSLT_DATA_DSC_CTL */
+#define MSG_RSLT_DATA_DSC_CTL_LSB       49
+#define MSG_RSLT_DATA_DSC_CTL_BITS      THREE_BITS
+#define MSG_RSLT_DATA_DSC_CTL_MASK \
+ (MSG_RSLT_DATA_DSC_CTL_BITS << MSG_RSLT_DATA_DSC_CTL_LSB)
+
+/* #define MSG_RSLT_DATA_INST_ERR */
+#define MSG_RSLT_DATA_INST_ERR_LSB      40
+#define MSG_RSLT_DATA_INST_ERR_BITS     NINE_BITS
+#define MSG_RSLT_DATA_INST_ERR_MASK \
+ (MSG_RSLT_DATA_INST_ERR_BITS << MSG_RSLT_DATA_INST_ERR_LSB)
+
+/* #define MSG_RSLT_DATA_DSC_ADDR */
+#define MSG_RSLT_DATA_DSC_ADDR_LSB      0
+#define MSG_RSLT_DATA_DSC_ADDR_BITS     FOURTY_BITS
+#define MSG_RSLT_DATA_DSC_ADDR_MASK     \
+ (MSG_RSLT_DATA_DSC_ADDR_BITS << MSG_RSLT_DATA_DSC_ADDR_LSB)
+
+#define MSG_RSLT_DATA_MASK   \
+ (MSG_RSLT_DATA_CTRL_MASK | MSG_RSLT_DATA_DST_ID_MASK | \
+  MSG_RSLT_DATA_DSC_CTL_MASK | MSG_RSLT_DATA_INST_ERR_MASK | \
+  MSG_RSLT_DATA_DSC_ADDR_MASK)
+
+
+/*
+ * Common Message Definitions
+ *
+ */
+
+/* #define MSG_CTL_OP_ADDR */
+#define MSG_CTL_OP_ADDR_LSB      0
+#define MSG_CTL_OP_ADDR_BITS     FOURTY_BITS
+#define MSG_CTL_OP_ADDR_MASK     (MSG_CTL_OP_ADDR_BITS << MSG_CTL_OP_ADDR_LSB)
+
+#define MSG_CTL_OP_TYPE
+#define MSG_CTL_OP_TYPE_LSB             3
+#define MSG_CTL_OP_TYPE_BITS            TWO_BITS
+#define MSG_CTL_OP_TYPE_MASK            \
+ (MSG_CTL_OP_TYPE_BITS << MSG_CTL_OP_TYPE_LSB)
+
+#define MSG0_CTL_OP_ENGINE_SYMKEY       0x01
+#define MSG0_CTL_OP_ENGINE_PUBKEY       0x02
+
+#define MSG1_CTL_OP_SYMKEY_PIPE0        0x00
+#define MSG1_CTL_OP_SYMKEY_PIPE1        0x01
+#define MSG1_CTL_OP_SYMKEY_PIPE2        0x02
+#define MSG1_CTL_OP_SYMKEY_PIPE3        0x03
+
+#define MSG1_CTL_OP_PUBKEY_PIPE0        0x00
+#define MSG1_CTL_OP_PUBKEY_PIPE1        0x01
+#define MSG1_CTL_OP_PUBKEY_PIPE2        0x02
+#define MSG1_CTL_OP_PUBKEY_PIPE3        0x03
+
+
+/*       /----------------------------------------\
+ *       |                                        |
+ *       |   ControlDescriptor_s datastructure    |
+ *       |                                        |
+ *       \----------------------------------------/
+ *
+ *
+ *       ControlDescriptor_t.Instruction
+ *       -------------------------------
+ *
+ *   63    44         43               42            41              40           39        35 34    32 31  29     28
+ *  --------------------------------------------------------------------------------------------------------------------
+ * || UNUSED || OverrideCipher | Arc4Wait4Save | SaveArc4State | LoadArc4State | Arc4KeyLen | Cipher | Mode | InCp_Key || ... CONT ...
+ *  --------------------------------------------------------------------------------------------------------------------
+ *      20            1                1              1               1               5          3       3        1
+ *            <-----------------------------------------------CIPHER--------------------------------------------------->
+ *
+ *   27    25     24      23   22     21     20      19    17    16     15     0
+ *  -----------------------------------------------------------------------------
+ * || UNUSED | Hash_Hi | HMAC | Hash_Lo | InHs_Key || UNUSED || CkSum || UNUSED ||
+ *  -----------------------------------------------------------------------------
+ *      3         1       1        2         1          3        1        16
+ *  <---------------------HASH---------------------><-----------CKSUM----------->
+ *
+ *  X0  CIPHER.Arc4Wait4Save   =                   If op is Arc4 and it requires state saving, then
+ *                                                 setting this bit will cause the current op to
+ *                                                 delay subsequent op loading until saved state data
+ *                                                 becomes visible.
+ *      CIPHER.OverrideCipher  =                   Override encryption if PacketDescriptor_t.dstDataSettings.CipherPrefix
+ *                                                 is set; data will be copied out (and optionally auth/cksum)
+ *                                                 in the clear. This is used in GCM mode if auth only as we
+ *                                                 still need E(K, 0) calculated by cipher. Engine behavior is
+ *                                                 undefined if this bit is set and CipherPrefix is not.
+ *  X0         SaveArc4State   =                   Save Arc4 state at the end of Arc4 operation
+ *  X0         LoadArc4State   =                   Load Arc4 state at the beginning of an Arc4 operation
+ *                                                 This overriden by the InCp_Key setting for Arc4
+ *             Arc4KeyLen      =                   Length in bytes of Arc4 key (0 is interpreted as 32)
+ *                                                 Ignored for other ciphers
+ *                                                 For ARC4, IFetch/IDecode will always read exactly 4
+ *                                                 consecutive dwords into its CipherKey{0,3} regardless
+ *                                                 of this quantity; it will however only use the specified
+ *                                                 number of bytes.        
+ *             Cipher          =        3'b000     Bypass
+ *                                      3'b001     DES
+ *                                      3'b010     3DES
+ *                                      3'b011     AES 128-bit key
+ *                                      3'b100     AES 192-bit key
+ *                                      3'b101     AES 256-bit key
+ *                                      3'b110     ARC4
+ *                                      3'b111     Kasumi f8
+ *                                      Remainder  UNDEFINED
+ *             Mode            =        3'b000     ECB
+ *                                      3'b001     CBC
+ *                                      3'b010     CFB (AES only, otherwise undefined)
+ *                                      3'b011     OFB (AES only, otherwise undefined)
+ *                                      3'b100     CTR (AES only, otherwise undefined)
+ *                                      3'b101     F8  (AES only, otherwise undefined)
+ *                                      Remainder  UNDEFINED
+ *             InCp_Key        =        1'b0       Preserve old Cipher Keys
+ *                                      1'b1       Load new Cipher Keys from memory to local registers
+ *                                                 and recalculate the Arc4 Sbox if Arc4 Cipher chosen;
+ *                                                 This overrides LoadArc4State setting.
+ *        HASH.HMAC            =        1'b0       Hash without HMAC
+ *                                      1'b1       Hash with HMAC 
+ *                                                 Needs to be set to 0 for GCM and Kasumi F9 authenticators
+ *                                                 otherwise unpredictable results will be generated
+ *             Hash            =        2'b00      Hash NOP
+ *                                      2'b01      MD5
+ *                                      2'b10      SHA-1
+ *                                      2'b11      SHA-256
+ *                                      3'b100     SHA-384
+ *                                      3'b101     SHA-512
+ *                                      3'b110     GCM
+ *                                      3'b111     Kasumi f9
+ *             InHs_Key        =        1'b0       Preserve old HMAC Keys
+ *                                                 If GCM is selected as authenticator, leaving this bit
+ *                                                 at 0 will cause the engine to use the old H value.
+ *                                                 It will use the old SCI inside the decoder if
+ *                                                 CFBMask[1:0] == 2'b11.
+ *                                                 If Kasumi F9 authenticator, using 0 preserves
+ *                                                 old keys (IK) in decoder.
+ *                                      1'b1       Load new HMAC Keys from memory to local registers
+ *                                                 Setting this bit while Cipher=Arc4 and LoadArc4State=1
+ *                                                 causes the decoder to load the Arc4 state from the
+ *                                                 cacheline following the HMAC keys (Whether HASH.HMAC
+ *                                                 is set or not).
+ *                                                 If GCM is selected as authenticator, setting this bit
+ *                                                 causes both H (16 bytes) and SCI (8 bytes) to be loaded
+ *                                                 from memory to the decoder. H will be loaded to the engine
+ *                                                 but SCI is only loaded to the engine if CFBMask[1:0] == 2'b11.
+ *                                                 If Kasumi F9 authenticator, using 1 loads new keys (IK)
+ *                                                 from memory to decoder.
+ *    CHECKSUM.CkSum           =        1'b0       CkSum NOP
+ *                                      1'b1       INTERNET_CHECKSUM
+ *
+ *
+ *
+ */
+
+ /* #define CTRL_DSC_OVERRIDECIPHER */
+#define CTL_DSC_OVERRIDECIPHER_OFF       0
+#define CTL_DSC_OVERRIDECIPHER_ON        1
+#define CTL_DSC_OVERRIDECIPHER_LSB       43
+#define CTL_DSC_OVERRIDECIPHER_BITS      ONE_BIT
+#define CTL_DSC_OVERRIDECIPHER_MASK      (CTL_DSC_OVERRIDECIPHER_BITS << CTL_DSC_OVERRIDECIPHER_LSB)
+
+/* #define CTRL_DSC_ARC4_WAIT4SAVE */
+#define CTL_DSC_ARC4_WAIT4SAVE_OFF       0
+#define CTL_DSC_ARC4_WAIT4SAVE_ON        1
+#define CTL_DSC_ARC4_WAIT4SAVE_LSB       42
+#define CTL_DSC_ARC4_WAIT4SAVE_BITS      ONE_BIT
+#define CTL_DSC_ARC4_WAIT4SAVE_MASK      (CTL_DSC_ARC4_WAIT4SAVE_BITS << CTL_DSC_ARC4_WAIT4SAVE_LSB)
+
+/* #define CTRL_DSC_ARC4_SAVESTATE */
+#define CTL_DSC_ARC4_SAVESTATE_OFF       0
+#define CTL_DSC_ARC4_SAVESTATE_ON        1
+#define CTL_DSC_ARC4_SAVESTATE_LSB       41
+#define CTL_DSC_ARC4_SAVESTATE_BITS      ONE_BIT
+#define CTL_DSC_ARC4_SAVESTATE_MASK      (CTL_DSC_ARC4_SAVESTATE_BITS << CTL_DSC_ARC4_SAVESTATE_LSB)
+
+/* #define CTRL_DSC_ARC4_LOADSTATE */
+#define CTL_DSC_ARC4_LOADSTATE_OFF       0
+#define CTL_DSC_ARC4_LOADSTATE_ON        1
+#define CTL_DSC_ARC4_LOADSTATE_LSB       40
+#define CTL_DSC_ARC4_LOADSTATE_BITS      ONE_BIT
+#define CTL_DSC_ARC4_LOADSTATE_MASK      (CTL_DSC_ARC4_LOADSTATE_BITS << CTL_DSC_ARC4_LOADSTATE_LSB)
+
+/* #define CTRL_DSC_ARC4_KEYLEN */
+#define CTL_DSC_ARC4_KEYLEN_LSB          35
+#define CTL_DSC_ARC4_KEYLEN_BITS         FIVE_BITS
+#define CTL_DSC_ARC4_KEYLEN_MASK         (CTL_DSC_ARC4_KEYLEN_BITS << CTL_DSC_ARC4_KEYLEN_LSB)
+
+/* #define CTL_DSC_CPHR  (cipher) */
+#define CTL_DSC_CPHR_BYPASS       0 /* undefined */
+#define CTL_DSC_CPHR_DES          1
+#define CTL_DSC_CPHR_3DES         2
+#define CTL_DSC_CPHR_AES128       3
+#define CTL_DSC_CPHR_AES192       4
+#define CTL_DSC_CPHR_AES256       5
+#define CTL_DSC_CPHR_ARC4         6
+#define CTL_DSC_CPHR_KASUMI_F8    7
+#define CTL_DSC_CPHR_LSB          32
+#define CTL_DSC_CPHR_BITS         THREE_BITS
+#define CTL_DSC_CPHR_MASK         (CTL_DSC_CPHR_BITS << CTL_DSC_CPHR_LSB)
+
+/* #define CTL_DSC_MODE  */
+#define CTL_DSC_MODE_ECB          0
+#define CTL_DSC_MODE_CBC          1
+#define CTL_DSC_MODE_CFB          2
+#define CTL_DSC_MODE_OFB          3
+#define CTL_DSC_MODE_CTR          4
+#define CTL_DSC_MODE_F8           5
+#define CTL_DSC_MODE_LSB          29
+#define CTL_DSC_MODE_BITS         THREE_BITS
+#define CTL_DSC_MODE_MASK         (CTL_DSC_MODE_BITS << CTL_DSC_MODE_LSB)
+
+/* #define CTL_DSC_ICPHR */
+#define CTL_DSC_ICPHR_OKY          0 /* Old Keys */
+#define CTL_DSC_ICPHR_NKY          1 /* New Keys */
+#define CTL_DSC_ICPHR_LSB          28
+#define CTL_DSC_ICPHR_BITS         ONE_BIT
+#define CTL_DSC_ICPHR_MASK         (CTL_DSC_ICPHR_BITS << CTL_DSC_ICPHR_LSB)
+
+/* #define CTL_DSC_HASHHI */
+#define CTL_DSC_HASHHI_LSB          24
+#define CTL_DSC_HASHHI_BITS         ONE_BIT
+#define CTL_DSC_HASHHI_MASK         (CTL_DSC_HASHHI_BITS << CTL_DSC_HASHHI_LSB)
+
+/* #define CTL_DSC_HMAC */
+#define CTL_DSC_HMAC_OFF          0
+#define CTL_DSC_HMAC_ON           1
+#define CTL_DSC_HMAC_LSB          23
+#define CTL_DSC_HMAC_BITS         ONE_BIT
+#define CTL_DSC_HMAC_MASK         (CTL_DSC_HMAC_BITS << CTL_DSC_HMAC_LSB)
+
+/* #define CTL_DSC_HASH */
+#define CTL_DSC_HASH_NOP          0
+#define CTL_DSC_HASH_MD5          1
+#define CTL_DSC_HASH_SHA1         2
+#define CTL_DSC_HASH_SHA256       3
+#define CTL_DSC_HASH_SHA384       4
+#define CTL_DSC_HASH_SHA512       5
+#define CTL_DSC_HASH_GCM          6
+#define CTL_DSC_HASH_KASUMI_F9    7
+#define CTL_DSC_HASH_LSB          21
+#define CTL_DSC_HASH_BITS         TWO_BITS
+#define CTL_DSC_HASH_MASK         (CTL_DSC_HASH_BITS << CTL_DSC_HASH_LSB)
+
+/* #define CTL_DSC_IHASH */
+#define CTL_DSC_IHASH_OLD         0
+#define CTL_DSC_IHASH_NEW         1
+#define CTL_DSC_IHASH_LSB         20
+#define CTL_DSC_IHASH_BITS        ONE_BIT
+#define CTL_DSC_IHASH_MASK        (CTL_DSC_IHASH_BITS << CTL_DSC_IHASH_LSB)
+
+/* #define CTL_DSC_CKSUM */
+#define CTL_DSC_CKSUM_NOP         0
+#define CTL_DSC_CKSUM_IP          1
+#define CTL_DSC_CKSUM_LSB         16
+#define CTL_DSC_CKSUM_BITS        ONE_BIT
+#define CTL_DSC_CKSUM_MASK        (CTL_DSC_CKSUM_BITS << CTL_DSC_CKSUM_LSB)
+
+
+/*
+ * Component strcts and unions defining CipherHashInfo_u
+ */
+
+/* AES256, (ECB, CBC, OFB, CTR, CFB), HMAC (MD5, SHA-1, SHA-256)      - 96  bytes */
+typedef struct AES256HMAC_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+  uint64_t             cipherKey3;
+  uint64_t             hmacKey0;
+  uint64_t             hmacKey1;
+  uint64_t             hmacKey2;
+  uint64_t             hmacKey3;
+  uint64_t             hmacKey4;
+  uint64_t             hmacKey5;
+  uint64_t             hmacKey6;
+  uint64_t             hmacKey7;
+} AES256HMAC_t, *AES256HMAC_pt;
+
+/* AES256, (ECB, CBC, OFB, CTR, CFB), HMAC (SHA-384, SHA-512)      - 160  bytes */
+typedef struct AES256HMAC2_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+  uint64_t             cipherKey3;
+  uint64_t             hmacKey0;
+  uint64_t             hmacKey1;
+  uint64_t             hmacKey2;
+  uint64_t             hmacKey3;
+  uint64_t             hmacKey4;
+  uint64_t             hmacKey5;
+  uint64_t             hmacKey6;
+  uint64_t             hmacKey7;
+  uint64_t             hmacKey8;
+  uint64_t             hmacKey9;
+  uint64_t             hmacKey10;
+  uint64_t             hmacKey11;
+  uint64_t             hmacKey12;
+  uint64_t             hmacKey13;
+  uint64_t             hmacKey14;
+  uint64_t             hmacKey15;
+} AES256HMAC2_t, *AES256HMAC2_pt;
+
+/* AES256, (ECB, CBC, OFB, CTR, CFB), GCM      - 56  bytes */
+typedef struct AES256GCM_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+  uint64_t             cipherKey3;
+  uint64_t             GCMH0;
+  uint64_t             GCMH1;
+  uint64_t             GCMSCI;
+} AES256GCM_t, *AES256GCM_pt;
+
+/* AES256, (ECB, CBC, OFB, CTR, CFB), F9      - 56  bytes */
+typedef struct AES256F9_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+  uint64_t             cipherKey3;
+  uint64_t             authKey0;
+  uint64_t             authKey1;
+} AES256F9_t, *AES256F9_pt;
+
+/* AES256, (ECB, CBC, OFB, CTR, CFB), Non-HMAC (MD5, SHA-1, SHA-256)  - 32  bytes */
+typedef struct AES256_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+  uint64_t             cipherKey3;
+} AES256_t, *AES256_pt;
+
+
+/* All AES192 possibilities */
+
+/* AES192, (ECB, CBC, OFB, CTR, CFB), HMAC (MD5, SHA-1, SHA-192)      - 88  bytes */
+typedef struct AES192HMAC_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+  uint64_t             hmacKey0;
+  uint64_t             hmacKey1;
+  uint64_t             hmacKey2;
+  uint64_t             hmacKey3;
+  uint64_t             hmacKey4;
+  uint64_t             hmacKey5;
+  uint64_t             hmacKey6;
+  uint64_t             hmacKey7;
+} AES192HMAC_t, *AES192HMAC_pt;
+
+/* AES192, (ECB, CBC, OFB, CTR, CFB), HMAC (SHA-384, SHA-512)      - 152  bytes */
+typedef struct AES192HMAC2_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+  uint64_t             hmacKey0;
+  uint64_t             hmacKey1;
+  uint64_t             hmacKey2;
+  uint64_t             hmacKey3;
+  uint64_t             hmacKey4;
+  uint64_t             hmacKey5;
+  uint64_t             hmacKey6;
+  uint64_t             hmacKey7;
+  uint64_t             hmacKey8;
+  uint64_t             hmacKey9;
+  uint64_t             hmacKey10;
+  uint64_t             hmacKey11;
+  uint64_t             hmacKey12;
+  uint64_t             hmacKey13;
+  uint64_t             hmacKey14;
+  uint64_t             hmacKey15;
+} AES192HMAC2_t, *AES192HMAC2_pt;
+
+/* AES192, (ECB, CBC, OFB, CTR, CFB), GCM      - 48  bytes */
+typedef struct AES192GCM_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+  uint64_t             GCMH0;
+  uint64_t             GCMH1;
+  uint64_t             GCMSCI;
+} AES192GCM_t, *AES192GCM_pt;
+
+/* AES192, (ECB, CBC, OFB, CTR, CFB), F9      - 48  bytes */
+typedef struct AES192F9_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+  uint64_t             authKey0;
+  uint64_t             authKey1;
+} AES192F9_t, *AES192F9_pt;
+
+/* AES192, (ECB, CBC, OFB, CTR, CFB), Non-HMAC (MD5, SHA-1, SHA-192)  - 24  bytes */
+typedef struct AES192_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKey2;
+} AES192_t, *AES192_pt;
+
+
+/* All AES128 possibilities */
+
+/* AES128, (ECB, CBC, OFB, CTR, CFB), HMAC (MD5, SHA-1, SHA-128)      - 80  bytes */
+typedef struct AES128HMAC_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             hmacKey0;
+  uint64_t             hmacKey1;
+  uint64_t             hmacKey2;
+  uint64_t             hmacKey3;
+  uint64_t             hmacKey4;
+  uint64_t             hmacKey5;
+  uint64_t             hmacKey6;
+  uint64_t             hmacKey7;
+} AES128HMAC_t, *AES128HMAC_pt;
+
+/* AES128, (ECB, CBC, OFB, CTR, CFB), HMAC (SHA-384, SHA-612)      - 144  bytes */
+typedef struct AES128HMAC2_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             hmacKey0;
+  uint64_t             hmacKey1;
+  uint64_t             hmacKey2;
+  uint64_t             hmacKey3;
+  uint64_t             hmacKey4;
+  uint64_t             hmacKey5;
+  uint64_t             hmacKey6;
+  uint64_t             hmacKey7;
+  uint64_t             hmacKey8;
+  uint64_t             hmacKey9;
+  uint64_t             hmacKey10;
+  uint64_t             hmacKey11;
+  uint64_t             hmacKey12;
+  uint64_t             hmacKey13;
+  uint64_t             hmacKey14;
+  uint64_t             hmacKey15;
+} AES128HMAC2_t, *AES128HMAC2_pt;
+
+/* AES128, (ECB, CBC, OFB, CTR, CFB), GCM      - 40  bytes */
+typedef struct AES128GCM_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             GCMH0;
+  uint64_t             GCMH1;
+  uint64_t             GCMSCI;
+} AES128GCM_t, *AES128GCM_pt;
+
+/* AES128, (ECB, CBC, OFB, CTR, CFB), F9      - 48  bytes */
+typedef struct AES128F9_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             authKey0;
+  uint64_t             authKey1;
+} AES128F9_t, *AES128F9_pt;
+
+/* AES128, (ECB, CBC, OFB, CTR, CFB), Non-HMAC (MD5, SHA-1, SHA-128)  - 16  bytes */
+typedef struct AES128_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+} AES128_t, *AES128_pt;
+
+/* AES128, (OFB F8), Non-HMAC (MD5, SHA-1, SHA-256)  - 32  bytes */
+typedef struct AES128F8_s {
+  uint64_t             cipherKey0;
+  uint64_t             cipherKey1;
+  uint64_t             cipherKeyMask0;
+  uint64_t             cipherKeyMask1;
+} AES128F8_t, *AES128F8_pt;
+
+/* AES128, (OFB F8), HMAC (MD5, SHA-1, SHA-256)  - 96  bytes */
+typedef struct AES128F8HMAC_s {
+  uint64_t             cipherKey0;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-projects mailing list