crypto functions

A set of crypto-related functions to be able to perform hashing and (simple!) encryption operations with gomplate.

Note: These functions are mostly wrappers of existing functions in the Go standard library. The authors of gomplate are not cryptographic experts, however, and so can not guarantee correctness of implementation. It is recommended to have your resident security experts inspect gomplate’s code before using gomplate for critical security infrastructure!

crypto.Bcrypt

Uses the bcrypt password hashing algorithm to generate the hash of a given string. Wraps the golang.org/x/crypto/brypt package.

Usage

crypto.Bcrypt [cost] input
input | crypto.Bcrypt [cost]

Arguments

name description
cost (optional) the cost, as a number from 4 to 31 - defaults to 10
input (required) the input to hash, usually a password

Examples

$ gomplate -i '{{ "foo" | crypto.Bcrypt }}'
$2a$10$jO8nKZ1etGkKK7I3.vPti.fYDAiBqwazQZLUhaFoMN7MaLhTP0SLy
$ gomplate -i '{{ crypto.Bcrypt 4 "foo" }}
$2a$04$zjba3N38sjyYsw0Y7IRCme1H4gD0MJxH8Ixai0/sgsrf7s1MFUK1C

crypto.PBKDF2

Run the Password-Based Key Derivation Function #2 as defined in RFC 8018 (PKCS #5 v2.1).

This function outputs the binary result as a hexadecimal string.

Usage

crypto.PBKDF2 password salt iter keylen [hashfunc]

Arguments

name description
password (required) the password to use to derive the key
salt (required) the salt
iter (required) iteration count
keylen (required) desired length of derived key
hashfunc (optional) the hash function to use - must be one of the allowed functions (either in the SHA-1 or SHA-2 sets). Defaults to SHA-1

Examples

$ gomplate -i '{{ crypto.PBKDF2 "foo" "bar" 1024 8 }}'
32c4907c3c80792b

crypto.RSADecrypt (experimental)

Experimental: This function is experimental and may be enabled with the --experimental flag.

Decrypt an RSA-encrypted input and print the output as a string. Note that this may result in unreadable text if the decrypted payload is binary. See crypto.RSADecryptBytes for a safer method.

The private key must be a PEM-encoded RSA private key in PKCS#1, ASN.1 DER form, which typically begins with -----BEGIN RSA PRIVATE KEY-----.

The input text must be plain ciphertext, as a byte array, or safely convertible to a byte array. To decrypt base64-encoded input, you must first decode with the base64.DecodeBytes function.

Usage

crypto.RSADecrypt key input
input | crypto.RSADecrypt key

Arguments

name description
key (required) the private key to decrypt the input with
input (required) the encrypted input

Examples

$ gomplate -c pubKey=./testPubKey -c privKey=./testPrivKey \
  -i '{{ $enc := "hello" | crypto.RSAEncrypt .pubKey -}}
  {{ crypto.RSADecrypt .privKey $enc }}'
hello
$ export ENCRYPTED="ScTcX1NZ6p/EeDIf6R7FKLcDFjvP98YgiBhyhPE4jtehajIyTKP1GL8C72qbAWrgdQ6A2cSVjoyo3viqf/PZxpcBDUUMDJuemTaJqUUjMWaDuPG37mQbmRtcvFTuUhw1qSbKyHorDOgTX5d4DvWV4otycGtBT6dXhnmmb5V72J/w3z68vtTJ21m9wREFD7LrYVHdFFtRZiIyMBAF0ngQ+hcujrxilnmgzPkEAg6E7Ccctn28Ie2c4CojrwRbNNxXNlIWCCkC/8Vq8qlDfZ70a+BsTmJDuScE6BZbTyteo9uGYrLn+bTIHNDj90AeLCKUTyWLUJ5Edi9LhlKVBoJUNQ=="
$ gomplate -c ciphertext=env:///ENCRYPTED -c privKey=./testPrivKey \
  -i '{{ base64.DecodeBytes .ciphertext | crypto.RSADecrypt .privKey }}'
hello

