| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 1 | /* | 
|  | 2 | *  VIA PadLock support functions | 
|  | 3 | * | 
| Bence Szépkúti | 1e14827 | 2020-08-07 13:07:28 +0200 | [diff] [blame] | 4 | *  Copyright The Mbed TLS Contributors | 
| Dave Rodgman | 16799db | 2023-11-02 19:47:20 +0000 | [diff] [blame] | 5 | *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 6 | */ | 
|  | 7 | /* | 
|  | 8 | *  This implementation is based on the VIA PadLock Programming Guide: | 
|  | 9 | * | 
|  | 10 | *  http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/ | 
|  | 11 | *  programming_guide.pdf | 
|  | 12 | */ | 
|  | 13 |  | 
| Gilles Peskine | db09ef6 | 2020-06-03 01:43:33 +0200 | [diff] [blame] | 14 | #include "common.h" | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 15 |  | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 16 | #if defined(MBEDTLS_PADLOCK_C) | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 17 |  | 
| Chris Jones | 16dbaeb | 2021-03-09 17:47:55 +0000 | [diff] [blame] | 18 | #include "padlock.h" | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 19 |  | 
| Manuel Pégourié-Gonnard | 45ec8da | 2015-02-10 13:50:47 +0000 | [diff] [blame] | 20 | #include <string.h> | 
|  | 21 |  | 
| Jerry Yu | 782b966 | 2023-08-21 11:25:01 +0800 | [diff] [blame] | 22 | #if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE) | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 23 |  | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 24 | /* | 
|  | 25 | * PadLock detection routine | 
|  | 26 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 27 | int mbedtls_padlock_has_support(int feature) | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 28 | { | 
|  | 29 | static int flags = -1; | 
| Paul Bakker | 53e1513 | 2013-12-30 20:43:40 +0100 | [diff] [blame] | 30 | int ebx = 0, edx = 0; | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 31 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 32 | if (flags == -1) { | 
|  | 33 | asm ("movl  %%ebx, %0           \n\t" | 
| Manuel Pégourié-Gonnard | 87a8ffe | 2014-06-23 12:40:01 +0200 | [diff] [blame] | 34 | "movl  $0xC0000000, %%eax  \n\t" | 
|  | 35 | "cpuid                     \n\t" | 
|  | 36 | "cmpl  $0xC0000001, %%eax  \n\t" | 
|  | 37 | "movl  $0, %%edx           \n\t" | 
| okhowang(王沛文) | 0c4bbda | 2020-06-24 16:02:10 +0800 | [diff] [blame] | 38 | "jb    1f                  \n\t" | 
| Manuel Pégourié-Gonnard | 87a8ffe | 2014-06-23 12:40:01 +0200 | [diff] [blame] | 39 | "movl  $0xC0000001, %%eax  \n\t" | 
|  | 40 | "cpuid                     \n\t" | 
| okhowang(王沛文) | 0c4bbda | 2020-06-24 16:02:10 +0800 | [diff] [blame] | 41 | "1:                        \n\t" | 
| Manuel Pégourié-Gonnard | 87a8ffe | 2014-06-23 12:40:01 +0200 | [diff] [blame] | 42 | "movl  %%edx, %1           \n\t" | 
|  | 43 | "movl  %2, %%ebx           \n\t" | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 44 | : "=m" (ebx), "=m" (edx) | 
|  | 45 | :  "m" (ebx) | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 46 | : "eax", "ecx", "edx"); | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 47 |  | 
|  | 48 | flags = edx; | 
|  | 49 | } | 
|  | 50 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 51 | return flags & feature; | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 52 | } | 
|  | 53 |  | 
|  | 54 | /* | 
|  | 55 | * PadLock AES-ECB block en(de)cryption | 
|  | 56 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 57 | int mbedtls_padlock_xcryptecb(mbedtls_aes_context *ctx, | 
|  | 58 | int mode, | 
|  | 59 | const unsigned char input[16], | 
|  | 60 | unsigned char output[16]) | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 61 | { | 
| Paul Bakker | 53e1513 | 2013-12-30 20:43:40 +0100 | [diff] [blame] | 62 | int ebx = 0; | 
| Paul Bakker | 5c2364c | 2012-10-01 14:41:15 +0000 | [diff] [blame] | 63 | uint32_t *rk; | 
|  | 64 | uint32_t *blk; | 
|  | 65 | uint32_t *ctrl; | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 66 | unsigned char buf[256]; | 
|  | 67 |  | 
| Werner Lewis | c1999d5 | 2022-07-05 11:55:15 +0100 | [diff] [blame] | 68 | rk = ctx->buf + ctx->rk_offset; | 
|  | 69 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 70 | if (((long) rk & 15) != 0) { | 
|  | 71 | return MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED; | 
|  | 72 | } | 
| Werner Lewis | c1999d5 | 2022-07-05 11:55:15 +0100 | [diff] [blame] | 73 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 74 | blk = MBEDTLS_PADLOCK_ALIGN16(buf); | 
|  | 75 | memcpy(blk, input, 16); | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 76 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 77 | ctrl = blk + 4; | 
|  | 78 | *ctrl = 0x80 | ctx->nr | ((ctx->nr + (mode^1) - 10) << 9); | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 79 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 80 | asm ("pushfl                        \n\t" | 
| Manuel Pégourié-Gonnard | 87a8ffe | 2014-06-23 12:40:01 +0200 | [diff] [blame] | 81 | "popfl                         \n\t" | 
|  | 82 | "movl    %%ebx, %0             \n\t" | 
|  | 83 | "movl    $1, %%ecx             \n\t" | 
|  | 84 | "movl    %2, %%edx             \n\t" | 
|  | 85 | "movl    %3, %%ebx             \n\t" | 
|  | 86 | "movl    %4, %%esi             \n\t" | 
|  | 87 | "movl    %4, %%edi             \n\t" | 
|  | 88 | ".byte  0xf3,0x0f,0xa7,0xc8    \n\t" | 
|  | 89 | "movl    %1, %%ebx             \n\t" | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 90 | : "=m" (ebx) | 
|  | 91 | :  "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk) | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 92 | : "memory", "ecx", "edx", "esi", "edi"); | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 93 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 94 | memcpy(output, blk, 16); | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 95 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 96 | return 0; | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 97 | } | 
|  | 98 |  | 
| Yanray Wang | 0287b9d | 2023-11-10 18:21:21 +0800 | [diff] [blame] | 99 | #if defined(MBEDTLS_CIPHER_MODE_CBC) | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 100 | /* | 
|  | 101 | * PadLock AES-CBC buffer en(de)cryption | 
|  | 102 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 103 | int mbedtls_padlock_xcryptcbc(mbedtls_aes_context *ctx, | 
|  | 104 | int mode, | 
|  | 105 | size_t length, | 
|  | 106 | unsigned char iv[16], | 
|  | 107 | const unsigned char *input, | 
|  | 108 | unsigned char *output) | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 109 | { | 
| Paul Bakker | 53e1513 | 2013-12-30 20:43:40 +0100 | [diff] [blame] | 110 | int ebx = 0; | 
| Paul Bakker | 23986e5 | 2011-04-24 08:57:21 +0000 | [diff] [blame] | 111 | size_t count; | 
| Paul Bakker | 5c2364c | 2012-10-01 14:41:15 +0000 | [diff] [blame] | 112 | uint32_t *rk; | 
|  | 113 | uint32_t *iw; | 
|  | 114 | uint32_t *ctrl; | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 115 | unsigned char buf[256]; | 
|  | 116 |  | 
| Werner Lewis | c1999d5 | 2022-07-05 11:55:15 +0100 | [diff] [blame] | 117 | rk = ctx->buf + ctx->rk_offset; | 
|  | 118 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 119 | if (((long) input  & 15) != 0 || | 
|  | 120 | ((long) output & 15) != 0 || | 
|  | 121 | ((long) rk & 15) != 0) { | 
|  | 122 | return MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED; | 
|  | 123 | } | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 124 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 125 | iw = MBEDTLS_PADLOCK_ALIGN16(buf); | 
|  | 126 | memcpy(iw, iv, 16); | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 127 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 128 | ctrl = iw + 4; | 
|  | 129 | *ctrl = 0x80 | ctx->nr | ((ctx->nr + (mode ^ 1) - 10) << 9); | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 130 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 131 | count = (length + 15) >> 4; | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 132 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 133 | asm ("pushfl                        \n\t" | 
| Manuel Pégourié-Gonnard | 87a8ffe | 2014-06-23 12:40:01 +0200 | [diff] [blame] | 134 | "popfl                         \n\t" | 
|  | 135 | "movl    %%ebx, %0             \n\t" | 
|  | 136 | "movl    %2, %%ecx             \n\t" | 
|  | 137 | "movl    %3, %%edx             \n\t" | 
|  | 138 | "movl    %4, %%ebx             \n\t" | 
|  | 139 | "movl    %5, %%esi             \n\t" | 
|  | 140 | "movl    %6, %%edi             \n\t" | 
|  | 141 | "movl    %7, %%eax             \n\t" | 
|  | 142 | ".byte  0xf3,0x0f,0xa7,0xd0    \n\t" | 
|  | 143 | "movl    %1, %%ebx             \n\t" | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 144 | : "=m" (ebx) | 
|  | 145 | :  "m" (ebx), "m" (count), "m" (ctrl), | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 146 | "m"  (rk), "m" (input), "m" (output), "m" (iw) | 
|  | 147 | : "memory", "eax", "ecx", "edx", "esi", "edi"); | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 148 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 149 | memcpy(iv, iw, 16); | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 150 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 151 | return 0; | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 152 | } | 
| Yanray Wang | 0287b9d | 2023-11-10 18:21:21 +0800 | [diff] [blame] | 153 | #endif /* MBEDTLS_CIPHER_MODE_CBC */ | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 154 |  | 
| Jerry Yu | 782b966 | 2023-08-21 11:25:01 +0800 | [diff] [blame] | 155 | #endif /* MBEDTLS_VIA_PADLOCK_HAVE_CODE */ | 
| Paul Bakker | 5121ce5 | 2009-01-03 21:22:43 +0000 | [diff] [blame] | 156 |  | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 157 | #endif /* MBEDTLS_PADLOCK_C */ |