1a9bd28bf4d1ed521dbe388bc8a83e227fbc8056
[openwrt.git] / target / linux / generic-2.6 / files / crypto / ocf / ep80579 / icp_asym.c
1 /***************************************************************************
2  *
3  * This file is provided under a dual BSD/GPLv2 license.  When using or 
4  *   redistributing this file, you may do so under either license.
5  * 
6  *   GPL LICENSE SUMMARY
7  * 
8  *   Copyright(c) 2007,2008 Intel Corporation. All rights reserved.
9  * 
10  *   This program is free software; you can redistribute it and/or modify 
11  *   it under the terms of version 2 of the GNU General Public License as
12  *   published by the Free Software Foundation.
13  * 
14  *   This program is distributed in the hope that it will be useful, but 
15  *   WITHOUT ANY WARRANTY; without even the implied warranty of 
16  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
17  *   General Public License for more details.
18  * 
19  *   You should have received a copy of the GNU General Public License 
20  *   along with this program; if not, write to the Free Software 
21  *   Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
22  *   The full GNU General Public License is included in this distribution 
23  *   in the file called LICENSE.GPL.
24  * 
25  *   Contact Information:
26  *   Intel Corporation
27  * 
28  *   BSD LICENSE 
29  * 
30  *   Copyright(c) 2007,2008 Intel Corporation. All rights reserved.
31  *   All rights reserved.
32  * 
33  *   Redistribution and use in source and binary forms, with or without 
34  *   modification, are permitted provided that the following conditions 
35  *   are met:
36  * 
37  *     * Redistributions of source code must retain the above copyright 
38  *       notice, this list of conditions and the following disclaimer.
39  *     * Redistributions in binary form must reproduce the above copyright 
40  *       notice, this list of conditions and the following disclaimer in 
41  *       the documentation and/or other materials provided with the 
42  *       distribution.
43  *     * Neither the name of Intel Corporation nor the names of its 
44  *       contributors may be used to endorse or promote products derived 
45  *       from this software without specific prior written permission.
46  * 
47  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
48  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
49  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
50  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
51  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
52  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
53  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
54  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
55  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
56  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
57  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
58  * 
59  * 
60  *  version: Security.L.1.0.130
61  *
62  ***************************************************************************/
63
64 #include "icp_ocf.h"
65
66 /*The following define values (containing the word 'INDEX') are used to find
67 the index of each input buffer of the crypto_kop struct (see OCF cryptodev.h).
68 These values were found through analysis of the OCF OpenSSL patch. If the
69 calling program uses different input buffer positions, these defines will have
70 to be changed.*/
71
72 /*DIFFIE HELLMAN buffer index values*/
73 #define ICP_DH_KRP_PARAM_PRIME_INDEX                            (0)
74 #define ICP_DH_KRP_PARAM_BASE_INDEX                             (1)
75 #define ICP_DH_KRP_PARAM_PRIVATE_VALUE_INDEX                    (2)
76 #define ICP_DH_KRP_PARAM_RESULT_INDEX                           (3)
77
78 /*MOD EXP buffer index values*/
79 #define ICP_MOD_EXP_KRP_PARAM_BASE_INDEX                        (0)
80 #define ICP_MOD_EXP_KRP_PARAM_EXPONENT_INDEX                    (1)
81 #define ICP_MOD_EXP_KRP_PARAM_MODULUS_INDEX                     (2)
82 #define ICP_MOD_EXP_KRP_PARAM_RESULT_INDEX                      (3)
83
84 #define SINGLE_BYTE_VALUE                                       (4)
85
86 /*MOD EXP CRT buffer index values*/
87 #define ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_P_INDEX                 (0)
88 #define ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_Q_INDEX                 (1)
89 #define ICP_MOD_EXP_CRT_KRP_PARAM_I_INDEX                       (2)
90 #define ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DP_INDEX             (3)
91 #define ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DQ_INDEX             (4)
92 #define ICP_MOD_EXP_CRT_KRP_PARAM_COEFF_QINV_INDEX              (5)
93 #define ICP_MOD_EXP_CRT_KRP_PARAM_RESULT_INDEX                  (6)
94
95 /*DSA sign buffer index values*/
96 #define ICP_DSA_SIGN_KRP_PARAM_DGST_INDEX                       (0)
97 #define ICP_DSA_SIGN_KRP_PARAM_PRIME_P_INDEX                    (1)
98 #define ICP_DSA_SIGN_KRP_PARAM_PRIME_Q_INDEX                    (2)
99 #define ICP_DSA_SIGN_KRP_PARAM_G_INDEX                          (3)
100 #define ICP_DSA_SIGN_KRP_PARAM_X_INDEX                          (4)
101 #define ICP_DSA_SIGN_KRP_PARAM_R_RESULT_INDEX                   (5)
102 #define ICP_DSA_SIGN_KRP_PARAM_S_RESULT_INDEX                   (6)
103
104 /*DSA verify buffer index values*/
105 #define ICP_DSA_VERIFY_KRP_PARAM_DGST_INDEX                     (0)
106 #define ICP_DSA_VERIFY_KRP_PARAM_PRIME_P_INDEX                  (1)
107 #define ICP_DSA_VERIFY_KRP_PARAM_PRIME_Q_INDEX                  (2)
108 #define ICP_DSA_VERIFY_KRP_PARAM_G_INDEX                        (3)
109 #define ICP_DSA_VERIFY_KRP_PARAM_PUBKEY_INDEX                   (4)
110 #define ICP_DSA_VERIFY_KRP_PARAM_SIG_R_INDEX                    (5)
111 #define ICP_DSA_VERIFY_KRP_PARAM_SIG_S_INDEX                    (6)
112
113 /*DSA sign prime Q vs random number K size check values*/
114 #define DONT_RUN_LESS_THAN_CHECK                                (0)
115 #define FAIL_A_IS_GREATER_THAN_B                                (1)
116 #define FAIL_A_IS_EQUAL_TO_B                                    (1)
117 #define SUCCESS_A_IS_LESS_THAN_B                                (0)
118 #define DSA_SIGN_RAND_GEN_VAL_CHECK_MAX_ITERATIONS              (500)
119
120 /* We need to set a cryptokp success value just in case it is set or allocated
121    and not set to zero outside of this module */
122 #define CRYPTO_OP_SUCCESS                                       (0)
123
124 static int icp_ocfDrvDHComputeKey(struct cryptkop *krp);
125
126 static int icp_ocfDrvModExp(struct cryptkop *krp);
127
128 static int icp_ocfDrvModExpCRT(struct cryptkop *krp);
129
130 static int
131 icp_ocfDrvCheckALessThanB(CpaFlatBuffer * pK, CpaFlatBuffer * pQ, int *doCheck);
132
133 static int icp_ocfDrvDsaSign(struct cryptkop *krp);
134
135 static int icp_ocfDrvDsaVerify(struct cryptkop *krp);
136
137 static void
138 icp_ocfDrvDhP1CallBack(void *callbackTag,
139                        CpaStatus status,
140                        void *pOpData, CpaFlatBuffer * pLocalOctetStringPV);
141
142 static void
143 icp_ocfDrvModExpCallBack(void *callbackTag,
144                          CpaStatus status,
145                          void *pOpData, CpaFlatBuffer * pResult);
146
147 static void
148 icp_ocfDrvModExpCRTCallBack(void *callbackTag,
149                             CpaStatus status,
150                             void *pOpData, CpaFlatBuffer * pOutputData);
151
152 static void
153 icp_ocfDrvDsaVerifyCallBack(void *callbackTag,
154                             CpaStatus status,
155                             void *pOpData, CpaBoolean verifyStatus);
156
157 static void
158 icp_ocfDrvDsaRSSignCallBack(void *callbackTag,
159                             CpaStatus status,
160                             void *pOpData,
161                             CpaBoolean protocolStatus,
162                             CpaFlatBuffer * pR, CpaFlatBuffer * pS);
163
164 /* Name        : icp_ocfDrvPkeProcess
165  *
166  * Description : This function will choose which PKE process to follow
167  * based on the input arguments
168  */
169 int icp_ocfDrvPkeProcess(device_t dev, struct cryptkop *krp, int hint)
170 {
171         CpaStatus lacStatus = CPA_STATUS_SUCCESS;
172
173         if (NULL == krp) {
174                 DPRINTK("%s(): Invalid input parameters, cryptkop = %p\n",
175                         __FUNCTION__, krp);
176                 return EINVAL;
177         }
178
179         if (CPA_TRUE == atomic_read(&icp_ocfDrvIsExiting)) {
180                 krp->krp_status = ECANCELED;
181                 return ECANCELED;
182         }
183
184         switch (krp->krp_op) {
185         case CRK_DH_COMPUTE_KEY:
186                 DPRINTK("%s() doing DH_COMPUTE_KEY\n", __FUNCTION__);
187                 lacStatus = icp_ocfDrvDHComputeKey(krp);
188                 if (CPA_STATUS_SUCCESS != lacStatus) {
189                         EPRINTK("%s(): icp_ocfDrvDHComputeKey failed "
190                                 "(%d).\n", __FUNCTION__, lacStatus);
191                         krp->krp_status = ECANCELED;
192                         return ECANCELED;
193                 }
194
195                 break;
196
197         case CRK_MOD_EXP:
198                 DPRINTK("%s() doing MOD_EXP \n", __FUNCTION__);
199                 lacStatus = icp_ocfDrvModExp(krp);
200                 if (CPA_STATUS_SUCCESS != lacStatus) {
201                         EPRINTK("%s(): icp_ocfDrvModExp failed (%d).\n",
202                                 __FUNCTION__, lacStatus);
203                         krp->krp_status = ECANCELED;
204                         return ECANCELED;
205                 }
206
207                 break;
208
209         case CRK_MOD_EXP_CRT:
210                 DPRINTK("%s() doing MOD_EXP_CRT \n", __FUNCTION__);
211                 lacStatus = icp_ocfDrvModExpCRT(krp);
212                 if (CPA_STATUS_SUCCESS != lacStatus) {
213                         EPRINTK("%s(): icp_ocfDrvModExpCRT "
214                                 "failed (%d).\n", __FUNCTION__, lacStatus);
215                         krp->krp_status = ECANCELED;
216                         return ECANCELED;
217                 }
218
219                 break;
220
221         case CRK_DSA_SIGN:
222                 DPRINTK("%s() doing DSA_SIGN \n", __FUNCTION__);
223                 lacStatus = icp_ocfDrvDsaSign(krp);
224                 if (CPA_STATUS_SUCCESS != lacStatus) {
225                         EPRINTK("%s(): icp_ocfDrvDsaSign "
226                                 "failed (%d).\n", __FUNCTION__, lacStatus);
227                         krp->krp_status = ECANCELED;
228                         return ECANCELED;
229                 }
230
231                 break;
232
233         case CRK_DSA_VERIFY:
234                 DPRINTK("%s() doing DSA_VERIFY \n", __FUNCTION__);
235                 lacStatus = icp_ocfDrvDsaVerify(krp);
236                 if (CPA_STATUS_SUCCESS != lacStatus) {
237                         EPRINTK("%s(): icp_ocfDrvDsaVerify "
238                                 "failed (%d).\n", __FUNCTION__, lacStatus);
239                         krp->krp_status = ECANCELED;
240                         return ECANCELED;
241                 }
242
243                 break;
244
245         default:
246                 EPRINTK("%s(): Asymettric function not "
247                         "supported (%d).\n", __FUNCTION__, krp->krp_op);
248                 krp->krp_status = EOPNOTSUPP;
249                 return EOPNOTSUPP;
250         }
251
252         return ICP_OCF_DRV_STATUS_SUCCESS;
253 }
254
255 /* Name        : icp_ocfDrvSwapBytes
256  *
257  * Description : This function is used to swap the byte order of a buffer.
258  * It has been seen that in general we are passed little endian byte order
259  * buffers, but LAC only accepts big endian byte order buffers.
260  */
261 static void inline
262 icp_ocfDrvSwapBytes(u_int8_t * num, u_int32_t buff_len_bytes)
263 {
264
265         int i;
266         u_int8_t *end_ptr;
267         u_int8_t hold_val;
268
269         end_ptr = num + (buff_len_bytes - 1);
270         buff_len_bytes = buff_len_bytes >> 1;
271         for (i = 0; i < buff_len_bytes; i++) {
272                 hold_val = *num;
273                 *num = *end_ptr;
274                 num++;
275                 *end_ptr = hold_val;
276                 end_ptr--;
277         }
278 }
279
280 /* Name        : icp_ocfDrvDHComputeKey
281  *
282  * Description : This function will map Diffie Hellman calls from OCF
283  * to the LAC API. OCF uses this function for Diffie Hellman Phase1 and
284  * Phase2. LAC has a separate Diffie Hellman Phase2 call, however both phases
285  * break down to a modular exponentiation.
286  */
287 static int icp_ocfDrvDHComputeKey(struct cryptkop *krp)
288 {
289         CpaStatus lacStatus = CPA_STATUS_SUCCESS;
290         void *callbackTag = NULL;
291         CpaCyDhPhase1KeyGenOpData *pPhase1OpData = NULL;
292         CpaFlatBuffer *pLocalOctetStringPV = NULL;
293         uint32_t dh_prime_len_bytes = 0, dh_prime_len_bits = 0;
294
295         /* Input checks - check prime is a multiple of 8 bits to allow for
296            allocation later */
297         dh_prime_len_bits =
298             (krp->krp_param[ICP_DH_KRP_PARAM_PRIME_INDEX].crp_nbits);
299
300         /* LAC can reject prime lengths based on prime key sizes, we just
301            need to make sure we can allocate space for the base and
302            exponent buffers correctly */
303         if ((dh_prime_len_bits % NUM_BITS_IN_BYTE) != 0) {
304                 APRINTK("%s(): Warning Prime number buffer size is not a "
305                         "multiple of 8 bits\n", __FUNCTION__);
306         }
307
308         /* Result storage space should be the same size as the prime as this
309            value can take up the same amount of storage space */
310         if (dh_prime_len_bits !=
311             krp->krp_param[ICP_DH_KRP_PARAM_RESULT_INDEX].crp_nbits) {
312                 DPRINTK("%s(): Return Buffer must be the same size "
313                         "as the Prime buffer\n", __FUNCTION__);
314                 krp->krp_status = EINVAL;
315                 return EINVAL;
316         }
317         /* Switch to size in bytes */
318         BITS_TO_BYTES(dh_prime_len_bytes, dh_prime_len_bits);
319
320         callbackTag = krp;
321
322         pPhase1OpData = kmem_cache_zalloc(drvDH_zone, GFP_KERNEL);
323         if (NULL == pPhase1OpData) {
324                 APRINTK("%s():Failed to get memory for key gen data\n",
325                         __FUNCTION__);
326                 krp->krp_status = ENOMEM;
327                 return ENOMEM;
328         }
329
330         pLocalOctetStringPV = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
331         if (NULL == pLocalOctetStringPV) {
332                 APRINTK("%s():Failed to get memory for pLocalOctetStringPV\n",
333                         __FUNCTION__);
334                 kmem_cache_free(drvDH_zone, pPhase1OpData);
335                 krp->krp_status = ENOMEM;
336                 return ENOMEM;
337         }
338
339         /* Link parameters */
340         pPhase1OpData->primeP.pData =
341             krp->krp_param[ICP_DH_KRP_PARAM_PRIME_INDEX].crp_p;
342
343         pPhase1OpData->primeP.dataLenInBytes = dh_prime_len_bytes;
344
345         icp_ocfDrvSwapBytes(pPhase1OpData->primeP.pData, dh_prime_len_bytes);
346
347         pPhase1OpData->baseG.pData =
348             krp->krp_param[ICP_DH_KRP_PARAM_BASE_INDEX].crp_p;
349
350         BITS_TO_BYTES(pPhase1OpData->baseG.dataLenInBytes,
351                       krp->krp_param[ICP_DH_KRP_PARAM_BASE_INDEX].crp_nbits);
352
353         icp_ocfDrvSwapBytes(pPhase1OpData->baseG.pData,
354                             pPhase1OpData->baseG.dataLenInBytes);
355
356         pPhase1OpData->privateValueX.pData =
357             krp->krp_param[ICP_DH_KRP_PARAM_PRIVATE_VALUE_INDEX].crp_p;
358
359         BITS_TO_BYTES(pPhase1OpData->privateValueX.dataLenInBytes,
360                       krp->krp_param[ICP_DH_KRP_PARAM_PRIVATE_VALUE_INDEX].
361                       crp_nbits);
362
363         icp_ocfDrvSwapBytes(pPhase1OpData->privateValueX.pData,
364                             pPhase1OpData->privateValueX.dataLenInBytes);
365
366         /* Output parameters */
367         pLocalOctetStringPV->pData =
368             krp->krp_param[ICP_DH_KRP_PARAM_RESULT_INDEX].crp_p;
369
370         BITS_TO_BYTES(pLocalOctetStringPV->dataLenInBytes,
371                       krp->krp_param[ICP_DH_KRP_PARAM_RESULT_INDEX].crp_nbits);
372
373         lacStatus = cpaCyDhKeyGenPhase1(CPA_INSTANCE_HANDLE_SINGLE,
374                                         icp_ocfDrvDhP1CallBack,
375                                         callbackTag, pPhase1OpData,
376                                         pLocalOctetStringPV);
377
378         if (CPA_STATUS_SUCCESS != lacStatus) {
379                 EPRINTK("%s(): DH Phase 1 Key Gen failed (%d).\n",
380                         __FUNCTION__, lacStatus);
381                 icp_ocfDrvFreeFlatBuffer(pLocalOctetStringPV);
382                 kmem_cache_free(drvDH_zone, pPhase1OpData);
383         }
384
385         return lacStatus;
386 }
387
388 /* Name        : icp_ocfDrvModExp
389  *
390  * Description : This function will map ordinary Modular Exponentiation calls
391  * from OCF to the LAC API.
392  *
393  */
394 static int icp_ocfDrvModExp(struct cryptkop *krp)
395 {
396         CpaStatus lacStatus = CPA_STATUS_SUCCESS;
397         void *callbackTag = NULL;
398         CpaCyLnModExpOpData *pModExpOpData = NULL;
399         CpaFlatBuffer *pResult = NULL;
400
401         if ((krp->krp_param[ICP_MOD_EXP_KRP_PARAM_MODULUS_INDEX].crp_nbits %
402              NUM_BITS_IN_BYTE) != 0) {
403                 DPRINTK("%s(): Warning - modulus buffer size (%d) is not a "
404                         "multiple of 8 bits\n", __FUNCTION__,
405                         krp->krp_param[ICP_MOD_EXP_KRP_PARAM_MODULUS_INDEX].
406                         crp_nbits);
407         }
408
409         /* Result storage space should be the same size as the prime as this
410            value can take up the same amount of storage space */
411         if (krp->krp_param[ICP_MOD_EXP_KRP_PARAM_MODULUS_INDEX].crp_nbits >
412             krp->krp_param[ICP_MOD_EXP_KRP_PARAM_RESULT_INDEX].crp_nbits) {
413                 APRINTK("%s(): Return Buffer size must be the same or"
414                         " greater than the Modulus buffer\n", __FUNCTION__);
415                 krp->krp_status = EINVAL;
416                 return EINVAL;
417         }
418
419         callbackTag = krp;
420
421         pModExpOpData = kmem_cache_zalloc(drvLnModExp_zone, GFP_KERNEL);
422         if (NULL == pModExpOpData) {
423                 APRINTK("%s():Failed to get memory for key gen data\n",
424                         __FUNCTION__);
425                 krp->krp_status = ENOMEM;
426                 return ENOMEM;
427         }
428
429         pResult = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
430         if (NULL == pResult) {
431                 APRINTK("%s():Failed to get memory for ModExp result\n",
432                         __FUNCTION__);
433                 kmem_cache_free(drvLnModExp_zone, pModExpOpData);
434                 krp->krp_status = ENOMEM;
435                 return ENOMEM;
436         }
437
438         /* Link parameters */
439         pModExpOpData->modulus.pData =
440             krp->krp_param[ICP_MOD_EXP_KRP_PARAM_MODULUS_INDEX].crp_p;
441         BITS_TO_BYTES(pModExpOpData->modulus.dataLenInBytes,
442                       krp->krp_param[ICP_MOD_EXP_KRP_PARAM_MODULUS_INDEX].
443                       crp_nbits);
444
445         icp_ocfDrvSwapBytes(pModExpOpData->modulus.pData,
446                             pModExpOpData->modulus.dataLenInBytes);
447
448         /*OCF patch to Openswan Pluto regularly sends the base value as 2
449            bits in size. In this case, it has been found it is better to
450            use the base size memory space as the input buffer (if the number
451            is in bits is less than a byte, the number of bits is the input
452            value) */
453         if (krp->krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_nbits <
454             NUM_BITS_IN_BYTE) {
455                 DPRINTK("%s : base is small (%d)\n", __FUNCTION__, krp->
456                         krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_nbits);
457                 pModExpOpData->base.dataLenInBytes = SINGLE_BYTE_VALUE;
458                 pModExpOpData->base.pData =
459                     (uint8_t *) & (krp->
460                                    krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].
461                                    crp_nbits);
462                 *((uint32_t *) pModExpOpData->base.pData) =
463                     htonl(*((uint32_t *) pModExpOpData->base.pData));
464
465         } else {
466
467                 DPRINTK("%s : base is big (%d)\n", __FUNCTION__, krp->
468                         krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_nbits);
469                 pModExpOpData->base.pData =
470                     krp->krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].crp_p;
471                 BITS_TO_BYTES(pModExpOpData->base.dataLenInBytes,
472                               krp->krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].
473                               crp_nbits);
474                 icp_ocfDrvSwapBytes(pModExpOpData->base.pData,
475                                     pModExpOpData->base.dataLenInBytes);
476         }
477
478         pModExpOpData->exponent.pData =
479             krp->krp_param[ICP_MOD_EXP_KRP_PARAM_EXPONENT_INDEX].crp_p;
480         BITS_TO_BYTES(pModExpOpData->exponent.dataLenInBytes,
481                       krp->krp_param[ICP_MOD_EXP_KRP_PARAM_EXPONENT_INDEX].
482                       crp_nbits);
483
484         icp_ocfDrvSwapBytes(pModExpOpData->exponent.pData,
485                             pModExpOpData->exponent.dataLenInBytes);
486         /* Output parameters */
487         pResult->pData =
488             krp->krp_param[ICP_MOD_EXP_KRP_PARAM_RESULT_INDEX].crp_p,
489             BITS_TO_BYTES(pResult->dataLenInBytes,
490                           krp->krp_param[ICP_MOD_EXP_KRP_PARAM_RESULT_INDEX].
491                           crp_nbits);
492
493         lacStatus = cpaCyLnModExp(CPA_INSTANCE_HANDLE_SINGLE,
494                                   icp_ocfDrvModExpCallBack,
495                                   callbackTag, pModExpOpData, pResult);
496
497         if (CPA_STATUS_SUCCESS != lacStatus) {
498                 EPRINTK("%s(): Mod Exp Operation failed (%d).\n",
499                         __FUNCTION__, lacStatus);
500                 krp->krp_status = ECANCELED;
501                 icp_ocfDrvFreeFlatBuffer(pResult);
502                 kmem_cache_free(drvLnModExp_zone, pModExpOpData);
503         }
504
505         return lacStatus;
506 }
507
508 /* Name        : icp_ocfDrvModExpCRT
509  *
510  * Description : This function will map ordinary Modular Exponentiation Chinese
511  * Remainder Theorem implementaion calls from OCF to the LAC API.
512  *
513  * Note : Mod Exp CRT for this driver is accelerated through LAC RSA type 2
514  * decrypt operation. Therefore P and Q input values must always be prime
515  * numbers. Although basic primality checks are done in LAC, it is up to the
516  * user to do any correct prime number checking before passing the inputs.
517  */
518
519 static int icp_ocfDrvModExpCRT(struct cryptkop *krp)
520 {
521         CpaStatus lacStatus = CPA_STATUS_SUCCESS;
522         CpaCyRsaDecryptOpData *rsaDecryptOpData = NULL;
523         void *callbackTag = NULL;
524         CpaFlatBuffer *pOutputData = NULL;
525
526         /*Parameter input checks are all done by LAC, no need to repeat
527            them here. */
528         callbackTag = krp;
529
530         rsaDecryptOpData = kmem_cache_zalloc(drvRSADecrypt_zone, GFP_KERNEL);
531         if (NULL == rsaDecryptOpData) {
532                 APRINTK("%s():Failed to get memory"
533                         " for MOD EXP CRT Op data struct\n", __FUNCTION__);
534                 krp->krp_status = ENOMEM;
535                 return ENOMEM;
536         }
537
538         rsaDecryptOpData->pRecipientPrivateKey
539             = kmem_cache_zalloc(drvRSAPrivateKey_zone, GFP_KERNEL);
540         if (NULL == rsaDecryptOpData->pRecipientPrivateKey) {
541                 APRINTK("%s():Failed to get memory for MOD EXP CRT"
542                         " private key values struct\n", __FUNCTION__);
543                 kmem_cache_free(drvRSADecrypt_zone, rsaDecryptOpData);
544                 krp->krp_status = ENOMEM;
545                 return ENOMEM;
546         }
547
548         rsaDecryptOpData->pRecipientPrivateKey->
549             version = CPA_CY_RSA_VERSION_TWO_PRIME;
550         rsaDecryptOpData->pRecipientPrivateKey->
551             privateKeyRepType = CPA_CY_RSA_PRIVATE_KEY_REP_TYPE_2;
552
553         pOutputData = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
554         if (NULL == pOutputData) {
555                 APRINTK("%s():Failed to get memory"
556                         " for MOD EXP CRT output data\n", __FUNCTION__);
557                 kmem_cache_free(drvRSAPrivateKey_zone,
558                                 rsaDecryptOpData->pRecipientPrivateKey);
559                 kmem_cache_free(drvRSADecrypt_zone, rsaDecryptOpData);
560                 krp->krp_status = ENOMEM;
561                 return ENOMEM;
562         }
563
564         rsaDecryptOpData->pRecipientPrivateKey->
565             version = CPA_CY_RSA_VERSION_TWO_PRIME;
566         rsaDecryptOpData->pRecipientPrivateKey->
567             privateKeyRepType = CPA_CY_RSA_PRIVATE_KEY_REP_TYPE_2;
568
569         /* Link parameters */
570         rsaDecryptOpData->inputData.pData =
571             krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_I_INDEX].crp_p;
572         BITS_TO_BYTES(rsaDecryptOpData->inputData.dataLenInBytes,
573                       krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_I_INDEX].
574                       crp_nbits);
575
576         icp_ocfDrvSwapBytes(rsaDecryptOpData->inputData.pData,
577                             rsaDecryptOpData->inputData.dataLenInBytes);
578
579         rsaDecryptOpData->pRecipientPrivateKey->privateKeyRep2.prime1P.pData =
580             krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_P_INDEX].crp_p;
581         BITS_TO_BYTES(rsaDecryptOpData->pRecipientPrivateKey->privateKeyRep2.
582                       prime1P.dataLenInBytes,
583                       krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_P_INDEX].
584                       crp_nbits);
585
586         icp_ocfDrvSwapBytes(rsaDecryptOpData->pRecipientPrivateKey->
587                             privateKeyRep2.prime1P.pData,
588                             rsaDecryptOpData->pRecipientPrivateKey->
589                             privateKeyRep2.prime1P.dataLenInBytes);
590
591         rsaDecryptOpData->pRecipientPrivateKey->privateKeyRep2.prime2Q.pData =
592             krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_Q_INDEX].crp_p;
593         BITS_TO_BYTES(rsaDecryptOpData->pRecipientPrivateKey->privateKeyRep2.
594                       prime2Q.dataLenInBytes,
595                       krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_PRIME_Q_INDEX].
596                       crp_nbits);
597
598         icp_ocfDrvSwapBytes(rsaDecryptOpData->pRecipientPrivateKey->
599                             privateKeyRep2.prime2Q.pData,
600                             rsaDecryptOpData->pRecipientPrivateKey->
601                             privateKeyRep2.prime2Q.dataLenInBytes);
602
603         rsaDecryptOpData->pRecipientPrivateKey->
604             privateKeyRep2.exponent1Dp.pData =
605             krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DP_INDEX].crp_p;
606         BITS_TO_BYTES(rsaDecryptOpData->pRecipientPrivateKey->privateKeyRep2.
607                       exponent1Dp.dataLenInBytes,
608                       krp->
609                       krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DP_INDEX].
610                       crp_nbits);
611
612         icp_ocfDrvSwapBytes(rsaDecryptOpData->pRecipientPrivateKey->
613                             privateKeyRep2.exponent1Dp.pData,
614                             rsaDecryptOpData->pRecipientPrivateKey->
615                             privateKeyRep2.exponent1Dp.dataLenInBytes);
616
617         rsaDecryptOpData->pRecipientPrivateKey->
618             privateKeyRep2.exponent2Dq.pData =
619             krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DQ_INDEX].crp_p;
620         BITS_TO_BYTES(rsaDecryptOpData->pRecipientPrivateKey->
621                       privateKeyRep2.exponent2Dq.dataLenInBytes,
622                       krp->
623                       krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_EXPONENT_DQ_INDEX].
624                       crp_nbits);
625
626         icp_ocfDrvSwapBytes(rsaDecryptOpData->pRecipientPrivateKey->
627                             privateKeyRep2.exponent2Dq.pData,
628                             rsaDecryptOpData->pRecipientPrivateKey->
629                             privateKeyRep2.exponent2Dq.dataLenInBytes);
630
631         rsaDecryptOpData->pRecipientPrivateKey->
632             privateKeyRep2.coefficientQInv.pData =
633             krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_COEFF_QINV_INDEX].crp_p;
634         BITS_TO_BYTES(rsaDecryptOpData->pRecipientPrivateKey->
635                       privateKeyRep2.coefficientQInv.dataLenInBytes,
636                       krp->
637                       krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_COEFF_QINV_INDEX].
638                       crp_nbits);
639
640         icp_ocfDrvSwapBytes(rsaDecryptOpData->pRecipientPrivateKey->
641                             privateKeyRep2.coefficientQInv.pData,
642                             rsaDecryptOpData->pRecipientPrivateKey->
643                             privateKeyRep2.coefficientQInv.dataLenInBytes);
644
645         /* Output Parameter */
646         pOutputData->pData =
647             krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_RESULT_INDEX].crp_p;
648         BITS_TO_BYTES(pOutputData->dataLenInBytes,
649                       krp->krp_param[ICP_MOD_EXP_CRT_KRP_PARAM_RESULT_INDEX].
650                       crp_nbits);
651
652         lacStatus = cpaCyRsaDecrypt(CPA_INSTANCE_HANDLE_SINGLE,
653                                     icp_ocfDrvModExpCRTCallBack,
654                                     callbackTag, rsaDecryptOpData, pOutputData);
655
656         if (CPA_STATUS_SUCCESS != lacStatus) {
657                 EPRINTK("%s(): Mod Exp CRT Operation failed (%d).\n",
658                         __FUNCTION__, lacStatus);
659                 krp->krp_status = ECANCELED;
660                 icp_ocfDrvFreeFlatBuffer(pOutputData);
661                 kmem_cache_free(drvRSAPrivateKey_zone,
662                                 rsaDecryptOpData->pRecipientPrivateKey);
663                 kmem_cache_free(drvRSADecrypt_zone, rsaDecryptOpData);
664         }
665
666         return lacStatus;
667 }
668
669 /* Name        : icp_ocfDrvCheckALessThanB
670  *
671  * Description : This function will check whether the first argument is less
672  * than the second. It is used to check whether the DSA RS sign Random K
673  * value is less than the Prime Q value (as defined in the specification)
674  *
675  */
676 static int
677 icp_ocfDrvCheckALessThanB(CpaFlatBuffer * pK, CpaFlatBuffer * pQ, int *doCheck)
678 {
679
680         uint8_t *MSB_K = pK->pData;
681         uint8_t *MSB_Q = pQ->pData;
682         uint32_t buffer_lengths_in_bytes = pQ->dataLenInBytes;
683
684         if (DONT_RUN_LESS_THAN_CHECK == *doCheck) {
685                 return FAIL_A_IS_GREATER_THAN_B;
686         }
687
688 /*Check MSBs
689 if A == B, check next MSB
690 if A > B, return A_IS_GREATER_THAN_B
691 if A < B, return A_IS_LESS_THAN_B (success)
692 */
693         while (*MSB_K == *MSB_Q) {
694                 MSB_K++;
695                 MSB_Q++;
696
697                 buffer_lengths_in_bytes--;
698                 if (0 == buffer_lengths_in_bytes) {
699                         DPRINTK("%s() Buffers have equal value!!\n",
700                                 __FUNCTION__);
701                         return FAIL_A_IS_EQUAL_TO_B;
702                 }
703
704         }
705
706         if (*MSB_K < *MSB_Q) {
707                 return SUCCESS_A_IS_LESS_THAN_B;
708         } else {
709                 return FAIL_A_IS_GREATER_THAN_B;
710         }
711
712 }
713
714 /* Name        : icp_ocfDrvDsaSign
715  *
716  * Description : This function will map DSA RS Sign from OCF to the LAC API.
717  *
718  * NOTE: From looking at OCF patch to OpenSSL and even the number of input
719  * parameters, OCF expects us to generate the random seed value. This value
720  * is generated and passed to LAC, however the number is discared in the
721  * callback and not returned to the user.
722  */
723 static int icp_ocfDrvDsaSign(struct cryptkop *krp)
724 {
725         CpaStatus lacStatus = CPA_STATUS_SUCCESS;
726         CpaCyDsaRSSignOpData *dsaRsSignOpData = NULL;
727         void *callbackTag = NULL;
728         CpaCyRandGenOpData randGenOpData;
729         int primeQSizeInBytes = 0;
730         int doCheck = 0;
731         CpaFlatBuffer randData;
732         CpaBoolean protocolStatus = CPA_FALSE;
733         CpaFlatBuffer *pR = NULL;
734         CpaFlatBuffer *pS = NULL;
735
736         callbackTag = krp;
737
738         BITS_TO_BYTES(primeQSizeInBytes,
739                       krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_PRIME_Q_INDEX].
740                       crp_nbits);
741
742         if (DSA_RS_SIGN_PRIMEQ_SIZE_IN_BYTES != primeQSizeInBytes) {
743                 APRINTK("%s(): DSA PRIME Q size not equal to the "
744                         "FIPS defined 20bytes, = %d\n",
745                         __FUNCTION__, primeQSizeInBytes);
746                 krp->krp_status = EDOM;
747                 return EDOM;
748         }
749
750         dsaRsSignOpData = kmem_cache_zalloc(drvDSARSSign_zone, GFP_KERNEL);
751         if (NULL == dsaRsSignOpData) {
752                 APRINTK("%s():Failed to get memory"
753                         " for DSA RS Sign Op data struct\n", __FUNCTION__);
754                 krp->krp_status = ENOMEM;
755                 return ENOMEM;
756         }
757
758         dsaRsSignOpData->K.pData =
759             kmem_cache_alloc(drvDSARSSignKValue_zone, GFP_ATOMIC);
760
761         if (NULL == dsaRsSignOpData->K.pData) {
762                 APRINTK("%s():Failed to get memory"
763                         " for DSA RS Sign Op Random value\n", __FUNCTION__);
764                 kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
765                 krp->krp_status = ENOMEM;
766                 return ENOMEM;
767         }
768
769         pR = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
770         if (NULL == pR) {
771                 APRINTK("%s():Failed to get memory"
772                         " for DSA signature R\n", __FUNCTION__);
773                 kmem_cache_free(drvDSARSSignKValue_zone,
774                                 dsaRsSignOpData->K.pData);
775                 kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
776                 krp->krp_status = ENOMEM;
777                 return ENOMEM;
778         }
779
780         pS = kmem_cache_zalloc(drvFlatBuffer_zone, GFP_KERNEL);
781         if (NULL == pS) {
782                 APRINTK("%s():Failed to get memory"
783                         " for DSA signature S\n", __FUNCTION__);
784                 icp_ocfDrvFreeFlatBuffer(pR);
785                 kmem_cache_free(drvDSARSSignKValue_zone,
786                                 dsaRsSignOpData->K.pData);
787                 kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
788                 krp->krp_status = ENOMEM;
789                 return ENOMEM;
790         }
791
792         /*link prime number parameter for ease of processing */
793         dsaRsSignOpData->P.pData =
794             krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_PRIME_P_INDEX].crp_p;
795         BITS_TO_BYTES(dsaRsSignOpData->P.dataLenInBytes,
796                       krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_PRIME_P_INDEX].
797                       crp_nbits);
798
799         icp_ocfDrvSwapBytes(dsaRsSignOpData->P.pData,
800                             dsaRsSignOpData->P.dataLenInBytes);
801
802         dsaRsSignOpData->Q.pData =
803             krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_PRIME_Q_INDEX].crp_p;
804         BITS_TO_BYTES(dsaRsSignOpData->Q.dataLenInBytes,
805                       krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_PRIME_Q_INDEX].
806                       crp_nbits);
807
808         icp_ocfDrvSwapBytes(dsaRsSignOpData->Q.pData,
809                             dsaRsSignOpData->Q.dataLenInBytes);
810
811         /*generate random number with equal buffer size to Prime value Q,
812            but value less than Q */
813         dsaRsSignOpData->K.dataLenInBytes = dsaRsSignOpData->Q.dataLenInBytes;
814
815         randGenOpData.generateBits = CPA_TRUE;
816         randGenOpData.lenInBytes = dsaRsSignOpData->K.dataLenInBytes;
817
818         icp_ocfDrvPtrAndLenToFlatBuffer(dsaRsSignOpData->K.pData,
819                                         dsaRsSignOpData->K.dataLenInBytes,
820                                         &randData);
821
822         doCheck = 0;
823         while (icp_ocfDrvCheckALessThanB(&(dsaRsSignOpData->K),
824                                          &(dsaRsSignOpData->Q), &doCheck)) {
825
826                 if (CPA_STATUS_SUCCESS
827                     != cpaCyRandGen(CPA_INSTANCE_HANDLE_SINGLE,
828                                     NULL, NULL, &randGenOpData, &randData)) {
829                         APRINTK("%s(): ERROR - Failed to generate DSA RS Sign K"
830                                 "value\n", __FUNCTION__);
831                         icp_ocfDrvFreeFlatBuffer(pS);
832                         icp_ocfDrvFreeFlatBuffer(pR);
833                         kmem_cache_free(drvDSARSSignKValue_zone,
834                                         dsaRsSignOpData->K.pData);
835                         kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
836                         krp->krp_status = EAGAIN;
837                         return EAGAIN;
838                 }
839
840                 doCheck++;
841                 if (DSA_SIGN_RAND_GEN_VAL_CHECK_MAX_ITERATIONS == doCheck) {
842                         APRINTK("%s(): ERROR - Failed to find DSA RS Sign K "
843                                 "value less than Q value\n", __FUNCTION__);
844                         icp_ocfDrvFreeFlatBuffer(pS);
845                         icp_ocfDrvFreeFlatBuffer(pR);
846                         kmem_cache_free(drvDSARSSignKValue_zone,
847                                         dsaRsSignOpData->K.pData);
848                         kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
849                         krp->krp_status = EAGAIN;
850                         return EAGAIN;
851                 }
852
853         }
854         /*Rand Data - no need to swap bytes for pK */
855
856         /* Link parameters */
857         dsaRsSignOpData->G.pData =
858             krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_G_INDEX].crp_p;
859         BITS_TO_BYTES(dsaRsSignOpData->G.dataLenInBytes,
860                       krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_G_INDEX].crp_nbits);
861
862         icp_ocfDrvSwapBytes(dsaRsSignOpData->G.pData,
863                             dsaRsSignOpData->G.dataLenInBytes);
864
865         dsaRsSignOpData->X.pData =
866             krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_X_INDEX].crp_p;
867         BITS_TO_BYTES(dsaRsSignOpData->X.dataLenInBytes,
868                       krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_X_INDEX].crp_nbits);
869         icp_ocfDrvSwapBytes(dsaRsSignOpData->X.pData,
870                             dsaRsSignOpData->X.dataLenInBytes);
871
872         dsaRsSignOpData->M.pData =
873             krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_DGST_INDEX].crp_p;
874         BITS_TO_BYTES(dsaRsSignOpData->M.dataLenInBytes,
875                       krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_DGST_INDEX].
876                       crp_nbits);
877         icp_ocfDrvSwapBytes(dsaRsSignOpData->M.pData,
878                             dsaRsSignOpData->M.dataLenInBytes);
879
880         /* Output Parameters */
881         pS->pData = krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_S_RESULT_INDEX].crp_p;
882         BITS_TO_BYTES(pS->dataLenInBytes,
883                       krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_S_RESULT_INDEX].
884                       crp_nbits);
885
886         pR->pData = krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_R_RESULT_INDEX].crp_p;
887         BITS_TO_BYTES(pR->dataLenInBytes,
888                       krp->krp_param[ICP_DSA_SIGN_KRP_PARAM_R_RESULT_INDEX].
889                       crp_nbits);
890
891         lacStatus = cpaCyDsaSignRS(CPA_INSTANCE_HANDLE_SINGLE,
892                                    icp_ocfDrvDsaRSSignCallBack,
893                                    callbackTag, dsaRsSignOpData,
894                                    &protocolStatus, pR, pS);
895
896         if (CPA_STATUS_SUCCESS != lacStatus) {
897                 EPRINTK("%s(): DSA RS Sign Operation failed (%d).\n",
898                         __FUNCTION__, lacStatus);
899                 krp->krp_status = ECANCELED;
900                 icp_ocfDrvFreeFlatBuffer(pS);
901                 icp_ocfDrvFreeFlatBuffer(pR);
902                 kmem_cache_free(drvDSARSSignKValue_zone,
903                                 dsaRsSignOpData->K.pData);
904                 kmem_cache_free(drvDSARSSign_zone, dsaRsSignOpData);
905         }
906
907         return lacStatus;
908 }
909
910 /* Name        : icp_ocfDrvDsaVerify
911  *
912  * Description : This function will map DSA RS Verify from OCF to the LAC API.
913  *
914  */
915 static int icp_ocfDrvDsaVerify(struct cryptkop *krp)
916 {
917         CpaStatus lacStatus = CPA_STATUS_SUCCESS;
918         CpaCyDsaVerifyOpData *dsaVerifyOpData = NULL;
919         void *callbackTag = NULL;
920         CpaBoolean verifyStatus = CPA_FALSE;
921
922         callbackTag = krp;
923
924         dsaVerifyOpData = kmem_cache_zalloc(drvDSAVerify_zone, GFP_KERNEL);
925         if (NULL == dsaVerifyOpData) {
926                 APRINTK("%s():Failed to get memory"
927                         " for DSA Verify Op data struct\n", __FUNCTION__);
928                 krp->krp_status = ENOMEM;
929                 return ENOMEM;
930         }
931
932         /* Link parameters */
933         dsaVerifyOpData->P.pData =
934             krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_PRIME_P_INDEX].crp_p;
935         BITS_TO_BYTES(dsaVerifyOpData->P.dataLenInBytes,
936                       krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_PRIME_P_INDEX].
937                       crp_nbits);
938         icp_ocfDrvSwapBytes(dsaVerifyOpData->P.pData,
939                             dsaVerifyOpData->P.dataLenInBytes);
940
941         dsaVerifyOpData->Q.pData =
942             krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_PRIME_Q_INDEX].crp_p;
943         BITS_TO_BYTES(dsaVerifyOpData->Q.dataLenInBytes,
944                       krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_PRIME_Q_INDEX].
945                       crp_nbits);
946         icp_ocfDrvSwapBytes(dsaVerifyOpData->Q.pData,
947                             dsaVerifyOpData->Q.dataLenInBytes);
948
949         dsaVerifyOpData->G.pData =
950             krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_G_INDEX].crp_p;
951         BITS_TO_BYTES(dsaVerifyOpData->G.dataLenInBytes,
952                       krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_G_INDEX].
953                       crp_nbits);
954         icp_ocfDrvSwapBytes(dsaVerifyOpData->G.pData,
955                             dsaVerifyOpData->G.dataLenInBytes);
956
957         dsaVerifyOpData->Y.pData =
958             krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_PUBKEY_INDEX].crp_p;
959         BITS_TO_BYTES(dsaVerifyOpData->Y.dataLenInBytes,
960                       krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_PUBKEY_INDEX].
961                       crp_nbits);
962         icp_ocfDrvSwapBytes(dsaVerifyOpData->Y.pData,
963                             dsaVerifyOpData->Y.dataLenInBytes);
964
965         dsaVerifyOpData->M.pData =
966             krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_DGST_INDEX].crp_p;
967         BITS_TO_BYTES(dsaVerifyOpData->M.dataLenInBytes,
968                       krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_DGST_INDEX].
969                       crp_nbits);
970         icp_ocfDrvSwapBytes(dsaVerifyOpData->M.pData,
971                             dsaVerifyOpData->M.dataLenInBytes);
972
973         dsaVerifyOpData->R.pData =
974             krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_SIG_R_INDEX].crp_p;
975         BITS_TO_BYTES(dsaVerifyOpData->R.dataLenInBytes,
976                       krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_SIG_R_INDEX].
977                       crp_nbits);
978         icp_ocfDrvSwapBytes(dsaVerifyOpData->R.pData,
979                             dsaVerifyOpData->R.dataLenInBytes);
980
981         dsaVerifyOpData->S.pData =
982             krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_SIG_S_INDEX].crp_p;
983         BITS_TO_BYTES(dsaVerifyOpData->S.dataLenInBytes,
984                       krp->krp_param[ICP_DSA_VERIFY_KRP_PARAM_SIG_S_INDEX].
985                       crp_nbits);
986         icp_ocfDrvSwapBytes(dsaVerifyOpData->S.pData,
987                             dsaVerifyOpData->S.dataLenInBytes);
988
989         lacStatus = cpaCyDsaVerify(CPA_INSTANCE_HANDLE_SINGLE,
990                                    icp_ocfDrvDsaVerifyCallBack,
991                                    callbackTag, dsaVerifyOpData, &verifyStatus);
992
993         if (CPA_STATUS_SUCCESS != lacStatus) {
994                 EPRINTK("%s(): DSA Verify Operation failed (%d).\n",
995                         __FUNCTION__, lacStatus);
996                 kmem_cache_free(drvDSAVerify_zone, dsaVerifyOpData);
997                 krp->krp_status = ECANCELED;
998         }
999
1000         return lacStatus;
1001 }
1002
1003 /* Name        : icp_ocfDrvReadRandom
1004  *
1005  * Description : This function will map RNG functionality calls from OCF
1006  * to the LAC API.
1007  */
1008 int icp_ocfDrvReadRandom(void *arg, uint32_t * buf, int maxwords)
1009 {
1010         CpaStatus lacStatus = CPA_STATUS_SUCCESS;
1011         CpaCyRandGenOpData randGenOpData;
1012         CpaFlatBuffer randData;
1013
1014         if (NULL == buf) {
1015                 APRINTK("%s(): Invalid input parameters\n", __FUNCTION__);
1016                 return EINVAL;
1017         }
1018
1019         /* maxwords here is number of integers to generate data for */
1020         randGenOpData.generateBits = CPA_TRUE;
1021
1022         randGenOpData.lenInBytes = maxwords * sizeof(uint32_t);
1023
1024         icp_ocfDrvPtrAndLenToFlatBuffer((Cpa8U *) buf,
1025                                         randGenOpData.lenInBytes, &randData);
1026
1027         lacStatus = cpaCyRandGen(CPA_INSTANCE_HANDLE_SINGLE,
1028                                  NULL, NULL, &randGenOpData, &randData);
1029         if (CPA_STATUS_SUCCESS != lacStatus) {
1030                 EPRINTK("%s(): icp_LacSymRandGen failed (%d). \n",
1031                         __FUNCTION__, lacStatus);
1032                 return RETURN_RAND_NUM_GEN_FAILED;
1033         }
1034
1035         return randGenOpData.lenInBytes / sizeof(uint32_t);
1036 }
1037
1038 /* Name        : icp_ocfDrvDhP1Callback
1039  *
1040  * Description : When this function returns it signifies that the LAC
1041  * component has completed the DH operation.
1042  */
1043 static void
1044 icp_ocfDrvDhP1CallBack(void *callbackTag,
1045                        CpaStatus status,
1046                        void *pOpData, CpaFlatBuffer * pLocalOctetStringPV)
1047 {
1048         struct cryptkop *krp = NULL;
1049         CpaCyDhPhase1KeyGenOpData *pPhase1OpData = NULL;
1050
1051         if (NULL == callbackTag) {
1052                 DPRINTK("%s(): Invalid input parameters - "
1053                         "callbackTag data is NULL\n", __FUNCTION__);
1054                 return;
1055         }
1056         krp = (struct cryptkop *)callbackTag;
1057
1058         if (NULL == pOpData) {
1059                 DPRINTK("%s(): Invalid input parameters - "
1060                         "Operation Data is NULL\n", __FUNCTION__);
1061                 krp->krp_status = ECANCELED;
1062                 crypto_kdone(krp);
1063                 return;
1064         }
1065         pPhase1OpData = (CpaCyDhPhase1KeyGenOpData *) pOpData;
1066
1067         if (NULL == pLocalOctetStringPV) {
1068                 DPRINTK("%s(): Invalid input parameters - "
1069                         "pLocalOctetStringPV Data is NULL\n", __FUNCTION__);
1070                 memset(pPhase1OpData, 0, sizeof(CpaCyDhPhase1KeyGenOpData));
1071                 kmem_cache_free(drvDH_zone, pPhase1OpData);
1072                 krp->krp_status = ECANCELED;
1073                 crypto_kdone(krp);
1074                 return;
1075         }
1076
1077         if (CPA_STATUS_SUCCESS == status) {
1078                 krp->krp_status = CRYPTO_OP_SUCCESS;
1079         } else {
1080                 APRINTK("%s(): Diffie Hellman Phase1 Key Gen failed - "
1081                         "Operation Status = %d\n", __FUNCTION__, status);
1082                 krp->krp_status = ECANCELED;
1083         }
1084
1085         icp_ocfDrvSwapBytes(pLocalOctetStringPV->pData,
1086                             pLocalOctetStringPV->dataLenInBytes);
1087
1088         icp_ocfDrvFreeFlatBuffer(pLocalOctetStringPV);
1089         memset(pPhase1OpData, 0, sizeof(CpaCyDhPhase1KeyGenOpData));
1090         kmem_cache_free(drvDH_zone, pPhase1OpData);
1091
1092         crypto_kdone(krp);
1093
1094         return;
1095 }
1096
1097 /* Name        : icp_ocfDrvModExpCallBack
1098  *
1099  * Description : When this function returns it signifies that the LAC
1100  * component has completed the Mod Exp operation.
1101  */
1102 static void
1103 icp_ocfDrvModExpCallBack(void *callbackTag,
1104                          CpaStatus status,
1105                          void *pOpdata, CpaFlatBuffer * pResult)
1106 {
1107         struct cryptkop *krp = NULL;
1108         CpaCyLnModExpOpData *pLnModExpOpData = NULL;
1109
1110         if (NULL == callbackTag) {
1111                 DPRINTK("%s(): Invalid input parameters - "
1112                         "callbackTag data is NULL\n", __FUNCTION__);
1113                 return;
1114         }
1115         krp = (struct cryptkop *)callbackTag;
1116
1117         if (NULL == pOpdata) {
1118                 DPRINTK("%s(): Invalid Mod Exp input parameters - "
1119                         "Operation Data is NULL\n", __FUNCTION__);
1120                 krp->krp_status = ECANCELED;
1121                 crypto_kdone(krp);
1122                 return;
1123         }
1124         pLnModExpOpData = (CpaCyLnModExpOpData *) pOpdata;
1125
1126         if (NULL == pResult) {
1127                 DPRINTK("%s(): Invalid input parameters - "
1128                         "pResult data is NULL\n", __FUNCTION__);
1129                 krp->krp_status = ECANCELED;
1130                 memset(pLnModExpOpData, 0, sizeof(CpaCyLnModExpOpData));
1131                 kmem_cache_free(drvLnModExp_zone, pLnModExpOpData);
1132                 crypto_kdone(krp);
1133                 return;
1134         }
1135
1136         if (CPA_STATUS_SUCCESS == status) {
1137                 krp->krp_status = CRYPTO_OP_SUCCESS;
1138         } else {
1139                 APRINTK("%s(): LAC Mod Exp Operation failed - "
1140                         "Operation Status = %d\n", __FUNCTION__, status);
1141                 krp->krp_status = ECANCELED;
1142         }
1143
1144         icp_ocfDrvSwapBytes(pResult->pData, pResult->dataLenInBytes);
1145
1146         /*switch base size value back to original */
1147         if (pLnModExpOpData->base.pData ==
1148             (uint8_t *) & (krp->
1149                            krp_param[ICP_MOD_EXP_KRP_PARAM_BASE_INDEX].
1150                            crp_nbits)) {
1151                 *((uint32_t *) pLnModExpOpData->base.pData) =
1152                     ntohl(*((uint32_t *) pLnModExpOpData->base.pData));
1153         }
1154         icp_ocfDrvFreeFlatBuffer(pResult);
1155         memset(pLnModExpOpData, 0, sizeof(CpaCyLnModExpOpData));
1156         kmem_cache_free(drvLnModExp_zone, pLnModExpOpData);
1157
1158         crypto_kdone(krp);
1159
1160         return;
1161
1162 }
1163
1164 /* Name        : icp_ocfDrvModExpCRTCallBack
1165  *
1166  * Description : When this function returns it signifies that the LAC
1167  * component has completed the Mod Exp CRT operation.
1168  */
1169 static void
1170 icp_ocfDrvModExpCRTCallBack(void *callbackTag,
1171                             CpaStatus status,
1172                             void *pOpData, CpaFlatBuffer * pOutputData)
1173 {
1174         struct cryptkop *krp = NULL;
1175         CpaCyRsaDecryptOpData *pDecryptData = NULL;
1176
1177         if (NULL == callbackTag) {
1178                 DPRINTK("%s(): Invalid input parameters - "
1179                         "callbackTag data is NULL\n", __FUNCTION__);
1180                 return;
1181         }
1182
1183         krp = (struct cryptkop *)callbackTag;
1184
1185         if (NULL == pOpData) {
1186                 DPRINTK("%s(): Invalid input parameters - "
1187                         "Operation Data is NULL\n", __FUNCTION__);
1188                 krp->krp_status = ECANCELED;
1189                 crypto_kdone(krp);
1190                 return;
1191         }
1192         pDecryptData = (CpaCyRsaDecryptOpData *) pOpData;
1193
1194         if (NULL == pOutputData) {
1195                 DPRINTK("%s(): Invalid input parameter - "
1196                         "pOutputData is NULL\n", __FUNCTION__);
1197                 memset(pDecryptData->pRecipientPrivateKey, 0,
1198                        sizeof(CpaCyRsaPrivateKey));
1199                 kmem_cache_free(drvRSAPrivateKey_zone,
1200                                 pDecryptData->pRecipientPrivateKey);
1201                 memset(pDecryptData, 0, sizeof(CpaCyRsaDecryptOpData));
1202                 kmem_cache_free(drvRSADecrypt_zone, pDecryptData);
1203                 krp->krp_status = ECANCELED;
1204                 crypto_kdone(krp);
1205                 return;
1206         }
1207
1208         if (CPA_STATUS_SUCCESS == status) {
1209                 krp->krp_status = CRYPTO_OP_SUCCESS;
1210         } else {
1211                 APRINTK("%s(): LAC Mod Exp CRT operation failed - "
1212                         "Operation Status = %d\n", __FUNCTION__, status);
1213                 krp->krp_status = ECANCELED;
1214         }
1215
1216         icp_ocfDrvSwapBytes(pOutputData->pData, pOutputData->dataLenInBytes);
1217
1218         icp_ocfDrvFreeFlatBuffer(pOutputData);
1219         memset(pDecryptData->pRecipientPrivateKey, 0,
1220                sizeof(CpaCyRsaPrivateKey));
1221         kmem_cache_free(drvRSAPrivateKey_zone,
1222                         pDecryptData->pRecipientPrivateKey);
1223         memset(pDecryptData, 0, sizeof(CpaCyRsaDecryptOpData));
1224         kmem_cache_free(drvRSADecrypt_zone, pDecryptData);
1225
1226         crypto_kdone(krp);
1227
1228         return;
1229 }
1230
1231 /* Name        : icp_ocfDrvDsaRSSignCallBack
1232  *
1233  * Description : When this function returns it signifies that the LAC
1234  * component has completed the DSA RS sign operation.
1235  */
1236 static void
1237 icp_ocfDrvDsaRSSignCallBack(void *callbackTag,
1238                             CpaStatus status,
1239                             void *pOpData,
1240                             CpaBoolean protocolStatus,
1241                             CpaFlatBuffer * pR, CpaFlatBuffer * pS)
1242 {
1243         struct cryptkop *krp = NULL;
1244         CpaCyDsaRSSignOpData *pSignData = NULL;
1245
1246         if (NULL == callbackTag) {
1247                 DPRINTK("%s(): Invalid input parameters - "
1248                         "callbackTag data is NULL\n", __FUNCTION__);
1249                 return;
1250         }
1251
1252         krp = (struct cryptkop *)callbackTag;
1253
1254         if (NULL == pOpData) {
1255                 DPRINTK("%s(): Invalid input parameters - "
1256                         "Operation Data is NULL\n", __FUNCTION__);
1257                 krp->krp_status = ECANCELED;
1258                 crypto_kdone(krp);
1259                 return;
1260         }
1261         pSignData = (CpaCyDsaRSSignOpData *) pOpData;
1262
1263         if (NULL == pR) {
1264                 DPRINTK("%s(): Invalid input parameter - "
1265                         "pR sign is NULL\n", __FUNCTION__);
1266                 icp_ocfDrvFreeFlatBuffer(pS);
1267                 kmem_cache_free(drvDSARSSign_zone, pSignData);
1268                 krp->krp_status = ECANCELED;
1269                 crypto_kdone(krp);
1270                 return;
1271         }
1272
1273         if (NULL == pS) {
1274                 DPRINTK("%s(): Invalid input parameter - "
1275                         "pS sign is NULL\n", __FUNCTION__);
1276                 icp_ocfDrvFreeFlatBuffer(pR);
1277                 kmem_cache_free(drvDSARSSign_zone, pSignData);
1278                 krp->krp_status = ECANCELED;
1279                 crypto_kdone(krp);
1280                 return;
1281         }
1282
1283         if (CPA_STATUS_SUCCESS != status) {
1284                 APRINTK("%s(): LAC DSA RS Sign operation failed - "
1285                         "Operation Status = %d\n", __FUNCTION__, status);
1286                 krp->krp_status = ECANCELED;
1287         } else {
1288                 krp->krp_status = CRYPTO_OP_SUCCESS;
1289
1290                 if (CPA_TRUE != protocolStatus) {
1291                         DPRINTK("%s(): LAC DSA RS Sign operation failed due "
1292                                 "to protocol error\n", __FUNCTION__);
1293                         krp->krp_status = EIO;
1294                 }
1295         }
1296
1297         /* Swap bytes only when the callback status is successful and
1298            protocolStatus is set to true */
1299         if (CPA_STATUS_SUCCESS == status && CPA_TRUE == protocolStatus) {
1300                 icp_ocfDrvSwapBytes(pR->pData, pR->dataLenInBytes);
1301                 icp_ocfDrvSwapBytes(pS->pData, pS->dataLenInBytes);
1302         }
1303
1304         icp_ocfDrvFreeFlatBuffer(pR);
1305         icp_ocfDrvFreeFlatBuffer(pS);
1306         memset(pSignData->K.pData, 0, pSignData->K.dataLenInBytes);
1307         kmem_cache_free(drvDSARSSignKValue_zone, pSignData->K.pData);
1308         memset(pSignData, 0, sizeof(CpaCyDsaRSSignOpData));
1309         kmem_cache_free(drvDSARSSign_zone, pSignData);
1310         crypto_kdone(krp);
1311
1312         return;
1313 }
1314
1315 /* Name        : icp_ocfDrvDsaVerifyCallback
1316  *
1317  * Description : When this function returns it signifies that the LAC
1318  * component has completed the DSA Verify operation.
1319  */
1320 static void
1321 icp_ocfDrvDsaVerifyCallBack(void *callbackTag,
1322                             CpaStatus status,
1323                             void *pOpData, CpaBoolean verifyStatus)
1324 {
1325
1326         struct cryptkop *krp = NULL;
1327         CpaCyDsaVerifyOpData *pVerData = NULL;
1328
1329         if (NULL == callbackTag) {
1330                 DPRINTK("%s(): Invalid input parameters - "
1331                         "callbackTag data is NULL\n", __FUNCTION__);
1332                 return;
1333         }
1334
1335         krp = (struct cryptkop *)callbackTag;
1336
1337         if (NULL == pOpData) {
1338                 DPRINTK("%s(): Invalid input parameters - "
1339                         "Operation Data is NULL\n", __FUNCTION__);
1340                 krp->krp_status = ECANCELED;
1341                 crypto_kdone(krp);
1342                 return;
1343         }
1344         pVerData = (CpaCyDsaVerifyOpData *) pOpData;
1345
1346         if (CPA_STATUS_SUCCESS != status) {
1347                 APRINTK("%s(): LAC DSA Verify operation failed - "
1348                         "Operation Status = %d\n", __FUNCTION__, status);
1349                 krp->krp_status = ECANCELED;
1350         } else {
1351                 krp->krp_status = CRYPTO_OP_SUCCESS;
1352
1353                 if (CPA_TRUE != verifyStatus) {
1354                         DPRINTK("%s(): DSA signature invalid\n", __FUNCTION__);
1355                         krp->krp_status = EIO;
1356                 }
1357         }
1358
1359         /* Swap bytes only when the callback status is successful and
1360            verifyStatus is set to true */
1361         /*Just swapping back the key values for now. Possibly all
1362            swapped buffers need to be reverted */
1363         if (CPA_STATUS_SUCCESS == status && CPA_TRUE == verifyStatus) {
1364                 icp_ocfDrvSwapBytes(pVerData->R.pData,
1365                                     pVerData->R.dataLenInBytes);
1366                 icp_ocfDrvSwapBytes(pVerData->S.pData,
1367                                     pVerData->S.dataLenInBytes);
1368         }
1369
1370         memset(pVerData, 0, sizeof(CpaCyDsaVerifyOpData));
1371         kmem_cache_free(drvDSAVerify_zone, pVerData);
1372         crypto_kdone(krp);
1373
1374         return;
1375 }