Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/arch/powerpc/crypto/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 25 kB image not shown  

Quelle  aes-gcm-p10.S

  Sprache: Sparc
 

/* SPDX-License-Identifier: GPL-2.0-or-later */
#
# Accelerated AES-GCM stitched implementation for ppc64le.
#
# Copyright 2024- IBM Inc.
#
#===================================================================================
# Written by Danny Tsen <dtsen@us.ibm.com>
#
# GHASH is based on the Karatsuba multiplication method.
#
#    Xi xor X1
#
#    X1 * H^4 + X2 * H^3 + x3 * H^2 + X4 * H =
#      (X1.h * H4.h + xX.l * H4.l + X1 * H4) +
#      (X2.h * H3.h + X2.l * H3.l + X2 * H3) +
#      (X3.h * H2.h + X3.l * H2.l + X3 * H2) +
#      (X4.h * H.h + X4.l * H.l + X4 * H)
#
# Xi = v0
# H Poly = v2
# Hash keys = v3 - v14
#     ( H.l, H, H.h)
#     ( H^2.l, H^2, H^2.h)
#     ( H^3.l, H^3, H^3.h)
#     ( H^4.l, H^4, H^4.h)
#
# v30 is IV
# v31 - counter 1
#
# AES used,
#     vs0 - round key 0
#     v15, v16, v17, v18, v19, v20, v21, v22 for 8 blocks (encrypted)
#
# This implementation uses stitched AES-GCM approach to improve overall performance.
# AES is implemented with 8x blocks and GHASH is using 2 4x blocks.
#
# ===================================================================================
#

#include <asm/ppc_asm.h>
#include <linux/linkage.h>

.machine        "any"
.text

.macro SAVE_GPR GPR OFFSET FRAME
 std \GPR,\OFFSET(\FRAME)
.endm

.macro SAVE_VRS VRS OFFSET FRAME
 stxv \VRS+32, \OFFSET(\FRAME)
.endm

.macro RESTORE_GPR GPR OFFSET FRAME
 ld \GPR,\OFFSET(\FRAME)
.endm

.macro RESTORE_VRS VRS OFFSET FRAME
 lxv \VRS+32, \OFFSET(\FRAME)
.endm

.macro SAVE_REGS
 mflr 0
 std 016(1)
 stdu 1,-512(1)

 SAVE_GPR 141121
 SAVE_GPR 151201
 SAVE_GPR 161281
 SAVE_GPR 171361
 SAVE_GPR 181441
 SAVE_GPR 191521
 SAVE_GPR 201601
 SAVE_GPR 211681
 SAVE_GPR 221761
 SAVE_GPR 231841
 SAVE_GPR 241921

 addi 91256
 SAVE_VRS 2009
 SAVE_VRS 21169
 SAVE_VRS 22329
 SAVE_VRS 23489
 SAVE_VRS 24649
 SAVE_VRS 25809
 SAVE_VRS 26969
 SAVE_VRS 271129
 SAVE_VRS 281289
 SAVE_VRS 291449
 SAVE_VRS 301609
 SAVE_VRS 311769
.endm # SAVE_REGS

.macro RESTORE_REGS
 addi 91256
 RESTORE_VRS 2009
 RESTORE_VRS 21169
 RESTORE_VRS 22329
 RESTORE_VRS 23489
 RESTORE_VRS 24649
 RESTORE_VRS 25809
 RESTORE_VRS 26969
 RESTORE_VRS 271129
 RESTORE_VRS 281289
 RESTORE_VRS 291449
 RESTORE_VRS 301609
 RESTORE_VRS 311769

 RESTORE_GPR 141121
 RESTORE_GPR 151201
 RESTORE_GPR 161281
 RESTORE_GPR 171361
 RESTORE_GPR 181441
 RESTORE_GPR 191521
 RESTORE_GPR 201601
 RESTORE_GPR 211681
 RESTORE_GPR 221761
 RESTORE_GPR 231841
 RESTORE_GPR 241921

 addi    11512
 ld 016(1)
 mtlr 0
.endm # RESTORE_REGS

