Kenji Arai / TYBLE16_mbedlized_os5_several_examples_1st

Dependencies:   nRF51_Vdd TextLCD BME280

Committer:
kenjiArai
Date:
Thu Dec 19 07:27:50 2019 +0000
Revision:
6:6dd8c932bd56
Parent:
4:e9dfb4ca4277
updated each main.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 4:e9dfb4ca4277 1 /*
kenjiArai 4:e9dfb4ca4277 2 * ccm_alt.c
kenjiArai 4:e9dfb4ca4277 3 *
kenjiArai 4:e9dfb4ca4277 4 * Copyright (C) 2018, Arm Limited, All Rights Reserved
kenjiArai 4:e9dfb4ca4277 5 * SPDX-License-Identifier: Apache-2.0
kenjiArai 4:e9dfb4ca4277 6 *
kenjiArai 4:e9dfb4ca4277 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
kenjiArai 4:e9dfb4ca4277 8 * not use this file except in compliance with the License.
kenjiArai 4:e9dfb4ca4277 9 * You may obtain a copy of the License at
kenjiArai 4:e9dfb4ca4277 10 *
kenjiArai 4:e9dfb4ca4277 11 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 4:e9dfb4ca4277 12 *
kenjiArai 4:e9dfb4ca4277 13 * Unless required by applicable law or agreed to in writing, software
kenjiArai 4:e9dfb4ca4277 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
kenjiArai 4:e9dfb4ca4277 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 4:e9dfb4ca4277 16 * See the License for the specific language governing permissions and
kenjiArai 4:e9dfb4ca4277 17 * limitations under the License.
kenjiArai 4:e9dfb4ca4277 18 *
kenjiArai 4:e9dfb4ca4277 19 */
kenjiArai 4:e9dfb4ca4277 20
kenjiArai 4:e9dfb4ca4277 21 #include "mbedtls/ccm.h"
kenjiArai 4:e9dfb4ca4277 22 #if defined(MBEDTLS_CCM_ALT)
kenjiArai 4:e9dfb4ca4277 23 #include <string.h>
kenjiArai 4:e9dfb4ca4277 24 #include "mbedtls/platform.h"
kenjiArai 4:e9dfb4ca4277 25 #include "mbedtls/aes.h"
kenjiArai 4:e9dfb4ca4277 26
kenjiArai 4:e9dfb4ca4277 27 /* Implementation that should never be optimized out by the compiler */
kenjiArai 4:e9dfb4ca4277 28 static void mbedtls_zeroize( void *v, size_t n ) {
kenjiArai 4:e9dfb4ca4277 29 volatile unsigned char *p = (unsigned char*)v;
kenjiArai 4:e9dfb4ca4277 30 while( n-- ) *p++ = 0;
kenjiArai 4:e9dfb4ca4277 31 }
kenjiArai 4:e9dfb4ca4277 32
kenjiArai 4:e9dfb4ca4277 33 void mbedtls_ccm_init( mbedtls_ccm_context *ctx )
kenjiArai 4:e9dfb4ca4277 34 {
kenjiArai 4:e9dfb4ca4277 35 memset( ctx, 0, sizeof( mbedtls_ccm_context ) );
kenjiArai 4:e9dfb4ca4277 36 }
kenjiArai 4:e9dfb4ca4277 37
kenjiArai 4:e9dfb4ca4277 38 void mbedtls_ccm_free( mbedtls_ccm_context *ctx )
kenjiArai 4:e9dfb4ca4277 39 {
kenjiArai 4:e9dfb4ca4277 40 mbedtls_zeroize( ctx, sizeof( mbedtls_ccm_context ) );
kenjiArai 4:e9dfb4ca4277 41 }
kenjiArai 4:e9dfb4ca4277 42
kenjiArai 4:e9dfb4ca4277 43 int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx,
kenjiArai 4:e9dfb4ca4277 44 mbedtls_cipher_id_t cipher,
kenjiArai 4:e9dfb4ca4277 45 const unsigned char *key,
kenjiArai 4:e9dfb4ca4277 46 unsigned int keybits )
kenjiArai 4:e9dfb4ca4277 47 {
kenjiArai 4:e9dfb4ca4277 48 if( ctx == NULL )
kenjiArai 4:e9dfb4ca4277 49 return ( MBEDTLS_ERR_CCM_BAD_INPUT );
kenjiArai 4:e9dfb4ca4277 50
kenjiArai 4:e9dfb4ca4277 51 if( cipher != MBEDTLS_CIPHER_ID_AES ||
kenjiArai 4:e9dfb4ca4277 52 keybits != 128 )
kenjiArai 4:e9dfb4ca4277 53 {
kenjiArai 4:e9dfb4ca4277 54 return ( MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE );
kenjiArai 4:e9dfb4ca4277 55 }
kenjiArai 4:e9dfb4ca4277 56
kenjiArai 4:e9dfb4ca4277 57 memcpy( ctx->cipher_key , key, keybits / 8 );
kenjiArai 4:e9dfb4ca4277 58 ctx->keySize_ID = CRYS_AES_Key128BitSize;
kenjiArai 4:e9dfb4ca4277 59
kenjiArai 4:e9dfb4ca4277 60 return ( 0 );
kenjiArai 4:e9dfb4ca4277 61
kenjiArai 4:e9dfb4ca4277 62 }
kenjiArai 4:e9dfb4ca4277 63
kenjiArai 4:e9dfb4ca4277 64 /*
kenjiArai 4:e9dfb4ca4277 65 * Authenticated encryption or decryption
kenjiArai 4:e9dfb4ca4277 66 */
kenjiArai 4:e9dfb4ca4277 67
kenjiArai 4:e9dfb4ca4277 68 int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,
kenjiArai 4:e9dfb4ca4277 69 const unsigned char *iv, size_t iv_len,
kenjiArai 4:e9dfb4ca4277 70 const unsigned char *add, size_t add_len,
kenjiArai 4:e9dfb4ca4277 71 const unsigned char *input, unsigned char *output,
kenjiArai 4:e9dfb4ca4277 72 unsigned char *tag, size_t tag_len )
kenjiArai 4:e9dfb4ca4277 73
kenjiArai 4:e9dfb4ca4277 74 {
kenjiArai 4:e9dfb4ca4277 75 CRYSError_t CrysRet = CRYS_OK;
kenjiArai 4:e9dfb4ca4277 76 /*
kenjiArai 4:e9dfb4ca4277 77 * Check length requirements: SP800-38C A.1
kenjiArai 4:e9dfb4ca4277 78 * Additional requirement: a < 2^16 - 2^8 to simplify the code.
kenjiArai 4:e9dfb4ca4277 79 * 'length' checked later (when writing it to the first block)
kenjiArai 4:e9dfb4ca4277 80 */
kenjiArai 4:e9dfb4ca4277 81 if( tag_len < 4 || tag_len > 16 || tag_len % 2 != 0 )
kenjiArai 4:e9dfb4ca4277 82 return ( MBEDTLS_ERR_CCM_BAD_INPUT );
kenjiArai 4:e9dfb4ca4277 83
kenjiArai 4:e9dfb4ca4277 84 /* Also implies q is within bounds */
kenjiArai 4:e9dfb4ca4277 85 if( iv_len < 7 || iv_len > 13 )
kenjiArai 4:e9dfb4ca4277 86 return ( MBEDTLS_ERR_CCM_BAD_INPUT );
kenjiArai 4:e9dfb4ca4277 87
kenjiArai 4:e9dfb4ca4277 88 #if SIZE_MAX > UINT_MAX
kenjiArai 4:e9dfb4ca4277 89 if( length > 0xFFFFFFFF || add_len > 0xFFFFFFFF )
kenjiArai 4:e9dfb4ca4277 90 return ( MBEDTLS_ERR_CCM_BAD_INPUT );
kenjiArai 4:e9dfb4ca4277 91 #endif
kenjiArai 4:e9dfb4ca4277 92
kenjiArai 4:e9dfb4ca4277 93 CrysRet = CRYS_AESCCM( SASI_AES_ENCRYPT, ctx->cipher_key, ctx->keySize_ID,(uint8_t*)iv, iv_len,
kenjiArai 4:e9dfb4ca4277 94 (uint8_t*)add, add_len, (uint8_t*)input, length, output, tag_len, tag );
kenjiArai 4:e9dfb4ca4277 95 if( CrysRet != CRYS_OK )
kenjiArai 4:e9dfb4ca4277 96 return ( MBEDTLS_ERR_CCM_HW_ACCEL_FAILED );
kenjiArai 4:e9dfb4ca4277 97
kenjiArai 4:e9dfb4ca4277 98 return ( 0 );
kenjiArai 4:e9dfb4ca4277 99
kenjiArai 4:e9dfb4ca4277 100 }
kenjiArai 4:e9dfb4ca4277 101
kenjiArai 4:e9dfb4ca4277 102 /*
kenjiArai 4:e9dfb4ca4277 103 * Authenticated decryption
kenjiArai 4:e9dfb4ca4277 104 */
kenjiArai 4:e9dfb4ca4277 105 int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length,
kenjiArai 4:e9dfb4ca4277 106 const unsigned char *iv, size_t iv_len,
kenjiArai 4:e9dfb4ca4277 107 const unsigned char *add, size_t add_len,
kenjiArai 4:e9dfb4ca4277 108 const unsigned char *input, unsigned char *output,
kenjiArai 4:e9dfb4ca4277 109 const unsigned char *tag, size_t tag_len )
kenjiArai 4:e9dfb4ca4277 110
kenjiArai 4:e9dfb4ca4277 111 {
kenjiArai 4:e9dfb4ca4277 112 CRYSError_t CrysRet = CRYS_OK;
kenjiArai 4:e9dfb4ca4277 113 /*
kenjiArai 4:e9dfb4ca4277 114 * Check length requirements: SP800-38C A.1
kenjiArai 4:e9dfb4ca4277 115 * Additional requirement: a < 2^16 - 2^8 to simplify the code.
kenjiArai 4:e9dfb4ca4277 116 * 'length' checked later (when writing it to the first block)
kenjiArai 4:e9dfb4ca4277 117 */
kenjiArai 4:e9dfb4ca4277 118 if( tag_len < 4 || tag_len > 16 || tag_len % 2 != 0 )
kenjiArai 4:e9dfb4ca4277 119 return ( MBEDTLS_ERR_CCM_BAD_INPUT );
kenjiArai 4:e9dfb4ca4277 120
kenjiArai 4:e9dfb4ca4277 121 /* Also implies q is within bounds */
kenjiArai 4:e9dfb4ca4277 122 if( iv_len < 7 || iv_len > 13 )
kenjiArai 4:e9dfb4ca4277 123 return ( MBEDTLS_ERR_CCM_BAD_INPUT );
kenjiArai 4:e9dfb4ca4277 124
kenjiArai 4:e9dfb4ca4277 125 #if SIZE_MAX > UINT_MAX
kenjiArai 4:e9dfb4ca4277 126 if( length > 0xFFFFFFFF || add_len > 0xFFFFFFFF )
kenjiArai 4:e9dfb4ca4277 127 return ( MBEDTLS_ERR_CCM_BAD_INPUT );
kenjiArai 4:e9dfb4ca4277 128 #endif
kenjiArai 4:e9dfb4ca4277 129
kenjiArai 4:e9dfb4ca4277 130 CrysRet = CRYS_AESCCM( SASI_AES_DECRYPT, ctx->cipher_key, ctx->keySize_ID,(uint8_t*)iv, iv_len,
kenjiArai 4:e9dfb4ca4277 131 (uint8_t*)add, add_len, (uint8_t*)input, length, output, tag_len, (uint8_t*)tag );
kenjiArai 4:e9dfb4ca4277 132 if ( CrysRet != CRYS_OK )
kenjiArai 4:e9dfb4ca4277 133 return ( MBEDTLS_ERR_CCM_HW_ACCEL_FAILED );
kenjiArai 4:e9dfb4ca4277 134
kenjiArai 4:e9dfb4ca4277 135 return ( 0 );
kenjiArai 4:e9dfb4ca4277 136
kenjiArai 4:e9dfb4ca4277 137 }
kenjiArai 4:e9dfb4ca4277 138
kenjiArai 4:e9dfb4ca4277 139 #endif