Esempio n. 1
0
        private static void decodeSignatureInfo(SignatureHolder signatureHolder,
				TlvDecoder decoder, bool copy)
        {
            int beginOffset = decoder.getOffset();
            int endOffset = decoder.readNestedTlvsStart(net.named_data.jndn.encoding.tlv.Tlv.SignatureInfo);

            int signatureType = (int) decoder
                    .readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.SignatureType);
            if (signatureType == net.named_data.jndn.encoding.tlv.Tlv.SignatureType_SignatureSha256WithRsa) {
                signatureHolder.setSignature(new Sha256WithRsaSignature());
                // Modify the holder's signature object because if we create an object
                //   and set it, then the holder will have to copy all the fields.
                Sha256WithRsaSignature signatureInfo = (Sha256WithRsaSignature) signatureHolder
                        .getSignature();
                decodeKeyLocator(net.named_data.jndn.encoding.tlv.Tlv.KeyLocator, signatureInfo.getKeyLocator(),
                        decoder, copy);
                if (decoder.peekType(net.named_data.jndn.encoding.tlv.Tlv.ValidityPeriod_ValidityPeriod, endOffset))
                    decodeValidityPeriod(signatureInfo.getValidityPeriod(), decoder);
            } else if (signatureType == net.named_data.jndn.encoding.tlv.Tlv.SignatureType_SignatureSha256WithEcdsa) {
                signatureHolder.setSignature(new Sha256WithEcdsaSignature());
                Sha256WithEcdsaSignature signatureInfo_0 = (Sha256WithEcdsaSignature) signatureHolder
                        .getSignature();
                decodeKeyLocator(net.named_data.jndn.encoding.tlv.Tlv.KeyLocator, signatureInfo_0.getKeyLocator(),
                        decoder, copy);
                if (decoder.peekType(net.named_data.jndn.encoding.tlv.Tlv.ValidityPeriod_ValidityPeriod, endOffset))
                    decodeValidityPeriod(signatureInfo_0.getValidityPeriod(), decoder);
            } else if (signatureType == net.named_data.jndn.encoding.tlv.Tlv.SignatureType_SignatureHmacWithSha256) {
                signatureHolder.setSignature(new HmacWithSha256Signature());
                HmacWithSha256Signature signatureInfo_1 = (HmacWithSha256Signature) signatureHolder
                        .getSignature();
                decodeKeyLocator(net.named_data.jndn.encoding.tlv.Tlv.KeyLocator, signatureInfo_1.getKeyLocator(),
                        decoder, copy);
            } else if (signatureType == net.named_data.jndn.encoding.tlv.Tlv.SignatureType_DigestSha256)
                signatureHolder.setSignature(new DigestSha256Signature());
            else {
                signatureHolder.setSignature(new GenericSignature());
                GenericSignature signatureInfo_2 = (GenericSignature) signatureHolder
                        .getSignature();

                // Get the bytes of the SignatureInfo TLV.
                signatureInfo_2.setSignatureInfoEncoding(
                        new Blob(decoder.getSlice(beginOffset, endOffset), copy),
                        signatureType);
            }

            decoder.finishNestedTlvs(endOffset);
        }
