aes_ccm_mbuf.c revision 1.1 1 1.1 riastrad /* $NetBSD: aes_ccm_mbuf.c,v 1.1 2020/07/25 22:15:55 riastradh Exp $ */
2 1.1 riastrad
3 1.1 riastrad /*-
4 1.1 riastrad * Copyright (c) 2020 The NetBSD Foundation, Inc.
5 1.1 riastrad * All rights reserved.
6 1.1 riastrad *
7 1.1 riastrad * Redistribution and use in source and binary forms, with or without
8 1.1 riastrad * modification, are permitted provided that the following conditions
9 1.1 riastrad * are met:
10 1.1 riastrad * 1. Redistributions of source code must retain the above copyright
11 1.1 riastrad * notice, this list of conditions and the following disclaimer.
12 1.1 riastrad * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 riastrad * notice, this list of conditions and the following disclaimer in the
14 1.1 riastrad * documentation and/or other materials provided with the distribution.
15 1.1 riastrad *
16 1.1 riastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 1.1 riastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.1 riastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.1 riastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 1.1 riastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1 riastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1 riastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1 riastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1 riastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1 riastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1 riastrad * POSSIBILITY OF SUCH DAMAGE.
27 1.1 riastrad */
28 1.1 riastrad
29 1.1 riastrad #include <sys/cdefs.h>
30 1.1 riastrad __KERNEL_RCSID(1, "$NetBSD: aes_ccm_mbuf.c,v 1.1 2020/07/25 22:15:55 riastradh Exp $");
31 1.1 riastrad
32 1.1 riastrad #include <sys/types.h>
33 1.1 riastrad
34 1.1 riastrad #include <sys/mbuf.h>
35 1.1 riastrad
36 1.1 riastrad #include <lib/libkern/libkern.h>
37 1.1 riastrad
38 1.1 riastrad #include <crypto/aes/aes_ccm.h>
39 1.1 riastrad #include <crypto/aes/aes_ccm_mbuf.h>
40 1.1 riastrad
41 1.1 riastrad void
42 1.1 riastrad aes_ccm_enc_mbuf(struct aes_ccm *C, struct mbuf *m, size_t off, size_t len,
43 1.1 riastrad void *tag)
44 1.1 riastrad {
45 1.1 riastrad uint8_t *p;
46 1.1 riastrad size_t seglen;
47 1.1 riastrad
48 1.1 riastrad while (off >= m->m_len) {
49 1.1 riastrad KASSERT(m->m_next);
50 1.1 riastrad m = m->m_next;
51 1.1 riastrad off -= m->m_len;
52 1.1 riastrad }
53 1.1 riastrad
54 1.1 riastrad for (; len > 0; m = m->m_next, off = 0, len -= seglen) {
55 1.1 riastrad KASSERT(m->m_len >= off);
56 1.1 riastrad p = mtod(m, uint8_t *) + off;
57 1.1 riastrad seglen = MIN(m->m_len - off, len);
58 1.1 riastrad aes_ccm_enc(C, p, p, seglen);
59 1.1 riastrad }
60 1.1 riastrad
61 1.1 riastrad aes_ccm_tag(C, tag);
62 1.1 riastrad }
63 1.1 riastrad
64 1.1 riastrad int
65 1.1 riastrad aes_ccm_dec_mbuf(struct aes_ccm *C, struct mbuf *m0, size_t off0, size_t len0,
66 1.1 riastrad const void *tag)
67 1.1 riastrad {
68 1.1 riastrad struct mbuf *m;
69 1.1 riastrad size_t off, len;
70 1.1 riastrad uint8_t *p;
71 1.1 riastrad size_t seglen;
72 1.1 riastrad
73 1.1 riastrad while (off0 >= m0->m_len) {
74 1.1 riastrad KASSERT(m0->m_next);
75 1.1 riastrad m0 = m0->m_next;
76 1.1 riastrad off0 -= m0->m_len;
77 1.1 riastrad }
78 1.1 riastrad
79 1.1 riastrad for (m = m0, off = off0, len = len0;
80 1.1 riastrad len > 0;
81 1.1 riastrad m = m->m_next, off = 0, len -= seglen) {
82 1.1 riastrad KASSERT(m->m_len >= off);
83 1.1 riastrad p = mtod(m, uint8_t *) + off;
84 1.1 riastrad seglen = MIN(m->m_len - off, len);
85 1.1 riastrad aes_ccm_dec(C, p, p, seglen);
86 1.1 riastrad }
87 1.1 riastrad
88 1.1 riastrad if (aes_ccm_verify(C, tag))
89 1.1 riastrad return 1;
90 1.1 riastrad
91 1.1 riastrad /*
92 1.1 riastrad * Verification failed. Zero the mbuf so we don't accidentally
93 1.1 riastrad * leak anything about it.
94 1.1 riastrad */
95 1.1 riastrad for (m = m0, off = off0, len = len0;
96 1.1 riastrad len > 0;
97 1.1 riastrad m = m->m_next, off = 0, len -= seglen) {
98 1.1 riastrad KASSERT(m->m_len >= off);
99 1.1 riastrad p = mtod(m, uint8_t *) + off;
100 1.1 riastrad seglen = MIN(m->m_len - off, len);
101 1.1 riastrad memset(p, 0, seglen);
102 1.1 riastrad }
103 1.1 riastrad
104 1.1 riastrad return 0;
105 1.1 riastrad }
106