88 McciBootloader_AppInfo_t *pIncomingAppInfo,
89 const mcci_tweetnacl_sign_publickey_t *pPublicKey
99 const McciBootloader_AppInfo_t *
const pAppInfoIn =
102 if (pAppInfoIn == NULL)
105 *pIncomingAppInfo = *pAppInfoIn;
107 uint32_t targetAddress = pIncomingAppInfo->targetAddress;
108 uint32_t targetSize = pIncomingAppInfo->imagesize + pIncomingAppInfo->authsize;
114 mcci_tweetnacl_sha512_t imageHash;
116 mcci_tweetnacl_hashblocks_sha512_init(&imageHash);
122 pIncomingAppInfo->imagesize +
123 sizeof(mcci_tweetnacl_sign_publickey_t);
126 uint32_t nRemaining = 0;
129 for (addressCurrent = address; addressCurrent < addressEnd; )
136 uint32_t nThisTime = addressEnd - addressCurrent;
142 if (addressCurrent != address)
153 nRemaining = mcci_tweetnacl_hashblocks_sha512(
160 uint32_t
const nConsumed = nThisTime - nRemaining;
161 addressCurrent += nThisTime;
165 mcci_tweetnacl_hashblocks_sha512_finish(
174 address + pIncomingAppInfo->imagesize,
176 sizeof(McciBootloader_SignatureBlock_t)
180 const size_t nsig =
sizeof(mcci_tweetnacl_sign_signature_t);
181 const size_t nsigned =
sizeof(imageHash) + nsig;
191 sizeof(imageHash.bytes)
197 mcci_tweetnacl_sha512_t *pSignedHash =
198 (
void *)((uint8_t *)pSigBlock->signature.bytes + nsigned);
201 volatile mcci_tweetnacl_result_t result;
204 result = mcci_tweetnacl_sign_open(
207 pSigBlock->signature.bytes,
214 result |= nActual ^
sizeof(pSignedHash->bytes);
217 result |= mcci_tweetnacl_verify_64(
223 result |= mcci_tweetnacl_verify_32(
225 pSigBlock->publicKey.bytes
229 return mcci_tweetnacl_result_is_success(result);