scram_rs/c_api/
key.rs

1/*-
2 * Scram-rs - a SCRAM authentification authorization library
3 * 
4 * Copyright (C) 2021  Aleksandr Morozov
5 * Copyright 2025 Aleksandr Morozov
6 * 
7 * The scram-rs crate can be redistributed and/or modified
8 * under the terms of either of the following licenses:
9 *
10 *   1. the Mozilla Public License Version 2.0 (the “MPL”) OR
11 *                     
12 *   2. EUROPEAN UNION PUBLIC LICENCE v. 1.2 EUPL © the European Union 2007, 2016
13 */
14
15#[cfg(not(feature = "std"))]
16use alloc::boxed::Box;
17
18use crate::ScramKey;
19
20use super::
21{
22    common, 
23    error::CApiScramRuntimeError
24};
25
26
27
28#[unsafe(no_mangle)]
29pub unsafe extern "C" 
30fn capi_scram_key(
31    client_key: *const u8,
32    client_key_len: usize,
33    server_key: *const u8,
34    server_key_len: usize,
35    key_out: *mut *mut ScramKey,
36    error_out: *mut *mut CApiScramRuntimeError
37) -> i32
38{
39    if key_out.is_null() == true
40    {
41        return -5;
42    }
43
44    let mut keys = ScramKey::default();
45
46    if client_key.is_null() == false
47    {
48        let key = 
49            match common::carr_to_vec(client_key, client_key_len, "client key password")
50            {
51                Ok(r) => r,
52                Err(e) =>   
53                {
54                    unsafe 
55                    { 
56                        if let Some(err) = error_out.as_mut()
57                        {
58                            *err = e.into_capi();
59                        }
60                    }
61    
62                    return 1;
63                }
64            };
65
66        keys.set_client_key(key);
67    }
68
69    if server_key.is_null() == false
70    {
71        let key = 
72            match common::carr_to_vec(server_key, server_key_len, "server key password")
73            {
74                Ok(r) => r,
75                Err(e) =>   
76                {
77                    unsafe 
78                    { 
79                        if let Some(err) = error_out.as_mut()
80                        {
81                            *err = e.into_capi();
82                        }
83                    }
84    
85                    return 1;
86                }
87            };
88
89        keys.set_client_key(key);
90    }
91
92    unsafe { *key_out.as_mut().unwrap() = Box::into_raw(Box::new(keys)) };
93
94    return 0;
95}
96
97
98#[unsafe(no_mangle)]
99pub unsafe extern "C" 
100fn capi_scram_key_free(key: *mut ScramKey)
101{
102    if key.is_null() == true
103    {
104        return;
105    }
106
107    drop(unsafe { Box::from_raw(key) });
108}