int ccn_parse_LinkAuthenticator(struct ccn_buf_decoder *d, struct ccn_parsed_Link *pl) { /* Implement with a single offset for the blob, CCN_PL_[BE]_PublisherDigest * and remember the DTAG value to indicate which type of digest it is */ if (ccn_buf_match_dtag(d, CCN_DTAG_LinkAuthenticator)) { ccn_buf_advance(d); // advance over DTAG token pl->offset[CCN_PL_B_LinkAuthenticator] = d->decoder.token_index; pl->offset[CCN_PL_B_PublisherID] = d->decoder.token_index; pl->offset[CCN_PL_B_PublisherDigest] = d->decoder.token_index; pl->offset[CCN_PL_E_PublisherDigest] = d->decoder.token_index; if (ccn_buf_match_dtag(d, CCN_DTAG_PublisherPublicKeyDigest) || ccn_buf_match_dtag(d, CCN_DTAG_PublisherCertificateDigest) || ccn_buf_match_dtag(d, CCN_DTAG_PublisherIssuerKeyDigest) || ccn_buf_match_dtag(d, CCN_DTAG_PublisherIssuerCertificateDigest)) { pl->publisher_digest_type = d->decoder.numval; // remember the DTAG ccn_buf_advance(d); // over the DTAG token if (!ccn_buf_match_some_blob(d)) return (d->decoder.state = -__LINE__); pl->offset[CCN_PL_B_PublisherDigest] = d->decoder.token_index; ccn_buf_advance(d); // over the digest pl->offset[CCN_PL_E_PublisherDigest] = d->decoder.token_index; ccn_buf_check_close(d); // over the DTAG closer } if (d->decoder.state < 0) return (d->decoder.state); pl->offset[CCN_PL_E_PublisherID] = d->decoder.token_index; /* parse optional NameComponentCount nonNegativeInteger */ pl->offset[CCN_PL_B_NameComponentCount] = d->decoder.token_index; pl->name_component_count = ccn_parse_optional_tagged_nonNegativeInteger(d, CCN_DTAG_NameComponentCount); pl->offset[CCN_PL_E_NameComponentCount] = d->decoder.token_index; /* parse optional Timestamp TimestampType */ pl->offset[CCN_PL_B_Timestamp] = d->decoder.token_index; if (ccn_buf_match_dtag(d, CCN_DTAG_Timestamp)) ccn_parse_required_tagged_timestamp(d, CCN_DTAG_Timestamp); pl->offset[CCN_PL_E_Timestamp] = d->decoder.token_index; /* parse optional Type ContentType */ pl->offset[CCN_PL_B_Type] = d->decoder.token_index; pl->type = ccn_parse_optional_tagged_binary_number(d, CCN_DTAG_Type, 3, 3, CCN_CONTENT_DATA); pl->offset[CCN_PL_E_Type] = d->decoder.token_index; /* parse optional ContentDigest Base64BinaryType */ pl->offset[CCN_PL_B_ContentDigest] = d->decoder.token_index; ccn_parse_optional_tagged_BLOB(d, CCN_DTAG_ContentDigest, 32, 32); pl->offset[CCN_PL_E_ContentDigest] = d->decoder.token_index; ccn_buf_check_close(d); pl->offset[CCN_PL_E_LinkAuthenticator] = d->decoder.token_index; } else d->decoder.state = -__LINE__; if (!CCN_FINAL_DSTATE(d->decoder.state)) return (CCN_DSTATE_ERR_CODING); return(0); }
static int ccn_parse_SignedInfo(struct ccn_buf_decoder *d, struct ccn_parsed_ContentObject *x) { x->offset[CCN_PCO_B_SignedInfo] = d->decoder.token_index; if (ccn_buf_match_dtag(d, CCN_DTAG_SignedInfo)) { ccn_buf_advance(d); x->offset[CCN_PCO_B_PublisherPublicKeyDigest] = d->decoder.token_index; ccn_parse_required_tagged_BLOB(d, CCN_DTAG_PublisherPublicKeyDigest, 16, 64); x->offset[CCN_PCO_E_PublisherPublicKeyDigest] = d->decoder.token_index; x->offset[CCN_PCO_B_Timestamp] = d->decoder.token_index; ccn_parse_required_tagged_timestamp(d, CCN_DTAG_Timestamp); x->offset[CCN_PCO_E_Timestamp] = d->decoder.token_index; x->offset[CCN_PCO_B_Type] = d->decoder.token_index; x->type = CCN_CONTENT_DATA; x->type = ccn_parse_optional_tagged_binary_number(d, CCN_DTAG_Type, 3, 3, CCN_CONTENT_DATA); x->offset[CCN_PCO_E_Type] = d->decoder.token_index; x->offset[CCN_PCO_B_FreshnessSeconds] = d->decoder.token_index; ccn_parse_optional_tagged_nonNegativeInteger(d, CCN_DTAG_FreshnessSeconds); x->offset[CCN_PCO_E_FreshnessSeconds] = d->decoder.token_index; x->offset[CCN_PCO_B_FinalBlockID] = d->decoder.token_index; ccn_parse_optional_tagged_BLOB(d, CCN_DTAG_FinalBlockID, 1, -1); x->offset[CCN_PCO_E_FinalBlockID] = d->decoder.token_index; x->offset[CCN_PCO_B_KeyLocator] = d->decoder.token_index; x->offset[CCN_PCO_B_Key_Certificate_KeyName] = d->decoder.token_index; x->offset[CCN_PCO_E_Key_Certificate_KeyName] = d->decoder.token_index; x->offset[CCN_PCO_B_KeyName_Name] = d->decoder.token_index; x->offset[CCN_PCO_E_KeyName_Name] = d->decoder.token_index; x->offset[CCN_PCO_B_KeyName_Pub] = d->decoder.token_index; x->offset[CCN_PCO_E_KeyName_Pub] = d->decoder.token_index; if (ccn_buf_match_dtag(d, CCN_DTAG_KeyLocator)) { ccn_buf_advance(d); x->offset[CCN_PCO_B_Key_Certificate_KeyName] = d->decoder.token_index; if (ccn_buf_match_dtag(d, CCN_DTAG_Key)) { (void)ccn_parse_required_tagged_BLOB(d, CCN_DTAG_Key, 0, -1); } else if (ccn_buf_match_dtag(d, CCN_DTAG_Certificate)) { (void)ccn_parse_required_tagged_BLOB(d, CCN_DTAG_Certificate, 0, -1); } else { struct parsed_KeyName keyname = {-1, -1, -1, -1}; if (ccn_parse_KeyName(d, &keyname) >= 0) { if (keyname.Name >= 0) { x->offset[CCN_PCO_B_KeyName_Name] = keyname.Name; x->offset[CCN_PCO_E_KeyName_Name] = keyname.endName; } if (keyname.PublisherID >= 0) { x->offset[CCN_PCO_B_KeyName_Pub] = keyname.PublisherID; x->offset[CCN_PCO_E_KeyName_Pub] = keyname.endPublisherID; } } } x->offset[CCN_PCO_E_Key_Certificate_KeyName] = d->decoder.token_index; ccn_buf_check_close(d); } x->offset[CCN_PCO_E_KeyLocator] = d->decoder.token_index; ccn_buf_check_close(d); } else d->decoder.state = -__LINE__; x->offset[CCN_PCO_E_SignedInfo] = d->decoder.token_index; if (d->decoder.state < 0) return (d->decoder.state); return(0); }