1 /* SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause */
3 // This file is dual-licensed, meaning that you can use it under your
4 // choice of either of the following two licenses:
6 // Copyright 2023 The OpenSSL Project Authors. All Rights Reserved.
8 // Licensed under the Apache License 2.0 (the "License"). You can obtain
9 // a copy in the file LICENSE in the source distribution or at
10 // https://www.openssl.org/source/license.html
14 // Copyright (c) 2023, Christoph Müllner <christoph.muellner@vrull.eu>
15 // Copyright (c) 2023, Phoebe Chen <phoebe.chen@sifive.com>
16 // Copyright (c) 2023, Jerry Shih <jerry.shih@sifive.com>
17 // Copyright 2024 Google LLC
18 // All rights reserved.
20 // Redistribution and use in source and binary forms, with or without
21 // modification, are permitted provided that the following conditions
23 // 1. Redistributions of source code must retain the above copyright
24 // notice, this list of conditions and the following disclaimer.
25 // 2. Redistributions in binary form must reproduce the above copyright
26 // notice, this list of conditions and the following disclaimer in the
27 // documentation and/or other materials provided with the distribution.
29 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
32 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
34 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
35 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
39 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 // This file contains macros that are shared by the other aes-*.S files. The
42 // generated code of these macros depends on the following RISC-V extensions:
44 // - RISC-V Vector ('V') with VLEN >= 128
45 // - RISC-V Vector AES block cipher extension ('Zvkned')
47 // Loads the AES round keys from \keyp into vector registers and jumps to code
48 // specific to the length of the key. Specifically:
49 // - If AES-128, loads round keys into v1-v11 and jumps to \label128.
50 // - If AES-192, loads round keys into v1-v13 and jumps to \label192.
51 // - If AES-256, loads round keys into v1-v15 and continues onwards.
53 // Also sets vl=4 and vtype=e32,m1,ta,ma. Clobbers t0 and t1.
54 .macro aes_begin keyp, label128, label192
55 lwu t0, 480(\keyp) // t0 = key length in bytes
56 li t1, 24 // t1 = key length for AES-192
57 vsetivli zero, 4, e32, m1, ta, ma
79 blt t0, t1, \label128 // If AES-128, goto label128.
84 beq t0, t1, \label192 // If AES-192, goto label192.
85 // Else, it's AES-256.
92 // Encrypts \data using zvkned instructions, using the round keys loaded into
93 // v1-v11 (for AES-128), v1-v13 (for AES-192), or v1-v15 (for AES-256). \keylen
94 // is the AES key length in bits. vl and vtype must already be set
95 // appropriately. Note that if vl > 4, multiple blocks are encrypted.
96 .macro aes_encrypt data, keylen
109 .elseif \keylen == 192
122 // Same as aes_encrypt, but decrypts instead of encrypts.
123 .macro aes_decrypt data, keylen
126 .elseif \keylen == 192
149 // Expands to aes_encrypt or aes_decrypt according to \enc, which is 1 or 0.
150 .macro aes_crypt data, enc, keylen
152 aes_encrypt \data, \keylen
154 aes_decrypt \data, \keylen