Esempio n. 2
0
        /// <summary>
        /// Decode the input as an NDN-TLV RepetitiveInterval.
        /// </summary>
        ///
        /// <param name="decoder">The decoder with the input to decode.</param>
        /// <returns>A new RepetitiveInterval with the decoded result.</returns>
        private static RepetitiveInterval decodeRepetitiveInterval(
				TlvDecoder decoder)
        {
            int endOffset = decoder
                    .readNestedTlvsStart(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_RepetitiveInterval);

            // Use Blob to convert UTF8 to a string.
            double startDate = fromIsoString(new Blob(
                    decoder.readBlobTlv(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_StartDate), true).toString());
            double endDate = fromIsoString(new Blob(
                    decoder.readBlobTlv(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_EndDate), true).toString());
            int startHour = (int) decoder
                    .readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_IntervalStartHour);
            int endHour = (int) decoder
                    .readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_IntervalEndHour);
            int nRepeats = (int) decoder
                    .readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_NRepeats);

            int repeatUnitCode = (int) decoder
                    .readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_RepeatUnit);
            RepetitiveInterval.RepeatUnit repeatUnit;
            if (repeatUnitCode == net.named_data.jndn.encoding.tlv.Tlv.Encrypt_RepeatUnit_NONE)
                repeatUnit = net.named_data.jndn.encrypt.RepetitiveInterval.RepeatUnit.NONE;
            else if (repeatUnitCode == net.named_data.jndn.encoding.tlv.Tlv.Encrypt_RepeatUnit_DAY)
                repeatUnit = net.named_data.jndn.encrypt.RepetitiveInterval.RepeatUnit.DAY;
            else if (repeatUnitCode == net.named_data.jndn.encoding.tlv.Tlv.Encrypt_RepeatUnit_MONTH)
                repeatUnit = net.named_data.jndn.encrypt.RepetitiveInterval.RepeatUnit.MONTH;
            else if (repeatUnitCode == net.named_data.jndn.encoding.tlv.Tlv.Encrypt_RepeatUnit_YEAR)
                repeatUnit = net.named_data.jndn.encrypt.RepetitiveInterval.RepeatUnit.YEAR;
            else
                throw new EncodingException(
                        "Unrecognized RepetitiveInterval RepeatUnit code: "
                                + repeatUnitCode);

            decoder.finishNestedTlvs(endOffset);
            return new RepetitiveInterval(startDate, endDate, startHour, endHour,
                    nRepeats, repeatUnit);
        }
Esempio n. 3
0
        /// <summary>
        /// Decode input as a control parameters in NDN-TLV and set the fields of the
        /// controlResponse object.
        /// </summary>
        ///
        /// <param name="controlResponse"></param>
        /// <param name="input"></param>
        /// <param name="copy">unchanged while the Blob values are used.</param>
        /// <exception cref="EncodingException">For invalid encoding</exception>
        public override void decodeControlResponse(ControlResponse controlResponse,
				ByteBuffer input, bool copy)
        {
            TlvDecoder decoder = new TlvDecoder(input);
            int endOffset = decoder
                    .readNestedTlvsStart(net.named_data.jndn.encoding.tlv.Tlv.NfdCommand_ControlResponse);

            controlResponse.setStatusCode((int) decoder
                    .readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.NfdCommand_StatusCode));
            // Set copy false since we just immediately get a string.
            Blob statusText = new Blob(
                    decoder.readBlobTlv(net.named_data.jndn.encoding.tlv.Tlv.NfdCommand_StatusText), false);
            controlResponse.setStatusText(statusText.toString());

            // Decode the body.
            if (decoder
                    .peekType(net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_ControlParameters, endOffset)) {
                controlResponse.setBodyAsControlParameters(new ControlParameters());
                // Decode into the existing ControlParameters to avoid copying.
                decodeControlParameters(
                        controlResponse.getBodyAsControlParameters(), decoder, copy);
            } else
                controlResponse.setBodyAsControlParameters(null);

            decoder.finishNestedTlvs(endOffset);
        }
Esempio n. 4
0
        private static void decodeControlParameters(
				ControlParameters controlParameters, TlvDecoder decoder,
				bool copy)
        {
            controlParameters.clear();

            int endOffset = decoder
                    .readNestedTlvsStart(net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_ControlParameters);

            // decode name
            if (decoder.peekType(net.named_data.jndn.encoding.tlv.Tlv.Name, endOffset)) {
                Name name = new Name();
                decodeName(name, new int[1], new int[1], decoder, copy);
                controlParameters.setName(name);
            }

            // decode face ID
            controlParameters.setFaceId((int) decoder
                    .readOptionalNonNegativeIntegerTlv(
                            net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_FaceId, endOffset));

            // decode URI
            if (decoder.peekType(net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_Uri, endOffset)) {
                // Set copy false since we just immediately get the string.
                Blob uri = new Blob(decoder.readOptionalBlobTlv(
                        net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_Uri, endOffset), false);
                controlParameters.setUri("" + uri);
            }

            // decode integers
            controlParameters.setLocalControlFeature((int) decoder
                    .readOptionalNonNegativeIntegerTlv(
                            net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_LocalControlFeature, endOffset));
            controlParameters.setOrigin((int) decoder
                    .readOptionalNonNegativeIntegerTlv(
                            net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_Origin, endOffset));
            controlParameters.setCost((int) decoder
                    .readOptionalNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_Cost,
                            endOffset));

            // set forwarding flags
            if (decoder.peekType(net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_Flags, endOffset)) {
                ForwardingFlags flags = new ForwardingFlags();
                flags.setNfdForwardingFlags((int) decoder
                        .readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_Flags));
                controlParameters.setForwardingFlags(flags);
            }

            // decode strategy
            if (decoder.peekType(net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_Strategy, endOffset)) {
                int strategyEndOffset = decoder
                        .readNestedTlvsStart(net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_Strategy);
                decodeName(controlParameters.getStrategy(), new int[1], new int[1],
                        decoder, copy);
                decoder.finishNestedTlvs(strategyEndOffset);
            }

            // decode expiration period
            controlParameters.setExpirationPeriod(decoder
                    .readOptionalNonNegativeIntegerTlv(
                            net.named_data.jndn.encoding.tlv.Tlv.ControlParameters_ExpirationPeriod, endOffset));

            decoder.finishNestedTlvs(endOffset);
        }