crypto.RSADecryptBytes (experimental)

Experimental: This function is experimental and may be enabled with the --experimental flag.

Decrypt an RSA-encrypted input and output the decrypted byte array.

The private key must be a PEM-encoded RSA private key in PKCS#1, ASN.1 DER form, which typically begins with -----BEGIN RSA PRIVATE KEY-----.

The input text must be plain ciphertext, as a byte array, or safely convertible to a byte array. To decrypt base64-encoded input, you must first decode with the base64.DecodeBytes function.

See crypto.RSADecrypt for a function that outputs a string.

Usage

crypto.RSADecryptBytes key input
input | crypto.RSADecryptBytes key

Arguments

name description
key (required) the private key to decrypt the input with
input (required) the encrypted input

Examples

$ gomplate -c pubKey=./testPubKey -c privKey=./testPrivKey \
  -i '{{ $enc := "hello" | crypto.RSAEncrypt .pubKey -}}
  {{ crypto.RSADecryptBytes .privKey $enc }}'
[104 101 108 108 111]
$ gomplate -c pubKey=./testPubKey -c privKey=./testPrivKey \
  -i '{{ $enc := "hello" | crypto.RSAEncrypt .pubKey -}}
  {{ crypto.RSADecryptBytes .privKey $enc | conv.ToString }}'
hello

crypto.RSAEncrypt (experimental)

Experimental: This function is experimental and may be enabled with the --experimental flag.

Encrypt the input with RSA and the padding scheme from PKCS#1 v1.5.

This function is suitable for encrypting data that will be decrypted by Terraform’s rsadecrypt function.

The key should be a PEM-encoded RSA public key in PKIX ASN.1 DER form, which typically begins with BEGIN PUBLIC KEY. RSA public keys in PKCS#1 ASN.1 DER form are also supported (beginning with RSA PUBLIC KEY).

The output will not be encoded, so consider base64-encoding it for display.

Note: Output encrypted with this function will not be deterministic, so encrypting the same input twice will not result in the same ciphertext.

Warning: Using this function may not be safe. See the warning on Go’s rsa.EncryptPKCS1v15 documentation.

Usage

crypto.RSAEncrypt key input
input | crypto.RSAEncrypt key

Arguments

name description
key (required) the public key to encrypt the input with
input (required) the encrypted input

Examples

$ gomplate -c pubKey=./testPubKey \
  -i '{{ "hello" | crypto.RSAEncrypt .pubKey | base64.Encode }}'
ScTcX1NZ6p/EeDIf6R7FKLcDFjvP98YgiBhyhPE4jtehajIyTKP1GL8C72qbAWrgdQ6A2cSVjoyo3viqf/PZxpcBDUUMDJuemTaJqUUjMWaDuPG37mQbmRtcvFTuUhw1qSbKyHorDOgTX5d4DvWV4otycGtBT6dXhnmmb5V72J/w3z68vtTJ21m9wREFD7LrYVHdFFtRZiIyMBAF0ngQ+hcujrxilnmgzPkEAg6E7Ccctn28Ie2c4CojrwRbNNxXNlIWCCkC/8Vq8qlDfZ70a+BsTmJDuScE6BZbTyteo9uGYrLn+bTIHNDj90AeLCKUTyWLUJ5Edi9LhlKVBoJUNQ==
$ gomplate -c pubKey=./testPubKey \
  -i '{{ $enc := "hello" | crypto.RSAEncrypt .pubKey -}}
  Ciphertext in hex: {{ printf "%x" $enc }}'
71729b87cccabb248b9e0e5173f0b12c01d9d2a0565bad18aef9d332ce984bde06acb8bb69334a01446f7f6430077f269e6fbf2ccacd972fe5856dd4719252ebddf599948d937d96ea41540dad291b868f6c0cf647dffdb5acb22cd33557f9a1ddd0ee6c1ad2bbafc910ba8f817b66ea0569afc06e5c7858fd9dc2638861fe7c97391b2f190e4c682b4aa2c9b0050081efe18b10aa8c2b2b5f5b68a42dcc06c9da35b37fca9b1509fddc940eb99f516a2e0195405bcb3993f0fa31bc038d53d2e7231dff08cc39448105ed2d0ac52d375cb543ca8a399f807cc5d007e2c44c69876d189667eee66361a393c4916826af77479382838cd4e004b8baa05636805a

