or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

encryption-decryption.mdindex.mdkey-management.mdpacket-api.mdsession-keys.mdsigning-verification.md

session-keys.mddocs/

0

# Session Key Operations

1

2

Generate, encrypt, and decrypt session keys for advanced encryption workflows, key escrow scenarios, and performance optimization when encrypting multiple messages for the same recipients.

3

4

## Capabilities

5

6

### Session Key Generation

7

8

Generate session keys based on recipient key preferences.

9

10

```javascript { .api }

11

/**

12

* Generate a new session key for encryption

13

* @param options - Session key generation options

14

* @returns Promise resolving to session key object

15

*/

16

function generateSessionKey(options: GenerateSessionKeyOptions): Promise<SessionKey>;

17

18

interface GenerateSessionKeyOptions {

19

/** Public keys to determine algorithm preferences */

20

encryptionKeys: PublicKey | PublicKey[];

21

/** Date for key preference selection */

22

date?: Date;

23

/** User IDs for algorithm preferences */

24

encryptionUserIDs?: UserID | UserID[];

25

/** Custom configuration */

26

config?: PartialConfig;

27

}

28

29

interface SessionKey {

30

/** Session key data */

31

data: Uint8Array;

32

/** Symmetric algorithm name */

33

algorithm: string;

34

/** AEAD algorithm name (optional) */

35

aeadAlgorithm?: string;

36

}

37

```

38

39

**Usage Examples:**

40

41

```javascript

42

import { generateSessionKey } from 'openpgp';

43

44

// Generate session key based on recipient preferences

45

const sessionKey = await generateSessionKey({

46

encryptionKeys: [publicKey1, publicKey2],

47

encryptionUserIDs: [

48

{ email: 'recipient1@example.com' },

49

{ email: 'recipient2@example.com' }

50

]

51

});

52

53

console.log('Algorithm:', sessionKey.algorithm);

54

console.log('Key length:', sessionKey.data.length);

55

56

// Generate session key with default algorithm preferences

57

const defaultSessionKey = await generateSessionKey({

58

encryptionKeys: []

59

});

60

```

61

62

### Session Key Encryption

63

64

Encrypt session keys with public keys or passwords for key distribution.

65

66

```javascript { .api }

67

/**

68

* Encrypt a session key with public keys or passwords

69

* @param options - Session key encryption options

70

* @returns Promise resolving to encrypted session key message

71

*/

72

function encryptSessionKey(options: EncryptSessionKeyOptions): Promise<string | Uint8Array>;

73

74

interface EncryptSessionKeyOptions {

75

/** Session key data */

76

data: Uint8Array;

77

/** Symmetric algorithm name */

78

algorithm: string;

79

/** AEAD algorithm name (optional) */

80

aeadAlgorithm?: string;

81

/** Public keys for encryption */

82

encryptionKeys?: PublicKey | PublicKey[];

83

/** Passwords for encryption */

84

passwords?: string | string[];

85

/** Output format */

86

format?: 'armored' | 'binary' | 'object';

87

/** Use wildcard key ID */

88

wildcard?: boolean;

89

/** Key IDs for encryption */

90

encryptionKeyIDs?: KeyID | KeyID[];

91

/** Override date */

92

date?: Date;

93

/** User IDs for encryption */

94

encryptionUserIDs?: UserID | UserID[];

95

/** Custom configuration */

96

config?: PartialConfig;

97

}

98

```

99

100

**Usage Examples:**

101

102

```javascript

103

import { generateSessionKey, encryptSessionKey } from 'openpgp';

104

105

// Generate and encrypt session key

106

const sessionKey = await generateSessionKey({

107

encryptionKeys: recipientKeys

108

});

109

110

const encryptedSessionKey = await encryptSessionKey({

111

data: sessionKey.data,

112

algorithm: sessionKey.algorithm,

113

encryptionKeys: recipientKeys,

114

format: 'armored'

115

});

116

117

// Encrypt session key with password

118

const passwordEncryptedKey = await encryptSessionKey({

119

data: sessionKey.data,

120

algorithm: sessionKey.algorithm,

121

passwords: ['shared-secret'],

122

format: 'armored'

123

});

124

125

// Encrypt for multiple recipients with different methods

126

const multiMethodEncrypted = await encryptSessionKey({

127

data: sessionKey.data,

128

algorithm: sessionKey.algorithm,

129

encryptionKeys: [publicKey1, publicKey2],

130

passwords: ['backup-password'],

131

format: 'armored'

132

});

133

```

