Index: mtm/mtm_cmd_handler.c |
diff --git a/mtm/mtm_cmd_handler.c b/mtm/mtm_cmd_handler.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1a9f8257907582a132c7f2662106e0c563c7a199 |
--- /dev/null |
+++ b/mtm/mtm_cmd_handler.c |
@@ -0,0 +1,253 @@ |
+/* Software-based Mobile Trusted Module (MTM) Emulator |
+ * Copyright (C) 2004-2010 Mario Strasser <mast@gmx.net> |
+ * Copyright (C) 2007 Jan-Erik Ekberg <jan-erik.ekberg@nokia.com>, |
+ * Nokia Corporation and/or its subsidiary(-ies) |
+ * |
+ * This module is free software; you can redistribute it and/or modify |
+ * it under the terms of the GNU General Public License as published |
+ * by the Free Software Foundation; either version 2 of the License, |
+ * or (at your option) any later version. |
+ * |
+ * This module is distributed in the hope that it will be useful, |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ * GNU General Public License for more details. |
+ * |
+ * $Id$ |
+ */ |
+ |
+#include "mtm_commands.h" |
+#include "mtm_marshalling.h" |
+ |
+extern void tpm_compute_in_param_digest(TPM_REQUEST *req); |
+ |
+static TPM_RESULT execute_MTM_InstallRIM(TPM_REQUEST *req, TPM_RESPONSE *rsp) |
+{ |
+ BYTE *ptr; |
+ UINT32 len; |
+ UINT32 rimCertSize; |
+ TPM_RIM_CERTIFICATE rimCertIn; |
+ TPM_RIM_CERTIFICATE rimCertOut; |
+ TPM_RESULT res; |
+ /* compute parameter digest */ |
+ tpm_compute_in_param_digest(req); |
+ /* unmarshal input */ |
+ ptr = req->param; |
+ len = req->paramSize; |
+ if (tpm_unmarshal_UINT32(&ptr, &len, &rimCertSize) |
+ || tpm_unmarshal_TPM_RIM_CERTIFICATE(&ptr, &len, &rimCertIn) |
+ || len != 0) return TPM_BAD_PARAMETER; |
+ /* execute command */ |
+ res = MTM_InstallRIM(&rimCertIn, &req->auth1, &rimCertOut); |
+ if (res != TPM_SUCCESS) return res; |
+ /* marshal output */ |
+ rsp->paramSize = len = 4 + sizeof_TPM_RIM_CERTIFICATE(rimCertOut); |
+ rsp->param = ptr = tpm_malloc(len); |
+ if (ptr == NULL |
+ || tpm_marshal_UINT32(&ptr, &len, sizeof_TPM_RIM_CERTIFICATE(rimCertOut)) |
+ || tpm_marshal_TPM_RIM_CERTIFICATE(&ptr, &len, &rimCertOut)) { |
+ tpm_free(rsp->param); |
+ res = TPM_FAIL; |
+ } |
+ free_TPM_RIM_CERTIFICATE(rimCertOut); |
+ return res; |
+} |
+ |
+static TPM_RESULT execute_MTM_LoadVerificationKey(TPM_REQUEST *req, TPM_RESPONSE *rsp) |
+{ |
+ BYTE *ptr; |
+ UINT32 len; |
+ TPM_VERIFICATION_KEY_HANDLE parentKey; |
+ UINT32 verificationKeySize; |
+ TPM_VERIFICATION_KEY verificationKey; |
+ TPM_VERIFICATION_KEY_HANDLE verificationKeyHandle; |
+ BYTE loadMethod; |
+ TPM_RESULT res; |
+ /* compute parameter digest */ |
+ tpm_compute_in_param_digest(req); |
+ /* unmarshal input */ |
+ ptr = req->param; |
+ len = req->paramSize; |
+ if (tpm_unmarshal_TPM_VERIFICATION_KEY_HANDLE(&ptr, &len, &parentKey) |
+ || tpm_unmarshal_UINT32(&ptr, &len, &verificationKeySize) |
+ || tpm_unmarshal_TPM_VERIFICATION_KEY(&ptr, &len, &verificationKey) |
+ || len != 0) return TPM_BAD_PARAMETER; |
+ /* execute command */ |
+ res = MTM_LoadVerificationKey(parentKey, &verificationKey, &req->auth1, |
+ &verificationKeyHandle, &loadMethod); |
+ if (res != TPM_SUCCESS) return res; |
+ /* marshal output */ |
+ rsp->paramSize = len = 4 + 1; |
+ rsp->param = ptr = tpm_malloc(len); |
+ if (ptr == NULL |
+ || tpm_marshal_TPM_VERIFICATION_KEY_HANDLE(&ptr, &len, verificationKeyHandle) |
+ || tpm_marshal_BYTE(&ptr, &len, loadMethod)) { |
+ tpm_free(rsp->param); |
+ res = TPM_FAIL; |
+ } |
+ return res; |
+} |
+ |
+static TPM_RESULT execute_MTM_LoadVerificationRootKeyDisable(TPM_REQUEST *req, TPM_RESPONSE *rsp) |
+{ |
+ TPM_RESULT res; |
+ /* compute parameter digest */ |
+ tpm_compute_in_param_digest(req); |
+ /* execute command */ |
+ res = MTM_LoadVerificationRootKeyDisable(); |
+ /* marshal output */ |
+ rsp->paramSize = 0; |
+ rsp->param = NULL; |
+ return res; |
+} |
+ |
+static TPM_RESULT execute_MTM_VerifyRIMCert(TPM_REQUEST *req, TPM_RESPONSE *rsp) |
+{ |
+ BYTE *ptr; |
+ UINT32 len; |
+ UINT32 rimCertSize; |
+ TPM_RIM_CERTIFICATE rimCert; |
+ TPM_VERIFICATION_KEY_HANDLE rimKey; |
+ TPM_RESULT res; |
+ /* compute parameter digest */ |
+ tpm_compute_in_param_digest(req); |
+ /* unmarshal input */ |
+ ptr = req->param; |
+ len = req->paramSize; |
+ if (tpm_unmarshal_UINT32(&ptr, &len, &rimCertSize) |
+ || tpm_unmarshal_TPM_RIM_CERTIFICATE(&ptr, &len, &rimCert) |
+ || tpm_unmarshal_TPM_VERIFICATION_KEY_HANDLE(&ptr, &len, &rimKey) |
+ || len != 0) return TPM_BAD_PARAMETER; |
+ /* execute command */ |
+ res = MTM_VerifyRIMCert(&rimCert, rimKey); |
+ /* marshal output */ |
+ rsp->paramSize = len = 0; |
+ rsp->param = ptr = NULL; |
+ return res; |
+} |
+ |
+static TPM_RESULT execute_MTM_VerifyRIMCertAndExtend(TPM_REQUEST *req, TPM_RESPONSE *rsp) |
+{ |
+ BYTE *ptr; |
+ UINT32 len; |
+ UINT32 rimCertSize; |
+ TPM_RIM_CERTIFICATE rimCert; |
+ TPM_VERIFICATION_KEY_HANDLE rimKey; |
+ TPM_PCRVALUE outDigest; |
+ TPM_RESULT res; |
+ /* compute parameter digest */ |
+ tpm_compute_in_param_digest(req); |
+ /* unmarshal input */ |
+ ptr = req->param; |
+ len = req->paramSize; |
+ if (tpm_unmarshal_UINT32(&ptr, &len, &rimCertSize) |
+ || tpm_unmarshal_TPM_RIM_CERTIFICATE(&ptr, &len, &rimCert) |
+ || tpm_unmarshal_TPM_VERIFICATION_KEY_HANDLE(&ptr, &len, &rimKey) |
+ || len != 0) return TPM_BAD_PARAMETER; |
+ /* execute command */ |
+ res = MTM_VerifyRIMCertAndExtend(&rimCert, rimKey, &outDigest); |
+ /* marshal output */ |
+ rsp->paramSize = len = 20; |
+ rsp->param = ptr = tpm_malloc(len); |
+ if (ptr == NULL |
+ || tpm_marshal_TPM_PCRVALUE(&ptr, &len, &outDigest)) { |
+ tpm_free(rsp->param); |
+ res = TPM_FAIL; |
+ } |
+ return res; |
+} |
+ |
+static TPM_RESULT execute_MTM_IncrementBootstrapCounter(TPM_REQUEST *req, TPM_RESPONSE *rsp) |
+{ |
+ BYTE *ptr; |
+ UINT32 len; |
+ UINT32 rimCertSize; |
+ TPM_RIM_CERTIFICATE rimCert; |
+ TPM_VERIFICATION_KEY_HANDLE rimKey; |
+ TPM_RESULT res; |
+ /* compute parameter digest */ |
+ tpm_compute_in_param_digest(req); |
+ /* unmarshal input */ |
+ ptr = req->param; |
+ len = req->paramSize; |
+ if (tpm_unmarshal_UINT32(&ptr, &len, &rimCertSize) |
+ || tpm_unmarshal_TPM_RIM_CERTIFICATE(&ptr, &len, &rimCert) |
+ || tpm_unmarshal_TPM_VERIFICATION_KEY_HANDLE(&ptr, &len, &rimKey) |
+ || len != 0) return TPM_BAD_PARAMETER; |
+ /* execute command */ |
+ res = MTM_IncrementBootstrapCounter(&rimCert, rimKey); |
+ /* marshal output */ |
+ rsp->paramSize = len = 0; |
+ rsp->param = ptr = NULL; |
+ return res; |
+} |
+ |
+static TPM_RESULT execute_MTM_SetVerifiedPCRSelection(TPM_REQUEST *req, TPM_RESPONSE *rsp) |
+{ |
+ BYTE *ptr; |
+ UINT32 len; |
+ TPM_PCR_SELECTION verifiedSelection; |
+ TPM_RESULT res; |
+ /* compute parameter digest */ |
+ tpm_compute_in_param_digest(req); |
+ /* unmarshal input */ |
+ ptr = req->param; |
+ len = req->paramSize; |
+ if (tpm_unmarshal_TPM_PCR_SELECTION(&ptr, &len, &verifiedSelection) |
+ || len != 0) return TPM_BAD_PARAMETER; |
+ /* execute command */ |
+ res = MTM_SetVerifiedPCRSelection(&verifiedSelection, &req->auth1); |
+ /* marshal output */ |
+ rsp->paramSize = len = 0; |
+ rsp->param = ptr = NULL; |
+ return res; |
+} |
+ |
+ |
+TPM_RESULT mtm_execute_command(TPM_REQUEST *req, TPM_RESPONSE *rsp) |
+{ |
+ TPM_RESULT res; |
+ |
+ /* handle command ordinal */ |
+ switch (req->ordinal) { |
+ case MTM_ORD_InstallRIM: |
+ debug("[MTM_ORD_InstallRIM]"); |
+ res = execute_MTM_InstallRIM(req, rsp); |
+ break; |
+ |
+ case MTM_ORD_LoadVerificationKey: |
+ debug("[MTM_ORD_LoadVerificationKey]"); |
+ res = execute_MTM_LoadVerificationKey(req, rsp); |
+ break; |
+ |
+ case MTM_ORD_LoadVerificationRootKeyDisable: |
+ debug("[MTM_ORD_LoadVerificationRootKeyDisable]"); |
+ res = execute_MTM_LoadVerificationRootKeyDisable(req, rsp); |
+ break; |
+ |
+ case MTM_ORD_VerifyRIMCert: |
+ debug("[MTM_ORD_VerifyRIMCert]"); |
+ res = execute_MTM_VerifyRIMCert(req, rsp); |
+ break; |
+ |
+ case MTM_ORD_VerifyRIMCertAndExtend: |
+ debug("[MTM_ORD_VerifyRIMCertAndExtend]"); |
+ res = execute_MTM_VerifyRIMCertAndExtend(req, rsp); |
+ break; |
+ |
+ case MTM_ORD_IncrementBootstrapCounter: |
+ debug("[MTM_ORD_IncrementBootstrapCounter]"); |
+ res = execute_MTM_IncrementBootstrapCounter(req, rsp); |
+ break; |
+ |
+ case MTM_ORD_SetVerifiedPCRSelection: |
+ debug("[MTM_ORD_SetVerifiedPCRSelection]"); |
+ res = execute_MTM_SetVerifiedPCRSelection(req, rsp); |
+ break; |
+ |
+ default: |
+ res = TPM_BAD_ORDINAL; |
+ break; |
+ } |
+ return res; |
+} |