1
+ use super :: utils:: { fp_to_bytes, remove_padding, FP_LENGTH , PADDED_FP_LENGTH } ;
1
2
use blst:: { blst_fp_from_bendian, blst_p2_affine, blst_p2_affine_in_g2} ;
2
3
use revm_primitives:: { Bytes , PrecompileError } ;
3
4
4
- use super :: utils:: { fp_to_bytes, remove_padding, FP_LENGTH , PADDED_FP_LENGTH } ;
5
-
6
5
/// Length of each of the elements in a g2 operation input.
7
6
pub ( super ) const G2_INPUT_ITEM_LENGTH : usize = 256 ;
8
7
/// Output length of a g2 operation.
9
8
const G2_OUTPUT_LENGTH : usize = 256 ;
10
9
11
10
/// Encodes a G2 point in affine format into a byte slice with padded elements.
12
- pub ( super ) fn encode_g2_point ( input : * const blst_p2_affine ) -> Bytes {
11
+ pub ( super ) fn encode_g2_point ( input : & blst_p2_affine ) -> Bytes {
13
12
let mut out = vec ! [ 0u8 ; G2_OUTPUT_LENGTH ] ;
14
- // SAFETY: out comes from fixed length array, input is a blst value.
15
- unsafe {
16
- fp_to_bytes ( & mut out[ ..PADDED_FP_LENGTH ] , & ( * input) . x . fp [ 0 ] ) ;
17
- fp_to_bytes (
18
- & mut out[ PADDED_FP_LENGTH ..2 * PADDED_FP_LENGTH ] ,
19
- & ( * input) . x . fp [ 1 ] ,
20
- ) ;
21
- fp_to_bytes (
22
- & mut out[ 2 * PADDED_FP_LENGTH ..3 * PADDED_FP_LENGTH ] ,
23
- & ( * input) . y . fp [ 0 ] ,
24
- ) ;
25
- fp_to_bytes (
26
- & mut out[ 3 * PADDED_FP_LENGTH ..4 * PADDED_FP_LENGTH ] ,
27
- & ( * input) . y . fp [ 1 ] ,
28
- ) ;
29
- }
13
+ fp_to_bytes ( & mut out[ ..PADDED_FP_LENGTH ] , & input. x . fp [ 0 ] ) ;
14
+ fp_to_bytes (
15
+ & mut out[ PADDED_FP_LENGTH ..2 * PADDED_FP_LENGTH ] ,
16
+ & input. x . fp [ 1 ] ,
17
+ ) ;
18
+ fp_to_bytes (
19
+ & mut out[ 2 * PADDED_FP_LENGTH ..3 * PADDED_FP_LENGTH ] ,
20
+ & input. y . fp [ 0 ] ,
21
+ ) ;
22
+ fp_to_bytes (
23
+ & mut out[ 3 * PADDED_FP_LENGTH ..4 * PADDED_FP_LENGTH ] ,
24
+ & input. y . fp [ 1 ] ,
25
+ ) ;
30
26
out. into ( )
31
27
}
32
28
33
29
/// Extracts a G2 point in Affine format from a 256 byte slice representation.
34
- pub ( super ) fn extract_g2_input ( input : & [ u8 ] ) -> Result < * const blst_p2_affine , PrecompileError > {
30
+ pub ( super ) fn extract_g2_input ( input : & [ u8 ] ) -> Result < blst_p2_affine , PrecompileError > {
35
31
if input. len ( ) != G2_INPUT_ITEM_LENGTH {
36
32
return Err ( PrecompileError :: Other ( format ! (
37
- "Input should be {G2_INPUT_ITEM_LENGTH} bits , was {}" ,
33
+ "Input should be {G2_INPUT_ITEM_LENGTH} bytes , was {}" ,
38
34
input. len( )
39
35
) ) ) ;
40
36
}
41
37
42
- let mut input_fps: [ [ u8 ; FP_LENGTH ] ; 4 ] = [ [ 0 ; FP_LENGTH ] ; 4 ] ;
38
+ let mut input_fps: [ & [ u8 ; FP_LENGTH ] ; 4 ] = [ & [ 0 ; FP_LENGTH ] ; 4 ] ;
43
39
for i in 0 ..4 {
44
40
input_fps[ i] = remove_padding ( & input[ i * PADDED_FP_LENGTH ..( i + 1 ) * PADDED_FP_LENGTH ] ) ?;
45
41
}
@@ -54,11 +50,9 @@ pub(super) fn extract_g2_input(input: &[u8]) -> Result<*const blst_p2_affine, Pr
54
50
}
55
51
56
52
// SAFETY: out is a blst value.
57
- unsafe {
58
- if !blst_p2_affine_in_g2 ( & out) {
59
- return Err ( PrecompileError :: Other ( "Element not in G2" . to_string ( ) ) ) ;
60
- }
53
+ if unsafe { !blst_p2_affine_in_g2 ( & out) } {
54
+ return Err ( PrecompileError :: Other ( "Element not in G2" . to_string ( ) ) ) ;
61
55
}
62
56
63
- Ok ( & mut out as * const _ )
57
+ Ok ( out)
64
58
}
0 commit comments