Simulated product dispenser

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers arm_uc_mmDerManifestAccessors.c Source File

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 }