@push.rocks/smartlinuxrepo 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,4 @@
1
+ import { decodeLatin1, decodeStrictUtf8 } from '../readers/text.js';
1
2
  import { LinuxRepoError } from '../shared/errors.js';
2
3
  import { assertAsyncIterable, assertBytes, assertString, assertTimestamp } from '../shared/validation.js';
3
4
  import { singleChunk } from './signers.js';
@@ -5,6 +6,10 @@ import { singleChunk } from './signers.js';
5
6
  * The OpenPGP framing the codec owns: only the bytes of the signature packet
6
7
  * may vary; framing and armor are deterministic.
7
8
  * Armor has no headers, 64-column base64 and a CRC-24 line.
9
+ *
10
+ * The readers below are the strict inverses the verifier uses; openpgp.js's
11
+ * own dearmoring is never used (it skips text around the block, ignores the
12
+ * CRC-24 and strips trailing whitespace inside cleartext).
8
13
  */
9
14
  const BASE64_LINE = 64;
10
15
  /**
@@ -32,7 +37,7 @@ export async function createDetachedArmoredSignature(inputArg) {
32
37
  * Cleartext-signs `text` (`InRelease`). The text must be canonical: no CR and
33
38
  * no trailing spaces or tabs on any line. The signed text is `text` without
34
39
  * its final line break; the output always ends the text with one line break
35
- * before the signature block, as GnuPG and Go do. Lines starting with `-` are
40
+ * before the signature block, as GnuPG does. Lines starting with `-` are
36
41
  * dash-escaped. The header is always `Hash: SHA256`.
37
42
  */
38
43
  export async function createCleartextSignedMessage(inputArg) {
@@ -75,6 +80,272 @@ function assertSignatureBytes(packetArg) {
75
80
  throw new LinuxRepoError('signing-failed', 'the signer returned no signature bytes', { field: 'signer' });
76
81
  }
77
82
  }
