takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Thu Oct 11 02:27:46 2018 +0000
Revision:
3:f3764f852aa8
Parent:
0:8fdf9a60065b
Nucreo 446 + SSD1331 test version;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /*
kadonotakashi 0:8fdf9a60065b 2 * VIA PadLock support functions
kadonotakashi 0:8fdf9a60065b 3 *
kadonotakashi 0:8fdf9a60065b 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
kadonotakashi 0:8fdf9a60065b 5 * SPDX-License-Identifier: Apache-2.0
kadonotakashi 0:8fdf9a60065b 6 *
kadonotakashi 0:8fdf9a60065b 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
kadonotakashi 0:8fdf9a60065b 8 * not use this file except in compliance with the License.
kadonotakashi 0:8fdf9a60065b 9 * You may obtain a copy of the License at
kadonotakashi 0:8fdf9a60065b 10 *
kadonotakashi 0:8fdf9a60065b 11 * http://www.apache.org/licenses/LICENSE-2.0
kadonotakashi 0:8fdf9a60065b 12 *
kadonotakashi 0:8fdf9a60065b 13 * Unless required by applicable law or agreed to in writing, software
kadonotakashi 0:8fdf9a60065b 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
kadonotakashi 0:8fdf9a60065b 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kadonotakashi 0:8fdf9a60065b 16 * See the License for the specific language governing permissions and
kadonotakashi 0:8fdf9a60065b 17 * limitations under the License.
kadonotakashi 0:8fdf9a60065b 18 *
kadonotakashi 0:8fdf9a60065b 19 * This file is part of mbed TLS (https://tls.mbed.org)
kadonotakashi 0:8fdf9a60065b 20 */
kadonotakashi 0:8fdf9a60065b 21 /*
kadonotakashi 0:8fdf9a60065b 22 * This implementation is based on the VIA PadLock Programming Guide:
kadonotakashi 0:8fdf9a60065b 23 *
kadonotakashi 0:8fdf9a60065b 24 * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/
kadonotakashi 0:8fdf9a60065b 25 * programming_guide.pdf
kadonotakashi 0:8fdf9a60065b 26 */
kadonotakashi 0:8fdf9a60065b 27
kadonotakashi 0:8fdf9a60065b 28 #if !defined(MBEDTLS_CONFIG_FILE)
kadonotakashi 0:8fdf9a60065b 29 #include "mbedtls/config.h"
kadonotakashi 0:8fdf9a60065b 30 #else
kadonotakashi 0:8fdf9a60065b 31 #include MBEDTLS_CONFIG_FILE
kadonotakashi 0:8fdf9a60065b 32 #endif
kadonotakashi 0:8fdf9a60065b 33
kadonotakashi 0:8fdf9a60065b 34 #if defined(MBEDTLS_PADLOCK_C)
kadonotakashi 0:8fdf9a60065b 35
kadonotakashi 0:8fdf9a60065b 36 #include "mbedtls/padlock.h"
kadonotakashi 0:8fdf9a60065b 37
kadonotakashi 0:8fdf9a60065b 38 #include <string.h>
kadonotakashi 0:8fdf9a60065b 39
kadonotakashi 0:8fdf9a60065b 40 #ifndef asm
kadonotakashi 0:8fdf9a60065b 41 #define asm __asm
kadonotakashi 0:8fdf9a60065b 42 #endif
kadonotakashi 0:8fdf9a60065b 43
kadonotakashi 0:8fdf9a60065b 44 #if defined(MBEDTLS_HAVE_X86)
kadonotakashi 0:8fdf9a60065b 45
kadonotakashi 0:8fdf9a60065b 46 /*
kadonotakashi 0:8fdf9a60065b 47 * PadLock detection routine
kadonotakashi 0:8fdf9a60065b 48 */
kadonotakashi 0:8fdf9a60065b 49 int mbedtls_padlock_has_support( int feature )
kadonotakashi 0:8fdf9a60065b 50 {
kadonotakashi 0:8fdf9a60065b 51 static int flags = -1;
kadonotakashi 0:8fdf9a60065b 52 int ebx = 0, edx = 0;
kadonotakashi 0:8fdf9a60065b 53
kadonotakashi 0:8fdf9a60065b 54 if( flags == -1 )
kadonotakashi 0:8fdf9a60065b 55 {
kadonotakashi 0:8fdf9a60065b 56 asm( "movl %%ebx, %0 \n\t"
kadonotakashi 0:8fdf9a60065b 57 "movl $0xC0000000, %%eax \n\t"
kadonotakashi 0:8fdf9a60065b 58 "cpuid \n\t"
kadonotakashi 0:8fdf9a60065b 59 "cmpl $0xC0000001, %%eax \n\t"
kadonotakashi 0:8fdf9a60065b 60 "movl $0, %%edx \n\t"
kadonotakashi 0:8fdf9a60065b 61 "jb unsupported \n\t"
kadonotakashi 0:8fdf9a60065b 62 "movl $0xC0000001, %%eax \n\t"
kadonotakashi 0:8fdf9a60065b 63 "cpuid \n\t"
kadonotakashi 0:8fdf9a60065b 64 "unsupported: \n\t"
kadonotakashi 0:8fdf9a60065b 65 "movl %%edx, %1 \n\t"
kadonotakashi 0:8fdf9a60065b 66 "movl %2, %%ebx \n\t"
kadonotakashi 0:8fdf9a60065b 67 : "=m" (ebx), "=m" (edx)
kadonotakashi 0:8fdf9a60065b 68 : "m" (ebx)
kadonotakashi 0:8fdf9a60065b 69 : "eax", "ecx", "edx" );
kadonotakashi 0:8fdf9a60065b 70
kadonotakashi 0:8fdf9a60065b 71 flags = edx;
kadonotakashi 0:8fdf9a60065b 72 }
kadonotakashi 0:8fdf9a60065b 73
kadonotakashi 0:8fdf9a60065b 74 return( flags & feature );
kadonotakashi 0:8fdf9a60065b 75 }
kadonotakashi 0:8fdf9a60065b 76
kadonotakashi 0:8fdf9a60065b 77 /*
kadonotakashi 0:8fdf9a60065b 78 * PadLock AES-ECB block en(de)cryption
kadonotakashi 0:8fdf9a60065b 79 */
kadonotakashi 0:8fdf9a60065b 80 int mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx,
kadonotakashi 0:8fdf9a60065b 81 int mode,
kadonotakashi 0:8fdf9a60065b 82 const unsigned char input[16],
kadonotakashi 0:8fdf9a60065b 83 unsigned char output[16] )
kadonotakashi 0:8fdf9a60065b 84 {
kadonotakashi 0:8fdf9a60065b 85 int ebx = 0;
kadonotakashi 0:8fdf9a60065b 86 uint32_t *rk;
kadonotakashi 0:8fdf9a60065b 87 uint32_t *blk;
kadonotakashi 0:8fdf9a60065b 88 uint32_t *ctrl;
kadonotakashi 0:8fdf9a60065b 89 unsigned char buf[256];
kadonotakashi 0:8fdf9a60065b 90
kadonotakashi 0:8fdf9a60065b 91 rk = ctx->rk;
kadonotakashi 0:8fdf9a60065b 92 blk = MBEDTLS_PADLOCK_ALIGN16( buf );
kadonotakashi 0:8fdf9a60065b 93 memcpy( blk, input, 16 );
kadonotakashi 0:8fdf9a60065b 94
kadonotakashi 0:8fdf9a60065b 95 ctrl = blk + 4;
kadonotakashi 0:8fdf9a60065b 96 *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode^1 ) - 10 ) << 9 );
kadonotakashi 0:8fdf9a60065b 97
kadonotakashi 0:8fdf9a60065b 98 asm( "pushfl \n\t"
kadonotakashi 0:8fdf9a60065b 99 "popfl \n\t"
kadonotakashi 0:8fdf9a60065b 100 "movl %%ebx, %0 \n\t"
kadonotakashi 0:8fdf9a60065b 101 "movl $1, %%ecx \n\t"
kadonotakashi 0:8fdf9a60065b 102 "movl %2, %%edx \n\t"
kadonotakashi 0:8fdf9a60065b 103 "movl %3, %%ebx \n\t"
kadonotakashi 0:8fdf9a60065b 104 "movl %4, %%esi \n\t"
kadonotakashi 0:8fdf9a60065b 105 "movl %4, %%edi \n\t"
kadonotakashi 0:8fdf9a60065b 106 ".byte 0xf3,0x0f,0xa7,0xc8 \n\t"
kadonotakashi 0:8fdf9a60065b 107 "movl %1, %%ebx \n\t"
kadonotakashi 0:8fdf9a60065b 108 : "=m" (ebx)
kadonotakashi 0:8fdf9a60065b 109 : "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk)
kadonotakashi 0:8fdf9a60065b 110 : "memory", "ecx", "edx", "esi", "edi" );
kadonotakashi 0:8fdf9a60065b 111
kadonotakashi 0:8fdf9a60065b 112 memcpy( output, blk, 16 );
kadonotakashi 0:8fdf9a60065b 113
kadonotakashi 0:8fdf9a60065b 114 return( 0 );
kadonotakashi 0:8fdf9a60065b 115 }
kadonotakashi 0:8fdf9a60065b 116
kadonotakashi 0:8fdf9a60065b 117 /*
kadonotakashi 0:8fdf9a60065b 118 * PadLock AES-CBC buffer en(de)cryption
kadonotakashi 0:8fdf9a60065b 119 */
kadonotakashi 0:8fdf9a60065b 120 int mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx,
kadonotakashi 0:8fdf9a60065b 121 int mode,
kadonotakashi 0:8fdf9a60065b 122 size_t length,
kadonotakashi 0:8fdf9a60065b 123 unsigned char iv[16],
kadonotakashi 0:8fdf9a60065b 124 const unsigned char *input,
kadonotakashi 0:8fdf9a60065b 125 unsigned char *output )
kadonotakashi 0:8fdf9a60065b 126 {
kadonotakashi 0:8fdf9a60065b 127 int ebx = 0;
kadonotakashi 0:8fdf9a60065b 128 size_t count;
kadonotakashi 0:8fdf9a60065b 129 uint32_t *rk;
kadonotakashi 0:8fdf9a60065b 130 uint32_t *iw;
kadonotakashi 0:8fdf9a60065b 131 uint32_t *ctrl;
kadonotakashi 0:8fdf9a60065b 132 unsigned char buf[256];
kadonotakashi 0:8fdf9a60065b 133
kadonotakashi 0:8fdf9a60065b 134 if( ( (long) input & 15 ) != 0 ||
kadonotakashi 0:8fdf9a60065b 135 ( (long) output & 15 ) != 0 )
kadonotakashi 0:8fdf9a60065b 136 return( MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED );
kadonotakashi 0:8fdf9a60065b 137
kadonotakashi 0:8fdf9a60065b 138 rk = ctx->rk;
kadonotakashi 0:8fdf9a60065b 139 iw = MBEDTLS_PADLOCK_ALIGN16( buf );
kadonotakashi 0:8fdf9a60065b 140 memcpy( iw, iv, 16 );
kadonotakashi 0:8fdf9a60065b 141
kadonotakashi 0:8fdf9a60065b 142 ctrl = iw + 4;
kadonotakashi 0:8fdf9a60065b 143 *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode ^ 1 ) - 10 ) << 9 );
kadonotakashi 0:8fdf9a60065b 144
kadonotakashi 0:8fdf9a60065b 145 count = ( length + 15 ) >> 4;
kadonotakashi 0:8fdf9a60065b 146
kadonotakashi 0:8fdf9a60065b 147 asm( "pushfl \n\t"
kadonotakashi 0:8fdf9a60065b 148 "popfl \n\t"
kadonotakashi 0:8fdf9a60065b 149 "movl %%ebx, %0 \n\t"
kadonotakashi 0:8fdf9a60065b 150 "movl %2, %%ecx \n\t"
kadonotakashi 0:8fdf9a60065b 151 "movl %3, %%edx \n\t"
kadonotakashi 0:8fdf9a60065b 152 "movl %4, %%ebx \n\t"
kadonotakashi 0:8fdf9a60065b 153 "movl %5, %%esi \n\t"
kadonotakashi 0:8fdf9a60065b 154 "movl %6, %%edi \n\t"
kadonotakashi 0:8fdf9a60065b 155 "movl %7, %%eax \n\t"
kadonotakashi 0:8fdf9a60065b 156 ".byte 0xf3,0x0f,0xa7,0xd0 \n\t"
kadonotakashi 0:8fdf9a60065b 157 "movl %1, %%ebx \n\t"
kadonotakashi 0:8fdf9a60065b 158 : "=m" (ebx)
kadonotakashi 0:8fdf9a60065b 159 : "m" (ebx), "m" (count), "m" (ctrl),
kadonotakashi 0:8fdf9a60065b 160 "m" (rk), "m" (input), "m" (output), "m" (iw)
kadonotakashi 0:8fdf9a60065b 161 : "memory", "eax", "ecx", "edx", "esi", "edi" );
kadonotakashi 0:8fdf9a60065b 162
kadonotakashi 0:8fdf9a60065b 163 memcpy( iv, iw, 16 );
kadonotakashi 0:8fdf9a60065b 164
kadonotakashi 0:8fdf9a60065b 165 return( 0 );
kadonotakashi 0:8fdf9a60065b 166 }
kadonotakashi 0:8fdf9a60065b 167
kadonotakashi 0:8fdf9a60065b 168 #endif /* MBEDTLS_HAVE_X86 */
kadonotakashi 0:8fdf9a60065b 169
kadonotakashi 0:8fdf9a60065b 170 #endif /* MBEDTLS_PADLOCK_C */