4x loops
.macro AES_CIPHER_4x _VCIPHER ST r
 \_VCIPHER \ST, \ST, \r
 \_VCIPHER \ST+1, \ST+1, \r
 \_VCIPHER \ST+2, \ST+2, \r
 \_VCIPHER \ST+3, \ST+3, \r
.endm

8x loops
.macro AES_CIPHER_8x _VCIPHER ST r
 \_VCIPHER \ST, \ST, \r
 \_VCIPHER \ST+1, \ST+1, \r
 \_VCIPHER \ST+2, \ST+2, \r
 \_VCIPHER \ST+3, \ST+3, \r
 \_VCIPHER \ST+4, \ST+4, \r
 \_VCIPHER \ST+5, \ST+5, \r
 \_VCIPHER \ST+6, \ST+6, \r
 \_VCIPHER \ST+7, \ST+7, \r
.endm

.macro LOOP_8AES_STATE
 xxlor 32+2311
 xxlor 32+2422
 xxlor 32+2533
 xxlor 32+2644
 AES_CIPHER_8x vcipher, 1523
 AES_CIPHER_8x vcipher, 1524
 AES_CIPHER_8x vcipher, 1525
 AES_CIPHER_8x vcipher, 1526
 xxlor 32+2355
 xxlor 32+2466
 xxlor 32+2577
 xxlor 32+2688
 AES_CIPHER_8x vcipher, 1523
 AES_CIPHER_8x vcipher, 1524
 AES_CIPHER_8x vcipher, 1525
 AES_CIPHER_8x vcipher, 1526
.endm

#
# PPC_GHASH4x(H, S1, S2, S3, S4): Compute 4x hash values based on Karatsuba method.
# H: returning digest
# S#: states
#
# S1 should xor with the previous digest
#
# Xi = v0
# H Poly = v2
# Hash keys = v3 - v14
# Scratch: v23 - v29
#
.macro PPC_GHASH4x H S1 S2 S3 S4

 vpmsumd 2312, \S1  # H4.L * X.L
 vpmsumd 249, \S2
 vpmsumd 256, \S3
 vpmsumd 263, \S4

 vpmsumd 2713, \S1  # H4.L * X.H + H4.H * X.L
 vpmsumd 2810, \S2  # H3.L * X1.H + H3.H * X1.L

 vxor 232324
 vxor 232325
 vxor 232326  # L

 vxor 242728
 vpmsumd 257, \S3
 vpmsumd 264, \S4

 vxor 242425
 vxor 242426  # M

 # sum hash and reduction with H Poly
 vpmsumd 28232  # reduction

 vxor 111
 vsldoi 252418  # mL
 vsldoi 11248  # mH
 vxor 232325  # mL + L

 # This performs swap and xor like,
 #   vsldoi 2323238  # swap
 #   vxor 232328
 xxlor 32+251010
 vpermxor 23232825

 vpmsumd 2614, \S1  # H4.H * X.H
 vpmsumd 2711, \S2
 vpmsumd 288, \S3
 vpmsumd 295, \S4

 vxor 242627
 vxor 242428
 vxor 242429

 vxor 24241

 # sum hash and reduction with H Poly
 vsldoi 2523238  # swap
 vpmsumd 23232
 vxor 272524
 vxor \H, 2327
.endm

#
# Compute update single ghash
# scratch: v1, v22..v27
#
.macro PPC_GHASH1x H S1

 vxor 111

 vpmsumd 223, \S1  # L
 vpmsumd 234, \S1  # M
 vpmsumd 245, \S1  # H

 vpmsumd 27222  # reduction

 vsldoi 252318  # mL
 vsldoi 261238  # mH
 vxor 222225  # LL + LL
 vxor 242426  # HH + HH

 xxlor 32+251010
 vpermxor 22222725

 vsldoi 2322228  # swap
 vpmsumd 22222  # reduction
 vxor 232324
 vxor \H, 2223
.endm

