Check function return value in libtls
authorinoguchi <inoguchi@openbsd.org>
Wed, 19 Jan 2022 11:10:55 +0000 (11:10 +0000)
committerinoguchi <inoguchi@openbsd.org>
Wed, 19 Jan 2022 11:10:55 +0000 (11:10 +0000)
EVP_EncryptInit_ex, EVP_DecryptInit_ex and HMAC_Init_ex are possible to
fail and return error.
Error from these functions will be fatal for the callback, and I choose to
return -1.
SSL_CTX_set_tlsext_ticket_key_cb.3 explains the return value of callback.

This also could fix Coverity CID 345319.

ok jsing@ tb@

lib/libtls/tls_server.c

index 0a8ec47..72f797b 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tls_server.c,v 1.47 2021/06/14 03:53:59 tb Exp $ */
+/* $OpenBSD: tls_server.c,v 1.48 2022/01/19 11:10:55 inoguchi Exp $ */
 /*
  * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
  *
@@ -185,10 +185,16 @@ tls_server_ticket_cb(SSL *ssl, unsigned char *keyname, unsigned char *iv,
 
                memcpy(keyname, key->key_name, sizeof(key->key_name));
                arc4random_buf(iv, EVP_MAX_IV_LENGTH);
-               EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL,
-                   key->aes_key, iv);
-               HMAC_Init_ex(hctx, key->hmac_key, sizeof(key->hmac_key),
-                   EVP_sha256(), NULL);
+               if (!EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL,
+                   key->aes_key, iv)) {
+                       tls_set_errorx(tls_ctx, "failed to init encrypt");
+                       return (-1);
+               }
+               if (!HMAC_Init_ex(hctx, key->hmac_key, sizeof(key->hmac_key),
+                   EVP_sha256(), NULL)) {
+                       tls_set_errorx(tls_ctx, "failed to init hmac");
+                       return (-1);
+               }
                return (0);
        } else {
                /* get key by name */
@@ -196,10 +202,16 @@ tls_server_ticket_cb(SSL *ssl, unsigned char *keyname, unsigned char *iv,
                if (key == NULL)
                        return (0);
 
-               EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL,
-                   key->aes_key, iv);
-               HMAC_Init_ex(hctx, key->hmac_key, sizeof(key->hmac_key),
-                   EVP_sha256(), NULL);
+               if (!EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL,
+                   key->aes_key, iv)) {
+                       tls_set_errorx(tls_ctx, "failed to init decrypt");
+                       return (-1);
+               }
+               if (!HMAC_Init_ex(hctx, key->hmac_key, sizeof(key->hmac_key),
+                   EVP_sha256(), NULL)) {
+                       tls_set_errorx(tls_ctx, "failed to init hmac");
+                       return (-1);
+               }
 
                /* time to renew the ticket? is it the primary key? */
                if (key != &tls_ctx->config->ticket_keys[0])