1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use crate::client::MpesaResult;
use crate::Mpesa;
use base64::encode;
use openssl::rsa::Padding;
use openssl::x509::X509;
pub trait MpesaSecurity {
fn gen_security_credentials(&self) -> MpesaResult<String>;
}
impl MpesaSecurity for Mpesa {
fn gen_security_credentials(&self) -> MpesaResult<String> {
let pem = self.environment().get_certificate().as_bytes();
let cert = X509::from_pem(pem)?;
let pub_key = cert.public_key()?;
let rsa_key = pub_key.rsa()?;
let buf_len = pub_key.size();
let mut buffer = vec![0; buf_len];
rsa_key.public_encrypt(
self.initiator_password().as_bytes(),
&mut buffer,
Padding::PKCS1,
)?;
Ok(encode(buffer))
}
}