@@ -2180,6 +2180,17 @@ static void IntelQaSymCipherCallback(void *pCallbackTag, CpaStatus status,
21802180 XMEMCPY (dev -> qat .out , pDstBuffer -> pBuffers -> pData , outLen );
21812181 }
21822182
2183+ /* capture IV for next call */
2184+ if (dev -> qat .op .cipher .iv && dev -> qat .op .cipher .ivSz > 0 ) {
2185+ word32 ivSz = dev -> qat .op .cipher .ivSz ;
2186+ if (ivSz > outLen )
2187+ ivSz = outLen ;
2188+ /* copy last block */
2189+ XMEMCPY (dev -> qat .op .cipher .iv ,
2190+ & pDstBuffer -> pBuffers -> pData [outLen - ivSz ],
2191+ ivSz );
2192+ }
2193+
21832194 #ifndef NO_AES
21842195 /* return authTag */
21852196 if (dev -> qat .op .cipher .authTag && dev -> qat .op .cipher .authTagSz > 0 ) {
@@ -2207,7 +2218,7 @@ static void IntelQaSymCipherCallback(void *pCallbackTag, CpaStatus status,
22072218}
22082219
22092220static int IntelQaSymCipher (WC_ASYNC_DEV * dev , byte * out , const byte * in ,
2210- word32 inOutSz , const byte * key , word32 keySz , const byte * iv , word32 ivSz ,
2221+ word32 inOutSz , const byte * key , word32 keySz , byte * iv , word32 ivSz ,
22112222 CpaCySymOp symOperation , CpaCySymCipherAlgorithm cipherAlgorithm ,
22122223 CpaCySymCipherDirection cipherDirection ,
22132224
@@ -2352,6 +2363,20 @@ static int IntelQaSymCipher(WC_ASYNC_DEV* dev, byte* out, const byte* in,
23522363 /* store info needed for output */
23532364 dev -> qat .out = out ;
23542365 dev -> qat .outLen = inOutSz ;
2366+ /* optional return of next IV */
2367+ if (cipherAlgorithm != CPA_CY_SYM_CIPHER_AES_GCM && iv ) {
2368+ if (ivSz > inOutSz )
2369+ ivSz = inOutSz ;
2370+ if (cipherDirection == CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT ) {
2371+ /* capture this on the callback */
2372+ dev -> qat .op .cipher .iv = iv ;
2373+ dev -> qat .op .cipher .ivSz = ivSz ;
2374+ }
2375+ else {
2376+ /* capture last block of input as next IV */
2377+ XMEMCPY (iv , & in [inOutSz - ivSz ], ivSz );
2378+ }
2379+ }
23552380 if (cipherDirection == CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT ) {
23562381 dev -> qat .op .cipher .authTag = authTag ;
23572382 dev -> qat .op .cipher .authTagSz = authTagSz ;
@@ -2394,7 +2419,7 @@ static int IntelQaSymCipher(WC_ASYNC_DEV* dev, byte* out, const byte* in,
23942419int IntelQaSymAesCbcEncrypt (WC_ASYNC_DEV * dev ,
23952420 byte * out , const byte * in , word32 sz ,
23962421 const byte * key , word32 keySz ,
2397- const byte * iv , word32 ivSz )
2422+ byte * iv , word32 ivSz )
23982423{
23992424 return IntelQaSymCipher (dev , out , in , sz ,
24002425 key , keySz , iv , ivSz ,
@@ -2407,7 +2432,7 @@ int IntelQaSymAesCbcEncrypt(WC_ASYNC_DEV* dev,
24072432int IntelQaSymAesCbcDecrypt (WC_ASYNC_DEV * dev ,
24082433 byte * out , const byte * in , word32 sz ,
24092434 const byte * key , word32 keySz ,
2410- const byte * iv , word32 ivSz )
2435+ byte * iv , word32 ivSz )
24112436{
24122437 return IntelQaSymCipher (dev , out , in , sz ,
24132438 key , keySz , iv , ivSz ,
@@ -2428,7 +2453,7 @@ int IntelQaSymAesGcmEncrypt(WC_ASYNC_DEV* dev,
24282453 const byte * authIn , word32 authInSz )
24292454{
24302455 return IntelQaSymCipher (dev , out , in , sz ,
2431- key , keySz , iv , ivSz ,
2456+ key , keySz , ( byte * ) iv , ivSz ,
24322457 CPA_CY_SYM_OP_ALGORITHM_CHAINING , CPA_CY_SYM_CIPHER_AES_GCM ,
24332458 CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT ,
24342459 CPA_CY_SYM_HASH_AES_GCM , authTag , authTagSz , authIn , authInSz );
@@ -2442,7 +2467,7 @@ int IntelQaSymAesGcmDecrypt(WC_ASYNC_DEV* dev,
24422467 const byte * authIn , word32 authInSz )
24432468{
24442469 return IntelQaSymCipher (dev , out , in , sz ,
2445- key , keySz , iv , ivSz ,
2470+ key , keySz , ( byte * ) iv , ivSz ,
24462471 CPA_CY_SYM_OP_ALGORITHM_CHAINING , CPA_CY_SYM_CIPHER_AES_GCM ,
24472472 CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT ,
24482473 CPA_CY_SYM_HASH_AES_GCM , (byte * )authTag , authTagSz , authIn , authInSz );
@@ -2454,7 +2479,7 @@ int IntelQaSymAesGcmDecrypt(WC_ASYNC_DEV* dev,
24542479int IntelQaSymDes3CbcEncrypt (WC_ASYNC_DEV * dev ,
24552480 byte * out , const byte * in , word32 sz ,
24562481 const byte * key , word32 keySz ,
2457- const byte * iv , word32 ivSz )
2482+ byte * iv , word32 ivSz )
24582483{
24592484 return IntelQaSymCipher (dev , out , in , sz ,
24602485 key , keySz , iv , ivSz ,
@@ -2466,7 +2491,7 @@ int IntelQaSymDes3CbcEncrypt(WC_ASYNC_DEV* dev,
24662491int IntelQaSymDes3CbcDecrypt (WC_ASYNC_DEV * dev ,
24672492 byte * out , const byte * in , word32 sz ,
24682493 const byte * key , word32 keySz ,
2469- const byte * iv , word32 ivSz )
2494+ byte * iv , word32 ivSz )
24702495{
24712496 return IntelQaSymCipher (dev , out , in , sz ,
24722497 key , keySz , iv , ivSz ,
0 commit comments