@@ -112,6 +112,37 @@ QAT_EVP_CIPHER get_default_cipher_aes_ccm(int nid)
112112 return ccm_cipher ;
113113}
114114
115+ static int qat_aes_ccm_tls_init (QAT_PROV_CCM_CTX * ctx , unsigned char * aad , size_t alen )
116+ {
117+ size_t len ;
118+
119+ if (!qat_prov_is_running () || alen != EVP_AEAD_TLS1_AAD_LEN )
120+ return 0 ;
121+
122+ /* Save the aad for later use. */
123+ memcpy (ctx -> buf , aad , alen );
124+ ctx -> tls_aad_len = alen ;
125+
126+ len = ctx -> buf [alen - 2 ] << 8 | ctx -> buf [alen - 1 ];
127+ if (len < EVP_CCM_TLS_EXPLICIT_IV_LEN )
128+ return 0 ;
129+
130+ /* Correct length for explicit iv. */
131+ len -= EVP_CCM_TLS_EXPLICIT_IV_LEN ;
132+
133+ if (!ctx -> enc ) {
134+ if (len < ctx -> M )
135+ return 0 ;
136+ /* Correct length for tag. */
137+ len -= ctx -> M ;
138+ }
139+ ctx -> buf [alen - 2 ] = (unsigned char )(len >> 8 );
140+ ctx -> buf [alen - 1 ] = (unsigned char )(len & 0xff );
141+
142+ /* Extra padding: tag appended to record. */
143+ return ctx -> M ;
144+ }
145+
115146static void * qat_aes_ccm_newctx (void * provctx , size_t keybits , int nid )
116147{
117148 QAT_PROV_AES_CCM_CTX * ctx = NULL ;
@@ -139,10 +170,12 @@ size_t qat_aes_ccm_get_ivlen(QAT_PROV_CCM_CTX * ctx)
139170 return QAT_AES_CCM_OP_VALUE - ctx -> L ;
140171}
141172
142- int qat_aes_ccm_einit (void * ctx , const unsigned char * inkey , size_t keylen ,
143- const unsigned char * iv , size_t ivlen , int enc )
173+ int qat_aes_ccm_einit (void * vctx , const unsigned char * inkey , size_t keylen ,
174+ const unsigned char * iv , size_t ivlen , const OSSL_PARAM param [] )
144175{
145176 int sts = 0 ;
177+ QAT_PROV_CCM_CTX * ctx = (QAT_PROV_CCM_CTX * ) vctx ;
178+ ctx -> enc = 1 ;
146179# if !defined(QAT20_OOT ) && !defined(QAT_HW_INTREE ) \
147180 && !defined(QAT_HW_FBSD_OOT ) && !defined(QAT_HW_FBSD_INTREE )
148181 QAT_PROV_CCM_CTX * qctx = (QAT_PROV_CCM_CTX * ) ctx ;
@@ -162,16 +195,23 @@ int qat_aes_ccm_einit(void *ctx, const unsigned char *inkey, size_t keylen,
162195 return sts ;
163196 }
164197# endif
165- if (qat_hw_aes_ccm_offload )
198+ if (qat_hw_aes_ccm_offload ) {
166199 sts = qat_aes_ccm_init (ctx , inkey , keylen , iv , ivlen , 1 );
200+ if (sts != 1 ) {
201+ QATerr (ERR_LIB_PROV , QAT_R_EINIT_OPERATION_FAILED );
202+ return sts ;
203+ }
204+ }
167205
168- return sts ;
206+ return qat_aes_ccm_set_ctx_params ( ctx , param ) ;
169207}
170208
171- int qat_aes_ccm_dinit (void * ctx , const unsigned char * inkey , size_t keylen ,
172- const unsigned char * iv , size_t ivlen , int enc )
209+ int qat_aes_ccm_dinit (void * vctx , const unsigned char * inkey , size_t keylen ,
210+ const unsigned char * iv , size_t ivlen , const OSSL_PARAM param [] )
173211{
174212 int sts = 0 ;
213+ QAT_PROV_CCM_CTX * ctx = (QAT_PROV_CCM_CTX * ) vctx ;
214+ ctx -> enc = 0 ;
175215# if !defined(QAT20_OOT ) && !defined(QAT_HW_INTREE ) \
176216 && !defined(QAT_HW_FBSD_OOT ) && !defined(QAT_HW_FBSD_INTREE )
177217 QAT_PROV_CCM_CTX * qctx = (QAT_PROV_CCM_CTX * ) ctx ;
@@ -192,10 +232,15 @@ int qat_aes_ccm_dinit(void *ctx, const unsigned char *inkey, size_t keylen,
192232 return sts ;
193233 }
194234# endif
195- if (qat_hw_aes_ccm_offload )
235+ if (qat_hw_aes_ccm_offload ) {
196236 sts = qat_aes_ccm_init (ctx , inkey , keylen , iv , ivlen , 0 );
237+ if (sts != 1 ) {
238+ QATerr (ERR_LIB_PROV , QAT_R_DINIT_OPERATION_FAILED );
239+ return sts ;
240+ }
241+ }
197242
198- return sts ;
243+ return qat_aes_ccm_set_ctx_params ( ctx , param ) ;
199244}
200245
201246int qat_aes_ccm_stream_update (void * vctx , unsigned char * out ,
@@ -239,7 +284,10 @@ int qat_aes_ccm_stream_update(void *vctx, unsigned char *out,
239284 return 0 ;
240285 }
241286 }
242-
287+ else {
288+ /* Set *outl to NULL when offload is disabled to avoid garbage values and prevent errors. */
289+ * outl = 0 ;
290+ }
243291 return 1 ;
244292
245293}
@@ -269,11 +317,12 @@ int qat_aes_ccm_stream_final(void *vctx, unsigned char *out,
269317 }
270318# endif
271319
272- if (qat_hw_aes_ccm_offload )
320+ if (qat_hw_aes_ccm_offload ) {
273321 i = qat_aes_ccm_cipher (ctx , out , outl , outsize , NULL , 0 );
274322
275- if (i <= 0 )
276- return 0 ;
323+ if (i <= 0 )
324+ return 0 ;
325+ }
277326
278327 * outl = 0 ;
279328 return 1 ;
@@ -486,6 +535,8 @@ int qat_aes_ccm_set_ctx_params(void *vctx, const OSSL_PARAM params[])
486535 if (qat_hw_aes_ccm_offload )
487536 sz = qat_aes_ccm_ctrl (ctx , EVP_CTRL_AEAD_TLS1_AAD , p -> data_size ,
488537 p -> data );
538+ else
539+ sz = qat_aes_ccm_tls_init (ctx , p -> data , p -> data_size );
489540
490541 if (sz == 0 ) {
491542 QATerr (ERR_LIB_PROV , QAT_R_INVALID_DATA );
0 commit comments