Home | History | Annotate | Download | only in inc
      1 /**
      2  * @defgroup MC_DATA_TYPES MobiCore generic data types
      3  *
      4  * @addtogroup MC_SO mcSo - Secure objects definitions.
      5  * <!-- Copyright Giesecke & Devrient GmbH 2011-2012 -->
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. The name of the author may not be used to endorse or promote
     16  *    products derived from this software without specific prior
     17  *    written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     20  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     23  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
     25  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  *
     31  * @ingroup  MC_DATA_TYPES
     32  * @{
     33  *
     34  */
     35 
     36 #ifndef MC_SO_H_
     37 #define MC_SO_H_
     38 
     39 #include "mcUuid.h"
     40 #include "mcSpid.h"
     41 
     42 #define SO_USE_VERSION_22 TRUE
     43 
     44 #if SO_USE_VERSION_22
     45   #define SO_VERSION_MAJOR   2
     46   #define SO_VERSION_MINOR   2
     47 #else
     48   #define SO_VERSION_MAJOR   2
     49   #define SO_VERSION_MINOR   1
     50 #endif
     51 
     52 #define MC_ENUM_32BIT_SPACER           ((int32_t)-1)
     53 
     54 /** Secure object type. */
     55 typedef enum {
     56     /** Regular secure object. */
     57     MC_SO_TYPE_REGULAR = 0x00000001,
     58     /** Dummy to ensure that enum is 32 bit wide. */
     59     MC_SO_TYPE_DUMMY = MC_ENUM_32BIT_SPACER,
     60 } mcSoType_t;
     61 
     62 
     63 /** Secure object context.
     64  * A context defines which key to use to encrypt/decrypt a secure object.
     65  */
     66 typedef enum {
     67     /** Trustlet context. */
     68     MC_SO_CONTEXT_TLT = 0x00000001,
     69      /** Service provider context. */
     70     MC_SO_CONTEXT_SP = 0x00000002,
     71      /** Device context. */
     72     MC_SO_CONTEXT_DEVICE = 0x00000003,
     73     /** Dummy to ensure that enum is 32 bit wide. */
     74     MC_SO_CONTEXT_DUMMY = MC_ENUM_32BIT_SPACER,
     75 } mcSoContext_t;
     76 
     77 /** Secure object lifetime.
     78  * A lifetime defines how long a secure object is valid.
     79  */
     80 typedef enum {
     81     /** SO does not expire. */
     82     MC_SO_LIFETIME_PERMANENT = 0x00000000,
     83     /** SO expires on reboot (coldboot). */
     84     MC_SO_LIFETIME_POWERCYCLE = 0x00000001,
     85     /** SO expires when Trustlet is closed. */
     86     MC_SO_LIFETIME_SESSION = 0x00000002,
     87     /** Dummy to ensure that enum is 32 bit wide. */
     88     MC_SO_LIFETIME_DUMMY = MC_ENUM_32BIT_SPACER,
     89 } mcSoLifeTime_t;
     90 
     91 /** Service provider Trustlet id.
     92  * The combination of service provider id and Trustlet UUID forms a unique
     93  * Trustlet identifier.
     94  */
     95 typedef struct {
     96     /** Service provider id. */
     97     mcSpid_t spid;
     98     /** Trustlet UUID. */
     99     mcUuid_t uuid;
    100 } tlApiSpTrustletId_t;
    101 
    102 /** Secure object header v2.2.
    103  * A secure object header introduces a secure object.
    104  * Layout of a secure object:
    105  * <pre>
    106  * <code>
    107  *
    108  *     +--------+------------------+------------------+--------+--------+
    109  *     | Header |   plain-data     |  encrypted-data  |  hash  | random |
    110  *     +--------+------------------+------------------+--------+--------+
    111  *
    112  *     /--------/---- plainLen ----/-- encryptedLen --/-- 32 --/-- 16 --/
    113  *
    114  *     /----------------- toBeHashedLen --------------/
    115  *
    116  *                                 /-- toBeEncryptedLen --/
    117  *
    118  *     /--------------------------- totalSoSize ------------------------/
    119  *
    120  * </code>
    121  * </pre>
    122  */
    123 
    124 /** Secure object header v2.1.
    125  * A secure object header introduces a secure object.
    126  * Layout of a secure object:
    127  * <pre>
    128  * <code>
    129  *
    130  *     +--------+------------------+------------------+--------+--------+---------+
    131  *     | Header |   plain-data     |  encrypted-data  |  hash  | random | padding |
    132  *     +--------+------------------+------------------+--------+--------+---------+
    133  *
    134  *     /--------/---- plainLen ----/-- encryptedLen --/-- 24 --/--- 9 --/- 0..15 -/
    135  *
    136  *     /----------------- toBeHashedLen --------------/
    137  *
    138  *                                 /-- toBeEncryptedLen --/
    139  *
    140  *     /--------------------------- totalSoSize ----------------------------------/
    141  *
    142  * </code>
    143  * </pre>
    144  */
    145 
    146 /** Secure object header v2.0.
    147  * A secure object header introduces a secure object.
    148  * Layout of a secure object:
    149  * <pre>
    150  * <code>
    151  *
    152  *     +--------+------------------+------------------+--------+---------+
    153  *     | Header |   plain-data     |  encrypted-data  |  hash  | padding |
    154  *     +--------+------------------+------------------+--------+---------+
    155  *
    156  *     /--------/---- plainLen ----/-- encryptedLen --/-- 32 --/- 1..16 -/
    157  *
    158  *     /----------------- toBeHashedLen --------------/
    159  *
    160  *                                 /---------- toBeEncryptedLen ---------/
    161  *
    162  *     /--------------------------- totalSoSize -------------------------/
    163  *
    164  * </code>
    165  * </pre>
    166  */
    167 typedef struct {
    168     /** Type of secure object. */
    169     uint32_t type;
    170     /** Secure object version. */
    171     uint32_t version;
    172     /** Secure object context. */
    173     mcSoContext_t context;
    174     /** Secure object lifetime. */
    175     mcSoLifeTime_t lifetime;
    176     /** Producer Trustlet id. */
    177     tlApiSpTrustletId_t producer;
    178     /** Length of unencrypted user data (after the header). */
    179     uint32_t plainLen;
    180     /** Length of encrypted user data (after unencrypted data, excl. checksum
    181      * and excl. padding bytes). */
    182     uint32_t encryptedLen;
    183 } mcSoHeader_t;
    184 
    185 /** Maximum size of the payload (plain length + encrypted length) of a secure object. */
    186 #define MC_SO_PAYLOAD_MAX_SIZE      1000000
    187 
    188 /** Block size of encryption algorithm used for secure objects. */
    189 #define MC_SO_ENCRYPT_BLOCK_SIZE    16
    190 
    191 /** Maximum number of ISO padding bytes. */
    192 #define MC_SO_MAX_PADDING_SIZE (MC_SO_ENCRYPT_BLOCK_SIZE)
    193 
    194 /** Size of hash used for secure objects v2. */
    195 #define MC_SO_HASH_SIZE             32
    196 
    197 /** Size of hash used for secure object v2.1. */
    198 #define MC_SO21_HASH_SIZE            24
    199 /** Size of random used for secure objects v2.1. */
    200 #define MC_SO21_RND_SIZE             9
    201 
    202 /** Size of hash used for secure object v2.2. */
    203 #define MC_SO22_HASH_SIZE            32
    204 /** Size of random used for secure objects v2.2. */
    205 #define MC_SO22_RND_SIZE             16
    206 
    207 /** Hash size for current generated wrapping */
    208 #define MC_SO2X_HASH_SIZE (SO_USE_VERSION_22 ? MC_SO22_HASH_SIZE : MC_SO21_HASH_SIZE)
    209 /** Random size for current generated wrapping */
    210 #define MC_SO2X_RND_SIZE (SO_USE_VERSION_22 ? MC_SO22_RND_SIZE : MC_SO21_RND_SIZE)
    211 
    212 #define MC_SO_ENCRYPT_PADDED_SIZE_F21(netsize) ( (netsize) + \
    213     MC_SO_MAX_PADDING_SIZE - (netsize) % MC_SO_MAX_PADDING_SIZE )
    214 
    215 #if SO_USE_VERSION_22
    216     // No encryption padding at all.
    217 #else
    218     /** Calculates gross size of cryptogram within secure object including ISO padding bytes. */
    219     #define MC_SO_ENCRYPT_PADDED_SIZE(netsize) MC_SO_ENCRYPT_PADDED_SIZE_F21(netsize)
    220 #endif
    221 
    222 
    223 /** Calculates the total size of a secure object.
    224  * @param plainLen Length of plain text part within secure object.
    225  * @param encryptedLen Length of encrypted part within secure object (excl.
    226  * hash, padding).
    227  * @return Total (gross) size of the secure object or 0 if given parameters are
    228  * illegal or would lead to a secure object of invalid size.
    229  */
    230 #define MC_SO_SIZE_F22(plainLen, encryptedLen) ( \
    231     ((plainLen) + (encryptedLen) < (encryptedLen) || (plainLen) + (encryptedLen) > MC_SO_PAYLOAD_MAX_SIZE) ? 0 : \
    232             sizeof(mcSoHeader_t) + (plainLen) + (encryptedLen) +MC_SO22_HASH_SIZE +MC_SO22_RND_SIZE \
    233     )
    234 #define MC_SO_SIZE_F21(plainLen, encryptedLen) ( \
    235     ((plainLen) + (encryptedLen) < (encryptedLen) || (plainLen) + (encryptedLen) > MC_SO_PAYLOAD_MAX_SIZE) ? 0 : \
    236             sizeof(mcSoHeader_t) + (plainLen) + MC_SO_ENCRYPT_PADDED_SIZE_F21((encryptedLen) + MC_SO_HASH_SIZE) \
    237 )
    238 
    239 #if SO_USE_VERSION_22
    240     #define MC_SO_SIZE(plainLen, encryptedLen) MC_SO_SIZE_F22(plainLen, encryptedLen)
    241 #else
    242     #define MC_SO_SIZE(plainLen, encryptedLen) MC_SO_SIZE_F21(plainLen, encryptedLen)
    243 #endif
    244 
    245 #endif // MC_SO_H_
    246 
    247 /** @} */
    248