PolarSSL v1.2.9
padlock.c
Go to the documentation of this file.
1 /*
2  * VIA PadLock support functions
3  *
4  * Copyright (C) 2006-2010, Brainspark B.V.
5  *
6  * This file is part of PolarSSL (http://www.polarssl.org)
7  * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
8  *
9  * All rights reserved.
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License along
22  * with this program; if not, write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24  */
25 /*
26  * This implementation is based on the VIA PadLock Programming Guide:
27  *
28  * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/
29  * programming_guide.pdf
30  */
31 
32 #include "polarssl/config.h"
33 
34 #if defined(POLARSSL_PADLOCK_C)
35 
36 #include "polarssl/padlock.h"
37 
38 #if defined(POLARSSL_HAVE_X86)
39 
40 /*
41  * PadLock detection routine
42  */
43 int padlock_supports( int feature )
44 {
45  static int flags = -1;
46  int ebx, edx;
47 
48  if( flags == -1 )
49  {
50  asm( "movl %%ebx, %0 \n" \
51  "movl $0xC0000000, %%eax \n" \
52  "cpuid \n" \
53  "cmpl $0xC0000001, %%eax \n" \
54  "movl $0, %%edx \n" \
55  "jb unsupported \n" \
56  "movl $0xC0000001, %%eax \n" \
57  "cpuid \n" \
58  "unsupported: \n" \
59  "movl %%edx, %1 \n" \
60  "movl %2, %%ebx \n"
61  : "=m" (ebx), "=m" (edx)
62  : "m" (ebx)
63  : "eax", "ecx", "edx" );
64 
65  flags = edx;
66  }
67 
68  return( flags & feature );
69 }
70 
71 /*
72  * PadLock AES-ECB block en(de)cryption
73  */
74 int padlock_xcryptecb( aes_context *ctx,
75  int mode,
76  const unsigned char input[16],
77  unsigned char output[16] )
78 {
79  int ebx;
80  uint32_t *rk;
81  uint32_t *blk;
82  uint32_t *ctrl;
83  unsigned char buf[256];
84 
85  rk = ctx->rk;
86  blk = PADLOCK_ALIGN16( buf );
87  memcpy( blk, input, 16 );
88 
89  ctrl = blk + 4;
90  *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode^1 ) - 10 ) << 9 );
91 
92  asm( "pushfl; popfl \n" \
93  "movl %%ebx, %0 \n" \
94  "movl $1, %%ecx \n" \
95  "movl %2, %%edx \n" \
96  "movl %3, %%ebx \n" \
97  "movl %4, %%esi \n" \
98  "movl %4, %%edi \n" \
99  ".byte 0xf3,0x0f,0xa7,0xc8\n" \
100  "movl %1, %%ebx \n"
101  : "=m" (ebx)
102  : "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk)
103  : "ecx", "edx", "esi", "edi" );
104 
105  memcpy( output, blk, 16 );
106 
107  return( 0 );
108 }
109 
110 /*
111  * PadLock AES-CBC buffer en(de)cryption
112  */
113 int padlock_xcryptcbc( aes_context *ctx,
114  int mode,
115  size_t length,
116  unsigned char iv[16],
117  const unsigned char *input,
118  unsigned char *output )
119 {
120  int ebx;
121  size_t count;
122  uint32_t *rk;
123  uint32_t *iw;
124  uint32_t *ctrl;
125  unsigned char buf[256];
126 
127  if( ( (long) input & 15 ) != 0 ||
128  ( (long) output & 15 ) != 0 )
130 
131  rk = ctx->rk;
132  iw = PADLOCK_ALIGN16( buf );
133  memcpy( iw, iv, 16 );
134 
135  ctrl = iw + 4;
136  *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + (mode^1) - 10 ) << 9 );
137 
138  count = (length + 15) >> 4;
139 
140  asm( "pushfl; popfl \n" \
141  "movl %%ebx, %0 \n" \
142  "movl %2, %%ecx \n" \
143  "movl %3, %%edx \n" \
144  "movl %4, %%ebx \n" \
145  "movl %5, %%esi \n" \
146  "movl %6, %%edi \n" \
147  "movl %7, %%eax \n" \
148  ".byte 0xf3,0x0f,0xa7,0xd0\n" \
149  "movl %1, %%ebx \n"
150  : "=m" (ebx)
151  : "m" (ebx), "m" (count), "m" (ctrl),
152  "m" (rk), "m" (input), "m" (output), "m" (iw)
153  : "eax", "ecx", "edx", "esi", "edi" );
154 
155  memcpy( iv, iw, 16 );
156 
157  return( 0 );
158 }
159 
160 #endif
161 
162 #endif
AES context structure.
Definition: aes.h:54
Configuration options (set of defines)
#define POLARSSL_ERR_PADLOCK_DATA_MISALIGNED
Input data should be aligned.
Definition: padlock.h:32
uint32_t * rk
Definition: aes.h:57
VIA PadLock ACE for HW encryption/decryption supported by some processors.
int nr
Definition: aes.h:56