From 1a47b37a70052013b141992607b63d6306777686 Mon Sep 17 00:00:00 2001 From: Julian Lechner Date: Thu, 15 Oct 2026 16:24:31 +0200 Subject: [PATCH] chore: remove OpenPGP key download Co-Authored-By: Claude Opus 5.5 --- angular.json | 4 - package.json | 3 +- scripts/generate-openpgp-assets.cjs | 180 --------------------- src/app/generated/openpgp-key.generated.ts | 5 - src/assets/unoptimized/public.asc | 91 ----------- 5 files changed, 1 insertion(+), 282 deletions(-) delete mode 100644 scripts/generate-openpgp-assets.cjs delete mode 100644 src/app/generated/openpgp-key.generated.ts delete mode 100644 src/assets/unoptimized/public.asc diff --git a/angular.json b/angular.json index f5b73ba..91ab1ad 100644 --- a/angular.json +++ b/angular.json @@ -45,10 +45,6 @@ "glob": "**/*", "input": "src/assets/optimized", "output": "assets/optimized" - }, - { - "glob": "**/*", - "input": "public" } ], "styles": ["src/styles.scss"], diff --git a/package.json b/package.json index bd892d0..22fcb29 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,7 @@ "------ BUILD": "", "generate:static-files": "node scripts/generate-static-files.cjs", "generate:optimized-assets": "node scripts/generate-optimized-assets.cjs", - "generate:openpgp-assets": "node scripts/generate-openpgp-assets.cjs", - "generate:assets": "npm run generate:static-files && npm run generate:optimized-assets && npm run generate:openpgp-assets", + "generate:assets": "npm run generate:static-files && npm run generate:optimized-assets", "build": "npm run generate:assets && ng build --configuration production && node scripts/copy-static-root-files.cjs", "------ STARTUP": "", "test": "npm run generate:assets && ng test", diff --git a/scripts/generate-openpgp-assets.cjs b/scripts/generate-openpgp-assets.cjs deleted file mode 100644 index 1a67e61..0000000 --- a/scripts/generate-openpgp-assets.cjs +++ /dev/null @@ -1,180 +0,0 @@ -const crypto = require('node:crypto'); -const fs = require('node:fs'); -const path = require('node:path'); - -const workspaceRoot = process.cwd(); -const sourceKeyPath = path.join(workspaceRoot, 'src', 'assets', 'unoptimized', 'public.asc'); -const publicKeyOutputPath = path.join(workspaceRoot, 'public', 'keys', 'public.asc'); -const generatedModulePath = path.join( - workspaceRoot, - 'src', - 'app', - 'generated', - 'openpgp-key.generated.ts', -); - -function ensureDirectory(directoryPath) { - fs.mkdirSync(directoryPath, { recursive: true }); -} - -function readAsciiArmoredKey(filePath) { - if (!fs.existsSync(filePath)) { - throw new Error(`Missing OpenPGP public key file at ${filePath}`); - } - - return fs.readFileSync(filePath, 'utf8'); -} - -function decodeArmoredKey(armoredKey) { - const base64Lines = armoredKey - .split(/\r?\n/u) - .map((line) => line.trim()) - .filter( - (line) => - line.length > 0 && - !line.startsWith('-----BEGIN ') && - !line.startsWith('-----END ') && - !line.includes(':') && - !line.startsWith('='), - ); - - if (base64Lines.length === 0) { - throw new Error('OpenPGP public key armor did not contain any base64 payload.'); - } - - return Buffer.from(base64Lines.join(''), 'base64'); -} - -function parsePacketLength(buffer, offset, newFormat, lengthType) { - if (newFormat) { - const firstLengthOctet = buffer[offset]; - if (firstLengthOctet < 192) { - return { headerLength: 1, packetLength: firstLengthOctet }; - } - - if (firstLengthOctet < 224) { - const secondLengthOctet = buffer[offset + 1]; - const packetLength = ((firstLengthOctet - 192) << 8) + secondLengthOctet + 192; - return { headerLength: 2, packetLength }; - } - - if (firstLengthOctet === 255) { - return { - headerLength: 5, - packetLength: buffer.readUInt32BE(offset + 1), - }; - } - - throw new Error('OpenPGP partial body lengths are not supported by this generator.'); - } - - if (lengthType === 0) { - return { headerLength: 1, packetLength: buffer[offset] }; - } - - if (lengthType === 1) { - return { headerLength: 2, packetLength: buffer.readUInt16BE(offset) }; - } - - if (lengthType === 2) { - return { headerLength: 4, packetLength: buffer.readUInt32BE(offset) }; - } - - return { headerLength: 0, packetLength: buffer.length - offset }; -} - -function readPackets(buffer) { - const packets = []; - let offset = 0; - - while (offset < buffer.length) { - const headerOctet = buffer[offset]; - if ((headerOctet & 0x80) === 0) { - throw new Error(`Invalid OpenPGP packet header at byte offset ${offset}.`); - } - - offset += 1; - - const newFormat = (headerOctet & 0x40) !== 0; - const tag = newFormat ? headerOctet & 0x3f : (headerOctet >> 2) & 0x0f; - const lengthType = headerOctet & 0x03; - const { headerLength, packetLength } = parsePacketLength(buffer, offset, newFormat, lengthType); - - offset += headerLength; - const body = buffer.subarray(offset, offset + packetLength); - packets.push({ tag, body }); - offset += packetLength; - } - - return packets; -} - -function calculateFingerprintFromPacket(publicKeyPacketBody) { - const version = publicKeyPacketBody[0]; - - if (version === 4) { - const lengthBytes = Buffer.alloc(2); - lengthBytes.writeUInt16BE(publicKeyPacketBody.length, 0); - return crypto - .createHash('sha1') - .update(Buffer.concat([Buffer.from([0x99]), lengthBytes, publicKeyPacketBody])) - .digest('hex') - .toUpperCase(); - } - - if (version === 5 || version === 6) { - const lengthBytes = Buffer.alloc(4); - lengthBytes.writeUInt32BE(publicKeyPacketBody.length, 0); - return crypto - .createHash('sha256') - .update(Buffer.concat([Buffer.from([0x9a]), lengthBytes, publicKeyPacketBody])) - .digest('hex') - .toUpperCase(); - } - - throw new Error(`Unsupported OpenPGP public key version ${version}.`); -} - -function formatFingerprint(fingerprint) { - return fingerprint.match(/.{1,4}/gu)?.join(' ') ?? fingerprint; -} - -function buildGeneratedModule(assetPath, fingerprint) { - return [ - 'export const openPgpKey = {', - ` assetPath: '${assetPath}',`, - ` fingerprint: '${fingerprint}',`, - ` formattedFingerprint: '${formatFingerprint(fingerprint)}',`, - '} as const;', - '', - ].join('\n'); -} - -function run() { - const armoredKey = readAsciiArmoredKey(sourceKeyPath); - const binaryKey = decodeArmoredKey(armoredKey); - const packets = readPackets(binaryKey); - const publicKeyPacket = packets.find((packet) => packet.tag === 6); - - if (!publicKeyPacket) { - throw new Error('Could not find a public-key packet in the provided OpenPGP key.'); - } - - const fingerprint = calculateFingerprintFromPacket(publicKeyPacket.body); - - ensureDirectory(path.dirname(publicKeyOutputPath)); - ensureDirectory(path.dirname(generatedModulePath)); - - fs.copyFileSync(sourceKeyPath, publicKeyOutputPath); - fs.writeFileSync( - generatedModulePath, - buildGeneratedModule('/keys/public.asc', fingerprint), - 'utf8', - ); - - console.log(`Copied ${path.relative(workspaceRoot, publicKeyOutputPath)}`); - console.log(`Generated ${path.relative(workspaceRoot, generatedModulePath)}`); - console.log(`OpenPGP fingerprint: ${formatFingerprint(fingerprint)}`); -} - -run(); diff --git a/src/app/generated/openpgp-key.generated.ts b/src/app/generated/openpgp-key.generated.ts deleted file mode 100644 index 98ab7d2..0000000 --- a/src/app/generated/openpgp-key.generated.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const openPgpKey = { - assetPath: '/keys/public.asc', - fingerprint: '98FA30F85F2030A70F45AAEB3CDEA2DE5424B8E7', - formattedFingerprint: '98FA 30F8 5F20 30A7 0F45 AAEB 3CDE A2DE 5424 B8E7', -} as const; diff --git a/src/assets/unoptimized/public.asc b/src/assets/unoptimized/public.asc deleted file mode 100644 index a9fb050..0000000 --- a/src/assets/unoptimized/public.asc +++ /dev/null @@ -1,91 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQINBGoC8R8BEACq5XrqV728z2hYvEZCep8T3729VoFia70l7qoz1o6aDCovlIRG -PGMpcRHin0rqI2pAVHha8bMJnm34JdlPY4Dk/KI31hwLNEoTw8xzfl+58ehEnSvG -o1v3OkXC7bx4zxarFllo4/zgbiKRi1SihXZe/Ytonkm/OX0oHmwEsWlL4Gu2rX+p -Wwg/ks+l6hJ9NiB3D+F9rGfryrFgFTzV90C+1P2bOn/4NXUrr50T92Dn9zXSA1oe -k4ebnZ9df9uRlRaftNtcL/8nY7KGYr1tDBsgL2HWxknzhNoZQiFc0QJ5EjN4dz+s -kkn2aKSlzlOzBGgDeCfk6xMAyLKEewoCtagD0Fo64Mg6W5nPa8lg9xG4soGXBC2d -gUCyQPAcIw7sW71rawuFon12K+Sn02kZ0gHZVtCULh1Z66zTnw6D+fT2khbcAE85 -81tuBDVrfv5WjZtSH6t7FqHOmyvLDEPDpudJKOxxuVJfjpfhhXhK17K/8148zlJH -Vmgar3Ilx/Ef0RerDD3boCXEWT0SRyFETY58iK1Vhu5hCojcn10cs/QK8X6RdQ6D -Y2WtbQ7mebqFJWyetuV1ZAFDsNnXtonODBSvhHBtqzI4IL8hFZwiM6cgM3WqfGfk -svTC5O1lePp0L/jrP0fiYjw8wv/f4wEKeM+0xOTkvXbFxlibLxZ9AS8NfQARAQAB -tCNKdWxpYW4gTGVjaG5lciA8anVsaWFuQGxlY2huZXIudG9wPokCUQQTAQgAOxYh -BJj6MPhfIDCnD0Wq6zzeot5UJLjnBQJqAvEfAhsDBQsJCAcCAiICBhUKCQgLAgQW -AgMBAh4HAheAAAoJEDzeot5UJLjnBBYP/ilO+Fmxh3P9IUWC9MHi22RQUDTVUXFY -5FZdRwcwISnZQiEO3OWcwUAPREL2LksWT18Hi+PQRsa/dHU7cePEKRVdfuBl0CU8 -P0aUdJA2/zFIAy7CdKZ8gnNcAkkb3xhuKcX1UPgzWP4N2E7qOEt/Vst4JFL8cU3T -/MHQEq7iERtpLSXR/IcI+gcFKDxABYyb073W8rzt0CKAaLFjg2DXPHhFPKn5H6p4 -DvXHrKfa5F5YlO+hPKcSA2L73FOmMbB8sT6TVTgPmKce8c/nWfQq3oNF775k1vJk -NBNB6Hy4cVjOOXBMxfAySWnBYaYHNzApXIyH6CUYesSWSY2wfkmlPNSstODah8Gd -YT/DK+ATmjj6JMpM7ELKZvT5iZOaau7NS7bXn9DDiwttFgM9+lxbA6hq75NTMwLF -PyLrl2Yne7y+jr9s4/v/1NxOjDwkpVyJFva4UPwR8RL93F+iomYzG3RTrjTV5j21 -+zxM1hdTtbmsdh8HQi9G4XF9QpG62W0uYmTgidfQvPvUDrF041yG2bc+tSh21Xcg -EEnZuRxdKK4EtceJ20dUaG3PCy/oqg8fkGiBoHQJ3NtZDBGbYZIVXMz4mJzPOtPh -3M/7GoodKkCSJ+KedngvgAFSY6QVJCeeW0H3bGpdTYXQIYt8JwEGuUt7yU8ucEsY -NKz7VtAoYhHztCdKdWxpYW4gTGVjaG5lciA8ZnJhdWp1bGlhbkBsZWNobmVyLnRv -cD6JAlEEEwEIADsWIQSY+jD4XyAwpw9Fqus83qLeVCS45wUCagL3pgIbAwULCQgH -AgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRA83qLeVCS45zqDD/9pHFvqCrqhF/HH -xcwh3JbXzn8sEZ1vtbrQVrXeJsGo4NNpWem3B29ZVk3P2JHTVXEiBuzkBee+cd5a -TfGTTY9c5HR1Z54j3ydFnCMUNIqqtB+WIeYNr+OU0oNHplLHZYj+MDutqP8MLZMX -X400ITTd4nz7iZmc3cgREIFGbi8QuLRhNEIn6oNkPEqumRnKweLL3TqedyAEtG+k -qsgDAMDb2LzOTWR+YLVM6g9zXmWI8fXxAC2Pda1IeTOCJd+GtldOkkbQjPLNuARi -1uLjZav92vZ/Iw75TTAQzsM9eSuRHv1JxWjUbnNORoiGEQTvyyZ7VHWiQmOLKy8q -z4OGAj2lpSgrSacqK9BD0CXi9y/DNVv1BR+akD5y77KTuF7n0d4E9dWrbr4DkLkx -8ZKyLJfQX3Ma7A0uQkCEwF7epfAuWSGDvB9wCXKUtjyCb6gRMzNOu6JKHZ9pDdO1 -Hp8jGyOrs/4+Jx7RvzOeE4HlU8yv86qmjdEy7c1iJGKi3d4CQG5fVvVjZieIOhOv -RUGTgS40CPAWoKD/SIejVvSjRgt6OMS75+/ZnqGZJX7DxWlbEsIDV455Kvitw21f -WhTy8B+Hx+cbAJuRszEO1z3GGcIb61Sy4ctJZjn84wUXgJdspZtwP29a5zHfKH6x -ap9z0lNZREN6G32L5txfvbqJ9js41rQqTGVjaG5lci1TeXN0ZW1zIDxhYnVzZUBs -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 -=kK3g ------END PGP PUBLIC KEY BLOCK-----