Skip to content

Commit 6571e13

Browse files
committed
keylimectl: Encode runtime policy using base64
Signed-off-by: Anderson Toshiyuki Sasaki <[email protected]>
1 parent 38cfc05 commit 6571e13

File tree

1 file changed

+44
-2
lines changed

1 file changed

+44
-2
lines changed

keylimectl/src/commands/policy.rs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ use crate::config::Config;
7777
use crate::error::KeylimectlError;
7878
use crate::output::OutputHandler;
7979
use crate::PolicyAction;
80+
use base64::{engine::general_purpose::STANDARD as Base64, Engine};
8081
use chrono;
8182
use log::debug;
8283
use serde_json::{json, Value};
@@ -240,8 +241,10 @@ async fn create_policy(
240241
})?;
241242

242243
// Extract policy metadata for enhanced API payload
244+
// Note: The verifier expects runtime_policy to be base64-encoded
245+
let encoded_policy = Base64.encode(policy_content.as_bytes());
243246
let mut policy_data = json!({
244-
"runtime_policy": policy_content,
247+
"runtime_policy": encoded_policy,
245248
"policy_type": "runtime",
246249
"format_version": "1.0",
247250
"upload_timestamp": chrono::Utc::now().to_rfc3339()
@@ -386,8 +389,10 @@ async fn update_policy(
386389
})?;
387390

388391
// Extract policy metadata for enhanced API payload
392+
// Note: The verifier expects runtime_policy to be base64-encoded
393+
let encoded_policy = Base64.encode(policy_content.as_bytes());
389394
let mut policy_data = json!({
390-
"runtime_policy": policy_content,
395+
"runtime_policy": encoded_policy,
391396
"policy_type": "runtime",
392397
"format_version": "1.0",
393398
"update_timestamp": chrono::Utc::now().to_rfc3339()
@@ -981,6 +986,43 @@ mod tests {
981986
}
982987
}
983988

989+
// Test base64 encoding of policy data
990+
mod base64_encoding {
991+
#[test]
992+
fn test_policy_content_is_base64_encoded() {
993+
use base64::{
994+
engine::general_purpose::STANDARD as Base64, Engine,
995+
};
996+
997+
let policy_content = r#"{"allowlist": [{"path": "/bin/ls"}]}"#;
998+
let encoded_policy = Base64.encode(policy_content.as_bytes());
999+
1000+
// Verify it's base64 encoded
1001+
assert!(!encoded_policy.contains("{"));
1002+
assert!(!encoded_policy.contains("}"));
1003+
assert!(!encoded_policy.contains("allowlist"));
1004+
1005+
// Verify it can be decoded back
1006+
let decoded = Base64.decode(&encoded_policy).unwrap();
1007+
let decoded_str = String::from_utf8(decoded).unwrap();
1008+
assert_eq!(decoded_str, policy_content);
1009+
}
1010+
1011+
#[test]
1012+
fn test_base64_roundtrip() {
1013+
use base64::{
1014+
engine::general_purpose::STANDARD as Base64, Engine,
1015+
};
1016+
1017+
let original = r#"{"ima": {"require_signatures": true}}"#;
1018+
let encoded = Base64.encode(original.as_bytes());
1019+
let decoded = Base64.decode(&encoded).unwrap();
1020+
let result = String::from_utf8(decoded).unwrap();
1021+
1022+
assert_eq!(original, result);
1023+
}
1024+
}
1025+
9841026
// Test runtime policy specific scenarios
9851027
mod runtime_policy_scenarios {
9861028

0 commit comments

Comments
 (0)