...

Text file src/crypto/aes/asm_amd64.s

Documentation: crypto/aes

     1// Copyright 2012 The Go Authors. All rights reserved.
     2// Use of this source code is governed by a BSD-style
     3// license that can be found in the LICENSE file.
     4
     5//go:build !purego
     6
     7#include "textflag.h"
     8
     9// func encryptBlockAsm(nr int, xk *uint32, dst, src *byte)
    10TEXT ·encryptBlockAsm(SB),NOSPLIT,$0
    11	MOVQ nr+0(FP), CX
    12	MOVQ xk+8(FP), AX
    13	MOVQ dst+16(FP), DX
    14	MOVQ src+24(FP), BX
    15	MOVUPS 0(AX), X1
    16	MOVUPS 0(BX), X0
    17	ADDQ $16, AX
    18	PXOR X1, X0
    19	SUBQ $12, CX
    20	JE Lenc192
    21	JB Lenc128
    22Lenc256:
    23	MOVUPS 0(AX), X1
    24	AESENC X1, X0
    25	MOVUPS 16(AX), X1
    26	AESENC X1, X0
    27	ADDQ $32, AX
    28Lenc192:
    29	MOVUPS 0(AX), X1
    30	AESENC X1, X0
    31	MOVUPS 16(AX), X1
    32	AESENC X1, X0
    33	ADDQ $32, AX
    34Lenc128:
    35	MOVUPS 0(AX), X1
    36	AESENC X1, X0
    37	MOVUPS 16(AX), X1
    38	AESENC X1, X0
    39	MOVUPS 32(AX), X1
    40	AESENC X1, X0
    41	MOVUPS 48(AX), X1
    42	AESENC X1, X0
    43	MOVUPS 64(AX), X1
    44	AESENC X1, X0
    45	MOVUPS 80(AX), X1
    46	AESENC X1, X0
    47	MOVUPS 96(AX), X1
    48	AESENC X1, X0
    49	MOVUPS 112(AX), X1
    50	AESENC X1, X0
    51	MOVUPS 128(AX), X1
    52	AESENC X1, X0
    53	MOVUPS 144(AX), X1
    54	AESENCLAST X1, X0
    55	MOVUPS X0, 0(DX)
    56	RET
    57
    58// func decryptBlockAsm(nr int, xk *uint32, dst, src *byte)
    59TEXT ·decryptBlockAsm(SB),NOSPLIT,$0
    60	MOVQ nr+0(FP), CX
    61	MOVQ xk+8(FP), AX
    62	MOVQ dst+16(FP), DX
    63	MOVQ src+24(FP), BX
    64	MOVUPS 0(AX), X1
    65	MOVUPS 0(BX), X0
    66	ADDQ $16, AX
    67	PXOR X1, X0
    68	SUBQ $12, CX
    69	JE Ldec192
    70	JB Ldec128
    71Ldec256:
    72	MOVUPS 0(AX), X1
    73	AESDEC X1, X0
    74	MOVUPS 16(AX), X1
    75	AESDEC X1, X0
    76	ADDQ $32, AX
    77Ldec192:
    78	MOVUPS 0(AX), X1
    79	AESDEC X1, X0
    80	MOVUPS 16(AX), X1
    81	AESDEC X1, X0
    82	ADDQ $32, AX
    83Ldec128:
    84	MOVUPS 0(AX), X1
    85	AESDEC X1, X0
    86	MOVUPS 16(AX), X1
    87	AESDEC X1, X0
    88	MOVUPS 32(AX), X1
    89	AESDEC X1, X0
    90	MOVUPS 48(AX), X1
    91	AESDEC X1, X0
    92	MOVUPS 64(AX), X1
    93	AESDEC X1, X0
    94	MOVUPS 80(AX), X1
    95	AESDEC X1, X0
    96	MOVUPS 96(AX), X1
    97	AESDEC X1, X0
    98	MOVUPS 112(AX), X1
    99	AESDEC X1, X0
   100	MOVUPS 128(AX), X1
   101	AESDEC X1, X0
   102	MOVUPS 144(AX), X1
   103	AESDECLAST X1, X0
   104	MOVUPS X0, 0(DX)
   105	RET
   106
   107// func expandKeyAsm(nr int, key *byte, enc, dec *uint32) {
   108// Note that round keys are stored in uint128 format, not uint32
   109TEXT ·expandKeyAsm(SB),NOSPLIT,$0
   110	MOVQ nr+0(FP), CX
   111	MOVQ key+8(FP), AX
   112	MOVQ enc+16(FP), BX
   113	MOVQ dec+24(FP), DX
   114	MOVUPS (AX), X0
   115	// enc
   116	MOVUPS X0, (BX)
   117	ADDQ $16, BX
   118	PXOR X4, X4 // _expand_key_* expect X4 to be zero
   119	CMPL CX, $12
   120	JE Lexp_enc192
   121	JB Lexp_enc128
   122Lexp_enc256:
   123	MOVUPS 16(AX), X2
   124	MOVUPS X2, (BX)
   125	ADDQ $16, BX
   126	AESKEYGENASSIST $0x01, X2, X1
   127	CALL _expand_key_256a<>(SB)
   128	AESKEYGENASSIST $0x01, X0, X1
   129	CALL _expand_key_256b<>(SB)
   130	AESKEYGENASSIST $0x02, X2, X1
   131	CALL _expand_key_256a<>(SB)
   132	AESKEYGENASSIST $0x02, X0, X1
   133	CALL _expand_key_256b<>(SB)
   134	AESKEYGENASSIST $0x04, X2, X1
   135	CALL _expand_key_256a<>(SB)
   136	AESKEYGENASSIST $0x04, X0, X1
   137	CALL _expand_key_256b<>(SB)
   138	AESKEYGENASSIST $0x08, X2, X1
   139	CALL _expand_key_256a<>(SB)
   140	AESKEYGENASSIST $0x08, X0, X1
   141	CALL _expand_key_256b<>(SB)
   142	AESKEYGENASSIST $0x10, X2, X1
   143	CALL _expand_key_256a<>(SB)
   144	AESKEYGENASSIST $0x10, X0, X1
   145	CALL _expand_key_256b<>(SB)
   146	AESKEYGENASSIST $0x20, X2, X1
   147	CALL _expand_key_256a<>(SB)
   148	AESKEYGENASSIST $0x20, X0, X1
   149	CALL _expand_key_256b<>(SB)
   150	AESKEYGENASSIST $0x40, X2, X1
   151	CALL _expand_key_256a<>(SB)
   152	JMP Lexp_dec
   153Lexp_enc192:
   154	MOVQ 16(AX), X2
   155	AESKEYGENASSIST $0x01, X2, X1
   156	CALL _expand_key_192a<>(SB)
   157	AESKEYGENASSIST $0x02, X2, X1
   158	CALL _expand_key_192b<>(SB)
   159	AESKEYGENASSIST $0x04, X2, X1
   160	CALL _expand_key_192a<>(SB)
   161	AESKEYGENASSIST $0x08, X2, X1
   162	CALL _expand_key_192b<>(SB)
   163	AESKEYGENASSIST $0x10, X2, X1
   164	CALL _expand_key_192a<>(SB)
   165	AESKEYGENASSIST $0x20, X2, X1
   166	CALL _expand_key_192b<>(SB)
   167	AESKEYGENASSIST $0x40, X2, X1
   168	CALL _expand_key_192a<>(SB)
   169	AESKEYGENASSIST $0x80, X2, X1
   170	CALL _expand_key_192b<>(SB)
   171	JMP Lexp_dec
   172Lexp_enc128:
   173	AESKEYGENASSIST $0x01, X0, X1
   174	CALL _expand_key_128<>(SB)
   175	AESKEYGENASSIST $0x02, X0, X1
   176	CALL _expand_key_128<>(SB)
   177	AESKEYGENASSIST $0x04, X0, X1
   178	CALL _expand_key_128<>(SB)
   179	AESKEYGENASSIST $0x08, X0, X1
   180	CALL _expand_key_128<>(SB)
   181	AESKEYGENASSIST $0x10, X0, X1
   182	CALL _expand_key_128<>(SB)
   183	AESKEYGENASSIST $0x20, X0, X1
   184	CALL _expand_key_128<>(SB)
   185	AESKEYGENASSIST $0x40, X0, X1
   186	CALL _expand_key_128<>(SB)
   187	AESKEYGENASSIST $0x80, X0, X1
   188	CALL _expand_key_128<>(SB)
   189	AESKEYGENASSIST $0x1b, X0, X1
   190	CALL _expand_key_128<>(SB)
   191	AESKEYGENASSIST $0x36, X0, X1
   192	CALL _expand_key_128<>(SB)
   193Lexp_dec:
   194	// dec
   195	SUBQ $16, BX
   196	MOVUPS (BX), X1
   197	MOVUPS X1, (DX)
   198	DECQ CX
   199Lexp_dec_loop:
   200	MOVUPS -16(BX), X1
   201	AESIMC X1, X0
   202	MOVUPS X0, 16(DX)
   203	SUBQ $16, BX
   204	ADDQ $16, DX
   205	DECQ CX
   206	JNZ Lexp_dec_loop
   207	MOVUPS -16(BX), X0
   208	MOVUPS X0, 16(DX)
   209	RET
   210
   211TEXT _expand_key_128<>(SB),NOSPLIT,$0
   212	PSHUFD $0xff, X1, X1
   213	SHUFPS $0x10, X0, X4
   214	PXOR X4, X0
   215	SHUFPS $0x8c, X0, X4
   216	PXOR X4, X0
   217	PXOR X1, X0
   218	MOVUPS X0, (BX)
   219	ADDQ $16, BX
   220	RET
   221
   222TEXT _expand_key_192a<>(SB),NOSPLIT,$0
   223	PSHUFD $0x55, X1, X1
   224	SHUFPS $0x10, X0, X4
   225	PXOR X4, X0
   226	SHUFPS $0x8c, X0, X4
   227	PXOR X4, X0
   228	PXOR X1, X0
   229
   230	MOVAPS X2, X5
   231	MOVAPS X2, X6
   232	PSLLDQ $0x4, X5
   233	PSHUFD $0xff, X0, X3
   234	PXOR X3, X2
   235	PXOR X5, X2
   236
   237	MOVAPS X0, X1
   238	SHUFPS $0x44, X0, X6
   239	MOVUPS X6, (BX)
   240	SHUFPS $0x4e, X2, X1
   241	MOVUPS X1, 16(BX)
   242	ADDQ $32, BX
   243	RET
   244
   245TEXT _expand_key_192b<>(SB),NOSPLIT,$0
   246	PSHUFD $0x55, X1, X1
   247	SHUFPS $0x10, X0, X4
   248	PXOR X4, X0
   249	SHUFPS $0x8c, X0, X4
   250	PXOR X4, X0
   251	PXOR X1, X0
   252
   253	MOVAPS X2, X5
   254	PSLLDQ $0x4, X5
   255	PSHUFD $0xff, X0, X3
   256	PXOR X3, X2
   257	PXOR X5, X2
   258
   259	MOVUPS X0, (BX)
   260	ADDQ $16, BX
   261	RET
   262
   263TEXT _expand_key_256a<>(SB),NOSPLIT,$0
   264	JMP _expand_key_128<>(SB)
   265
   266TEXT _expand_key_256b<>(SB),NOSPLIT,$0
   267	PSHUFD $0xaa, X1, X1
   268	SHUFPS $0x10, X2, X4
   269	PXOR X4, X2
   270	SHUFPS $0x8c, X2, X4
   271	PXOR X4, X2
   272	PXOR X1, X2
   273
   274	MOVUPS X2, (BX)
   275	ADDQ $16, BX
   276	RET

View as plain text