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