1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.swid.builder.output;
28
29 import com.fasterxml.jackson.core.JsonGenerator;
30
31 import gov.nist.secauto.swid.builder.resource.firmware.DeviceIdentifier;
32 import gov.nist.secauto.swid.builder.resource.firmware.FirmwareBuilder;
33 import gov.nist.secauto.swid.builder.resource.firmware.FirmwarePayloadBuilder;
34 import gov.nist.secauto.swid.builder.resource.firmware.FirmwarePayloadDigest;
35 import gov.nist.secauto.swid.builder.resource.firmware.FirmwarePayloadPackage;
36
37 import java.io.IOException;
38 import java.util.List;
39 import java.util.Map;
40
41 public class CBORFirmwareOutputHandler extends JsonSupport {
42
43
44
45 private static final long FIRMWARE_MANIFEST_ID_FIELD = 63L;
46 private static final long FIRMWARE_MANIFEST_CREATION_TIMESTAMP = 64L;
47 private static final long FIRMWARE_MANIFEST_VERSION = 65L;
48 private static final long FIRMWARE_MANIFEST_DESCRIPTION = 66L;
49 private static final long FIRMWARE_MANIFEST_NONCE = 67L;
50
51
52
53
54 private static final long FIRMWARE_MANIFEST_TARGET_DEVICE_ID = 85L;
55
56 private static final long FIRMWARE_MANIFEST_PAYLOAD_ENTRY = 60L;
57 private static final long FIRMWARE_MANIFEST_SIMPLE_EXTENSIONS = 115L;
58
59 private static final long FIRMWARE_PAYLOAD_ID = 61L;
60 private static final long FIRMWARE_PAYLOAD_PACKAGE_ID = 62L;
61
62 private static final long FIRMWARE_PAYLOAD_FORMAT = 71L;
63 private static final long FIRMWARE_PAYLOAD_SIZE = 74L;
64
65
66 private static final long FIRMWARE_PAYLOAD_DIGESTS = 97L;
67
68
69 private static final long FIRMWARE_PAYLOAD_STORAGE_IDENTIFIER = 80L;
70
71
72
73
74
75
76
77
78
79 private static final long FIRMWARE_PAYLOAD_PACKAGE = 75L;
80
81
82
83
84
85
86 private static final long FIRMWARE_TARGET_DEVICE_IDENTIFIER_VENDOR = 86L;
87 private static final long FIRMWARE_TARGET_DEVICE_IDENTIFIER_TYPE = 87L;
88 private static final long FIRMWARE_TARGET_DEVICE_IDENTIFIER_MODEL = 88L;
89 private static final long FIRMWARE_TARGET_DEVICE_IDENTIFIER_CLASS = 89L;
90 private static final long FIRMWARE_TARGET_DEVICE_IDENTIFIER_RFC4122 = 90L;
91 private static final long FIRMWARE_TARGET_DEVICE_IDENTIFIER_IEEE802_1_AR = 91L;
92
93
94
95
96 private static final long FIRMWARE_PAYLOAD_FORMAT_TYPE = 72L;
97 private static final long FIRMWARE_PAYLOAD_FORMAT_GUIDANCE = 73L;
98
99
100
101
102 private static final long FIRMWARE_PAYLOAD_DIGEST_TYPE = 98L;
103 private static final long FIRMWARE_PAYLOAD_DIGEST_GUIDANCE = 99L;
104 private static final long FIRMWARE_PAYLOAD_DIGEST_VALUE = 100L;
105
106
107
108
109 private static final long FIRMWARE_PAYLOAD_PACKAGE_COMPRESSION_TYPE = 76L;
110 private static final long FIRMWARE_PAYLOAD_PACKAGE_COMPRESSION_GUIDANCE = 77L;
111 private static final long FIRMWARE_PAYLOAD_PACKAGE_VALUE = 78L;
112
113
114
115
116
117
118
119
120
121 public void generate(JsonGenerator generator, FirmwareBuilder builder) {
122 try {
123 generator.writeStartObject();
124
125 writeField(generator, FIRMWARE_MANIFEST_ID_FIELD, builder.getId());
126
127 writeDateTimeField(generator, FIRMWARE_MANIFEST_CREATION_TIMESTAMP, builder.getCreationTimestamp());
128
129 writeIntegerField(generator, FIRMWARE_MANIFEST_VERSION, builder.getVersion());
130
131 if (builder.getDescription() != null) {
132 writeTextField(generator, FIRMWARE_MANIFEST_DESCRIPTION, builder.getDescription());
133 }
134
135 writeBinaryField(generator, FIRMWARE_MANIFEST_NONCE, builder.getNonce());
136
137
138
139
140 writeDeviceIdentifier(generator, FIRMWARE_MANIFEST_TARGET_DEVICE_ID, builder.getTargetDeviceIdentifier());
141
142 List<FirmwarePayloadBuilder> payloads = builder.getPayloads();
143 if (!payloads.isEmpty()) {
144 generator.writeFieldId(FIRMWARE_MANIFEST_PAYLOAD_ENTRY);
145
146 if (payloads.size() == 1) {
147 generate(generator, payloads.iterator().next());
148 } else {
149 generator.writeStartArray();
150 for (FirmwarePayloadBuilder payload : payloads) {
151 generate(generator, payload);
152 }
153 generator.writeEndArray();
154 }
155 }
156
157 Map<Integer, byte[]> extensions = builder.getExtensions();
158 if (!extensions.isEmpty()) {
159 generator.writeFieldId(FIRMWARE_MANIFEST_SIMPLE_EXTENSIONS);
160 generator.writeStartObject();
161
162 for (Map.Entry<Integer, byte[]> entry : extensions.entrySet()) {
163 writeBinaryField(generator, entry.getKey(), entry.getValue());
164 }
165 generator.writeEndObject();
166 }
167
168 generator.writeEndObject();
169 } catch (IOException ex) {
170 throw new RuntimeException(ex);
171 }
172 }
173
174 private void generate(JsonGenerator generator, FirmwarePayloadBuilder builder) throws IOException {
175 generator.writeStartObject();
176
177 writeField(generator, FIRMWARE_PAYLOAD_ID, builder.getId());
178
179 if (builder.getPackageIdentifier() != null) {
180 writeTextField(generator, FIRMWARE_PAYLOAD_PACKAGE_ID, builder.getPackageIdentifier());
181 }
182
183 if (builder.getDescription() != null) {
184 writeTextField(generator, FIRMWARE_MANIFEST_DESCRIPTION, builder.getDescription());
185 }
186
187 {
188 generator.writeFieldId(FIRMWARE_PAYLOAD_FORMAT);
189 generator.writeStartObject();
190 writeIntegerField(generator, FIRMWARE_PAYLOAD_FORMAT_TYPE, builder.getFormatType());
191
192 if (builder.getFormatGuidance() != null) {
193 writeBinaryField(generator, FIRMWARE_PAYLOAD_FORMAT_GUIDANCE, builder.getFormatGuidance());
194 }
195 generator.writeEndObject();
196 }
197
198 writeIntegerField(generator, FIRMWARE_PAYLOAD_SIZE, builder.getSize());
199
200
201
202
203 List<FirmwarePayloadDigest> digests = builder.getDigests();
204 if (!digests.isEmpty()) {
205 generator.writeFieldId(FIRMWARE_PAYLOAD_DIGESTS);
206
207 generator.writeStartArray();
208 for (FirmwarePayloadDigest digest : digests) {
209 generate(generator, digest);
210 }
211 generator.writeEndArray();
212 }
213
214
215
216
217 writeField(generator, FIRMWARE_PAYLOAD_STORAGE_IDENTIFIER, builder.getStorageId());
218
219
220
221
222
223
224
225
226
227
228
229 if (builder.getFirmwarePackage() != null) {
230 writePayload(generator, FIRMWARE_PAYLOAD_PACKAGE, builder.getFirmwarePackage());
231 }
232
233
234
235 generator.writeEndObject();
236 }
237
238 private void generate(JsonGenerator generator, FirmwarePayloadDigest digest) throws IOException {
239 generator.writeStartObject();
240
241 writeIntegerField(generator, FIRMWARE_PAYLOAD_DIGEST_TYPE, digest.getType().getIndex());
242
243 if (digest.getGuidance() != null) {
244 writeBinaryField(generator, FIRMWARE_PAYLOAD_DIGEST_GUIDANCE, digest.getGuidance());
245 }
246
247 writeBinaryField(generator, FIRMWARE_PAYLOAD_DIGEST_VALUE, digest.getValue());
248 generator.writeEndObject();
249 }
250
251 private void writeDeviceIdentifier(JsonGenerator generator, long fieldId, DeviceIdentifier deviceIdentifier)
252 throws IOException {
253 generator.writeFieldId(fieldId);
254
255 generator.writeStartObject();
256
257 writeTextField(generator, FIRMWARE_TARGET_DEVICE_IDENTIFIER_VENDOR, deviceIdentifier.getVendor());
258
259 if (deviceIdentifier.getType() != null) {
260 writeTextField(generator, FIRMWARE_TARGET_DEVICE_IDENTIFIER_TYPE, deviceIdentifier.getType());
261 }
262
263 writeTextField(generator, FIRMWARE_TARGET_DEVICE_IDENTIFIER_MODEL, deviceIdentifier.getVendor());
264
265 if (deviceIdentifier.getClazz() != null) {
266 writeTextField(generator, FIRMWARE_TARGET_DEVICE_IDENTIFIER_CLASS, deviceIdentifier.getClazz());
267 }
268
269 if (deviceIdentifier.getRfc4122() != null) {
270 writeTextField(generator, FIRMWARE_TARGET_DEVICE_IDENTIFIER_RFC4122, deviceIdentifier.getRfc4122());
271 }
272
273 if (deviceIdentifier.getIeee8021ar() != null) {
274 writeBinaryField(generator, FIRMWARE_TARGET_DEVICE_IDENTIFIER_IEEE802_1_AR, deviceIdentifier.getIeee8021ar());
275 }
276
277 generator.writeEndObject();
278 }
279
280 private void writePayload(JsonGenerator generator, long fieldId, FirmwarePayloadPackage payload) throws IOException {
281 generator.writeFieldId(fieldId);
282
283 generator.writeStartObject();
284
285 if (payload.getCompressionType() != null) {
286 writeIntegerOrTextField(generator, FIRMWARE_PAYLOAD_PACKAGE_COMPRESSION_TYPE, payload.getCompressionType());
287 }
288
289 if (payload.getCompressionGuidance() != null) {
290 writeBinaryField(generator, FIRMWARE_PAYLOAD_PACKAGE_COMPRESSION_GUIDANCE, payload.getCompressionGuidance());
291 }
292 writeBinaryField(generator, FIRMWARE_PAYLOAD_PACKAGE_VALUE, payload.getPackageBytes());
293
294 generator.writeEndObject();
295 }
296 }