134

135

### Session Key Decryption

136

137

Decrypt session keys from encrypted messages.

138

139

```javascript { .api }

140

/**

141

* Decrypt session keys from a message

142

* @param options - Session key decryption options

143

* @returns Promise resolving to array of decrypted session keys

144

*/

145

function decryptSessionKeys(options: DecryptSessionKeysOptions): Promise<DecryptedSessionKey[]>;

146

147

interface DecryptSessionKeysOptions {

148

/** Message containing encrypted session keys */

149

message: Message;

150

/** Private keys for decryption */

151

decryptionKeys?: PrivateKey | PrivateKey[];

152

/** Passwords for decryption */

153

passwords?: string | string[];

154

/** Date for key verification */

155

date?: Date;

156

/** Custom configuration */

157

config?: PartialConfig;

158

}

159

160

interface DecryptedSessionKey {

161

/** Session key data */

162

data: Uint8Array;

163

/** Symmetric algorithm name (null for SEIPDv2) */

164

algorithm: string | null;

165

}

166

```

167

168

**Usage Examples:**

169

170

```javascript

171

import { readMessage, decryptSessionKeys } from 'openpgp';

172

173

// Decrypt session keys from message

174

const message = await readMessage({ armoredMessage: encryptedData });

175

const sessionKeys = await decryptSessionKeys({

176

message,

177

decryptionKeys: privateKey

178

});

179

180

console.log('Found', sessionKeys.length, 'session keys');

181

for (const sk of sessionKeys) {

182

console.log('Algorithm:', sk.algorithm);

183

console.log('Key length:', sk.data.length);

184

}

185

186

// Decrypt with password

187

const passwordSessionKeys = await decryptSessionKeys({

188

message,

189

passwords: ['shared-secret']

190

});

191

192

// Try multiple decryption methods

193

const multiSessionKeys = await decryptSessionKeys({

194

message,

195

decryptionKeys: [privateKey1, privateKey2],

196

passwords: ['backup-password']

197

});

198

```

199

200

## Advanced Session Key Workflows

201

202

### Bulk Encryption Optimization

203

204

Use session keys to optimize encryption for multiple messages.

205

206

```javascript

207

import {

208

generateSessionKey,

209

encryptSessionKey,

210

createMessage,

211

encrypt

212

} from 'openpgp';

213

214

// Generate session key once

215

const sessionKey = await generateSessionKey({

216

encryptionKeys: recipientKeys

217

});

218

219

// Encrypt session key for recipients (do this once)

220

const encryptedSessionKey = await encryptSessionKey({

221

...sessionKey,

222

encryptionKeys: recipientKeys

223

});

224

225

// Use session key to encrypt multiple messages efficiently

226

const messages = ['Message 1', 'Message 2', 'Message 3'];

227

const encryptedMessages = [];

228

229

for (const text of messages) {

230

const message = await createMessage({ text });

231

const encrypted = await encrypt({

232

message,

233

sessionKey,

234

format: 'armored'

235

});

236

encryptedMessages.push(encrypted);

237

}

238

239

console.log('Encrypted', messages.length, 'messages with same session key');

240

```

241

242

### Key Escrow Implementation

243

244

Implement key escrow by encrypting session keys for escrow keys.

245

246

