ReactOS 0.4.15-dev-8344-g0574987
padlock.c
Go to the documentation of this file.
1/*
2 * VIA PadLock support functions
3 *
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 *
7 * This file is provided under the Apache License 2.0, or the
8 * GNU General Public License v2.0 or later.
9 *
10 * **********
11 * Apache License 2.0:
12 *
13 * Licensed under the Apache License, Version 2.0 (the "License"); you may
14 * not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
24 *
25 * **********
26 *
27 * **********
28 * GNU General Public License v2.0 or later:
29 *
30 * This program is free software; you can redistribute it and/or modify
31 * it under the terms of the GNU General Public License as published by
32 * the Free Software Foundation; either version 2 of the License, or
33 * (at your option) any later version.
34 *
35 * This program is distributed in the hope that it will be useful,
36 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38 * GNU General Public License for more details.
39 *
40 * You should have received a copy of the GNU General Public License along
41 * with this program; if not, write to the Free Software Foundation, Inc.,
42 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
43 *
44 * **********
45 */
46/*
47 * This implementation is based on the VIA PadLock Programming Guide:
48 *
49 * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/
50 * programming_guide.pdf
51 */
52
53#if !defined(MBEDTLS_CONFIG_FILE)
54#include "mbedtls/config.h"
55#else
56#include MBEDTLS_CONFIG_FILE
57#endif
58
59#if defined(MBEDTLS_PADLOCK_C)
60
61#include "mbedtls/padlock.h"
62
63#include <string.h>
64
65#ifndef asm
66#define asm __asm
67#endif
68
69#if defined(MBEDTLS_HAVE_X86)
70
71/*
72 * PadLock detection routine
73 */
74int mbedtls_padlock_has_support( int feature )
75{
76 static int flags = -1;
77 int ebx = 0, edx = 0;
78
79 if( flags == -1 )
80 {
81 asm( "movl %%ebx, %0 \n\t"
82 "movl $0xC0000000, %%eax \n\t"
83 "cpuid \n\t"
84 "cmpl $0xC0000001, %%eax \n\t"
85 "movl $0, %%edx \n\t"
86 "jb unsupported \n\t"
87 "movl $0xC0000001, %%eax \n\t"
88 "cpuid \n\t"
89 "unsupported: \n\t"
90 "movl %%edx, %1 \n\t"
91 "movl %2, %%ebx \n\t"
92 : "=m" (ebx), "=m" (edx)
93 : "m" (ebx)
94 : "eax", "ecx", "edx" );
95
96 flags = edx;
97 }
98
99 return( flags & feature );
100}
101
102/*
103 * PadLock AES-ECB block en(de)cryption
104 */
105int mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx,
106 int mode,
107 const unsigned char input[16],
108 unsigned char output[16] )
109{
110 int ebx = 0;
111 uint32_t *rk;
112 uint32_t *blk;
113 uint32_t *ctrl;
114 unsigned char buf[256];
115
116 rk = ctx->rk;
117 blk = MBEDTLS_PADLOCK_ALIGN16( buf );
118 memcpy( blk, input, 16 );
119
120 ctrl = blk + 4;
121 *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode^1 ) - 10 ) << 9 );
122
123 asm( "pushfl \n\t"
124 "popfl \n\t"
125 "movl %%ebx, %0 \n\t"
126 "movl $1, %%ecx \n\t"
127 "movl %2, %%edx \n\t"
128 "movl %3, %%ebx \n\t"
129 "movl %4, %%esi \n\t"
130 "movl %4, %%edi \n\t"
131 ".byte 0xf3,0x0f,0xa7,0xc8 \n\t"
132 "movl %1, %%ebx \n\t"
133 : "=m" (ebx)
134 : "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk)
135 : "memory", "ecx", "edx", "esi", "edi" );
136
137 memcpy( output, blk, 16 );
138
139 return( 0 );
140}
141
142/*
143 * PadLock AES-CBC buffer en(de)cryption
144 */
145int mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx,
146 int mode,
147 size_t length,
148 unsigned char iv[16],
149 const unsigned char *input,
150 unsigned char *output )
151{
152 int ebx = 0;
153 size_t count;
154 uint32_t *rk;
155 uint32_t *iw;
156 uint32_t *ctrl;
157 unsigned char buf[256];
158
159 if( ( (long) input & 15 ) != 0 ||
160 ( (long) output & 15 ) != 0 )
162
163 rk = ctx->rk;
164 iw = MBEDTLS_PADLOCK_ALIGN16( buf );
165 memcpy( iw, iv, 16 );
166
167 ctrl = iw + 4;
168 *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode ^ 1 ) - 10 ) << 9 );
169
170 count = ( length + 15 ) >> 4;
171
172 asm( "pushfl \n\t"
173 "popfl \n\t"
174 "movl %%ebx, %0 \n\t"
175 "movl %2, %%ecx \n\t"
176 "movl %3, %%edx \n\t"
177 "movl %4, %%ebx \n\t"
178 "movl %5, %%esi \n\t"
179 "movl %6, %%edi \n\t"
180 "movl %7, %%eax \n\t"
181 ".byte 0xf3,0x0f,0xa7,0xd0 \n\t"
182 "movl %1, %%ebx \n\t"
183 : "=m" (ebx)
184 : "m" (ebx), "m" (count), "m" (ctrl),
185 "m" (rk), "m" (input), "m" (output), "m" (iw)
186 : "memory", "eax", "ecx", "edx", "esi", "edi" );
187
188 memcpy( iv, iw, 16 );
189
190 return( 0 );
191}
192
193#endif /* MBEDTLS_HAVE_X86 */
194
195#endif /* MBEDTLS_PADLOCK_C */
UINT32 uint32_t
Definition: types.h:75
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum mode
Definition: glext.h:6217
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLenum GLenum GLenum input
Definition: glext.h:9031
#define blk
Definition: linetest.c:70
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
INTERNETFEATURELIST feature
Definition: misc.c:1719
#define ctrl
Definition: input.c:1756
VIA PadLock ACE for HW encryption/decryption supported by some processors.
#define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED
Definition: padlock.h:64
Configuration options (set of defines)
The AES context-type definition.
Definition: aes.h:113
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl ebx
Definition: synth_sse3d.h:83
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx
Definition: synth_sse3d.h:87