github.com/panjjo/go@v0.0.0-20161104043856-d62b31386338/src/crypto/aes/asm_s390x.s (about)

     1  // Copyright 2016 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  #include "textflag.h"
     6  
     7  // func hasAsm() bool
     8  TEXT ·hasAsm(SB),NOSPLIT,$16-1
     9  	XOR	R0, R0          // set function code to 0 (query)
    10  	LA	mask-16(SP), R1 // 16-byte stack variable for mask
    11  	MOVD	$(0x38<<40), R3 // mask for bits 18-20 (big endian)
    12  
    13  	// check for KM AES functions
    14  	WORD	$0xB92E0024 // cipher message (KM)
    15  	MOVD	mask-16(SP), R2
    16  	AND	R3, R2
    17  	CMPBNE	R2, R3, notfound
    18  
    19  	// check for KMC AES functions
    20  	WORD	$0xB92F0024 // cipher message with chaining (KMC)
    21  	MOVD	mask-16(SP), R2
    22  	AND	R3, R2
    23  	CMPBNE	R2, R3, notfound
    24  
    25  	// check for KMCTR AES functions
    26  	WORD	$0xB92D4024 // cipher message with counter (KMCTR)
    27  	MOVD	mask-16(SP), R2
    28  	AND	R3, R2
    29  	CMPBNE	R2, R3, notfound
    30  
    31  	// check for KIMD GHASH function
    32  	WORD	$0xB93E0024    // compute intermediate message digest (KIMD)
    33  	MOVD	mask-8(SP), R2 // bits 64-127
    34  	MOVD	$(1<<62), R5
    35  	AND	R5, R2
    36  	CMPBNE	R2, R5, notfound
    37  
    38  	MOVB	$1, ret+0(FP)
    39  	RET
    40  notfound:
    41  	MOVB	$0, ret+0(FP)
    42  	RET
    43  
    44  // func cryptBlocks(c code, key, dst, src *byte, length int)
    45  TEXT ·cryptBlocks(SB),NOSPLIT,$0-40
    46  	MOVD	key+8(FP), R1
    47  	MOVD	dst+16(FP), R2
    48  	MOVD	src+24(FP), R4
    49  	MOVD	length+32(FP), R5
    50  	MOVD	c+0(FP), R0
    51  loop:
    52  	WORD	$0xB92E0024 // cipher message (KM)
    53  	BVS	loop        // branch back if interrupted
    54  	XOR	R0, R0
    55  	RET
    56  
    57  // func cryptBlocksChain(c code, iv, key, dst, src *byte, length int)
    58  TEXT ·cryptBlocksChain(SB),NOSPLIT,$48-48
    59  	LA	params-48(SP), R1
    60  	MOVD	iv+8(FP), R8
    61  	MOVD	key+16(FP), R9
    62  	MVC	$16, 0(R8), 0(R1)  // move iv into params
    63  	MVC	$32, 0(R9), 16(R1) // move key into params
    64  	MOVD	dst+24(FP), R2
    65  	MOVD	src+32(FP), R4
    66  	MOVD	length+40(FP), R5
    67  	MOVD	c+0(FP), R0
    68  loop:
    69  	WORD	$0xB92F0024       // cipher message with chaining (KMC)
    70  	BVS	loop              // branch back if interrupted
    71  	XOR	R0, R0
    72  	MVC	$16, 0(R1), 0(R8) // update iv
    73  	RET
    74  
    75  // func xorBytes(dst, a, b []byte) int
    76  TEXT ·xorBytes(SB),NOSPLIT,$0-80
    77  	MOVD	dst_base+0(FP), R1
    78  	MOVD	a_base+24(FP), R2
    79  	MOVD	b_base+48(FP), R3
    80  	MOVD	a_len+32(FP), R4
    81  	MOVD	b_len+56(FP), R5
    82  	CMPBLE	R4, R5, skip
    83  	MOVD	R5, R4
    84  skip:
    85  	MOVD	R4, ret+72(FP)
    86  	MOVD	$0, R5
    87  	CMPBLT	R4, $8, tail
    88  loop:
    89  	MOVD	0(R2)(R5*1), R7
    90  	MOVD	0(R3)(R5*1), R8
    91  	XOR	R7, R8
    92  	MOVD	R8, 0(R1)(R5*1)
    93  	LAY	8(R5), R5
    94  	SUB	$8, R4
    95  	CMPBGE	R4, $8, loop
    96  tail:
    97  	CMPBEQ	R4, $0, done
    98  	MOVB	0(R2)(R5*1), R7
    99  	MOVB	0(R3)(R5*1), R8
   100  	XOR	R7, R8
   101  	MOVB	R8, 0(R1)(R5*1)
   102  	LAY	1(R5), R5
   103  	SUB	$1, R4
   104  	BR	tail
   105  done:
   106  	RET
   107  
   108  // func cryptBlocksGCM(fn code, key, dst, src, buf []byte, cnt *[16]byte)
   109  TEXT ·cryptBlocksGCM(SB),NOSPLIT,$0-112
   110  	MOVD	src_len+64(FP), R0
   111  	MOVD	buf_base+80(FP), R1
   112  	MOVD	cnt+104(FP), R12
   113  	LMG	(R12), R2, R3
   114  
   115  	// Check that the src size is less than or equal to the buffer size.
   116  	MOVD	buf_len+88(FP), R4
   117  	CMP	R0, R4
   118  	BGT	crash
   119  
   120  	// Check that the src size is a multiple of 16-bytes.
   121  	MOVD	R0, R4
   122  	AND	$0xf, R4
   123  	BLT	crash // non-zero
   124  
   125  	// Check that the src size is less than or equal to the dst size.
   126  	MOVD	dst_len+40(FP), R4
   127  	CMP	R0, R4
   128  	BGT	crash
   129  
   130  	MOVD	R2, R4
   131  	MOVD	R2, R6
   132  	MOVD	R2, R8
   133  	MOVD	R3, R5
   134  	MOVD	R3, R7
   135  	MOVD	R3, R9
   136  	ADDW	$1, R5
   137  	ADDW	$2, R7
   138  	ADDW	$3, R9
   139  incr:
   140  	CMP	R0, $64
   141  	BLT	tail
   142  	STMG	R2, R9, (R1)
   143  	ADDW	$4, R3
   144  	ADDW	$4, R5
   145  	ADDW	$4, R7
   146  	ADDW	$4, R9
   147  	MOVD	$64(R1), R1
   148  	SUB	$64, R0
   149  	BR	incr
   150  tail:
   151  	CMP	R0, $0
   152  	BEQ	crypt
   153  	STMG	R2, R3, (R1)
   154  	ADDW	$1, R3
   155  	MOVD	$16(R1), R1
   156  	SUB	$16, R0
   157  	BR	tail
   158  crypt:
   159  	STMG	R2, R3, (R12)       // update next counter value
   160  	MOVD	fn+0(FP), R0        // function code (encryption)
   161  	MOVD	key_base+8(FP), R1  // key
   162  	MOVD	buf_base+80(FP), R2 // counter values
   163  	MOVD	dst_base+32(FP), R4 // dst
   164  	MOVD	src_base+56(FP), R6 // src
   165  	MOVD	src_len+64(FP), R7  // len
   166  loop:
   167  	WORD	$0xB92D2046         // cipher message with counter (KMCTR)
   168  	BVS	loop                // branch back if interrupted
   169  	RET
   170  crash:
   171  	MOVD	$0, (R0)
   172  	RET
   173  
   174  // func ghash(key *gcmHashKey, hash *[16]byte, data []byte)
   175  TEXT ·ghash(SB),NOSPLIT,$32-40
   176  	MOVD    $65, R0 // GHASH function code
   177  	MOVD	key+0(FP), R2
   178  	LMG	(R2), R6, R7
   179  	MOVD	hash+8(FP), R8
   180  	LMG	(R8), R4, R5
   181  	MOVD	$params-32(SP), R1
   182  	STMG	R4, R7, (R1)
   183  	LMG	data+16(FP), R2, R3 // R2=base, R3=len
   184  loop:
   185  	WORD    $0xB93E0002 // compute intermediate message digest (KIMD)
   186  	BVS     loop        // branch back if interrupted
   187  	MVC     $16, (R1), (R8)
   188  	MOVD	$0, R0
   189  	RET