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 }