commit 70ea818eae929cec6425f0f632ade5731058c611
parent 9fb1e7527dc594f9fba05ebcecb56805b8f92319
Author: lash <dev@holbrook.no>
Date:   Tue, 21 Jun 2022 15:51:35 +0000
Add missing pgp auth source file
Diffstat:
| A | src/auth/pgp.rs |  |  | 85 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
1 file changed, 85 insertions(+), 0 deletions(-)
diff --git a/src/auth/pgp.rs b/src/auth/pgp.rs
@@ -0,0 +1,85 @@
+use crate::auth::{
+    AuthSpec,
+    AuthError,
+    AuthResult,
+};
+use pgp::packet::{
+    PublicKey,
+};
+use pgp::types::{
+    Version,
+    KeyTrait,
+};
+use base64;
+
+fn check_key_single(data: Vec<u8>) -> Option<PublicKey> {
+    match PublicKey::from_slice(Version::Old, &data) {
+        Ok(v) => {
+            return Some(v);
+        },
+        Err(e) => {
+        },
+    };
+    None
+}
+
+pub fn auth_check(auth: &AuthSpec) -> Result<AuthResult, AuthError> {
+    if auth.method != "pgp" {
+        return Err(AuthError{});
+    }
+    let key_data = match base64::decode(&auth.key) {
+        Ok(v) => {
+            v
+        },
+        Err(e) => {
+            return Err(AuthError{});
+        }
+    };
+    
+    let key = match check_key_single(key_data) {
+        Some(v) => {
+            v
+        },
+        None => {
+            return Err(AuthError{});
+        },
+    };
+
+    println!("key {:?}", key);
+
+    let res = AuthResult {
+        identity: key.fingerprint(),
+    };
+    Ok(res)
+}
+
+#[cfg(test)]
+mod tests { 
+
+    use super::auth_check;
+    use super::AuthSpec;
+    use std::str::FromStr;
+
+    #[test]
+    fn test_single() {
+        let key_single_hex = "0462a9f5a916092b06010401da470f0101074061f06baae76d5115553019e50353890e498652fac873d78003e9e192dd9f3e13";
+        let sig_foo_single_hex = "0401160a0006050262a9f5a9002109108b21a9d88b4a0c7f1621044ab95b491980f89789ae8fde8b21a9d88b4a0c7f2aba0100b7b06c424cdb67bba97463d2eb3035ead329f62c92fb6100b629df003748131200fd17e8b6dc866aa1662b93a17ff599334002de273b800fc7160634516187b41407";
+
+        let key_single = hex::decode(&key_single_hex).unwrap();
+        let key_single_base64 = base64::encode(&key_single);
+
+        let sig_foo_single = hex::decode(&sig_foo_single_hex).unwrap();
+        let sig_foo_single_base64 = base64::encode(&sig_foo_single);
+
+        let auth_spec_str = format!("pgp:{}:{}", key_single_base64, sig_foo_single_base64);
+        let auth_spec = AuthSpec::from_str(&auth_spec_str).unwrap();
+
+        match auth_check(&auth_spec) {
+            Ok(v) => {
+            },
+            Err(e) => {
+                panic!("{}", e);
+            },
+        }
+    }
+}