예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
파일: node.cpp 프로젝트: susmit85/ndn-cpp
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());
}
예제 #4
0
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;
}
예제 #5
0
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;
}