#
# LOAD_HASH_TABLE
# Xi = v0
# H Poly = v2
# Hash keys = v3 - v14
#
.macro LOAD_HASH_TABLE
 # Load Xi
 lxvb16x 3208 # load Xi

 # load Hash - h^4, h^3, h^2, h
 li 1032
 lxvd2x 2+32108 # H Poli
 li 1048
 lxvd2x 3+32108 # Hl
 li 1064
 lxvd2x 4+32108 # H
 li 1080
 lxvd2x 5+32108 # Hh

 li 1096
 lxvd2x 6+32108 # H^2l
 li 10112
 lxvd2x 7+32108 # H^2
 li 10128
 lxvd2x 8+32108 # H^2h

 li 10144
 lxvd2x 9+32108 # H^3l
 li 10160
 lxvd2x 10+32108 # H^3
 li 10176
 lxvd2x 11+32108 # H^3h

 li 10192
 lxvd2x 12+32108 # H^4l
 li 10208
 lxvd2x 13+32108 # H^4
 li 10224
 lxvd2x 14+32108 # H^4h
.endm

################################################################################
# Compute AES and ghash one block at a time.
# r23: AES rounds
# v30: current IV
# vs0: roundkey 0
#
################################################################################
SYM_FUNC_START_LOCAL(aes_gcm_crypt_1x)

 cmpdi 516
 bge __More_1x
 blr
__More_1x:
 li      1016
 divdu   12510

 xxlxor 32+1532+300

 # Pre-load 8 AES rounds to scratch vectors.
 xxlor 32+1611
 xxlor 32+1722
 xxlor 32+1833
 xxlor 32+1944
 xxlor 32+2055
 xxlor 32+2166
 xxlor 32+2877
 xxlor 32+2988
 lwz 23240(6) # n rounds
 addi 2223, -9 # remaing AES rounds

 cmpdi 120
 bgt __Loop_1x
 blr

__Loop_1x:
 mtctr 22
 addi 106144
 vcipher 151516
 vcipher 151517
 vcipher 151518
 vcipher 151519
 vcipher 151520
 vcipher 151521
 vcipher 151528
 vcipher 151529

__Loop_aes_1state:
 lxv 32+10(10)
 vcipher 15151
 addi 101016
 bdnz __Loop_aes_1state
 lxv 32+10(10)  # last round key
 lxvb16x 11014  # load input block
 vcipherlast 15151

 xxlxor 32+1532+1511
 stxvb16x 32+1509 # store output
 addi 141416
 addi 9916

 cmpdi 240 # decrypt?
 bne __Encrypt_1x
 xxlor 15+321111
__Encrypt_1x:
 vxor 15150
 PPC_GHASH1x 015

 addi 55, -16
 addi 111116

 vadduwm 303031  # IV + counter
 xxlxor 32+1532+300
 addi 1212, -1
 cmpdi 120
 bgt __Loop_1x

 stxvb16x 32+3007  # update IV
 stxvb16x 32+008  # update Xi
 blr
SYM_FUNC_END(aes_gcm_crypt_1x)

################################################################################
# Process a normal partial block when we come here.
#  Compute partial mask, Load and store partial block to stack.
#  Update partial_len and pblock.
#  pblock is (encrypted ^ AES state) for encrypt
#        and (input ^ AES state) for decrypt.
#
################################################################################
SYM_FUNC_START_LOCAL(__Process_partial)

 # create partial mask
 vspltisb 16, -1
 li 1216
 sub 12125
 sldi 12123
 mtvsrdd 32+17012
 vslo 161617  # partial block mask

 lxvb16x 11014  # load partial block
 xxland 111132+16

 # AES crypt partial
 xxlxor 32+1532+300
 lwz 23240(6)  # n rounds
 addi 2223, -1  # loop - 1
 mtctr 22
 addi 10616

__Loop_aes_pstate:
 lxv 32+10(10)
 vcipher 15151
 addi 101016
 bdnz __Loop_aes_pstate
 lxv 32+10(10)  # last round key
 vcipherlast 15151

 xxlxor 32+1532+1511
 vand 151516

 # AES crypt output v15
 # Write partial
 li 10224
 stxvb16x 15+32101  # write v15 to stack
 addi 101223
 addi 129, -1
        mtctr 5   # partial block len
__Write_partial:
        lbzu 221(10)
 stbu 221(12)
        bdnz __Write_partial

 cmpdi 240   # decrypt?
 bne __Encrypt_partial
 xxlor 32+151111  # decrypt using the input block
