bf0afcfcbf5f525e01ecc04bd92f845ffd9262c3
[gnupg.git] / g10 / cipher-aead.c
1 /* cipher-aead.c - Enciphering filter for AEAD modes
2  * Copyright (C) 2018 Werner koch
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <https://www.gnu.org/licenses/>.
18  * SPDX-License-Identifier: GPL-3.0+
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26
27 #include "gpg.h"
28 #include "../common/status.h"
29 #include "../common/iobuf.h"
30 #include "../common/util.h"
31 #include "filter.h"
32 #include "packet.h"
33 #include "options.h"
34 #include "main.h"
35
36
37 /*
38  * This filter is used to encipher data with an AEAD algorithm
39  */
40 int
41 cipher_filter_aead (void *opaque, int control,
42                    iobuf_t a, byte *buf, size_t *ret_len)
43 {
44   cipher_filter_context_t *cfx = opaque;
45   size_t size = *ret_len;
46   int rc = 0;
47
48   if (control == IOBUFCTRL_UNDERFLOW) /* decrypt */
49     {
50       rc = -1; /* not yet used */
51     }
52   else if (control == IOBUFCTRL_FLUSH) /* encrypt */
53     {
54       log_assert (a);
55       rc = GPG_ERR_NOT_IMPLEMENTED;
56     }
57   else if (control == IOBUFCTRL_FREE)
58     {
59       gcry_cipher_close (cfx->cipher_hd);
60     }
61   else if (control == IOBUFCTRL_DESC)
62     {
63       mem2str (buf, "cipher_filter_aead", *ret_len);
64     }
65
66   return rc;
67 }