// Copyright (c) The OpenTofu Authors // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2023 HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package main import ( "encoding/json" "io" "log" "os" ) type Header struct { Magic string `json:"magic"` Version int `json:"version"` } type Input struct { Key []byte `json:"key,omitempty"` Payload []byte `json:"payload"` } type Output struct { // Payload is the payload that has been encrypted/decrypted by the external method. Payload []byte `json:"payload"` } // main implements a simple XOR-encryption. This is meant as an example and not suitable for any production use. func main() { // Write logs to stderr log.Default().SetOutput(os.Stderr) // Write header header := Header{ "OpenTofu-External-Encryption-Method", 1, } marshalledHeader, err := json.Marshal(header) if err != nil { log.Fatalf("%v", err) } _, _ = os.Stdout.Write(append(marshalledHeader, []byte("\n")...)) // Read input input, err := io.ReadAll(os.Stdin) if err != nil { log.Fatalf("Failed to read stdin: %v", err) } var inputData Input if err = json.Unmarshal(input, &inputData); err != nil { log.Fatalf("Failed to parse stdin: %v", err) } // Create output as an XOR of the key and input outputPayload := make([]byte, len(inputData.Payload)) for i, b := range inputData.Payload { outputPayload[i] = inputData.Key[i%len(inputData.Key)] ^ b } // Write output output := Output{ Payload: outputPayload, } outputData, err := json.Marshal(output) if err != nil { log.Fatalf("Failed to stringify output: %v", err) } _, _ = os.Stdout.Write(outputData) }