Compare commits

...

3 commits

Author SHA1 Message Date
6b623eb3a3 Add e2e test using opentofu cli 2025-06-03 14:28:37 +02:00
bd06c2e4b3 Update docs 2025-06-03 14:08:16 +02:00
a4442dcfbe Remove cruft 2025-06-03 13:48:00 +02:00
16 changed files with 184 additions and 167 deletions

2
.gitignore vendored
View file

@ -39,3 +39,5 @@ CLAUDE.md
extra
.direnv
.claude
e2e-test/*tfstate*
e2e-test/.terraformrc

View file

@ -21,4 +21,15 @@ test:
testacc:
TF_ACC=1 go test -v -cover -timeout 120m ./...
.PHONY: fmt lint test testacc build install generate
e2e:
@echo "Running end-to-end test..."
cd e2e-test && \
rm -rf .terraform/ .terraform.lock.hcl terraform.tfstate* && \
./setup-dev.sh && \
TF_CLI_CONFIG_FILE=.terraformrc terraform plan && \
TF_CLI_CONFIG_FILE=.terraformrc terraform apply -auto-approve && \
echo "✓ E2E test passed! Cleaning up..." && \
TF_CLI_CONFIG_FILE=.terraformrc terraform destroy -auto-approve && \
echo "✓ E2E test completed successfully"
.PHONY: fmt lint test testacc build install generate e2e

View file

@ -13,9 +13,6 @@ Generates a complete Tor bridge line using obfs4 state and network details
## Example Usage
```terraform
# Copyright (c) Abel Luck <abel@guardianproject.info>
# SPDX-License-Identifier: GPL-3.0-or-later
terraform {
required_providers {
tor = {

View file

@ -13,9 +13,6 @@ The Tor provider generates cryptographic identity materials for obfs4 Tor bridge
## Example Usage
```terraform
# Copyright (c) Abel Luck <abel@guardianproject.info>
# SPDX-License-Identifier: GPL-3.0-or-later
terraform {
required_providers {
tor = {

View file

@ -13,9 +13,6 @@ Generates obfs4 state and certificate for Tor bridges using external relay ident
## Example Usage
```terraform
# Copyright (c) Abel Luck <abel@guardianproject.info>
# SPDX-License-Identifier: GPL-3.0-or-later
terraform {
required_providers {
tor = {
@ -27,9 +24,7 @@ terraform {
provider "tor" {}
# Example: Generate obfs4 state using existing identity keys
resource "tor_relay_identity_rsa" "bridge" {
key_size = 2048
}
resource "tor_relay_identity_rsa" "bridge" {}
resource "tor_relay_identity_ed25519" "bridge" {}

View file

@ -13,9 +13,6 @@ Generates Ed25519 private key for Tor relay identity as required by the Tor spec
## Example Usage
```terraform
# Copyright (c) Abel Luck <abel@guardianproject.info>
# SPDX-License-Identifier: GPL-3.0-or-later
terraform {
required_providers {
tor = {
@ -40,10 +37,6 @@ output "public_key_pem" {
value = tor_relay_identity_ed25519.example.public_key_pem
}
output "public_key_fingerprint_sha1" {
description = "SHA1 fingerprint of the Ed25519 public key"
value = tor_relay_identity_ed25519.example.public_key_fingerprint_sha1
}
output "public_key_fingerprint_sha256" {
description = "SHA256 fingerprint of the Ed25519 public key"

View file

@ -27,9 +27,7 @@ terraform {
provider "tor" {}
# Example: Generate RSA identity key for Tor relay
resource "tor_relay_identity_rsa" "example" {
key_size = 2048 # Default RSA key size for Tor relays
}
resource "tor_relay_identity_rsa" "example" {}
output "private_key_pem" {
description = "RSA private key in PEM format"

49
e2e-test/README.md Normal file
View file

@ -0,0 +1,49 @@
# End-to-End Testing
This directory contains a complete end-to-end test setup for the terraform-provider-tor.
## Quick Start
1. **Setup development environment:**
```bash
./setup-dev.sh
```
This script will:
- Create local `.terraformrc` with dev overrides (no global config changes)
- Build and install the provider locally
2. **Run the test:**
```bash
./tf plan
./tf apply
```
Or using the full command:
```bash
TF_CLI_CONFIG_FILE=.terraformrc terraform plan
TF_CLI_CONFIG_FILE=.terraformrc terraform apply
```
Note: Skip `terraform init` when using dev overrides - it's not needed and may cause errors.
3. **Clean up:**
```bash
./tf destroy
```
## Troubleshooting
If you encounter issues:
1. **Provider not found**: Run `./setup-dev.sh` again
2. **Build errors**: Check that Go >= 1.23 is installed
3. **Permission errors**: Ensure the setup script is executable
## Resetting
To reset your Terraform configuration:
```bash
rm -rf .terraform/ .terraform.lock.hcl terraform.tfstate*
```
Then run the setup and init process again.

62
e2e-test/main.tf Normal file
View file

@ -0,0 +1,62 @@
terraform {
required_providers {
tor = {
source = "guardianproject/tor"
version = "99.0.0"
}
}
}
provider "tor" {}
# Generate RSA identity key for the bridge
resource "tor_relay_identity_rsa" "bridge" {}
# Generate Ed25519 identity key for the bridge
resource "tor_relay_identity_ed25519" "bridge" {}
# Generate obfs4 state using the identity keys
resource "tor_obfs4_state" "bridge" {
rsa_identity_private_key = tor_relay_identity_rsa.bridge.private_key_pem
ed25519_identity_private_key = tor_relay_identity_ed25519.bridge.private_key_pem
}
# Generate bridge line for client distribution
data "tor_obfs4_bridge_line" "bridge" {
ip_address = "203.0.113.1"
port = 9001
identity_fingerprint_sha1 = tor_relay_identity_rsa.bridge.public_key_fingerprint_sha1
obfs4_state_certificate = tor_obfs4_state.bridge.certificate
obfs4_state_iat_mode = tor_obfs4_state.bridge.iat_mode
}
# Outputs for verification
output "rsa_fingerprint_sha1" {
description = "RSA identity fingerprint (SHA1)"
value = tor_relay_identity_rsa.bridge.public_key_fingerprint_sha1
}
output "rsa_fingerprint_sha256" {
description = "RSA identity fingerprint (SHA256)"
value = tor_relay_identity_rsa.bridge.public_key_fingerprint_sha256
}
output "ed25519_fingerprint_sha256" {
description = "Ed25519 identity fingerprint (SHA256)"
value = tor_relay_identity_ed25519.bridge.public_key_fingerprint_sha256
}
output "obfs4_certificate" {
description = "obfs4 certificate for bridge line"
value = tor_obfs4_state.bridge.certificate
}
output "obfs4_iat_mode" {
description = "obfs4 IAT mode"
value = tor_obfs4_state.bridge.iat_mode
}
output "bridge_line" {
description = "Complete bridge line for clients"
value = data.tor_obfs4_bridge_line.bridge.bridge_line
}

48
e2e-test/setup-dev.sh Executable file
View file

@ -0,0 +1,48 @@
#!/usr/bin/env bash
set -e
echo "Setting up development environment for terraform-provider-tor..."
# Get the Go bin path
GOBIN=$(go env GOPATH)/bin
if [ -z "$GOBIN" ]; then
GOBIN=$(go env GOROOT)/bin
fi
echo "Go bin path: $GOBIN"
# Create local .terraformrc with dev overrides
TERRAFORMRC="$(pwd)/.terraformrc"
echo "Creating $TERRAFORMRC..."
# Create local .terraformrc with dev overrides
cat > "$TERRAFORMRC" << EOF
provider_installation {
dev_overrides {
"guardianproject/tor" = "$GOBIN"
}
direct {}
}
EOF
echo "✓ Created local $TERRAFORMRC with dev overrides"
# Build and install the provider
echo "Building and installing provider..."
cd "$(dirname "$0")/.."
# Build with proper naming for dev overrides
go build -o "$GOBIN/terraform-provider-tor_v99.0.0"
echo "✓ Provider built and installed to $GOBIN/terraform-provider-tor_v99.0.0"
echo ""
echo "Setup complete! You can now run:"
echo " cd e2e-test"
echo " ./tf plan"
echo " ./tf apply"
echo ""
echo "Or use the full command:"
echo " TF_CLI_CONFIG_FILE=.terraformrc terraform plan"
echo ""
echo "Note: Using local .terraformrc to avoid modifying your global configuration."

5
e2e-test/tf Executable file
View file

@ -0,0 +1,5 @@
#!/usr/bin/env bash
# Wrapper script to run terraform with local config
export TF_CLI_CONFIG_FILE=.terraformrc
exec tofu "$@"

View file

@ -9,9 +9,7 @@ terraform {
provider "tor" {}
# Example: Generate obfs4 state using existing identity keys
resource "tor_relay_identity_rsa" "bridge" {
key_size = 2048
}
resource "tor_relay_identity_rsa" "bridge" {}
resource "tor_relay_identity_ed25519" "bridge" {}

View file

@ -22,10 +22,6 @@ output "public_key_pem" {
value = tor_relay_identity_ed25519.example.public_key_pem
}
output "public_key_fingerprint_sha1" {
description = "SHA1 fingerprint of the Ed25519 public key"
value = tor_relay_identity_ed25519.example.public_key_fingerprint_sha1
}
output "public_key_fingerprint_sha256" {
description = "SHA256 fingerprint of the Ed25519 public key"

View file

@ -12,9 +12,7 @@ terraform {
provider "tor" {}
# Example: Generate RSA identity key for Tor relay
resource "tor_relay_identity_rsa" "example" {
key_size = 2048 # Default RSA key size for Tor relays
}
resource "tor_relay_identity_rsa" "example" {}
output "private_key_pem" {
description = "RSA private key in PEM format"

View file

@ -47,6 +47,8 @@
pkgs.go
pkgs.golangci-lint
pkgs.obfs4
pkgs.gnumake
pkgs.opentofu
];
buildInputs = libraries;
inputsFrom = libraries;

View file

@ -1,134 +0,0 @@
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=
github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo=
github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY=
github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRjRuY4O1FJmsbNOvSFE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/cli v1.1.6 h1:KMHVPR7kZruGy7vbOn5W2M7PcOWJwkXaHLe8rjUV4dY=
github.com/hashicorp/cli v1.1.6/go.mod h1:6p7uk6XBr7g+W4hy7N7NYqYSBXPa5Z1C/VvQpPCMH9Y=
github.com/hashicorp/go-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU=
github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 h1:1/D3zfFHttUKaCaGKZ/dR2roBXv0vKbSCnssIldfQdI=
github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320/go.mod h1:EiZBMaudVLy8fmjf9Npq1dq9RalhveqZG5w/yz3mHWs=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI=
github.com/hashicorp/go-plugin v1.6.1/go.mod h1:XPHFku2tFo3o3QKFgSYo+cghcUhw1NA1hZyMK0PWAw0=
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKdqZHlqU+s3zB+A/8bV3psmIos=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/hc-install v0.8.0 h1:W5l9fjCIhG/QAImWR0LE4AOKiDUxGR3+V8SCMvQnb2Y=
github.com/hashicorp/hc-install v0.8.0/go.mod h1:vRJU/PIsZbJBT0DgpXzRH7ZQJgE8YlGV2/ZnbTsJgJ8=
github.com/hashicorp/hcl/v2 v2.21.0 h1:lve4q/o/2rqwYOgUg3y3V2YPyD2RtlUIQ/2UyfrxYtI=
github.com/hashicorp/hcl/v2 v2.21.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA=
github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/terraform-exec v0.21.0 h1:uNkLAe95ey5Uux6KJdua6+cv8asgILFVWkd/RG0D2XQ=
github.com/hashicorp/terraform-exec v0.21.0/go.mod h1:1PPeMYou+KDUSSeRE9szMZ/oHf4fYUmB923Wzbq1ICg=
github.com/hashicorp/terraform-json v0.22.1 h1:xft84GZR0QzjPVWs4lRUwvTcPnegqlyS7orfb5Ltvec=
github.com/hashicorp/terraform-json v0.22.1/go.mod h1:JbWSQCLFSXFFhg42T7l9iJwdGXBYV8fmmD6o/ML4p3A=
github.com/hashicorp/terraform-plugin-docs v0.19.4 h1:CfI1r+Fb8jDjdADp5GTDPYB/LEU0CTJ0NkF/1RSSB8A=
github.com/hashicorp/terraform-plugin-docs v0.19.4/go.mod h1:DCF27O5RpcNm/p4v7WMTRmP1DQSA9ZMNj3ux6Nzx7MY=
github.com/hashicorp/terraform-plugin-framework v1.12.0 h1:CZBXAzKXNUCJXAz7my/4LgWDBbKIz+8IW7E6wlJFbOo=
github.com/hashicorp/terraform-plugin-framework v1.12.0/go.mod h1:k0btlrW8IMR7Gq+k2zJzqUK8MhLeR2RSrOGNw8qODmU=
github.com/hashicorp/terraform-plugin-go v0.23.0 h1:AALVuU1gD1kPb48aPQUjug9Ir/125t+AAurhqphJ2Co=
github.com/hashicorp/terraform-plugin-go v0.23.0/go.mod h1:1E3Cr9h2vMlahWMbsSEcNrOCxovCZhOOIXjFHbjc/lQ=
github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0=
github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow=
github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 h1:kJoLKl3xJB54AtNsLvGZVDmzf+qzUlqOTe4jqp7L+ZU=
github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0/go.mod h1:sl/UbXl1zzUQupPCavdMdAQHGGODhSgVjrOF3Nd1UrA=
github.com/hashicorp/terraform-plugin-testing v1.10.0 h1:j/2S0ZM9m7QVm8b3t2B4PqT4PmQbxkM/CgJnr0YFGyk=
github.com/hashicorp/terraform-plugin-testing v1.10.0/go.mod h1:t7O9LSoYLyT88fT9jEX7sFcMSvKM7pU4pDsb6PrSdq8=
github.com/hashicorp/terraform-registry-address v0.2.3 h1:2TAiKJ1A3MAkZlH1YI/aTVcLZRu7JseiXNRHbOAyoTI=
github.com/hashicorp/terraform-registry-address v0.2.3/go.mod h1:lFHA76T8jfQteVfT7caREqguFrW3c4MFSPhZB7HHgUM=
github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ=
github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc=
github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=
github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng=
github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxBiscop=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww=
github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY=
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWFro0E=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGPiK/92rKx=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ=
github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE=
gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird v0.4.0 h1:NHnO+9dGWkXpSWwC8Y3xHu9PTLwDfKWYKQeNS1tPBR0=
gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird v0.4.0/go.mod h1:Kxv+0sWNVD5VrFdIGQwE8VWLRtOg4g4lxr5IiMH74o=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c=
google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=