Esempio n. 5
0
        /// <summary>
        /// Decode input as a EncryptedContent in NDN-TLV and set the fields of the
        /// encryptedContent object.
        /// </summary>
        ///
        /// <param name="encryptedContent"></param>
        /// <param name="input"></param>
        /// <param name="copy">unchanged while the Blob values are used.</param>
        /// <exception cref="EncodingException">For invalid encoding</exception>
        public override void decodeEncryptedContent(EncryptedContent encryptedContent,
				ByteBuffer input, bool copy)
        {
            TlvDecoder decoder = new TlvDecoder(input);
            int endOffset = decoder
                    .readNestedTlvsStart(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_EncryptedContent);

            Tlv0_2WireFormat.decodeKeyLocator(net.named_data.jndn.encoding.tlv.Tlv.KeyLocator,
                    encryptedContent.getKeyLocator(), decoder, copy);

            int algorithmType = (int) decoder
                    .readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_EncryptionAlgorithm);
            if (algorithmType == net.named_data.jndn.encrypt.algo.EncryptAlgorithmType.AesEcb.getNumericType())
                encryptedContent.setAlgorithmType(net.named_data.jndn.encrypt.algo.EncryptAlgorithmType.AesEcb);
            else if (algorithmType == net.named_data.jndn.encrypt.algo.EncryptAlgorithmType.AesCbc.getNumericType())
                encryptedContent.setAlgorithmType(net.named_data.jndn.encrypt.algo.EncryptAlgorithmType.AesCbc);
            else if (algorithmType == net.named_data.jndn.encrypt.algo.EncryptAlgorithmType.RsaPkcs.getNumericType())
                encryptedContent.setAlgorithmType(net.named_data.jndn.encrypt.algo.EncryptAlgorithmType.RsaPkcs);
            else if (algorithmType == net.named_data.jndn.encrypt.algo.EncryptAlgorithmType.RsaOaep.getNumericType())
                encryptedContent.setAlgorithmType(net.named_data.jndn.encrypt.algo.EncryptAlgorithmType.RsaOaep);
            else
                throw new EncodingException(
                        "Unrecognized EncryptionAlgorithm code " + algorithmType);

            encryptedContent.setInitialVector(new Blob(decoder.readOptionalBlobTlv(
                    net.named_data.jndn.encoding.tlv.Tlv.Encrypt_InitialVector, endOffset), copy));
            encryptedContent.setPayload(new Blob(decoder
                    .readBlobTlv(net.named_data.jndn.encoding.tlv.Tlv.Encrypt_EncryptedPayload), copy));

            decoder.finishNestedTlvs(endOffset);
        }
