blob: 5d5d473ded229e0a3723e732bb901ac53cd212e0 [file] [log] [blame]
/* Copyright lowRISC contributors. */
/* Licensed under the Apache License, Version 2.0, see LICENSE for details. */
/* SPDX-License-Identifier: Apache-2.0 */
.section .text.start
/**
* Standalone RSA 1024 encrypt
*
* Uses OTBN modexp bignum lib to encrypt the message from the .data segment
* in this file with the public key consisting of e=65537 and modulus from
* .data segment in this file.
*
* Copies the encrypted message to wide registers for comparison (starting at
* w0). See comment at the end of the file for expected values.
*/
run_rsa_verify:
jal x1, modexp_var
/* pointer to out buffer */
lw x21, 28(x0)
/* copy all limbs of result to wide reg file */
li x8, 0
loop x30, 2
bn.lid x8, 0(x21++)
addi x8, x8, 1
ecall
.data
/*
* The words below are used by the code above, but the linker can't tell
* because we reference them by absolute address. Make a global symbol
* (cfg_data), which will refer to the whole lot and ensure that gc-sections
* doesn't discard them.
*/
.globl cfg_data
cfg_data:
/* exponent of the exponent (e') (Full exponent is e=2^e'+1) */
.word 0x00000010
/* number of limbs (N) */
.word 0x0000000C
/* pointer to m0' (dptr_m0d) */
.word 0x00000280
/* pointer to RR (dptr_rr) */
.word 0x000002c0
/* load pointer to modulus (dptr_m) */
.word 0x00000080
/* pointer to base bignum buffer (dptr_in) */
.word 0x000004c0
/* pointer to exponent buffer (dptr_exp, unused for encrypt) */
.word 0x000006c0
/* pointer to out buffer (dptr_out) */
.word 0x000008c0
/* Modulus */
.org 0x80
.word 0x6a6a75e1
.word 0xa018ddc5
.word 0x687bb168
.word 0x8e8205a5
.word 0x7dbfffa7
.word 0xc8722ac5
.word 0xf84d21cf
.word 0xe1312531
.word 0x0ce3f8a3
.word 0xa825f988
.word 0x57f51964
.word 0xb27e206a
.word 0x8e1dd008
.word 0x1c4fb8d7
.word 0x824fb142
.word 0x1c8be7b3
.word 0x7b9d6366
.word 0xc56ad0f2
.word 0xef762d5b
.word 0x4b1431e3
.word 0x8ae28eb9
.word 0xd41db7aa
.word 0x43cccdf7
.word 0x91b74a84
.word 0x80183850
.word 0x30e74d0d
.word 0xb62ed015
.word 0x235574d2
.word 0x8c28f251
.word 0x4f40def2
.word 0x24e2efdb
.word 0x9ebd1ff2
.word 0xfa7b49ee
.word 0x2819a938
.word 0x6e66b8c8
.word 0x24e41546
.word 0x4d783a7c
.word 0xd2947d3d
.word 0x1ab269e9
.word 0xfad39f16
.word 0xaab78f7b
.word 0x49d8b510
.word 0x35bf0dfb
.word 0xeb274754
.word 0x069eccc9
.word 0xc13c437e
.word 0xe3bc0f60
.word 0xc9e0e12f
.word 0xc253ac43
.word 0x89c240e0
.word 0xc4aba4e5
.word 0xedf34bc0
.word 0x5402c462
.word 0x4021b0bd
.word 0x996b6241
.word 0xc3d9945f
.word 0xa137ac60
.word 0xf0250bf5
.word 0xc8c7100f
.word 0xb70d6b88
.word 0x78916a8c
.word 0x33370e5d
.word 0x3970dcb9
.word 0xaf4c58b4
.word 0x5f78cb0d
.word 0xb02d90b7
.word 0xeb6c3d05
.word 0x04afc71a
.word 0x45185f0f
.word 0x987caa5b
.word 0x33976249
.word 0x565afdbc
.word 0x80a85056
.word 0x59e07655
.word 0x9a29e77d
.word 0x7a8dfb7f
.word 0x782e0204
.word 0x4d6713ff
.word 0x131000ea
.word 0xe18e1206
.word 0x21f57f30
.word 0xf24f038b
.word 0x59cf874d
.word 0x24c50525
.word 0xb52f170d
.word 0x46c9adde
.word 0x90e82c73
.word 0x1344ceaf
.word 0x663209f2
.word 0x24bd4fbf
.word 0x5e4ed04d
.word 0x0fce770a
.word 0x81f78793
.word 0xa792e13e
.word 0xa6c7bf58
.word 0xe1df9be8
/* Montgomery constant m0' */
.org 0x280
.word 0xf09b71df
.word 0xfd3e34f7
.word 0x0b908e3b
.word 0x95d310b2
.word 0x49659950
.word 0xa96ced37
.word 0x711cad8b
.word 0x1dfc9779
.word 0xcdf1cc06
.word 0x12e25f1f
.word 0x8f25ef95
.word 0xc90a2582
.word 0xbda827cf
.word 0x1406fb58
.word 0xadf07cd1
.word 0x7da9803a
/* Squared Mongomery Radix RR = (2^3072)^2 mod N */
.org 0x2c0
.word 0xa3eb77fa
.word 0x9db9a2ac
.word 0x2c19d4ae
.word 0xfb5be1e7
.word 0xdd38f5fb
.word 0xd0f4fdda
.word 0xeb165cd3
.word 0x546a7cfe
.word 0xcd410c5c
.word 0x73f5cf6b
.word 0x1185bcae
.word 0xda2e2103
.word 0xbab5ae26
.word 0x76e77aba
.word 0xf49dd5f7
.word 0x32318a29
.word 0x689a85bc
.word 0x8aa862a9
.word 0x538c240e
.word 0xb61eab77
.word 0x9ccd73f2
.word 0x6563c81a
.word 0x6c65ac0e
.word 0x90b209bf
.word 0xe642e25e
.word 0x7e351549
.word 0x879a1830
.word 0xc75cbb02
.word 0xe0112362
.word 0xebc2405f
.word 0x01dc7990
.word 0x3d3d07f3
.word 0xc5b9a5be
.word 0x98d8cc33
.word 0xdd65e108
.word 0xce301343
.word 0x0dbdc0cb
.word 0xc204b9ca
.word 0xeabe1810
.word 0x9849163a
.word 0x234c8ff7
.word 0x9bc14e3b
.word 0x4b4c2226
.word 0x079883be
.word 0xba59c5f5
.word 0xd9c77317
.word 0x1ce689f5
.word 0x05f49af5
.word 0x7a83d42a
.word 0xc509b5ca
.word 0x0811a95f
.word 0x093520a2
.word 0x73649941
.word 0xd9691ef5
.word 0x6878ec0d
.word 0x4043add6
.word 0x7516d8b7
.word 0x5c7070ff
.word 0x4ce52e1d
.word 0xf209e123
.word 0xfe4319c4
.word 0x9774620a
.word 0x7a58d047
.word 0x524b09b7
.word 0x96cbf044
.word 0x2a9044a2
.word 0x514995dc
.word 0xe4b83ed6
.word 0xd21be300
.word 0x2966d4f8
.word 0xd9ee19c4
.word 0xb60788f6
.word 0xf8d074ab
.word 0xa7e13295
.word 0x93718edc
.word 0xba9fc096
.word 0x0ad2fbbc
.word 0x9fe0c363
.word 0x472a10b4
.word 0xda9c946b
.word 0x37276997
.word 0x04e452fc
.word 0xd19233b5
.word 0xa277ef0e
.word 0x49619ddd
.word 0xb5822d56
.word 0x6ca4d02f
.word 0x7d0c0fc3
.word 0xa29196e2
.word 0xb6988a4f
.word 0x785b7552
.word 0xeaee3c24
.word 0x87993424
.word 0xfcb49693
.word 0x21e64d84
.word 0x9e2dcea8
/* signature */
.org 0x4c0
.word 0xceb7e983
.word 0xe693b200
.word 0xf9153989
.word 0xcf899599
.word 0x1ec09fae
.word 0xf2f88007
.word 0x2a24eed5
.word 0x9c5b7c4e
.word 0x21a153b2
.word 0xaf7583ae
.word 0x04fdd694
.word 0x7550094b
.word 0xb2a69ac4
.word 0xe49d8022
.word 0x7ed6f162
.word 0x14bb3a1b
.word 0xbb29d8dd
.word 0x5c5815c2
.word 0x7a80d848
.word 0xb122f449
.word 0x59dca808
.word 0xbc1443e2
.word 0xe304ff93
.word 0xcc97ee4b
.word 0x42ef6b57
.word 0x1436839f
.word 0xae860b45
.word 0x6a843a17
.word 0x2381fb91
.word 0x09fd0635
.word 0xa431aac3
.word 0xd7220269
.word 0xdf3e2697
.word 0x35e2915e
.word 0xedba6956
.word 0x1d387448
.word 0x930006df
.word 0x961e5f00
.word 0xf2a7e960
.word 0x884e4add
.word 0x7dfe76b1
.word 0x4079aa79
.word 0x1f3a378d
.word 0x96c20697
.word 0x268aea57
.word 0x2c8569a4
.word 0x0474f512
.word 0x2388555c
.word 0x58679953
.word 0xe73da3a0
.word 0x43431b9a
.word 0x699f04d3
.word 0xfc0be066
.word 0xcce606f2
.word 0xd94cdfa0
.word 0x6c1ddca3
.word 0xe96c11f6
.word 0xfc635db4
.word 0x3bdb4f69
.word 0xa621c3e7
.word 0x9f292111
.word 0xb86e1e6b
.word 0xb74f923b
.word 0x592967a0
.word 0xc412097f
.word 0x8c1c8ca7
.word 0x494fcdb6
.word 0x87c5fe0f
.word 0x50c01aee
.word 0x8a26368e
.word 0xeaf12232
.word 0x7dade4d8
.word 0x39eb2ac6
.word 0x744f8aaa
.word 0xf34908ca
.word 0x1e0c656c
.word 0xe96d4e29
.word 0x8575d194
.word 0xe439bd31
.word 0xa74a77e3
.word 0x0f465b88
.word 0xf4e21152
.word 0x80400ad8
.word 0xe58501ec
.word 0xa29d7536
.word 0x55c19326
.word 0x9ebbc63e
.word 0x20c75aee
.word 0xef6783d7
.word 0x59ffdba5
.word 0x879b937b
.word 0x43a5c74c
.word 0x82b8f825
.word 0xfdf04b3a
.word 0x8fc62fbe
.word 0x114e6da5
/* Full key for reference:
modulus n = 0xe1df9be8a6c7bf58a792e13e81f787930fce770a5e4ed04d24bd4fbf663209f21344ceaf90e82c7346c9addeb52f170d24c5052559cf874df24f038b21f57f30e18e1206131000ea4d6713ff782e02047a8dfb7f9a29e77d59e0765580a85056565afdbc33976249987caa5b45185f0f04afc71aeb6c3d05b02d90b75f78cb0daf4c58b43970dcb933370e5d78916a8cb70d6b88c8c7100ff0250bf5a137ac60c3d9945f996b62414021b0bd5402c462edf34bc0c4aba4e589c240e0c253ac43c9e0e12fe3bc0f60c13c437e069eccc9eb27475435bf0dfb49d8b510aab78f7bfad39f161ab269e9d2947d3d4d783a7c24e415466e66b8c82819a938fa7b49ee9ebd1ff224e2efdb4f40def28c28f251235574d2b62ed01530e74d0d8018385091b74a8443cccdf7d41db7aa8ae28eb94b1431e3ef762d5bc56ad0f27b9d63661c8be7b3824fb1421c4fb8d78e1dd008b27e206a57f51964a825f9880ce3f8a3e1312531f84d21cfc8722ac57dbfffa78e8205a5687bb168a018ddc56a6a75e1
private exponent d = 0x6041730707bffad6947efef72cdaa80f6f3e7cb351f2434984bd1a5585ff1006f5d82e3e5a41dee37748ae0c48e91ae93280b58b2fc545335dedf7241d222a045232c1928e20154bc41587cba852eef02aac03ffe25a3638d08adbd2df239b2cd7db29e34097243f19b912be176965e51809b28f51c14c15f6f8cc01a1317052d21ff67343414a06b081276184e66f622d060e8bf987ff5bd36a6e38cc6dd5cb5cdb05a461d485c829c4d1b5352e82b36814f4f4debb08e7fab769ff7e40bb19514af9168c9b773570c58f2c3e177edfe43d4e29ae72329a25d7da234ce73407d2619e5072dffbec1d9601446417d968de1e8772ce4b46fd5224cc0a6ddc889aedec8247de9a6b93f166df6981c487dc111b4eb0ec7bc15782db65570158da4523eab41c7455bd70c72a52e015a7cba482581bed16fef89213158c94f15592482069a742973b55372ced7d20dc9312980ce4696fa4d5715098c927fc12ab013af8df4b83869ef22b53c176f4a83b89cab93ce7f6e619ae0c59d7e511bebf06e3
public exponent e = 65537
squared Montgomery radix RR = 0x9e2dcea821e64d84fcb4969387993424eaee3c24785b7552b6988a4fa29196e27d0c0fc36ca4d02fb5822d5649619ddda277ef0ed19233b504e452fc37276997da9c946b472a10b49fe0c3630ad2fbbcba9fc09693718edca7e13295f8d074abb60788f6d9ee19c42966d4f8d21be300e4b83ed6514995dc2a9044a296cbf044524b09b77a58d0479774620afe4319c4f209e1234ce52e1d5c7070ff7516d8b74043add66878ec0dd9691ef573649941093520a20811a95fc509b5ca7a83d42a05f49af51ce689f5d9c77317ba59c5f5079883be4b4c22269bc14e3b234c8ff79849163aeabe1810c204b9ca0dbdc0cbce301343dd65e10898d8cc33c5b9a5be3d3d07f301dc7990ebc2405fe0112362c75cbb02879a18307e351549e642e25e90b209bf6c65ac0e6563c81a9ccd73f2b61eab77538c240e8aa862a9689a85bc32318a29f49dd5f776e77ababab5ae26da2e21031185bcae73f5cf6bcd410c5c546a7cfeeb165cd3d0f4fddadd38f5fbfb5be1e72c19d4ae9db9a2aca3eb77fa
Montgomery constant d0inv = 0x98a44f84397e684144214c83228ab43e1972189cbba34b5a4edbef91d022772d589d52b3b503299cf32a0c7b9aa9f8ed9c9c366b607da6fdb89991c29ccb146c2a85b6f413e358be5d5dc40e0aa492340f1f6d2a6eb015203f7b91bfe789377dfeed5e6ba3ea7bb2efeb980bce2895730b4b884748224db64040f5917fab212b3e8a289c370861d6760493e5323d6bf82669e60cd77df7f292c7833225f0b060359d1271ff80f3647dd87f7c876d545bdd643fd577de4ec7c80fe2308ecbd78cdaabc95e174c58c3b93cabc138c679a617c756ff3fb6fca8d912be11297cf059830b54188eb1161e1a7476270a3514789414cf662c4e04da7672f3ea877446b2996af70106f38a77aafcc273ff441e5f0fc30d8cef33be30b15cfe44727c0936dc64262c4c771d236ad834fefc6f3228def492fa69ece22f8cdd6115f0a5133e7da9803aadf07cd11406fb58bda827cfc90a25828f25ef9512e25f1fcdf1cc061dfc9779711cad8ba96ced374965995095d310b20b908e3bfd3e34f7f09b71df
*/
/* Expected recovered message in regfile:
w0 = 0x5555555555555555555555555555555555555555555555555555555555555555
w1 = 0x5555555555555555555555555555555555555555555555555555555555555555
w2 = 0x5555555555555555555555555555555555555555555555555555555555555555
w3 = 0x5555555555555555555555555555555555555555555555555555555555555555
w4 = 0x5555555555555555555555555555555555555555555555555555555555555555
w5 = 0x5555555555555555555555555555555555555555555555555555555555555555
w6 = 0x5555555555555555555555555555555555555555555555555555555555555555
w7 = 0x5555555555555555555555555555555555555555555555555555555555555555
w8 = 0x5555555555555555555555555555555555555555555555555555555555555555
w9 = 0x5555555555555555555555555555555555555555555555555555555555555555
w10 = 0x5555555555555555555555555555555555555555555555555555555555555555
w11 = 0x5555555555555555555555555555555555555555555555555555555555555555
w12 = 0x5555555555555555555555555555555555555555555555555555555555555555
w13 = 0x5555555555555555555555555555555555555555555555555555555555555555
w14 = 0x5555555555555555555555555555555555555555555555555555555555555555
w15 = 0x5555555555555555555555555555555555555555555555555555555555555555
*/