Skip to content

Commit 6ea4163

Browse files
committed
add sample code and test SSH keys
1 parent 4d71e9f commit 6ea4163

File tree

12 files changed

+111
-18
lines changed

12 files changed

+111
-18
lines changed

.github/codecov.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
codecov:
2-
parsers:
3-
lcov:
4-
partials_as_hits: true
1+
parsers:
2+
lcov:
3+
partials_as_hits: true
4+
javascript:
5+
enable_partials: true

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,4 @@ mise.toml
66
/*.tgz
77
/.nyc_output
88
/coverage
9-
id_*
109
*.local.*

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ A seed is used to generate the secret, it's recommended you don't use the same s
3232
## ⚠️ Limitations
3333

3434
- Can't use ECDSA keys, they always give different signatures
35-
- [RFC8332](https://www.rfc-editor.org/info/rfc8332) compatible agent (e.g. OpenSSH 7.6+) mandatory to use SHA2-512 signature scheme. You can still use deprecated SHA1 signatures with `rsaSignatureFlag:0` option in `SSHAgentClient` constructor.
35+
- [RFC8332](https://www.rfc-editor.org/info/rfc8332) compatible agent (e.g. OpenSSH 7.6+) is mandatory to use SHA2-512 signature scheme. You can still use deprecated SHA1 signatures with `rsaSignatureFlag:0` option in `SSHAgentClient` constructor.
3636

3737
## 💻 CLI usage
3838

@@ -67,7 +67,7 @@ Options:
6767
npm i ssh-agent-secrets
6868
```
6969

70-
### Sample
70+
### [Sample](/example/test.js)
7171

7272
```javascript
7373
import { SSHAgentClient } from 'ssh-agent-secrets'
@@ -77,7 +77,7 @@ const agent = new SSHAgentClient()
7777
const identities = await agent.getIdentities()
7878
console.log(identities)
7979

80-
const identity = await agent.getIdentity('AWS')
80+
const identity = await agent.getIdentity('ED25519')
8181

8282
const encrypted = await agent.encrypt(
8383
identity,
@@ -96,9 +96,10 @@ const decrypted = await agent.decrypt(
9696
console.log('Decrypted data:', decrypted.toString('utf8'))
9797
```
9898

99-
## Local test
99+
### Local test
100100

101101
```bash
102102
ssh-agent -D
103-
SSH_AUTH_SOCK= ssh-add id_ecdsa id_ed25519 id_rsa
103+
SSH_AUTH_SOCK="[...]" ssh-add test/ssh_keys/*
104+
SSH_AUTH_SOCK="[...]" npm run test
104105
```

codecov.yml

Lines changed: 0 additions & 5 deletions
This file was deleted.

example/test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { SSHAgentClient } from '../dist/src/lib/index.js'
2+
3+
const agent = new SSHAgentClient()
4+
5+
const identities = await agent.getIdentities()
6+
console.log(`${identities.length} identities found in the SSH agent`)
7+
8+
// replace "AWS" with the actual comment of your SSH key
9+
const identity = await agent.getIdentity('ED25519')
10+
11+
const encrypted = await agent.encrypt(
12+
identity,
13+
'not_a_secret_but_a_seed',
14+
Buffer.from('Lorem ipsum dolor', 'utf8'),
15+
'hex',
16+
)
17+
console.log('Encrypted data:', encrypted)
18+
19+
const decrypted = await agent.decrypt(identity, 'not_a_secret_but_a_seed', encrypted, 'hex')
20+
console.log('Decrypted data:', decrypted.toString('utf8'))

src/lib/parse_utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import * as crypto from 'crypto'
22
import { type SSHKey, type SSHSignature } from './ssh_agent_client.ts'
33

44
/** Read a length-prefixed string (uint32 BE length + bytes) from a buffer. */
5-
const readString = function readString(buffer: Buffer, offset: number): Buffer {
5+
const readString = (buffer: Buffer, offset: number): Buffer => {
66
const len = buffer.readUInt32BE(offset)
77
return buffer.subarray(offset + 4, offset + 4 + len)
88
}
99

1010
/** Write a length-prefixed string into `target` at `offset`, return next offset. */
11-
const writeString = function writeString(target: Buffer, src: Buffer, offset: number): number {
11+
const writeString = (target: Buffer, src: Buffer, offset: number): number => {
1212
target.writeUInt32BE(src.length, offset)
1313
src.copy(target, offset + 4)
1414
return offset + 4 + src.length
@@ -19,7 +19,7 @@ const writeString = function writeString(target: Buffer, src: Buffer, offset: nu
1919
* into `request` and return the next write offset (5).
2020
* The length field is the total buffer length minus the 4-byte length field itself.
2121
*/
22-
const writeHeader = function writeHeader(request: Buffer, tag: number): number {
22+
const writeHeader = (request: Buffer, tag: number): number => {
2323
request.writeUInt32BE(request.length - 4, 0)
2424
request.writeUInt8(tag, 4)
2525
return 5

src/lib/ssh_agent_client.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export class SSHAgentClient {
7272
this.cipherAlgo = options.cipherAlgo ?? 'aes-256-cbc'
7373
this.digestAlgo = options.digestAlgo ?? 'sha256'
7474

75+
/** Default to SHA2-512 signature when using RSA keys */
7576
this.rsaSignatureFlag = options.rsaSignatureFlag ?? RsaSignatureFlag.SSH_AGENT_RSA_SHA2_512
7677

7778
const sockFile = options.sockFile ?? process.env.SSH_AUTH_SOCK

test/ssh_keys/id_ecdsa_256

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN OPENSSH PRIVATE KEY-----
2+
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNlY2RzYS
3+
1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQREWz6lU6g0r40iDfQfSN5SyHN4V2e5
4+
LQ9PMbb7q7DjjlpntLj1YyiJ2kI1qk8S3HfaavQrlZ393ZQcgwCh6WWnAAAAqGEJ5shhCe
5+
bIAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBERbPqVTqDSvjSIN
6+
9B9I3lLIc3hXZ7ktD08xtvursOOOWme0uPVjKInaQjWqTxLcd9pq9CuVnf3dlByDAKHpZa
7+
cAAAAgX/s0aZuGMVwDFqed0dZP6sLPG1OGwmLfzr18cNHO8F4AAAANa2V5X2VjZHNhXzI1
8+
NgECAw==
9+
-----END OPENSSH PRIVATE KEY-----

test/ssh_keys/id_ecdsa_384

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN OPENSSH PRIVATE KEY-----
2+
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAiAAAABNlY2RzYS
3+
1zaGEyLW5pc3RwMzg0AAAACG5pc3RwMzg0AAAAYQTyrUrtyMWCsVSZSxaMsHqxsApl2I6h
4+
umUukiarodoeR44S+da4Jn+uQ7vXHU3LErYokIBwa+pI0WESGKDmKv46DJQ2z1/duoYNCT
5+
vfz+veP/72yh5G3KrQjCYZLqAByfkAAADY/EEPT/xBD08AAAATZWNkc2Etc2hhMi1uaXN0
6+
cDM4NAAAAAhuaXN0cDM4NAAAAGEE8q1K7cjFgrFUmUsWjLB6sbAKZdiOobplLpImq6HaHk
7+
eOEvnWuCZ/rkO71x1NyxK2KJCAcGvqSNFhEhig5ir+OgyUNs9f3bqGDQk738/r3j/+9soe
8+
Rtyq0IwmGS6gAcn5AAAAMQC8tlMq4ZYm+TYf7be2DT2fUTtHgNkS3xPcpj9A2EFkVUX3Pq
9+
yaaFe4gyJYSbHGCLcAAAANa2V5X2VjZHNhXzM4NAEC
10+
-----END OPENSSH PRIVATE KEY-----

test/ssh_keys/id_ecdsa_521

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN OPENSSH PRIVATE KEY-----
2+
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAArAAAABNlY2RzYS
3+
1zaGEyLW5pc3RwNTIxAAAACG5pc3RwNTIxAAAAhQQAgsJlchCqyHPx2cYZOnNEOvoUx4K6
4+
RXFJQ7y/K/UH5YgD034nFFKsjBsycEiaM3Apf4ugcg4FVPqH4c6gF1h4LpoBafJFGSdi2+
5+
mjjM1EqtltG/30WQrI9/Vl+L+00CzQES6HWFp+phnSi6nsfhQQAp2gZ43/G/Pdd3xSSoKr
6+
lAVYfEgAAAEQn6hql5+oapcAAAATZWNkc2Etc2hhMi1uaXN0cDUyMQAAAAhuaXN0cDUyMQ
7+
AAAIUEAILCZXIQqshz8dnGGTpzRDr6FMeCukVxSUO8vyv1B+WIA9N+JxRSrIwbMnBImjNw
8+
KX+LoHIOBVT6h+HOoBdYeC6aAWnyRRknYtvpo4zNRKrZbRv99FkKyPf1Zfi/tNAs0BEuh1
9+
hafqYZ0oup7H4UEAKdoGeN/xvz3Xd8UkqCq5QFWHxIAAAAQXCDeTwGofULiUsEMK29UJ0L
10+
1xxTDBAkCK1zjPQWHDov8cf/DxB8nspWZVXNYLc+tnwDrzx0TFdF2sMR1uW7KJtvAAAADW
11+
tleV9lY2RzYV81MjEBAgMEBQY=
12+
-----END OPENSSH PRIVATE KEY-----

0 commit comments

Comments
 (0)