```javascript

247

import {

248

generateSessionKey,

249

encryptSessionKey,

250

createMessage,

251

encrypt

252

} from 'openpgp';

253

254

// Generate session key

255

const sessionKey = await generateSessionKey({

256

encryptionKeys: recipientKeys

257

});

258

259

// Encrypt session key for both recipients and escrow

260

const recipientEncryptedKey = await encryptSessionKey({

261

...sessionKey,

262

encryptionKeys: recipientKeys,

263

format: 'armored'

264

});

265

266

const escrowEncryptedKey = await encryptSessionKey({

267

...sessionKey,

268

encryptionKeys: escrowPublicKey,

269

format: 'armored'

270

});

271

272

// Encrypt message with session key

273

const message = await createMessage({ text: 'Sensitive data' });

274

const encryptedMessage = await encrypt({

275

message,

276

sessionKey,

277

format: 'armored'

278

});

279

280

// Store all components

281

const escrowPackage = {

282

encryptedMessage,

283

recipientEncryptedKey,

284

escrowEncryptedKey,

285

timestamp: new Date().toISOString()

286

};

287

```

288

289

### Session Key Reuse Pattern

290

291

Safely reuse session keys for performance in high-throughput scenarios.

292

293

```javascript

294

import {

295

generateSessionKey,

296

encryptSessionKey,

297

createMessage,

298

encrypt

299

} from 'openpgp';

300

301

class SessionKeyManager {

302

constructor(recipientKeys, maxReuse = 1000) {

303

this.recipientKeys = recipientKeys;

304

this.maxReuse = maxReuse;

305

this.currentSessionKey = null;

306

this.encryptedSessionKey = null;

307

this.useCount = 0;

308

}

309

310

async rotateSessionKey() {

311

this.currentSessionKey = await generateSessionKey({

312

encryptionKeys: this.recipientKeys

313

});

314

315

this.encryptedSessionKey = await encryptSessionKey({

316

...this.currentSessionKey,

317

encryptionKeys: this.recipientKeys

318

});

319

320

this.useCount = 0;

321

}

322

323

async encryptMessage(text) {

324

// Rotate key if needed

325

if (!this.currentSessionKey || this.useCount >= this.maxReuse) {

326

await this.rotateSessionKey();

327

}

328

329

const message = await createMessage({ text });

330

const encrypted = await encrypt({

331

message,

332

sessionKey: this.currentSessionKey

333

});

334

335

this.useCount++;

336

337

return {

338

encryptedMessage: encrypted,

339

encryptedSessionKey: this.encryptedSessionKey,

340

keyRotated: this.useCount === 1

341

};

342

}

343

}

344

345

// Usage

346

const manager = new SessionKeyManager(recipientKeys, 500);

347

348

const result1 = await manager.encryptMessage('First message');

349

const result2 = await manager.encryptMessage('Second message');

350

// ... session key is reused until rotation threshold

351

```

352

353

### Cross-Platform Session Key Exchange

354

355

Exchange session keys securely across different platforms.

356

357

```javascript

358

import {

359

generateSessionKey,

360

encryptSessionKey,

361

decryptSessionKeys,

362

readMessage

363

} from 'openpgp';

364

365

// Sender side - create portable session key package

366

async function createSessionKeyPackage(recipientKeys, senderPrivateKey) {

367

const sessionKey = await generateSessionKey({

368

encryptionKeys: recipientKeys

369

});

370

371

// Create signed and encrypted session key package

372

const packageData = {

373

sessionKey: sessionKey,

374

timestamp: Date.now(),

375

sender: 'sender@example.com'

376

};

377

378

const message = await createMessage({

379

text: JSON.stringify(packageData)

380

});

381

382

const encryptedPackage = await encrypt({

383

message,

384

encryptionKeys: recipientKeys,

385

signingKeys: senderPrivateKey,

386

format: 'armored'

387

});

388

389

return {

390

sessionKey,

391

encryptedPackage

392

};

393

}

394

395

// Receiver side - extract session key from package

396

async function extractSessionKey(encryptedPackage, recipientPrivateKey, senderPublicKey) {

397

const message = await readMessage({ armoredMessage: encryptedPackage });

398

399

const decrypted = await decrypt({

400

message,

401

decryptionKeys: recipientPrivateKey,

402

verificationKeys: senderPublicKey

403

});

404

405

const packageData = JSON.parse(decrypted.data);

406

return packageData.sessionKey;

407

}

408

```