Skip to main content

fluentbase_runtime/
crypto.rs

1use crate::{syscall_handler::*, RuntimeContextWrapper};
2use fluentbase_types::{
3    CryptoAPI, UnwrapExitCode, BLS12381_FP_SIZE, BLS12381_G1_COMPRESSED_SIZE,
4    BLS12381_G1_RAW_AFFINE_SIZE, BN254_FP_SIZE, BN254_G1_RAW_AFFINE_SIZE,
5    ED25519_POINT_COMPRESSED_SIZE, ED25519_POINT_DECOMPRESSED_SIZE, SECP256K1_G1_COMPRESSED_SIZE,
6    SECP256K1_G1_RAW_AFFINE_SIZE, SECP256R1_G1_COMPRESSED_SIZE, SECP256R1_G1_RAW_AFFINE_SIZE,
7};
8
9#[rustfmt::skip]
10impl CryptoAPI for RuntimeContextWrapper {
11    #[inline(always)]
12    fn keccak256_permute(state: &mut [u64; 25]) {
13        syscall_hashing_keccak256_permute_impl(state);
14    }
15    #[inline(always)]
16    fn sha256_extend(w: &mut [u32; 64]) {
17        syscall_hashing_sha256_extend_impl(w);
18    }
19    #[inline(always)]
20    fn sha256_compress(state: &mut [u32; 8], w: &[u32; 64]) {
21        syscall_hashing_sha256_compress_impl(state, w);
22    }
23
24    #[inline(always)]
25    fn ed25519_decompress(y: [u8; ED25519_POINT_COMPRESSED_SIZE], sign: u32) -> [u8; ED25519_POINT_DECOMPRESSED_SIZE] {
26        syscall_ed25519_decompress_impl(y, sign).unwrap_exit_code()
27    }
28    #[inline(always)]
29    fn ed25519_add(p: [u8; ED25519_POINT_DECOMPRESSED_SIZE], q: [u8; ED25519_POINT_DECOMPRESSED_SIZE]) -> [u8; ED25519_POINT_DECOMPRESSED_SIZE] {
30        syscall_edwards_add_impl(p, q).unwrap_exit_code()
31    }
32
33    #[inline(always)]
34    fn tower_fp1_bn254_add(x: [u8; BN254_FP_SIZE], y: [u8; BN254_FP_SIZE]) -> [u8; BN254_FP_SIZE] {
35        syscall_tower_fp1_bn254_add_impl(x, y).unwrap_exit_code()
36    }
37    #[inline(always)]
38    fn tower_fp1_bn254_sub(x: [u8; BN254_FP_SIZE], y: [u8; BN254_FP_SIZE]) -> [u8; BN254_FP_SIZE] {
39        syscall_tower_fp1_bn254_sub_impl(x, y).unwrap_exit_code()
40    }
41    #[inline(always)]
42    fn tower_fp1_bn254_mul(x: [u8; BN254_FP_SIZE], y: [u8; BN254_FP_SIZE]) -> [u8; BN254_FP_SIZE] {
43        syscall_tower_fp1_bn254_mul_impl(x, y).unwrap_exit_code()
44    }
45    #[inline(always)]
46    fn tower_fp1_bls12381_add(x: [u8; BLS12381_FP_SIZE], y: [u8; BLS12381_FP_SIZE]) -> [u8; BLS12381_FP_SIZE] {
47        syscall_tower_fp1_bls12381_add_impl(x, y).unwrap_exit_code()
48    }
49    #[inline(always)]
50    fn tower_fp1_bls12381_sub(x: [u8; BLS12381_FP_SIZE], y: [u8; BLS12381_FP_SIZE]) -> [u8; BLS12381_FP_SIZE] {
51        syscall_tower_fp1_bls12381_sub_impl(x, y).unwrap_exit_code()
52    }
53    #[inline(always)]
54    fn tower_fp1_bls12381_mul(x: [u8; BLS12381_FP_SIZE], y: [u8; BLS12381_FP_SIZE]) -> [u8; BLS12381_FP_SIZE] {
55        syscall_tower_fp1_bls12381_mul_impl(x, y).unwrap_exit_code()
56    }
57    #[inline(always)]
58    fn tower_fp2_bn254_add(a_c0: [u8; BN254_FP_SIZE], a_c1: [u8; BN254_FP_SIZE], b_c0: [u8; BN254_FP_SIZE], b_c1: [u8; BN254_FP_SIZE]) -> ([u8; BN254_FP_SIZE], [u8; BN254_FP_SIZE]) {
59        syscall_tower_fp2_bn254_add_impl(a_c0, a_c1, b_c0, b_c1).unwrap_exit_code()
60    }
61    #[inline(always)]
62    fn tower_fp2_bn254_sub(a_c0: [u8; BN254_FP_SIZE], a_c1: [u8; BN254_FP_SIZE], b_c0: [u8; BN254_FP_SIZE], b_c1: [u8; BN254_FP_SIZE]) -> ([u8; BN254_FP_SIZE], [u8; BN254_FP_SIZE]) {
63        syscall_tower_fp2_bn254_sub_impl(a_c0, a_c1, b_c0, b_c1).unwrap_exit_code()
64    }
65    #[inline(always)]
66    fn tower_fp2_bn254_mul(a_c0: [u8; BN254_FP_SIZE], a_c1: [u8; BN254_FP_SIZE], b_c0: [u8; BN254_FP_SIZE], b_c1: [u8; BN254_FP_SIZE]) -> ([u8; BN254_FP_SIZE], [u8; BN254_FP_SIZE]) {
67        syscall_tower_fp2_bn254_mul_impl(a_c0, a_c1, b_c0, b_c1).unwrap_exit_code()
68    }
69    #[inline(always)]
70    fn tower_fp2_bls12381_add(a_c0: [u8; BLS12381_FP_SIZE], a_c1: [u8; BLS12381_FP_SIZE], b_c0: [u8; BLS12381_FP_SIZE], b_c1: [u8; BLS12381_FP_SIZE]) -> ([u8; BLS12381_FP_SIZE], [u8; BLS12381_FP_SIZE]) {
71        syscall_tower_fp2_bls12381_add_impl(a_c0, a_c1, b_c0, b_c1).unwrap_exit_code()
72    }
73    #[inline(always)]
74    fn tower_fp2_bls12381_sub(a_c0: [u8; BLS12381_FP_SIZE], a_c1: [u8; BLS12381_FP_SIZE], b_c0: [u8; BLS12381_FP_SIZE], b_c1: [u8; BLS12381_FP_SIZE]) -> ([u8; BLS12381_FP_SIZE], [u8; BLS12381_FP_SIZE]) {
75        syscall_tower_fp2_bls12381_sub_impl(a_c0, a_c1, b_c0, b_c1).unwrap_exit_code()
76    }
77    #[inline(always)]
78    fn tower_fp2_bls12381_mul(a_c0: [u8; BLS12381_FP_SIZE], a_c1: [u8; BLS12381_FP_SIZE], b_c0: [u8; BLS12381_FP_SIZE], b_c1: [u8; BLS12381_FP_SIZE]) -> ([u8; BLS12381_FP_SIZE], [u8; BLS12381_FP_SIZE]) {
79        syscall_tower_fp2_bls12381_mul_impl(a_c0, a_c1, b_c0, b_c1).unwrap_exit_code()
80    }
81
82    #[inline(always)]
83    fn secp256k1_add(p: [u8; SECP256K1_G1_RAW_AFFINE_SIZE], q: [u8; SECP256K1_G1_RAW_AFFINE_SIZE]) -> [u8; SECP256K1_G1_RAW_AFFINE_SIZE] {
84        syscall_secp256k1_add_impl(p, q).unwrap_exit_code()
85    }
86    #[inline(always)]
87    fn secp256k1_decompress(mut x: [u8; SECP256K1_G1_COMPRESSED_SIZE], sign: u32) -> [u8; SECP256K1_G1_RAW_AFFINE_SIZE] {
88        x.reverse();
89        let mut result = syscall_secp256k1_decompress_impl(x, sign).unwrap_exit_code();
90        result.reverse();
91        result
92    }
93    #[inline(always)]
94    fn secp256k1_double(p: [u8; SECP256K1_G1_RAW_AFFINE_SIZE]) -> [u8; SECP256K1_G1_RAW_AFFINE_SIZE] {
95        syscall_secp256k1_double_impl(p).unwrap_exit_code()
96    }
97
98    #[inline(always)]
99    fn secp256r1_add(p: [u8; SECP256R1_G1_RAW_AFFINE_SIZE], q: [u8; SECP256R1_G1_RAW_AFFINE_SIZE]) -> [u8; SECP256R1_G1_RAW_AFFINE_SIZE] {
100        syscall_secp256r1_add_impl(p, q).unwrap_exit_code()
101    }
102    #[inline(always)]
103    fn secp256r1_decompress(mut x: [u8; SECP256R1_G1_COMPRESSED_SIZE], sign: u32) -> [u8; SECP256R1_G1_RAW_AFFINE_SIZE] {
104        x.reverse();
105        let mut result = syscall_secp256r1_decompress_impl(x, sign).unwrap_exit_code();
106        result.reverse();
107        result
108    }
109    #[inline(always)]
110    fn secp256r1_double(p: [u8; SECP256R1_G1_RAW_AFFINE_SIZE]) -> [u8; SECP256R1_G1_RAW_AFFINE_SIZE] {
111        syscall_secp256r1_double_impl(p).unwrap_exit_code()
112    }
113
114    #[inline(always)]
115    fn bls12381_add(p: [u8; BLS12381_G1_RAW_AFFINE_SIZE], q: [u8; BLS12381_G1_RAW_AFFINE_SIZE]) -> [u8; BLS12381_G1_RAW_AFFINE_SIZE] {
116        syscall_bls12381_add_impl(p, q).unwrap_exit_code()
117    }
118    #[inline(always)]
119    fn bls12381_decompress(mut x: [u8; BLS12381_G1_COMPRESSED_SIZE], sign: u32) -> [u8; BLS12381_G1_RAW_AFFINE_SIZE] {
120        x.reverse();
121        let mut result = syscall_bls12381_decompress_impl(x, sign).unwrap_exit_code();
122        result.reverse();
123        result
124    }
125    #[inline(always)]
126    fn bls12381_double(p: [u8; BLS12381_G1_RAW_AFFINE_SIZE]) -> [u8; BLS12381_G1_RAW_AFFINE_SIZE] {
127        syscall_bls12381_double_impl(p).unwrap_exit_code()
128    }
129
130    #[inline(always)]
131    fn bn254_add(p: [u8; BN254_G1_RAW_AFFINE_SIZE], q: [u8; BN254_G1_RAW_AFFINE_SIZE]) -> [u8; BN254_G1_RAW_AFFINE_SIZE] {
132        syscall_bn254_add_impl(p, q).unwrap_exit_code()
133    }
134    #[inline(always)]
135    fn bn254_double(p: [u8; BN254_G1_RAW_AFFINE_SIZE]) -> [u8; BN254_G1_RAW_AFFINE_SIZE] {
136        syscall_bn254_double_impl(p).unwrap_exit_code()
137    }
138
139    #[inline(always)]
140    fn uint256_mul_mod(x: &[u8; 32], y: &[u8; 32], m: &[u8; 32]) -> [u8; 32] {
141        syscall_uint256_mul_mod_impl(x, y, m)
142    }
143    #[inline(always)]
144    fn uint256_x2048_mul(a: &[u8; 32], b: &[u8; 256]) -> ([u8; 256], [u8; 32]) {
145        syscall_uint256_x2048_mul_impl(a, b)
146    }
147}