OLD | NEW |
(Empty) | |
| 1 /* Software-based Mobile Trusted Module (MTM) Emulator |
| 2 * Copyright (C) 2004-2010 Mario Strasser <mast@gmx.net> |
| 3 * |
| 4 * This module is free software; you can redistribute it and/or modify |
| 5 * it under the terms of the GNU General Public License as published |
| 6 * by the Free Software Foundation; either version 2 of the License, |
| 7 * or (at your option) any later version. |
| 8 * |
| 9 * This module is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. |
| 13 * |
| 14 * $Id$ |
| 15 */ |
| 16 |
| 17 #include "mtm_marshalling.h" |
| 18 |
| 19 int tpm_marshal_MTM_PERMANENT_DATA(BYTE **ptr, UINT32 *length, MTM_PERMANENT_DAT
A *v) |
| 20 { |
| 21 int i; |
| 22 if (tpm_marshal_TPM_STRUCTURE_TAG(ptr, length, v->tag) |
| 23 || tpm_marshal_BYTE(ptr, length, v->specMajor) |
| 24 || tpm_marshal_BYTE(ptr, length, v->specMinor) |
| 25 || tpm_marshal_TPM_PCR_SELECTION(ptr, length, &v->verifiedPCRs) |
| 26 || tpm_marshal_TPM_COUNT_ID(ptr, length, v->counterRimProtectId) |
| 27 || tpm_marshal_TPM_COUNT_ID(ptr, length, v->counterStorageProtectId) |
| 28 || tpm_marshal_BYTE(ptr, length, v->loadVerificationKeyMethods) |
| 29 || tpm_marshal_BOOL(ptr, length, v->integrityCheckRootValid) |
| 30 || tpm_marshal_BYTE_ARRAY(ptr, length, v->integrityCheckRootData, |
| 31 sizeof(v->integrityCheckRootData)) |
| 32 || tpm_marshal_TPM_SECRET(ptr, length, &v->internalVerificationKey)) retur
n -1; |
| 33 for (i = 0; i < MTM_MAX_KEYS; i++) { |
| 34 if (tpm_marshal_MTM_KEY_DATA(ptr, length, &v->keys[i])) return -1; |
| 35 } |
| 36 return 0; |
| 37 } |
| 38 |
| 39 int tpm_unmarshal_MTM_PERMANENT_DATA(BYTE **ptr, UINT32 *length, MTM_PERMANENT_D
ATA *v) |
| 40 { |
| 41 int i; |
| 42 if (tpm_unmarshal_TPM_STRUCTURE_TAG(ptr, length, &v->tag) |
| 43 || tpm_unmarshal_BYTE(ptr, length, &v->specMajor) |
| 44 || tpm_unmarshal_BYTE(ptr, length, &v->specMinor) |
| 45 || tpm_unmarshal_TPM_PCR_SELECTION(ptr, length, &v->verifiedPCRs) |
| 46 || tpm_unmarshal_TPM_COUNT_ID(ptr, length, &v->counterRimProtectId) |
| 47 || tpm_unmarshal_TPM_COUNT_ID(ptr, length, &v->counterStorageProtectId) |
| 48 || tpm_unmarshal_BYTE(ptr, length, &v->loadVerificationKeyMethods) |
| 49 || tpm_unmarshal_BOOL(ptr, length, &v->integrityCheckRootValid) |
| 50 || tpm_unmarshal_BYTE_ARRAY(ptr, length, v->integrityCheckRootData, |
| 51 sizeof(v->integrityCheckRootData)) |
| 52 || tpm_unmarshal_TPM_SECRET(ptr, length, &v->internalVerificationKey)) ret
urn -1; |
| 53 for (i = 0; i < MTM_MAX_KEYS; i++) { |
| 54 if (tpm_unmarshal_MTM_KEY_DATA(ptr, length, &v->keys[i])) return -1; |
| 55 } |
| 56 return 0; |
| 57 } |
| 58 |
| 59 int tpm_marshal_MTM_STANY_FLAGS(BYTE **ptr, UINT32 *length, MTM_STANY_FLAGS *v) |
| 60 { |
| 61 if (tpm_marshal_TPM_TAG(ptr, length, v->tag) |
| 62 || tpm_marshal_BOOL(ptr, length, v->loadVerificationRootKeyEnabled)) retur
n -1; |
| 63 return 0; |
| 64 } |
| 65 |
| 66 int tpm_unmarshal_MTM_STANY_FLAGS(BYTE **ptr, UINT32 *length, MTM_STANY_FLAGS *v
) |
| 67 { |
| 68 if (tpm_unmarshal_TPM_TAG(ptr, length, &v->tag) |
| 69 || tpm_unmarshal_BOOL(ptr, length, &v->loadVerificationRootKeyEnabled)) re
turn -1; |
| 70 return 0; |
| 71 } |
| 72 |
| 73 int tpm_marshal_MTM_COUNTER_REFERENCE(BYTE **ptr, UINT32 *length, MTM_COUNTER_RE
FERENCE *v) |
| 74 { |
| 75 if (tpm_marshal_BYTE(ptr, length, v->counterSelection) |
| 76 || tpm_marshal_TPM_ACTUAL_COUNT(ptr, length, v->counterValue)) return -1; |
| 77 return 0; |
| 78 } |
| 79 |
| 80 int tpm_unmarshal_MTM_COUNTER_REFERENCE(BYTE **ptr, UINT32 *length, MTM_COUNTER_
REFERENCE *v) |
| 81 { |
| 82 if (tpm_unmarshal_BYTE(ptr, length, &v->counterSelection) |
| 83 || tpm_unmarshal_TPM_ACTUAL_COUNT(ptr, length, &v->counterValue)) return -
1; |
| 84 return 0; |
| 85 } |
| 86 |
| 87 int tpm_marshal_TPM_RIM_CERTIFICATE(BYTE **ptr, UINT32 *length, TPM_RIM_CERTIFIC
ATE *v) |
| 88 { |
| 89 if (tpm_marshal_TPM_STRUCTURE_TAG(ptr, length, v->tag) |
| 90 || tpm_marshal_BYTE_ARRAY(ptr, length, v->label, 8) |
| 91 || tpm_marshal_UINT32(ptr, length, v->rimVersion) |
| 92 || tpm_marshal_MTM_COUNTER_REFERENCE(ptr, length, &v->referenceCounter) |
| 93 || tpm_marshal_TPM_PCR_INFO_SHORT(ptr, length, &v->state) |
| 94 || tpm_marshal_UINT32(ptr, length, v->measurementPcrIndex) |
| 95 || tpm_marshal_TPM_PCRVALUE(ptr, length, &v->measurementValue) |
| 96 || tpm_marshal_TPM_VERIFICATION_KEY_ID(ptr, length, v->parentId) |
| 97 || tpm_marshal_BYTE(ptr, length, v->extensionDigestSize) |
| 98 || (v->extensionDigestSize > 0 |
| 99 && tpm_marshal_BLOB(ptr, length, v->extensionDigestData, v->extensionD
igestSize)) |
| 100 || tpm_marshal_UINT32(ptr, length, v->integrityCheckSize) |
| 101 || (v->integrityCheckSize > 0 |
| 102 && tpm_marshal_BLOB(ptr, length, v->integrityCheckData, v->integrityCh
eckSize))) return -1; |
| 103 return 0; |
| 104 } |
| 105 |
| 106 int tpm_unmarshal_TPM_RIM_CERTIFICATE(BYTE **ptr, UINT32 *length, TPM_RIM_CERTIF
ICATE *v) |
| 107 { |
| 108 if (tpm_unmarshal_TPM_STRUCTURE_TAG(ptr, length, &v->tag) |
| 109 || tpm_unmarshal_BYTE_ARRAY(ptr, length, v->label, 8) |
| 110 || tpm_unmarshal_UINT32(ptr, length, &v->rimVersion) |
| 111 || tpm_unmarshal_MTM_COUNTER_REFERENCE(ptr, length, &v->referenceCounter) |
| 112 || tpm_unmarshal_TPM_PCR_INFO_SHORT(ptr, length, &v->state) |
| 113 || tpm_unmarshal_UINT32(ptr, length, &v->measurementPcrIndex) |
| 114 || tpm_unmarshal_TPM_PCRVALUE(ptr, length, &v->measurementValue) |
| 115 || tpm_unmarshal_TPM_VERIFICATION_KEY_ID(ptr, length, &v->parentId) |
| 116 || tpm_unmarshal_BYTE(ptr, length, &v->extensionDigestSize) |
| 117 || (v->extensionDigestSize > 0 |
| 118 && tpm_unmarshal_BLOB(ptr, length, &v->extensionDigestData, v->extensi
onDigestSize)) |
| 119 || tpm_unmarshal_UINT32(ptr, length, &v->integrityCheckSize) |
| 120 || (v->integrityCheckSize > 0 |
| 121 && tpm_unmarshal_BLOB(ptr, length, &v->integrityCheckData, v->integrit
yCheckSize))) return -1; |
| 122 return 0; |
| 123 } |
| 124 |
| 125 int tpm_marshal_TPM_VERIFICATION_KEY(BYTE **ptr, UINT32 *length, TPM_VERIFICATIO
N_KEY *v) |
| 126 { |
| 127 if (tpm_marshal_TPM_STRUCTURE_TAG(ptr, length, v->tag) |
| 128 || tpm_marshal_UINT16(ptr, length, v->usageFlags) |
| 129 || tpm_marshal_TPM_VERIFICATION_KEY_ID(ptr, length, v->parentId) |
| 130 || tpm_marshal_TPM_VERIFICATION_KEY_ID(ptr, length, v->myId) |
| 131 || tpm_marshal_MTM_COUNTER_REFERENCE(ptr, length, &v->referenceCounter) |
| 132 || tpm_marshal_TPM_ALGORITHM_ID(ptr, length, v->keyAlgorithm) |
| 133 || tpm_marshal_TPM_SIG_SCHEME(ptr, length, v->keyScheme) |
| 134 || tpm_marshal_BYTE(ptr, length, v->extensionDigestSize) |
| 135 || (v->extensionDigestSize > 0 |
| 136 && tpm_marshal_BLOB(ptr, length, v->extensionDigestData, v->extensionD
igestSize)) |
| 137 || tpm_marshal_UINT32(ptr, length, v->keySize) |
| 138 || (v->keySize > 0 && tpm_marshal_BLOB(ptr, length, v->keyData, v->keySize
)) |
| 139 || tpm_marshal_UINT32(ptr, length, v->integrityCheckSize) |
| 140 || (v->integrityCheckSize > 0 |
| 141 && tpm_marshal_BLOB(ptr, length, v->integrityCheckData, v->integrityCh
eckSize))) return -1; |
| 142 return 0; |
| 143 } |
| 144 |
| 145 int tpm_unmarshal_TPM_VERIFICATION_KEY(BYTE **ptr, UINT32 *length, TPM_VERIFICAT
ION_KEY *v) |
| 146 { |
| 147 if (tpm_unmarshal_TPM_STRUCTURE_TAG(ptr, length, &v->tag) |
| 148 || tpm_unmarshal_UINT16(ptr, length, &v->usageFlags) |
| 149 || tpm_unmarshal_TPM_VERIFICATION_KEY_ID(ptr, length, &v->parentId) |
| 150 || tpm_unmarshal_TPM_VERIFICATION_KEY_ID(ptr, length, &v->myId) |
| 151 || tpm_unmarshal_MTM_COUNTER_REFERENCE(ptr, length, &v->referenceCounter) |
| 152 || tpm_unmarshal_TPM_ALGORITHM_ID(ptr, length, &v->keyAlgorithm) |
| 153 || tpm_unmarshal_TPM_SIG_SCHEME(ptr, length, &v->keyScheme) |
| 154 || tpm_unmarshal_BYTE(ptr, length, &v->extensionDigestSize) |
| 155 || (v->extensionDigestSize > 0 |
| 156 && tpm_unmarshal_BLOB(ptr, length, &v->extensionDigestData, v->extensi
onDigestSize)) |
| 157 || tpm_unmarshal_UINT32(ptr, length, &v->keySize) |
| 158 || (v->keySize > 0 && tpm_unmarshal_BLOB(ptr, length, &v->keyData, v->keyS
ize)) |
| 159 || tpm_unmarshal_UINT32(ptr, length, &v->integrityCheckSize) |
| 160 || (v->integrityCheckSize > 0 |
| 161 && tpm_unmarshal_BLOB(ptr, length, &v->integrityCheckData, v->integrit
yCheckSize))) return -1; |
| 162 return 0; |
| 163 } |
| 164 |
| 165 int tpm_marshal_MTM_KEY_DATA(BYTE **ptr, UINT32 *length, MTM_KEY_DATA *v) |
| 166 { |
| 167 if (tpm_marshal_BOOL(ptr, length, v->valid)) return -1; |
| 168 if (v->valid) { |
| 169 if (tpm_marshal_UINT16(ptr, length, v->usageFlags) |
| 170 || tpm_marshal_TPM_VERIFICATION_KEY_ID(ptr, length, v->parentId) |
| 171 || tpm_marshal_TPM_VERIFICATION_KEY_ID(ptr, length, v->myId) |
| 172 || tpm_marshal_TPM_ALGORITHM_ID(ptr, length, v->keyAlgorithm) |
| 173 || tpm_marshal_TPM_SIG_SCHEME(ptr, length, v->keyScheme) |
| 174 || tpm_marshal_RSAPub(ptr, length, &v->key)) return -1; |
| 175 } |
| 176 return 0; |
| 177 } |
| 178 |
| 179 int tpm_unmarshal_MTM_KEY_DATA(BYTE **ptr, UINT32 *length, MTM_KEY_DATA *v) |
| 180 { |
| 181 if (tpm_unmarshal_BOOL(ptr, length, &v->valid)) return -1; |
| 182 if (v->valid) { |
| 183 if (tpm_unmarshal_UINT16(ptr, length, &v->usageFlags) |
| 184 || tpm_unmarshal_TPM_VERIFICATION_KEY_ID(ptr, length, &v->parentId) |
| 185 || tpm_unmarshal_TPM_VERIFICATION_KEY_ID(ptr, length, &v->myId) |
| 186 || tpm_unmarshal_TPM_ALGORITHM_ID(ptr, length, &v->keyAlgorithm) |
| 187 || tpm_unmarshal_TPM_SIG_SCHEME(ptr, length, &v->keyScheme) |
| 188 || tpm_unmarshal_RSAPub(ptr, length, &v->key)) return -1; |
| 189 } |
| 190 return 0; |
| 191 } |
| 192 |
| 193 int tpm_marshal_MTM_DATA(BYTE **ptr, UINT32 *length, MTM_DATA *v) |
| 194 { |
| 195 if (tpm_marshal_MTM_PERMANENT_DATA(ptr, length, &v->permanent.data) |
| 196 || tpm_marshal_MTM_STANY_FLAGS(ptr, length, &v->stany.flags)) return -1; |
| 197 return 0; |
| 198 } |
| 199 |
| 200 int tpm_unmarshal_MTM_DATA(BYTE **ptr, UINT32 *length, MTM_DATA *v) |
| 201 { |
| 202 if (tpm_unmarshal_MTM_PERMANENT_DATA(ptr, length, &v->permanent.data) |
| 203 || tpm_unmarshal_MTM_STANY_FLAGS(ptr, length, &v->stany.flags)) return -1; |
| 204 return 0; |
| 205 } |
| 206 |
OLD | NEW |