17bded2dbSJung-uk Kim#! /usr/bin/env perl 2*b077aed3SPierre Pronchery# Copyright 2012-2021 The OpenSSL Project Authors. All Rights Reserved. 3e71b7053SJung-uk Kim# 4*b077aed3SPierre Pronchery# Licensed under the Apache License 2.0 (the "License"). You may not use 5e71b7053SJung-uk Kim# this file except in compliance with the License. You can obtain a copy 6e71b7053SJung-uk Kim# in the file LICENSE in the source distribution or at 7e71b7053SJung-uk Kim# https://www.openssl.org/source/license.html 8e71b7053SJung-uk Kim 97bded2dbSJung-uk Kim 107bded2dbSJung-uk Kim# ==================================================================== 11e71b7053SJung-uk Kim# Written by David S. Miller and Andy Polyakov. 12e71b7053SJung-uk Kim# The module is licensed under 2-clause BSD 137bded2dbSJung-uk Kim# license. October 2012. All rights reserved. 147bded2dbSJung-uk Kim# ==================================================================== 157bded2dbSJung-uk Kim 167bded2dbSJung-uk Kim###################################################################### 177bded2dbSJung-uk Kim# Camellia for SPARC T4. 187bded2dbSJung-uk Kim# 197bded2dbSJung-uk Kim# As with AES below results [for aligned data] are virtually identical 20e71b7053SJung-uk Kim# to critical path lengths for 3-cycle instruction latency: 217bded2dbSJung-uk Kim# 227bded2dbSJung-uk Kim# 128-bit key 192/256- 237bded2dbSJung-uk Kim# CBC encrypt 4.14/4.21(*) 5.46/5.52 247bded2dbSJung-uk Kim# (*) numbers after slash are for 257bded2dbSJung-uk Kim# misaligned data. 267bded2dbSJung-uk Kim# 277bded2dbSJung-uk Kim# As with Intel AES-NI, question is if it's possible to improve 28e71b7053SJung-uk Kim# performance of parallelizable modes by interleaving round 297bded2dbSJung-uk Kim# instructions. In Camellia every instruction is dependent on 307bded2dbSJung-uk Kim# previous, which means that there is place for 2 additional ones 317bded2dbSJung-uk Kim# in between two dependent. Can we expect 3x performance improvement? 327bded2dbSJung-uk Kim# At least one can argue that it should be possible to break 2x 337bded2dbSJung-uk Kim# barrier... For some reason not even 2x appears to be possible: 347bded2dbSJung-uk Kim# 357bded2dbSJung-uk Kim# 128-bit key 192/256- 367bded2dbSJung-uk Kim# CBC decrypt 2.21/2.74 2.99/3.40 377bded2dbSJung-uk Kim# CTR 2.15/2.68(*) 2.93/3.34 387bded2dbSJung-uk Kim# (*) numbers after slash are for 397bded2dbSJung-uk Kim# misaligned data. 407bded2dbSJung-uk Kim# 417bded2dbSJung-uk Kim# This is for 2x interleave. But compared to 1x interleave CBC decrypt 427bded2dbSJung-uk Kim# improved by ... 0% for 128-bit key, and 11% for 192/256-bit one. 437bded2dbSJung-uk Kim# So that out-of-order execution logic can take non-interleaved code 447bded2dbSJung-uk Kim# to 1.87x, but can't take 2x interleaved one any further. There 457bded2dbSJung-uk Kim# surely is some explanation... As result 3x interleave was not even 467bded2dbSJung-uk Kim# attempted. Instead an effort was made to share specific modes 477bded2dbSJung-uk Kim# implementations with AES module (therefore sparct4_modes.pl). 487bded2dbSJung-uk Kim# 497bded2dbSJung-uk Kim# To anchor to something else, software C implementation processes 507bded2dbSJung-uk Kim# one byte in 38 cycles with 128-bit key on same processor. 517bded2dbSJung-uk Kim 527bded2dbSJung-uk Kim$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 537bded2dbSJung-uk Kimpush(@INC,"${dir}","${dir}../../perlasm"); 547bded2dbSJung-uk Kimrequire "sparcv9_modes.pl"; 557bded2dbSJung-uk Kim 56*b077aed3SPierre Pronchery$output = pop and open STDOUT,">$output"; 577bded2dbSJung-uk Kim 587bded2dbSJung-uk Kim$::evp=1; # if $evp is set to 0, script generates module with 597bded2dbSJung-uk Kim# Camellia_[en|de]crypt, Camellia_set_key and Camellia_cbc_encrypt 607bded2dbSJung-uk Kim# entry points. These are fully compatible with openssl/camellia.h. 617bded2dbSJung-uk Kim 627bded2dbSJung-uk Kim###################################################################### 637bded2dbSJung-uk Kim# single-round subroutines 647bded2dbSJung-uk Kim# 657bded2dbSJung-uk Kim{ 667bded2dbSJung-uk Kimmy ($inp,$out,$key,$rounds,$tmp,$mask)=map("%o$_",(0..5)); 677bded2dbSJung-uk Kim 687bded2dbSJung-uk Kim$code=<<___; 69*b077aed3SPierre Pronchery#ifndef __ASSEMBLER__ 70*b077aed3SPierre Pronchery# define __ASSEMBLER__ 1 71*b077aed3SPierre Pronchery#endif 72*b077aed3SPierre Pronchery#include "crypto/sparc_arch.h" 73e71b7053SJung-uk Kim 747bded2dbSJung-uk Kim.text 757bded2dbSJung-uk Kim 767bded2dbSJung-uk Kim.globl cmll_t4_encrypt 777bded2dbSJung-uk Kim.align 32 787bded2dbSJung-uk Kimcmll_t4_encrypt: 797bded2dbSJung-uk Kim andcc $inp, 7, %g1 ! is input aligned? 807bded2dbSJung-uk Kim andn $inp, 7, $inp 817bded2dbSJung-uk Kim 827bded2dbSJung-uk Kim ldx [$key + 0], %g4 837bded2dbSJung-uk Kim ldx [$key + 8], %g5 847bded2dbSJung-uk Kim 857bded2dbSJung-uk Kim ldx [$inp + 0], %o4 867bded2dbSJung-uk Kim bz,pt %icc, 1f 877bded2dbSJung-uk Kim ldx [$inp + 8], %o5 887bded2dbSJung-uk Kim ldx [$inp + 16], $inp 897bded2dbSJung-uk Kim sll %g1, 3, %g1 907bded2dbSJung-uk Kim sub %g0, %g1, %o3 917bded2dbSJung-uk Kim sllx %o4, %g1, %o4 927bded2dbSJung-uk Kim sllx %o5, %g1, %g1 937bded2dbSJung-uk Kim srlx %o5, %o3, %o5 947bded2dbSJung-uk Kim srlx $inp, %o3, %o3 957bded2dbSJung-uk Kim or %o5, %o4, %o4 967bded2dbSJung-uk Kim or %o3, %g1, %o5 977bded2dbSJung-uk Kim1: 987bded2dbSJung-uk Kim ld [$key + 272], $rounds ! grandRounds, 3 or 4 997bded2dbSJung-uk Kim ldd [$key + 16], %f12 1007bded2dbSJung-uk Kim ldd [$key + 24], %f14 1017bded2dbSJung-uk Kim xor %g4, %o4, %o4 1027bded2dbSJung-uk Kim xor %g5, %o5, %o5 1037bded2dbSJung-uk Kim ldd [$key + 32], %f16 1047bded2dbSJung-uk Kim ldd [$key + 40], %f18 1057bded2dbSJung-uk Kim movxtod %o4, %f0 1067bded2dbSJung-uk Kim movxtod %o5, %f2 1077bded2dbSJung-uk Kim ldd [$key + 48], %f20 1087bded2dbSJung-uk Kim ldd [$key + 56], %f22 1097bded2dbSJung-uk Kim sub $rounds, 1, $rounds 1107bded2dbSJung-uk Kim ldd [$key + 64], %f24 1117bded2dbSJung-uk Kim ldd [$key + 72], %f26 1127bded2dbSJung-uk Kim add $key, 80, $key 1137bded2dbSJung-uk Kim 1147bded2dbSJung-uk Kim.Lenc: 1157bded2dbSJung-uk Kim camellia_f %f12, %f2, %f0, %f2 1167bded2dbSJung-uk Kim ldd [$key + 0], %f12 1177bded2dbSJung-uk Kim sub $rounds,1,$rounds 1187bded2dbSJung-uk Kim camellia_f %f14, %f0, %f2, %f0 1197bded2dbSJung-uk Kim ldd [$key + 8], %f14 1207bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 1217bded2dbSJung-uk Kim ldd [$key + 16], %f16 1227bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 1237bded2dbSJung-uk Kim ldd [$key + 24], %f18 1247bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 1257bded2dbSJung-uk Kim ldd [$key + 32], %f20 1267bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 1277bded2dbSJung-uk Kim ldd [$key + 40], %f22 1287bded2dbSJung-uk Kim camellia_fl %f24, %f0, %f0 1297bded2dbSJung-uk Kim ldd [$key + 48], %f24 1307bded2dbSJung-uk Kim camellia_fli %f26, %f2, %f2 1317bded2dbSJung-uk Kim ldd [$key + 56], %f26 1327bded2dbSJung-uk Kim brnz,pt $rounds, .Lenc 1337bded2dbSJung-uk Kim add $key, 64, $key 1347bded2dbSJung-uk Kim 1357bded2dbSJung-uk Kim andcc $out, 7, $tmp ! is output aligned? 1367bded2dbSJung-uk Kim camellia_f %f12, %f2, %f0, %f2 1377bded2dbSJung-uk Kim camellia_f %f14, %f0, %f2, %f0 1387bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 1397bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 1407bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f4 1417bded2dbSJung-uk Kim camellia_f %f22, %f0, %f4, %f2 1427bded2dbSJung-uk Kim fxor %f24, %f4, %f0 1437bded2dbSJung-uk Kim fxor %f26, %f2, %f2 1447bded2dbSJung-uk Kim 1457bded2dbSJung-uk Kim bnz,pn %icc, 2f 1467bded2dbSJung-uk Kim nop 1477bded2dbSJung-uk Kim 1487bded2dbSJung-uk Kim std %f0, [$out + 0] 1497bded2dbSJung-uk Kim retl 1507bded2dbSJung-uk Kim std %f2, [$out + 8] 1517bded2dbSJung-uk Kim 1527bded2dbSJung-uk Kim2: alignaddrl $out, %g0, $out 1537bded2dbSJung-uk Kim mov 0xff, $mask 1547bded2dbSJung-uk Kim srl $mask, $tmp, $mask 1557bded2dbSJung-uk Kim 1567bded2dbSJung-uk Kim faligndata %f0, %f0, %f4 1577bded2dbSJung-uk Kim faligndata %f0, %f2, %f6 1587bded2dbSJung-uk Kim faligndata %f2, %f2, %f8 1597bded2dbSJung-uk Kim 1607bded2dbSJung-uk Kim stda %f4, [$out + $mask]0xc0 ! partial store 1617bded2dbSJung-uk Kim std %f6, [$out + 8] 1627bded2dbSJung-uk Kim add $out, 16, $out 1637bded2dbSJung-uk Kim orn %g0, $mask, $mask 1647bded2dbSJung-uk Kim retl 1657bded2dbSJung-uk Kim stda %f8, [$out + $mask]0xc0 ! partial store 1667bded2dbSJung-uk Kim.type cmll_t4_encrypt,#function 1677bded2dbSJung-uk Kim.size cmll_t4_encrypt,.-cmll_t4_encrypt 1687bded2dbSJung-uk Kim 1697bded2dbSJung-uk Kim.globl cmll_t4_decrypt 1707bded2dbSJung-uk Kim.align 32 1717bded2dbSJung-uk Kimcmll_t4_decrypt: 1727bded2dbSJung-uk Kim ld [$key + 272], $rounds ! grandRounds, 3 or 4 1737bded2dbSJung-uk Kim andcc $inp, 7, %g1 ! is input aligned? 1747bded2dbSJung-uk Kim andn $inp, 7, $inp 1757bded2dbSJung-uk Kim 1767bded2dbSJung-uk Kim sll $rounds, 6, $rounds 1777bded2dbSJung-uk Kim add $rounds, $key, $key 1787bded2dbSJung-uk Kim 1797bded2dbSJung-uk Kim ldx [$inp + 0], %o4 1807bded2dbSJung-uk Kim bz,pt %icc, 1f 1817bded2dbSJung-uk Kim ldx [$inp + 8], %o5 1827bded2dbSJung-uk Kim ldx [$inp + 16], $inp 1837bded2dbSJung-uk Kim sll %g1, 3, %g1 1847bded2dbSJung-uk Kim sub %g0, %g1, %g4 1857bded2dbSJung-uk Kim sllx %o4, %g1, %o4 1867bded2dbSJung-uk Kim sllx %o5, %g1, %g1 1877bded2dbSJung-uk Kim srlx %o5, %g4, %o5 1887bded2dbSJung-uk Kim srlx $inp, %g4, %g4 1897bded2dbSJung-uk Kim or %o5, %o4, %o4 1907bded2dbSJung-uk Kim or %g4, %g1, %o5 1917bded2dbSJung-uk Kim1: 1927bded2dbSJung-uk Kim ldx [$key + 0], %g4 1937bded2dbSJung-uk Kim ldx [$key + 8], %g5 1947bded2dbSJung-uk Kim ldd [$key - 8], %f12 1957bded2dbSJung-uk Kim ldd [$key - 16], %f14 1967bded2dbSJung-uk Kim xor %g4, %o4, %o4 1977bded2dbSJung-uk Kim xor %g5, %o5, %o5 1987bded2dbSJung-uk Kim ldd [$key - 24], %f16 1997bded2dbSJung-uk Kim ldd [$key - 32], %f18 2007bded2dbSJung-uk Kim movxtod %o4, %f0 2017bded2dbSJung-uk Kim movxtod %o5, %f2 2027bded2dbSJung-uk Kim ldd [$key - 40], %f20 2037bded2dbSJung-uk Kim ldd [$key - 48], %f22 2047bded2dbSJung-uk Kim sub $rounds, 64, $rounds 2057bded2dbSJung-uk Kim ldd [$key - 56], %f24 2067bded2dbSJung-uk Kim ldd [$key - 64], %f26 2077bded2dbSJung-uk Kim sub $key, 64, $key 2087bded2dbSJung-uk Kim 2097bded2dbSJung-uk Kim.Ldec: 2107bded2dbSJung-uk Kim camellia_f %f12, %f2, %f0, %f2 2117bded2dbSJung-uk Kim ldd [$key - 8], %f12 2127bded2dbSJung-uk Kim sub $rounds, 64, $rounds 2137bded2dbSJung-uk Kim camellia_f %f14, %f0, %f2, %f0 2147bded2dbSJung-uk Kim ldd [$key - 16], %f14 2157bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 2167bded2dbSJung-uk Kim ldd [$key - 24], %f16 2177bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 2187bded2dbSJung-uk Kim ldd [$key - 32], %f18 2197bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 2207bded2dbSJung-uk Kim ldd [$key - 40], %f20 2217bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 2227bded2dbSJung-uk Kim ldd [$key - 48], %f22 2237bded2dbSJung-uk Kim camellia_fl %f24, %f0, %f0 2247bded2dbSJung-uk Kim ldd [$key - 56], %f24 2257bded2dbSJung-uk Kim camellia_fli %f26, %f2, %f2 2267bded2dbSJung-uk Kim ldd [$key - 64], %f26 2277bded2dbSJung-uk Kim brnz,pt $rounds, .Ldec 2287bded2dbSJung-uk Kim sub $key, 64, $key 2297bded2dbSJung-uk Kim 2307bded2dbSJung-uk Kim andcc $out, 7, $tmp ! is output aligned? 2317bded2dbSJung-uk Kim camellia_f %f12, %f2, %f0, %f2 2327bded2dbSJung-uk Kim camellia_f %f14, %f0, %f2, %f0 2337bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 2347bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 2357bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f4 2367bded2dbSJung-uk Kim camellia_f %f22, %f0, %f4, %f2 2377bded2dbSJung-uk Kim fxor %f26, %f4, %f0 2387bded2dbSJung-uk Kim fxor %f24, %f2, %f2 2397bded2dbSJung-uk Kim 2407bded2dbSJung-uk Kim bnz,pn %icc, 2f 2417bded2dbSJung-uk Kim nop 2427bded2dbSJung-uk Kim 2437bded2dbSJung-uk Kim std %f0, [$out + 0] 2447bded2dbSJung-uk Kim retl 2457bded2dbSJung-uk Kim std %f2, [$out + 8] 2467bded2dbSJung-uk Kim 2477bded2dbSJung-uk Kim2: alignaddrl $out, %g0, $out 2487bded2dbSJung-uk Kim mov 0xff, $mask 2497bded2dbSJung-uk Kim srl $mask, $tmp, $mask 2507bded2dbSJung-uk Kim 2517bded2dbSJung-uk Kim faligndata %f0, %f0, %f4 2527bded2dbSJung-uk Kim faligndata %f0, %f2, %f6 2537bded2dbSJung-uk Kim faligndata %f2, %f2, %f8 2547bded2dbSJung-uk Kim 2557bded2dbSJung-uk Kim stda %f4, [$out + $mask]0xc0 ! partial store 2567bded2dbSJung-uk Kim std %f6, [$out + 8] 2577bded2dbSJung-uk Kim add $out, 16, $out 2587bded2dbSJung-uk Kim orn %g0, $mask, $mask 2597bded2dbSJung-uk Kim retl 2607bded2dbSJung-uk Kim stda %f8, [$out + $mask]0xc0 ! partial store 2617bded2dbSJung-uk Kim.type cmll_t4_decrypt,#function 2627bded2dbSJung-uk Kim.size cmll_t4_decrypt,.-cmll_t4_decrypt 2637bded2dbSJung-uk Kim___ 2647bded2dbSJung-uk Kim} 2657bded2dbSJung-uk Kim 2667bded2dbSJung-uk Kim###################################################################### 2677bded2dbSJung-uk Kim# key setup subroutines 2687bded2dbSJung-uk Kim# 2697bded2dbSJung-uk Kim{ 2707bded2dbSJung-uk Kimsub ROTL128 { 2717bded2dbSJung-uk Kim my $rot = shift; 2727bded2dbSJung-uk Kim 2737bded2dbSJung-uk Kim "srlx %o4, 64-$rot, %g4\n\t". 2747bded2dbSJung-uk Kim "sllx %o4, $rot, %o4\n\t". 2757bded2dbSJung-uk Kim "srlx %o5, 64-$rot, %g5\n\t". 2767bded2dbSJung-uk Kim "sllx %o5, $rot, %o5\n\t". 2777bded2dbSJung-uk Kim "or %o4, %g5, %o4\n\t". 2787bded2dbSJung-uk Kim "or %o5, %g4, %o5"; 2797bded2dbSJung-uk Kim} 2807bded2dbSJung-uk Kim 2817bded2dbSJung-uk Kimmy ($inp,$bits,$out,$tmp)=map("%o$_",(0..5)); 2827bded2dbSJung-uk Kim$code.=<<___; 2837bded2dbSJung-uk Kim.globl cmll_t4_set_key 2847bded2dbSJung-uk Kim.align 32 2857bded2dbSJung-uk Kimcmll_t4_set_key: 2867bded2dbSJung-uk Kim and $inp, 7, $tmp 2877bded2dbSJung-uk Kim alignaddr $inp, %g0, $inp 2887bded2dbSJung-uk Kim cmp $bits, 192 2897bded2dbSJung-uk Kim ldd [$inp + 0], %f0 2907bded2dbSJung-uk Kim bl,pt %icc,.L128 2917bded2dbSJung-uk Kim ldd [$inp + 8], %f2 2927bded2dbSJung-uk Kim 2937bded2dbSJung-uk Kim be,pt %icc,.L192 2947bded2dbSJung-uk Kim ldd [$inp + 16], %f4 2957bded2dbSJung-uk Kim 2967bded2dbSJung-uk Kim brz,pt $tmp, .L256aligned 2977bded2dbSJung-uk Kim ldd [$inp + 24], %f6 2987bded2dbSJung-uk Kim 2997bded2dbSJung-uk Kim ldd [$inp + 32], %f8 3007bded2dbSJung-uk Kim faligndata %f0, %f2, %f0 3017bded2dbSJung-uk Kim faligndata %f2, %f4, %f2 3027bded2dbSJung-uk Kim faligndata %f4, %f6, %f4 3037bded2dbSJung-uk Kim b .L256aligned 3047bded2dbSJung-uk Kim faligndata %f6, %f8, %f6 3057bded2dbSJung-uk Kim 3067bded2dbSJung-uk Kim.align 16 3077bded2dbSJung-uk Kim.L192: 3087bded2dbSJung-uk Kim brz,a,pt $tmp, .L256aligned 3097bded2dbSJung-uk Kim fnot2 %f4, %f6 3107bded2dbSJung-uk Kim 3117bded2dbSJung-uk Kim ldd [$inp + 24], %f6 3127bded2dbSJung-uk Kim nop 3137bded2dbSJung-uk Kim faligndata %f0, %f2, %f0 3147bded2dbSJung-uk Kim faligndata %f2, %f4, %f2 3157bded2dbSJung-uk Kim faligndata %f4, %f6, %f4 3167bded2dbSJung-uk Kim fnot2 %f4, %f6 3177bded2dbSJung-uk Kim 3187bded2dbSJung-uk Kim.L256aligned: 3197bded2dbSJung-uk Kim std %f0, [$out + 0] ! k[0, 1] 3207bded2dbSJung-uk Kim fsrc2 %f0, %f28 3217bded2dbSJung-uk Kim std %f2, [$out + 8] ! k[2, 3] 3227bded2dbSJung-uk Kim fsrc2 %f2, %f30 3237bded2dbSJung-uk Kim fxor %f4, %f0, %f0 3247bded2dbSJung-uk Kim b .L128key 3257bded2dbSJung-uk Kim fxor %f6, %f2, %f2 3267bded2dbSJung-uk Kim 3277bded2dbSJung-uk Kim.align 16 3287bded2dbSJung-uk Kim.L128: 3297bded2dbSJung-uk Kim brz,pt $tmp, .L128aligned 3307bded2dbSJung-uk Kim nop 3317bded2dbSJung-uk Kim 3327bded2dbSJung-uk Kim ldd [$inp + 16], %f4 3337bded2dbSJung-uk Kim nop 3347bded2dbSJung-uk Kim faligndata %f0, %f2, %f0 3357bded2dbSJung-uk Kim faligndata %f2, %f4, %f2 3367bded2dbSJung-uk Kim 3377bded2dbSJung-uk Kim.L128aligned: 3387bded2dbSJung-uk Kim std %f0, [$out + 0] ! k[0, 1] 3397bded2dbSJung-uk Kim fsrc2 %f0, %f28 3407bded2dbSJung-uk Kim std %f2, [$out + 8] ! k[2, 3] 3417bded2dbSJung-uk Kim fsrc2 %f2, %f30 3427bded2dbSJung-uk Kim 3437bded2dbSJung-uk Kim.L128key: 3447bded2dbSJung-uk Kim mov %o7, %o5 3457bded2dbSJung-uk Kim1: call .+8 3467bded2dbSJung-uk Kim add %o7, SIGMA-1b, %o4 3477bded2dbSJung-uk Kim mov %o5, %o7 3487bded2dbSJung-uk Kim 3497bded2dbSJung-uk Kim ldd [%o4 + 0], %f16 3507bded2dbSJung-uk Kim ldd [%o4 + 8], %f18 3517bded2dbSJung-uk Kim ldd [%o4 + 16], %f20 3527bded2dbSJung-uk Kim ldd [%o4 + 24], %f22 3537bded2dbSJung-uk Kim 3547bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 3557bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 3567bded2dbSJung-uk Kim fxor %f28, %f0, %f0 3577bded2dbSJung-uk Kim fxor %f30, %f2, %f2 3587bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 3597bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 3607bded2dbSJung-uk Kim 3617bded2dbSJung-uk Kim bge,pn %icc, .L256key 3627bded2dbSJung-uk Kim nop 3637bded2dbSJung-uk Kim std %f0, [$out + 0x10] ! k[ 4, 5] 3647bded2dbSJung-uk Kim std %f2, [$out + 0x18] ! k[ 6, 7] 3657bded2dbSJung-uk Kim 3667bded2dbSJung-uk Kim movdtox %f0, %o4 3677bded2dbSJung-uk Kim movdtox %f2, %o5 3687bded2dbSJung-uk Kim `&ROTL128(15)` 3697bded2dbSJung-uk Kim stx %o4, [$out + 0x30] ! k[12, 13] 3707bded2dbSJung-uk Kim stx %o5, [$out + 0x38] ! k[14, 15] 3717bded2dbSJung-uk Kim `&ROTL128(15)` 3727bded2dbSJung-uk Kim stx %o4, [$out + 0x40] ! k[16, 17] 3737bded2dbSJung-uk Kim stx %o5, [$out + 0x48] ! k[18, 19] 3747bded2dbSJung-uk Kim `&ROTL128(15)` 3757bded2dbSJung-uk Kim stx %o4, [$out + 0x60] ! k[24, 25] 3767bded2dbSJung-uk Kim `&ROTL128(15)` 3777bded2dbSJung-uk Kim stx %o4, [$out + 0x70] ! k[28, 29] 3787bded2dbSJung-uk Kim stx %o5, [$out + 0x78] ! k[30, 31] 3797bded2dbSJung-uk Kim `&ROTL128(34)` 3807bded2dbSJung-uk Kim stx %o4, [$out + 0xa0] ! k[40, 41] 3817bded2dbSJung-uk Kim stx %o5, [$out + 0xa8] ! k[42, 43] 3827bded2dbSJung-uk Kim `&ROTL128(17)` 3837bded2dbSJung-uk Kim stx %o4, [$out + 0xc0] ! k[48, 49] 3847bded2dbSJung-uk Kim stx %o5, [$out + 0xc8] ! k[50, 51] 3857bded2dbSJung-uk Kim 3867bded2dbSJung-uk Kim movdtox %f28, %o4 ! k[ 0, 1] 3877bded2dbSJung-uk Kim movdtox %f30, %o5 ! k[ 2, 3] 3887bded2dbSJung-uk Kim `&ROTL128(15)` 3897bded2dbSJung-uk Kim stx %o4, [$out + 0x20] ! k[ 8, 9] 3907bded2dbSJung-uk Kim stx %o5, [$out + 0x28] ! k[10, 11] 3917bded2dbSJung-uk Kim `&ROTL128(30)` 3927bded2dbSJung-uk Kim stx %o4, [$out + 0x50] ! k[20, 21] 3937bded2dbSJung-uk Kim stx %o5, [$out + 0x58] ! k[22, 23] 3947bded2dbSJung-uk Kim `&ROTL128(15)` 3957bded2dbSJung-uk Kim stx %o5, [$out + 0x68] ! k[26, 27] 3967bded2dbSJung-uk Kim `&ROTL128(17)` 3977bded2dbSJung-uk Kim stx %o4, [$out + 0x80] ! k[32, 33] 3987bded2dbSJung-uk Kim stx %o5, [$out + 0x88] ! k[34, 35] 3997bded2dbSJung-uk Kim `&ROTL128(17)` 4007bded2dbSJung-uk Kim stx %o4, [$out + 0x90] ! k[36, 37] 4017bded2dbSJung-uk Kim stx %o5, [$out + 0x98] ! k[38, 39] 4027bded2dbSJung-uk Kim `&ROTL128(17)` 4037bded2dbSJung-uk Kim stx %o4, [$out + 0xb0] ! k[44, 45] 4047bded2dbSJung-uk Kim stx %o5, [$out + 0xb8] ! k[46, 47] 4057bded2dbSJung-uk Kim 4067bded2dbSJung-uk Kim mov 3, $tmp 4077bded2dbSJung-uk Kim st $tmp, [$out + 0x110] 4087bded2dbSJung-uk Kim retl 4097bded2dbSJung-uk Kim xor %o0, %o0, %o0 4107bded2dbSJung-uk Kim 4117bded2dbSJung-uk Kim.align 16 4127bded2dbSJung-uk Kim.L256key: 4137bded2dbSJung-uk Kim ldd [%o4 + 32], %f24 4147bded2dbSJung-uk Kim ldd [%o4 + 40], %f26 4157bded2dbSJung-uk Kim 4167bded2dbSJung-uk Kim std %f0, [$out + 0x30] ! k[12, 13] 4177bded2dbSJung-uk Kim std %f2, [$out + 0x38] ! k[14, 15] 4187bded2dbSJung-uk Kim 4197bded2dbSJung-uk Kim fxor %f4, %f0, %f0 4207bded2dbSJung-uk Kim fxor %f6, %f2, %f2 4217bded2dbSJung-uk Kim camellia_f %f24, %f2, %f0, %f2 4227bded2dbSJung-uk Kim camellia_f %f26, %f0, %f2, %f0 4237bded2dbSJung-uk Kim 4247bded2dbSJung-uk Kim std %f0, [$out + 0x10] ! k[ 4, 5] 4257bded2dbSJung-uk Kim std %f2, [$out + 0x18] ! k[ 6, 7] 4267bded2dbSJung-uk Kim 4277bded2dbSJung-uk Kim movdtox %f0, %o4 4287bded2dbSJung-uk Kim movdtox %f2, %o5 4297bded2dbSJung-uk Kim `&ROTL128(30)` 4307bded2dbSJung-uk Kim stx %o4, [$out + 0x50] ! k[20, 21] 4317bded2dbSJung-uk Kim stx %o5, [$out + 0x58] ! k[22, 23] 4327bded2dbSJung-uk Kim `&ROTL128(30)` 4337bded2dbSJung-uk Kim stx %o4, [$out + 0xa0] ! k[40, 41] 4347bded2dbSJung-uk Kim stx %o5, [$out + 0xa8] ! k[42, 43] 4357bded2dbSJung-uk Kim `&ROTL128(51)` 4367bded2dbSJung-uk Kim stx %o4, [$out + 0x100] ! k[64, 65] 4377bded2dbSJung-uk Kim stx %o5, [$out + 0x108] ! k[66, 67] 4387bded2dbSJung-uk Kim 4397bded2dbSJung-uk Kim movdtox %f4, %o4 ! k[ 8, 9] 4407bded2dbSJung-uk Kim movdtox %f6, %o5 ! k[10, 11] 4417bded2dbSJung-uk Kim `&ROTL128(15)` 4427bded2dbSJung-uk Kim stx %o4, [$out + 0x20] ! k[ 8, 9] 4437bded2dbSJung-uk Kim stx %o5, [$out + 0x28] ! k[10, 11] 4447bded2dbSJung-uk Kim `&ROTL128(15)` 4457bded2dbSJung-uk Kim stx %o4, [$out + 0x40] ! k[16, 17] 4467bded2dbSJung-uk Kim stx %o5, [$out + 0x48] ! k[18, 19] 4477bded2dbSJung-uk Kim `&ROTL128(30)` 4487bded2dbSJung-uk Kim stx %o4, [$out + 0x90] ! k[36, 37] 4497bded2dbSJung-uk Kim stx %o5, [$out + 0x98] ! k[38, 39] 4507bded2dbSJung-uk Kim `&ROTL128(34)` 4517bded2dbSJung-uk Kim stx %o4, [$out + 0xd0] ! k[52, 53] 4527bded2dbSJung-uk Kim stx %o5, [$out + 0xd8] ! k[54, 55] 4537bded2dbSJung-uk Kim ldx [$out + 0x30], %o4 ! k[12, 13] 4547bded2dbSJung-uk Kim ldx [$out + 0x38], %o5 ! k[14, 15] 4557bded2dbSJung-uk Kim `&ROTL128(15)` 4567bded2dbSJung-uk Kim stx %o4, [$out + 0x30] ! k[12, 13] 4577bded2dbSJung-uk Kim stx %o5, [$out + 0x38] ! k[14, 15] 4587bded2dbSJung-uk Kim `&ROTL128(30)` 4597bded2dbSJung-uk Kim stx %o4, [$out + 0x70] ! k[28, 29] 4607bded2dbSJung-uk Kim stx %o5, [$out + 0x78] ! k[30, 31] 4617bded2dbSJung-uk Kim srlx %o4, 32, %g4 4627bded2dbSJung-uk Kim srlx %o5, 32, %g5 4637bded2dbSJung-uk Kim st %o4, [$out + 0xc0] ! k[48] 4647bded2dbSJung-uk Kim st %g5, [$out + 0xc4] ! k[49] 4657bded2dbSJung-uk Kim st %o5, [$out + 0xc8] ! k[50] 4667bded2dbSJung-uk Kim st %g4, [$out + 0xcc] ! k[51] 4677bded2dbSJung-uk Kim `&ROTL128(49)` 4687bded2dbSJung-uk Kim stx %o4, [$out + 0xe0] ! k[56, 57] 4697bded2dbSJung-uk Kim stx %o5, [$out + 0xe8] ! k[58, 59] 4707bded2dbSJung-uk Kim 4717bded2dbSJung-uk Kim movdtox %f28, %o4 ! k[ 0, 1] 4727bded2dbSJung-uk Kim movdtox %f30, %o5 ! k[ 2, 3] 4737bded2dbSJung-uk Kim `&ROTL128(45)` 4747bded2dbSJung-uk Kim stx %o4, [$out + 0x60] ! k[24, 25] 4757bded2dbSJung-uk Kim stx %o5, [$out + 0x68] ! k[26, 27] 4767bded2dbSJung-uk Kim `&ROTL128(15)` 4777bded2dbSJung-uk Kim stx %o4, [$out + 0x80] ! k[32, 33] 4787bded2dbSJung-uk Kim stx %o5, [$out + 0x88] ! k[34, 35] 4797bded2dbSJung-uk Kim `&ROTL128(17)` 4807bded2dbSJung-uk Kim stx %o4, [$out + 0xb0] ! k[44, 45] 4817bded2dbSJung-uk Kim stx %o5, [$out + 0xb8] ! k[46, 47] 4827bded2dbSJung-uk Kim `&ROTL128(34)` 4837bded2dbSJung-uk Kim stx %o4, [$out + 0xf0] ! k[60, 61] 4847bded2dbSJung-uk Kim stx %o5, [$out + 0xf8] ! k[62, 63] 4857bded2dbSJung-uk Kim 4867bded2dbSJung-uk Kim mov 4, $tmp 4877bded2dbSJung-uk Kim st $tmp, [$out + 0x110] 4887bded2dbSJung-uk Kim retl 4897bded2dbSJung-uk Kim xor %o0, %o0, %o0 4907bded2dbSJung-uk Kim.type cmll_t4_set_key,#function 4917bded2dbSJung-uk Kim.size cmll_t4_set_key,.-cmll_t4_set_key 4927bded2dbSJung-uk Kim.align 32 4937bded2dbSJung-uk KimSIGMA: 4947bded2dbSJung-uk Kim .long 0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2 4957bded2dbSJung-uk Kim .long 0xc6ef372f, 0xe94f82be, 0x54ff53a5, 0xf1d36f1c 4967bded2dbSJung-uk Kim .long 0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd 4977bded2dbSJung-uk Kim.type SIGMA,#object 4987bded2dbSJung-uk Kim.size SIGMA,.-SIGMA 4997bded2dbSJung-uk Kim.asciz "Camellia for SPARC T4, David S. Miller, Andy Polyakov" 5007bded2dbSJung-uk Kim___ 5017bded2dbSJung-uk Kim} 5027bded2dbSJung-uk Kim 5037bded2dbSJung-uk Kim{{{ 5047bded2dbSJung-uk Kimmy ($inp,$out,$len,$key,$ivec,$enc)=map("%i$_",(0..5)); 5057bded2dbSJung-uk Kimmy ($ileft,$iright,$ooff,$omask,$ivoff)=map("%l$_",(1..7)); 5067bded2dbSJung-uk Kim 5077bded2dbSJung-uk Kim$code.=<<___; 5087bded2dbSJung-uk Kim.align 32 5097bded2dbSJung-uk Kim_cmll128_load_enckey: 5107bded2dbSJung-uk Kim ldx [$key + 0], %g4 5117bded2dbSJung-uk Kim ldx [$key + 8], %g5 5127bded2dbSJung-uk Kim___ 5137bded2dbSJung-uk Kimfor ($i=2; $i<26;$i++) { # load key schedule 5147bded2dbSJung-uk Kim $code.=<<___; 5157bded2dbSJung-uk Kim ldd [$key + `8*$i`], %f`12+2*$i` 5167bded2dbSJung-uk Kim___ 5177bded2dbSJung-uk Kim} 5187bded2dbSJung-uk Kim$code.=<<___; 5197bded2dbSJung-uk Kim retl 5207bded2dbSJung-uk Kim nop 5217bded2dbSJung-uk Kim.type _cmll128_load_enckey,#function 5227bded2dbSJung-uk Kim.size _cmll128_load_enckey,.-_cmll128_load_enckey 5237bded2dbSJung-uk Kim_cmll256_load_enckey=_cmll128_load_enckey 5247bded2dbSJung-uk Kim 5257bded2dbSJung-uk Kim.align 32 5267bded2dbSJung-uk Kim_cmll256_load_deckey: 5277bded2dbSJung-uk Kim ldd [$key + 64], %f62 5287bded2dbSJung-uk Kim ldd [$key + 72], %f60 5297bded2dbSJung-uk Kim b .Load_deckey 5307bded2dbSJung-uk Kim add $key, 64, $key 5317bded2dbSJung-uk Kim_cmll128_load_deckey: 5327bded2dbSJung-uk Kim ldd [$key + 0], %f60 5337bded2dbSJung-uk Kim ldd [$key + 8], %f62 5347bded2dbSJung-uk Kim.Load_deckey: 5357bded2dbSJung-uk Kim___ 5367bded2dbSJung-uk Kimfor ($i=2; $i<24;$i++) { # load key schedule 5377bded2dbSJung-uk Kim $code.=<<___; 5387bded2dbSJung-uk Kim ldd [$key + `8*$i`], %f`62-2*$i` 5397bded2dbSJung-uk Kim___ 5407bded2dbSJung-uk Kim} 5417bded2dbSJung-uk Kim$code.=<<___; 5427bded2dbSJung-uk Kim ldx [$key + 192], %g4 5437bded2dbSJung-uk Kim retl 5447bded2dbSJung-uk Kim ldx [$key + 200], %g5 5457bded2dbSJung-uk Kim.type _cmll256_load_deckey,#function 5467bded2dbSJung-uk Kim.size _cmll256_load_deckey,.-_cmll256_load_deckey 5477bded2dbSJung-uk Kim 5487bded2dbSJung-uk Kim.align 32 5497bded2dbSJung-uk Kim_cmll128_encrypt_1x: 5507bded2dbSJung-uk Kim___ 5517bded2dbSJung-uk Kimfor ($i=0; $i<3; $i++) { 5527bded2dbSJung-uk Kim $code.=<<___; 5537bded2dbSJung-uk Kim camellia_f %f`16+16*$i+0`, %f2, %f0, %f2 5547bded2dbSJung-uk Kim camellia_f %f`16+16*$i+2`, %f0, %f2, %f0 5557bded2dbSJung-uk Kim camellia_f %f`16+16*$i+4`, %f2, %f0, %f2 5567bded2dbSJung-uk Kim camellia_f %f`16+16*$i+6`, %f0, %f2, %f0 5577bded2dbSJung-uk Kim___ 5587bded2dbSJung-uk Kim$code.=<<___ if ($i<2); 5597bded2dbSJung-uk Kim camellia_f %f`16+16*$i+8`, %f2, %f0, %f2 5607bded2dbSJung-uk Kim camellia_f %f`16+16*$i+10`, %f0, %f2, %f0 5617bded2dbSJung-uk Kim camellia_fl %f`16+16*$i+12`, %f0, %f0 5627bded2dbSJung-uk Kim camellia_fli %f`16+16*$i+14`, %f2, %f2 5637bded2dbSJung-uk Kim___ 5647bded2dbSJung-uk Kim} 5657bded2dbSJung-uk Kim$code.=<<___; 5667bded2dbSJung-uk Kim camellia_f %f56, %f2, %f0, %f4 5677bded2dbSJung-uk Kim camellia_f %f58, %f0, %f4, %f2 5687bded2dbSJung-uk Kim fxor %f60, %f4, %f0 5697bded2dbSJung-uk Kim retl 5707bded2dbSJung-uk Kim fxor %f62, %f2, %f2 5717bded2dbSJung-uk Kim.type _cmll128_encrypt_1x,#function 5727bded2dbSJung-uk Kim.size _cmll128_encrypt_1x,.-_cmll128_encrypt_1x 5737bded2dbSJung-uk Kim_cmll128_decrypt_1x=_cmll128_encrypt_1x 5747bded2dbSJung-uk Kim 5757bded2dbSJung-uk Kim.align 32 5767bded2dbSJung-uk Kim_cmll128_encrypt_2x: 5777bded2dbSJung-uk Kim___ 5787bded2dbSJung-uk Kimfor ($i=0; $i<3; $i++) { 5797bded2dbSJung-uk Kim $code.=<<___; 5807bded2dbSJung-uk Kim camellia_f %f`16+16*$i+0`, %f2, %f0, %f2 5817bded2dbSJung-uk Kim camellia_f %f`16+16*$i+0`, %f6, %f4, %f6 5827bded2dbSJung-uk Kim camellia_f %f`16+16*$i+2`, %f0, %f2, %f0 5837bded2dbSJung-uk Kim camellia_f %f`16+16*$i+2`, %f4, %f6, %f4 5847bded2dbSJung-uk Kim camellia_f %f`16+16*$i+4`, %f2, %f0, %f2 5857bded2dbSJung-uk Kim camellia_f %f`16+16*$i+4`, %f6, %f4, %f6 5867bded2dbSJung-uk Kim camellia_f %f`16+16*$i+6`, %f0, %f2, %f0 5877bded2dbSJung-uk Kim camellia_f %f`16+16*$i+6`, %f4, %f6, %f4 5887bded2dbSJung-uk Kim___ 5897bded2dbSJung-uk Kim$code.=<<___ if ($i<2); 5907bded2dbSJung-uk Kim camellia_f %f`16+16*$i+8`, %f2, %f0, %f2 5917bded2dbSJung-uk Kim camellia_f %f`16+16*$i+8`, %f6, %f4, %f6 5927bded2dbSJung-uk Kim camellia_f %f`16+16*$i+10`, %f0, %f2, %f0 5937bded2dbSJung-uk Kim camellia_f %f`16+16*$i+10`, %f4, %f6, %f4 5947bded2dbSJung-uk Kim camellia_fl %f`16+16*$i+12`, %f0, %f0 5957bded2dbSJung-uk Kim camellia_fl %f`16+16*$i+12`, %f4, %f4 5967bded2dbSJung-uk Kim camellia_fli %f`16+16*$i+14`, %f2, %f2 5977bded2dbSJung-uk Kim camellia_fli %f`16+16*$i+14`, %f6, %f6 5987bded2dbSJung-uk Kim___ 5997bded2dbSJung-uk Kim} 6007bded2dbSJung-uk Kim$code.=<<___; 6017bded2dbSJung-uk Kim camellia_f %f56, %f2, %f0, %f8 6027bded2dbSJung-uk Kim camellia_f %f56, %f6, %f4, %f10 6037bded2dbSJung-uk Kim camellia_f %f58, %f0, %f8, %f2 6047bded2dbSJung-uk Kim camellia_f %f58, %f4, %f10, %f6 6057bded2dbSJung-uk Kim fxor %f60, %f8, %f0 6067bded2dbSJung-uk Kim fxor %f60, %f10, %f4 6077bded2dbSJung-uk Kim fxor %f62, %f2, %f2 6087bded2dbSJung-uk Kim retl 6097bded2dbSJung-uk Kim fxor %f62, %f6, %f6 6107bded2dbSJung-uk Kim.type _cmll128_encrypt_2x,#function 6117bded2dbSJung-uk Kim.size _cmll128_encrypt_2x,.-_cmll128_encrypt_2x 6127bded2dbSJung-uk Kim_cmll128_decrypt_2x=_cmll128_encrypt_2x 6137bded2dbSJung-uk Kim 6147bded2dbSJung-uk Kim.align 32 6157bded2dbSJung-uk Kim_cmll256_encrypt_1x: 6167bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 6177bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 6187bded2dbSJung-uk Kim ldd [$key + 208], %f16 6197bded2dbSJung-uk Kim ldd [$key + 216], %f18 6207bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 6217bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 6227bded2dbSJung-uk Kim ldd [$key + 224], %f20 6237bded2dbSJung-uk Kim ldd [$key + 232], %f22 6247bded2dbSJung-uk Kim camellia_f %f24, %f2, %f0, %f2 6257bded2dbSJung-uk Kim camellia_f %f26, %f0, %f2, %f0 6267bded2dbSJung-uk Kim ldd [$key + 240], %f24 6277bded2dbSJung-uk Kim ldd [$key + 248], %f26 6287bded2dbSJung-uk Kim camellia_fl %f28, %f0, %f0 6297bded2dbSJung-uk Kim camellia_fli %f30, %f2, %f2 6307bded2dbSJung-uk Kim ldd [$key + 256], %f28 6317bded2dbSJung-uk Kim ldd [$key + 264], %f30 6327bded2dbSJung-uk Kim___ 6337bded2dbSJung-uk Kimfor ($i=1; $i<3; $i++) { 6347bded2dbSJung-uk Kim $code.=<<___; 6357bded2dbSJung-uk Kim camellia_f %f`16+16*$i+0`, %f2, %f0, %f2 6367bded2dbSJung-uk Kim camellia_f %f`16+16*$i+2`, %f0, %f2, %f0 6377bded2dbSJung-uk Kim camellia_f %f`16+16*$i+4`, %f2, %f0, %f2 6387bded2dbSJung-uk Kim camellia_f %f`16+16*$i+6`, %f0, %f2, %f0 6397bded2dbSJung-uk Kim camellia_f %f`16+16*$i+8`, %f2, %f0, %f2 6407bded2dbSJung-uk Kim camellia_f %f`16+16*$i+10`, %f0, %f2, %f0 6417bded2dbSJung-uk Kim camellia_fl %f`16+16*$i+12`, %f0, %f0 6427bded2dbSJung-uk Kim camellia_fli %f`16+16*$i+14`, %f2, %f2 6437bded2dbSJung-uk Kim___ 6447bded2dbSJung-uk Kim} 6457bded2dbSJung-uk Kim$code.=<<___; 6467bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 6477bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 6487bded2dbSJung-uk Kim ldd [$key + 16], %f16 6497bded2dbSJung-uk Kim ldd [$key + 24], %f18 6507bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 6517bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 6527bded2dbSJung-uk Kim ldd [$key + 32], %f20 6537bded2dbSJung-uk Kim ldd [$key + 40], %f22 6547bded2dbSJung-uk Kim camellia_f %f24, %f2, %f0, %f4 6557bded2dbSJung-uk Kim camellia_f %f26, %f0, %f4, %f2 6567bded2dbSJung-uk Kim ldd [$key + 48], %f24 6577bded2dbSJung-uk Kim ldd [$key + 56], %f26 6587bded2dbSJung-uk Kim fxor %f28, %f4, %f0 6597bded2dbSJung-uk Kim fxor %f30, %f2, %f2 6607bded2dbSJung-uk Kim ldd [$key + 64], %f28 6617bded2dbSJung-uk Kim retl 6627bded2dbSJung-uk Kim ldd [$key + 72], %f30 6637bded2dbSJung-uk Kim.type _cmll256_encrypt_1x,#function 6647bded2dbSJung-uk Kim.size _cmll256_encrypt_1x,.-_cmll256_encrypt_1x 6657bded2dbSJung-uk Kim 6667bded2dbSJung-uk Kim.align 32 6677bded2dbSJung-uk Kim_cmll256_encrypt_2x: 6687bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 6697bded2dbSJung-uk Kim camellia_f %f16, %f6, %f4, %f6 6707bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 6717bded2dbSJung-uk Kim camellia_f %f18, %f4, %f6, %f4 6727bded2dbSJung-uk Kim ldd [$key + 208], %f16 6737bded2dbSJung-uk Kim ldd [$key + 216], %f18 6747bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 6757bded2dbSJung-uk Kim camellia_f %f20, %f6, %f4, %f6 6767bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 6777bded2dbSJung-uk Kim camellia_f %f22, %f4, %f6, %f4 6787bded2dbSJung-uk Kim ldd [$key + 224], %f20 6797bded2dbSJung-uk Kim ldd [$key + 232], %f22 6807bded2dbSJung-uk Kim camellia_f %f24, %f2, %f0, %f2 6817bded2dbSJung-uk Kim camellia_f %f24, %f6, %f4, %f6 6827bded2dbSJung-uk Kim camellia_f %f26, %f0, %f2, %f0 6837bded2dbSJung-uk Kim camellia_f %f26, %f4, %f6, %f4 6847bded2dbSJung-uk Kim ldd [$key + 240], %f24 6857bded2dbSJung-uk Kim ldd [$key + 248], %f26 6867bded2dbSJung-uk Kim camellia_fl %f28, %f0, %f0 6877bded2dbSJung-uk Kim camellia_fl %f28, %f4, %f4 6887bded2dbSJung-uk Kim camellia_fli %f30, %f2, %f2 6897bded2dbSJung-uk Kim camellia_fli %f30, %f6, %f6 6907bded2dbSJung-uk Kim ldd [$key + 256], %f28 6917bded2dbSJung-uk Kim ldd [$key + 264], %f30 6927bded2dbSJung-uk Kim___ 6937bded2dbSJung-uk Kimfor ($i=1; $i<3; $i++) { 6947bded2dbSJung-uk Kim $code.=<<___; 6957bded2dbSJung-uk Kim camellia_f %f`16+16*$i+0`, %f2, %f0, %f2 6967bded2dbSJung-uk Kim camellia_f %f`16+16*$i+0`, %f6, %f4, %f6 6977bded2dbSJung-uk Kim camellia_f %f`16+16*$i+2`, %f0, %f2, %f0 6987bded2dbSJung-uk Kim camellia_f %f`16+16*$i+2`, %f4, %f6, %f4 6997bded2dbSJung-uk Kim camellia_f %f`16+16*$i+4`, %f2, %f0, %f2 7007bded2dbSJung-uk Kim camellia_f %f`16+16*$i+4`, %f6, %f4, %f6 7017bded2dbSJung-uk Kim camellia_f %f`16+16*$i+6`, %f0, %f2, %f0 7027bded2dbSJung-uk Kim camellia_f %f`16+16*$i+6`, %f4, %f6, %f4 7037bded2dbSJung-uk Kim camellia_f %f`16+16*$i+8`, %f2, %f0, %f2 7047bded2dbSJung-uk Kim camellia_f %f`16+16*$i+8`, %f6, %f4, %f6 7057bded2dbSJung-uk Kim camellia_f %f`16+16*$i+10`, %f0, %f2, %f0 7067bded2dbSJung-uk Kim camellia_f %f`16+16*$i+10`, %f4, %f6, %f4 7077bded2dbSJung-uk Kim camellia_fl %f`16+16*$i+12`, %f0, %f0 7087bded2dbSJung-uk Kim camellia_fl %f`16+16*$i+12`, %f4, %f4 7097bded2dbSJung-uk Kim camellia_fli %f`16+16*$i+14`, %f2, %f2 7107bded2dbSJung-uk Kim camellia_fli %f`16+16*$i+14`, %f6, %f6 7117bded2dbSJung-uk Kim___ 7127bded2dbSJung-uk Kim} 7137bded2dbSJung-uk Kim$code.=<<___; 7147bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 7157bded2dbSJung-uk Kim camellia_f %f16, %f6, %f4, %f6 7167bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 7177bded2dbSJung-uk Kim camellia_f %f18, %f4, %f6, %f4 7187bded2dbSJung-uk Kim ldd [$key + 16], %f16 7197bded2dbSJung-uk Kim ldd [$key + 24], %f18 7207bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 7217bded2dbSJung-uk Kim camellia_f %f20, %f6, %f4, %f6 7227bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 7237bded2dbSJung-uk Kim camellia_f %f22, %f4, %f6, %f4 7247bded2dbSJung-uk Kim ldd [$key + 32], %f20 7257bded2dbSJung-uk Kim ldd [$key + 40], %f22 7267bded2dbSJung-uk Kim camellia_f %f24, %f2, %f0, %f8 7277bded2dbSJung-uk Kim camellia_f %f24, %f6, %f4, %f10 7287bded2dbSJung-uk Kim camellia_f %f26, %f0, %f8, %f2 7297bded2dbSJung-uk Kim camellia_f %f26, %f4, %f10, %f6 7307bded2dbSJung-uk Kim ldd [$key + 48], %f24 7317bded2dbSJung-uk Kim ldd [$key + 56], %f26 7327bded2dbSJung-uk Kim fxor %f28, %f8, %f0 7337bded2dbSJung-uk Kim fxor %f28, %f10, %f4 7347bded2dbSJung-uk Kim fxor %f30, %f2, %f2 7357bded2dbSJung-uk Kim fxor %f30, %f6, %f6 7367bded2dbSJung-uk Kim ldd [$key + 64], %f28 7377bded2dbSJung-uk Kim retl 7387bded2dbSJung-uk Kim ldd [$key + 72], %f30 7397bded2dbSJung-uk Kim.type _cmll256_encrypt_2x,#function 7407bded2dbSJung-uk Kim.size _cmll256_encrypt_2x,.-_cmll256_encrypt_2x 7417bded2dbSJung-uk Kim 7427bded2dbSJung-uk Kim.align 32 7437bded2dbSJung-uk Kim_cmll256_decrypt_1x: 7447bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 7457bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 7467bded2dbSJung-uk Kim ldd [$key - 8], %f16 7477bded2dbSJung-uk Kim ldd [$key - 16], %f18 7487bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 7497bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 7507bded2dbSJung-uk Kim ldd [$key - 24], %f20 7517bded2dbSJung-uk Kim ldd [$key - 32], %f22 7527bded2dbSJung-uk Kim camellia_f %f24, %f2, %f0, %f2 7537bded2dbSJung-uk Kim camellia_f %f26, %f0, %f2, %f0 7547bded2dbSJung-uk Kim ldd [$key - 40], %f24 7557bded2dbSJung-uk Kim ldd [$key - 48], %f26 7567bded2dbSJung-uk Kim camellia_fl %f28, %f0, %f0 7577bded2dbSJung-uk Kim camellia_fli %f30, %f2, %f2 7587bded2dbSJung-uk Kim ldd [$key - 56], %f28 7597bded2dbSJung-uk Kim ldd [$key - 64], %f30 7607bded2dbSJung-uk Kim___ 7617bded2dbSJung-uk Kimfor ($i=1; $i<3; $i++) { 7627bded2dbSJung-uk Kim $code.=<<___; 7637bded2dbSJung-uk Kim camellia_f %f`16+16*$i+0`, %f2, %f0, %f2 7647bded2dbSJung-uk Kim camellia_f %f`16+16*$i+2`, %f0, %f2, %f0 7657bded2dbSJung-uk Kim camellia_f %f`16+16*$i+4`, %f2, %f0, %f2 7667bded2dbSJung-uk Kim camellia_f %f`16+16*$i+6`, %f0, %f2, %f0 7677bded2dbSJung-uk Kim camellia_f %f`16+16*$i+8`, %f2, %f0, %f2 7687bded2dbSJung-uk Kim camellia_f %f`16+16*$i+10`, %f0, %f2, %f0 7697bded2dbSJung-uk Kim camellia_fl %f`16+16*$i+12`, %f0, %f0 7707bded2dbSJung-uk Kim camellia_fli %f`16+16*$i+14`, %f2, %f2 7717bded2dbSJung-uk Kim___ 7727bded2dbSJung-uk Kim} 7737bded2dbSJung-uk Kim$code.=<<___; 7747bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 7757bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 7767bded2dbSJung-uk Kim ldd [$key + 184], %f16 7777bded2dbSJung-uk Kim ldd [$key + 176], %f18 7787bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 7797bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 7807bded2dbSJung-uk Kim ldd [$key + 168], %f20 7817bded2dbSJung-uk Kim ldd [$key + 160], %f22 7827bded2dbSJung-uk Kim camellia_f %f24, %f2, %f0, %f4 7837bded2dbSJung-uk Kim camellia_f %f26, %f0, %f4, %f2 7847bded2dbSJung-uk Kim ldd [$key + 152], %f24 7857bded2dbSJung-uk Kim ldd [$key + 144], %f26 7867bded2dbSJung-uk Kim fxor %f30, %f4, %f0 7877bded2dbSJung-uk Kim fxor %f28, %f2, %f2 7887bded2dbSJung-uk Kim ldd [$key + 136], %f28 7897bded2dbSJung-uk Kim retl 7907bded2dbSJung-uk Kim ldd [$key + 128], %f30 7917bded2dbSJung-uk Kim.type _cmll256_decrypt_1x,#function 7927bded2dbSJung-uk Kim.size _cmll256_decrypt_1x,.-_cmll256_decrypt_1x 7937bded2dbSJung-uk Kim 7947bded2dbSJung-uk Kim.align 32 7957bded2dbSJung-uk Kim_cmll256_decrypt_2x: 7967bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 7977bded2dbSJung-uk Kim camellia_f %f16, %f6, %f4, %f6 7987bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 7997bded2dbSJung-uk Kim camellia_f %f18, %f4, %f6, %f4 8007bded2dbSJung-uk Kim ldd [$key - 8], %f16 8017bded2dbSJung-uk Kim ldd [$key - 16], %f18 8027bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 8037bded2dbSJung-uk Kim camellia_f %f20, %f6, %f4, %f6 8047bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 8057bded2dbSJung-uk Kim camellia_f %f22, %f4, %f6, %f4 8067bded2dbSJung-uk Kim ldd [$key - 24], %f20 8077bded2dbSJung-uk Kim ldd [$key - 32], %f22 8087bded2dbSJung-uk Kim camellia_f %f24, %f2, %f0, %f2 8097bded2dbSJung-uk Kim camellia_f %f24, %f6, %f4, %f6 8107bded2dbSJung-uk Kim camellia_f %f26, %f0, %f2, %f0 8117bded2dbSJung-uk Kim camellia_f %f26, %f4, %f6, %f4 8127bded2dbSJung-uk Kim ldd [$key - 40], %f24 8137bded2dbSJung-uk Kim ldd [$key - 48], %f26 8147bded2dbSJung-uk Kim camellia_fl %f28, %f0, %f0 8157bded2dbSJung-uk Kim camellia_fl %f28, %f4, %f4 8167bded2dbSJung-uk Kim camellia_fli %f30, %f2, %f2 8177bded2dbSJung-uk Kim camellia_fli %f30, %f6, %f6 8187bded2dbSJung-uk Kim ldd [$key - 56], %f28 8197bded2dbSJung-uk Kim ldd [$key - 64], %f30 8207bded2dbSJung-uk Kim___ 8217bded2dbSJung-uk Kimfor ($i=1; $i<3; $i++) { 8227bded2dbSJung-uk Kim $code.=<<___; 8237bded2dbSJung-uk Kim camellia_f %f`16+16*$i+0`, %f2, %f0, %f2 8247bded2dbSJung-uk Kim camellia_f %f`16+16*$i+0`, %f6, %f4, %f6 8257bded2dbSJung-uk Kim camellia_f %f`16+16*$i+2`, %f0, %f2, %f0 8267bded2dbSJung-uk Kim camellia_f %f`16+16*$i+2`, %f4, %f6, %f4 8277bded2dbSJung-uk Kim camellia_f %f`16+16*$i+4`, %f2, %f0, %f2 8287bded2dbSJung-uk Kim camellia_f %f`16+16*$i+4`, %f6, %f4, %f6 8297bded2dbSJung-uk Kim camellia_f %f`16+16*$i+6`, %f0, %f2, %f0 8307bded2dbSJung-uk Kim camellia_f %f`16+16*$i+6`, %f4, %f6, %f4 8317bded2dbSJung-uk Kim camellia_f %f`16+16*$i+8`, %f2, %f0, %f2 8327bded2dbSJung-uk Kim camellia_f %f`16+16*$i+8`, %f6, %f4, %f6 8337bded2dbSJung-uk Kim camellia_f %f`16+16*$i+10`, %f0, %f2, %f0 8347bded2dbSJung-uk Kim camellia_f %f`16+16*$i+10`, %f4, %f6, %f4 8357bded2dbSJung-uk Kim camellia_fl %f`16+16*$i+12`, %f0, %f0 8367bded2dbSJung-uk Kim camellia_fl %f`16+16*$i+12`, %f4, %f4 8377bded2dbSJung-uk Kim camellia_fli %f`16+16*$i+14`, %f2, %f2 8387bded2dbSJung-uk Kim camellia_fli %f`16+16*$i+14`, %f6, %f6 8397bded2dbSJung-uk Kim___ 8407bded2dbSJung-uk Kim} 8417bded2dbSJung-uk Kim$code.=<<___; 8427bded2dbSJung-uk Kim camellia_f %f16, %f2, %f0, %f2 8437bded2dbSJung-uk Kim camellia_f %f16, %f6, %f4, %f6 8447bded2dbSJung-uk Kim camellia_f %f18, %f0, %f2, %f0 8457bded2dbSJung-uk Kim camellia_f %f18, %f4, %f6, %f4 8467bded2dbSJung-uk Kim ldd [$key + 184], %f16 8477bded2dbSJung-uk Kim ldd [$key + 176], %f18 8487bded2dbSJung-uk Kim camellia_f %f20, %f2, %f0, %f2 8497bded2dbSJung-uk Kim camellia_f %f20, %f6, %f4, %f6 8507bded2dbSJung-uk Kim camellia_f %f22, %f0, %f2, %f0 8517bded2dbSJung-uk Kim camellia_f %f22, %f4, %f6, %f4 8527bded2dbSJung-uk Kim ldd [$key + 168], %f20 8537bded2dbSJung-uk Kim ldd [$key + 160], %f22 8547bded2dbSJung-uk Kim camellia_f %f24, %f2, %f0, %f8 8557bded2dbSJung-uk Kim camellia_f %f24, %f6, %f4, %f10 8567bded2dbSJung-uk Kim camellia_f %f26, %f0, %f8, %f2 8577bded2dbSJung-uk Kim camellia_f %f26, %f4, %f10, %f6 8587bded2dbSJung-uk Kim ldd [$key + 152], %f24 8597bded2dbSJung-uk Kim ldd [$key + 144], %f26 8607bded2dbSJung-uk Kim fxor %f30, %f8, %f0 8617bded2dbSJung-uk Kim fxor %f30, %f10, %f4 8627bded2dbSJung-uk Kim fxor %f28, %f2, %f2 8637bded2dbSJung-uk Kim fxor %f28, %f6, %f6 8647bded2dbSJung-uk Kim ldd [$key + 136], %f28 8657bded2dbSJung-uk Kim retl 8667bded2dbSJung-uk Kim ldd [$key + 128], %f30 8677bded2dbSJung-uk Kim.type _cmll256_decrypt_2x,#function 8687bded2dbSJung-uk Kim.size _cmll256_decrypt_2x,.-_cmll256_decrypt_2x 8697bded2dbSJung-uk Kim___ 8707bded2dbSJung-uk Kim 8717bded2dbSJung-uk Kim&alg_cbc_encrypt_implement("cmll",128); 8727bded2dbSJung-uk Kim&alg_cbc_encrypt_implement("cmll",256); 8737bded2dbSJung-uk Kim 8747bded2dbSJung-uk Kim&alg_cbc_decrypt_implement("cmll",128); 8757bded2dbSJung-uk Kim&alg_cbc_decrypt_implement("cmll",256); 8767bded2dbSJung-uk Kim 8777bded2dbSJung-uk Kimif ($::evp) { 8787bded2dbSJung-uk Kim &alg_ctr32_implement("cmll",128); 8797bded2dbSJung-uk Kim &alg_ctr32_implement("cmll",256); 8807bded2dbSJung-uk Kim} 8817bded2dbSJung-uk Kim}}} 8827bded2dbSJung-uk Kim 8837bded2dbSJung-uk Kimif (!$::evp) { 8847bded2dbSJung-uk Kim$code.=<<___; 8857bded2dbSJung-uk Kim.global Camellia_encrypt 8867bded2dbSJung-uk KimCamellia_encrypt=cmll_t4_encrypt 8877bded2dbSJung-uk Kim.global Camellia_decrypt 8887bded2dbSJung-uk KimCamellia_decrypt=cmll_t4_decrypt 8897bded2dbSJung-uk Kim.global Camellia_set_key 8907bded2dbSJung-uk Kim.align 32 8917bded2dbSJung-uk KimCamellia_set_key: 8927bded2dbSJung-uk Kim andcc %o2, 7, %g0 ! double-check alignment 8937bded2dbSJung-uk Kim bnz,a,pn %icc, 1f 8947bded2dbSJung-uk Kim mov -1, %o0 8957bded2dbSJung-uk Kim brz,a,pn %o0, 1f 8967bded2dbSJung-uk Kim mov -1, %o0 8977bded2dbSJung-uk Kim brz,a,pn %o2, 1f 8987bded2dbSJung-uk Kim mov -1, %o0 8997bded2dbSJung-uk Kim andncc %o1, 0x1c0, %g0 9007bded2dbSJung-uk Kim bnz,a,pn %icc, 1f 9017bded2dbSJung-uk Kim mov -2, %o0 9027bded2dbSJung-uk Kim cmp %o1, 128 9037bded2dbSJung-uk Kim bl,a,pn %icc, 1f 9047bded2dbSJung-uk Kim mov -2, %o0 9057bded2dbSJung-uk Kim b cmll_t4_set_key 9067bded2dbSJung-uk Kim nop 9077bded2dbSJung-uk Kim1: retl 9087bded2dbSJung-uk Kim nop 9097bded2dbSJung-uk Kim.type Camellia_set_key,#function 9107bded2dbSJung-uk Kim.size Camellia_set_key,.-Camellia_set_key 9117bded2dbSJung-uk Kim___ 9127bded2dbSJung-uk Kim 9137bded2dbSJung-uk Kimmy ($inp,$out,$len,$key,$ivec,$enc)=map("%o$_",(0..5)); 9147bded2dbSJung-uk Kim 9157bded2dbSJung-uk Kim$code.=<<___; 9167bded2dbSJung-uk Kim.globl Camellia_cbc_encrypt 9177bded2dbSJung-uk Kim.align 32 9187bded2dbSJung-uk KimCamellia_cbc_encrypt: 9197bded2dbSJung-uk Kim ld [$key + 272], %g1 9207bded2dbSJung-uk Kim nop 9217bded2dbSJung-uk Kim brz $enc, .Lcbc_decrypt 9227bded2dbSJung-uk Kim cmp %g1, 3 9237bded2dbSJung-uk Kim 9247bded2dbSJung-uk Kim be,pt %icc, cmll128_t4_cbc_encrypt 9257bded2dbSJung-uk Kim nop 9267bded2dbSJung-uk Kim ba cmll256_t4_cbc_encrypt 9277bded2dbSJung-uk Kim nop 9287bded2dbSJung-uk Kim 9297bded2dbSJung-uk Kim.Lcbc_decrypt: 9307bded2dbSJung-uk Kim be,pt %icc, cmll128_t4_cbc_decrypt 9317bded2dbSJung-uk Kim nop 9327bded2dbSJung-uk Kim ba cmll256_t4_cbc_decrypt 9337bded2dbSJung-uk Kim nop 9347bded2dbSJung-uk Kim.type Camellia_cbc_encrypt,#function 9357bded2dbSJung-uk Kim.size Camellia_cbc_encrypt,.-Camellia_cbc_encrypt 9367bded2dbSJung-uk Kim___ 9377bded2dbSJung-uk Kim} 9387bded2dbSJung-uk Kim 9397bded2dbSJung-uk Kim&emit_assembler(); 9407bded2dbSJung-uk Kim 94117f01e99SJung-uk Kimclose STDOUT or die "error closing STDOUT: $!"; 942