__Encrypt_partial:
 #vxor 15150  # ^ previous hash
 #PPC_GHASH1x 015

 add 14145
 add 995
 std 556(7)  # update partial
 sub 11115
 li 50   # done last byte

 #
 # Don't increase IV since this is the last partial.
 # It should get updated in gcm_update if no more data blocks.
 #vadduwm 303031  # increase IV
 stxvb16x 32+3007  # update IV
 li 1064
 stxvb16x 32+008  # Update X1
 stxvb16x 32+15107  # Update pblock
 blr
SYM_FUNC_END(__Process_partial)

################################################################################
# Combine partial blocks and ghash when we come here.
#
# The partial block has to be shifted to the right location to encrypt/decrypt
# and compute ghash if combing the previous partial block is needed.
# - Compute ghash for a full block. Clear Partial_len and pblock. Update IV.
#   Write Xi.
# - Don't compute ghash if not full block.  gcm_update will take care of it
#   is the last block. Update Partial_len and pblock.
#
################################################################################
SYM_FUNC_START_LOCAL(__Combine_partial)

 ld 1256(7)
 mr 215   # these bytes to be processed

 li 170
 li 1616
 sub 221612  # bytes to complete a block
 sub 17225  # remaining bytes in a block
 cmpdi 516
 ble __Inp_msg_less16
 li 170
 mr 2122
 b __Combine_continue
__Inp_msg_less16:
 cmpd 225
 bgt __Combine_continue
 li 170
 mr 2122   # these bytes to be processed

__Combine_continue:
 # load msg and shift to the proper location and mask
 vspltisb 16, -1
 sldi 15123
 mtvsrdd 32+17015
 vslo 161617
 vsro 161617
 sldi 15173
 mtvsrdd 32+17015
 vsro 161617
 vslo 161617  # mask

 lxvb16x 32+19014  # load partial block
 sldi 15123
 mtvsrdd 32+17015
 vsro 191917  # 0x00..xxxx??..??
 sldi 15173
 mtvsrdd 32+17015
 vsro 191917  # 0x00..xxxx
 vslo 191917  # shift back to form 0x00..xxxx00..00

 # AES crypt partial
 xxlxor 32+1532+300
 lwz 23240(6) # n rounds
 addi 2223, -1 # loop - 1
 mtctr 22
 addi 10616

__Loop_aes_cpstate:
 lxv 32+10(10)
 vcipher 15151
 addi 101016
 bdnz __Loop_aes_cpstate
 lxv 32+10(10)  # last round key
 vcipherlast 15151

 vxor 151519
 vand 151516

 # AES crypt output v15
 # Write partial
 li 10224
 stxvb16x 15+32101  # write v15 to stack
 addi 101223
 add 101012  # add offset
 addi 159, -1
        mtctr 21   # partial block len
__Write_combine_partial:
        lbzu 221(10)
 stbu 221(15)
        bdnz __Write_combine_partial

 add 141421
 add 111121
 add 9921
 sub 5521

 # Encrypt/Decrypt?
 cmpdi 240   # decrypt?
 bne __Encrypt_combine_partial
 vmr 1519  # decrypt using the input block

__Encrypt_combine_partial:
 #
 # Update partial flag and combine ghash.
__Update_partial_ghash:
 li 1064
 lxvb16x 32+17107  # load previous pblock
 add 121221  # combined pprocessed
 vxor 151517  # combined pblock

 cmpdi 1216
 beq __Clear_partial_flag
 std 1256(7)  # update partial len
 stxvb16x 32+15107  # Update current pblock
 blr

__Clear_partial_flag:
 li 120
 std 1256(7)
 # Update IV and ghash here
 vadduwm 303031  # increase IV
 stxvb16x 32+3007  # update IV

 # v15 either is either (input blockor encrypted)^(AES state)
 vxor 15150
 PPC_GHASH1x 015
 stxvb16x 32+0107  # update pblock for debug?
 stxvb16x 32+008  # update Xi
 blr
SYM_FUNC_END(__Combine_partial)

