1 package File
::KDBX
::Constants
;
2 # ABSTRACT: All the KDBX-related constants you could ever want
4 # HOW TO add new constants:
5 # 1. Add it to the %CONSTANTS structure below.
6 # 2. List it in the pod at the bottom of this file in the section corresponding to its tag.
7 # 3. There is no step three.
12 use Exporter
qw(import);
13 use Scalar
::Util
qw(dualvar);
14 use namespace
::clean
-except
=> 'import';
16 our $VERSION = '999.999'; # VERSION
23 SIG1_FIRST_BYTE
=> 0x03,
28 __prefix
=> 'KDBX_VERSION',
36 MAJOR_MASK
=> 0xffff0000,
37 MINOR_MASK
=> 0x0000ffff,
41 END => dualvar
( 0, 'end'),
42 COMMENT
=> dualvar
( 1, 'comment'),
43 CIPHER_ID
=> dualvar
( 2, 'cipher_id'),
44 COMPRESSION_FLAGS
=> dualvar
( 3, 'compression_flags'),
45 MASTER_SEED
=> dualvar
( 4, 'master_seed'),
46 TRANSFORM_SEED
=> dualvar
( 5, 'transform_seed'),
47 TRANSFORM_ROUNDS
=> dualvar
( 6, 'transform_rounds'),
48 ENCRYPTION_IV
=> dualvar
( 7, 'encryption_iv'),
49 INNER_RANDOM_STREAM_KEY
=> dualvar
( 8, 'inner_random_stream_key'),
50 STREAM_START_BYTES
=> dualvar
( 9, 'stream_start_bytes'),
51 INNER_RANDOM_STREAM_ID
=> dualvar
( 10, 'inner_random_stream_id'),
52 KDF_PARAMETERS
=> dualvar
( 11, 'kdf_parameters'),
53 PUBLIC_CUSTOM_DATA
=> dualvar
( 12, 'public_custom_data'),
56 __prefix
=> 'COMPRESSION',
57 NONE
=> dualvar
( 0, 'none'),
58 GZIP
=> dualvar
( 1, 'gzip'),
62 UUID_AES128
=> "\x61\xab\x05\xa1\x94\x64\x41\xc3\x8d\x74\x3a\x56\x3d\xf8\xdd\x35",
63 UUID_AES256
=> "\x31\xc1\xf2\xe6\xbf\x71\x43\x50\xbe\x58\x05\x21\x6a\xfc\x5a\xff",
64 UUID_CHACHA20
=> "\xd6\x03\x8a\x2b\x8b\x6f\x4c\xb5\xa5\x24\x33\x9a\x31\xdb\xb5\x9a",
65 UUID_SALSA20
=> "\x71\x6e\x1c\x8a\xee\x17\x4b\xdc\x93\xae\xa9\x77\xb8\x82\x83\x3a",
66 UUID_SERPENT
=> "\x09\x85\x63\xff\xdd\xf7\x4f\x98\x86\x19\x80\x79\xf6\xdb\x89\x7a",
67 UUID_TWOFISH
=> "\xad\x68\xf2\x9f\x57\x6f\x4b\xb9\xa3\x6a\xd4\x7a\xf9\x65\x34\x6c",
71 UUID_AES
=> "\xc9\xd9\xf3\x9a\x62\x8a\x44\x60\xbf\x74\x0d\x08\xc1\x8a\x4f\xea",
72 UUID_AES_CHALLENGE_RESPONSE
=> "\x7c\x02\xbb\x82\x79\xa7\x4a\xc0\x92\x7d\x11\x4a\x00\x64\x82\x38",
73 UUID_ARGON2D
=> "\xef\x63\x6d\xdf\x8c\x29\x44\x4b\x91\xf7\xa9\xa4\x03\xe3\x0a\x0c",
74 UUID_ARGON2ID
=> "\x9e\x29\x8b\x19\x56\xdb\x47\x73\xb2\x3d\xfc\x3e\xc6\xf0\xa1\xe6",
75 PARAM_UUID
=> '$UUID',
76 PARAM_AES_ROUNDS
=> 'R',
77 PARAM_AES_SEED
=> 'S',
78 PARAM_ARGON2_SALT
=> 'S',
79 PARAM_ARGON2_PARALLELISM
=> 'P',
80 PARAM_ARGON2_MEMORY
=> 'M',
81 PARAM_ARGON2_ITERATIONS
=> 'I',
82 PARAM_ARGON2_VERSION
=> 'V',
83 PARAM_ARGON2_SECRET
=> 'K',
84 PARAM_ARGON2_ASSOCDATA
=> 'A',
85 DEFAULT_AES_ROUNDS
=> 100_000,
86 DEFAULT_ARGON2_ITERATIONS
=> 10,
87 DEFAULT_ARGON2_MEMORY
=> 1 << 16,
88 DEFAULT_ARGON2_PARALLELISM
=> 2,
89 DEFAULT_ARGON2_VERSION
=> 0x13,
96 SALSA20_IV
=> "\xe8\x30\x09\x4b\x97\x20\x5d\x2a",
102 VERSION_MAJOR_MASK
=> 0xff00,
110 TYPE_BYTEARRAY
=> 0x42,
113 __prefix
=> 'INNER_HEADER',
114 END => dualvar
( 0, 'end'),
115 INNER_RANDOM_STREAM_ID
=> dualvar
( 1, 'inner_random_stream_id'),
116 INNER_RANDOM_STREAM_KEY
=> dualvar
( 2, 'inner_random_stream_key'),
117 BINARY
=> dualvar
( 3, 'binary'),
118 BINARY_FLAG_PROTECT
=> 1,
121 __prefix
=> 'KEY_FILE',
122 TYPE_BINARY
=> dualvar
( 1, 'binary'),
123 TYPE_HASHED
=> dualvar
( 3, 'hashed'),
124 TYPE_HEX
=> dualvar
( 2, 'hex'),
125 TYPE_XML
=> dualvar
( 4, 'xml'),
128 __prefix
=> 'HISTORY',
129 DEFAULT_MAX_ITEMS
=> 10,
130 DEFAULT_MAX_SIZE
=> 6_291_456, # 6 M
134 PASSWORD
=> dualvar
( 0, 'Password'),
135 PACKAGE_NETWORK
=> dualvar
( 1, 'Package_Network'),
136 MESSAGEBOX_WARNING
=> dualvar
( 2, 'MessageBox_Warning'),
137 SERVER
=> dualvar
( 3, 'Server'),
138 KLIPPER
=> dualvar
( 4, 'Klipper'),
139 EDU_LANGUAGES
=> dualvar
( 5, 'Edu_Languages'),
140 KCMDF
=> dualvar
( 6, 'KCMDF'),
141 KATE
=> dualvar
( 7, 'Kate'),
142 SOCKET
=> dualvar
( 8, 'Socket'),
143 IDENTITY
=> dualvar
( 9, 'Identity'),
144 KONTACT
=> dualvar
( 10, 'Kontact'),
145 CAMERA
=> dualvar
( 11, 'Camera'),
146 IRKICKFLASH
=> dualvar
( 12, 'IRKickFlash'),
147 KGPG_KEY3
=> dualvar
( 13, 'KGPG_Key3'),
148 LAPTOP_POWER
=> dualvar
( 14, 'Laptop_Power'),
149 SCANNER
=> dualvar
( 15, 'Scanner'),
150 MOZILLA_FIREBIRD
=> dualvar
( 16, 'Mozilla_Firebird'),
151 CDROM_UNMOUNT
=> dualvar
( 17, 'CDROM_Unmount'),
152 DISPLAY
=> dualvar
( 18, 'Display'),
153 MAIL_GENERIC
=> dualvar
( 19, 'Mail_Generic'),
154 MISC
=> dualvar
( 20, 'Misc'),
155 KORGANIZER
=> dualvar
( 21, 'KOrganizer'),
156 ASCII
=> dualvar
( 22, 'ASCII'),
157 ICONS
=> dualvar
( 23, 'Icons'),
158 CONNECT_ESTABLISHED
=> dualvar
( 24, 'Connect_Established'),
159 FOLDER_MAIL
=> dualvar
( 25, 'Folder_Mail'),
160 FILESAVE
=> dualvar
( 26, 'FileSave'),
161 NFS_UNMOUNT
=> dualvar
( 27, 'NFS_Unmount'),
162 MESSAGE
=> dualvar
( 28, 'Message'),
163 KGPG_TERM
=> dualvar
( 29, 'KGPG_Term'),
164 KONSOLE
=> dualvar
( 30, 'Konsole'),
165 FILEPRINT
=> dualvar
( 31, 'FilePrint'),
166 FSVIEW
=> dualvar
( 32, 'FSView'),
167 RUN
=> dualvar
( 33, 'Run'),
168 CONFIGURE
=> dualvar
( 34, 'Configure'),
169 KRFB
=> dualvar
( 35, 'KRFB'),
170 ARK
=> dualvar
( 36, 'Ark'),
171 KPERCENTAGE
=> dualvar
( 37, 'KPercentage'),
172 SAMBA_UNMOUNT
=> dualvar
( 38, 'Samba_Unmount'),
173 HISTORY
=> dualvar
( 39, 'History'),
174 MAIL_FIND
=> dualvar
( 40, 'Mail_Find'),
175 VECTORGFX
=> dualvar
( 41, 'VectorGfx'),
176 KCMMEMORY
=> dualvar
( 42, 'KCMMemory'),
177 TRASHCAN_FULL
=> dualvar
( 43, 'Trashcan_Full'),
178 KNOTES
=> dualvar
( 44, 'KNotes'),
179 CANCEL
=> dualvar
( 45, 'Cancel'),
180 HELP
=> dualvar
( 46, 'Help'),
181 KPACKAGE
=> dualvar
( 47, 'KPackage'),
182 FOLDER
=> dualvar
( 48, 'Folder'),
183 FOLDER_BLUE_OPEN
=> dualvar
( 49, 'Folder_Blue_Open'),
184 FOLDER_TAR
=> dualvar
( 50, 'Folder_Tar'),
185 DECRYPTED
=> dualvar
( 51, 'Decrypted'),
186 ENCRYPTED
=> dualvar
( 52, 'Encrypted'),
187 APPLY
=> dualvar
( 53, 'Apply'),
188 SIGNATURE
=> dualvar
( 54, 'Signature'),
189 THUMBNAIL
=> dualvar
( 55, 'Thumbnail'),
190 KADDRESSBOOK
=> dualvar
( 56, 'KAddressBook'),
191 VIEW_TEXT
=> dualvar
( 57, 'View_Text'),
192 KGPG
=> dualvar
( 58, 'KGPG'),
193 PACKAGE_DEVELOPMENT
=> dualvar
( 59, 'Package_Development'),
194 KFM_HOME
=> dualvar
( 60, 'KFM_Home'),
195 SERVICES
=> dualvar
( 61, 'Services'),
196 TUX
=> dualvar
( 62, 'Tux'),
197 FEATHER
=> dualvar
( 63, 'Feather'),
198 APPLE
=> dualvar
( 64, 'Apple'),
199 W
=> dualvar
( 65, 'W'),
200 MONEY
=> dualvar
( 66, 'Money'),
201 CERTIFICATE
=> dualvar
( 67, 'Certificate'),
202 SMARTPHONE
=> dualvar
( 68, 'Smartphone'),
206 SECONDS_AD1_TO_UNIX_EPOCH
=> 62_135_596_800,
209 YUBICO_VID
=> dualvar
( 0x1050, 'Yubico'),
210 YUBIKEY_PID
=> dualvar
( 0x0010, 'YubiKey 1/2'),
211 NEO_OTP_PID
=> dualvar
( 0x0110, 'YubiKey NEO OTP'),
212 NEO_OTP_CCID_PID
=> dualvar
( 0x0111, 'YubiKey NEO OTP+CCID'),
213 NEO_CCID_PID
=> dualvar
( 0x0112, 'YubiKey NEO CCID'),
214 NEO_U2F_PID
=> dualvar
( 0x0113, 'YubiKey NEO FIDO'),
215 NEO_OTP_U2F_PID
=> dualvar
( 0x0114, 'YubiKey NEO OTP+FIDO'),
216 NEO_U2F_CCID_PID
=> dualvar
( 0x0115, 'YubiKey NEO FIDO+CCID'),
217 NEO_OTP_U2F_CCID_PID
=> dualvar
( 0x0116, 'YubiKey NEO OTP+FIDO+CCID'),
218 YK4_OTP_PID
=> dualvar
( 0x0401, 'YubiKey 4/5 OTP'),
219 YK4_U2F_PID
=> dualvar
( 0x0402, 'YubiKey 4/5 FIDO'),
220 YK4_OTP_U2F_PID
=> dualvar
( 0x0403, 'YubiKey 4/5 OTP+FIDO'),
221 YK4_CCID_PID
=> dualvar
( 0x0404, 'YubiKey 4/5 CCID'),
222 YK4_OTP_CCID_PID
=> dualvar
( 0x0405, 'YubiKey 4/5 OTP+CCID'),
223 YK4_U2F_CCID_PID
=> dualvar
( 0x0406, 'YubiKey 4/5 FIDO+CCID'),
224 YK4_OTP_U2F_CCID_PID
=> dualvar
( 0x0407, 'YubiKey 4/5 OTP+FIDO+CCID'),
225 PLUS_U2F_OTP_PID
=> dualvar
( 0x0410, 'YubiKey Plus OTP+FIDO'),
227 ONLYKEY_VID
=> dualvar
( 0x1d50, 'OnlyKey'),
228 ONLYKEY_PID
=> dualvar
( 0x60fc, 'OnlyKey'),
230 YK_EUSBERR
=> dualvar
( 0x01, 'USB error'),
231 YK_EWRONGSIZ
=> dualvar
( 0x02, 'wrong size'),
232 YK_EWRITEERR
=> dualvar
( 0x03, 'write error'),
233 YK_ETIMEOUT
=> dualvar
( 0x04, 'timeout'),
234 YK_ENOKEY
=> dualvar
( 0x05, 'no yubikey present'),
235 YK_EFIRMWARE
=> dualvar
( 0x06, 'unsupported firmware version'),
236 YK_ENOMEM
=> dualvar
( 0x07, 'out of memory'),
237 YK_ENOSTATUS
=> dualvar
( 0x08, 'no status structure given'),
238 YK_ENOTYETIMPL
=> dualvar
( 0x09, 'not yet implemented'),
239 YK_ECHECKSUM
=> dualvar
( 0x0a, 'checksum mismatch'),
240 YK_EWOULDBLOCK
=> dualvar
( 0x0b, 'operation would block'),
241 YK_EINVALIDCMD
=> dualvar
( 0x0c, 'invalid command for operation'),
242 YK_EMORETHANONE
=> dualvar
( 0x0d, 'expected only one YubiKey but serveral present'),
243 YK_ENODATA
=> dualvar
( 0x0e, 'no data returned from device'),
245 CONFIG1_VALID
=> 0x01,
246 CONFIG2_VALID
=> 0x02,
247 CONFIG1_TOUCH
=> 0x04,
248 CONFIG2_TOUCH
=> 0x08,
249 CONFIG_LED_INV
=> 0x10,
250 CONFIG_STATUS_MASK
=> 0x1f,
256 no strict
'refs'; ## no critic (ProhibitNoStrict)
257 while (my ($tag, $constants) = each %CONSTANTS) {
258 my $prefix = delete $constants->{__prefix
};
259 while (my ($name, $value) = each %$constants) {
261 $val = $val+0 if $tag eq 'icon'; # TODO
263 my $full_name = $prefix ? "${prefix}_${name}" : $name;
264 die "Duplicate constant: $full_name\n" if $seen{$full_name};
265 *{$full_name} = sub() { $value };
266 push @{$EXPORT_TAGS{$tag} //= []}, $full_name;
273 push @{$EXPORT_TAGS{header
}}, 'KDBX_HEADER';
274 push @{$EXPORT_TAGS{inner_header
}}, 'KDBX_INNER_HEADER';
276 $EXPORT_TAGS{all
} = [map { @$_ } values %EXPORT_TAGS];
277 our @EXPORT_OK = sort @{$EXPORT_TAGS{all
}};
281 HEADER_END
, HEADER_COMMENT
, HEADER_CIPHER_ID
, HEADER_COMPRESSION_FLAGS
,
282 HEADER_MASTER_SEED
, HEADER_TRANSFORM_SEED
, HEADER_TRANSFORM_ROUNDS
,
283 HEADER_ENCRYPTION_IV
, HEADER_INNER_RANDOM_STREAM_KEY
, HEADER_STREAM_START_BYTES
,
284 HEADER_INNER_RANDOM_STREAM_ID
, HEADER_KDF_PARAMETERS
, HEADER_PUBLIC_CUSTOM_DATA
,
286 $HEADER{$header} = $HEADER{0+$header} = $header;
288 sub KDBX_HEADER
{ $HEADER{$_[0]} }
292 for my $inner_header (
293 INNER_HEADER_END
, INNER_HEADER_INNER_RANDOM_STREAM_ID
,
294 INNER_HEADER_INNER_RANDOM_STREAM_KEY
, INNER_HEADER_BINARY
,
296 $INNER_HEADER{$inner_header} = $INNER_HEADER{0+$inner_header} = $inner_header;
298 sub KDBX_INNER_HEADER
{ $INNER_HEADER{$_[0]} }
305 use File::KDBX::Constants qw(:all);
307 say KDBX_VERSION_4_1;
311 This module provides importable constants related to KDBX. Constants can be imported individually or in groups
312 (by tag). The available tags are:
329 * C<:all> - All of the above
331 View the source of this module to see the constant values (but really you shouldn't care).
337 Constants related to identifying the file types:
341 = C<KDBX_SIG1_FIRST_BYTE>
347 Constants related to identifying the format version of a file:
350 = C<KDBX_VERSION_2_0>
351 = C<KDBX_VERSION_3_0>
352 = C<KDBX_VERSION_3_1>
353 = C<KDBX_VERSION_4_0>
354 = C<KDBX_VERSION_4_1>
355 = C<KDBX_VERSION_OLDEST>
356 = C<KDBX_VERSION_LATEST>
357 = C<KDBX_VERSION_MAJOR_MASK>
358 = C<KDBX_VERSION_MINOR_MASK>
362 Constants related to parsing and generating KDBX file headers:
367 = C<HEADER_CIPHER_ID>
368 = C<HEADER_COMPRESSION_FLAGS>
369 = C<HEADER_MASTER_SEED>
370 = C<HEADER_TRANSFORM_SEED>
371 = C<HEADER_TRANSFORM_ROUNDS>
372 = C<HEADER_ENCRYPTION_IV>
373 = C<HEADER_INNER_RANDOM_STREAM_KEY>
374 = C<HEADER_STREAM_START_BYTES>
375 = C<HEADER_INNER_RANDOM_STREAM_ID>
376 = C<HEADER_KDF_PARAMETERS>
377 = C<HEADER_PUBLIC_CUSTOM_DATA>
382 Constants related to identifying the compression state of a file:
385 = C<COMPRESSION_NONE>
386 = C<COMPRESSION_GZIP>
390 Constants related ciphers:
393 = C<CIPHER_UUID_AES128>
394 = C<CIPHER_UUID_AES256>
395 = C<CIPHER_UUID_CHACHA20>
396 = C<CIPHER_UUID_SALSA20>
397 = C<CIPHER_UUID_SERPENT>
398 = C<CIPHER_UUID_TWOFISH>
400 =head2 :random_stream
402 Constants related to memory protection stream ciphers:
405 = C<STREAM_ID_RC4_VARIANT>
406 This is insecure and not implemented.
407 = C<STREAM_ID_SALSA20>
408 = C<STREAM_ID_CHACHA20>
409 = C<STREAM_SALSA20_IV>
413 Constants related to key derivation functions and configuration:
417 = C<KDF_UUID_AES_CHALLENGE_RESPONSE>
418 This is what KeePassXC calls C<KDF_AES_KDBX4>.
419 = C<KDF_UUID_ARGON2D>
420 = C<KDF_UUID_ARGON2ID>
422 = C<KDF_PARAM_AES_ROUNDS>
423 = C<KDF_PARAM_AES_SEED>
424 = C<KDF_PARAM_ARGON2_SALT>
425 = C<KDF_PARAM_ARGON2_PARALLELISM>
426 = C<KDF_PARAM_ARGON2_MEMORY>
427 = C<KDF_PARAM_ARGON2_ITERATIONS>
428 = C<KDF_PARAM_ARGON2_VERSION>
429 = C<KDF_PARAM_ARGON2_SECRET>
430 = C<KDF_PARAM_ARGON2_ASSOCDATA>
431 = C<KDF_DEFAULT_AES_ROUNDS>
432 = C<KDF_DEFAULT_ARGON2_ITERATIONS>
433 = C<KDF_DEFAULT_ARGON2_MEMORY>
434 = C<KDF_DEFAULT_ARGON2_PARALLELISM>
435 = C<KDF_DEFAULT_ARGON2_VERSION>
439 Constants related to parsing and generating KDBX4 variant maps:
443 = C<VMAP_VERSION_MAJOR_MASK>
445 = C<VMAP_TYPE_UINT32>
446 = C<VMAP_TYPE_UINT64>
450 = C<VMAP_TYPE_STRING>
451 = C<VMAP_TYPE_BYTEARRAY>
455 Constants related to parsing and generating KDBX4 inner headers:
458 = C<INNER_HEADER_END>
459 = C<INNER_HEADER_INNER_RANDOM_STREAM_ID>
460 = C<INNER_HEADER_INNER_RANDOM_STREAM_KEY>
461 = C<INNER_HEADER_BINARY>
462 = C<INNER_HEADER_BINARY_FLAG_PROTECT>
463 = C<KDBX_INNER_HEADER>
467 Constants related to identifying key file types:
470 = C<KEY_FILE_TYPE_BINARY>
471 = C<KEY_FILE_TYPE_HASHED>
472 = C<KEY_FILE_TYPE_HEX>
473 = C<KEY_FILE_TYPE_XML>
477 Constants for history-related default values:
480 = C<HISTORY_DEFAULT_MAX_ITEMS>
481 = C<HISTORY_DEFAULT_MAX_SIZE>
485 Constants for default icons used by KeePass password safe implementations:
489 = C<ICON_PACKAGE_NETWORK>
490 = C<ICON_MESSAGEBOX_WARNING>
493 = C<ICON_EDU_LANGUAGES>
500 = C<ICON_IRKICKFLASH>
502 = C<ICON_LAPTOP_POWER>
504 = C<ICON_MOZILLA_FIREBIRD>
505 = C<ICON_CDROM_UNMOUNT>
507 = C<ICON_MAIL_GENERIC>
512 = C<ICON_CONNECT_ESTABLISHED>
513 = C<ICON_FOLDER_MAIL>
515 = C<ICON_NFS_UNMOUNT>
525 = C<ICON_KPERCENTAGE>
526 = C<ICON_SAMBA_UNMOUNT>
531 = C<ICON_TRASHCAN_FULL>
537 = C<ICON_FOLDER_BLUE_OPEN>
544 = C<ICON_KADDRESSBOOK>
547 = C<ICON_PACKAGE_DEVELOPMENT>
555 = C<ICON_CERTIFICATE>
560 Constants related to time:
563 = C<TIME_SECONDS_AD1_TO_UNIX_EPOCH>
567 Constants related to working with YubiKeys:
573 = C<NEO_OTP_CCID_PID>
577 = C<NEO_U2F_CCID_PID>
578 = C<NEO_OTP_U2F_CCID_PID>
583 = C<YK4_OTP_CCID_PID>
584 = C<YK4_U2F_CCID_PID>
585 = C<YK4_OTP_U2F_CCID_PID>
586 = C<PLUS_U2F_OTP_PID>
608 = C<CONFIG_STATUS_MASK>