xref: /netbsd-src/external/mpl/dhcp/bind/dist/lib/isc/aes.c (revision 4afad4b7fa6d4a0d3dedf41d1587a7250710ae54)
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