61 lines
1.9 KiB
Perl
61 lines
1.9 KiB
Perl
#! /usr/bin/env perl
|
|
|
|
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
|
|
# SPDX-License-Identifier: Apache-2.0 OR ISC
|
|
|
|
# RNDR from ARMv8.5-A.
|
|
# System register encoding: s3_3_c2_c4_0.
|
|
# see https://developer.arm.com/documentation/ddi0601/2024-09/AArch64-Registers/RNDR--Random-Number
|
|
|
|
# The first two arguments should always be the flavour and output file path.
|
|
if ($#ARGV < 1) { die "Not enough arguments provided.
|
|
Two arguments are necessary: the flavour and the output file path."; }
|
|
|
|
my $flavour = shift;
|
|
my $output = shift;
|
|
|
|
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
|
|
( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
|
|
( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
|
|
die "can't locate arm-xlate.pl";
|
|
|
|
open OUT,qq{| "$^X" "$xlate" "$flavour" "$output"};
|
|
*STDOUT=*OUT;
|
|
|
|
my ($out, $len, $rndr64) = ("x0", "x1", "x2");
|
|
|
|
$code.=<<___;
|
|
#include <openssl/arm_arch.h>
|
|
|
|
.arch armv8-a
|
|
.text
|
|
|
|
# int CRYPTO_rndr_multiple8(uint8_t *out, const size_t len)
|
|
.globl CRYPTO_rndr_multiple8
|
|
.type CRYPTO_rndr_multiple8,%function
|
|
.align 4
|
|
CRYPTO_rndr_multiple8:
|
|
cbz $len, .Lrndr_multiple8_error // len = 0 is not supported
|
|
|
|
.Lrndr_multiple8_loop:
|
|
mrs $rndr64, s3_3_c2_c4_0 // rndr instruction https://developer.arm.com/documentation/ddi0601/2024-09/Index-by-Encoding
|
|
cbz $rndr64, .Lrndr_multiple8_error // Check if rndr failed
|
|
|
|
str $rndr64, [$out], #8 // Copy 8 bytes to *out and increment pointer by 8
|
|
sub $len, $len, #8
|
|
cbz $len, .Lrndr_multiple8_done // If multiple of 8 this will be 0 eventually
|
|
b .Lrndr_multiple8_loop
|
|
|
|
.Lrndr_multiple8_done:
|
|
mov x0, #1 // Return value success
|
|
ret
|
|
|
|
.Lrndr_multiple8_error:
|
|
mov x0, #0 // Return value error
|
|
ret
|
|
.size CRYPTO_rndr_multiple8,.-CRYPTO_rndr_multiple8
|
|
___
|
|
|
|
print $code;
|
|
close STDOUT or die "error closing STDOUT: $!"; # enforce flush
|