ndn_Error ndn_decodeTlvSignatureInfo (struct ndn_Signature *signatureInfo, struct ndn_TlvDecoder *decoder) { ndn_Error error; size_t beginOffset; size_t endOffset; uint64_t signatureType; int gotExpectedType; ndn_Signature_clear(signatureInfo); beginOffset = decoder->offset; if ((error = ndn_TlvDecoder_readNestedTlvsStart (decoder, ndn_Tlv_SignatureInfo, &endOffset))) return error; if ((error = ndn_TlvDecoder_readNonNegativeIntegerTlv (decoder, ndn_Tlv_SignatureType, &signatureType))) return error; if (signatureType == ndn_Tlv_SignatureType_SignatureSha256WithRsa || signatureType == ndn_Tlv_SignatureType_SignatureSha256WithEcdsa || signatureType == ndn_Tlv_SignatureType_SignatureHmacWithSha256) { // Assume that the ndn_SignatureType enum has the same values as the TLV // signature types. signatureInfo->type = signatureType; if ((error = ndn_decodeTlvKeyLocator (ndn_Tlv_KeyLocator, &signatureInfo->keyLocator, decoder))) return error; if ((error = ndn_TlvDecoder_peekType (decoder, ndn_Tlv_ValidityPeriod_ValidityPeriod, endOffset, &gotExpectedType))) return error; if (gotExpectedType) { if ((error = decodeValidityPeriod(&signatureInfo->validityPeriod, decoder))) return error; } } else if (signatureType == ndn_Tlv_SignatureType_DigestSha256) signatureInfo->type = ndn_SignatureType_DigestSha256Signature; else { signatureInfo->type = ndn_SignatureType_Generic; signatureInfo->genericTypeCode = signatureType; // Get the bytes of the SignatureInfo TLV. if ((error = ndn_TlvDecoder_getSlice (decoder, beginOffset, endOffset, &signatureInfo->signatureInfoEncoding))) return error; } if ((error = ndn_TlvDecoder_finishNestedTlvs(decoder, endOffset))) return error; return NDN_ERROR_success; }
static ndn_Error decodeSelectors(struct ndn_Interest *interest, struct ndn_TlvDecoder *decoder) { ndn_Error error; size_t endOffset; int gotExpectedType; if ((error = ndn_TlvDecoder_readNestedTlvsStart(decoder, ndn_Tlv_Selectors, &endOffset))) return error; if ((error = ndn_TlvDecoder_readOptionalNonNegativeIntegerTlv (decoder, ndn_Tlv_MinSuffixComponents, endOffset, &interest->minSuffixComponents))) return error; if ((error = ndn_TlvDecoder_readOptionalNonNegativeIntegerTlv (decoder, ndn_Tlv_MaxSuffixComponents, endOffset, &interest->maxSuffixComponents))) return error; if ((error = ndn_TlvDecoder_peekType (decoder, ndn_Tlv_PublisherPublicKeyLocator, endOffset, &gotExpectedType))) return error; if (gotExpectedType) { if ((error = ndn_decodeTlvKeyLocator (ndn_Tlv_PublisherPublicKeyLocator, &interest->keyLocator, decoder))) return error; } else // Clear the key locator. ndn_KeyLocator_initialize(&interest->keyLocator, interest->keyLocator.keyName.components, interest->keyLocator.keyName.maxComponents); if ((error = ndn_TlvDecoder_peekType(decoder, ndn_Tlv_Exclude, endOffset, &gotExpectedType))) return error; if (gotExpectedType) { if ((error = decodeExclude(&interest->exclude, decoder))) return error; } else interest->exclude.nEntries = 0; if ((error = ndn_TlvDecoder_readOptionalNonNegativeIntegerTlv (decoder, ndn_Tlv_ChildSelector, endOffset, &interest->childSelector))) return error; if ((error = ndn_TlvDecoder_readBooleanTlv (decoder, ndn_Tlv_MustBeFresh, endOffset, &interest->mustBeFresh))) return error; if ((error = ndn_TlvDecoder_finishNestedTlvs(decoder, endOffset))) return error; return NDN_ERROR_success; }