################################################################################
# gcm_update(iv, Xi) - compute last hash
#
################################################################################
SYM_FUNC_START(gcm_update)

 ld 1056(3)
 cmpdi 100
 beq __no_update

 lxvb16x 3204 # load Xi
 # load Hash - h^4, h^3, h^2, h
 li 1032
 lxvd2x 2+32104 # H Poli
 li 1048
 lxvd2x 3+32104 # Hl
 li 1064
 lxvd2x 4+32104 # H
 li 1080
 lxvd2x 5+32104 # Hh

 addis 112, permx@toc@ha
 addi 1111, permx@toc@l
 lxv 100(11) # vs10: vpermxor vector

 li 964
 lxvb16x 32+693  # load pblock
 vxor 660

 vxor 111
 vpmsumd 1236  # L
 vpmsumd 1346  # M
 vpmsumd 1456  # H
 vpmsumd 17122  # reduction
 vsldoi 151318  # mL
 vsldoi 161138  # mH
 vxor 121215  # LL + LL
 vxor 141416  # HH + HH
 xxlor 32+151010
 vpermxor 12121715
 vsldoi 1312128  # swap
 vpmsumd 12122  # reduction
 vxor 131314
 vxor 71213

 #vxor 000
 #stxvb16x 32+093
 li 100
 std 1056(3)
 stxvb16x 32+704

__no_update:
 blr
SYM_FUNC_END(gcm_update)

################################################################################
# aes_p10_gcm_encrypt (const void *inp, void *out, size_t len,
#               const char *rk, unsigned char iv[16], void *Xip);
#
#    r3 - inp
#    r4 - out
#    r5 - len
#    r6 - AES round keys
#    r7 - iv and other data
#    r8 - Xi, HPoli, hash keys
#
#    rounds is at offset 240 in rk
#    Xi is at 0 in gcm_table (Xip).
#
################################################################################
SYM_FUNC_START(aes_p10_gcm_encrypt)

 cmpdi 50
 ble __Invalid_msg_len

 SAVE_REGS
 LOAD_HASH_TABLE

 # initialize ICB: GHASH( IV ), IV - r7
 lxvb16x 30+3207 # load IV  - v30

 mr 143
 mr 94

 # counter 1
 vxor 313131
 vspltisb 221
 vsldoi 313122,1 # counter 1

 addis 112, permx@toc@ha
 addi 1111, permx@toc@l
 lxv 100(11) # vs10: vpermxor vector
 li 110

 # load 9 round keys to VSR
 lxv 00(6)   # round key 0
 lxv 116(6)  # round key 1
 lxv 232(6)  # round key 2
 lxv 348(6)  # round key 3
 lxv 464(6)  # round key 4
 lxv 580(6)  # round key 5
 lxv 696(6)  # round key 6
 lxv 7112(6)  # round key 7
 lxv 8128(6)  # round key 8

 # load rounds - 10 (128), 12 (192), 14 (256)
 lwz 23240(6)  # n rounds
 li 241   # encrypt

__Process_encrypt:
 #
 # Process different blocks
 #
 ld 1256(7)
 cmpdi 120
 bgt __Do_combine_enc
 cmpdi 5128
 blt __Process_more_enc

#
# Process 8x AES/GCM blocks
#
__Process_8x_enc:
 # 8x blcoks
 li 10128
 divdu 12510 # n 128 bytes-blocks

 addi 1212, -1 # loop - 1

 vmr 1530  # first state: IV
 vadduwm 161531 # state + counter
 vadduwm 171631
 vadduwm 181731
 vadduwm 191831
 vadduwm 201931
 vadduwm 212031
 vadduwm 222131
 xxlor 932+2232+22 # save last state

 # vxor  state, state, w # addroundkey
 xxlor 32+2900
        vxor    151529      # IV + round key - add round key 0
 vxor 161629
 vxor 171729
 vxor 181829
 vxor 191929
 vxor 202029
 vxor 212129
 vxor 222229

 li 1516
 li 1632
 li 1748
 li 1864
 li 1980
 li 2096
 li 21112

 #
 # Pre-compute first 8 AES state and leave 1/3/5 more rounds
 # for the loop.
 #
 addi 2223, -9  # process 8 keys
 mtctr 22   # AES key loop
 addi 106144

 LOOP_8AES_STATE   # process 8 AES keys

__PreLoop_aes_state:
 lxv 32+10(10)  # round key
 AES_CIPHER_8x vcipher 15 1
 addi 101016
 bdnz __PreLoop_aes_state
 lxv 32+10(10)  # last round key (v1)

 cmpdi 120   # Only one loop (8 block)
 beq __Finish_ghash

