|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 #ifndef MAR_PRIVATE_H__ |
|
8 #define MAR_PRIVATE_H__ |
|
9 |
|
10 #include "limits.h" |
|
11 #include "mozilla/Assertions.h" |
|
12 #include <stdint.h> |
|
13 |
|
14 #define BLOCKSIZE 4096 |
|
15 #define ROUND_UP(n, incr) (((n) / (incr) + 1) * (incr)) |
|
16 |
|
17 #define MAR_ID "MAR1" |
|
18 #define MAR_ID_SIZE 4 |
|
19 |
|
20 /* The signature block comes directly after the header block |
|
21 which is 16 bytes */ |
|
22 #define SIGNATURE_BLOCK_OFFSET 16 |
|
23 |
|
24 /* Make sure the file is less than 500MB. We do this to protect against |
|
25 invalid MAR files. */ |
|
26 #define MAX_SIZE_OF_MAR_FILE ((int64_t)524288000) |
|
27 |
|
28 /* Existing code makes assumptions that the file size is |
|
29 smaller than LONG_MAX. */ |
|
30 MOZ_STATIC_ASSERT(MAX_SIZE_OF_MAR_FILE < ((int64_t)LONG_MAX), |
|
31 "max mar file size is too big"); |
|
32 |
|
33 /* We store at most the size up to the signature block + 4 |
|
34 bytes per BLOCKSIZE bytes */ |
|
35 MOZ_STATIC_ASSERT(sizeof(BLOCKSIZE) < \ |
|
36 (SIGNATURE_BLOCK_OFFSET + sizeof(uint32_t)), |
|
37 "BLOCKSIZE is too big"); |
|
38 |
|
39 /* The maximum size of any signature supported by current and future |
|
40 implementations of the signmar program. */ |
|
41 #define MAX_SIGNATURE_LENGTH 2048 |
|
42 |
|
43 /* Each additional block has a unique ID. |
|
44 The product information block has an ID of 1. */ |
|
45 #define PRODUCT_INFO_BLOCK_ID 1 |
|
46 |
|
47 #define MAR_ITEM_SIZE(namelen) (3*sizeof(uint32_t) + (namelen) + 1) |
|
48 |
|
49 /* Product Information Block (PIB) constants */ |
|
50 #define PIB_MAX_MAR_CHANNEL_ID_SIZE 63 |
|
51 #define PIB_MAX_PRODUCT_VERSION_SIZE 31 |
|
52 |
|
53 /* The mar program is compiled as a host bin so we don't have access to NSPR at |
|
54 runtime. For that reason we use ntohl, htonl, and define HOST_TO_NETWORK64 |
|
55 instead of the NSPR equivalents. */ |
|
56 #ifdef XP_WIN |
|
57 #include <winsock2.h> |
|
58 #define ftello _ftelli64 |
|
59 #define fseeko _fseeki64 |
|
60 #else |
|
61 #define _FILE_OFFSET_BITS 64 |
|
62 #include <netinet/in.h> |
|
63 #include <unistd.h> |
|
64 #endif |
|
65 |
|
66 #include <stdio.h> |
|
67 |
|
68 #define HOST_TO_NETWORK64(x) ( \ |
|
69 ((((uint64_t) x) & 0xFF) << 56) | \ |
|
70 ((((uint64_t) x) >> 8) & 0xFF) << 48) | \ |
|
71 (((((uint64_t) x) >> 16) & 0xFF) << 40) | \ |
|
72 (((((uint64_t) x) >> 24) & 0xFF) << 32) | \ |
|
73 (((((uint64_t) x) >> 32) & 0xFF) << 24) | \ |
|
74 (((((uint64_t) x) >> 40) & 0xFF) << 16) | \ |
|
75 (((((uint64_t) x) >> 48) & 0xFF) << 8) | \ |
|
76 (((uint64_t) x) >> 56) |
|
77 #define NETWORK_TO_HOST64 HOST_TO_NETWORK64 |
|
78 |
|
79 #endif /* MAR_PRIVATE_H__ */ |