mirror of
https://github.com/bettse/seader.git
synced 2026-03-29 16:39:57 +00:00
Add SIO parsing from iceman/evildaemond talk
This commit is contained in:
60
lib/asn1/Key.c
Normal file
60
lib/asn1/Key.c
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Seader"
|
||||
* found in "seader.asn1"
|
||||
* `asn1c -D ./lib/asn1 -no-gen-example -no-gen-OER -no-gen-PER -pdu=all`
|
||||
*/
|
||||
|
||||
#include "Key.h"
|
||||
|
||||
asn_TYPE_member_t asn_MBR_Key_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Key, referenceId),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0,
|
||||
{ 0, 0, 0 },
|
||||
0, 0, /* No default value */
|
||||
"referenceId"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct Key, crypto),
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
|
||||
0,
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0,
|
||||
{ 0, 0, 0 },
|
||||
0, 0, /* No default value */
|
||||
"crypto"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_Key_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_Key_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 1, 0, 0 }, /* crypto */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 } /* referenceId */
|
||||
};
|
||||
asn_SEQUENCE_specifics_t asn_SPC_Key_specs_1 = {
|
||||
sizeof(struct Key),
|
||||
offsetof(struct Key, _asn_ctx),
|
||||
asn_MAP_Key_tag2el_1,
|
||||
2, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* First extension addition */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_Key = {
|
||||
"Key",
|
||||
"Key",
|
||||
&asn_OP_SEQUENCE,
|
||||
asn_DEF_Key_tags_1,
|
||||
sizeof(asn_DEF_Key_tags_1)
|
||||
/sizeof(asn_DEF_Key_tags_1[0]), /* 1 */
|
||||
asn_DEF_Key_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_Key_tags_1)
|
||||
/sizeof(asn_DEF_Key_tags_1[0]), /* 1 */
|
||||
{ 0, 0, SEQUENCE_constraint },
|
||||
asn_MBR_Key_1,
|
||||
2, /* Elements count */
|
||||
&asn_SPC_Key_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
41
lib/asn1/Key.h
Normal file
41
lib/asn1/Key.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Seader"
|
||||
* found in "seader.asn1"
|
||||
* `asn1c -D ./lib/asn1 -no-gen-example -no-gen-OER -no-gen-PER -pdu=all`
|
||||
*/
|
||||
|
||||
#ifndef _Key_H_
|
||||
#define _Key_H_
|
||||
|
||||
|
||||
#include <asn_application.h>
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Key */
|
||||
typedef struct Key {
|
||||
OCTET_STRING_t referenceId;
|
||||
OCTET_STRING_t crypto;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} Key_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_Key;
|
||||
extern asn_SEQUENCE_specifics_t asn_SPC_Key_specs_1;
|
||||
extern asn_TYPE_member_t asn_MBR_Key_1[2];
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _Key_H_ */
|
||||
#include <asn_internal.h>
|
||||
50
lib/asn1/PACS.c
Normal file
50
lib/asn1/PACS.c
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Seader"
|
||||
* found in "seader.asn1"
|
||||
* `asn1c -D ./lib/asn1 -no-gen-example -no-gen-OER -no-gen-PER -pdu=all`
|
||||
*/
|
||||
|
||||
#include "PACS.h"
|
||||
|
||||
asn_TYPE_member_t asn_MBR_PACS_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct PACS, payload),
|
||||
(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0,
|
||||
{ 0, 0, 0 },
|
||||
0, 0, /* No default value */
|
||||
"payload"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_PACS_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_PACS_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 0, 0, 0 } /* payload */
|
||||
};
|
||||
asn_SEQUENCE_specifics_t asn_SPC_PACS_specs_1 = {
|
||||
sizeof(struct PACS),
|
||||
offsetof(struct PACS, _asn_ctx),
|
||||
asn_MAP_PACS_tag2el_1,
|
||||
1, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* First extension addition */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_PACS = {
|
||||
"PACS",
|
||||
"PACS",
|
||||
&asn_OP_SEQUENCE,
|
||||
asn_DEF_PACS_tags_1,
|
||||
sizeof(asn_DEF_PACS_tags_1)
|
||||
/sizeof(asn_DEF_PACS_tags_1[0]), /* 1 */
|
||||
asn_DEF_PACS_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_PACS_tags_1)
|
||||
/sizeof(asn_DEF_PACS_tags_1[0]), /* 1 */
|
||||
{ 0, 0, SEQUENCE_constraint },
|
||||
asn_MBR_PACS_1,
|
||||
1, /* Elements count */
|
||||
&asn_SPC_PACS_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
40
lib/asn1/PACS.h
Normal file
40
lib/asn1/PACS.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Seader"
|
||||
* found in "seader.asn1"
|
||||
* `asn1c -D ./lib/asn1 -no-gen-example -no-gen-OER -no-gen-PER -pdu=all`
|
||||
*/
|
||||
|
||||
#ifndef _PACS_H_
|
||||
#define _PACS_H_
|
||||
|
||||
|
||||
#include <asn_application.h>
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* PACS */
|
||||
typedef struct PACS {
|
||||
OCTET_STRING_t payload;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} PACS_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_PACS;
|
||||
extern asn_SEQUENCE_specifics_t asn_SPC_PACS_specs_1;
|
||||
extern asn_TYPE_member_t asn_MBR_PACS_1[1];
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _PACS_H_ */
|
||||
#include <asn_internal.h>
|
||||
100
lib/asn1/SIO.c
Normal file
100
lib/asn1/SIO.c
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Seader"
|
||||
* found in "seader.asn1"
|
||||
* `asn1c -D ./lib/asn1 -no-gen-example -no-gen-OER -no-gen-PER -pdu=all`
|
||||
*/
|
||||
|
||||
#include "SIO.h"
|
||||
|
||||
static asn_TYPE_member_t asn_MBR_SIO_1[] = {
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct SIO, rid),
|
||||
(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0,
|
||||
{ 0, 0, 0 },
|
||||
0, 0, /* No default value */
|
||||
"rid"
|
||||
},
|
||||
{ ATF_POINTER, 1, offsetof(struct SIO, unknown3),
|
||||
(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_OCTET_STRING,
|
||||
0,
|
||||
{ 0, 0, 0 },
|
||||
0, 0, /* No default value */
|
||||
"unknown3"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct SIO, unknown5),
|
||||
(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
|
||||
+1, /* EXPLICIT tag at current level */
|
||||
&asn_DEF_NULL,
|
||||
0,
|
||||
{ 0, 0, 0 },
|
||||
0, 0, /* No default value */
|
||||
"unknown5"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct SIO, key),
|
||||
(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_Key,
|
||||
0,
|
||||
{ 0, 0, 0 },
|
||||
0, 0, /* No default value */
|
||||
"key"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct SIO, pacs),
|
||||
(ASN_TAG_CLASS_CONTEXT | (7 << 2)),
|
||||
-1, /* IMPLICIT tag at current level */
|
||||
&asn_DEF_PACS,
|
||||
0,
|
||||
{ 0, 0, 0 },
|
||||
0, 0, /* No default value */
|
||||
"pacs"
|
||||
},
|
||||
{ ATF_NOFLAGS, 0, offsetof(struct SIO, unknown9),
|
||||
(ASN_TAG_CLASS_CONTEXT | (9 << 2)),
|
||||
+1, /* EXPLICIT tag at current level */
|
||||
&asn_DEF_NULL,
|
||||
0,
|
||||
{ 0, 0, 0 },
|
||||
0, 0, /* No default value */
|
||||
"unknown9"
|
||||
},
|
||||
};
|
||||
static const ber_tlv_tag_t asn_DEF_SIO_tags_1[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||
};
|
||||
static const asn_TYPE_tag2member_t asn_MAP_SIO_tag2el_1[] = {
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* rid */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 }, /* unknown3 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 2, 0, 0 }, /* unknown5 */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 3, 0, 0 }, /* key */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 4, 0, 0 }, /* pacs */
|
||||
{ (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 5, 0, 0 } /* unknown9 */
|
||||
};
|
||||
static asn_SEQUENCE_specifics_t asn_SPC_SIO_specs_1 = {
|
||||
sizeof(struct SIO),
|
||||
offsetof(struct SIO, _asn_ctx),
|
||||
asn_MAP_SIO_tag2el_1,
|
||||
6, /* Count of tags in the map */
|
||||
0, 0, 0, /* Optional elements (not needed) */
|
||||
-1, /* First extension addition */
|
||||
};
|
||||
asn_TYPE_descriptor_t asn_DEF_SIO = {
|
||||
"SIO",
|
||||
"SIO",
|
||||
&asn_OP_SEQUENCE,
|
||||
asn_DEF_SIO_tags_1,
|
||||
sizeof(asn_DEF_SIO_tags_1)
|
||||
/sizeof(asn_DEF_SIO_tags_1[0]), /* 1 */
|
||||
asn_DEF_SIO_tags_1, /* Same as above */
|
||||
sizeof(asn_DEF_SIO_tags_1)
|
||||
/sizeof(asn_DEF_SIO_tags_1[0]), /* 1 */
|
||||
{ 0, 0, SEQUENCE_constraint },
|
||||
asn_MBR_SIO_1,
|
||||
6, /* Elements count */
|
||||
&asn_SPC_SIO_specs_1 /* Additional specs */
|
||||
};
|
||||
|
||||
46
lib/asn1/SIO.h
Normal file
46
lib/asn1/SIO.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
|
||||
* From ASN.1 module "Seader"
|
||||
* found in "seader.asn1"
|
||||
* `asn1c -D ./lib/asn1 -no-gen-example -no-gen-OER -no-gen-PER -pdu=all`
|
||||
*/
|
||||
|
||||
#ifndef _SIO_H_
|
||||
#define _SIO_H_
|
||||
|
||||
|
||||
#include <asn_application.h>
|
||||
|
||||
/* Including external dependencies */
|
||||
#include <OCTET_STRING.h>
|
||||
#include <NULL.h>
|
||||
#include "Key.h"
|
||||
#include "PACS.h"
|
||||
#include <constr_SEQUENCE.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* SIO */
|
||||
typedef struct SIO {
|
||||
OCTET_STRING_t rid;
|
||||
OCTET_STRING_t *unknown3 /* OPTIONAL */;
|
||||
NULL_t unknown5;
|
||||
Key_t key;
|
||||
PACS_t pacs;
|
||||
NULL_t unknown9;
|
||||
|
||||
/* Context for parsing across buffer boundaries */
|
||||
asn_struct_ctx_t _asn_ctx;
|
||||
} SIO_t;
|
||||
|
||||
/* Implementation */
|
||||
extern asn_TYPE_descriptor_t asn_DEF_SIO;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _SIO_H_ */
|
||||
#include <asn_internal.h>
|
||||
30
sam_api.c
30
sam_api.c
@@ -376,12 +376,14 @@ bool seader_unpack_pacs(Seader* seader, uint8_t* buf, size_t size) {
|
||||
asn_dec_rval_t rval = asn_decode(0, ATS_DER, &asn_DEF_PAC, (void**)&pac, buf, size);
|
||||
|
||||
if(rval.code == RC_OK) {
|
||||
#ifdef ASN1_DEBUG
|
||||
char pacDebug[384] = {0};
|
||||
(&asn_DEF_PAC)
|
||||
->op->print_struct(&asn_DEF_PAC, pac, 1, seader_print_struct_callback, pacDebug);
|
||||
if(strlen(pacDebug) > 0) {
|
||||
FURI_LOG_D(TAG, "Received pac: %s", pacDebug);
|
||||
}
|
||||
#endif
|
||||
|
||||
memset(display, 0, sizeof(display));
|
||||
if(seader_credential->sio[0] == 0x30) {
|
||||
@@ -389,6 +391,34 @@ bool seader_unpack_pacs(Seader* seader, uint8_t* buf, size_t size) {
|
||||
snprintf(display + (i * 2), sizeof(display), "%02x", seader_credential->sio[i]);
|
||||
}
|
||||
FURI_LOG_D(TAG, "SIO %s", display);
|
||||
|
||||
#ifdef ASN1_DEBUG
|
||||
SIO_t* sio = 0;
|
||||
sio = calloc(1, sizeof *sio);
|
||||
assert(sio);
|
||||
rval = asn_decode(
|
||||
0,
|
||||
ATS_DER,
|
||||
&asn_DEF_SIO,
|
||||
(void**)&sio,
|
||||
seader_credential->sio,
|
||||
seader_credential->sio_len);
|
||||
|
||||
if(rval.code == RC_OK) {
|
||||
FURI_LOG_D(TAG, "Decoded SIO");
|
||||
char sioDebug[384] = {0};
|
||||
(&asn_DEF_SIO)
|
||||
->op->print_struct(
|
||||
&asn_DEF_SIO, sio, 1, seader_print_struct_callback, sioDebug);
|
||||
if(strlen(sioDebug) > 0) {
|
||||
FURI_LOG_D(TAG, "SIO: %s", sioDebug);
|
||||
}
|
||||
} else {
|
||||
FURI_LOG_W(TAG, "Failed to decode SIO %d consumed", rval.consumed);
|
||||
}
|
||||
|
||||
ASN_STRUCT_FREE(asn_DEF_SIO, sio);
|
||||
#endif
|
||||
}
|
||||
|
||||
if(pac->size <= sizeof(seader_credential->credential)) {
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "protocol/rfal_picopass.h"
|
||||
|
||||
#include <Payload.h>
|
||||
#include <SIO.h>
|
||||
|
||||
#define ExternalApplicationA 0x44
|
||||
#define NFCInterface 0x14
|
||||
|
||||
20
seader.asn1
20
seader.asn1
@@ -88,4 +88,24 @@ SamVersion ::= SEQUENCE {
|
||||
type [2] IMPLICIT OCTET STRING
|
||||
}
|
||||
|
||||
-- Black Hate Asia 25: Dismantling-the-seos-protocol.
|
||||
|
||||
Key ::= SEQUENCE {
|
||||
referenceId [1] IMPLICIT OCTET STRING,
|
||||
crypto OCTET STRING
|
||||
}
|
||||
|
||||
PACS ::= SEQUENCE {
|
||||
payload [5] IMPLICIT OCTET STRING
|
||||
}
|
||||
|
||||
SIO ::= SEQUENCE {
|
||||
rid [1] IMPLICIT OCTET STRING,
|
||||
unknown3 [3] IMPLICIT OCTET STRING OPTIONAL,
|
||||
unknown5 [5] NULL,
|
||||
key [6] IMPLICIT Key,
|
||||
pacs [7] IMPLICIT PACS,
|
||||
unknown9 [9] NULL
|
||||
}
|
||||
|
||||
END
|
||||
|
||||
Reference in New Issue
Block a user