83
+ /** A well-formed armor header line (`Key: Value`), as openpgp.js 6.3.2 checks it (`verifyHeaders$1`). */
84
+ const ARMOR_HEADER_PATTERN = /^([^\s:]|[^\s:][^:]*[^\s:]): .+$/;
85
+ const BASE64_LINE_PATTERN = /^[A-Za-z0-9+/]+={0,2}$/;
86
+ const BASE64_PATTERN = /^[A-Za-z0-9+/]*={0,2}$/;
87
+ const CRC_LINE_PATTERN = /^=[A-Za-z0-9+/]{4}$/;
88
+ const CLEARTEXT_BEGIN = '-----BEGIN PGP SIGNED MESSAGE-----';
89
+ const SIGNATURE_BEGIN = '-----BEGIN PGP SIGNATURE-----';
90
+ /** RFC 9580 table 23 hash text names (the `Hash:` header) and their algorithm IDs. */
91
+ const HASH_TEXT_NAMES = new Map([
92
+ ['MD5', 1],
93
+ ['SHA1', 2],
94
+ ['RIPEMD160', 3],
95
+ ['SHA256', 8],
96
+ ['SHA384', 9],
97
+ ['SHA512', 10],
98
+ ['SHA224', 11],
99
+ ['SHA3-256', 12],
100
+ ['SHA3-512', 14],
101
+ ]);
102
+ function framingError(failureArg, messageArg) {
103
+ return new LinuxRepoError(failureArg.code, messageArg, { field: failureArg.field });
104
+ }
105
+ /** Bytes that must be ASCII armor, as text; any byte above 0x7F is refused. */
106
+ export function decodeArmorBytes(bytesArg, failureArg) {
107
+ for (let i = 0; i < bytesArg.length; i++) {
108
+ if (bytesArg[i] > 0x7f) {
109
+ throw framingError(failureArg, 'ASCII armor must be ASCII');
110
+ }
111
+ }
112
+ return decodeLatin1(bytesArg);
113
+ }
114
+ /**
115
+ * Reads exactly one ASCII armor block labelled `labelArg` (RFC 9580 section
116
+ * 6.2) and returns its bytes; the inverse of `armorSignature`. Lines may end
117
+ * in LF or CRLF and carry trailing spaces or tabs, and blank lines may
118
+ * surround the block. Well-formed `Key: Value` headers are ignored; the
119
+ * CRC-24 line is optional and must match when present. Refused with
120
+ * `failureArg`: non-ASCII text, another label, a second block or any other
121
+ * text outside the block, a malformed header line, no blank line before the
122
+ * data, base64 that is not canonical, no data, and a CRC-24 that does not
123
+ * match.
124
+ */
125
+ export function dearmor(textArg, labelArg, failureArg) {
126
+ const lines = textArg.split('\n').map(trimLineEnd);
127
+ let first = 0;
128
+ while (first < lines.length && lines[first] === '') {
129
+ first += 1;
130
+ }
131
+ let last = lines.length - 1;
132
+ while (last >= first && lines[last] === '') {
133
+ last -= 1;
134
+ }
135
+ return readArmorBlock(lines.slice(first, last + 1), labelArg, failureArg);
136
+ }
137
+ /** The line without trailing spaces, tabs and CRs; a loop, as a `+$` regex is quadratic on a long run of them. */
138
+ function trimLineEnd(lineArg) {
139
+ let end = lineArg.length;
140
+ while (end > 0 && (lineArg[end - 1] === ' ' || lineArg[end - 1] === '\t' || lineArg[end - 1] === '\r')) {
141
+ end -= 1;
142
+ }
143
+ return lineArg.slice(0, end);
144
+ }
145
+ /** One armor block, from its BEGIN line to its END line, as exactly these lines; ASCII only. */
146
+ function readArmorBlock(linesArg, labelArg, failureArg) {
147
+ if (linesArg.some((line) => !/^[\x00-\x7f]*$/.test(line))) {
148
+ throw framingError(failureArg, 'ASCII armor must be ASCII');
149
+ }
150
+ const begin = `-----BEGIN PGP ${labelArg}-----`;
151
+ const end = `-----END PGP ${labelArg}-----`;
152
+ if (linesArg[0] !== begin) {
153
+ throw framingError(failureArg, `expected exactly one ${begin} block and nothing else`);
154
+ }
155
+ const endIndex = linesArg.indexOf(end);
156
+ if (endIndex < 0 || endIndex !== linesArg.length - 1) {
157
+ throw framingError(failureArg, `expected exactly one ${begin} block ending in ${end} and nothing else`);
158
+ }
159
+ let index = 1;
160
+ for (; index < endIndex && linesArg[index] !== ''; index++) {
161
+ if (!ARMOR_HEADER_PATTERN.test(linesArg[index])) {
162
+ throw framingError(failureArg, 'malformed armor header line');
163
+ }
164
+ }
165
+ if (index >= endIndex) {
166
+ throw framingError(failureArg, 'the armor has no blank line before its data');
167
+ }
168
+ index += 1;
169
+ const dataLines = [];
170
+ let crcLine = null;
171
+ for (; index < endIndex; index++) {
172
+ const line = linesArg[index];
173
+ if (index === endIndex - 1 && line.startsWith('=')) {
174
+ crcLine = line;
175
+ break;
176
+ }
177
+ if (!BASE64_LINE_PATTERN.test(line)) {
178
+ throw framingError(failureArg, 'the armor data is not base64');
179
+ }
180
+ dataLines.push(line);
181
+ }
182
+ const base64 = dataLines.join('');
183
+ if (base64.length === 0 || base64.length % 4 !== 0 || !BASE64_PATTERN.test(base64)) {
184
+ throw framingError(failureArg, 'the armor data is not one base64 string');
185
+ }
186
+ const decoded = Buffer.from(base64, 'base64');
187
+ if (decoded.toString('base64') !== base64) {
188
+ throw framingError(failureArg, 'the armor data is not canonical base64');
189
+ }
190
+ const bytes = new Uint8Array(decoded.buffer, decoded.byteOffset, decoded.byteLength);
191
+ if (crcLine !== null && (!CRC_LINE_PATTERN.test(crcLine) || crcLine.slice(1) !== crc24Base64(bytes))) {
192
+ throw framingError(failureArg, 'the armor CRC-24 does not match its data');
193
+ }
194
+ return bytes;
195
+ }
196
+ /**
197
+ * The packet tags of a binary OpenPGP packet sequence, read from the packet
198
+ * headers alone (RFC 9580 section 4.2); no body is parsed. openpgp.js skips
199
+ * marker, trust and padding packets and unknown non-critical packet types
200
+ * without a trace (`PacketList.read`, `dist/node/openpgp.mjs:12320-12385`),
201
+ * so the verifier counts packets here. Refused with `failureArg`: a header
202
+ * without its high bit, a partial body length (no key or signature packet
203
+ * may use one), and input that ends inside a header or a body.
204
+ */
205
+ export function readPacketTags(bytesArg, failureArg) {
206
+ const tags = [];
207
+ let offset = 0;
208
+ while (offset < bytesArg.length) {
209
+ const ctb = bytesArg[offset];
210
+ if ((ctb & 0x80) === 0) {
211
+ throw framingError(failureArg, `no OpenPGP packet header at byte ${offset}`);
212
+ }
213
+ let tag;
214
+ let headerLength;
215
+ let bodyLength;
216
+ if ((ctb & 0x40) !== 0) {
217
+ tag = ctb & 0x3f;
218
+ const first = bytesArg[offset + 1];
219
+ if (first === undefined) {
220
+ throw framingError(failureArg, 'the input ends inside a packet header');
221
+ }
222
+ if (first < 192) {
223
+ headerLength = 2;
224
+ bodyLength = first;
225
+ }
226
+ else if (first < 224) {
227
+ if (offset + 3 > bytesArg.length) {
228
+ throw framingError(failureArg, 'the input ends inside a packet header');
229
+ }
230
+ headerLength = 3;
231
+ bodyLength = (first - 192) * 256 + bytesArg[offset + 2] + 192;
232
+ }
233
+ else if (first === 255) {
234
+ if (offset + 6 > bytesArg.length) {
235
+ throw framingError(failureArg, 'the input ends inside a packet header');
236
+ }
237
+ headerLength = 6;
238
+ bodyLength = readUint32(bytesArg, offset + 2);
239
+ }
240
+ else {
241
+ throw framingError(failureArg, 'a partial body length is not allowed here');
242
+ }
243
+ }
244
+ else {
245
+ tag = (ctb >> 2) & 0x0f;
246
+ const lengthType = ctb & 0x03;
247
+ if (lengthType === 3) {
248
+ // indeterminate length: the packet runs to the end of the input
249
+ headerLength = 1;
250
+ bodyLength = bytesArg.length - offset - 1;
251
+ }
252
+ else {
253
+ const lengthBytes = 1 << lengthType;
254
+ if (offset + 1 + lengthBytes > bytesArg.length) {
255
+ throw framingError(failureArg, 'the input ends inside a packet header');
256
+ }
257
+ headerLength = 1 + lengthBytes;
258
+ bodyLength = 0;
259
+ for (let i = 0; i < lengthBytes; i++) {
260
+ bodyLength = bodyLength * 256 + bytesArg[offset + 1 + i];
261
+ }
262
+ }
263
+ }
264
+ const packetEnd = offset + headerLength + bodyLength;
265
+ if (packetEnd > bytesArg.length) {
266
+ throw framingError(failureArg, 'the input ends inside a packet');
267
+ }
268
+ tags.push(tag);
269
+ offset = packetEnd;
270
+ }
271
+ return tags;
272
+ }
273
+ function readUint32(bytesArg, offsetArg) {
274
+ return ((bytesArg[offsetArg] * 256 + bytesArg[offsetArg + 1]) * 256 + bytesArg[offsetArg + 2]) * 256 + bytesArg[offsetArg + 3];
275
+ }
276
+ /**
277
+ * Splits a cleartext-signed message (`InRelease`, RFC 9580 section 7); the
278
+ * inverse of `createCleartextSignedMessage`, and as strict as apt's own split
279
+ * (apt-pkg `SplitClearSignedFile`). The message is strict UTF-8 with LF line
280
+ * endings: the first line is `-----BEGIN PGP SIGNED MESSAGE-----`, then
281
+ * optional `Hash:` headers (comma-separated RFC 9580 text names), a blank
282
+ * line, the dash-escaped text and exactly one signature armor block, which
283
+ * may be followed by one line break and nothing else. Refused with
284
+ * `failureArg`: invalid UTF-8, a CR, a line ending in a space or tab, text
285
+ * before the message block or after the signature block, any other header, an
286
+ * unknown hash name, a text line starting with `-` but not `- `, and an empty
287
+ * text section. Armor headers inside the signature block are ignored as in
288
+ * `dearmor`.
289
+ */
290
+ export function splitCleartextSignedMessage(bytesArg, failureArg) {
291
+ const text = decodeStrictUtf8(bytesArg);
292
+ if (text === null) {
293
+ throw framingError(failureArg, 'the cleartext-signed message is not valid UTF-8');
294
+ }
295
+ if (text.includes('\r')) {
296
+ throw framingError(failureArg, 'the cleartext-signed message must use LF line endings');
297
+ }
298
+ const lines = text.split('\n');
299
+ if (lines[lines.length - 1] === '') {
300
+ lines.pop();
301
+ }
302
+ if (lines.some((line) => /[ \t]$/.test(line))) {
303
+ throw framingError(failureArg, 'a line of the cleartext-signed message ends with a space or tab');
304
+ }
305
+ if (lines[0] !== CLEARTEXT_BEGIN) {
306
+ throw framingError(failureArg, `the message does not start with ${CLEARTEXT_BEGIN}`);
307
+ }
308
+ let index = 1;
309
+ const headerHashAlgorithms = [];
310
+ for (; index < lines.length && lines[index] !== ''; index++) {
311
+ const header = /^Hash: (.+)$/.exec(lines[index]);
312
+ if (header === null) {
313
+ throw framingError(failureArg, 'only Hash: headers are allowed in a cleartext-signed message');
314
+ }
315
+ for (const name of header[1].split(',')) {
316
+ const algorithm = HASH_TEXT_NAMES.get(name.trim());
317
+ if (algorithm === undefined) {
318
+ throw framingError(failureArg, `unknown hash name in the Hash: header: ${name.trim()}`);
319
+ }
320
+ headerHashAlgorithms.push(algorithm);
321
+ }
322
+ }
323
+ index += 1;
324
+ const textLines = [];
325
+ for (; index < lines.length && lines[index] !== SIGNATURE_BEGIN; index++) {
326
+ const line = lines[index];
327
+ if (line.startsWith('-')) {
328
+ if (!line.startsWith('- ')) {
329
+ throw framingError(failureArg, 'a text line starts with "-" without the "- " escape');
330
+ }
331
+ textLines.push(line.slice(2));
332
+ }
333
+ else {
334
+ textLines.push(line);
335
+ }
336
+ }
337
+ if (index >= lines.length) {
338
+ throw framingError(failureArg, `the message has no ${SIGNATURE_BEGIN} block`);
339
+ }
340
+ if (textLines.length === 0) {
341
+ throw framingError(failureArg, 'the message has no text section');
342
+ }
343
+ return {
344
+ signedText: textLines.join('\n'),
345
+ headerHashAlgorithms,
346
+ signature: readArmorBlock(lines.slice(index), 'SIGNATURE', failureArg),
347
+ };
348
+ }
78
349
  /** RFC 4880 section 6.1 CRC-24, base64-encoded. */
