Simulated product dispenser
Fork of mbed-cloud-workshop-connect-HTS221 by
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 return (arm_uc_error_t){.error = -mt_err, .module = MBED_TLS_ERROR_PREFIX}; 00026 } 00027 00028 arm_uc_error_t ARM_UC_mmDERSignedResourceGetSingleValue(arm_uc_buffer_t* buffer, const int32_t fieldID, arm_uc_buffer_t* val) 00029 { 00030 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00031 arm_uc_error_t err = {ARM_UC_DP_ERR_UNKNOWN}; 00032 if (rc < 0) { 00033 err = ARM_UC_wrapMbedTLSError(rc); 00034 } else if (rc == 0) { 00035 err.code = ARM_UC_DP_ERR_NONE; 00036 } else { //if (rc > 0) 00037 err.code = ARM_UC_DP_ERR_NOT_FOUND; 00038 } 00039 return err; 00040 } 00041 00042 arm_uc_error_t ARM_UC_mmDERGetSingleValue( 00043 const struct arm_uc_mmDerElement* desc, 00044 arm_uc_buffer_t* buffer, 00045 const int32_t valueID, 00046 arm_uc_buffer_t* val) 00047 { 00048 int32_t rc = ARM_UC_mmDERParseTree(desc, buffer, 1U, &valueID, val); 00049 arm_uc_error_t err = {ARM_UC_DP_ERR_UNKNOWN}; 00050 if (rc < 0) { 00051 err = ARM_UC_wrapMbedTLSError(rc); 00052 } else if (rc == 0) { 00053 err.code = ARM_UC_DP_ERR_NONE; 00054 } else { //if (rc > 0) 00055 err.code = ARM_UC_DP_ERR_NOT_FOUND; 00056 } 00057 return err; 00058 } 00059 00060 uint32_t ARM_UC_mmGetCryptoModeInline(arm_uc_buffer_t* buffer) 00061 { 00062 uint32_t val = 1U; // default to SHA256 and ECC 00063 ARM_UC_mmGetCryptoMode(buffer, &val); 00064 return val; 00065 } 00066 arm_uc_error_t ARM_UC_mmGetVersion(arm_uc_buffer_t* buffer, uint32_t* val) 00067 { 00068 const int32_t fieldID = ARM_UC_MM_DER_MFST_VERSION; 00069 arm_uc_buffer_t field = { 0UL }; 00070 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00071 if (rc || field.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00072 *val = ARM_UC_mmDerBuf2Uint(&field); 00073 return (arm_uc_error_t){MFST_ERR_NONE}; 00074 } 00075 arm_uc_error_t ARM_UC_mmGetCryptoMode(arm_uc_buffer_t* buffer, uint32_t* val) 00076 { 00077 const int32_t fieldID = ARM_UC_MM_DER_MFST_ENC_ENUM; 00078 arm_uc_buffer_t field = { 0UL }; 00079 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00080 if (rc || field.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00081 *val = ARM_UC_mmDerBuf2Uint(&field); 00082 return (arm_uc_error_t){MFST_ERR_NONE}; 00083 } 00084 arm_uc_error_t ARM_UC_mmGetTimestamp(arm_uc_buffer_t* buffer, uint64_t* val) 00085 { 00086 const int32_t fieldID = ARM_UC_MM_DER_MFST_TIMESTAMP; 00087 arm_uc_buffer_t field = { 0UL }; 00088 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00089 if (rc || field.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00090 *val = ARM_UC_mmDerBuf2Uint64(&field); 00091 return (arm_uc_error_t){MFST_ERR_NONE}; 00092 } 00093 arm_uc_error_t ARM_UC_mmGetValidFrom(arm_uc_buffer_t* buffer, uint64_t* val) 00094 { 00095 const int32_t fieldID = ARM_UC_MM_DER_MFST_VALID_FROM; 00096 arm_uc_buffer_t field = { 0UL }; 00097 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00098 if (rc < 0 || field.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00099 if (rc > 0) return (arm_uc_error_t){MFST_ERR_EMPTY_FIELD}; 00100 *val = ARM_UC_mmDerBuf2Uint64(&field); 00101 return (arm_uc_error_t){MFST_ERR_NONE}; 00102 } 00103 arm_uc_error_t ARM_UC_mmGetValidTo(arm_uc_buffer_t* buffer, uint64_t* val) 00104 { 00105 const int32_t fieldID = ARM_UC_MM_DER_MFST_VALID_TO; 00106 arm_uc_buffer_t field = { 0UL }; 00107 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00108 if (rc < 0 || field.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00109 if (rc > 0) return (arm_uc_error_t){MFST_ERR_EMPTY_FIELD}; 00110 *val = ARM_UC_mmDerBuf2Uint64(&field); 00111 return (arm_uc_error_t){MFST_ERR_NONE}; 00112 } 00113 arm_uc_error_t ARM_UC_mmGetVendorGuid(arm_uc_buffer_t* buffer, arm_uc_buffer_t* guid) 00114 { 00115 const int32_t fieldID = ARM_UC_MM_DER_MFST_VENDOR_UUID; 00116 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, guid); 00117 if (rc || guid->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00118 return (arm_uc_error_t){MFST_ERR_NONE}; 00119 } 00120 arm_uc_error_t ARM_UC_mmGetClassGuid(arm_uc_buffer_t* buffer, arm_uc_buffer_t* guid) 00121 { 00122 const int32_t fieldID = ARM_UC_MM_DER_MFST_CLASS_UUID; 00123 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, guid); 00124 if (rc || guid->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00125 return (arm_uc_error_t){MFST_ERR_NONE}; 00126 } 00127 arm_uc_error_t ARM_UC_mmGetDeviceGuid(arm_uc_buffer_t* buffer, arm_uc_buffer_t* guid) 00128 { 00129 const int32_t fieldID = ARM_UC_MM_DER_MFST_DEVICE_UUID; 00130 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, guid); 00131 if (rc || guid->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00132 return (arm_uc_error_t){MFST_ERR_NONE}; 00133 } 00134 00135 arm_uc_error_t ARM_UC_mmGetFwInitVector(arm_uc_buffer_t* buffer, arm_uc_buffer_t* val) 00136 { 00137 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_CRYPT_IV; 00138 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00139 if (rc || val->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00140 return (arm_uc_error_t){MFST_ERR_NONE}; 00141 } 00142 arm_uc_error_t ARM_UC_mmGetFwUri(arm_uc_buffer_t* buffer, arm_uc_buffer_t* val) 00143 { 00144 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_RSRC_REF_URL; 00145 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00146 if (rc || val->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00147 return (arm_uc_error_t){MFST_ERR_NONE}; 00148 } 00149 arm_uc_error_t ARM_UC_mmGetFwSize(arm_uc_buffer_t* buffer, uint32_t* val) 00150 { 00151 arm_uc_buffer_t field = { 0UL }; 00152 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_RSRC_REF_SIZE; 00153 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &field); 00154 if (rc || field.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00155 *val = ARM_UC_mmDerBuf2Uint(&field); 00156 return (arm_uc_error_t){MFST_ERR_NONE}; 00157 } 00158 arm_uc_error_t ARM_UC_mmGetFwHash(arm_uc_buffer_t* buffer, arm_uc_buffer_t* val) 00159 { 00160 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_RSRC_REF_HASH; 00161 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00162 if (rc || val->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00163 return (arm_uc_error_t){MFST_ERR_NONE}; 00164 } 00165 arm_uc_error_t ARM_UC_mmGetFwSymmKey(arm_uc_buffer_t* buffer, arm_uc_buffer_t* val) 00166 { 00167 return (arm_uc_error_t){MFST_ERR_VERSION}; 00168 } 00169 arm_uc_error_t ARM_UC_mmGetFwCertId(arm_uc_buffer_t* buffer, arm_uc_buffer_t* val) 00170 { 00171 const int32_t fieldID = ARM_UC_MM_DER_MFST_FW_CRYPT_ID_LOCAL; 00172 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00173 if (rc || val->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00174 return (arm_uc_error_t){MFST_ERR_NONE}; 00175 } 00176 arm_uc_error_t ARM_UC_mmGetDescription(arm_uc_buffer_t* buffer, arm_uc_buffer_t* val) 00177 { 00178 const int32_t fieldID = ARM_UC_MM_DER_MFST_DESC; 00179 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, val); 00180 if (rc || val->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00181 return (arm_uc_error_t){MFST_ERR_NONE}; 00182 } 00183 arm_uc_error_t ARM_UC_mmGetManifestLinksUri(arm_uc_buffer_t* buffer, arm_uc_buffer_t* val) 00184 { 00185 const int32_t fieldID = ARM_UC_MM_DER_MFST_DEP_REF_URL; 00186 int32_t rc = ARM_UC_mmDERParseTree(arm_uc_mmManifestDependencies, buffer, 1U, &fieldID, val); 00187 if (rc || val->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00188 return (arm_uc_error_t){MFST_ERR_NONE}; 00189 } 00190 arm_uc_error_t ARM_UC_mmGetManifestLinksHash(arm_uc_buffer_t* buffer, arm_uc_buffer_t* val) 00191 { 00192 const int32_t fieldID = ARM_UC_MM_DER_MFST_DEP_REF_HASH; 00193 int32_t rc = ARM_UC_mmDERParseTree(arm_uc_mmManifestDependencies, buffer, 1U, &fieldID, val); 00194 if (rc || val->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00195 return (arm_uc_error_t){MFST_ERR_NONE}; 00196 } 00197 arm_uc_error_t ARM_UC_mmGetManifestLinksElement(arm_uc_buffer_t* buffer, uint32_t index, arm_uc_buffer_t* element) 00198 { 00199 arm_uc_buffer_t elements = { 0UL }; 00200 const int32_t fieldID = ARM_UC_MM_DER_MFST_DEPS; 00201 int32_t rc = ARM_UC_mmDERGetSignedResourceValues(buffer, 1U, &fieldID, &elements); 00202 if (rc || elements.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00203 element->ptr = NULL; 00204 rc = ARM_UC_mmDERGetSequenceElement(&elements, index, element); 00205 if (rc) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00206 return (arm_uc_error_t){MFST_ERR_NONE}; 00207 } 00208 arm_uc_error_t ARM_UC_mmGetManifestHash(arm_uc_buffer_t* buffer, arm_uc_buffer_t* val) 00209 { 00210 return ARM_UC_mmDERSignedResourceGetSingleValue(buffer, ARM_UC_MM_DER_SIG_HASH, val); 00211 } 00212 arm_uc_error_t ARM_UC_mmGetSignatureBlock(arm_uc_buffer_t* buffer, uint32_t idx, arm_uc_buffer_t* block) 00213 { 00214 arm_uc_buffer_t signatures = { 0UL }; 00215 arm_uc_error_t err = ARM_UC_mmDERSignedResourceGetSingleValue(buffer, ARM_UC_MM_DER_SIG_SIGNATURES, &signatures); 00216 if (err.error) return err; 00217 if (signatures.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00218 00219 int32_t rc = ARM_UC_mmDERGetSequenceElement(&signatures, idx, block); 00220 if (rc) return ARM_UC_wrapMbedTLSError(rc); 00221 if (block->ptr == NULL) return (arm_uc_error_t){ARM_UC_DP_ERR_NO_MORE_ELEMENTS}; 00222 00223 return (arm_uc_error_t){MFST_ERR_NONE}; 00224 } 00225 arm_uc_error_t ARM_UC_mmGetSignature(arm_uc_buffer_t* buffer, uint32_t idx, arm_uc_buffer_t* val) 00226 { 00227 arm_uc_buffer_t signatureBlock = { 0UL }; 00228 arm_uc_error_t err = ARM_UC_mmGetSignatureBlock(buffer, idx, &signatureBlock); 00229 if (err.error) return err; 00230 if (signatureBlock.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00231 00232 err = ARM_UC_mmDERGetSingleValue(arm_uc_mmSignatures, &signatureBlock, ARM_UC_MM_DER_SIG_SIGNATURE, val); 00233 if (err.error) return err; 00234 if (val->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00235 return (arm_uc_error_t){MFST_ERR_NONE}; 00236 } 00237 00238 arm_uc_error_t ARM_UC_mmGetCertificateId(arm_uc_buffer_t* buffer, uint32_t sigIdx, arm_uc_buffer_t* val) 00239 { 00240 arm_uc_buffer_t signatureBlock = { 0UL }; 00241 arm_uc_error_t err = ARM_UC_mmGetSignatureBlock(buffer, sigIdx, &signatureBlock); 00242 if (err.error) return err; 00243 if (signatureBlock.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00244 00245 arm_uc_buffer_t seq = { 0UL }; 00246 err = ARM_UC_mmDERGetSingleValue(arm_uc_mmSignatures, &signatureBlock, ARM_UC_MM_DER_SIG_CERTS, &seq); 00247 if (err.error) return err; 00248 if (seq.ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00249 00250 arm_uc_buffer_t element = { 0UL }; 00251 element.ptr = NULL; 00252 int32_t rc = ARM_UC_mmDERGetSequenceElement(&seq, 0, &element); 00253 if (rc) return ARM_UC_wrapMbedTLSError(rc); 00254 if (element.ptr == NULL) return (arm_uc_error_t){ARM_UC_DP_ERR_NO_MORE_ELEMENTS}; 00255 00256 err = ARM_UC_mmDERGetSingleValue(arm_uc_mmSignatureCertificateReferences, &element, ARM_UC_MM_DER_SIG_CERT_FINGERPRINT, val ); 00257 if (err.error) return err; 00258 if (val->ptr == NULL) return (arm_uc_error_t){MFST_ERR_DER_FORMAT}; 00259 return (arm_uc_error_t){MFST_ERR_NONE}; 00260 }
Generated on Tue Jul 12 2022 19:12:11 by 1.7.2