1use crate::{Error, Result};
2use nettle_sys::{
3 __gmpz_clear, __mpz_struct, nettle_mpz_get_str_256,
4 nettle_mpz_init_set_str_256_u, nettle_mpz_sizeinbase_256_u,
5};
6use std::mem::zeroed;
7
8pub fn convert_gmpz_to_buffer(mut mpz: __mpz_struct) -> Box<[u8]> {
9 unsafe {
10 let mut ret = vec![0u8; nettle_mpz_sizeinbase_256_u(&mut mpz)];
11
12 nettle_mpz_get_str_256(ret.len(), ret.as_mut_ptr(), &mut mpz);
13
14 while ret.len() > 1 && ret[0] == 0 {
15 ret.remove(0);
16 }
17 ret.into()
18 }
19}
20
21pub fn convert_buffer_to_gmpz(buf: &[u8]) -> __mpz_struct {
25 unsafe {
26 let mut ret = zeroed();
27
28 nettle_mpz_init_set_str_256_u(&mut ret, buf.len(), buf.as_ptr());
29 ret
30 }
31}
32
33pub fn write_gmpz_into_slice(
34 mut mpz: __mpz_struct,
35 slice: &mut [u8],
36 arg: &'static str,
37) -> Result<()> {
38 unsafe {
39 if nettle_mpz_sizeinbase_256_u(&mut mpz as *mut _) > slice.len() {
40 __gmpz_clear(&mut mpz);
41
42 Err(Error::InvalidArgument { argument_name: arg })
43 } else {
44 nettle_mpz_get_str_256(slice.len(), slice.as_mut_ptr(), &mut mpz);
45 __gmpz_clear(&mut mpz);
46
47 Ok(())
48 }
49 }
50}