Lines Matching refs:ctx

20 static int gcm_tls_iv_set_fixed(PROV_GCM_CTX *ctx, unsigned char *iv,
22 static int gcm_tls_cipher(PROV_GCM_CTX *ctx, unsigned char *out, size_t *padlen,
24 static int gcm_cipher_internal(PROV_GCM_CTX *ctx, unsigned char *out,
28 void ossl_gcm_initctx(void *provctx, PROV_GCM_CTX *ctx, size_t keybits, in ossl_gcm_initctx() argument
31 ctx->pad = 1; in ossl_gcm_initctx()
32 ctx->mode = EVP_CIPH_GCM_MODE; in ossl_gcm_initctx()
33 ctx->taglen = UNINITIALISED_SIZET; in ossl_gcm_initctx()
34 ctx->tls_aad_len = UNINITIALISED_SIZET; in ossl_gcm_initctx()
35 ctx->ivlen = (EVP_GCM_TLS_FIXED_IV_LEN + EVP_GCM_TLS_EXPLICIT_IV_LEN); in ossl_gcm_initctx()
36 ctx->keylen = keybits / 8; in ossl_gcm_initctx()
37 ctx->hw = hw; in ossl_gcm_initctx()
38 ctx->libctx = PROV_LIBCTX_OF(provctx); in ossl_gcm_initctx()
45 PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx; in gcm_init() local
50 ctx->enc = enc; in gcm_init()
53 if (ivlen == 0 || ivlen > sizeof(ctx->iv)) { in gcm_init()
57 ctx->ivlen = ivlen; in gcm_init()
58 memcpy(ctx->iv, iv, ivlen); in gcm_init()
59 ctx->iv_state = IV_STATE_BUFFERED; in gcm_init()
63 if (keylen != ctx->keylen) { in gcm_init()
67 if (!ctx->hw->setkey(ctx, key, ctx->keylen)) in gcm_init()
70 return ossl_gcm_set_ctx_params(ctx, params); in gcm_init()
103 static int getivgen(PROV_GCM_CTX *ctx, unsigned char *out, size_t olen) in getivgen() argument
105 if (!ctx->iv_gen in getivgen()
106 || !ctx->key_set in getivgen()
107 || !ctx->hw->setiv(ctx, ctx->iv, ctx->ivlen)) in getivgen()
109 if (olen == 0 || olen > ctx->ivlen) in getivgen()
110 olen = ctx->ivlen; in getivgen()
111 memcpy(out, ctx->iv + ctx->ivlen - olen, olen); in getivgen()
116 ctr64_inc(ctx->iv + ctx->ivlen - 8); in getivgen()
117 ctx->iv_state = IV_STATE_COPIED; in getivgen()
121 static int setivinv(PROV_GCM_CTX *ctx, unsigned char *in, size_t inl) in setivinv() argument
123 if (!ctx->iv_gen in setivinv()
124 || !ctx->key_set in setivinv()
125 || ctx->enc) in setivinv()
128 memcpy(ctx->iv + ctx->ivlen - inl, in, inl); in setivinv()
129 if (!ctx->hw->setiv(ctx, ctx->iv, ctx->ivlen)) in setivinv()
131 ctx->iv_state = IV_STATE_COPIED; in setivinv()
137 PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx; in ossl_gcm_get_ctx_params() local
142 if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->ivlen)) { in ossl_gcm_get_ctx_params()
147 if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->keylen)) { in ossl_gcm_get_ctx_params()
153 size_t taglen = (ctx->taglen != UNINITIALISED_SIZET) ? ctx->taglen : in ossl_gcm_get_ctx_params()
164 if (ctx->iv_state == IV_STATE_UNINITIALISED) in ossl_gcm_get_ctx_params()
166 if (ctx->ivlen > p->data_size) { in ossl_gcm_get_ctx_params()
170 if (!OSSL_PARAM_set_octet_string(p, ctx->iv, ctx->ivlen) in ossl_gcm_get_ctx_params()
171 && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, ctx->ivlen)) { in ossl_gcm_get_ctx_params()
179 if (ctx->iv_state == IV_STATE_UNINITIALISED) in ossl_gcm_get_ctx_params()
181 if (ctx->ivlen > p->data_size) { in ossl_gcm_get_ctx_params()
185 if (!OSSL_PARAM_set_octet_string(p, ctx->iv, ctx->ivlen) in ossl_gcm_get_ctx_params()
186 && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, ctx->ivlen)) { in ossl_gcm_get_ctx_params()
193 if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->tls_aad_pad_sz)) { in ossl_gcm_get_ctx_params()
202 || !ctx->enc in ossl_gcm_get_ctx_params()
203 || ctx->taglen == UNINITIALISED_SIZET) { in ossl_gcm_get_ctx_params()
207 if (!OSSL_PARAM_set_octet_string(p, ctx->buf, sz)) { in ossl_gcm_get_ctx_params()
216 || !getivgen(ctx, p->data, p->data_size)) in ossl_gcm_get_ctx_params()
224 PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx; in ossl_gcm_set_ctx_params() local
234 vp = ctx->buf; in ossl_gcm_set_ctx_params()
239 if (sz == 0 || ctx->enc) { in ossl_gcm_set_ctx_params()
243 ctx->taglen = sz; in ossl_gcm_set_ctx_params()
252 if (sz == 0 || sz > sizeof(ctx->iv)) { in ossl_gcm_set_ctx_params()
256 ctx->ivlen = sz; in ossl_gcm_set_ctx_params()
265 sz = gcm_tls_init(ctx, p->data, p->data_size); in ossl_gcm_set_ctx_params()
270 ctx->tls_aad_pad_sz = sz; in ossl_gcm_set_ctx_params()
279 if (gcm_tls_iv_set_fixed(ctx, p->data, p->data_size) == 0) { in ossl_gcm_set_ctx_params()
288 || !setivinv(ctx, p->data, p->data_size)) in ossl_gcm_set_ctx_params()
299 PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx; in ossl_gcm_stream_update() local
311 if (gcm_cipher_internal(ctx, out, outl, in, inl) <= 0) { in ossl_gcm_stream_update()
321 PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx; in ossl_gcm_stream_final() local
327 i = gcm_cipher_internal(ctx, out, outl, NULL, 0); in ossl_gcm_stream_final()
339 PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx; in ossl_gcm_cipher() local
349 if (gcm_cipher_internal(ctx, out, outl, in, inl) <= 0) in ossl_gcm_cipher()
364 static int gcm_iv_generate(PROV_GCM_CTX *ctx, int offset) in gcm_iv_generate() argument
366 int sz = ctx->ivlen - offset; in gcm_iv_generate()
369 if (sz <= 0 || ctx->ivlen < GCM_IV_DEFAULT_SIZE) in gcm_iv_generate()
373 if (RAND_bytes_ex(ctx->libctx, ctx->iv + offset, sz, 0) <= 0) in gcm_iv_generate()
375 ctx->iv_state = IV_STATE_BUFFERED; in gcm_iv_generate()
376 ctx->iv_gen_rand = 1; in gcm_iv_generate()
380 static int gcm_cipher_internal(PROV_GCM_CTX *ctx, unsigned char *out, in gcm_cipher_internal() argument
386 const PROV_GCM_HW *hw = ctx->hw; in gcm_cipher_internal()
388 if (ctx->tls_aad_len != UNINITIALISED_SIZET) in gcm_cipher_internal()
389 return gcm_tls_cipher(ctx, out, padlen, in, len); in gcm_cipher_internal()
391 if (!ctx->key_set || ctx->iv_state == IV_STATE_FINISHED) in gcm_cipher_internal()
400 if (ctx->iv_state == IV_STATE_UNINITIALISED) { in gcm_cipher_internal()
401 if (!ctx->enc || !gcm_iv_generate(ctx, 0)) in gcm_cipher_internal()
405 if (ctx->iv_state == IV_STATE_BUFFERED) { in gcm_cipher_internal()
406 if (!hw->setiv(ctx, ctx->iv, ctx->ivlen)) in gcm_cipher_internal()
408 ctx->iv_state = IV_STATE_COPIED; in gcm_cipher_internal()
414 if (!hw->aadupdate(ctx, in, len)) in gcm_cipher_internal()
418 if (!hw->cipherupdate(ctx, in, len, out)) in gcm_cipher_internal()
423 if (!ctx->enc && ctx->taglen == UNINITIALISED_SIZET) in gcm_cipher_internal()
425 if (!hw->cipherfinal(ctx, ctx->buf)) in gcm_cipher_internal()
427 ctx->iv_state = IV_STATE_FINISHED; /* Don't reuse the IV */ in gcm_cipher_internal()
470 static int gcm_tls_iv_set_fixed(PROV_GCM_CTX *ctx, unsigned char *iv, in gcm_tls_iv_set_fixed() argument
475 memcpy(ctx->iv, iv, ctx->ivlen); in gcm_tls_iv_set_fixed()
476 ctx->iv_gen = 1; in gcm_tls_iv_set_fixed()
477 ctx->iv_state = IV_STATE_BUFFERED; in gcm_tls_iv_set_fixed()
482 || (ctx->ivlen - (int)len) < EVP_GCM_TLS_EXPLICIT_IV_LEN) in gcm_tls_iv_set_fixed()
485 memcpy(ctx->iv, iv, len); in gcm_tls_iv_set_fixed()
486 if (ctx->enc in gcm_tls_iv_set_fixed()
487 && RAND_bytes_ex(ctx->libctx, ctx->iv + len, ctx->ivlen - len, 0) <= 0) in gcm_tls_iv_set_fixed()
489 ctx->iv_gen = 1; in gcm_tls_iv_set_fixed()
490 ctx->iv_state = IV_STATE_BUFFERED; in gcm_tls_iv_set_fixed()
500 static int gcm_tls_cipher(PROV_GCM_CTX *ctx, unsigned char *out, size_t *padlen, in gcm_tls_cipher() argument
508 if (!ossl_prov_is_running() || !ctx->key_set) in gcm_tls_cipher()
521 if (ctx->enc && ++ctx->tls_enc_records == 0) { in gcm_tls_cipher()
530 if (ctx->enc) { in gcm_tls_cipher()
531 if (!getivgen(ctx, out, arg)) in gcm_tls_cipher()
534 if (!setivinv(ctx, out, arg)) in gcm_tls_cipher()
543 tag = ctx->enc ? out + len : (unsigned char *)in + len; in gcm_tls_cipher()
544 if (!ctx->hw->oneshot(ctx, ctx->buf, ctx->tls_aad_len, in, len, out, tag, in gcm_tls_cipher()
546 if (!ctx->enc) in gcm_tls_cipher()
550 if (ctx->enc) in gcm_tls_cipher()
557 ctx->iv_state = IV_STATE_FINISHED; in gcm_tls_cipher()
558 ctx->tls_aad_len = UNINITIALISED_SIZET; in gcm_tls_cipher()