xref: /freebsd/contrib/file/magic/Magdir/pgp (revision ae316d1d1cffd71ab7751f94e10118777a88e027)
1
2#------------------------------------------------------------------------------
3# $File: pgp,v 1.26 2024/09/01 15:51:51 christos Exp $
4# pgp:  file(1) magic for Pretty Good Privacy
5
6# Handling of binary PGP keys is in pgp-binary-keys.
7# see https://lists.gnupg.org/pipermail/gnupg-devel/1999-September/016052.html
8#
90	beshort		0xa600			PGP encrypted data
10#!:mime	application/pgp-encrypted
11#0	string		-----BEGIN\040PGP	text/PGP armored data
12!:mime	text/PGP # encoding: armored data
13#>15	string	PUBLIC\040KEY\040BLOCK-	public key block
14#>15	string	MESSAGE-		message
15#>15	string	SIGNED\040MESSAGE-	signed message
16#>15	string	PGP\040SIGNATURE-	signature
17
18# Update:	Joerg Jenderek
19# URL:		http://en.wikipedia.org/wiki/Pretty_Good_Privacy
20# Reference:	https://reposcope.com/mimetype/application/pgp-keys
212	string	---BEGIN\040PGP\040PRIVATE\040KEY\040BLOCK-	PGP private key block
22#!:mime	text/PGP
23!:mime	application/pgp-keys
24!:ext	asc
252	string	---BEGIN\040PGP\040PUBLIC\040KEY\040BLOCK-	PGP public key block
26!:mime	application/pgp-keys
27!:ext	asc
28>10	search/100	\n\n
29>>&0	use		pgp
300	string	-----BEGIN\040PGP\040MESSAGE-		PGP message
31# https://reposcope.com/mimetype/application/pgp-encrypted
32#!:mime	application/pgp
33!:mime	application/pgp-encrypted
34!:ext	asc
35#!:ext	asc/pgp/gpg
36>10	search/100	\n\n
37>>&0	use		pgp
38# Reference:	https://www.gnupg.org/gph/en/manual/x135.html
390	string	-----BEGIN\040PGP\040SIGNED\040MESSAGE-	PGP signed message
40#!:mime	text/plain
41!:mime	text/PGP
42#!:mime	application/pgp
43!:ext	asc
440	string	-----BEGIN\040PGP\040SIGNATURE-		PGP signature
45# https://reposcope.com/mimetype/application/pgp-signature
46!:mime	application/pgp-signature
47!:ext	asc
48>10	search/100	\n\n
49>>&0	use		pgp
50
51# Decode the type of the packet based on it's base64 encoding.
52# Idea from Mark Martinec
53# The specification is in RFC 4880, section 4.2 and 4.3:
54# https://tools.ietf.org/html/rfc4880#section-4.2
55
560	name		pgp
57>0	byte		0x67		Reserved (old)
58>0	byte		0x68		Public-Key Encrypted Session Key (old)
59>0	byte		0x69		Signature (old)
60>0	byte		0x6a		Symmetric-Key Encrypted Session Key (old)
61>0	byte		0x6b		One-Pass Signature (old)
62>0	byte		0x6c		Secret-Key (old)
63>0	byte		0x6d		Public-Key (old)
64>0	byte		0x6e		Secret-Subkey (old)
65>0	byte		0x6f		Compressed Data (old)
66>0	byte		0x70		Symmetrically Encrypted Data (old)
67>0	byte		0x71		Marker (old)
68>0	byte		0x72		Literal Data (old)
69>0	byte		0x73		Trust (old)
70>0	byte		0x74		User ID (old)
71>0	byte		0x75		Public-Subkey (old)
72>0	byte		0x76		Unused (old)
73>0	byte		0x77
74>>1	byte&0xc0	0x00		Reserved
75>>1	byte&0xc0	0x40		Public-Key Encrypted Session Key
76>>1	byte&0xc0	0x80		Signature
77>>1	byte&0xc0	0xc0		Symmetric-Key Encrypted Session Key
78>0	byte		0x78
79>>1	byte&0xc0	0x00		One-Pass Signature
80>>1	byte&0xc0	0x40		Secret-Key
81>>1	byte&0xc0	0x80		Public-Key
82>>1	byte&0xc0	0xc0		Secret-Subkey
83>0	byte		0x79
84>>1	byte&0xc0	0x00		Compressed Data
85>>1	byte&0xc0	0x40		Symmetrically Encrypted Data
86>>1	byte&0xc0	0x80		Marker
87>>1	byte&0xc0	0xc0		Literal Data
88>0	byte		0x7a
89>>1	byte&0xc0	0x00		Trust
90>>1	byte&0xc0	0x40		User ID
91>>1	byte&0xc0	0x80		Public-Subkey
92>>1	byte&0xc0	0xc0		Unused [z%x]
93>0	byte		0x30
94>>1	byte&0xc0	0x00		Unused [0%x]
95>>1	byte&0xc0	0x40		User Attribute
96>>1	byte&0xc0	0x80		Sym. Encrypted and Integrity Protected Data
97>>1	byte&0xc0	0xc0		Modification Detection Code
98
99# magic signatures to detect PGP crypto material (from stef)
100# detects and extracts metadata from:
101#  - symmetric encrypted packet header
102#  - RSA (e=65537) secret (sub-)keys
103
104# 1024b RSA encrypted data
105
1060	string	\x84\x8c\x03		PGP RSA encrypted session key -
107>3	belong	x			keyid: %08X
108>7	belong	x			%08X
109>11	byte	0x01			RSA (Encrypt or Sign) 1024b
110>11	byte	0x02			RSA Encrypt-Only 1024b
111#>12	string	\x04\x00
112#>12	string	\x03\xff
113#>12	string	\x03\xfe
114#>12	string	\x03\xfd
115#>12	string	\x03\xfc
116#>12	string	\x03\xfb
117#>12	string	\x03\xfa
118#>12	string	\x03\xf9
119#>142	byte	0xd2			.
120
121# 2048b RSA encrypted data
122
1230	string	\x85\x01\x0c\x03	PGP RSA encrypted session key -
124>4	belong	x			keyid: %08X
125>8	belong	x			%08X
126>12	byte	0x01			RSA (Encrypt or Sign) 2048b
127>12	byte	0x02			RSA Encrypt-Only 2048b
128#>13	string	\x08\x00
129#>13	string	\x07\xff
130#>13	string	\x07\xfe
131#>13	string	\x07\xfd
132#>13	string	\x07\xfc
133#>13	string	\x07\xfb
134#>13	string	\x07\xfa
135#>13	string	\x07\xf9
136#>271	byte	0xd2			.
137
138# 3072b RSA encrypted data
139
1400	string	\x85\x01\x8c\x03	PGP RSA encrypted session key -
141>4	belong	x			keyid: %08X
142>8	belong	x			%08X
143>12	byte	0x01			RSA (Encrypt or Sign) 3072b
144>12	byte	0x02			RSA Encrypt-Only 3072b
145#>13	string	\x0c\x00
146#>13	string	\x0b\xff
147#>13	string	\x0b\xfe
148#>13	string	\x0b\xfd
149#>13	string	\x0b\xfc
150#>13	string	\x0b\xfb
151#>13	string	\x0b\xfa
152#>13	string	\x0b\xf9
153#>399	byte	0xd2			.
154
155# 4096b RSA encrypted data
156
1570	string	\x85\x02\x0c\x03	PGP RSA encrypted session key -
158>4	belong	x			keyid: %08X
159>8	belong	x			%08X
160>12	byte	0x01			RSA (Encrypt or Sign) 4096b
161>12	byte	0x02			RSA Encrypt-Only 4096b
162#>13	string	\x10\x00
163#>13	string	\x0f\xff
164#>13	string	\x0f\xfe
165#>13	string	\x0f\xfd
166#>13	string	\x0f\xfc
167#>13	string	\x0f\xfb
168#>13	string	\x0f\xfa
169#>13	string	\x0f\xf9
170#>527	byte	0xd2			.
171
172# 8192b RSA encrypted data
173
1740	string	\x85\x04\x0c\x03	PGP RSA encrypted session key -
175>4	belong	x			keyid: %08X
176>8	belong	x			%08X
177>12	byte	0x01			RSA (Encrypt or Sign) 8192b
178>12	byte	0x02			RSA Encrypt-Only 8192b
179#>13	string	\x20\x00
180#>13	string	\x1f\xff
181#>13	string	\x1f\xfe
182#>13	string	\x1f\xfd
183#>13	string	\x1f\xfc
184#>13	string	\x1f\xfb
185#>13	string	\x1f\xfa
186#>13	string	\x1f\xf9
187#>1039	byte	0xd2			.
188
189# 1024b Elgamal encrypted data
190
1910	string	\x85\x01\x0e\x03	PGP Elgamal encrypted session key -
192>4	belong	x			keyid: %08X
193>8	belong	x			%08X
194>12	byte	0x10			Elgamal Encrypt-Only 1024b.
195#>13	string	\x04\x00
196#>13	string	\x03\xff
197#>13	string	\x03\xfe
198#>13	string	\x03\xfd
199#>13	string	\x03\xfc
200#>13	string	\x03\xfb
201#>13	string	\x03\xfa
202#>13	string	\x03\xf9
203
204# 2048b Elgamal encrypted data
205
2060	string	\x85\x02\x0e\x03	PGP Elgamal encrypted session key -
207>4	belong	x			keyid: %08X
208>8	belong	x			%08X
209>12	byte	0x10			Elgamal Encrypt-Only 2048b.
210#>13	string	\x08\x00
211#>13	string	\x07\xff
212#>13	string	\x07\xfe
213#>13	string	\x07\xfd
214#>13	string	\x07\xfc
215#>13	string	\x07\xfb
216#>13	string	\x07\xfa
217#>13	string	\x07\xf9
218
219# 3072b Elgamal encrypted data
220
2210	string	\x85\x03\x0e\x03	PGP Elgamal encrypted session key -
222>4	belong	x			keyid: %08X
223>8	belong	x			%08X
224>12	byte	0x10			Elgamal Encrypt-Only 3072b.
225#>13	string	\x0c\x00
226#>13	string	\x0b\xff
227#>13	string	\x0b\xfe
228#>13	string	\x0b\xfd
229#>13	string	\x0b\xfc
230#>13	string	\x0b\xfb
231#>13	string	\x0b\xfa
232#>13	string	\x0b\xf9
233
234# crypto algo mapper
235
2360	name	crypto
237>0	byte	0x00			Plaintext or unencrypted data
238>0	byte	0x01			IDEA
239>0	byte	0x02			TripleDES
240>0	byte	0x03			CAST5 (128 bit key)
241>0	byte	0x04			Blowfish (128 bit key, 16 rounds)
242>0	byte	0x07			AES with 128-bit key
243>0	byte	0x08			AES with 192-bit key
244>0	byte	0x09			AES with 256-bit key
245>0	byte	0x0a			Twofish with 256-bit key
246
247# hash algo mapper
248
2490	name	hash
250>0	byte	0x01			MD5
251>0	byte	0x02			SHA-1
252>0	byte	0x03			RIPE-MD/160
253>0	byte	0x08			SHA256
254>0	byte	0x09			SHA384
255>0	byte	0x0a			SHA512
256>0	byte	0x0b			SHA224
257
258# display public key algorithms as human readable text
2590	name	key_algo
260>0	byte	0x01			RSA (Encrypt or Sign)
261# keep old look of version 5.28 without parentheses
262>0	byte	0x02			RSA Encrypt-Only
263>0	byte	0x03			RSA (Sign-Only)
264>0	byte	16			ElGamal (Encrypt-Only)
265>0	byte	17			DSA
266>0	byte	18			Elliptic Curve
267>0	byte	19			ECDSA
268>0	byte	20			ElGamal (Encrypt or Sign)
269>0	byte	21			Diffie-Hellman
270>0	default	x
271>>0	ubyte	<22			unknown (pub %d)
272# this should never happen
273>>0	ubyte	>21			invalid (%d)
274
275# pgp symmetric encrypted data
276
2770	byte	0x8c			PGP symmetric key encrypted data -
278>1	byte	0x0d
279>1	byte	0x0c
280>2	byte	0x04
281>3	use	crypto
282>4	byte	0x01			salted -
283>>5	use	hash
284>>14	byte	0xd2			.
285>>14	byte	0xc9			.
286>4	byte	0x03			salted & iterated -
287>>5	use	hash
288>>15	byte	0xd2			.
289>>15	byte	0xc9			.
290
291# encrypted keymaterial needs s2k & can be checksummed/hashed
292
2930	name	chkcrypto
294>0	use	crypto
295>1	byte	0x00			Simple S2K
296>1	byte	0x01			Salted S2K
297>1	byte	0x03			Salted&Iterated S2K
298>2	use	hash
299
300# all PGP keys start with this prolog
301# containing version, creation date, and purpose
302
3030	name	keyprolog
304>0	byte	0x04
305>1	beldate	x			created on %s -
306>5	byte	0x01			RSA (Encrypt or Sign)
307>5	byte	0x02			RSA Encrypt-Only
308
309# end of secret keys known signature
310# contains e=65537 and the prolog to
311# the encrypted parameters
312
3130	name	keyend
314>0	string	\x00\x11\x01\x00\x01	e=65537
315>5	use	crypto
316>5	byte	0xff			checksummed
317>>6	use	chkcrypto
318>5	byte	0xfe			hashed
319>>6	use	chkcrypto
320
321# PGP secret keys contain also the public parts
322# these vary by bitsize of the key
323
3240	name	x1024
325>0	use	keyprolog
326>6	string	\x03\xfe
327>6	string	\x03\xff
328>6	string	\x04\x00
329>136	use	keyend
330
3310	name	x2048
332>0	use	keyprolog
333>6	string	\x80\x00
334>6	string	\x07\xfe
335>6	string	\x07\xff
336>264	use	keyend
337
3380	name	x3072
339>0	use	keyprolog
340>6	string	\x0b\xfe
341>6	string	\x0b\xff
342>6	string	\x0c\x00
343>392	use	keyend
344
3450	name	x4096
346>0	use	keyprolog
347>6	string	\x10\x00
348>6	string	\x0f\xfe
349>6	string	\x0f\xff
350>520	use	keyend
351
352# \x00|\x1f[\xfe\xff]).{1024})'
3530	name	x8192
354>0	use	keyprolog
355>6	string	\x20\x00
356>6	string	\x1f\xfe
357>6	string	\x1f\xff
358>1032	use	keyend
359
360# depending on the size of the pkt
361# we branch into the proper key size
362# signatures defined as x{keysize}
363
3640	name	pgpkey
365>0	string	\x01\xd8	1024b
366>>2	use	x1024
367>0	string	\x01\xeb	1024b
368>>2	use	x1024
369>0	string	\x01\xfb	1024b
370>>2	use	x1024
371>0	string	\x01\xfd	1024b
372>>2	use	x1024
373>0	string	\x01\xf3	1024b
374>>2	use	x1024
375>0	string	\x01\xee	1024b
376>>2	use	x1024
377>0	string	\x01\xfe	1024b
378>>2	use	x1024
379>0	string	\x01\xf4	1024b
380>>2	use	x1024
381>0	string	\x02\x0d	1024b
382>>2	use	x1024
383>0	string	\x02\x03	1024b
384>>2	use	x1024
385>0	string	\x02\x05	1024b
386>>2	use	x1024
387>0	string	\x02\x15	1024b
388>>2	use	x1024
389>0	string	\x02\x00	1024b
390>>2	use	x1024
391>0	string	\x02\x10	1024b
392>>2	use	x1024
393>0	string	\x02\x04	1024b
394>>2	use	x1024
395>0	string	\x02\x06	1024b
396>>2	use	x1024
397>0	string	\x02\x16	1024b
398>>2	use	x1024
399>0	string	\x03\x98	2048b
400>>2	use	x2048
401>0	string	\x03\xab	2048b
402>>2	use	x2048
403>0	string	\x03\xbb	2048b
404>>2	use	x2048
405>0	string	\x03\xbd	2048b
406>>2	use	x2048
407>0	string	\x03\xcd	2048b
408>>2	use	x2048
409>0	string	\x03\xb3	2048b
410>>2	use	x2048
411>0	string	\x03\xc3	2048b
412>>2	use	x2048
413>0	string	\x03\xc5	2048b
414>>2	use	x2048
415>0	string	\x03\xd5	2048b
416>>2	use	x2048
417>0	string	\x03\xae	2048b
418>>2	use	x2048
419>0	string	\x03\xbe	2048b
420>>2	use	x2048
421>0	string	\x03\xc0	2048b
422>>2	use	x2048
423>0	string	\x03\xd0	2048b
424>>2	use	x2048
425>0	string	\x03\xb4	2048b
426>>2	use	x2048
427>0	string	\x03\xc4	2048b
428>>2	use	x2048
429>0	string	\x03\xc6	2048b
430>>2	use	x2048
431>0	string	\x03\xd6	2048b
432>>2	use	x2048
433>0	string	\x05X		3072b
434>>2	use	x3072
435>0	string	\x05k		3072b
436>>2	use	x3072
437>0	string	\x05{		3072b
438>>2	use	x3072
439>0	string	\x05}		3072b
440>>2	use	x3072
441>0	string	\x05\x8d	3072b
442>>2	use	x3072
443>0	string	\x05s		3072b
444>>2	use	x3072
445>0	string	\x05\x83	3072b
446>>2	use	x3072
447>0	string	\x05\x85	3072b
448>>2	use	x3072
449>0	string	\x05\x95	3072b
450>>2	use	x3072
451>0	string	\x05n		3072b
452>>2	use	x3072
453>0	string	\x05\x7e	3072b
454>>2	use	x3072
455>0	string	\x05\x80	3072b
456>>2	use	x3072
457>0	string	\x05\x90	3072b
458>>2	use	x3072
459>0	string	\x05t		3072b
460>>2	use	x3072
461>0	string	\x05\x84	3072b
462>>2	use	x3072
463>0	string	\x05\x86	3072b
464>>2	use	x3072
465>0	string	\x05\x96	3072b
466>>2	use	x3072
467>0	string	\x07[		4096b
468>>2	use	x4096
469>0	string	\x07\x18	4096b
470>>2	use	x4096
471>0	string	\x07+		4096b
472>>2	use	x4096
473>0	string	\x07;		4096b
474>>2	use	x4096
475>0	string	\x07=		4096b
476>>2	use	x4096
477>0	string	\x07M		4096b
478>>2	use	x4096
479>0	string	\x073		4096b
480>>2	use	x4096
481>0	string	\x07C		4096b
482>>2	use	x4096
483>0	string	\x07E		4096b
484>>2	use	x4096
485>0	string	\x07U		4096b
486>>2	use	x4096
487>0	string	\x07.		4096b
488>>2	use	x4096
489>0	string	\x07>		4096b
490>>2	use	x4096
491>0	string	\x07@		4096b
492>>2	use	x4096
493>0	string	\x07P		4096b
494>>2	use	x4096
495>0	string	\x074		4096b
496>>2	use	x4096
497>0	string	\x07D		4096b
498>>2	use	x4096
499>0	string	\x07F		4096b
500>>2	use	x4096
501>0	string	\x07V		4096b
502>>2	use	x4096
503>0	string	\x0e[		8192b
504>>2	use	x8192
505>0	string	\x0e\x18	8192b
506>>2	use	x8192
507>0	string	\x0e+		8192b
508>>2	use	x8192
509>0	string	\x0e;		8192b
510>>2	use	x8192
511>0	string	\x0e=		8192b
512>>2	use	x8192
513>0	string	\x0eM		8192b
514>>2	use	x8192
515>0	string	\x0e3		8192b
516>>2	use	x8192
517>0	string	\x0eC		8192b
518>>2	use	x8192
519>0	string	\x0eE		8192b
520>>2	use	x8192
521>0	string	\x0eU		8192b
522>>2	use	x8192
523>0	string	\x0e.		8192b
524>>2	use	x8192
525>0	string	\x0e>		8192b
526>>2	use	x8192
527>0	string	\x0e@		8192b
528>>2	use	x8192
529>0	string	\x0eP		8192b
530>>2	use	x8192
531>0	string	\x0e4		8192b
532>>2	use	x8192
533>0	string	\x0eD		8192b
534>>2	use	x8192
535>0	string	\x0eF		8192b
536>>2	use	x8192
537>0	string	\x0eV		8192b
538>>2	use	x8192
539
540# PGP RSA (e=65537) secret (sub-)key header
541
5420	byte	0x97			PGP Secret Sub-key -
543>1	use	pgpkey
5440	byte	0x9d
545# Update: Joerg Jenderek
546# secret subkey packet (tag 7) with same structure as secret key packet (tag 5)
547# skip Fetus.Sys16 CALIBUS.MAIN OrbFix.Sys16.Ex by looking for positive len
548>1	ubeshort	>0
549#>1	ubeshort	x		\b, body length %#x
550# next packet type often 88h,89h~(tag 2)~Signature Packet
551#>>(1.S+3)	ubyte	x		\b, next packet type %#x
552# skip Dragon.SHR DEMO.INIT by looking for positive version
553>>3	ubyte		>0
554# skip BUISSON.13 GUITAR1 by looking for low version number
555>>>3	ubyte		<5		PGP Secret Sub-key
556# sub-key are normally part of secret key. So it does not occur as standalone file
557#!:ext	bin
558# version 2,3~old 4~new . Comment following line for version 5.28 look
559>>>>3	ubyte		x		(v%d)
560>>>>3	ubyte		x		-
561# old versions 2 or 3 but no real example found
562>>>>3	ubyte		<4
563# 2 byte for key bits in version 5.28 look
564>>>>>11		ubeshort	x	%db
565>>>>>4		beldate		x	created on %s -
566# old versions use 2 additional bytes after time stamp
567#>>>>>8		ubeshort	x	%#x
568# display key algorithm 1~RSA Encrypt|Sign - 21~Diffie-Hellman
569>>>>>10	  	use		key_algo
570>>>>>(11.S/8)	ubequad		x
571# look after first key
572>>>>>>&5	use		keyend
573# new version
574>>>>3	ubyte		>3
575>>>>>9		ubeshort	x	%db
576>>>>>4		beldate		x	created on %s -
577# display key algorithm
578>>>>>8		use		key_algo
579>>>>>(9.S/8)	ubequad		x
580# look after first key for something like s2k
581>>>>>>&3	use		keyend
582