xref: /freebsd/contrib/file/magic/Magdir/gnu (revision 58a0f0d00c0cc4a90ce584a61470290751bfcac7)
1b6cee71dSXin LI
2b6cee71dSXin LI#------------------------------------------------------------------------------
3*58a0f0d0SEitan Adler# $File: gnu,v 1.20 2018/02/24 16:11:23 christos Exp $
4b6cee71dSXin LI# gnu:  file(1) magic for various GNU tools
5b6cee71dSXin LI#
6b6cee71dSXin LI# GNU nlsutils message catalog file format
7b6cee71dSXin LI#
8b6cee71dSXin LI# GNU message catalog (.mo and .gmo files)
9b6cee71dSXin LI
10*58a0f0d0SEitan Adler# Update: Joerg Jenderek
11*58a0f0d0SEitan Adler# URL: https://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
12*58a0f0d0SEitan Adler# Reference: ftp://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.8.tar.gz/
13*58a0f0d0SEitan Adler#	gettext-0.19.8.1/gettext-runtime/intl/gmo.h
14*58a0f0d0SEitan Adler# Note: maybe call it like "GNU translation gettext machine object"
15b6cee71dSXin LI0	string		\336\22\4\225	GNU message catalog (little endian),
16*58a0f0d0SEitan Adler#0	ulelong	0x950412DE		GNU-format message catalog data
17*58a0f0d0SEitan Adler# TODO: write lines in such a way that code can also be called for big endian variant
18*58a0f0d0SEitan Adler#>0	use		gettext-object
19*58a0f0d0SEitan Adler#0	name		gettext-object
20*58a0f0d0SEitan Adler>4	ulelong		x		revision
21*58a0f0d0SEitan Adler!:mime	application/x-gettext-translation
22*58a0f0d0SEitan Adler# mo extension is also used for Easeus Partition Master PE32 executable module
23*58a0f0d0SEitan Adler# like ConvertFatToNTFS.mo
24*58a0f0d0SEitan Adler!:ext	gmo/mo
25*58a0f0d0SEitan Adler# only found three revision combinations 0.0 0.1 1.1 as unsigned 32-bit
26*58a0f0d0SEitan Adler# major revision
27*58a0f0d0SEitan Adler>4	ulelong/0xFFff	x		%u.
28*58a0f0d0SEitan Adler# minor revision
29*58a0f0d0SEitan Adler>4	ulelong&0x0000FFff	x	\b%u
30*58a0f0d0SEitan Adler>>8	ulelong		x		\b, %u message
31*58a0f0d0SEitan Adler# plural s
32*58a0f0d0SEitan Adler>>8	ulelong		>1		\bs
33*58a0f0d0SEitan Adler# size of hashing table
34*58a0f0d0SEitan Adler#>20	ulelong		x		\b, %u hash
35*58a0f0d0SEitan Adler#>20	ulelong		>1		\bes
36*58a0f0d0SEitan Adler#>24	ulelong		x		at 0x%x
37*58a0f0d0SEitan Adler# for revsion x.0 offset of table with originals is 1Ch if directly after header
38*58a0f0d0SEitan Adler>4	ulelong&0x0000FFff	=0
39*58a0f0d0SEitan Adler>>12	ulelong		!0x1C		\b, at 0x%x string table
40*58a0f0d0SEitan Adler# but for x.1 table offset i found is 30h. That means directly after bigger header
41*58a0f0d0SEitan Adler>4	ulelong&0x0000FFff	>0
42*58a0f0d0SEitan Adler>>12	ulelong		!0x30		\b, at 0x%x string table
43*58a0f0d0SEitan Adler# The following variables are only used in .mo files with minor revision >= 1
44*58a0f0d0SEitan Adler# number of system dependent segments
45*58a0f0d0SEitan Adler#>>28	ulelong		x		\b, %u segment
46*58a0f0d0SEitan Adler#>>28	ulelong		>1		\bs
47*58a0f0d0SEitan Adler# offset of table describing system dependent segments
48*58a0f0d0SEitan Adler#>>32	ulelong		x		at 0x%x
49*58a0f0d0SEitan Adler# number of system dependent strings pairs
50*58a0f0d0SEitan Adler>>36	ulelong		x		\b, %u sysdep message
51*58a0f0d0SEitan Adler>>36	ulelong		>1		\bs
52*58a0f0d0SEitan Adler# offset of table with start offsets of original sysdep strings
53*58a0f0d0SEitan Adler#>>40	ulelong		x		\b, at 0x%x sysdep strings
54*58a0f0d0SEitan Adler# offset of table with start offsets of translated sysdep strings
55*58a0f0d0SEitan Adler#>>44	ulelong		x		\b, at 0x%x sysdep translations
56*58a0f0d0SEitan Adler# >>(44.l)	ulelong	x		0x%x chars
57*58a0f0d0SEitan Adler# >>>&0		ulelong	x		at 0x%x
58*58a0f0d0SEitan Adler# >>>>(&-4)	string	x		"%s"
59*58a0f0d0SEitan Adler# string table after big header
60*58a0f0d0SEitan Adler#>>48	ubequad		x		\b, string table 0x%llx
61*58a0f0d0SEitan Adler#
62*58a0f0d0SEitan Adler# 0th string length seems to be always 0
63*58a0f0d0SEitan Adler#>(12.l)	ulelong	x		\b, %u chars
64*58a0f0d0SEitan Adler#>>&0		ulelong	x		at 0x%x
65*58a0f0d0SEitan Adler# if 1st string length positiv inspect offset and string
66*58a0f0d0SEitan Adler#>(12.l+8)	ulelong	>0		\b, %u chars
67*58a0f0d0SEitan Adler#>>&0		ulelong	x		at 0x%x
68*58a0f0d0SEitan Adler# if 2nd string length positiv inspect offset and string
69*58a0f0d0SEitan Adler# >(12.l+16)	ulelong	>0		\b, %u chars
70*58a0f0d0SEitan Adler# >>&0		ulelong	x		at 0x%x
71*58a0f0d0SEitan Adler# skip newline byte
72*58a0f0d0SEitan Adler#>>>(&-4)	ubyte	=0x0A
73*58a0f0d0SEitan Adler#>>>>&0		string	x		"%s"
74*58a0f0d0SEitan Adler#>>>(&-4)	ubyte	!0x0A
75*58a0f0d0SEitan Adler#>>>>&-1		string	x		'%s'
76*58a0f0d0SEitan Adler# offset of table with translation strings
77*58a0f0d0SEitan Adler#>16	ulelong		x		\b, at 0x%x translation table
78*58a0f0d0SEitan Adler# check translation 0 length and offset
79*58a0f0d0SEitan Adler>(16.l)		ulelong	>0
80*58a0f0d0SEitan Adler>>&0		ulelong	x
81*58a0f0d0SEitan Adler# translation 0 seems to be often Project-Id with name and version
82*58a0f0d0SEitan Adler>>>(&-4)	string	x		\b, %s
83*58a0f0d0SEitan Adler# trans. 1 with bytes >= 1 unlike icoutils-0.31.0\po\en@boldquot.gmo with 1 NL
84*58a0f0d0SEitan Adler>(16.l+8)	ulelong	>1
85*58a0f0d0SEitan Adler>>&0		ulelong	x
86*58a0f0d0SEitan Adler>>>(&-4)	ubyte	!0x0A
87*58a0f0d0SEitan Adler>>>>&-1		string	x		'%s'
88*58a0f0d0SEitan Adler# 1 New Line like in tar-1.29\po\de.gmo
89*58a0f0d0SEitan Adler>>>(&-4)	ubyte	=0x0A
90*58a0f0d0SEitan Adler>>>>&0		ubyte	!0x0A
91*58a0f0d0SEitan Adler>>>>>&-1	string	x		'%s'
92*58a0f0d0SEitan Adler# 2nd New Line like in parted-3.1\po\de.gmo
93*58a0f0d0SEitan Adler>>>>&0		ubyte	=0x0A
94*58a0f0d0SEitan Adler>>>>>&0		string	x		'%s'
95b6cee71dSXin LI
96b6cee71dSXin LI0	string		\225\4\22\336	GNU message catalog (big endian),
97*58a0f0d0SEitan Adler#0	ubelong	0x950412DE		GNU-format message catalog data
98*58a0f0d0SEitan Adler!:mime	application/x-gettext-translation
99*58a0f0d0SEitan Adler!:ext	gmo/mo
100*58a0f0d0SEitan Adler# TODO: for big endian use same code as for little endian
101*58a0f0d0SEitan Adler#>0	use		\^gettext-object
102*58a0f0d0SEitan Adler# DEBUG code
103*58a0f0d0SEitan Adler#>16	ubelong		x		\b, at 0x%x translation table
104*58a0f0d0SEitan Adler#>(16.L)		ubelong	x		0x%x chars
105*58a0f0d0SEitan Adler#>>&0		ubelong	x		at 0x%x
106*58a0f0d0SEitan Adler# unexpected value HERE!
107*58a0f0d0SEitan Adler#>>>(&-4)	ubequad	x		0x%llx
108*58a0f0d0SEitan Adler#
109b6cee71dSXin LI>4	beshort		x		revision %d.
110b6cee71dSXin LI>6	beshort		>0		\b%d,
111b6cee71dSXin LI>>8	belong		x		%d messages,
112b6cee71dSXin LI>>36	belong		x		%d sysdep messages
113b6cee71dSXin LI>6	beshort		=0		\b%d,
114b6cee71dSXin LI>>8	belong		x		%d messages
115b6cee71dSXin LI
116b6cee71dSXin LI
117b6cee71dSXin LI# GnuPG
118b6cee71dSXin LI# The format is very similar to pgp
119b6cee71dSXin LI0	string          \001gpg                 GPG key trust database
120b6cee71dSXin LI>4	byte            x                       version %d
121b6cee71dSXin LI# Note: magic.mime had 0x8501 for the next line instead of 0x8502
122b6cee71dSXin LI0	beshort		0x8502			GPG encrypted data
123b6cee71dSXin LI!:mime	text/PGP # encoding: data
124b6cee71dSXin LI
125*58a0f0d0SEitan Adler# Update: Joerg Jenderek
126*58a0f0d0SEitan Adler# Note:	PGP and GPG use same data structure.
127*58a0f0d0SEitan Adler#	So recognition is now done by ./pgp with start test for byte 0x99
128b6cee71dSXin LI# This magic is not particularly good, as the keyrings don't have true
129b6cee71dSXin LI# magic. Nevertheless, it covers many keyrings.
130*58a0f0d0SEitan Adler# 0	ubeshort-0x9901	<2
131*58a0f0d0SEitan Adler# >3	byte		4
132*58a0f0d0SEitan Adler# >>4	bedate		x		GPG key public ring, created %s
133*58a0f0d0SEitan Adler# !:mime application/x-gnupg-keyring
134a5d223e6SXin LI
135b6cee71dSXin LI# Symmetric encryption
136b6cee71dSXin LI0	leshort		0x0d8c
137b6cee71dSXin LI>4	leshort		0x0203
138b6cee71dSXin LI>>2	leshort		0x0204		GPG symmetrically encrypted data (3DES cipher)
139b6cee71dSXin LI>>2	leshort		0x0304		GPG symmetrically encrypted data (CAST5 cipher)
140b6cee71dSXin LI>>2	leshort		0x0404		GPG symmetrically encrypted data (BLOWFISH cipher)
141b6cee71dSXin LI>>2	leshort		0x0704		GPG symmetrically encrypted data (AES cipher)
142b6cee71dSXin LI>>2	leshort		0x0804		GPG symmetrically encrypted data (AES192 cipher)
143b6cee71dSXin LI>>2	leshort		0x0904		GPG symmetrically encrypted data (AES256 cipher)
144b6cee71dSXin LI>>2	leshort		0x0a04		GPG symmetrically encrypted data (TWOFISH cipher)
145b6cee71dSXin LI>>2	leshort		0x0b04		GPG symmetrically encrypted data (CAMELLIA128 cipher)
146b6cee71dSXin LI>>2	leshort		0x0c04		GPG symmetrically encrypted data (CAMELLIA192 cipher)
147b6cee71dSXin LI>>2	leshort		0x0d04		GPG symmetrically encrypted data (CAMELLIA256 cipher)
148b6cee71dSXin LI
149b6cee71dSXin LI
150b6cee71dSXin LI# GnuPG Keybox file
151b6cee71dSXin LI# <http://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=kbx/keybox-blob.c;hb=HEAD>
152b6cee71dSXin LI# From: Philipp Hahn <hahn@univention.de>
153b6cee71dSXin LI0	belong	32
154b6cee71dSXin LI>4	byte	1
155b6cee71dSXin LI>>8	string	KBXf	GPG keybox database
156b6cee71dSXin LI>>>5	byte	1	version %d
157b6cee71dSXin LI>>>16	bedate	x	\b, created-at %s
158b6cee71dSXin LI>>>20	bedate	x	\b, last-maintained %s
159b6cee71dSXin LI
160b6cee71dSXin LI
161b6cee71dSXin LI# Gnumeric spreadsheet
162b6cee71dSXin LI# This entry is only semi-helpful, as Gnumeric compresses its files, so
163b6cee71dSXin LI# they will ordinarily reported as "compressed", but at least -z helps
164b6cee71dSXin LI39      string          =<gmr:Workbook           Gnumeric spreadsheet
165b6cee71dSXin LI
166b6cee71dSXin LI# From: James Youngman <jay@gnu.org>
167b6cee71dSXin LI# gnu find magic
168b6cee71dSXin LI0	string	\0LOCATE	GNU findutils locate database data
169b6cee71dSXin LI>7	string	>\0		\b, format %s
170b6cee71dSXin LI>7	string	02		\b (frcode)
171b6cee71dSXin LI
172b6cee71dSXin LI# Files produced by GNU gettext
173b6cee71dSXin LI
174b6cee71dSXin LI# gettext message catalogue
1755f0216bdSXin LI0	search/1024	\nmsgid
1765f0216bdSXin LI>&0	search/1024	\nmsgstr	GNU gettext message catalogue text
1775f0216bdSXin LI!:strength +100
178b6cee71dSXin LI!:mime text/x-po
179