#
# Loop 8x blocks and compute ghash
#
__Loop_8x_block_enc:
 vcipherlast     15151
 vcipherlast     16161
 vcipherlast     17171
 vcipherlast     18181
 vcipherlast     19191
 vcipherlast     20201
 vcipherlast     21211
 vcipherlast     22221

 lxvb16x 32+23014 # load block
 lxvb16x 32+241514 # load block
 lxvb16x 32+251614 # load block
 lxvb16x 32+261714 # load block
 lxvb16x 32+271814 # load block
 lxvb16x 32+281914 # load block
 lxvb16x 32+292014 # load block
 lxvb16x 32+302114 # load block
 addi 1414128

 vxor 151523
 vxor 161624
 vxor 171725
 vxor 181826
 vxor 191927
 vxor 202028
 vxor 212129
 vxor 222230

 stxvb16x 4709 # store output
 stxvb16x 48159 # store output
 stxvb16x 49169 # store output
 stxvb16x 50179 # store output
 stxvb16x 51189 # store output
 stxvb16x 52199 # store output
 stxvb16x 53209 # store output
 stxvb16x 54219 # store output
 addi 99128

 # ghash here
 vxor 15150
 PPC_GHASH4x 015161718

 vxor 19190
 PPC_GHASH4x 019202122

 xxlor 32+1599  # last state
 vadduwm 151531  # state + counter
 vadduwm 161531
 vadduwm 171631
 vadduwm 181731
 vadduwm 191831
 vadduwm 201931
 vadduwm 212031
 vadduwm 222131
 xxlor 932+2232+22  # save last state

 xxlor 32+2700  # restore roundkey 0
        vxor    151527  # IV + round key - add round key 0
 vxor 161627
 vxor 171727
 vxor 181827
 vxor 191927
 vxor 202027
 vxor 212127
 vxor 222227

 addi    55, -128
 addi    1111128

 LOOP_8AES_STATE   # process 8 AES keys
 mtctr 22   # AES key loop
 addi 106144
__LastLoop_aes_state:
 lxv 32+10(10)  # round key
 AES_CIPHER_8x vcipher 15 1
 addi 101016
 bdnz __LastLoop_aes_state
 lxv 32+10(10)  # last round key (v1)

 addi 1212, -1
 cmpdi 120
 bne __Loop_8x_block_enc

__Finish_ghash:
 vcipherlast     15151
 vcipherlast     16161
 vcipherlast     17171
 vcipherlast     18181
 vcipherlast     19191
 vcipherlast     20201
 vcipherlast     21211
 vcipherlast     22221

 lxvb16x 32+23014 # load block
 lxvb16x 32+241514 # load block
 lxvb16x 32+251614 # load block
 lxvb16x 32+261714 # load block
 lxvb16x 32+271814 # load block
 lxvb16x 32+281914 # load block
 lxvb16x 32+292014 # load block
 lxvb16x 32+302114 # load block
 addi 1414128

 vxor 151523
 vxor 161624
 vxor 171725
 vxor 181826
 vxor 191927
 vxor 202028
 vxor 212129
 vxor 222230

 stxvb16x 4709 # store output
 stxvb16x 48159 # store output
 stxvb16x 49169 # store output
 stxvb16x 50179 # store output
 stxvb16x 51189 # store output
 stxvb16x 52199 # store output
 stxvb16x 53209 # store output
 stxvb16x 54219 # store output
 addi 99128

 vxor 15150
 PPC_GHASH4x 015161718

 vxor 19190
 PPC_GHASH4x 019202122

 xxlor 30+3299  # last ctr
 vadduwm 303031  # increase ctr
 stxvb16x 32+3007  # update IV
 stxvb16x 32+008  # update Xi

 addi    55, -128
 addi    1111128

 #
 # Done 8x blocks
 #

 cmpdi   50
 beq     aes_gcm_out

__Process_more_enc:
 li 241   # encrypt
 bl aes_gcm_crypt_1x
 cmpdi   50
 beq     aes_gcm_out

 bl __Process_partial
 cmpdi   50
 beq     aes_gcm_out
