Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
arm_uc_mmDerManifestAccessors.c
00001 // ---------------------------------------------------------------------------- 00002 // Copyright 2016-2017 ARM Ltd. 00003 // 00004 // SPDX-License-Identifier: Apache-2.0 00005 // 00006 // Licensed under the Apache License, Version 2.0 (the "License"); 00007 // you may not use this file except in compliance with the License. 00008 // You may obtain a copy of the License at 00009 // 00010 // http://www.apache.org/licenses/LICENSE-2.0 00011 // 00012 // Unless required by applicable law or agreed to in writing, software 00013 // distributed under the License is distributed on an "AS IS" BASIS, 00014 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00015 // See the License for the specific language governing permissions and 00016 // limitations under the License. 00017 // ---------------------------------------------------------------------------- 00018 00019 #include "arm_uc_mmDerManifestAccessors.h" 00020 #include "arm_uc_mmDerManifestParser.h" 00021 #include <string.h> 00022 00023 00024 arm_uc_error_t ARM_UC_wrapMbedTLSError(int32_t mt_err) 00025 { 00026 return (arm_uc_error_t) {.error = -mt_err, .module = MBED_TLS_ERROR_PREFIX}; 00027 } 00028 00029 arm_uc_error_t ARM_UC_mmDERSignedResourceGetSingleValue(arm_uc_buffer_t *buffer, const int32_t fieldID, 00030 arm_uc_buffer_t *val) 00031 { 00032 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00033 arm_uc_error_t err = {ARM_UC_DP_ERR_UNKNOWN}; 00034 if (rc < 0) { 00035 err = ARM_UC_wrapMbedTLSError(rc); 00036 } else if (rc == 0) { 00037 err.code = ERR_NONE; 00038 } else { //if (rc > 0) 00039 err.code = ARM_UC_DP_ERR_NOT_FOUND; 00040 } 00041 return err; 00042 } 00043 00044 arm_uc_error_t ARM_UC_mmDERGetSingleValue( 00045 const struct arm_uc_mmDerElement *desc, 00046 arm_uc_buffer_t *buffer, 00047 const int32_t valueID, 00048 arm_uc_buffer_t *val) 00049 { 00050 int32_t rc = ARM_UC_mmDERParseTree(desc, buffer, 1U, &valueID, val); 00051 arm_uc_error_t err = {ARM_UC_DP_ERR_UNKNOWN}; 00052 if (rc < 0) { 00053 err = ARM_UC_wrapMbedTLSError(rc); 00054 } else if (rc == 0) { 00055 err.code = ERR_NONE; 00056 } else { //if (rc > 0) 00057 err.code = ARM_UC_DP_ERR_NOT_FOUND; 00058 } 00059 return err; 00060 } 00061 00062 uint32_t ARM_UC_mmGetCryptoModeInline(arm_uc_buffer_t *buffer) 00063 { 00064 uint32_t val = 1U; // default to SHA256 and ECC 00065 ARM_UC_mmGetCryptoMode(buffer, &val); 00066 return val; 00067 } 00068 arm_uc_error_t ARM_UC_mmGetVersion(arm_uc_buffer_t *buffer, uint32_t *val) 00069 { 00070 const int32_t fieldID = ARM_UC_MM_DER_MFST_VERSION; 00071 arm_uc_buffer_t field = { 0UL }; 00072 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00073 if (rc || field.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00074 *val = ARM_UC_mmDerBuf2Uint(&field); 00075 return (arm_uc_error_t) {ERR_NONE}; 00076 } 00077 arm_uc_error_t ARM_UC_mmGetCryptoMode(arm_uc_buffer_t *buffer, uint32_t *val) 00078 { 00079 const int32_t fieldID = ARM_UC_MM_DER_MFST_ENC_ENUM; 00080 arm_uc_buffer_t field = { 0UL }; 00081 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00082 if (rc || field.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00083 *val = ARM_UC_mmDerBuf2Uint(&field); 00084 return (arm_uc_error_t) {ERR_NONE}; 00085 } 00086 arm_uc_error_t ARM_UC_mmGetTimestamp(arm_uc_buffer_t *buffer, uint64_t *val) 00087 { 00088 const int32_t fieldID = ARM_UC_MM_DER_MFST_TIMESTAMP; 00089 arm_uc_buffer_t field = { 0UL }; 00090 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00091 if (rc || field.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00092 *val = ARM_UC_mmDerBuf2Uint64(&field); 00093 return (arm_uc_error_t) {ERR_NONE}; 00094 } 00095 arm_uc_error_t ARM_UC_mmGetValidFrom(arm_uc_buffer_t *buffer, uint64_t *val) 00096 { 00097 const int32_t fieldID = ARM_UC_MM_DER_MFST_VALID_FROM; 00098 arm_uc_buffer_t field = { 0UL }; 00099 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00100 if (rc < 0 || field.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00101 if (rc > 0) return (arm_uc_error_t) {MFST_ERR_EMPTY_FIELD}; 00102 *val = ARM_UC_mmDerBuf2Uint64(&field); 00103 return (arm_uc_error_t) {ERR_NONE}; 00104 } 00105 arm_uc_error_t ARM_UC_mmGetValidTo(arm_uc_buffer_t *buffer, uint64_t *val) 00106 { 00107 const int32_t fieldID = ARM_UC_MM_DER_MFST_VALID_TO; 00108 arm_uc_buffer_t field = { 0UL }; 00109 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00110 if (rc < 0 || field.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00111 if (rc > 0) return (arm_uc_error_t) {MFST_ERR_EMPTY_FIELD}; 00112 *val = ARM_UC_mmDerBuf2Uint64(&field); 00113 return (arm_uc_error_t) {ERR_NONE}; 00114 } 00115 arm_uc_error_t ARM_UC_mmGetVendorGuid(arm_uc_buffer_t *buffer, arm_uc_buffer_t *guid) 00116 { 00117 const int32_t fieldID = ARM_UC_MM_DER_MFST_VENDOR_UUID; 00118 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, guid); 00119 if (rc || guid->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00120 return (arm_uc_error_t) {ERR_NONE}; 00121 } 00122 arm_uc_error_t ARM_UC_mmGetClassGuid(arm_uc_buffer_t *buffer, arm_uc_buffer_t *guid) 00123 { 00124 const int32_t fieldID = ARM_UC_MM_DER_MFST_CLASS_UUID; 00125 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, guid); 00126 if (rc || guid->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00127 return (arm_uc_error_t) {ERR_NONE}; 00128 } 00129 arm_uc_error_t ARM_UC_mmGetDeviceGuid(arm_uc_buffer_t *buffer, arm_uc_buffer_t *guid) 00130 { 00131 const int32_t fieldID = ARM_UC_MM_DER_MFST_DEVICE_UUID; 00132 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, guid); 00133 if (rc || guid->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00134 return (arm_uc_error_t) {ERR_NONE}; 00135 } 00136 00137 arm_uc_error_t ARM_UC_mmGetFwInitVector(arm_uc_buffer_t *buffer, arm_uc_buffer_t *val) 00138 { 00139 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_CRYPT_IV; 00140 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00141 if (rc || val->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00142 return (arm_uc_error_t) {ERR_NONE}; 00143 } 00144 arm_uc_error_t ARM_UC_mmGetFwUri(arm_uc_buffer_t *buffer, arm_uc_buffer_t *val) 00145 { 00146 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_RSRC_REF_URL; 00147 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00148 if (rc || val->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00149 return (arm_uc_error_t) {ERR_NONE}; 00150 } 00151 arm_uc_error_t ARM_UC_mmGetFwSize(arm_uc_buffer_t *buffer, uint32_t *val) 00152 { 00153 arm_uc_buffer_t field = { 0UL }; 00154 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_RSRC_REF_SIZE; 00155 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00156 if (rc || field.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00157 *val = ARM_UC_mmDerBuf2Uint(&field); 00158 return (arm_uc_error_t) {ERR_NONE}; 00159 } 00160 arm_uc_error_t ARM_UC_mmGetFwHash(arm_uc_buffer_t *buffer, arm_uc_buffer_t *val) 00161 { 00162 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_RSRC_REF_HASH; 00163 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00164 if (rc || val->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00165 return (arm_uc_error_t) {ERR_NONE}; 00166 } 00167 arm_uc_error_t ARM_UC_mmGetFwSymmKey(arm_uc_buffer_t *buffer, arm_uc_buffer_t *val) 00168 { 00169 return (arm_uc_error_t) {MFST_ERR_VERSION}; 00170 } 00171 arm_uc_error_t ARM_UC_mmGetFwCertId(arm_uc_buffer_t *buffer, arm_uc_buffer_t *val) 00172 { 00173 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_CRYPT_ID_LOCAL; 00174 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00175 if (rc || val->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00176 return (arm_uc_error_t) {ERR_NONE}; 00177 } 00178 arm_uc_error_t ARM_UC_mmGetDescription(arm_uc_buffer_t *buffer, arm_uc_buffer_t *val) 00179 { 00180 const int32_t fieldID = ARM_UC_MM_DER_MFST_DESC; 00181 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00182 if (rc || val->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00183 return (arm_uc_error_t) {ERR_NONE}; 00184 } 00185 arm_uc_error_t ARM_UC_mmGetManifestLinksUri(arm_uc_buffer_t *buffer, arm_uc_buffer_t *val) 00186 { 00187 const int32_t fieldID = ARM_UC_MM_DER_MFST_DEP_REF_URL; 00188 int32_t rc = ARM_UC_mmDERParseTree(arm_uc_mmManifestDependencies, buffer, 1U, &fieldID, val); 00189 if (rc || val->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00190 return (arm_uc_error_t) {ERR_NONE}; 00191 } 00192 arm_uc_error_t ARM_UC_mmGetManifestLinksHash(arm_uc_buffer_t *buffer, arm_uc_buffer_t *val) 00193 { 00194 const int32_t fieldID = ARM_UC_MM_DER_MFST_DEP_REF_HASH; 00195 int32_t rc = ARM_UC_mmDERParseTree(arm_uc_mmManifestDependencies, buffer, 1U, &fieldID, val); 00196 if (rc || val->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00197 return (arm_uc_error_t) {ERR_NONE}; 00198 } 00199 arm_uc_error_t ARM_UC_mmGetManifestLinksElement(arm_uc_buffer_t *buffer, uint32_t index, arm_uc_buffer_t *element) 00200 { 00201 arm_uc_buffer_t elements = { 0UL }; 00202 const int32_t fieldID = ARM_UC_MM_DER_MFST_DEPS; 00203 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &elements); 00204 if (rc || elements.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00205 element->ptr = NULL; 00206 rc = ARM_UC_mmDERGetSequenceElement(&elements, index, element); 00207 if (rc) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00208 return (arm_uc_error_t) {ERR_NONE}; 00209 } 00210 arm_uc_error_t ARM_UC_mmGetManifestHash(arm_uc_buffer_t *buffer, arm_uc_buffer_t *val) 00211 { 00212 return ARM_UC_mmDERSignedResourceGetSingleValue(buffer, ARM_UC_MM_DER_SIG_HASH, val); 00213 } 00214 arm_uc_error_t ARM_UC_mmGetSignatureBlock(arm_uc_buffer_t *buffer, uint32_t idx, arm_uc_buffer_t *block) 00215 { 00216 arm_uc_buffer_t signatures = { 0UL }; 00217 arm_uc_error_t err = ARM_UC_mmDERSignedResourceGetSingleValue(buffer, ARM_UC_MM_DER_SIG_SIGNATURES, &signatures); 00218 if (err.error) { return err; } 00219 if (signatures.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00220 00221 int32_t rc = ARM_UC_mmDERGetSequenceElement(&signatures, idx, block); 00222 if (rc) { return ARM_UC_wrapMbedTLSError(rc); } 00223 if (block->ptr == NULL) return (arm_uc_error_t) {ARM_UC_DP_ERR_NO_MORE_ELEMENTS}; 00224 00225 return (arm_uc_error_t) {ERR_NONE}; 00226 } 00227 arm_uc_error_t ARM_UC_mmGetSignature(arm_uc_buffer_t *buffer, uint32_t idx, arm_uc_buffer_t *val) 00228 { 00229 arm_uc_buffer_t signatureBlock = { 0UL }; 00230 arm_uc_error_t err = ARM_UC_mmGetSignatureBlock(buffer, idx, &signatureBlock); 00231 if (err.error) { return err; } 00232 if (signatureBlock.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00233 00234 err = ARM_UC_mmDERGetSingleValue(arm_uc_mmSignatures, &signatureBlock, ARM_UC_MM_DER_SIG_SIGNATURE, val); 00235 if (err.error) { return err; } 00236 if (val->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00237 return (arm_uc_error_t) {ERR_NONE}; 00238 } 00239 00240 arm_uc_error_t ARM_UC_mmGetCertificateId(arm_uc_buffer_t *buffer, uint32_t sigIdx, arm_uc_buffer_t *val) 00241 { 00242 arm_uc_buffer_t signatureBlock = { 0UL }; 00243 arm_uc_error_t err = ARM_UC_mmGetSignatureBlock(buffer, sigIdx, &signatureBlock); 00244 if (err.error) { return err; } 00245 if (signatureBlock.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00246 00247 arm_uc_buffer_t seq = { 0UL }; 00248 err = ARM_UC_mmDERGetSingleValue(arm_uc_mmSignatures, &signatureBlock, ARM_UC_MM_DER_SIG_CERTS, &seq); 00249 if (err.error) { return err; } 00250 if (seq.ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00251 00252 arm_uc_buffer_t element = { 0UL }; 00253 element.ptr = NULL; 00254 int32_t rc = ARM_UC_mmDERGetSequenceElement(&seq, 0, &element); 00255 if (rc) { return ARM_UC_wrapMbedTLSError(rc); } 00256 if (element.ptr == NULL) return (arm_uc_error_t) {ARM_UC_DP_ERR_NO_MORE_ELEMENTS}; 00257 00258 err = ARM_UC_mmDERGetSingleValue(arm_uc_mmSignatureCertificateReferences, &element, ARM_UC_MM_DER_SIG_CERT_FINGERPRINT, 00259 val); 00260 if (err.error) { return err; } 00261 if (val->ptr == NULL) return (arm_uc_error_t) {MFST_ERR_DER_FORMAT}; 00262 return (arm_uc_error_t) {ERR_NONE}; 00263 }
Generated on Mon Aug 29 2022 19:53:38 by