79
350
  function crc24Base64(bytesArg) {
80
351
  let crc = 0xb704ce;
@@ -90,4 +361,4 @@ function crc24Base64(bytesArg) {
90
361
  crc &= 0xffffff;
91
362
  return Buffer.from([(crc >> 16) & 0xff, (crc >> 8) & 0xff, crc & 0xff]).toString('base64');
92
363
  }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnBncGZyYW1pbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9zaWduaW5nL29wZW5wZ3BmcmFtaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRyxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUVoRTs7OztHQUlHO0FBRUgsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBRXZCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDZCQUE2QixDQUFDLFFBSW5EO0lBQ0MsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkYsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELGdHQUFnRztBQUNoRyxNQUFNLENBQUMsS0FBSyxVQUFVLDhCQUE4QixDQUFDLFFBSXBEO0lBQ0MsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsT0FBTyxjQUFjLENBQ25CLE1BQU0sNkJBQTZCLENBQUM7UUFDbEMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7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
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnBncGZyYW1pbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9zaWduaW5nL29wZW5wZ3BmcmFtaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUE0QixNQUFNLHFCQUFxQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFHLE9BQU8sRUFBRSxXQUFXLEVBQXVCLE1BQU0sY0FBYyxDQUFDO0FBRWhFOzs7Ozs7OztHQVFHO0FBRUgsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBRXZCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDZCQUE2QixDQUFDLFFBSW5EO0lBQ0MsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkYsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELGdHQUFnRztBQUNoRyxNQUFNLENBQUMsS0FBSyxVQUFVLDhCQUE4QixDQUFDLFFBSXBEO0lBQ0MsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsT0FBTyxjQUFjLENBQ25CLE1BQU0sNkJBQTZCLENBQUM7UUFDbEMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FB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
@@ -0,0 +1,77 @@
1
+ /** The hash algorithms the verifier accepts. */
2
+ export type TOpenPgpHashAlgorithm = 'sha256' | 'sha384' | 'sha512';
3
+ /** A signature that verified. */
4
+ export interface IOpenPgpSignatureVerification {
5
+ /** The primary key or subkey that verified the signature, 40 uppercase hex digits. */
6
+ readonly signingKeyFingerprint: string;
7
+ /** The signature's creation time (whole seconds). */
8
+ readonly created: Date;
9
+ readonly hashAlgorithm: TOpenPgpHashAlgorithm;
10
+ }
11
+ /** A cleartext-signed message that verified. */
12
+ export interface IOpenPgpCleartextVerification extends IOpenPgpSignatureVerification {
13
+ /**
14
+ * The signed text: dash-escaping removed, lines joined by LF, without the
15
+ * line break before the signature block (RFC 9580 section 7.1). For
16
+ * GnuPG's and the codec's `InRelease` this is `Release` without its final
17
+ * line break; for Gitea 28.2.0's (go-crypto) it is the whole `Release`.
18
+ */
19
+ readonly signedText: string;
20
+ }
21
+ /**
22
+ * Verifies OpenPGP signatures against one public key. Every method fails
23
+ * closed with a `LinuxRepoError` and never returns a verdict of failure:
24
+ * `malformed-signature`, `wrong-key`, `unusable-key` or `bad-signature`
25
+ * (bad arguments are `invalid-input`).
26
+ *
27
+ * A signature is valid when it is exactly one OpenPGP v4 signature packet,
28
+ * SHA-256, SHA-384 or SHA-512, issued by the primary key or one of its
29
+ * subkeys, created at or before `date` and not expired at `date`, made by a
30
+ * key or subkey that can sign both at the signature's creation time and at
31
+ * `date` (not expired, not revoked, sign flag set, valid binding and
32
+ * back-signature, openpgp.js's algorithm floor), and when it verifies
33
+ * cryptographically. `date` is required; the codec reads no clock.
34
+ */
35
+ export interface IOpenPgpVerifier {
36
+ /** The primary key's v4 fingerprint, 40 uppercase hex digits (as `IOpenPgpKeyPair.fingerprint`). */
37
+ readonly fingerprint: string;
38
+ /**
39
+ * A binary detached signature of type 0x00 over `data`: the packet
40
+ * `IOpenPgpSigner.signBinary` returns, an Arch `.sig`.
41
+ */
42
+ verifyDetachedSignature(inputArg: {
43
+ data: Uint8Array;
44
+ signature: Uint8Array;
45
+ date: Date;
46
+ }): Promise<IOpenPgpSignatureVerification>;
47
+ /**
48
+ * An armored detached signature of type 0x00 over `data`: `Release.gpg`,
49
+ * `repomd.xml.asc`. The armor is ASCII.
50
+ */
51
+ verifyArmoredDetachedSignature(inputArg: {
52
+ data: Uint8Array;
53
+ signatureArmored: Uint8Array;
54
+ date: Date;
55
+ }): Promise<IOpenPgpSignatureVerification>;
56
+ /**
57
+ * A cleartext-signed message with a signature of type 0x01: `InRelease`.
58
+ * The message is strict UTF-8 with LF line endings; see
59
+ * `splitCleartextSignedMessage` for what its framing may hold.
60
+ */
61
+ verifyCleartextMessage(inputArg: {
62
+ message: Uint8Array;
63
+ date: Date;
64
+ }): Promise<IOpenPgpCleartextVerification>;
65
+ }
66
+ /**
67
+ * Builds a verifier from one armored OpenPGP public key: exactly one
68
+ * transferable v4 public key (the primary key with its user IDs, subkeys and
69
+ * self-signatures, all v4) in exactly one `PUBLIC KEY BLOCK`. A private key
70
+ * block, several blocks or keys, a v6 key, text around the block, an armor
71
+ * CRC-24 that does not match or any other garbage is `invalid-key`
72
+ * (`detail.field` `publicKeyArmored`). Only the structure is checked here;
73
+ * whether a key can sign depends on time and is checked at verification.
74
+ */
75
+ export declare function createOpenPgpVerifier(inputArg: {
76
+ publicKeyArmored: string;
77
+ }): Promise<IOpenPgpVerifier>;