__Do_combine_enc:
 bl __Combine_partial
 cmpdi 50
 bgt __Process_encrypt
 b aes_gcm_out

SYM_FUNC_END(aes_p10_gcm_encrypt)

################################################################################
# aes_p10_gcm_decrypt (const void *inp, void *out, size_t len,
#               const char *rk, unsigned char iv[16], void *Xip);
8x Decrypt
#
################################################################################
SYM_FUNC_START(aes_p10_gcm_decrypt)

 cmpdi 50
 ble __Invalid_msg_len

 SAVE_REGS
 LOAD_HASH_TABLE

 # initialize ICB: GHASH( IV ), IV - r7
 lxvb16x 30+3207 # load IV  - v30

 mr 143
 mr 94

 # counter 1
 vxor 313131
 vspltisb 221
 vsldoi 313122,1 # counter 1

 addis 112, permx@toc@ha
 addi 1111, permx@toc@l
 lxv 100(11) # vs10: vpermxor vector
 li 110

 # load 9 round keys to VSR
 lxv 00(6)   # round key 0
 lxv 116(6)  # round key 1
 lxv 232(6)  # round key 2
 lxv 348(6)  # round key 3
 lxv 464(6)  # round key 4
 lxv 580(6)  # round key 5
 lxv 696(6)  # round key 6
 lxv 7112(6)  # round key 7
 lxv 8128(6)  # round key 8

 # load rounds - 10 (128), 12 (192), 14 (256)
 lwz 23240(6)  # n rounds
 li 240   # decrypt

__Process_decrypt:
 #
 # Process different blocks
 #
 ld 1256(7)
 cmpdi 120
 bgt __Do_combine_dec
 cmpdi 5128
 blt __Process_more_dec

#
# Process 8x AES/GCM blocks
#
__Process_8x_dec:
 # 8x blcoks
 li 10128
 divdu 12510 # n 128 bytes-blocks

 addi 1212, -1 # loop - 1

 vmr 1530  # first state: IV
 vadduwm 161531 # state + counter
 vadduwm 171631
 vadduwm 181731
 vadduwm 191831
 vadduwm 201931
 vadduwm 212031
 vadduwm 222131
 xxlor 932+2232+22 # save last state

 # vxor  state, state, w # addroundkey
 xxlor 32+2900
        vxor    151529      # IV + round key - add round key 0
 vxor 161629
 vxor 171729
 vxor 181829
 vxor 191929
 vxor 202029
 vxor 212129
 vxor 222229

 li 1516
 li 1632
 li 1748
 li 1864
 li 1980
 li 2096
 li 21112

 #
 # Pre-compute first 8 AES state and leave 1/3/5 more rounds
 # for the loop.
 #
 addi 2223, -9  # process 8 keys
 mtctr 22   # AES key loop
 addi 106144

 LOOP_8AES_STATE   # process 8 AES keys

__PreLoop_aes_state_dec:
 lxv 32+10(10)  # round key
 AES_CIPHER_8x vcipher 15 1
 addi 101016
 bdnz __PreLoop_aes_state_dec
 lxv 32+10(10)  # last round key (v1)

 cmpdi 120   # Only one loop (8 block)
 beq __Finish_ghash_dec

