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);
}
Example #2
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);
}