
Security News
Composer 2.11 Adds Dependency Cooldowns
Composer 2.11 adds dependency cooldowns, joining package managers that delay new releases to reduce supply chain risks while allowing urgent security updates.
@hpke/core
Advanced tools
A Hybrid Public Key Encryption (HPKE) core module for various JavaScript runtimes
Documentation: jsr.io | pages (only for the latest ver.)
Where possible, it is recommended to use @hpke/core along with extension
modules (such as @hpke/chacha20poly1305) instead of hpke-js.
You can install the package with npm, yarn or pnpm.
# Using npm:
npm install @hpke/core
yarn add @hpke/core
pnpm install @hpke/core
# Using jsr:
npx jsr add @hpke/core
yarn add jsr:@hpke/core
pnpm add jsr:@hpke/core
The above manner can be used with other JavaScript runtimes that support npm, such as Cloudflare Workers and Bun.
Then, you can use the module from code like this:
import {
Aes128Gcm,
CipherSuite,
DhkemP256HkdfSha256,
HkdfSha256,
} from "@hpke/core";
For Deno, it is recommended to use the jsr.io registry.
deno add jsr:@hpke/core
Followings are how to use this module with typical CDNs. Other CDNs can be used as well.
Using esm.sh:
<!-- use a specific version -->
<script type="module">
import {
Aes128Gcm,
CipherSuite,
DhkemP256HkdfSha256,
HkdfSha256,
} from "https://esm.sh/@hpke/core@<SEMVER>";
// ...
</script>
<!-- use the latest stable version -->
<script type="module">
import {
Aes128Gcm,
CipherSuite,
DhkemP256HkdfSha256,
HkdfSha256,
} from "https://esm.sh/@hpke/core";
// ...
</script>
Using unpkg:
<!-- use a specific version -->
<script type="module">
import * as hpke from "https://unpkg.com/@hpke/core@<SEMVER>/esm/mod.js";
// ...
</script>
This section shows some typical usage examples.
import {
Aes128Gcm,
CipherSuite,
DhkemP256HkdfSha256,
HkdfSha256,
} from "@hpke/core";
async function doHpke() {
// setup
const suite = new CipherSuite({
kem: new DhkemP256HkdfSha256(),
kdf: new HkdfSha256(),
aead: new Aes128Gcm(),
});
const rkp = await suite.kem.generateKeyPair();
const sender = await suite.createSenderContext({
recipientPublicKey: rkp.publicKey,
});
const recipient = await suite.createRecipientContext({
recipientKey: rkp.privateKey,
enc: sender.enc,
});
// encrypt
const ct = await sender.seal(new TextEncoder().encode("Hello world!"));
// decrypt
const pt = await recipient.open(ct);
// Hello world!
console.log(new TextDecoder().decode(pt));
}
try {
doHpke();
} catch (err) {
console.log("failed:", err.message);
}
import {
Aes128Gcm,
CipherSuite,
DhkemP256HkdfSha256,
HkdfSha256,
} from "@hpke/core";
async function doHpke() {
// setup
const suite = new CipherSuite({
kem: new DhkemP256HkdfSha256(),
kdf: new HkdfSha256(),
aead: new Aes128Gcm(),
});
const rkp = await suite.kem.generateKeyPair();
const sender = await suite.createSenderContext({
recipientPublicKey: rkp.publicKey,
});
const recipient = await suite.createRecipientContext({
recipientKey: rkp.privateKey,
enc: sender.enc,
});
// encrypt
const ct = await sender.seal(new TextEncoder().encode("Hello world!"));
// decrypt
const pt = await recipient.open(ct);
// Hello world!
console.log(new TextDecoder().decode(pt));
}
try {
doHpke();
} catch (_err: unknown) {
console.log("doHPKE() failed.");
}
<html>
<head></head>
<body>
<script type="module">
import {
Aes128Gcm,
CipherSuite,
DhkemP256HkdfSha256,
HkdfSha256,
} from "https://esm.sh/@hpke/core";
globalThis.doHpke = async () => {
const suite = new CipherSuite({
kem: new DhkemP256HkdfSha256(),
kdf: new HkdfSha256(),
aead: new Aes128Gcm(),
});
const rkp = await suite.kem.generateKeyPair();
const sender = await suite.createSenderContext({
recipientPublicKey: rkp.publicKey,
});
const recipient = await suite.createRecipientContext({
recipientKey: rkp.privateKey, // rkp (CryptoKeyPair) is also acceptable.
enc: sender.enc,
});
// encrypt
const ct = await sender.seal(
new TextEncoder().encode("hello world!"),
);
// decrypt
try {
const pt = await recipient.open(ct);
// hello world!
alert(new TextDecoder().decode(pt));
} catch (err) {
alert("failed to decrypt.");
}
};
</script>
<button type="button" onclick="doHpke()">do HPKE</button>
</body>
</html>
We welcome all kind of contributions, filing issues, suggesting new features or sending PRs.
An algorithm package in the same ecosystem that supplies an X25519-based HPKE KEM. It complements the core interfaces rather than providing the same broad protocol framework on its own.
Provides audited, standalone JavaScript cryptographic primitives, including authenticated encryption options. It can cover some low-level encryption needs, but it is not a complete HPKE implementation with HPKE setup, encapsulation, and context management.
JavaScript wrappers for libsodium’s cryptographic functions, including public-key and authenticated-encryption tools. It offers a broader general-purpose cryptography API, but its primitives and interfaces are not a drop-in implementation of the HPKE protocol.
FAQs
A Hybrid Public Key Encryption (HPKE) core module for various JavaScript runtimes
The npm package @hpke/core receives a total of 0 weekly downloads. As such, @hpke/core popularity was classified as not popular.
We found that @hpke/core demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Composer 2.11 adds dependency cooldowns, joining package managers that delay new releases to reduce supply chain risks while allowing urgent security updates.

Threat Research
/Security News
Cursor removed a malicious Claude Code 2.1.313 extension from its marketplace. Socket examines registry records and the initial claims about its distribution.

Security News
An OpenCode user faced harassment after reporting a free AI usage loophole, drawing a bitter backlash in a GitHub thread that has since been deleted.