1
1
use chrono:: Duration ;
2
2
use relay_auth:: {
3
- generate_key_pair , generate_relay_id , PublicKey , RegisterRequest , RegisterResponse , RelayId ,
4
- RelayVersion , SecretKey ,
3
+ PublicKey , RegisterRequest , RegisterResponse , RelayId , RelayVersion , SecretKey ,
4
+ generate_key_pair , generate_relay_id ,
5
5
} ;
6
6
use serde:: Serialize ;
7
7
@@ -26,45 +26,45 @@ pub struct RelayKeyPair {
26
26
pub struct RelayRegisterRequest ;
27
27
28
28
/// Parses a public key from a string.
29
- #[ no_mangle]
29
+ #[ unsafe ( no_mangle) ]
30
30
#[ relay_ffi:: catch_unwind]
31
31
pub unsafe extern "C" fn relay_publickey_parse ( s : * const RelayStr ) -> * mut RelayPublicKey {
32
- let public_key: PublicKey = ( * s) . as_str ( ) . parse ( ) ?;
32
+ let public_key: PublicKey = unsafe { ( * s) . as_str ( ) } . parse ( ) ?;
33
33
Box :: into_raw ( Box :: new ( public_key) ) as * mut RelayPublicKey
34
34
}
35
35
36
36
/// Frees a public key.
37
- #[ no_mangle]
37
+ #[ unsafe ( no_mangle) ]
38
38
#[ relay_ffi:: catch_unwind]
39
39
pub unsafe extern "C" fn relay_publickey_free ( spk : * mut RelayPublicKey ) {
40
40
if !spk. is_null ( ) {
41
41
let pk = spk as * mut PublicKey ;
42
- let _dropped = Box :: from_raw ( pk) ;
42
+ let _dropped = unsafe { Box :: from_raw ( pk) } ;
43
43
}
44
44
}
45
45
46
46
/// Converts a public key into a string.
47
- #[ no_mangle]
47
+ #[ unsafe ( no_mangle) ]
48
48
#[ relay_ffi:: catch_unwind]
49
49
pub unsafe extern "C" fn relay_publickey_to_string ( spk : * const RelayPublicKey ) -> RelayStr {
50
50
let pk = spk as * const PublicKey ;
51
- RelayStr :: from_string ( ( * pk) . to_string ( ) )
51
+ unsafe { RelayStr :: from_string ( ( * pk) . to_string ( ) ) }
52
52
}
53
53
54
54
/// Verifies a signature
55
- #[ no_mangle]
55
+ #[ unsafe ( no_mangle) ]
56
56
#[ relay_ffi:: catch_unwind]
57
57
pub unsafe extern "C" fn relay_publickey_verify (
58
58
spk : * const RelayPublicKey ,
59
59
data : * const RelayBuf ,
60
60
sig : * const RelayStr ,
61
61
) -> bool {
62
62
let pk = spk as * const PublicKey ;
63
- ( * pk) . verify ( ( * data) . as_bytes ( ) , ( * sig) . as_str ( ) )
63
+ unsafe { ( * pk) . verify ( ( * data) . as_bytes ( ) , ( * sig) . as_str ( ) ) }
64
64
}
65
65
66
66
/// Verifies a signature
67
- #[ no_mangle]
67
+ #[ unsafe ( no_mangle) ]
68
68
#[ relay_ffi:: catch_unwind]
69
69
pub unsafe extern "C" fn relay_publickey_verify_timestamp (
70
70
spk : * const RelayPublicKey ,
@@ -74,48 +74,48 @@ pub unsafe extern "C" fn relay_publickey_verify_timestamp(
74
74
) -> bool {
75
75
let pk = spk as * const PublicKey ;
76
76
let max_age = Some ( Duration :: seconds ( i64:: from ( max_age) ) ) ;
77
- ( * pk) . verify_timestamp ( ( * data) . as_bytes ( ) , ( * sig) . as_str ( ) , max_age)
77
+ unsafe { ( * pk) . verify_timestamp ( ( * data) . as_bytes ( ) , ( * sig) . as_str ( ) , max_age) }
78
78
}
79
79
80
80
/// Parses a secret key from a string.
81
- #[ no_mangle]
81
+ #[ unsafe ( no_mangle) ]
82
82
#[ relay_ffi:: catch_unwind]
83
83
pub unsafe extern "C" fn relay_secretkey_parse ( s : & RelayStr ) -> * mut RelaySecretKey {
84
- let secret_key: SecretKey = s. as_str ( ) . parse ( ) ?;
84
+ let secret_key: SecretKey = unsafe { s. as_str ( ) } . parse ( ) ?;
85
85
Box :: into_raw ( Box :: new ( secret_key) ) as * mut RelaySecretKey
86
86
}
87
87
88
88
/// Frees a secret key.
89
- #[ no_mangle]
89
+ #[ unsafe ( no_mangle) ]
90
90
#[ relay_ffi:: catch_unwind]
91
91
pub unsafe extern "C" fn relay_secretkey_free ( spk : * mut RelaySecretKey ) {
92
92
if !spk. is_null ( ) {
93
93
let pk = spk as * mut SecretKey ;
94
- let _dropped = Box :: from_raw ( pk) ;
94
+ let _dropped = unsafe { Box :: from_raw ( pk) } ;
95
95
}
96
96
}
97
97
98
98
/// Converts a secret key into a string.
99
- #[ no_mangle]
99
+ #[ unsafe ( no_mangle) ]
100
100
#[ relay_ffi:: catch_unwind]
101
101
pub unsafe extern "C" fn relay_secretkey_to_string ( spk : * const RelaySecretKey ) -> RelayStr {
102
102
let pk = spk as * const SecretKey ;
103
- RelayStr :: from_string ( ( * pk) . to_string ( ) )
103
+ unsafe { RelayStr :: from_string ( ( * pk) . to_string ( ) ) }
104
104
}
105
105
106
106
/// Verifies a signature
107
- #[ no_mangle]
107
+ #[ unsafe ( no_mangle) ]
108
108
#[ relay_ffi:: catch_unwind]
109
109
pub unsafe extern "C" fn relay_secretkey_sign (
110
110
spk : * const RelaySecretKey ,
111
111
data : * const RelayBuf ,
112
112
) -> RelayStr {
113
113
let pk = spk as * const SecretKey ;
114
- RelayStr :: from_string ( ( * pk) . sign ( ( * data) . as_bytes ( ) ) )
114
+ unsafe { RelayStr :: from_string ( ( * pk) . sign ( ( * data) . as_bytes ( ) ) ) }
115
115
}
116
116
117
117
/// Generates a secret, public key pair.
118
- #[ no_mangle]
118
+ #[ unsafe ( no_mangle) ]
119
119
#[ relay_ffi:: catch_unwind]
120
120
pub unsafe extern "C" fn relay_generate_key_pair ( ) -> RelayKeyPair {
121
121
let ( sk, pk) = generate_key_pair ( ) ;
@@ -126,15 +126,15 @@ pub unsafe extern "C" fn relay_generate_key_pair() -> RelayKeyPair {
126
126
}
127
127
128
128
/// Randomly generates an relay id
129
- #[ no_mangle]
129
+ #[ unsafe ( no_mangle) ]
130
130
#[ relay_ffi:: catch_unwind]
131
131
pub unsafe extern "C" fn relay_generate_relay_id ( ) -> RelayUuid {
132
132
let relay_id = generate_relay_id ( ) ;
133
133
RelayUuid :: new ( relay_id)
134
134
}
135
135
136
136
/// Creates a challenge from a register request and returns JSON.
137
- #[ no_mangle]
137
+ #[ unsafe ( no_mangle) ]
138
138
#[ relay_ffi:: catch_unwind]
139
139
pub unsafe extern "C" fn relay_create_register_challenge (
140
140
data : * const RelayBuf ,
@@ -147,10 +147,13 @@ pub unsafe extern "C" fn relay_create_register_challenge(
147
147
m => Some ( Duration :: seconds ( i64:: from ( m) ) ) ,
148
148
} ;
149
149
150
- let req =
151
- RegisterRequest :: bootstrap_unpack ( ( * data) . as_bytes ( ) , ( * signature) . as_str ( ) , max_age) ?;
150
+ let challenge = unsafe {
151
+ let req =
152
+ RegisterRequest :: bootstrap_unpack ( ( * data) . as_bytes ( ) , ( * signature) . as_str ( ) , max_age) ?;
153
+
154
+ req. into_challenge ( ( * secret) . as_str ( ) . as_bytes ( ) )
155
+ } ;
152
156
153
- let challenge = req. into_challenge ( ( * secret) . as_str ( ) . as_bytes ( ) ) ;
154
157
RelayStr :: from_string ( serde_json:: to_string ( & challenge) ?)
155
158
}
156
159
@@ -163,7 +166,7 @@ struct RelayRegisterResponse<'a> {
163
166
}
164
167
165
168
/// Validates a register response.
166
- #[ no_mangle]
169
+ #[ unsafe ( no_mangle) ]
167
170
#[ relay_ffi:: catch_unwind]
168
171
pub unsafe extern "C" fn relay_validate_register_response (
169
172
data : * const RelayBuf ,
@@ -177,9 +180,9 @@ pub unsafe extern "C" fn relay_validate_register_response(
177
180
} ;
178
181
179
182
let ( response, state) = RegisterResponse :: unpack (
180
- ( * data) . as_bytes ( ) ,
181
- ( * signature) . as_str ( ) ,
182
- ( * secret) . as_str ( ) . as_bytes ( ) ,
183
+ unsafe { ( * data) . as_bytes ( ) } ,
184
+ unsafe { ( * signature) . as_str ( ) } ,
185
+ unsafe { ( * secret) . as_str ( ) . as_bytes ( ) } ,
183
186
max_age,
184
187
) ?;
185
188
@@ -195,10 +198,10 @@ pub unsafe extern "C" fn relay_validate_register_response(
195
198
}
196
199
197
200
/// Returns true if the given version is supported by this library.
198
- #[ no_mangle]
201
+ #[ unsafe ( no_mangle) ]
199
202
#[ relay_ffi:: catch_unwind]
200
203
pub unsafe extern "C" fn relay_version_supported ( version : & RelayStr ) -> bool {
201
- let relay_version = match version. as_str ( ) {
204
+ let relay_version = match unsafe { version. as_str ( ) } {
202
205
"" => RelayVersion :: default ( ) ,
203
206
s => s. parse :: < RelayVersion > ( ) ?,
204
207
} ;
0 commit comments