#
# Loop 8x blocks and compute ghash
#
__Loop_8x_block_dec:
 vcipherlast     15151
 vcipherlast     16161
 vcipherlast     17171
 vcipherlast     18181
 vcipherlast     19191
 vcipherlast     20201
 vcipherlast     21211
 vcipherlast     22221

 lxvb16x 32+23014 # load block
 lxvb16x 32+241514 # load block
 lxvb16x 32+251614 # load block
 lxvb16x 32+261714 # load block
 lxvb16x 32+271814 # load block
 lxvb16x 32+281914 # load block
 lxvb16x 32+292014 # load block
 lxvb16x 32+302114 # load block
 addi 1414128

 vxor 151523
 vxor 161624
 vxor 171725
 vxor 181826
 vxor 191927
 vxor 202028
 vxor 212129
 vxor 222230

 stxvb16x 4709 # store output
 stxvb16x 48159 # store output
 stxvb16x 49169 # store output
 stxvb16x 50179 # store output
 stxvb16x 51189 # store output
 stxvb16x 52199 # store output
 stxvb16x 53209 # store output
 stxvb16x 54219 # store output

 addi 99128

 vmr 1523
 vmr 1624
 vmr 1725
 vmr 1826
 vmr 1927
 vmr 2028
 vmr 2129
 vmr 2230

 # ghash here
 vxor 15150
 PPC_GHASH4x 015161718

 vxor 19190
 PPC_GHASH4x 019202122

 xxlor 32+1599  # last state
 vadduwm 151531  # state + counter
 vadduwm 161531
 vadduwm 171631
 vadduwm 181731
 vadduwm 191831
 vadduwm 201931
 vadduwm 212031
 vadduwm 222131
 xxlor 932+2232+22  # save last state

 xxlor 32+2700  # restore roundkey 0
        vxor    151527  # IV + round key - add round key 0
 vxor 161627
 vxor 171727
 vxor 181827
 vxor 191927
 vxor 202027
 vxor 212127
 vxor 222227

 addi    55, -128
 addi    1111128

 LOOP_8AES_STATE   # process 8 AES keys
 mtctr 22   # AES key loop
 addi 106144
__LastLoop_aes_state_dec:
 lxv 32+10(10)  # round key
 AES_CIPHER_8x vcipher 15 1
 addi 101016
 bdnz __LastLoop_aes_state_dec
 lxv 32+10(10)  # last round key (v1)

 addi 1212, -1
 cmpdi 120
 bne __Loop_8x_block_dec

__Finish_ghash_dec:
 vcipherlast     15151
 vcipherlast     16161
 vcipherlast     17171
 vcipherlast     18181
 vcipherlast     19191
 vcipherlast     20201
 vcipherlast     21211
 vcipherlast     22221

 lxvb16x 32+23014 # load block
 lxvb16x 32+241514 # load block
 lxvb16x 32+251614 # load block
 lxvb16x 32+261714 # load block
 lxvb16x 32+271814 # load block
 lxvb16x 32+281914 # load block
 lxvb16x 32+292014 # load block
 lxvb16x 32+302114 # load block
 addi 1414128

 vxor 151523
 vxor 161624
 vxor 171725
 vxor 181826
 vxor 191927
 vxor 202028
 vxor 212129
 vxor 222230

 stxvb16x 4709 # store output
 stxvb16x 48159 # store output
 stxvb16x 49169 # store output
 stxvb16x 50179 # store output
 stxvb16x 51189 # store output
 stxvb16x 52199 # store output
 stxvb16x 53209 # store output
 stxvb16x 54219 # store output
 addi 99128

 #vmr 1523
 vxor 15230
 vmr 1624
 vmr 1725
 vmr 1826
 vmr 1927
 vmr 2028
 vmr 2129
 vmr 2230

 #vxor 15150
 PPC_GHASH4x 015161718

 vxor 19190
 PPC_GHASH4x 019202122

 xxlor 30+3299  # last ctr
 vadduwm 303031  # increase ctr
 stxvb16x 32+3007  # update IV
 stxvb16x 32+008  # update Xi

 addi    55, -128
 addi    1111128

 #
 # Done 8x blocks
 #

 cmpdi   50
 beq     aes_gcm_out

__Process_more_dec:
 li 240   # decrypt
 bl aes_gcm_crypt_1x
 cmpdi   50
 beq     aes_gcm_out

 bl __Process_partial
 cmpdi   50
 beq     aes_gcm_out
__Do_combine_dec:
 bl __Combine_partial
 cmpdi 50
 bgt __Process_decrypt
 b aes_gcm_out
SYM_FUNC_END(aes_p10_gcm_decrypt)

SYM_FUNC_START_LOCAL(aes_gcm_out)

 mr 311   # return count

 RESTORE_REGS
 blr

__Invalid_msg_len:
 li 30
 blr
SYM_FUNC_END(aes_gcm_out)

SYM_DATA_START_LOCAL(PERMX)
.align 4
# for vector permute and xor
permx:
.long 0x4c5d6e7f, 0x08192a3b, 0xc4d5e6f7, 0x8091a2b3
SYM_DATA_END(permx)

Messung V0.5 in Prozent
C=95 H=92 G=93

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet am  2026-06-08) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.