ndn_Error ndn_decodeTlvDelegationSet_Delegation (struct ndn_DelegationSet_Delegation *delegation, struct ndn_TlvDecoder *decoder) { ndn_Error error; size_t endOffset; size_t dummyBeginOffset, dummyEndOffset; uint64_t unsignedPreference; if ((error = ndn_TlvDecoder_readNestedTlvsStart (decoder, ndn_Tlv_Link_Delegation, &endOffset))) return error; if ((error = ndn_TlvDecoder_readNonNegativeIntegerTlv (decoder, ndn_Tlv_Link_Preference, &unsignedPreference))) return error; delegation->preference = (int)unsignedPreference; if ((error = ndn_decodeTlvName (&delegation->name, &dummyBeginOffset, &dummyEndOffset, decoder))) return error; if ((error = ndn_TlvDecoder_finishNestedTlvs(decoder, endOffset))) return error; return NDN_ERROR_success; }
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; }
void Node::RegisterResponse::operator()(const ptr_lib::shared_ptr<const Interest>& interest, const ptr_lib::shared_ptr<Data>& responseData) { // Decode responseData->getContent() and check for a success code. // TODO: Move this into the TLV code. struct ndn_TlvDecoder decoder; ndn_TlvDecoder_initialize (&decoder, responseData->getContent().buf(), responseData->getContent().size()); ndn_Error error; size_t endOffset; if ((error = ndn_TlvDecoder_readNestedTlvsStart (&decoder, ndn_Tlv_NfdCommand_ControlResponse, &endOffset))) { _LOG_DEBUG ("Register prefix failed: Error decoding the NFD response: " << ndn_getErrorString(error)); info_->onRegisterFailed_(info_->prefix_); return; } uint64_t statusCode; if ((error = ndn_TlvDecoder_readNonNegativeIntegerTlv (&decoder, ndn_Tlv_NfdCommand_StatusCode, &statusCode))) { _LOG_DEBUG ("Register prefix failed: Error decoding the NFD response: " << ndn_getErrorString(error)); info_->onRegisterFailed_(info_->prefix_); return; } // Status code 200 is "OK". if (statusCode != 200) { _LOG_DEBUG ("Register prefix failed: Expected NFD status code 200, got: " << statusCode); info_->onRegisterFailed_(info_->prefix_); return; } _LOG_DEBUG("Register prefix succeeded with the NFD forwarder for prefix " << info_->prefix_->toUri()); }
ndn_Error ndn_decodeTlvControlResponse (struct ndn_ControlResponse *controlResponse, struct ndn_TlvDecoder *decoder) { ndn_Error error; size_t endOffset; int gotExpectedType; uint64_t statusCode; if ((error = ndn_TlvDecoder_readNestedTlvsStart (decoder, ndn_Tlv_NfdCommand_ControlResponse, &endOffset))) return error; if ((error = ndn_TlvDecoder_readNonNegativeIntegerTlv (decoder, ndn_Tlv_NfdCommand_StatusCode, &statusCode))) return error; controlResponse->statusCode = (int)statusCode; if ((error = ndn_TlvDecoder_readBlobTlv (decoder, ndn_Tlv_NfdCommand_StatusText, &controlResponse->statusText))) return error; // Decode the body. if ((error = ndn_TlvDecoder_peekType (decoder, ndn_Tlv_ControlParameters_ControlParameters, endOffset, &gotExpectedType))) return error; if (gotExpectedType) { controlResponse->hasBodyAsControlParameters = 1; if ((error = ndn_decodeTlvControlParameters (&controlResponse->bodyAsControlParameters, decoder))) return error; } else controlResponse->hasBodyAsControlParameters = 0; if ((error = ndn_TlvDecoder_finishNestedTlvs(decoder, endOffset))) return error; return NDN_ERROR_success; }
ndn_Error ndn_encodeTlvSignatureInfo (const struct ndn_Signature *signatureInfo, struct ndn_TlvEncoder *encoder) { if (signatureInfo->type == ndn_SignatureType_Generic) { // Handle a Generic signature separately since it has the entire encoding. const struct ndn_Blob *encoding = &signatureInfo->signatureInfoEncoding; ndn_Error error; size_t endOffset; uint64_t signatureType; // Do a test decoding to sanity check that it is valid TLV. struct ndn_TlvDecoder decoder; ndn_TlvDecoder_initialize(&decoder, encoding->value, encoding->length); error = ndn_TlvDecoder_readNestedTlvsStart (&decoder, ndn_Tlv_SignatureInfo, &endOffset); if (!error) error = ndn_TlvDecoder_readNonNegativeIntegerTlv (&decoder, ndn_Tlv_SignatureType, &signatureType); if (!error) error = ndn_TlvDecoder_finishNestedTlvs(&decoder, endOffset); if (error) return NDN_ERROR_The_Generic_signature_encoding_is_not_a_valid_NDN_TLV_SignatureInfo; return ndn_TlvEncoder_writeArray(encoder, encoding->value, encoding->length); } if (signatureInfo->type == ndn_SignatureType_Sha256WithRsaSignature || signatureInfo->type == ndn_SignatureType_Sha256WithEcdsaSignature || signatureInfo->type == ndn_SignatureType_HmacWithSha256Signature) return ndn_TlvEncoder_writeNestedTlv (encoder, ndn_Tlv_SignatureInfo, encodeSignatureWithKeyLocatorAndValidityPeriodValue, signatureInfo, 0); else if (signatureInfo->type == ndn_SignatureType_DigestSha256Signature) return ndn_TlvEncoder_writeNestedTlv (encoder, ndn_Tlv_SignatureInfo, encodeDigestSha256Value, signatureInfo, 0); else return NDN_ERROR_encodeSignatureInfo_unrecognized_SignatureType; }