@@ -77,6 +77,7 @@ use crate::config::Config;
7777use crate :: error:: KeylimectlError ;
7878use crate :: output:: OutputHandler ;
7979use crate :: PolicyAction ;
80+ use base64:: { engine:: general_purpose:: STANDARD as Base64 , Engine } ;
8081use chrono;
8182use log:: debug;
8283use 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