1 /* $NetBSD: aes.c,v 1.1 2024/02/18 20:57:48 christos Exp $ */
2
3 /*
4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 *
6 * SPDX-License-Identifier: MPL-2.0
7 *
8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 *
12 * See the COPYRIGHT file distributed with this work for additional
13 * information regarding copyright ownership.
14 */
15
16 /*! \file isc/aes.c */
17
18 #include <openssl/evp.h>
19 #include <openssl/opensslv.h>
20
21 #include <isc/aes.h>
22 #include <isc/assertions.h>
23 #include <isc/platform.h>
24 #include <isc/string.h>
25 #include <isc/types.h>
26 #include <isc/util.h>
27
28 void
isc_aes128_crypt(const unsigned char * key,const unsigned char * in,unsigned char * out)29 isc_aes128_crypt(const unsigned char *key, const unsigned char *in,
30 unsigned char *out) {
31 EVP_CIPHER_CTX *c;
32 int len;
33
34 c = EVP_CIPHER_CTX_new();
35 RUNTIME_CHECK(c != NULL);
36 RUNTIME_CHECK(EVP_EncryptInit(c, EVP_aes_128_ecb(), key, NULL) == 1);
37 EVP_CIPHER_CTX_set_padding(c, 0);
38 RUNTIME_CHECK(
39 EVP_EncryptUpdate(c, out, &len, in, ISC_AES_BLOCK_LENGTH) == 1);
40 RUNTIME_CHECK(len == ISC_AES_BLOCK_LENGTH);
41 EVP_CIPHER_CTX_free(c);
42 }
43
44 void
isc_aes192_crypt(const unsigned char * key,const unsigned char * in,unsigned char * out)45 isc_aes192_crypt(const unsigned char *key, const unsigned char *in,
46 unsigned char *out) {
47 EVP_CIPHER_CTX *c;
48 int len;
49
50 c = EVP_CIPHER_CTX_new();
51 RUNTIME_CHECK(c != NULL);
52 RUNTIME_CHECK(EVP_EncryptInit(c, EVP_aes_192_ecb(), key, NULL) == 1);
53 EVP_CIPHER_CTX_set_padding(c, 0);
54 RUNTIME_CHECK(
55 EVP_EncryptUpdate(c, out, &len, in, ISC_AES_BLOCK_LENGTH) == 1);
56 RUNTIME_CHECK(len == ISC_AES_BLOCK_LENGTH);
57 EVP_CIPHER_CTX_free(c);
58 }
59
60 void
isc_aes256_crypt(const unsigned char * key,const unsigned char * in,unsigned char * out)61 isc_aes256_crypt(const unsigned char *key, const unsigned char *in,
62 unsigned char *out) {
63 EVP_CIPHER_CTX *c;
64 int len;
65
66 c = EVP_CIPHER_CTX_new();
67 RUNTIME_CHECK(c != NULL);
68 RUNTIME_CHECK(EVP_EncryptInit(c, EVP_aes_256_ecb(), key, NULL) == 1);
69 EVP_CIPHER_CTX_set_padding(c, 0);
70 RUNTIME_CHECK(
71 EVP_EncryptUpdate(c, out, &len, in, ISC_AES_BLOCK_LENGTH) == 1);
72 RUNTIME_CHECK(len == ISC_AES_BLOCK_LENGTH);
73 EVP_CIPHER_CTX_free(c);
74 }
75