| /* Copyright lowRISC contributors. */ | 
 | /* Licensed under the Apache License, Version 2.0, see LICENSE for details. */ | 
 | /* SPDX-License-Identifier: Apache-2.0 */ | 
 |  | 
 | /** | 
 |  * Elliptic curve P-256 ECDSA | 
 |  * | 
 |  * Uses OTBN ECC P-256 lib to perform an ECDSA operations. | 
 |  */ | 
 |  | 
 | .section .text.start | 
 | .globl start | 
 | start: | 
 |   /* Read mode, then tail-call either p256_ecdsa_sign or p256_ecdsa_verify */ | 
 |   la    x2, mode | 
 |   lw    x2, 0(x2) | 
 |  | 
 |   li    x3, 1 | 
 |   beq   x2, x3, p256_ecdsa_sign | 
 |  | 
 |   li    x3, 2 | 
 |   beq   x2, x3, p256_ecdsa_verify | 
 |  | 
 |   /* Mode is neither 1 (= sign) nor 2 (= verify). Fail. */ | 
 |   unimp | 
 |  | 
 | .text | 
 | p256_ecdsa_sign: | 
 |   jal      x1, p256_sign | 
 |   ecall | 
 |  | 
 | p256_ecdsa_verify: | 
 |   jal      x1, p256_verify | 
 |   ecall | 
 |  | 
 | .data | 
 |  | 
 | /* Freely available DMEM space. */ | 
 |  | 
 | /* Operation mode (1 = sign; 2 = verify) */ | 
 | .globl mode | 
 | .balign 4 | 
 | mode: | 
 |   .word 0x1 | 
 |  | 
 | /* All constants below must be 256b-aligned. */ | 
 |  | 
 | /* random scalar k (in two shares) */ | 
 | .global k0 | 
 | .balign 32 | 
 | k0: | 
 |   /* k0 = 0x0000000...ffffffff */ | 
 |   /* Note: Byte order in a word is little-endian */ | 
 |   .word 0xffffffff | 
 |   .word 0xffffffff | 
 |   .word 0xffffffff | 
 |   .word 0xffffffff | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |  | 
 | .global k1 | 
 | .balign 32 | 
 | k1: | 
 |   /* k1= 0x0000000...00000000 */ | 
 |   /* Note: Byte order in a word is little-endian */ | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |  | 
 | /* message digest */ | 
 | .globl msg | 
 | .balign 32 | 
 | msg: | 
 |   /* msg = "Hello OTBN."*/ | 
 |   /* msg = 0x06d71207...4456fd21 */ | 
 |   /* Note: Byte order in a word is little-endian */ | 
 |   .word 0x4456fd21 | 
 |   .word 0x400bdd7d | 
 |   .word 0xb54d7452 | 
 |   .word 0x17d015f1 | 
 |   .word 0x90d4d90b | 
 |   .word 0xb028ad8a | 
 |   .word 0x6ce90fef | 
 |   .word 0x06d71207 | 
 |  | 
 | /* signature R */ | 
 | .globl r | 
 | .balign 32 | 
 | r: | 
 |   .zero 32 | 
 |  | 
 | /* signature S */ | 
 | .globl s | 
 | .balign 32 | 
 | s: | 
 |   .zero 32 | 
 |  | 
 | /* public key x-coordinate */ | 
 | .globl x | 
 | .balign 32 | 
 | x: | 
 |   /* x = 0x6b17d1f2...d898c296 */ | 
 |   /* Note: Byte order in a word is little-endian */ | 
 |   .word 0xd898c296 | 
 |   .word 0xf4a13945 | 
 |   .word 0x2deb33a0 | 
 |   .word 0x77037d81 | 
 |   .word 0x63a440f2 | 
 |   .word 0xf8bce6e5 | 
 |   .word 0xe12c4247 | 
 |   .word 0x6b17d1f2 | 
 |  | 
 | /* public key y-coordinate */ | 
 | .globl y | 
 | .balign 32 | 
 | y: | 
 |   /* y= 0x4fe342e2...37bf51f5 */ | 
 |   /* Note: Byte order in a word is little-endian */ | 
 |   .word  0x37bf51f5 | 
 |   .word  0xcbb64068 | 
 |   .word  0x6b315ece | 
 |   .word  0x2bce3357 | 
 |   .word  0x7c0f9e16 | 
 |   .word  0x8ee7eb4a | 
 |   .word  0xfe1a7f9b | 
 |   .word  0x4fe342e2 | 
 |  | 
 | /* private key d (in two shares) */ | 
 | .globl d0 | 
 | .balign 32 | 
 | d0: | 
 |   /* d0= 0x5545a0b7...af57b4cd */ | 
 |   /* Note: Byte order in a word is little-endian */ | 
 |   .word 0xaf57b4cd | 
 |   .word 0x744c9f1c | 
 |   .word 0x8b7e0c02 | 
 |   .word 0x283e93e9 | 
 |   .word 0x0d18f00c | 
 |   .word 0xda0b6cf4 | 
 |   .word 0x8fe6bb7a | 
 |   .word 0x5545a0b7 | 
 |  | 
 | .globl d1 | 
 | .balign 32 | 
 | d1: | 
 |   /* d1 = 0x00000000...00000000 */ | 
 |   /* Note: Byte order in a word is little-endian */ | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |  | 
 | /* verification result x_r (aka x_1) */ | 
 | .globl x_r | 
 | .balign 32 | 
 | x_r: | 
 |   .zero 32 |