/* |-------------------------------------------------------------------------- | Key |-------------------------------------------------------------------------- | | Name: | - Key | | Purpose: | - Generate cryptographic key material through a type-driven dispatch | model with strict validation, schema isolation, and centralized | orchestration. | | Guidelines: | - Validate all inputs before generation. | - Enforce strict schema isolation. | - Reject unsupported configuration fields. | - Prevent key exposure on failure paths. | - Return standardized responses. | | Examples: | - ObrimKey("symmetric", map[string]any{ | "algorithm": "aes", | "key_size": 256, | }) | | - ObrimKey("asymmetric", map[string]any{ | "algorithm": "ecc", | }) | |-------------------------------------------------------------------------- */ /* |-------------------------------------------------------------------------- | Credit |-------------------------------------------------------------------------- | | Contributor: | - Rajon Ahmed | - Scionite | |-------------------------------------------------------------------------- */ package key import ( "crypto/aes" "crypto/ed25519" "crypto/rand" "encoding/base64" "strings" "time" "go/module/essential/visible/service/helper/log" "go/module/essential/visible/service/helper/retriever" "go/module/essential/visible/service/helper/status" ) // Function Name: ObrimKey // Function Purpose: Dispatch key generation requests and orchestrate validation, generation, and response construction. func ObrimKey(keyType string, config map[string]any) map[string]any { log.ObrimLog("INIT", "Key generation request received.") if result := obrimKeyValidate(keyType, config); result != nil { return result } result := obrimKeyDispatch(keyType, config) if statusValue, ok := result["status"].(bool); ok && statusValue { status.ObrimStatus("SUCCESS", "Key generation completed.") log.ObrimLog("SUCCESS", "Key generation completed successfully.") return result } status.ObrimStatus("ERROR", "Key generation failed.") log.ObrimLog("ERROR", "Key generation failed.") return result } // Function Name: obrimKeyValidate // Function Purpose: Validate common request structure and schema integrity. func obrimKeyValidate(keyType string, config map[string]any) map[string]any { log.ObrimLog("VALIDATION", "Validating key request.") if strings.TrimSpace(keyType) == "" { return obrimKeyBuildError("FAILED_TYPE_REQUIRED") } if config == nil { return obrimKeyBuildError("FAILED_CONFIG_REQUIRED") } normalizedType := strings.ToLower(strings.TrimSpace(keyType)) switch normalizedType { case "symmetric": return obrimKeyValidateSymmetricConfig(config) case "asymmetric": return obrimKeyValidateAsymmetricConfig(config) default: return obrimKeyBuildError("FAILED_UNSUPPORTED_TYPE") } } // Function Name: obrimKeyDispatch // Function Purpose: Route execution to the appropriate cryptographic workflow. func obrimKeyDispatch(keyType string, config map[string]any) map[string]any { normalizedType := strings.ToLower(strings.TrimSpace(keyType)) switch normalizedType { case "symmetric": return obrimKeyGenerateSymmetric(config) case "asymmetric": return obrimKeyGenerateAsymmetric(config) default: return obrimKeyBuildError("FAILED_UNSUPPORTED_TYPE") } } // Function Name: obrimKeyValidateSymmetricConfig // Function Purpose: Validate symmetric configuration values. func obrimKeyValidateSymmetricConfig(config map[string]any) map[string]any { if len(config) != 2 { return obrimKeyBuildError("FAILED_INVALID_CONFIGURATION") } // Logic: for key := range config { if key != "algorithm" && key != "key_size" { return obrimKeyBuildError("FAILED_UNSUPPORTED_CONFIGURATION_FIELD") } } algorithmValue, exists := config["algorithm"] if !exists { return obrimKeyBuildError("FAILED_ALGORITHM_REQUIRED") } algorithm, ok := algorithmValue.(string) if !ok { return obrimKeyBuildError("FAILED_INVALID_ALGORITHM") } if strings.ToLower(strings.TrimSpace(algorithm)) != "aes" { return obrimKeyBuildError("FAILED_UNSUPPORTED_ALGORITHM") } keySizeValue, exists := config["key_size"] if !exists { return obrimKeyBuildError("FAILED_KEY_SIZE_REQUIRED") } var keySize int switch value := keySizeValue.(type) { case int: keySize = value case int32: keySize = int(value) case int64: keySize = int(value) case float64: keySize = int(value) default: return obrimKeyBuildError("FAILED_INVALID_KEY_SIZE") } switch keySize { case 128, 192, 256: return nil default: return obrimKeyBuildError("FAILED_UNSUPPORTED_KEY_SIZE") } } // Function Name: obrimKeyValidateAsymmetricConfig // Function Purpose: Validate asymmetric configuration values. func obrimKeyValidateAsymmetricConfig(config map[string]any) map[string]any { if len(config) != 1 { return obrimKeyBuildError("FAILED_INVALID_CONFIGURATION") } // Logic: for key := range config { if key != "algorithm" { return obrimKeyBuildError("FAILED_UNSUPPORTED_CONFIGURATION_FIELD") } } algorithmValue, exists := config["algorithm"] if !exists { return obrimKeyBuildError("FAILED_ALGORITHM_REQUIRED") } algorithm, ok := algorithmValue.(string) if !ok { return obrimKeyBuildError("FAILED_INVALID_ALGORITHM") } if strings.ToLower(strings.TrimSpace(algorithm)) != "ecc" { return obrimKeyBuildError("FAILED_UNSUPPORTED_ALGORITHM") } return nil } // Function Name: obrimKeyGenerateSymmetric // Function Purpose: Generate symmetric key material. func obrimKeyGenerateSymmetric(config map[string]any) map[string]any { normalizedConfig := obrimKeyNormalizeSymmetricConfig(config) payload, err := obrimKeyGenerateAES(normalizedConfig) if err != nil { log.ObrimLog("ERROR", "AES key generation failed.") return obrimKeyBuildError("FAILED_GENERATION") } return map[string]any{ "status": true, "code": "SUCCESS_KEY_GENERATED", "payload": obrimKeyBuildPayload( payload, ), } } // Function Name: obrimKeyGenerateAES // Function Purpose: Generate AES key material. func obrimKeyGenerateAES(config map[string]any) (map[string]any, error) { keySize := config["key_size"].(int) // Logic: keyMaterial := make([]byte, keySize/8) if _, err := rand.Read(keyMaterial); err != nil { return nil, err } if _, err := aes.NewCipher(keyMaterial); err != nil { return nil, err } // Logic: generatedAt := time.Now().UTC().Format(time.RFC3339) return map[string]any{ "type": "symmetric", "algorithm": "aes", "key_size": keySize, "key_material": base64.StdEncoding.EncodeToString(keyMaterial), "generated_at": generatedAt, }, nil } // Function Name: obrimKeyNormalizeSymmetricConfig // Function Purpose: Normalize symmetric configuration values. func obrimKeyNormalizeSymmetricConfig(config map[string]any) map[string]any { // Mutable Variable Purpose: Store normalized configuration. normalized := make(map[string]any) normalized["algorithm"] = strings.ToLower(strings.TrimSpace(config["algorithm"].(string))) switch value := config["key_size"].(type) { case int: normalized["key_size"] = value case int32: normalized["key_size"] = int(value) case int64: normalized["key_size"] = int(value) case float64: normalized["key_size"] = int(value) } return normalized } // Function Name: obrimKeyGenerateAsymmetric // Function Purpose: Generate asymmetric key material. func obrimKeyGenerateAsymmetric(config map[string]any) map[string]any { normalizedConfig := obrimKeyNormalizeAsymmetricConfig(config) payload, err := obrimKeyGenerateECC(normalizedConfig) if err != nil { log.ObrimLog("ERROR", "ECC key generation failed.") return obrimKeyBuildError("FAILED_GENERATION") } return map[string]any{ "status": true, "code": "SUCCESS_KEY_GENERATED", "payload": obrimKeyBuildPayload( payload, ), } } // Function Name: obrimKeyGenerateECC // Function Purpose: Generate ECC key pair material. func obrimKeyGenerateECC(config map[string]any) (map[string]any, error) { _, _ = retriever.ObrimRetriever( "json", map[string]any{ "resource": "application/metadata", "path": "application.lower", }, ) publicKey, privateKey, err := ed25519.GenerateKey(rand.Reader) if err != nil { return nil, err } // Logic: generatedAt := time.Now().UTC().Format(time.RFC3339) return map[string]any{ "type": "asymmetric", "algorithm": "ecc", "curve": "eddsa", "public_key": base64.StdEncoding.EncodeToString(publicKey), "private_key": base64.StdEncoding.EncodeToString(privateKey), "generated_at": generatedAt, }, nil } // Function Name: obrimKeyNormalizeAsymmetricConfig // Function Purpose: Normalize asymmetric configuration values. func obrimKeyNormalizeAsymmetricConfig(config map[string]any) map[string]any { // Mutable Variable Purpose: Store normalized configuration. normalized := make(map[string]any) normalized["algorithm"] = strings.ToLower(strings.TrimSpace(config["algorithm"].(string))) return normalized } // Function Name: obrimKeyBuildPayload // Function Purpose: Construct standardized success payloads. func obrimKeyBuildPayload(payload map[string]any) map[string]any { return payload } // Function Name: obrimKeyBuildError // Function Purpose: Construct standardized error responses. func obrimKeyBuildError(code string) map[string]any { return map[string]any{ "status": false, "code": code, "payload": nil, } }