Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
0661abd
Enable LLO CRE Capability
cawthorne Dec 5, 2025
b276386
Resolve stash conflict
cawthorne Dec 5, 2025
3306fd5
Add new Streams Capability
cawthorne Dec 5, 2025
a835972
Add remaining functions to CLI
connorwstein Dec 5, 2025
7fedbfb
Cleanup encrypt/decrypt
connorwstein Dec 5, 2025
6ede412
Cleanup, UX improvements
connorwstein Dec 5, 2025
a681376
Remove log
connorwstein Dec 5, 2025
4b04fc9
Fix log statements
connorwstein Dec 5, 2025
96d550a
Fix linter add doc link
connorwstein Dec 5, 2025
64b6377
pkg/settings/cresettings: add PerWorkflow.ChainAllowed
jmank88 Dec 5, 2025
5bdfc30
Code owners
connorwstein Dec 10, 2025
ae9dd8c
Prod sec co-owns keystore
connorwstein Dec 10, 2025
f62663f
pkg/settings: fix SettingMap.GetOrDefault
jmank88 Dec 10, 2025
3dd3707
pkg/types/llo: ChannelDefinitionCache accepts the previous outcome de…
brunotm Nov 21, 2025
d56805f
pkg/types/llo: ChannelDefiniton.Equals considers tombstones and sourc…
brunotm Dec 4, 2025
65fd87d
fix: refactor for readability
erikburt Nov 14, 2025
072bce3
feat: support local installs
erikburt Nov 17, 2025
c22b1de
Port generic chain-agnostic balance monitor to cl-common (#1728)
ogtownsend Dec 15, 2025
58ecd6a
pkg/utils: fix SleeperTask race (#1737)
jmank88 Dec 15, 2025
b181350
Better error handling for empty server responses (#1741)
prashantkumar1982 Dec 19, 2025
746138b
pkg/settings/cresettings: remove deprecated fields (#1738)
jmank88 Dec 19, 2025
04f56c2
pkg/capabilities: fix Request/RegistrationMetadata.ContextWithCRE to …
jmank88 Dec 29, 2025
e46cb3b
CRE-1613: Fix internal errors passed from WASM host to guest and add …
nolag Dec 30, 2025
9d87379
pkg/contexts: expand CRE.Normalized (#1746)
jmank88 Dec 31, 2025
bf51f53
[CRE] Adjust default limits (#1748)
bolekk Jan 2, 2026
00708ed
CRE-1601: Ring OCR plugin for shard orchestration (#1742)
mchain0 Jan 5, 2026
c4dad9e
[CRE] Log more details of observations in DONTime plugin (#1750)
bolekk Jan 5, 2026
fe69589
FIFO order in ResourcePoolLimiter to support ordered concurrency limi…
bolekk Jan 6, 2026
62bc87e
adding grpc workflow metadata source client and related types (#1749)
patrickhuie19 Jan 6, 2026
f0414b8
trigger wrapper generator changes to support capability errors (#1755)
ettec Jan 6, 2026
b31c6a3
pkg/settings: add per-chain overridable EVM.GasLimit (#1757)
jmank88 Jan 6, 2026
fb3aa9e
cre-1626: minor rest refactor (#1751)
mchain0 Jan 7, 2026
f0a00af
[CRE-491] Move chainaccessor event ccip types to chainlink-common. (#…
pavel-raykov Jan 7, 2026
e5e4627
[ARCH-327] Address security comments (#1758)
pavel-raykov Jan 7, 2026
8ff43d6
[CRE-1601] shard-orchestrator implementation (#1747)
agparadiso Jan 8, 2026
4af655f
Fix keystore CLI embedding (#1761)
connorwstein Jan 8, 2026
8b4dfe9
[CRE][Limits] Handle limit flip to zero and back correctly (#1762)
bolekk Jan 9, 2026
d01ca26
[ARCH-327] Address security comments. 2 (#1760)
pavel-raykov Jan 9, 2026
2194556
pkg/contexts: don't change case of org IDs (#1766)
jmank88 Jan 13, 2026
5539000
feat: add authorization capability tests
cawthorne Jan 13, 2026
3a71f49
fix: update to caperrors.Error return type after rebase, remove autho…
cawthorne Jan 13, 2026
4ca4ef9
chore: regenerate streams trigger protos after simplification
cawthorne Jan 13, 2026
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
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@

# Please define less specific codeowner paths before more specific codeowner paths in order for the more specific rule to have priority


* @smartcontractkit/foundations

/keystore @smartcontractkit/prodsec-public @smartcontractkit/foundations
/pkg/beholder/ @smartcontractkit/data-tooling
/pkg/capabilities/v2/chain-capabilities @smartcontractkit/keystone @smartcontractkit/capabilities-team @smartcontractkit/bix-framework
/pkg/chains/evm @smartcontractkit/bix-framework
Expand Down
14 changes: 9 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ require (
github.com/XSAM/otelsql v0.37.0
github.com/andybalholm/brotli v1.1.1
github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c
github.com/buraksezer/consistent v0.10.0
github.com/bytecodealliance/wasmtime-go/v28 v28.0.0
github.com/cespare/xxhash/v2 v2.3.0
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
github.com/dominikbraun/graph v0.23.0
github.com/fxamacker/cbor/v2 v2.7.0
Expand All @@ -30,6 +32,7 @@ require (
github.com/kylelemons/godebug v1.1.0
github.com/lib/pq v1.10.9
github.com/marcboeker/go-duckdb v1.8.5
github.com/mattn/go-shellwords v1.0.12
github.com/mr-tron/base58 v1.2.0
github.com/pelletier/go-toml v1.9.5
github.com/pelletier/go-toml/v2 v2.2.4
Expand All @@ -43,7 +46,7 @@ require (
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9
github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b
github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0
github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251020004840-4638e4262066
github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20260106052706-6dd937cb5ec6
github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7
github.com/smartcontractkit/libocr v0.0.0-20250912173940-f3ab0246e23d
Expand Down Expand Up @@ -87,7 +90,6 @@ require (
github.com/buger/goterm v1.0.4 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.16.1 // indirect
github.com/cloudevents/sdk-go/v2 v2.16.1 // indirect
github.com/fatih/color v1.18.0 // indirect
Expand Down Expand Up @@ -134,14 +136,14 @@ require (
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/ryanuber/go-glob v1.0.0 // indirect
github.com/sanity-io/litter v1.5.5 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect
go.opentelemetry.io/proto/otlp v1.6.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
Expand All @@ -152,6 +154,8 @@ require (
golang.org/x/term v0.37.0 // indirect
golang.org/x/text v0.31.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

replace github.com/smartcontractkit/chainlink-protos/cre/go => ../chainlink-protos/cre/go
22 changes: 12 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY=
github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/buraksezer/consistent v0.10.0 h1:hqBgz1PvNLC5rkWcEBVAL9dFMBWz6I0VgUCW25rrZlU=
github.com/buraksezer/consistent v0.10.0/go.mod h1:6BrVajWq7wbKZlTOUPs/XVfR8c0maujuPowduSpZqmw=
github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 h1:aBU8cexP2rPZ0Qz488kvn2NXvWZHL2aG1/+n7Iv+xGc=
github.com/bytecodealliance/wasmtime-go/v28 v28.0.0/go.mod h1:4OCU0xAW9ycwtX4nMF4zxwgJBJ5/0eMfJiHB0wAmkV4=
github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
Expand Down Expand Up @@ -256,6 +258,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
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/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
Expand Down Expand Up @@ -304,8 +308,8 @@ github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzM
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
Expand All @@ -330,14 +334,12 @@ github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY=
github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 h1:GCzrxDWn3b7jFfEA+WiYRi8CKoegsayiDoJBCjYkneE=
github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4/go.mod h1:HHGeDUpAsPa0pmOx7wrByCitjQ0mbUxf0R9v+g67uCA=
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9 h1:QRWXJusIj/IRY5Pl3JclNvDre0cZPd/5NbILwc4RV2M=
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9/go.mod h1:jUC52kZzEnWF9tddHh85zolKybmLpbQ1oNA4FjOHt1Q=
github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b h1:QuI6SmQFK/zyUlVWEf0GMkiUYBPY4lssn26nKSd/bOM=
github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b/go.mod h1:qSTSwX3cBP3FKQwQacdjArqv0g6QnukjV4XuzO6UyoY=
github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0 h1:B7itmjy+CMJ26elVw/cAJqqhBQ3Xa/mBYWK0/rQ5MuI=
github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0/go.mod h1:h6kqaGajbNRrezm56zhx03p0mVmmA2xxj7E/M4ytLUA=
github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251020004840-4638e4262066 h1:Lrc0+uegqasIFgsGXHy4tzdENT+zH2AbkTV4F7e3otU=
github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251020004840-4638e4262066/go.mod h1:HIpGvF6nKCdtZ30xhdkKWGM9+4Z4CVqJH8ZBL1FTEiY=
github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20260106052706-6dd937cb5ec6 h1:BXMylId1EoFxuAy++JRifxUF+P/I7v5BEBh0wECtrEM=
github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20260106052706-6dd937cb5ec6/go.mod h1:GTpDgyK0OObf7jpch6p8N281KxN92wbB8serZhU9yRc=
github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e h1:Hv9Mww35LrufCdM9wtS9yVi/rEWGI1UnjHbcKKU0nVY=
github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e/go.mod h1:T4zH9R8R8lVWKfU7tUvYz2o2jMv1OpGCdpY2j2QZXzU=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs=
Expand Down Expand Up @@ -378,8 +380,8 @@ github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN
github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ=
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
Expand Down Expand Up @@ -586,8 +588,8 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU=
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
Expand Down
2 changes: 2 additions & 0 deletions keystore/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
[![Go Reference](https://pkg.go.dev/badge/github.com/smartcontractkit/chainlink-common/keystore.svg)](https://pkg.go.dev/github.com/smartcontractkit/chainlink-common/keystore)

WARNING: In development do not use in production.

# Keystore
Expand Down
24 changes: 19 additions & 5 deletions keystore/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"encoding/json"
"fmt"
"maps"
"slices"
"time"

gethkeystore "github.com/ethereum/go-ethereum/accounts/keystore"
Expand All @@ -21,6 +22,11 @@ import (
"github.com/smartcontractkit/chainlink-common/keystore/serialization"
)

const (
MaxKeyNameLength = 1000
MaxMetadataLength = 1024 * 1024 // 1mb
)

var (
ErrKeyAlreadyExists = fmt.Errorf("key already exists")
ErrInvalidKeyName = fmt.Errorf("invalid key name")
Expand Down Expand Up @@ -165,8 +171,8 @@ func ValidKeyName(name string) error {
return fmt.Errorf("key name cannot be empty")
}
// Just a sanity bound.
if len(name) > 1_000 {
return fmt.Errorf("key name cannot be longer than 1000 characters")
if len(name) > MaxKeyNameLength {
return fmt.Errorf("key name cannot be longer than %d characters", MaxKeyNameLength)
}
return nil
}
Expand Down Expand Up @@ -202,9 +208,8 @@ func (ks *keystore) CreateKeys(ctx context.Context, req CreateKeysRequest) (Crea
if err != nil {
return CreateKeysResponse{}, fmt.Errorf("failed to generate ECDSA_S256 key: %w", err)
}
// Must copy the private key into 32 byte slice because leading zeros are stripped.
privateKeyBytes := make([]byte, 32)
copy(privateKeyBytes, privateKey.D.Bytes())
privateKey.D.FillBytes(privateKeyBytes)
publicKey, err := publicKeyFromPrivateKey(internal.NewRaw(privateKeyBytes), keyReq.KeyType)
if err != nil {
return CreateKeysResponse{}, fmt.Errorf("failed to get public key from private key: %w", err)
Expand Down Expand Up @@ -232,7 +237,7 @@ func (ks *keystore) CreateKeys(ctx context.Context, req CreateKeysRequest) (Crea
}
ksCopy[keyReq.KeyName] = newKey(keyReq.KeyType, internal.NewRaw(privateKey.Bytes()), publicKey, time.Now(), []byte{})
default:
return CreateKeysResponse{}, fmt.Errorf("%w: %s", ErrUnsupportedKeyType, keyReq.KeyType)
return CreateKeysResponse{}, fmt.Errorf("%w: %s, available key types: %s", ErrUnsupportedKeyType, keyReq.KeyType, AllKeyTypes.String())
}

created := ksCopy[keyReq.KeyName].createdAt
Expand Down Expand Up @@ -291,6 +296,9 @@ func (ks *keystore) ImportKeys(ctx context.Context, req ImportKeysRequest) (Impo
}
pkRaw := internal.NewRaw(keypb.PrivateKey)
keyType := KeyType(keypb.KeyType)
if !slices.Contains(AllKeyTypes, keyType) {
return ImportKeysResponse{}, fmt.Errorf("%w: %s, available key types: %s", ErrUnsupportedKeyType, keyType, AllKeyTypes.String())
}
publicKey, err := publicKeyFromPrivateKey(pkRaw, keyType)
if err != nil {
return ImportKeysResponse{}, fmt.Errorf("key num = %d, failed to get public key from private key: %w", i, err)
Expand All @@ -301,6 +309,9 @@ func (ks *keystore) ImportKeys(ctx context.Context, req ImportKeysRequest) (Impo
if metadata == nil {
metadata = []byte{}
}
if len(metadata) > MaxMetadataLength {
return ImportKeysResponse{}, fmt.Errorf("key num = %d, metadata of length %d exceeds maximum length of %d bytes", i, len(metadata), MaxMetadataLength)
}

keyName := keyReq.NewKeyName
if keyName == "" {
Expand Down Expand Up @@ -366,6 +377,9 @@ func (ks *keystore) SetMetadata(ctx context.Context, req SetMetadataRequest) (Se

ksCopy := maps.Clone(ks.keystore)
for _, metReq := range req.Updates {
if len(metReq.Metadata) > MaxMetadataLength {
return SetMetadataResponse{}, fmt.Errorf("metadata for key %s exceeds maximum length of %d bytes", metReq.KeyName, MaxMetadataLength)
}
key, ok := ksCopy[metReq.KeyName]
if !ok {
return SetMetadataResponse{}, fmt.Errorf("%w: %s", ErrKeyNotFound, metReq.KeyName)
Expand Down
31 changes: 30 additions & 1 deletion keystore/admin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ package keystore_test
import (
"context"
"fmt"
"math/big"
"sort"
"sync"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

gethcrypto "github.com/ethereum/go-ethereum/crypto"

"github.com/smartcontractkit/chainlink-common/keystore"
)

Expand Down Expand Up @@ -258,7 +261,16 @@ func TestKeystore_ExportImport(t *testing.T) {
key1ks1, err := ks1.GetKeys(t.Context(), keystore.GetKeysRequest{KeyNames: []string{"key1"}})
require.NoError(t, err)
key1ks2, err := ks2.GetKeys(t.Context(), keystore.GetKeysRequest{KeyNames: []string{"key1"}})
require.Equal(t, key1ks1, key1ks2)
require.NoError(t, err)
// Test equality of the keys except of the CreatedAt field.
require.Len(t, key1ks1.Keys, 1)
require.Len(t, key1ks2.Keys, 1)
key1ks1Info := key1ks1.Keys[0].KeyInfo
key1ks2Info := key1ks2.Keys[0].KeyInfo
require.Equal(t, key1ks1Info.Name, key1ks2Info.Name)
require.Equal(t, key1ks1Info.PublicKey, key1ks2Info.PublicKey)
require.Equal(t, key1ks1Info.KeyType, key1ks2Info.KeyType)
require.Equal(t, key1ks1Info.Metadata, key1ks2Info.Metadata)

testData := []byte("hello world")
signature, err := ks2.Sign(t.Context(), keystore.SignRequest{
Expand Down Expand Up @@ -411,3 +423,20 @@ func TestKeystore_RenameKey(t *testing.T) {
require.EqualError(t, err, "key not found: key1")
})
}

func TestECDSA_Serialization_WithPadding(t *testing.T) {
// This test ensures that ECDSA private keys that serialize to less than 32 bytes
// are correctly padded with leading zeros during serialization and deserialization.
// This is important for compatibility with Ethereum's crypto library which expects
// 32-byte private keys.

// The example key has been found randomly such that it has 2 leading zero bytes when serialized.
key, ok := big.NewInt(0).SetString("57269542458293433845411819226400606954116463824740942170224417652371448", 10)
require.True(t, ok)
privateKeyBytes := make([]byte, 32)
key.FillBytes(privateKeyBytes)
require.Equal(t, []byte{0, 0, 8, 76, 62, 209, 247, 104, 97, 108, 141, 217, 255, 150, 114, 196, 223, 66, 254, 101, 209, 14, 233, 174, 149, 89, 207, 141, 2, 188, 111, 248}, privateKeyBytes)
deserializedKey, err := gethcrypto.ToECDSA(privateKeyBytes)
require.NoError(t, err)
require.Equal(t, key, deserializedKey.D)
}
Loading
Loading