131 lines · 5.3 KB
import {
  TAG_PUBLIC_KEY,
  TAG_PUBLIC_SUBKEY,
  TAG_SIGNATURE,
  anyVerifies,
  concat,
  dearmor,
  keyExpiry,
  keyFlags,
  keyPrefix,
  latest,
  parseKeyPacket,
  parseSignaturePacket,
  readPackets,
  userIdPrefix,
  verifySignature,
} from "./openpgp";
import type { ParsedSignature, PgpKey } from "./openpgp";

const TAG_USER_ID = 13;
const TAG_USER_ATTRIBUTE = 17;
const SUBPACKET_EMBEDDED_SIGNATURE = 32;
const FLAG_SIGN = 0x02;
const SIG_CERTIFICATION_FIRST = 0x10;
const SIG_CERTIFICATION_LAST = 0x13;
const SIG_SUBKEY_BINDING = 0x18;
const SIG_PRIMARY_BINDING = 0x19;
const SIG_KEY_REVOCATION = 0x20;
const SIG_SUBKEY_REVOCATION = 0x28;

export type PgpKeyring = { primary: PgpKey; signingKeys: PgpKey[] };

type SubkeyEntry = {
  body: Uint8Array;
  key: PgpKey | null;
  signatures: ParsedSignature[];
};

async function validSigningSubkey(primary: PgpKey, primaryPrefix: Uint8Array, entry: SubkeyEntry) {
  const key = entry.key;