blob: 8a310039c14eec2f82288fcbb6b084b50887da32 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Qualcomm Crypto Engine driver API
2 *
Duy Truonge833aca2013-02-12 13:35:08 -08003 * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 and
7 * only version 2 as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14
15
16#ifndef __CRYPTO_MSM_QCE_H
17#define __CRYPTO_MSM_QCE_H
18
19#include <linux/types.h>
20#include <linux/platform_device.h>
21#include <linux/crypto.h>
22
23#include <crypto/algapi.h>
24#include <crypto/aes.h>
25#include <crypto/des.h>
26#include <crypto/sha.h>
27#include <crypto/aead.h>
28#include <crypto/authenc.h>
29#include <crypto/scatterwalk.h>
30
31/* SHA digest size in bytes */
32#define SHA256_DIGESTSIZE 32
33#define SHA1_DIGESTSIZE 20
34
35/* key size in bytes */
36#define HMAC_KEY_SIZE (SHA1_DIGESTSIZE) /* hmac-sha1 */
37#define SHA_HMAC_KEY_SIZE 64
38#define DES_KEY_SIZE 8
39#define TRIPLE_DES_KEY_SIZE 24
40#define AES128_KEY_SIZE 16
41#define AES192_KEY_SIZE 24
42#define AES256_KEY_SIZE 32
43#define MAX_CIPHER_KEY_SIZE AES256_KEY_SIZE
44
45/* iv length in bytes */
46#define AES_IV_LENGTH 16
47#define DES_IV_LENGTH 8
48#define MAX_IV_LENGTH AES_IV_LENGTH
49
50/* Maximum number of bytes per transfer */
Mona Hossaind90ea0e2011-08-11 16:51:07 -070051#define QCE_MAX_OPER_DATA 0xFF00
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070052
53/* Maximum Nonce bytes */
54#define MAX_NONCE 16
55
56typedef void (*qce_comp_func_ptr_t)(void *areq,
57 unsigned char *icv, unsigned char *iv, int ret);
58
59/* Cipher algorithms supported */
60enum qce_cipher_alg_enum {
61 CIPHER_ALG_DES = 0,
62 CIPHER_ALG_3DES = 1,
63 CIPHER_ALG_AES = 2,
64 CIPHER_ALG_LAST
65};
66
67/* Hash and hmac algorithms supported */
68enum qce_hash_alg_enum {
69 QCE_HASH_SHA1 = 0,
70 QCE_HASH_SHA256 = 1,
71 QCE_HASH_SHA1_HMAC = 2,
72 QCE_HASH_SHA256_HMAC = 3,
73 QCE_HASH_AES_CMAC = 4,
Mona Hossainb43e94b2012-05-07 08:52:06 -070074 QCE_AEAD_SHA1_HMAC = 5,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070075 QCE_HASH_LAST
76};
77
78/* Cipher encryption/decryption operations */
79enum qce_cipher_dir_enum {
80 QCE_ENCRYPT = 0,
81 QCE_DECRYPT = 1,
82 QCE_CIPHER_DIR_LAST
83};
84
85/* Cipher algorithms modes */
86enum qce_cipher_mode_enum {
87 QCE_MODE_CBC = 0,
88 QCE_MODE_ECB = 1,
89 QCE_MODE_CTR = 2,
90 QCE_MODE_XTS = 3,
91 QCE_MODE_CCM = 4,
92 QCE_CIPHER_MODE_LAST
93};
94
95/* Cipher operation type */
96enum qce_req_op_enum {
97 QCE_REQ_ABLK_CIPHER = 0,
98 QCE_REQ_ABLK_CIPHER_NO_KEY = 1,
99 QCE_REQ_AEAD = 2,
100 QCE_REQ_LAST
101};
102
103/* Algorithms/features supported in CE HW engine */
104struct ce_hw_support {
105 bool sha1_hmac_20; /* Supports 20 bytes of HMAC key*/
106 bool sha1_hmac; /* supports max HMAC key of 64 bytes*/
107 bool sha256_hmac; /* supports max HMAC key of 64 bytes*/
108 bool sha_hmac; /* supports SHA1 and SHA256 MAX HMAC key of 64 bytes*/
109 bool cmac;
110 bool aes_key_192;
111 bool aes_xts;
112 bool aes_ccm;
113 bool ota;
Mona Hossainb43e94b2012-05-07 08:52:06 -0700114 bool aligned_only;
115 bool bam;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700116};
117
118/* Sha operation parameters */
119struct qce_sha_req {
120 qce_comp_func_ptr_t qce_cb; /* call back */
121 enum qce_hash_alg_enum alg; /* sha algorithm */
122 unsigned char *digest; /* sha digest */
123 struct scatterlist *src; /* pointer to scatter list entry */
124 uint32_t auth_data[4]; /* byte count */
125 unsigned char *authkey; /* auth key */
126 unsigned int authklen; /* auth key length */
127 bool first_blk; /* first block indicator */
128 bool last_blk; /* last block indicator */
129 unsigned int size; /* data length in bytes */
130 void *areq;
131};
132
133struct qce_req {
134 enum qce_req_op_enum op; /* operation type */
135 qce_comp_func_ptr_t qce_cb; /* call back */
136 void *areq;
137 enum qce_cipher_alg_enum alg; /* cipher algorithms*/
138 enum qce_cipher_dir_enum dir; /* encryption? decryption? */
139 enum qce_cipher_mode_enum mode; /* algorithm mode */
140 unsigned char *authkey; /* authentication key */
141 unsigned int authklen; /* authentication key kength */
142 unsigned int authsize; /* authentication key kength */
143 unsigned char nonce[MAX_NONCE];/* nonce for ccm mode */
144 unsigned char *assoc; /* Ptr to formatted associated data */
145 unsigned int assoclen; /* Formatted associated data length */
146 struct scatterlist *asg; /* Formatted associated data sg */
147 unsigned char *enckey; /* cipher key */
148 unsigned int encklen; /* cipher key length */
149 unsigned char *iv; /* initialization vector */
150 unsigned int ivsize; /* initialization vector size*/
151 unsigned int cryptlen; /* data length */
152 unsigned int use_pmem; /* is source of data PMEM allocated? */
153 struct qcedev_pmem_info *pmem; /* pointer to pmem_info structure*/
154};
155
156void *qce_open(struct platform_device *pdev, int *rc);
157int qce_close(void *handle);
158int qce_aead_req(void *handle, struct qce_req *req);
159int qce_ablk_cipher_req(void *handle, struct qce_req *req);
160int qce_hw_support(void *handle, struct ce_hw_support *support);
161int qce_process_sha_req(void *handle, struct qce_sha_req *s_req);
162
163#endif /* __CRYPTO_MSM_QCE_H */