Esempio n. 6
0
        /// <summary>
        /// Decode input as a sequence of NDN-TLV Delegation and set the fields of the
        /// delegationSet object. Note that the sequence of Delegation does not have an
        /// outer TLV type and length because it is intended to use the type and length
        /// of a Data packet's Content. This ignores any elements after the sequence
        /// of Delegation and before input.limit().
        /// </summary>
        ///
        /// <param name="delegationSet">The DelegationSet object whose fields are updated.</param>
        /// <param name="input"></param>
        /// <param name="copy">unchanged while the Blob values are used.</param>
        /// <exception cref="EncodingException">For invalid encoding.</exception>
        public override void decodeDelegationSet(DelegationSet delegationSet,
				ByteBuffer input, bool copy)
        {
            TlvDecoder decoder = new TlvDecoder(input);
            int endOffset = input.limit();

            delegationSet.clear();
            while (decoder.getOffset() < endOffset) {
                decoder.readTypeAndLength(net.named_data.jndn.encoding.tlv.Tlv.Link_Delegation);
                int preference = (int) decoder
                        .readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.Link_Preference);
                Name name = new Name();
                decodeName(name, new int[1], new int[1], decoder, copy);

                // Add unsorted to preserve the order so that Interest selected delegation
                // index will work.
                delegationSet.addUnsorted(preference, name);
            }
        }
Esempio n. 7
0
        /// <summary>
        /// An internal method to encode signature as the appropriate form of
        /// SignatureInfo in NDN-TLV.
        /// </summary>
        ///
        /// <param name="signature">An object of a subclass of Signature to encode.</param>
        /// <param name="encoder">The TlvEncoder to receive the encoding.</param>
        private void encodeSignatureInfo(Signature signature, TlvEncoder encoder)
        {
            if (signature  is  GenericSignature) {
                // Handle GenericSignature separately since it has the entire encoding.
                Blob encoding = ((GenericSignature) signature)
                        .getSignatureInfoEncoding();

                // Do a test decoding to sanity check that it is valid TLV.
                try {
                    TlvDecoder decoder = new TlvDecoder(encoding.buf());
                    int endOffset = decoder.readNestedTlvsStart(net.named_data.jndn.encoding.tlv.Tlv.SignatureInfo);
                    decoder.readNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.SignatureType);
                    decoder.finishNestedTlvs(endOffset);
                } catch (EncodingException ex) {
                    throw new Exception(
                            "The GenericSignature encoding is not a valid NDN-TLV SignatureInfo: "
                                    + ex.Message);
                }

                encoder.writeBuffer(encoding.buf());
                return;
            }

            int saveLength = encoder.getLength();

            // Encode backwards.
            if (signature  is  Sha256WithRsaSignature) {
                if (((Sha256WithRsaSignature) signature).getValidityPeriod()
                        .hasPeriod())
                    encodeValidityPeriod(
                            ((Sha256WithRsaSignature) signature)
                                    .getValidityPeriod(),
                            encoder);
                encodeKeyLocator(net.named_data.jndn.encoding.tlv.Tlv.KeyLocator,
                        ((Sha256WithRsaSignature) signature).getKeyLocator(),
                        encoder);
                encoder.writeNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.SignatureType,
                        net.named_data.jndn.encoding.tlv.Tlv.SignatureType_SignatureSha256WithRsa);
            } else if (signature  is  Sha256WithEcdsaSignature) {
                if (((Sha256WithEcdsaSignature) signature).getValidityPeriod()
                        .hasPeriod())
                    encodeValidityPeriod(
                            ((Sha256WithEcdsaSignature) signature)
                                    .getValidityPeriod(),
                            encoder);
                encodeKeyLocator(net.named_data.jndn.encoding.tlv.Tlv.KeyLocator,
                        ((Sha256WithEcdsaSignature) signature).getKeyLocator(),
                        encoder);
                encoder.writeNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.SignatureType,
                        net.named_data.jndn.encoding.tlv.Tlv.SignatureType_SignatureSha256WithEcdsa);
            } else if (signature  is  HmacWithSha256Signature) {
                encodeKeyLocator(net.named_data.jndn.encoding.tlv.Tlv.KeyLocator,
                        ((HmacWithSha256Signature) signature).getKeyLocator(),
                        encoder);
                encoder.writeNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.SignatureType,
                        net.named_data.jndn.encoding.tlv.Tlv.SignatureType_SignatureHmacWithSha256);
            } else if (signature  is  DigestSha256Signature)
                encoder.writeNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.SignatureType,
                        net.named_data.jndn.encoding.tlv.Tlv.SignatureType_DigestSha256);
            else
                throw new Exception(
                        "encodeSignatureInfo: Unrecognized Signature object type");

            encoder.writeTypeAndLength(net.named_data.jndn.encoding.tlv.Tlv.SignatureInfo, encoder.getLength()
                    - saveLength);
        }