root/arch/arm64/crypto/aes-ce-core.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
   4  */
   5 
   6 #include <linux/linkage.h>
   7 #include <asm/assembler.h>
   8 
   9         .arch           armv8-a+crypto
  10 
  11 ENTRY(__aes_ce_encrypt)
  12         sub             w3, w3, #2
  13         ld1             {v0.16b}, [x2]
  14         ld1             {v1.4s}, [x0], #16
  15         cmp             w3, #10
  16         bmi             0f
  17         bne             3f
  18         mov             v3.16b, v1.16b
  19         b               2f
  20 0:      mov             v2.16b, v1.16b
  21         ld1             {v3.4s}, [x0], #16
  22 1:      aese            v0.16b, v2.16b
  23         aesmc           v0.16b, v0.16b
  24 2:      ld1             {v1.4s}, [x0], #16
  25         aese            v0.16b, v3.16b
  26         aesmc           v0.16b, v0.16b
  27 3:      ld1             {v2.4s}, [x0], #16
  28         subs            w3, w3, #3
  29         aese            v0.16b, v1.16b
  30         aesmc           v0.16b, v0.16b
  31         ld1             {v3.4s}, [x0], #16
  32         bpl             1b
  33         aese            v0.16b, v2.16b
  34         eor             v0.16b, v0.16b, v3.16b
  35         st1             {v0.16b}, [x1]
  36         ret
  37 ENDPROC(__aes_ce_encrypt)
  38 
  39 ENTRY(__aes_ce_decrypt)
  40         sub             w3, w3, #2
  41         ld1             {v0.16b}, [x2]
  42         ld1             {v1.4s}, [x0], #16
  43         cmp             w3, #10
  44         bmi             0f
  45         bne             3f
  46         mov             v3.16b, v1.16b
  47         b               2f
  48 0:      mov             v2.16b, v1.16b
  49         ld1             {v3.4s}, [x0], #16
  50 1:      aesd            v0.16b, v2.16b
  51         aesimc          v0.16b, v0.16b
  52 2:      ld1             {v1.4s}, [x0], #16
  53         aesd            v0.16b, v3.16b
  54         aesimc          v0.16b, v0.16b
  55 3:      ld1             {v2.4s}, [x0], #16
  56         subs            w3, w3, #3
  57         aesd            v0.16b, v1.16b
  58         aesimc          v0.16b, v0.16b
  59         ld1             {v3.4s}, [x0], #16
  60         bpl             1b
  61         aesd            v0.16b, v2.16b
  62         eor             v0.16b, v0.16b, v3.16b
  63         st1             {v0.16b}, [x1]
  64         ret
  65 ENDPROC(__aes_ce_decrypt)
  66 
  67 /*
  68  * __aes_ce_sub() - use the aese instruction to perform the AES sbox
  69  *                  substitution on each byte in 'input'
  70  */
  71 ENTRY(__aes_ce_sub)
  72         dup             v1.4s, w0
  73         movi            v0.16b, #0
  74         aese            v0.16b, v1.16b
  75         umov            w0, v0.s[0]
  76         ret
  77 ENDPROC(__aes_ce_sub)
  78 
  79 ENTRY(__aes_ce_invert)
  80         ld1             {v0.4s}, [x1]
  81         aesimc          v1.16b, v0.16b
  82         st1             {v1.4s}, [x0]
  83         ret
  84 ENDPROC(__aes_ce_invert)

/* [<][>][^][v][top][bottom][index][help] */