leo hendrickson / Mbed OS example-Ethernet-mbed-Cloud-connect
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 {
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 }