@blueid/access-proto 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/BlueCore.proto ADDED
@@ -0,0 +1,841 @@
1
+ syntax = "proto2";
2
+
3
+ import "nanopb.proto";
4
+
5
+ ///////////////////////////////////////////////////////////////////////
6
+ // Shared demo keys
7
+ ///////////////////////////////////////////////////////////////////////
8
+
9
+ message BlueSharedDemoData {
10
+ required string deviceId = 1
11
+ [ (nanopb).max_length = 8, default = "wa0y1YwS" ];
12
+ required bytes terminalPrivateKey = 2 [
13
+ (nanopb).max_size = 160,
14
+ default = "\x30\x81\x87\x02\x01\x00\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02"
15
+ "\x01\x06\x08\x2a\x86\x48\xce\x3d\x03\x01\x07\x04\x6d\x30\x6b\x02"
16
+ "\x01\x01\x04\x20\xa5\xab\x6d\x14\x11\x30\x47\xa7\xad\x6c\x10\xe4"
17
+ "\x4d\xe6\x3c\x05\xb9\x6b\x84\xb5\x1f\xe3\x14\xd6\x87\x5c\x46\x9e"
18
+ "\xb9\xcd\x69\x2b\xa1\x44\x03\x42\x00\x04\x3a\x66\x86\x75\xc9\x29"
19
+ "\x29\x07\xc3\x63\x18\x97\x4d\xd9\x44\x1c\x71\xf9\xe4\x45\xe8\x74"
20
+ "\x1a\x3f\xaf\x6b\xc5\x8c\x9c\x69\x13\xbe\x44\x14\x0b\x60\x45\x4f"
21
+ "\x76\x2f\xc2\xf1\x98\x41\x98\xec\x6e\x39\x1b\x53\x36\x8b\x90\x73"
22
+ "\xea\x1d\xe7\x20\xcf\xa1\xbe\x2d\xd4\xf1"
23
+ ];
24
+ required bytes terminalPublicKey = 3 [
25
+ (nanopb).max_size = 100,
26
+ default = "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a"
27
+ "\x86\x48\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x3a\x66\x86\x75\xc9"
28
+ "\x29\x29\x07\xc3\x63\x18\x97\x4d\xd9\x44\x1c\x71\xf9\xe4\x45\xe8"
29
+ "\x74\x1a\x3f\xaf\x6b\xc5\x8c\x9c\x69\x13\xbe\x44\x14\x0b\x60\x45"
30
+ "\x4f\x76\x2f\xc2\xf1\x98\x41\x98\xec\x6e\x39\x1b\x53\x36\x8b\x90"
31
+ "\x73\xea\x1d\xe7\x20\xcf\xa1\xbe\x2d\xd4\xf1"
32
+ ];
33
+ // --
34
+ required bytes signaturePrivateKey = 4 [
35
+ (nanopb).max_size = 160,
36
+ default = "\x30\x81\x87\x02\x01\x00\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02"
37
+ "\x01\x06\x08\x2a\x86\x48\xce\x3d\x03\x01\x07\x04\x6d\x30\x6b\x02"
38
+ "\x01\x01\x04\x20\xef\x36\x55\xc9\x4d\x80\x1e\xf4\x92\x56\x75\x0e"
39
+ "\x70\xe1\x51\x0e\xcc\xe8\xb4\x6c\x54\x5e\x55\x1d\xde\xbb\xfc\x6f"
40
+ "\x22\xa8\x49\x50\xa1\x44\x03\x42\x00\x04\x5a\x0d\x6e\x67\x45\xcc"
41
+ "\xd5\xc1\x8c\xeb\xd8\xaf\xf6\xea\x86\xd8\xc3\xaf\x43\x3f\xb7\xa2"
42
+ "\xd2\x5f\x21\x34\x42\xd4\xcd\x96\x83\xb4\xe6\x7d\x2d\xdc\x25\xeb"
43
+ "\x53\xf9\x12\x76\x1e\x40\xe6\xc9\x99\x83\xdd\x90\x90\xfe\xf0\xb4"
44
+ "\x25\x99\xcd\x16\xae\x39\x2f\xcf\x96\x43"
45
+ ];
46
+ required bytes signaturePublicKey = 5 [
47
+ (nanopb).max_size = 100,
48
+ default = "\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a"
49
+ "\x86\x48\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x5a\x0d\x6e\x67\x45"
50
+ "\xcc\xd5\xc1\x8c\xeb\xd8\xaf\xf6\xea\x86\xd8\xc3\xaf\x43\x3f\xb7"
51
+ "\xa2\xd2\x5f\x21\x34\x42\xd4\xcd\x96\x83\xb4\xe6\x7d\x2d\xdc\x25"
52
+ "\xeb\x53\xf9\x12\x76\x1e\x40\xe6\xc9\x99\x83\xdd\x90\x90\xfe\xf0"
53
+ "\xb4\x25\x99\xcd\x16\xae\x39\x2f\xcf\x96\x43"
54
+ ];
55
+ }
56
+
57
+ ///////////////////////////////////////////////////////////////////////
58
+ // Base types
59
+ ///////////////////////////////////////////////////////////////////////
60
+
61
+ enum BlueReturnCode {
62
+ //
63
+ // Success results
64
+ //
65
+ Ok = 0;
66
+ Pending = 1;
67
+
68
+ //
69
+ // General errors
70
+ //
71
+ Error = -1;
72
+ InvalidArguments = -3;
73
+ InvalidState = -4;
74
+ NotSupported = -5;
75
+ EOF = -6;
76
+ Overflow = -7;
77
+ StorageFull = -8;
78
+ InvalidCrc = -9;
79
+ InvalidMemoryAddress = -10;
80
+ VersionMissmatch = -11;
81
+ InvalidSignature = -12;
82
+ InvalidValidity = -13;
83
+ CryptLibraryFailed = -14;
84
+ NotFound = -16;
85
+ AlreadyExists = -17;
86
+ Timeout = -18;
87
+ Disconnected = -19;
88
+ PointerConversionFailed = -20;
89
+ Unavailable = -21;
90
+
91
+ Test = -29;
92
+
93
+ //
94
+ // Misc specific errors
95
+ //
96
+
97
+ EncodeDataWriteFailed = -30;
98
+ EncodeDataWriteNothingWritten = -31;
99
+ DecodeDataReadFailed = -32;
100
+ BleInvalidCompanyIdentifier = -33;
101
+ InvalidSystemConfig = -34;
102
+ InvalidProvisioning = -35;
103
+ InvalidTransponder = -104;
104
+ BleServiceNotFound = -105;
105
+ BleCharacteristicNotFound = -106;
106
+ BleFailSetCharacteristicNotify = -107;
107
+
108
+ //
109
+ // Nfc Transponder errors
110
+ //
111
+
112
+ NfcTransponderNoResult = -100;
113
+ NfcTransponderCommandError = -101;
114
+ NfcTransponderStorageFull = -102;
115
+ NfcTransponderAuthenticateFailed = -103;
116
+
117
+ //
118
+ // SP Errors
119
+ //
120
+ SPInvalidSalt = -150;
121
+ SPFailedHashing = -151;
122
+ SPFailedSigning = -152;
123
+ SPFailedGetOwnSalt = -153;
124
+ SPFailedSetPeerSalt = -154;
125
+ SPFailedEncrypt = -155;
126
+ SPFailedDecrypt = -156;
127
+ SPFailedGetCurrentTime = -157;
128
+ SPFailedSignature = -158;
129
+ SPErrorStatusCode = -170;
130
+
131
+ //
132
+ // Oss errors
133
+ //
134
+
135
+ OssInvalidCredentialId = -200;
136
+
137
+ OssMaFailedMcpLib = -201;
138
+
139
+ OssSoIncompatibleMajorVersion = -230;
140
+ OssSoInvalidCredentialType = -231;
141
+ OssSoInvalidTimestamp = -233;
142
+ OssSoInvalidTimeperiod = -234;
143
+ OssSoInvalidSiteId = -235;
144
+ OssSoInvalidDoorAccessBy = -236;
145
+ OssSoInvalidDoorDTScheduleNumber = -237;
146
+ OssSoTimePeriodsCountMissmatch = -238;
147
+ OssSoInvalidDTScheduleNumber = -239;
148
+ OssSoEventIdNotSupportedForWrite = -242;
149
+ OssSoExtensionFileSizeTooLarge = -243;
150
+ OssSoExtensionFileSizeInvalid = -244;
151
+ OssSoExtensionTooManyFeatures = -245;
152
+ OssSoExtensionValueTooLarge = -246;
153
+ OssSoInvalidExtensionLength = -247;
154
+ OssSoInvalidExtensionTag = -248;
155
+ OssSoMaxEventEntriesExceeded = -249;
156
+ OssSoMaxBlacklistEntriesExceeded = -250;
157
+
158
+ OssSidIncompatibleMajorVersion = -280;
159
+ OssSidInvalidCredentialType = -281;
160
+
161
+ //
162
+ // Mifare Desfire errors
163
+ //
164
+ MifareDesfireWrongKeyType = -300;
165
+ MifareDesfireWrongKey = -301;
166
+ MifareDesfireCmacNotReceived = -302;
167
+ MifareDesfireCmacNotVerified = -303;
168
+ MifareDesfireNoneOrInvalidAid = -304;
169
+
170
+ //
171
+ // Everything after here equals OssMaIoReturnCode codes; to gather the
172
+ // original OssMaIoReturnCode code simply do OssMAReturnCodeStart - returnCode
173
+ //
174
+
175
+ OssMAReturnCodeStart = -1000;
176
+ OssMAReturnCodeEnd = -1100;
177
+ }
178
+
179
+ message BlueVersionInfo {
180
+ required uint32 buildTime = 1;
181
+ required uint32 version = 2;
182
+ }
183
+
184
+ message BlueLocalTimestamp {
185
+ required uint32 year = 1;
186
+ required uint32 month = 2;
187
+ required uint32 date = 3;
188
+ required uint32 hours = 4;
189
+ required uint32 minutes = 5;
190
+ required uint32 seconds = 6 [ default = 0 ];
191
+ }
192
+
193
+ message BlueLocalTimeperiod {
194
+ required uint32 hoursFrom = 1;
195
+ required uint32 minutesFrom = 2;
196
+ required uint32 hoursTo = 3;
197
+ required uint32 minutesTo = 4;
198
+ }
199
+
200
+ enum BlueTimeUnit {
201
+ Seconds = 1;
202
+ Minutes = 2;
203
+ Hours = 3;
204
+ Days = 4;
205
+ Months = 5;
206
+ Years = 6;
207
+ }
208
+
209
+ // Those may never be changed
210
+ enum BlueWeekday {
211
+ Monday = 0;
212
+ Tuesday = 1;
213
+ Wednesday = 2;
214
+ Thursday = 3;
215
+ Friday = 4;
216
+ Saturday = 5;
217
+ Sunday = 6;
218
+ };
219
+
220
+ message BlueLocalTimeSchedule {
221
+ // Day of year is always 1-366, to spawn whole year make 1->366
222
+ required uint32 dayOfYearStart = 1;
223
+ required uint32 dayOfYearEnd = 2;
224
+ // See BlueWeekday -> byte 0 = Monday, etc.
225
+ required bytes weekdays = 3
226
+ [ (nanopb).max_size = 7, (nanopb).fixed_length = true ];
227
+ required BlueLocalTimeperiod timePeriod = 4;
228
+ }
229
+
230
+ message BlueCredentialId {
231
+ required string id = 1 [ (nanopb).max_length = 10 ];
232
+ }
233
+
234
+ message BlueBlacklistEntry {
235
+ required BlueCredentialId credentialId = 1;
236
+ required BlueLocalTimestamp expiresAt = 2;
237
+ }
238
+
239
+ enum BlueAccessType {
240
+ /* Access with default unlock time */
241
+ DefaultTime = 1;
242
+ /* Access with extended unlock time */
243
+ ExtendedTime = 2;
244
+ /* Access with custom unlock time */
245
+ CustomTime = 3;
246
+ /* Access with toggle function */
247
+ Toggle = 4;
248
+ /* Access and close the lock */
249
+ Close = 5;
250
+ /* No access */
251
+ NoAccess = 6;
252
+ /* No access due validity */
253
+ NoAccessValidity = 7;
254
+ /* No access due blacklisted */
255
+ NoAccessBlacklisted = 8;
256
+ };
257
+
258
+ enum BlueTransponderType {
259
+ UnknownTransponder = 0;
260
+ MobileTransponder = 1;
261
+ MifareDesfire = 2;
262
+ }
263
+
264
+ enum BlueHardwareType {
265
+ UnknownHardware = 0;
266
+ TestHardware = 1;
267
+ Gateway = 2;
268
+ CylinderLock = 3;
269
+ WallReader = 4;
270
+ Kiosk = 5;
271
+ }
272
+
273
+ enum BlueBatteryLevel {
274
+ UnknownBattery = 0;
275
+ OnPower = 1;
276
+ GoodPower = 10;
277
+ LowPower = 11;
278
+ CriticalPower = 12;
279
+ AlmostEmpty = 13;
280
+ // 0% (100) - 100% (200)
281
+ FullyDischarged = 100;
282
+ FullyCharged = 200;
283
+ }
284
+
285
+ message BlueBleManufacturerInfo {
286
+ required BlueHardwareType hardwareType = 1;
287
+ required BlueBatteryLevel batteryLevel = 2;
288
+ required uint32 applicationVersion = 3;
289
+ required uint32 localMidnightTimeEpoch = 4;
290
+ }
291
+
292
+ message BlueBleAdvertisementInfo {
293
+ // Unique device id becomes the local name
294
+ required string deviceId = 1 [ (nanopb).max_length = 8 ];
295
+ // The advertised tx power level at 1 meter in decibel (-XX - +XX)
296
+ required int32 txPower1Meter = 2;
297
+ // If set generates iBeacon format otherwise generates regular ble adv data
298
+ required bool isIBeacon = 3;
299
+ // The manufacturer information
300
+ required BlueBleManufacturerInfo mfInfo = 4;
301
+ }
302
+
303
+ ///////////////////////////////////////////////////////////////////////
304
+ // Event
305
+ ///////////////////////////////////////////////////////////////////////
306
+
307
+ enum BlueEventId {
308
+ // Oss So events --
309
+
310
+ /** eventInfo = 0 */
311
+ BatteryLow = 0x01;
312
+ /** eventInfo = 0 */
313
+ BatteryReplaced = 0x02;
314
+ /** eventInfo = 0 */
315
+ LockJammed = 0x03;
316
+ /** eventInfo = BlueEventInfoSystem */
317
+ SystemEvent = 0x04;
318
+ /** eventInfo = 0 */
319
+ InternalError = 0x05;
320
+ /** eventInfo = 0 */
321
+ FailedToUnlock = 0x06;
322
+ /** eventInfo = 0 */
323
+ TamperingDetected = 0x07;
324
+ /** eventInfo = 0 */
325
+ BlacklistedCredentialDetected = 0x08;
326
+ /** eventInfo = 0 */
327
+ BlacklistFull = 0x09;
328
+ /** eventInfo = BlueEventInfoAccess */
329
+ AccessGranted = 0x0A;
330
+ /** eventInfo = BlueEventInfoAccess */
331
+ AccessDenied = 0x0B;
332
+ /** eventInfo = 0 */
333
+ CRCError = 0x0C;
334
+
335
+ MaxOssSoEventId = 0x0D;
336
+
337
+ // -- Oss So events
338
+
339
+ /** eventInfo = BlueReturnCode */
340
+ TerminalCommand = 0xE;
341
+ /** eventInfo = BlueReturnCode */
342
+ TerminalOss = 0xF;
343
+
344
+ /* Reserved 0x0C - 0xFF */
345
+ }
346
+
347
+ enum BlueEventInfoSystem {
348
+ // Oss So events --
349
+
350
+ SystemRestart = 0x01;
351
+ SystemConfigured = 0x2;
352
+
353
+ // -- Oss So events
354
+
355
+ /* Reserved 0x03 - 0x7F */
356
+
357
+ /* Proprietary 0x80 - 0xFF */
358
+ }
359
+
360
+ enum BlueEventInfoAccess {
361
+ // Oss So events --
362
+
363
+ Granted = 0x01;
364
+ GrantedDefaultTime = 0x02;
365
+ GrantedExtendedTime = 0x03;
366
+ GrantedToggleUnlock = 0x04;
367
+ GrantedToggleLock = 0x05;
368
+
369
+ // -- Oss So events
370
+
371
+ /* Reserved 0x06 - 0x7F */
372
+
373
+ // Oss So events --
374
+
375
+ Denied = 0x80;
376
+
377
+ /* Reserved 0x81 */
378
+
379
+ DeniedBlacklisted = 0x82;
380
+ DeniedValidity = 0x83;
381
+ DeniedDTSchedule = 0x84;
382
+
383
+ // -- Oss So events
384
+
385
+ /* Reserved 0x85 - 0xFF */
386
+ }
387
+
388
+ message BlueEvent {
389
+ required uint32 sequenceId = 1;
390
+
391
+ required BlueLocalTimestamp eventTime = 2;
392
+
393
+ required BlueEventId eventId = 4;
394
+
395
+ required int32 eventInfo = 5;
396
+
397
+ // Set if identity related
398
+ optional string identity = 6 [ (nanopb).max_length = 10 ];
399
+
400
+ // Set if eventId =
401
+ optional string command = 7 [ (nanopb).max_length = 8 ];
402
+ }
403
+
404
+ ///////////////////////////////////////////////////////////////////////
405
+ // Secure Protocol
406
+ ///////////////////////////////////////////////////////////////////////
407
+
408
+ message BlueSPHandshake {
409
+ required bytes transponderSalt = 1
410
+ [ (nanopb).max_size = 16, (nanopb).fixed_length = true ];
411
+ }
412
+
413
+ message BlueSPHandshakeReply {
414
+ required bytes terminalSalt = 1
415
+ [ (nanopb).max_size = 16, (nanopb).fixed_length = true ];
416
+ required bytes terminalSignature = 2 [ (nanopb).max_size = 74 ];
417
+ }
418
+
419
+ message BlueSPDataCommand {
420
+ required BlueCredentialId credentialId = 1;
421
+ required BlueLocalTimestamp validityStart = 2;
422
+ required BlueLocalTimestamp validityEnd = 3;
423
+ required string command = 4 [ (nanopb).max_length = 8 ];
424
+ required bytes data = 5
425
+ [ (nanopb).max_size = 1792 ]; // we'll add 256b for add. data
426
+ }
427
+
428
+ message BlueSPData {
429
+ required bytes signature = 1 [ (nanopb).max_size = 74 ];
430
+
431
+ oneof payload {
432
+ BlueSPDataCommand command = 2;
433
+ BlueOssSoMobile ossSo = 3;
434
+ BlueOssSidMobile ossSid = 4;
435
+ }
436
+ }
437
+
438
+ message BlueSPResult {
439
+ required bytes data = 1
440
+ [ (nanopb).max_size = 1792 ]; // we'll add 256b for add. data
441
+ }
442
+
443
+ ///////////////////////////////////////////////////////////////////////
444
+ // Oss shared types
445
+ ///////////////////////////////////////////////////////////////////////
446
+
447
+ enum BlueOssCredentialTypeSource {
448
+ Oss = 0;
449
+ Proprietary = 1;
450
+ }
451
+
452
+ message BlueOssAccessResult {
453
+ // If access is granted or not
454
+ required bool accessGranted = 1;
455
+ // The final access type
456
+ required BlueAccessType accessType = 2;
457
+ // If access type is a toggle then this specifies the time it should lock
458
+ // again
459
+ required BlueLocalTimestamp scheduleEndTime = 3;
460
+ // If access denied this marks if it was denied due a schedule missmatch
461
+ required bool scheduleMissmatch = 4;
462
+ }
463
+
464
+ ///////////////////////////////////////////////////////////////////////
465
+ // Oss Sid Standard
466
+ ///////////////////////////////////////////////////////////////////////
467
+
468
+ message BlueOssSidVersion {
469
+ optional uint32 versionMajor = 1 [ default = 1 ];
470
+ optional uint32 versionMinor = 2 [ default = 0 ];
471
+ }
472
+
473
+ message BlueOssSidCredentialTypeOss { optional bool notUsed = 1; }
474
+
475
+ message BlueOssSidCredentialTypeProprietary {
476
+ required bytes mfgCode = 1
477
+ [ (nanopb).max_size = 7, (nanopb).fixed_length = true ];
478
+ }
479
+
480
+ message BlueOssSidCredentialType {
481
+ required BlueOssCredentialTypeSource typeSource = 1;
482
+ optional BlueOssSidCredentialTypeOss oss = 2;
483
+ optional BlueOssSidCredentialTypeProprietary proprietary = 3;
484
+ }
485
+
486
+ message BlueOssSidFileInfo {
487
+ required uint32 versionMajor = 1;
488
+ required uint32 versionMinor = 2;
489
+ required BlueOssSidCredentialType credentialType = 3;
490
+ required BlueCredentialId credentialId = 4;
491
+ }
492
+
493
+ //
494
+ // Full Oss Sid configuration
495
+ //
496
+
497
+ message BlueOssSidConfiguration { required BlueOssSidFileInfo info = 1; }
498
+
499
+ //
500
+ // Oss Sid storage profile
501
+ //
502
+
503
+ message BlueOssSidStorageProfile {
504
+ required uint32 dataLength = 1;
505
+ required uint32 fileSize = 2;
506
+ required uint32 infoDataLength = 3;
507
+ required uint32 infoFileSize = 4;
508
+ }
509
+
510
+ //
511
+ // Oss Sid Provisioning
512
+ //
513
+
514
+ message BlueOssSidProvisioningConfiguration { optional bool notUsed = 1; }
515
+
516
+ message BlueOssSidProvisioningData {
517
+ // If not set, uses default from storage
518
+ optional BlueOssSidProvisioningConfiguration configuration = 1;
519
+ required BlueOssSidCredentialType credentialType = 2;
520
+ required BlueCredentialId credentialId = 3;
521
+ }
522
+
523
+ //
524
+ // Oss Sid mobile
525
+ //
526
+
527
+ message BlueOssSidMobile {
528
+ required bytes infoFile = 1 [ (nanopb).max_size = 32 ];
529
+ }
530
+
531
+ message BlueOssSidMobileProvisioningConfiguration {
532
+ optional bool notUsed = 1 [ default = false ];
533
+ }
534
+
535
+ //
536
+ // Oss Sid Mifare
537
+ //
538
+
539
+ // Default configuration from spec
540
+ message BlueOssSidMifareDesfireProvisioningConfiguration {
541
+ optional bool notUsed = 1 [ default = false ];
542
+ }
543
+
544
+ // Demo keys from spec
545
+ message BlueOssSidMifareDesfireConfiguration {
546
+ // The PICC master key, default is oss sid demo key
547
+ required bytes piccMasterKey = 1 [
548
+ (nanopb).max_size = 16,
549
+ default = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\xAA"
550
+ ];
551
+ // The oss application master key, default is oss sid demo key
552
+ required bytes appMasterKey = 2 [
553
+ (nanopb).max_size = 16,
554
+ default = "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xAA\xBB\xCC\xDD\xEE\xFF"
555
+ ];
556
+ // The oss project read key, default is oss sid demo key
557
+ required bytes projectKey = 3 [
558
+ (nanopb).max_size = 16,
559
+ default = "\xFF\xEE\xDD\xCC\xBB\xAA\x99\x88\x77\x66\x55\x44\x33\x22\x11\x00"
560
+ ];
561
+ // The oss application id, default is the oss sid default aid
562
+ required uint32 aid = 4 [ default = 16076801 ];
563
+ }
564
+
565
+ //
566
+ // Oss Sid Settings
567
+ //
568
+
569
+ message BlueOssSidSettings {
570
+ optional BlueOssSidMifareDesfireConfiguration mifareDesfireConfig = 1;
571
+ }
572
+
573
+ ///////////////////////////////////////////////////////////////////////
574
+ // Oss So Standard
575
+ ///////////////////////////////////////////////////////////////////////
576
+
577
+ message BlueOssSoVersion {
578
+ optional uint32 versionMajor = 1 [ default = 1 ];
579
+ optional uint32 versionMinor = 2 [ default = 1 ];
580
+ }
581
+
582
+ //
583
+ // Oss So Data Types
584
+ //
585
+
586
+ enum BlueOssSoCredentialTypeOssCredential {
587
+ Standard = 0;
588
+ InterventionMedia = 1;
589
+ }
590
+
591
+ message BlueOssSoCredentialTypeOss {
592
+ required BlueOssSoCredentialTypeOssCredential credential = 1;
593
+ }
594
+
595
+ message BlueOssSoCredentialTypeProprietary {
596
+ required bytes mfgCode = 1
597
+ [ (nanopb).max_size = 7, (nanopb).fixed_length = true ];
598
+ }
599
+
600
+ message BlueOssSoCredentialType {
601
+ required BlueOssCredentialTypeSource typeSource = 1;
602
+ optional BlueOssSoCredentialTypeOss oss = 2;
603
+ optional BlueOssSoCredentialTypeProprietary proprietary = 3;
604
+ }
605
+
606
+ message BlueOssSoDTScheduleDay {
607
+ // 0 = Monday -> 6 = Sunday (Matches BlueWeekday)
608
+ repeated bool weekdays = 1
609
+ [ (nanopb).max_count = 7, (nanopb).fixed_count = true ];
610
+
611
+ repeated BlueLocalTimeperiod timePeriods = 8 [ (nanopb).max_count = 4 ];
612
+ }
613
+
614
+ message BlueOssSoDTSchedule {
615
+ repeated BlueOssSoDTScheduleDay days = 1 [ (nanopb).max_count = 4 ];
616
+ }
617
+
618
+ enum BlueOssSoDoorInfoAccessBy {
619
+ DoorGroupId = 0;
620
+ DoorId = 1;
621
+ }
622
+
623
+ message BlueOssSoDoorInfo {
624
+ required uint32 id = 1;
625
+ required BlueOssSoDoorInfoAccessBy accessBy = 2;
626
+ required uint32 dtScheduleNumber = 3;
627
+ required BlueAccessType accessType = 4;
628
+ }
629
+
630
+ message BlueOssSoEvent {
631
+ required BlueLocalTimestamp eventTime = 1;
632
+ required uint32 doorId = 2;
633
+ required BlueEventId eventId = 3;
634
+
635
+ // If eventId = AccessGranted or AccessDenied -> BlueEventInfoAccess
636
+ // If eventId = SystemEvent -> BlueEventInfoSystem
637
+ // Otherwise unused
638
+ required uint32 eventInfo = 4;
639
+ }
640
+
641
+ message BlueOssSoExtFeature {
642
+ required uint32 tag = 1;
643
+ required bytes value = 2 [ (nanopb).max_size = 64 ];
644
+ }
645
+
646
+ message BlueOssSoExtFeature_ValidityStart {
647
+ required bool isValid = 1;
648
+ required BlueLocalTimestamp validityStartTime = 2;
649
+ }
650
+
651
+ //
652
+ // Oss So File types
653
+ //
654
+
655
+ enum BlueOssSoFileId {
656
+ Info = 0;
657
+ Data = 1;
658
+ Event = 2;
659
+ Blacklist = 3;
660
+ CustomerExtensions = 4;
661
+ }
662
+
663
+ message BlueOssSoFileInfo {
664
+ required uint32 versionMajor = 1;
665
+ required uint32 versionMinor = 2;
666
+ required BlueOssSoCredentialType credentialType = 3;
667
+ required BlueCredentialId credentialId = 4;
668
+ required uint32 maxEventEntries = 5;
669
+ required uint32 maxBlacklistEntries = 6;
670
+ }
671
+
672
+ message BlueOssSoFileData {
673
+ required BlueLocalTimestamp validity = 1;
674
+ required uint32 siteId = 2;
675
+ required uint32 numberOfDayIdsPerDTSchedule = 3;
676
+ required uint32 numberOfTimePeriodsPerDayId = 4;
677
+ required bool hasExtensions = 5;
678
+ repeated BlueOssSoDoorInfo doorInfoEntries = 6 [ (nanopb).max_count = 255 ];
679
+ repeated BlueOssSoDTSchedule dtSchedules = 7 [ (nanopb).max_count = 15 ];
680
+ }
681
+
682
+ message BlueOssSoFileEvent {
683
+ // TODO : max_count must always equal MaxOssSoEventId - 1
684
+ required bytes supportedEventIds = 1
685
+ [ (nanopb).max_size = 12, (nanopb).fixed_length = true ];
686
+ repeated BlueOssSoEvent events = 2 [ (nanopb).max_count = 255 ];
687
+ }
688
+
689
+ message BlueOssSoFileBlacklist {
690
+ repeated BlueBlacklistEntry entries = 1 [ (nanopb).max_count = 255 ];
691
+ }
692
+
693
+ message BlueOssSoFileCustomerExtensions {
694
+ repeated BlueOssSoExtFeature extFeatures = 1 [ (nanopb).max_count = 8 ];
695
+
696
+ //
697
+ // -- Known features --
698
+ //
699
+ optional BlueOssSoExtFeature_ValidityStart validityStart = 2;
700
+ }
701
+
702
+ //
703
+ // Full Oss So configuration
704
+ //
705
+
706
+ message BlueOssSoConfiguration {
707
+ optional BlueOssSoFileInfo info = 1;
708
+ optional BlueOssSoFileData data = 2;
709
+ optional BlueOssSoFileEvent event = 3;
710
+ optional BlueOssSoFileBlacklist blacklist = 4;
711
+ optional BlueOssSoFileCustomerExtensions customerExtensions = 5;
712
+ }
713
+
714
+ //
715
+ // Oss So storage profile
716
+ //
717
+
718
+ message BlueOssSoStorageProfile {
719
+ required uint32 dataLength = 1;
720
+ required uint32 fileSize = 2;
721
+ required uint32 infoDataLength = 3;
722
+ required uint32 infoFileSize = 4;
723
+ required uint32 dataDataLength = 5;
724
+ required uint32 dataFileSize = 6;
725
+ required uint32 eventDataLength = 7;
726
+ required uint32 eventFileSize = 8;
727
+ required uint32 blacklistDataLength = 9;
728
+ required uint32 blacklistFileSize = 10;
729
+ required uint32 customerExtensionsDataLength = 11;
730
+ required uint32 customerExtensionsFileSize = 12;
731
+ }
732
+
733
+ //
734
+ // Oss So Provisioning
735
+ //
736
+
737
+ message BlueOssSoProvisioningConfiguration {
738
+ required uint32 numberOfDoors = 1;
739
+ required uint32 numberOfDTSchedules = 2;
740
+ required uint32 numberOfDayIdsPerDTSchedule = 3;
741
+ required uint32 numberOfTimePeriodsPerDayId = 4;
742
+ required uint32 numberOfEvents = 5;
743
+ // TODO : max_count must always equal MaxOssSoEventId - 1
744
+ required bytes supportedEventIds = 6
745
+ [ (nanopb).max_size = 12, (nanopb).fixed_length = true ];
746
+ required uint32 numberOfBlacklistEntries = 7;
747
+ required uint32 customerExtensionsSize = 8;
748
+ }
749
+
750
+ message BlueOssSoProvisioningData {
751
+ // If not set, uses default from storage
752
+ optional BlueOssSoProvisioningConfiguration configuration = 1;
753
+ required BlueOssSoCredentialType credentialType = 2;
754
+ required BlueCredentialId credentialId = 3;
755
+ required uint32 siteId = 4;
756
+ }
757
+
758
+ //
759
+ // Oss So Mobile
760
+ //
761
+
762
+ message BlueOssSoMobile {
763
+ required bytes infoFile = 1 [ (nanopb).max_size = 32 ];
764
+ required bytes dataFile = 2 [ (nanopb).max_size = 291 ]; // 1 door
765
+ required bytes blacklistFile = 3 [ (nanopb).max_size = 257 ]; // 16 items max
766
+ required bytes customerExtensionsFile = 4 [ (nanopb).max_size = 32 ];
767
+ }
768
+
769
+ message BlueOssSoMobileProvisioningConfiguration {
770
+ required uint32 numberOfDoors = 1 [ default = 1 ];
771
+ required uint32 numberOfDTSchedules = 2 [ default = 1 ];
772
+ required uint32 numberOfDayIdsPerDTSchedule = 3 [ default = 4 ];
773
+ required uint32 numberOfTimePeriodsPerDayId = 4 [ default = 4 ];
774
+ required uint32 numberOfEvents = 5 [ default = 0 ];
775
+ // TODO : max_count must always equal MaxOssSoEventId - 1
776
+ required bytes supportedEventIds = 6
777
+ [ (nanopb).max_size = 12, (nanopb).fixed_length = true ];
778
+ required uint32 numberOfBlacklistEntries = 7 [ default = 16 ];
779
+ required uint32 customerExtensionsSize = 8 [ default = 32 ];
780
+ }
781
+
782
+ //
783
+ // Oss So Mifare
784
+ //
785
+
786
+ // Default configuration from spec plus customer extensions spacing
787
+ message BlueOssSoMifareDesfireProvisioningConfiguration {
788
+ required uint32 numberOfDoors = 1 [ default = 70 ];
789
+ required uint32 numberOfDTSchedules = 2 [ default = 1 ];
790
+ required uint32 numberOfDayIdsPerDTSchedule = 3 [ default = 4 ];
791
+ required uint32 numberOfTimePeriodsPerDayId = 4 [ default = 2 ];
792
+ required uint32 numberOfEvents = 5 [ default = 16 ];
793
+ // TODO : max_count must always equal MaxOssSoEventId - 1
794
+ required bytes supportedEventIds = 6 [
795
+ (nanopb).max_size = 12,
796
+ (nanopb).fixed_length = true,
797
+ default = "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
798
+ ];
799
+ required uint32 numberOfBlacklistEntries = 7 [ default = 3 ];
800
+ required uint32 customerExtensionsSize = 8 [ default = 16 ];
801
+ }
802
+
803
+ // Demo keys from spec
804
+ message BlueOssSoMifareDesfireConfiguration {
805
+ // The PICC master key, default is oss so demo key
806
+ required bytes piccMasterKey = 1 [
807
+ (nanopb).max_size = 16,
808
+ default = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\xAA"
809
+ ];
810
+ // The oss application master key, default is oss so demo key
811
+ required bytes appMasterKey = 2 [
812
+ (nanopb).max_size = 16,
813
+ default = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"
814
+ ];
815
+ // The oss project read/write key, default is oss so demo key
816
+ required bytes projectKey = 3 [
817
+ (nanopb).max_size = 16,
818
+ default = "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
819
+ ];
820
+ // The oss application id, default is the oss so default aid
821
+ required uint32 aid = 4 [ default = 16076800 ];
822
+ }
823
+
824
+ //
825
+ // Oss So Settings
826
+ //
827
+
828
+ message BlueOssSoSettings {
829
+ optional BlueOssSoMifareDesfireConfiguration mifareDesfireConfig = 1;
830
+ }
831
+
832
+ ///////////////////////////////////////////////////////////////////////
833
+ // Test types
834
+ ///////////////////////////////////////////////////////////////////////
835
+
836
+ message _BlueTestEncodeDecode {
837
+ required string vendor = 1 [ (nanopb).max_length = 32 ];
838
+ required string hardware_name = 2 [ (nanopb).max_length = 32 ];
839
+ required int32 hardware_version = 3;
840
+ required int32 application_version = 4;
841
+ }