Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: nRF51_Vdd TextLCD BME280
TYBLE16_os5_BASE/features/cryptocell/FEATURE_CRYPTOCELL310/ccm_alt.c@6:6dd8c932bd56, 2019-12-19 (annotated)
- 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?
| User | Revision | Line number | New 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 |