zero4rs/actions/public/
mod.rs1use lazy_static::lazy_static;
2
3use crate::commons;
4use crate::prelude2::*;
5
6pub mod pgp_generate;
7pub mod pgp_generate2;
8pub mod pgp_output;
9pub mod pgp_verify;
10
11lazy_static! {
12 static ref C1: &'static str = r#"-----BEGIN PGP PRIVATE KEY BLOCK-----
13Comment: BFB0 FADF 0292 758A CB12 7E03 F10B 8C92 E4DF 6935
14Comment: chunhui (unlimited) <keesh.zhang@qq.com>
15
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
92=I+Hs
93-----END PGP PRIVATE KEY BLOCK-----"#;
94 static ref C2: &'static str = r#"-----BEGIN PGP PUBLIC KEY BLOCK-----
95Comment: BFB0 FADF 0292 758A CB12 7E03 F10B 8C92 E4DF 6935
96Comment: chunhui (unlimited) <keesh.zhang@qq.com>
97
98xjMEZf/W4BYJKwYBBAHaRw8BAQdAKAbQE+94uul9MJRw5+gB+uBARhvZztVtYQSr
9968WJUjjCwAsEHxYKAH0FgmX/1uADCwkHCRDxC4yS5N9pNUcUAAAAAAAeACBzYWx0
100QG5vdGF0aW9ucy5zZXF1b2lhLXBncC5vcmdPZqd/mlET5kwME5ONLenNS5WA4Dzp
101YSXutcNGW7hDpgMVCggCmwMCHgEWIQS/sPrfApJ1issSfgPxC4yS5N9pNQAA4rkA
102/2SKQSUXuSMWMjq/12iD9mHbK+NsdJZWlLEncaTottyYAQDKvldk46320CceCvBx
103j/rNppjue/eKolFbMIy359W8Cc0oY2h1bmh1aSAodW5saW1pdGVkKSA8a2Vlc2gu
104emhhbmdAcXEuY29tPsLADgQTFgoAgAWCZf/W4QMLCQcJEPELjJLk32k1RxQAAAAA
105AB4AIHNhbHRAbm90YXRpb25zLnNlcXVvaWEtcGdwLm9yZziz4wAKYQjzj+oCrsJJ
106eZgZxKNV1sD6LRwOget/ePY2AxUKCAKZAQKbAwIeARYhBL+w+t8CknWKyxJ+A/EL
107jJLk32k1AADOdwEAvRjDErecWufgtkcCXnzrq6VDfm6uKqga5azOBrHkVQMA/0Dn
108v67EJygIPWRKq6SqY0uwob5XmKL7lvbroHF4Xe0CzsFNBGX/1uEBEADNWT67TdL5
109Ow5lJ7q+Tc1v2tpLqJQO1oTnml0gw2bRp4lL8USkD+8ZSjff8I4JdbD+01vg+ZDP
110Ff0zqa6HYZBDyf/OM1cSx+NDjf3jWFxnndV5oWS9p8FJSx5sl5IAGKA52122iALt
111iGGilHO3wSVtQwrtbK5GHTfMUg7mp7ErPuhOG0n32oWAD+8ogE+6ixq+xiCYksGN
112LguoTcBg5G0fcfRM0ppnu1kJYZqNa4+167/w4b+TBVZISFJOK21E0TFjQjlFAgm3
113pkeKBnkyVrsmypxMYI1EKX4wEcKZAIra8NMfBYCwK3F61ZyFhMn0U6meIAl5laye
114fL1b8Ol9P19+UfAvjJPo+8s4o/qb1lwbpg/IZuL+pefZ45ABzMy3q4k+kX/9474m
115SFM5gny/NOUmWtI4UcbMmGT1An+Lmj16hoQlqK3QfIcErYmVvX3VMX19ax/cCcqF
116U5TM5HLAZTh7WGj35A70ke1b7sm2UbWtgeY8goUKvNA9gwyWe4VLJisHtavzudjy
1174WnZd5J+R86JOXKa90UwSMnhw6X6QA3Zt4C58LBgpwEOc2H8a9pW4z2Y7GelyS3H
118T+eM8cggne229pmVeXu+yg4Pu2VgpGVymrtclnAbUrgVVmcHP9nEQZ+TL/grooB8
119h62ZWrVEyQCr3csw5Ym7JF82ddDnbDjlYwARAQABwsAJBBgWCgB7BYJl/9bhBYkA
120ZYOACRDxC4yS5N9pNUcUAAAAAAAeACBzYWx0QG5vdGF0aW9ucy5zZXF1b2lhLXBn
121cC5vcmcJXyawEWbTuLSp1JENPd+2umn4hQVpmAUJmaZmQdOIywKbDAIeARYhBL+w
122+t8CknWKyxJ+A/ELjJLk32k1AABgsQD8De191HlncKO4hV6mUkuU003YKkPb4QgQ
1236VMqzcN61bwA/1NSRnl6tCc7yX55WiZMkCfOjuCIivOZGY4iG+kwJw4EzjMEZf/W
1244BYJKwYBBAHaRw8BAQdAVMEOwQJvZxxlpPsLf5KcsMQWiDsC4Fel4n0kn0ityRbC
125wAkEGBYKAHsFgmX/1uAFiQBlg4AJEPELjJLk32k1RxQAAAAAAB4AIHNhbHRAbm90
126YXRpb25zLnNlcXVvaWEtcGdwLm9yZyep/Dcr4QS/xNBd4ciso0GiGurB+vyHh20g
127VlEcdzZkApsgAh4BFiEEv7D63wKSdYrLEn4D8QuMkuTfaTUAAMWeAPwI3r4HeuoL
128HhOe67LktryjFz4bdtGhxZtPDmaWNwDABwD+M7SyncSwFWuOBbwEtbOasjM2qxoM
12987WEb9kzf4DF0QvOMwRl/9bgFgkrBgEEAdpHDwEBB0C6PfEoeSJ/IgLhwCBOyk5/
130bc+q5gof9kDF/DGiMa++JcLAyAQYFgoBOgWCZf/W4AWJAGWDgAkQ8QuMkuTfaTVH
131FAAAAAAAHgAgc2FsdEBub3RhdGlvbnMuc2VxdW9pYS1wZ3Aub3JncjRmCVwJaBkH
132kC1pT5aM9n6cdbe93dp0HI1nCHQeWmkCmwICHgG+oAQZFgoAbwWCZf/W4AkQdxYL
133YzpDQ3VHFAAAAAAAHgAgc2FsdEBub3RhdGlvbnMuc2VxdW9pYS1wZ3Aub3JnbqGh
1347+YGLZx8AVDlH/J2EyuB0I8dIBOoXJ7vogwa5f4WIQQ9DurtueiOcr0/IbV3Fgtj
135OkNDdQAA65cA/R4MtS5IroWFwBKFP9q5a+nZkLmYLdeiuKJYiYjVKG9YAQDRhbln
136tHq8uUqSmt9WwlTWLxtKkuLuZJLN3jjcKO2NABYhBL+w+t8CknWKyxJ+A/ELjJLk
13732k1AACBKgEAmmISPNxXZYKre/a/88QqMKu003tv0fVB1Z5TklVGvNYBAIqz40in
138cEPF4beSk8mxg3RXh5MaSY0/hoQNo/eTfR8NzjgEZf/W4BIKKwYBBAGXVQEFAQEH
139QNw1uQkg7OSZQrr6TiXFlympt8Tt2E52SxU4RexEjsEMAwEIB8LACQQYFgoAewWC
140Zf/W4AWJAGWDgAkQ8QuMkuTfaTVHFAAAAAAAHgAgc2FsdEBub3RhdGlvbnMuc2Vx
141dW9pYS1wZ3Aub3Jnqvbm+tI9JPQOiuTpTicNZCBFYr7/DWoR4Sg6mxHfWdMCmwwC
142HgEWIQS/sPrfApJ1issSfgPxC4yS5N9pNQAAXl0BAJkDEp2IwZAKIsTb4FC3aFQ9
143wFbN7UgowsFVu8p+4qh3AP0cErbkwlnE1BK78Dz00pftKXUiRss30KSllE4BG1jR
144Dg==
145=ff2W
146-----END PGP PUBLIC KEY BLOCK-----"#;
147}
148
149#[derive(serde::Deserialize)]
150pub struct FormData {
151 user_id: String,
152 email: String,
153 secret_phrase: Option<String>,
154 weeks_subkeys_exp_in: Option<u64>,
155}
156
157pub async fn generate_api_key(request: HttpRequest) -> impl Responder {
158 request.text(200, &commons::generate_api_key("R"))
159}
160
161pub async fn generate_pgp_key(
175 form: actix_web::web::Form<FormData>,
176 request: HttpRequest,
177) -> impl Responder {
178 let secret_phrase = &form.secret_phrase;
179 let weeks_subkeys_exp_in = &form.weeks_subkeys_exp_in;
180
181 let (cert, _revocation) = pgp_generate::cert_and_revoc(
182 &form.user_id,
183 &form.email,
184 secret_phrase,
185 weeks_subkeys_exp_in,
186 );
187
188 request.text(200, &pgp_output::get_certificate(&cert))
193}
194
195pub async fn generate_pgp_fingerprint(
196 public_key: web::Bytes,
197 request: HttpRequest,
198) -> impl Responder {
199 let public_key = crate::commons::bytes_to_string(public_key.to_vec())?;
200
201 request.text(200, &pgp_output::get_fingerprint(&public_key))
202}
203
204#[allow(deprecated)]
205pub async fn pgp_encrypt(msg: web::Bytes, request: HttpRequest) -> impl Responder {
206 let msg = crate::commons::bytes_to_string(msg.to_vec()).unwrap();
207
208 let cert = pgp_output::get_cert(&C2); let mut ciphertext = Vec::new();
211
212 pgp_generate2::encrypt(&mut ciphertext, &msg, &cert)?;
213
214 request.text(200, &base64::encode(&ciphertext))
215}
216
217#[allow(deprecated)]
218pub async fn pgp_decrypt(signed_msg: web::Bytes, request: HttpRequest) -> impl Responder {
219 let signed_msg = crate::commons::bytes_to_string(signed_msg.to_vec()).unwrap();
220
221 let ciphertext = &base64::decode(signed_msg).unwrap();
222
223 let cert = pgp_output::get_cert(&C1); let mut plaintext = Vec::new();
226
227 pgp_generate2::decrypt(&mut plaintext, ciphertext, &cert)?;
228
229 match String::from_utf8(plaintext) {
230 Ok(string) => request.text(200, &string),
231 Err(err) => request.text(500, &format!("{:?}", err)),
232 }
233}
234
235#[allow(deprecated)]
236pub async fn pgp_signer(msg: web::Bytes, request: HttpRequest) -> impl Responder {
237 let msg = crate::commons::bytes_to_string(msg.to_vec()).unwrap();
238
239 let cert = pgp_output::get_cert(&C1); let mut signed_message = Vec::new();
242
243 pgp_generate2::sign(&mut signed_message, &msg, &cert)?;
244
245 request.text(200, &base64::encode(&signed_message))
246}
247
248#[allow(deprecated)]
249pub async fn pgp_verify(signed_msg: web::Bytes, request: HttpRequest) -> impl Responder {
250 let signed_msg = crate::commons::bytes_to_string(signed_msg.to_vec()).unwrap();
251
252 let ciphertext = &base64::decode(signed_msg).unwrap();
253
254 let cert = pgp_output::get_cert(&C2); let mut plaintext = Vec::new();
257
258 pgp_verify::verify(&mut plaintext, ciphertext, &cert)?;
259
260 match String::from_utf8(plaintext) {
261 Ok(string) => request.text(200, &string),
262 Err(err) => request.text(500, &format!("{:?}", err)),
263 }
264}
265
266