diff --git a/x/dhkem-secp256k1/README.md b/x/dhkem-secp256k1/README.md
index 836c1c739..0f37b6459 100644
--- a/x/dhkem-secp256k1/README.md
+++ b/x/dhkem-secp256k1/README.md
@@ -1,7 +1,7 @@
@hpke/dhkem-secp256k1
-A TypeScript
Hybrid Public Key Encryption (HPKE) module extension for DH-KEM with secp256k1 curve, which is implemented by using [@noble/curves/secp256k1](https://github.com/paulmillr/noble-curves). Note that the extension is EXPERIMENTAL and NOT STANDARDIZED.
+A TypeScript Hybrid Public Key Encryption (HPKE) module extension for DH-KEM with secp256k1 curve, which is implemented by using @noble/curves/secp256k1. Note that the extension is EXPERIMENTAL and NOT STANDARDIZED.
diff --git a/x/dhkem-secp256k1/src/dhkem-secp256k1.ts b/x/dhkem-secp256k1/src/dhkem-secp256k1.ts
index b9d565566..6863aa7a2 100644
--- a/x/dhkem-secp256k1/src/dhkem-secp256k1.ts
+++ b/x/dhkem-secp256k1/src/dhkem-secp256k1.ts
@@ -131,11 +131,28 @@ class Secp256k1 extends Algorithm implements KemPrimitives {
}
}
+/**
+ * The class of the DH-KEM with secp256k1 curve.
+ *
+ * The public keys are assumed to be compressed.
+ * Note that it is experimental and not standardized.
+ *
+ * The instance of this class can be specified to the CipherSuiteParams as follows:
+ *
+ * @example
+ * import { KdfId, AeadId, CipherSuite } from "http://deno.land/x/hpke/mod.ts";
+ * import { DhkemSecp256k1HkdfSha256} from "https://deno.land/x/hpke/x/dhkem-secp256k1/mod.ts";
+ * const suite = new CipherSuite({
+ * kem: new DhkemSecp256k1HkdfSha256(),
+ * kdf: KdfId.HkdfSha256,
+ * aead: AeadId.Aes128Gcm,
+ * });
+ */
export class DhkemSecp256k1HkdfSha256 extends Dhkem implements KemInterface {
- public readonly id: KemId = KemId.DhkemSecp256K1HkdfSha256;
+ public readonly id: KemId = KemId.DhkemSecp256k1HkdfSha256;
public readonly secretSize: number = 32;
- public readonly encSize: number = 65;
- public readonly publicKeySize: number = 65;
+ public readonly encSize: number = 33;
+ public readonly publicKeySize: number = 33;
public readonly privateKeySize: number = 32;
constructor() {
diff --git a/x/dhkem-secp256k1/test/dhkem-secp256k1.test.ts b/x/dhkem-secp256k1/test/dhkem-secp256k1.test.ts
index 583e5a3cd..8f300121b 100644
--- a/x/dhkem-secp256k1/test/dhkem-secp256k1.test.ts
+++ b/x/dhkem-secp256k1/test/dhkem-secp256k1.test.ts
@@ -59,7 +59,7 @@ async function loadSubtleCrypto(): Promise {
}
}
-describe("DhkemP256k1Hkdf256", () => {
+describe("DhkemSecp256k1Hkdf256", () => {
describe("with valid parameters", () => {
it("should have a correct KEM object", async () => {
const api = await loadSubtleCrypto();
@@ -70,8 +70,8 @@ describe("DhkemP256k1Hkdf256", () => {
assertEquals(typeof dhkemSecp256k1, "object");
assertEquals(dhkemSecp256k1.id, KemId.DhkemSecp256K1HkdfSha256);
assertEquals(dhkemSecp256k1.secretSize, 32);
- assertEquals(dhkemSecp256k1.encSize, 65);
- assertEquals(dhkemSecp256k1.publicKeySize, 65);
+ assertEquals(dhkemSecp256k1.encSize, 33);
+ assertEquals(dhkemSecp256k1.publicKeySize, 33);
assertEquals(dhkemSecp256k1.privateKeySize, 32);
});
});
@@ -230,8 +230,8 @@ describe("CipherSuite", () => {
});
const kem = await suite.kemContext();
assertEquals(kem.secretSize, 32);
- assertEquals(kem.encSize, 65);
- assertEquals(kem.publicKeySize, 65);
+ assertEquals(kem.encSize, 33);
+ assertEquals(kem.publicKeySize, 33);
assertEquals(kem.privateKeySize, 32);
// assert
@@ -247,8 +247,9 @@ describe("CipherSuite", () => {
describe("A README example of Base mode (DhkemSecp256k1HkdfSha256/KdfId.HkdfSha256)", () => {
it("should work normally", async () => {
// setup
+ const kemInstance = new DhkemSecp256k1HkdfSha256();
const suite = new CipherSuite({
- kem: new DhkemSecp256k1HkdfSha256(),
+ kem: kemInstance,
kdf: KdfId.HkdfSha256,
aead: AeadId.Aes128Gcm,
});
@@ -263,6 +264,8 @@ describe("CipherSuite", () => {
recipientKey: rkp,
enc: sender.enc,
});
+ assertEquals(sender.enc.byteLength, kemInstance.encSize);
+ assertEquals(sender.enc.byteLength, kemInstance.publicKeySize);
// encrypt
const ct = await sender.seal(