Raise an error on syscall failure in tls_retry_write_records
[openssl.git] / providers / implementations / ciphers / cipher_aes_ocb_hw.c
1 /*
2  * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 /*
11  * This file uses the low level AES functions (which are deprecated for
12  * non-internal use) in order to implement provider AES ciphers.
13  */
14 #include "internal/deprecated.h"
15
16 #include "cipher_aes_ocb.h"
17
18 #define OCB_SET_KEY_FN(fn_set_enc_key, fn_set_dec_key,                         \
19                        fn_block_enc, fn_block_dec,                             \
20                        fn_stream_enc, fn_stream_dec)                           \
21 fn_set_enc_key(key, keylen * 8, &ctx->ksenc.ks);                               \
22 fn_set_dec_key(key, keylen * 8, &ctx->ksdec.ks);                               \
23 if (!CRYPTO_ocb128_init(&ctx->ocb, &ctx->ksenc.ks, &ctx->ksdec.ks,             \
24                         (block128_f)fn_block_enc, (block128_f)fn_block_dec,    \
25                         ctx->base.enc ? (ocb128_f)fn_stream_enc :              \
26                                         (ocb128_f)fn_stream_dec))              \
27     return 0;                                                                  \
28 ctx->key_set = 1
29
30
31 static int cipher_hw_aes_ocb_generic_initkey(PROV_CIPHER_CTX *vctx,
32                                              const unsigned char *key,
33                                              size_t keylen)
34 {
35     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
36
37 /*
38  * We set both the encrypt and decrypt key here because decrypt
39  * needs both. (i.e- AAD uses encrypt).
40  */
41 # ifdef HWAES_CAPABLE
42     if (HWAES_CAPABLE) {
43         OCB_SET_KEY_FN(HWAES_set_encrypt_key, HWAES_set_decrypt_key,
44                        HWAES_encrypt, HWAES_decrypt,
45                        HWAES_ocb_encrypt, HWAES_ocb_decrypt);
46     } else
47 # endif
48 # ifdef VPAES_CAPABLE
49     if (VPAES_CAPABLE) {
50         OCB_SET_KEY_FN(vpaes_set_encrypt_key, vpaes_set_decrypt_key,
51                        vpaes_encrypt, vpaes_decrypt, NULL, NULL);
52     } else
53 # endif
54     {
55         OCB_SET_KEY_FN(AES_set_encrypt_key, AES_set_decrypt_key,
56                        AES_encrypt, AES_decrypt, NULL, NULL);
57     }
58     return 1;
59 }
60
61 # if defined(AESNI_CAPABLE)
62
63 static int cipher_hw_aes_ocb_aesni_initkey(PROV_CIPHER_CTX *vctx,
64                                            const unsigned char *key,
65                                            size_t keylen)
66 {
67     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
68
69     OCB_SET_KEY_FN(aesni_set_encrypt_key, aesni_set_decrypt_key,
70                    aesni_encrypt, aesni_decrypt,
71                    aesni_ocb_encrypt, aesni_ocb_decrypt);
72     return 1;
73 }
74
75 # define PROV_CIPHER_HW_declare()                                              \
76 static const PROV_CIPHER_HW aesni_ocb = {                                      \
77     cipher_hw_aes_ocb_aesni_initkey,                                           \
78     NULL                                                                       \
79 };
80 # define PROV_CIPHER_HW_select()                                               \
81     if (AESNI_CAPABLE)                                                         \
82         return &aesni_ocb;
83
84 #elif defined(SPARC_AES_CAPABLE)
85
86 static int cipher_hw_aes_ocb_t4_initkey(PROV_CIPHER_CTX *vctx,
87                                         const unsigned char *key,
88                                         size_t keylen)
89 {
90     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
91
92     OCB_SET_KEY_FN(aes_t4_set_encrypt_key, aes_t4_set_decrypt_key,
93                    aes_t4_encrypt, aes_t4_decrypt, NULL, NULL);
94     return 1;
95 }
96
97 # define PROV_CIPHER_HW_declare()                                              \
98 static const PROV_CIPHER_HW aes_t4_ocb = {                                     \
99     cipher_hw_aes_ocb_t4_initkey,                                              \
100     NULL                                                                       \
101 };
102 # define PROV_CIPHER_HW_select()                                               \
103     if (SPARC_AES_CAPABLE)                                                     \
104         return &aes_t4_ocb;
105 #else
106 # define PROV_CIPHER_HW_declare()
107 # define PROV_CIPHER_HW_select()
108 # endif
109
110 static const PROV_CIPHER_HW aes_generic_ocb = {
111     cipher_hw_aes_ocb_generic_initkey,
112     NULL
113 };
114 PROV_CIPHER_HW_declare()
115 const PROV_CIPHER_HW *PROV_CIPHER_HW_aes_ocb(size_t keybits)
116 {
117     PROV_CIPHER_HW_select()
118     return &aes_generic_ocb;
119 }
120
121