Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Challenge-based 2-step auth with native email #46

Merged
merged 13 commits into from
Jun 6, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ type Config struct {
Admin AdminConfig `toml:"admin"`
Endpoints EndpointsConfig `toml:"endpoints"`
KMS KMSConfig `toml:"kms"`
SES SESConfig `toml:"ses"`
Builder BuilderConfig `toml:"builder"`
Database DatabaseConfig `toml:"database"`
Telemetry telemetry.Config `toml:"telemetry"`
Tracing TracingConfig `toml:"tracing"`
Expand Down Expand Up @@ -44,10 +46,23 @@ type KMSConfig struct {
DefaultSessionKeys []string `toml:"default_session_keys"`
}

type SESConfig struct {
Region string `toml:"region"`
Source string `toml:"source"`
SourceARN string `toml:"source_arn"`
AccessRoleARN string `toml:"access_role_arn"`
}

type DatabaseConfig struct {
TenantsTable string `toml:"tenants_table"`
AccountsTable string `toml:"accounts_table"`
SessionsTable string `toml:"sessions_table"`
TenantsTable string `toml:"tenants_table"`
AccountsTable string `toml:"accounts_table"`
SessionsTable string `toml:"sessions_table"`
VerificationContextsTable string `toml:"verification_contexts_table"`
}

type BuilderConfig struct {
BaseURL string `toml:"base_url"`
SecretID string `toml:"secret_id"`
}

type TracingConfig struct {
Expand Down
170 changes: 170 additions & 0 deletions data/verification_context.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
package data

import (
"context"
"fmt"
"strconv"
"strings"
"time"

"github.com/0xsequence/go-sequence/intents"
"github.com/0xsequence/waas-authenticator/proto"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)

type AuthID struct {
ProjectID uint64
IdentityType intents.IdentityType
Verifier string
}

func (id AuthID) String() string {
return fmt.Sprintf("%d/%s/%s", id.ProjectID, id.IdentityType, id.Verifier)
}

func (id *AuthID) FromString(s string) error {
parts := strings.SplitN(s, "/", 3)
if len(parts) != 3 {
return fmt.Errorf("invalid auth session ID format: %s", s)
}

projID, err := strconv.Atoi(parts[0])
if err != nil {
return fmt.Errorf("invalid project ID: %s", s)
}

id.ProjectID = uint64(projID)
id.IdentityType = intents.IdentityType(parts[1])
id.Verifier = parts[2]
return nil
}

func (id *AuthID) MarshalDynamoDBAttributeValue() (types.AttributeValue, error) {
return &types.AttributeValueMemberS{Value: id.String()}, nil
}

func (id *AuthID) UnmarshalDynamoDBAttributeValue(value types.AttributeValue) error {
v, ok := value.(*types.AttributeValueMemberS)
if !ok {
return fmt.Errorf("invalid auth session ID of type: %T", value)
}
return id.FromString(v.Value)
}

type VerificationContext struct {
ID AuthID `dynamodbav:"ID"`
EncryptedKey []byte `dynamodbav:"EncryptedKey"`
Algorithm string `dynamodbav:"Algorithm"`
Ciphertext []byte `dynamodbav:"Ciphertext"`
CreatedAt time.Time `dynamodbav:"CreatedAt"`
}

func (s *VerificationContext) Key() map[string]types.AttributeValue {
return map[string]types.AttributeValue{
"ID": &types.AttributeValueMemberS{Value: s.ID.String()},
}
}

func (s *VerificationContext) CorrespondsTo(data *proto.VerificationContext) bool {
if string(s.ID.IdentityType) != string(data.IdentityType) {
return false
}
if s.ID.Verifier != data.Verifier {
return false
}
if s.ID.ProjectID != data.ProjectID {
return false
}
return true
}

type VerificationContextTable struct {
db DB
tableARN string
}

func NewVerificationContextTable(db DB, tableARN string) *VerificationContextTable {
return &VerificationContextTable{
db: db,
tableARN: tableARN,
}
}

// Put updates a VerificationContext by ID or creates one if it doesn't exist yet.
func (t *VerificationContextTable) Put(ctx context.Context, verifCtx *VerificationContext) error {
verifCtx.CreatedAt = time.Now()

av, err := attributevalue.MarshalMap(verifCtx)
if err != nil {
return fmt.Errorf("marshal input: %w", err)
}
input := &dynamodb.PutItemInput{
TableName: aws.String(t.tableARN),
Item: av,
}
if _, err := t.db.PutItem(ctx, input); err != nil {
return fmt.Errorf("PutItem: %w", err)
}
return nil
}

// Get returns an AuthSession from the DB with the given ID.
//
// AuthSession not being found is not considered an error. Instead, it returns `false` as second value if the AuthSession
// was not found.
func (t *VerificationContextTable) Get(ctx context.Context, id AuthID) (*VerificationContext, bool, error) {
verifCtx := VerificationContext{ID: id}
input := &dynamodb.GetItemInput{
TableName: aws.String(t.tableARN),
Key: verifCtx.Key(),
}

out, err := t.db.GetItem(ctx, input)
if err != nil {
return nil, false, fmt.Errorf("GetItem: %w", err)
}
if len(out.Item) == 0 {
return nil, false, nil
}

if err := attributevalue.UnmarshalMap(out.Item, &verifCtx); err != nil {
return nil, false, fmt.Errorf("unmarshal result: %w", err)
}
return &verifCtx, true, nil
}

func (t *VerificationContextTable) UpdateData(
ctx context.Context, current *VerificationContext, encryptedKey []byte, algorithm string, ciphertext []byte,
) error {
oldEncryptedKey := current.EncryptedKey
oldAlgorithm := current.Algorithm
oldCiphertext := current.Ciphertext

current.EncryptedKey = encryptedKey
current.Algorithm = algorithm
current.Ciphertext = ciphertext

av, err := attributevalue.MarshalMap(current)
if err != nil {
return fmt.Errorf("marshal input: %w", err)
}
input := &dynamodb.PutItemInput{
TableName: aws.String(t.tableARN),
Item: av,
ConditionExpression: aws.String(
"attribute_exists(ID) AND EncryptedKey = :encrypted_key AND Algorithm = :algorithm AND Ciphertext = :ciphertext",
),
ExpressionAttributeValues: map[string]types.AttributeValue{
":encrypted_key": &types.AttributeValueMemberB{Value: oldEncryptedKey},
":algorithm": &types.AttributeValueMemberS{Value: oldAlgorithm},
":ciphertext": &types.AttributeValueMemberB{Value: oldCiphertext},
},
}
if _, err := t.db.PutItem(ctx, input); err != nil {
return fmt.Errorf("UpdateData: %w", err)
}
return nil
}
13 changes: 13 additions & 0 deletions docker/awslocal_ready_hook.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@ fi
awslocal kms create-key --region us-east-1 --tags '[{"TagKey":"_custom_id_","TagValue":"aeb99e0f-9e89-44de-a084-e1817af47778"}]'
awslocal kms create-key --region us-east-1 --tags '[{"TagKey":"_custom_id_","TagValue":"27ebbde0-49d2-4cb6-ad78-4f2c24fe7b79"}]'

awslocal ses verify-email-identity --email [email protected]

awslocal secretsmanager create-secret \
--region us-east-1 \
--name BuilderJWT \
--secret-string 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXJ2aWNlIjoiV2FhUyJ9.-FAkEOb0jtHhoHv6r4O7U8PGOw_b60M9MnSYN9Bm_7A'

awslocal dynamodb create-table \
--region us-east-1 \
--table-name TenantsTable \
Expand All @@ -34,3 +41,9 @@ awslocal dynamodb create-table \
"IndexName=UserID-Index,KeySchema=[{AttributeName=UserID,KeyType=HASH},{AttributeName=Identity,KeyType=SORT}],Projection={ProjectionType=ALL},ProvisionedThroughput={ReadCapacityUnits=10,WriteCapacityUnits=10}" \
"IndexName=Email-Index,KeySchema=[{AttributeName=ProjectScopedEmail,KeyType=HASH},{AttributeName=Identity,KeyType=SORT}],Projection={ProjectionType=ALL},ProvisionedThroughput={ReadCapacityUnits=10,WriteCapacityUnits=10}"

awslocal dynamodb create-table \
--region us-east-1 \
--table-name VerificationContextsTable \
--attribute-definitions AttributeName=ID,AttributeType=S \
--key-schema AttributeName=ID,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=10
8 changes: 8 additions & 0 deletions etc/waas-auth.sample.conf
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,16 @@ QwIDAQAB
[database]
tenants_table = "TenantsTable"
sessions_table = "SessionsTable"
verification_contexts_table = "VerificationContextsTable"

[kms]
tenant_keys = ["arn:aws:kms:us-east-1:000000000000:key/27ebbde0-49d2-4cb6-ad78-4f2c24fe7b79"]
default_session_keys = ["arn:aws:kms:us-east-1:000000000000:key/27ebbde0-49d2-4cb6-ad78-4f2c24fe7b79"]
default_transport_keys = ["arn:aws:kms:us-east-1:000000000000:key/aeb99e0f-9e89-44de-a084-e1817af47778"]

[ses]
source = "[email protected]"

[builder]
base_url = "http://host.docker.internal:9999"
secret_id = "BuilderJWT"
20 changes: 11 additions & 9 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,19 @@ module github.com/0xsequence/waas-authenticator
go 1.22.1

require (
github.com/0xsequence/ethkit v1.24.12
github.com/0xsequence/go-sequence v0.32.1
github.com/0xsequence/ethkit v1.25.0
github.com/0xsequence/go-sequence v0.32.3-0.20240530122133-eb49a20c089e
github.com/0xsequence/nitrocontrol v0.3.0
github.com/BurntSushi/toml v1.3.2
github.com/aws/aws-sdk-go-v2 v1.26.1
github.com/aws/aws-sdk-go-v2 v1.27.0
github.com/aws/aws-sdk-go-v2/config v1.27.4
github.com/aws/aws-sdk-go-v2/credentials v1.17.4
github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.13.6
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1
github.com/aws/aws-sdk-go-v2/service/kms v1.29.1
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.1
github.com/aws/aws-sdk-go-v2/service/ses v1.22.9
github.com/aws/aws-sdk-go-v2/service/sts v1.28.1
github.com/go-chi/chi/v5 v5.0.12
github.com/go-chi/httplog v0.3.2
github.com/go-chi/jwtauth/v5 v5.3.0
Expand All @@ -26,7 +30,7 @@ require (
github.com/riandyrn/otelchi v0.7.0
github.com/rs/zerolog v1.32.0
github.com/stretchr/testify v1.9.0
github.com/webrpc/webrpc v0.18.6
github.com/webrpc/webrpc v0.18.7
go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.50.0
go.opentelemetry.io/contrib/propagators/aws v1.25.0
go.opentelemetry.io/otel v1.26.0
Expand All @@ -43,10 +47,9 @@ require (
github.com/Masterminds/semver/v3 v3.2.1 // indirect
github.com/Masterminds/sprig/v3 v3.2.3 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.4 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.20.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect
Expand All @@ -55,7 +58,6 @@ require (
github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.28.1 // indirect
github.com/aws/smithy-go v1.20.2 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/btcsuite/btcd v0.24.0 // indirect
Expand Down Expand Up @@ -120,7 +122,7 @@ require (
github.com/prometheus/procfs v0.12.0 // indirect
github.com/redis/go-redis/v9 v9.5.1 // indirect
github.com/segmentio/asm v1.2.0 // indirect
github.com/sergi/go-diff v1.3.1 // indirect
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
github.com/spf13/cast v1.6.0 // indirect
Expand Down
32 changes: 18 additions & 14 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/0xsequence/ethkit v1.24.12 h1:Pr45Fo5t6JJovmHlHVsgR9Smd+fuhmC4HPbNANSAe3Y=
github.com/0xsequence/ethkit v1.24.12/go.mod h1:E3eymNtV0oJabgqM9R92xTQYOsT7rVHxFRju8A2CFJw=
github.com/0xsequence/ethkit v1.25.0 h1:auXjpJrpIckfzQ5jgVAD6GECLpFSViZWsJtz1F3EAJg=
github.com/0xsequence/ethkit v1.25.0/go.mod h1:E3eymNtV0oJabgqM9R92xTQYOsT7rVHxFRju8A2CFJw=
github.com/0xsequence/go-ethauth v0.13.0 h1:ZaqFEEqy574A2b1P7vjpcy5tb4W/izn+A3swwOYi9wA=
github.com/0xsequence/go-ethauth v0.13.0/go.mod h1:f3kx39S9F+W+qvZEB6bkKKbpUstmyB7goUntO3wvlhg=
github.com/0xsequence/go-sequence v0.32.1 h1:JtArHYj+dlcNySsNmpIxoV4RDMrPQxD9xXxiz2gX+Dk=
github.com/0xsequence/go-sequence v0.32.1/go.mod h1:/2P2A1W54tBXFY3D3aam/D9DHeFTWtqeJhgCxEkKfKM=
github.com/0xsequence/go-sequence v0.32.3-0.20240530122133-eb49a20c089e h1:Lo/jJN5p69ockVAQVxfHSm3bDCYaWmgoBwZ8zStxv5g=
github.com/0xsequence/go-sequence v0.32.3-0.20240530122133-eb49a20c089e/go.mod h1:7VGqBMoOGI43fzr3NDCMYxkXoz+qwdnnR3ocz4fHWjM=
github.com/0xsequence/nitrocontrol v0.3.0 h1:D0/gX576zQhitrJnBfBrOFFufEOzh6f2jO/+2ynwIUA=
github.com/0xsequence/nitrocontrol v0.3.0/go.mod h1:sTG5akVPzoVr3unv/7h9aZGaT+BVGmvUMOdwXFeIEEA=
github.com/0xsequence/nsm v0.1.0 h1:gVOViRWPUW/c5VEmGy2gCw1az/nqP3gY7VD9V2+069k=
Expand Down Expand Up @@ -34,8 +34,8 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFI
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA=
github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM=
github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo=
github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM=
github.com/aws/aws-sdk-go-v2/config v1.27.4 h1:AhfWb5ZwimdsYTgP7Od8E9L1u4sKmDW2ZVeLcf2O42M=
github.com/aws/aws-sdk-go-v2/config v1.27.4/go.mod h1:zq2FFXK3A416kiukwpsd+rD4ny6JC7QSkp4QdN1Mp2g=
github.com/aws/aws-sdk-go-v2/credentials v1.17.4 h1:h5Vztbd8qLppiPwX+y0Q6WiwMZgpd9keKe2EAENgAuI=
Expand All @@ -44,10 +44,10 @@ github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.13.6 h1:fKkSKZFq
github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.13.6/go.mod h1:+/MkJPCE/m0lNlYKVyKG79YFM2IF/n2gM43llt34xXQ=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 h1:AK0J8iYBFeUk2Ax7O8YpLtFsfhdOByh2QIkHmigpRYk=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1 h1:dZXY07Dm59TxAjJcUfNMJHLDI/gLMxTRZefn2jFAVsw=
Expand All @@ -62,6 +62,10 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2 h1:5ffmXjPtw
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0=
github.com/aws/aws-sdk-go-v2/service/kms v1.29.1 h1:OdjJjUWFlMZLAMl54ASxIpZdGEesY4BH3/c0HAPSFdI=
github.com/aws/aws-sdk-go-v2/service/kms v1.29.1/go.mod h1:Cbx2uxEX0bAB7SlSY+ys05ZBkEb8IbmuAOcGVmDfJFs=
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.1 h1:NSWsFzdHN41mJ5I/DOFzxgkKSYNHQADHn7Mu+lU/AKw=
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.1/go.mod h1:5mMk0DgUgaHlcqtN65fNyZI0ZDX3i9Cw+nwq75HKB3U=
github.com/aws/aws-sdk-go-v2/service/ses v1.22.9 h1:PCKzjZiusiIDUkbc3vXq1KsHleIYxfUEtSqO+TpWQU4=
github.com/aws/aws-sdk-go-v2/service/ses v1.22.9/go.mod h1:qPKQ6sRnlNj8HrPbMdEVMNNX9nxyNGQMII63JAUtiuw=
github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4 h1:mE2ysZMEeQ3ulHWs4mmc4fZEhOfeY1o6QXAfDqjbSgw=
github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4/go.mod h1:lCN2yKnj+Sp9F6UzpoPPTir+tSaC9Jwf6LcmTqnXFZw=
github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 h1:utEGkfdQ4L6YW/ietH7111ZYglLJvS+sLriHJ1NBJEQ=
Expand Down Expand Up @@ -384,8 +388,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
Expand Down Expand Up @@ -443,8 +447,8 @@ github.com/webrpc/gen-openapi v0.13.0 h1:+FrIyqdCBkjCbUBD3HJ6mVERJL2mPrhuIsW31BM
github.com/webrpc/gen-openapi v0.13.0/go.mod h1:fwY3ylZmdiCr+WXjR8Ek8wm08CFRr2/GaXI7Zd/Ou4Y=
github.com/webrpc/gen-typescript v0.13.0 h1:QgmGmm+OuKZAIDr8Qg/fNLzFem5aUUkH9z+k3OKkf3o=
github.com/webrpc/gen-typescript v0.13.0/go.mod h1:xQzYnVaSMfcygDXA5SuW8eYyCLHBHkj15wCF7gcJF5Y=
github.com/webrpc/webrpc v0.18.6 h1:tGEKIIMKhSk06DSNKjxiqOFAahwrdUQ0ch0dfTjk3Ys=
github.com/webrpc/webrpc v0.18.6/go.mod h1:B9f1FJKatWz34GpEL0a5FU856K0N13BqQU53ITmM8YU=
github.com/webrpc/webrpc v0.18.7 h1:bRUYbLVyPbba0LjGZ8mYORuCoa4O/gRd/OQwQ5SA2U0=
github.com/webrpc/webrpc v0.18.7/go.mod h1:jhX8vP9Fgy9g98OgLCuuARL0KHUHPm4p9iOOO0rOBGM=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
Expand Down
Loading
Loading