crypto.RSAGenerateKey (experimental)

Experimental: This function is experimental and may be enabled with the --experimental flag.

Generate a new RSA Private Key and output in PEM-encoded PKCS#1 ASN.1 DER form.

Default key length is 4096 bits, which should be safe enough for most uses, but can be overridden with the optional bits parameter.

The output is a string, suitable for use with the other crypto.RSA* functions.

Usage

crypto.RSAGenerateKey [bits]
bits | crypto.RSAGenerateKey

Arguments

name description
bits (optional) bit size of the generated key. Defaults to 4096

Examples

$ gomplate -i '{{ crypto.RSAGenerateKey }}'
-----BEGIN RSA PRIVATE KEY-----
...
$ gomplate -i '{{ $key := crypto.RSAGenerateKey 2048 -}}
  {{ $pub := crypto.RSADerivePublicKey $key -}}
  {{ $enc := "hello" | crypto.RSAEncrypt $pub -}}
  {{ crypto.RSADecrypt $key $enc }}'
hello

crypto.RSADerivePublicKey (experimental)

Experimental: This function is experimental and may be enabled with the --experimental flag.

Derive a public key from an RSA private key and output in PKIX ASN.1 DER form.

The output is a string, suitable for use with other crypto.RSA* functions.

Usage

crypto.RSADerivePublicKey key
key | crypto.RSADerivePublicKey

Arguments

name description
key (required) the private key to derive a public key from

Examples

$ gomplate -i '{{ crypto.RSAGenerateKey | crypto.RSADerivePublicKey }}'
-----BEGIN PUBLIC KEY-----
...
$ gomplate -c privKey=./privKey.pem \
  -i '{{ $pub := crypto.RSADerivePublicKey .privKey -}}
  {{ $enc := "hello" | crypto.RSAEncrypt $pub -}}
  {{ crypto.RSADecrypt .privKey $enc }}'
hello

crypto.SHA1, crypto.SHA224, crypto.SHA256, crypto.SHA384, crypto.SHA512, crypto.SHA512_224, crypto.SHA512_256

Compute a checksum with a SHA-1 or SHA-2 algorithm as defined in RFC 3174 (SHA-1) and FIPS 180-4 (SHA-2).

These functions output the binary result as a hexadecimal string.

Warning: SHA-1 is cryptographically broken and should not be used for secure applications.

Usage

crypto.SHA1 input
crypto.SHA224 input
crypto.SHA256 input
crypto.SHA384 input
crypto.SHA512 input
crypto.SHA512_224 input
crypto.SHA512_256 input

Arguments

name description
input (required) the data to hash - can be binary data or text

Examples

$ gomplate -i '{{ crypto.SHA1 "foo" }}'
f1d2d2f924e986ac86fdf7b36c94bcdf32beec15
$ gomplate -i '{{ crypto.SHA512 "bar" }}'
cc06808cbbee0510331aa97974132e8dc296aeb795be229d064bae784b0a87a5cf4281d82e8c99271b75db2148f08a026c1a60ed9cabdb8cac6d24242dac4063

crypto.WPAPSK

This is really an alias to crypto.PBKDF2 with the values necessary to convert ASCII passphrases to the WPA pre-shared keys for use with WiFi networks.

This can be used, for example, to help generate a configuration for wpa_supplicant.

Usage

crypto.WPAPSK ssid password

Arguments

name description
ssid (required) the WiFi SSID (network name) - must be less than 32 characters
password (required) the password - must be between 8 and 63 characters

Examples

$ PW=abcd1234 gomplate -i '{{ crypto.WPAPSK "mynet" (getenv "PW") }}'
2c201d66f01237d17d4a7788051191f31706844ac3ffe7547a66c902f2900d34