Skip to content

Commit 50e0900

Browse files
committed
safer gets within the parse_vm_static function
1 parent 9fdcf99 commit 50e0900

File tree

1 file changed

+84
-59
lines changed
  • target_chains/stylus/contracts/wormhole/src

1 file changed

+84
-59
lines changed

target_chains/stylus/contracts/wormhole/src/lib.rs

Lines changed: 84 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -191,108 +191,133 @@ impl WormholeContract {
191191
if encoded_vaa.len() < 6 {
192192
return Err(WormholeError::InvalidVAAFormat);
193193
}
194-
194+
195195
let mut cursor = 0;
196-
197-
let version = encoded_vaa[cursor];
196+
197+
// Get version
198+
let version = encoded_vaa.get(cursor)
199+
.ok_or(WormholeError::InvalidVAAFormat)?;
198200
cursor += 1;
199-
200-
if version != 1 {
201+
202+
if *version != 1 {
201203
return Err(WormholeError::InvalidVAAFormat);
202204
}
203-
204-
let gsi_bytes: [u8; 4] = encoded_vaa[cursor..cursor + 4]
205-
.try_into()
206-
.map_err(|_| WormholeError::InvalidVAAFormat)?;
207-
208-
let guardian_set_index = u32::from_be_bytes(gsi_bytes);
209-
205+
206+
// Get guardian set index
207+
let gsi_bytes = encoded_vaa.get(cursor..cursor + 4)
208+
.ok_or(WormholeError::InvalidVAAFormat)?;
209+
let guardian_set_index = u32::from_be_bytes(
210+
gsi_bytes.try_into()
211+
.map_err(|_| WormholeError::InvalidVAAFormat)?
212+
);
210213
cursor += 4;
211-
212-
let len_signatures = encoded_vaa[cursor];
214+
215+
// Get number of signatures
216+
let len_signatures = *encoded_vaa.get(cursor)
217+
.ok_or(WormholeError::InvalidVAAFormat)?;
213218
cursor += 1;
214-
215-
let mut signatures = Vec::with_capacity(len_signatures as usize);
216-
219+
217220
if len_signatures > 19 {
218221
return Err(WormholeError::InvalidVAAFormat);
219222
}
220-
223+
224+
let mut signatures = Vec::with_capacity(len_signatures as usize);
225+
221226
for _ in 0..len_signatures {
222227
if cursor + 66 > encoded_vaa.len() {
223228
return Err(WormholeError::InvalidVAAFormat);
224229
}
225-
226-
let guardian_index = encoded_vaa[cursor];
230+
231+
let guardian_index = *encoded_vaa.get(cursor)
232+
.ok_or(WormholeError::InvalidVAAFormat)?;
227233
cursor += 1;
228-
229-
let mut sig_bytes = [0u8; 65];
230-
sig_bytes.copy_from_slice(&encoded_vaa[cursor..cursor + 65]);
234+
235+
let sig_bytes = encoded_vaa.get(cursor..cursor + 65)
236+
.ok_or(WormholeError::InvalidVAAFormat)?;
237+
let mut fixed_sig = [0u8; 65];
238+
fixed_sig.copy_from_slice(sig_bytes);
231239
cursor += 65;
232-
240+
233241
signatures.push(GuardianSignature {
234242
guardian_index,
235-
signature: FixedBytes::from(sig_bytes),
243+
signature: FixedBytes::from(fixed_sig),
236244
});
237245
}
238-
246+
239247
if cursor + 51 > encoded_vaa.len() {
240248
return Err(WormholeError::InvalidVAAFormat);
241249
}
242-
243-
let ts_bytes: [u8; 4] = encoded_vaa[cursor..cursor + 4]
244-
.try_into()
245-
.map_err(|_| WormholeError::InvalidVAAFormat)?;
246-
247-
let timestamp = u32::from_be_bytes(ts_bytes);
250+
251+
// Get timestamp
252+
let ts_bytes = encoded_vaa.get(cursor..cursor + 4)
253+
.ok_or(WormholeError::InvalidVAAFormat)?;
254+
let timestamp = u32::from_be_bytes(
255+
ts_bytes.try_into()
256+
.map_err(|_| WormholeError::InvalidVAAFormat)?
257+
);
248258
cursor += 4;
249-
250-
let nonce_bytes: [u8; 4] = encoded_vaa[cursor..cursor + 4]
251-
.try_into()
252-
.map_err(|_| WormholeError::InvalidVAAFormat)?;
253-
254-
let nonce = u32::from_be_bytes(nonce_bytes);
259+
260+
// Get nonce
261+
let nonce_bytes = encoded_vaa.get(cursor..cursor + 4)
262+
.ok_or(WormholeError::InvalidVAAFormat)?;
263+
let nonce = u32::from_be_bytes(
264+
nonce_bytes.try_into()
265+
.map_err(|_| WormholeError::InvalidVAAFormat)?
266+
);
255267
cursor += 4;
256-
268+
269+
// Get emitter chain ID
270+
let emitter_chain_bytes = encoded_vaa.get(cursor..cursor + 2)
271+
.ok_or(WormholeError::InvalidVAAFormat)?;
257272
let emitter_chain_id = u16::from_be_bytes([
258-
encoded_vaa[cursor],
259-
encoded_vaa[cursor + 1],
273+
emitter_chain_bytes[0],
274+
emitter_chain_bytes[1],
260275
]);
261276
cursor += 2;
262-
263-
let mut emitter_address_bytes = [0u8; 32];
264-
emitter_address_bytes.copy_from_slice(&encoded_vaa[cursor..cursor + 32]);
277+
278+
// Get emitter address
279+
let emitter_address_bytes = encoded_vaa.get(cursor..cursor + 32)
280+
.ok_or(WormholeError::InvalidVAAFormat)?;
281+
let mut fixed_emitter = [0u8; 32];
282+
fixed_emitter.copy_from_slice(emitter_address_bytes);
265283
cursor += 32;
266-
267-
let sequence_bytes: [u8; 8] = encoded_vaa[cursor..cursor + 8]
268-
.try_into()
269-
.map_err(|_| WormholeError::InvalidVAAFormat)?;
270-
271-
let sequence = u64::from_be_bytes(sequence_bytes);
272-
284+
285+
// Get sequence
286+
let sequence_bytes = encoded_vaa.get(cursor..cursor + 8)
287+
.ok_or(WormholeError::InvalidVAAFormat)?;
288+
let sequence = u64::from_be_bytes(
289+
sequence_bytes.try_into()
290+
.map_err(|_| WormholeError::InvalidVAAFormat)?
291+
);
273292
cursor += 8;
274-
275-
let consistency_level = encoded_vaa[cursor];
293+
294+
// Get consistency level
295+
let consistency_level = *encoded_vaa.get(cursor)
296+
.ok_or(WormholeError::InvalidVAAFormat)?;
276297
cursor += 1;
277-
278-
let payload = encoded_vaa[cursor..].to_vec();
279-
298+
299+
// Get payload
300+
let payload = encoded_vaa.get(cursor..)
301+
.ok_or(WormholeError::InvalidVAAFormat)?
302+
.to_vec();
303+
280304
let hash = keccak256(&encoded_vaa[cursor - 51..]);
281-
305+
282306
Ok(VerifiedVM {
283-
version,
307+
version: *version,
284308
guardian_set_index,
285309
signatures,
286310
timestamp,
287311
nonce,
288312
emitter_chain_id,
289-
emitter_address: FixedBytes::from(emitter_address_bytes),
313+
emitter_address: FixedBytes::from(fixed_emitter),
290314
sequence,
291315
consistency_level,
292316
payload,
293317
hash,
294318
})
295319
}
320+
296321

297322
fn verify_vm(&self, vaa: &VerifiedVM) -> Result<(), WormholeError> {
298323

0 commit comments

Comments
 (0)