Compare commits

..
Author SHA1 Message Date
Qiuhan Ding 699725dae1 regex: move functions out of headers
Change-Id: I6a3ea61a6564195e297288d514c5a805a832e0e6
2015-08-06 15:28:51 -07:00
Yingdi Yu b56c54ebc1 docs: trust schema spec
Refs: #2829

Change-Id: Idd41b49f41ee9e87ded8df2bb800a7a28bb69932
2015-08-06 15:28:49 -07:00
1023 changed files with 71206 additions and 103088 deletions

No files matched your search

-17
View File
@@ -1,17 +0,0 @@
name: CI
on:
push:
paths-ignore:
- 'docs/**'
- '*.conf.sample*'
- '*.md'
- '.mailmap'
workflow_dispatch:
permissions: {}
jobs:
Ubuntu:
uses: named-data/actions/.github/workflows/jenkins-script-ubuntu.yml@v1
macOS:
uses: named-data/actions/.github/workflows/jenkins-script-macos.yml@v1
-48
View File
@@ -1,48 +0,0 @@
name: Publish Docker image
on:
push:
branches:
- master
paths-ignore:
- '*.md'
- '.mailmap'
workflow_dispatch:
permissions:
contents: read
packages: write
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Login to ${{ env.REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
flavor: latest=true
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
pull: true
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
-21
View File
@@ -1,21 +0,0 @@
name: Docs
on:
push:
workflow_dispatch:
inputs:
skip-deploy:
description: 'Skip deployment?'
required: true
type: boolean
permissions: {}
jobs:
html:
uses: named-data/actions/.github/workflows/docs-html.yml@v1
with:
# Deploy only the master branch and release tags
deploy: ${{ !inputs.skip-deploy && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/ndn-cxx-')) }}
secrets: inherit
man:
uses: named-data/actions/.github/workflows/docs-man.yml@v1
+10 -23
View File
@@ -1,30 +1,17 @@
# Emacs
# Emacs temp files
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
.\#*
# Visual Studio Code
.vscode/
# Mac OSX
.DS_*
# macOS
.DS_Store
.AppleDouble
.LSOverride
._*
# Waf build system
/build/
.waf-*-*/
.waf3-*-*/
.lock-waf*
# waf build system
.waf-1*
.waf3-*
.lock*
build/
# Compiled python code
__pycache__/
*.py[cod]
*.pyc
# Other
/VERSION.info
/examples/example-trust-anchor.cert
VERSION
+4 -46
View File
@@ -1,52 +1,10 @@
#!/usr/bin/env bash
set -eo pipefail
set -e
case $(uname) in
Linux)
if [[ -e /etc/os-release ]]; then
source /etc/os-release
else
source /usr/lib/os-release
fi
export ID VERSION_ID
export ID_LIKE="${ID} ${ID_LIKE} linux"
export PATH="${HOME}/.local/bin${PATH:+:}${PATH}"
;;
Darwin)
# Emulate a subset of os-release(5)
export ID=macos
export VERSION_ID=$(sw_vers -productVersion)
export PATH="/usr/local/bin${PATH:+:}${PATH}"
if [[ -x /opt/homebrew/bin/brew ]]; then
eval "$(/opt/homebrew/bin/brew shellenv)"
elif [[ -x /usr/local/bin/brew ]]; then
eval "$(/usr/local/bin/brew shellenv)"
fi
;;
esac
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
export CACHE_DIR=${CACHE_DIR:-/tmp}
if [[ $JOB_NAME == *"code-coverage" ]]; then
export DISABLE_ASAN=yes
export DISABLE_HEADERS_CHECK=yes
fi
# https://reproducible-builds.org/docs/source-date-epoch/
export SOURCE_DATE_EPOCH=$(git log -1 --format=%ct)
for file in .jenkins.d/*; do
for file in "$DIR"/.jenkins.d/*; do
[[ -f $file && -x $file ]] || continue
if [[ -n $GITHUB_ACTIONS ]]; then
label=$(basename "$file" | sed -E 's/[[:digit:]]+-(.*)\..*/\1/')
echo "::group::${label}"
fi
echo "\$ $file"
echo "Run: $file"
"$file"
if [[ -n $GITHUB_ACTIONS ]]; then
echo "::endgroup::"
fi
done
+21 -30
View File
@@ -1,38 +1,29 @@
#!/usr/bin/env bash
set -eo pipefail
set -e
APT_PKGS=(build-essential pkg-config python3-minimal
libboost-all-dev libssl-dev libsqlite3-dev)
FORMULAE=(boost openssl pkg-config)
PIP_PKGS=()
case $JOB_NAME in
*code-coverage)
APT_PKGS+=(lcov python3-pip)
PIP_PKGS+=('gcovr~=5.2')
;;
*Docs)
APT_PKGS+=(doxygen graphviz python3-pip)
FORMULAE+=(doxygen graphviz)
PIP_PKGS+=(sphinx sphinxcontrib-doxylink)
;;
esac
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source "$JDIR"/util.sh
set -x
if [[ $ID == macos ]]; then
if [[ -n $GITHUB_ACTIONS ]]; then
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
if has OSX $NODE_LABELS; then
if has OSX-10.8 $NODE_LABELS; then
EXTRA_FLAGS=--c++11
fi
set -x
brew update
brew install --formula "${FORMULAE[@]}"
elif [[ $ID_LIKE == *debian* ]]; then
sudo apt-get -qq update
sudo apt-get -qy install "${APT_PKGS[@]}"
elif [[ $ID_LIKE == *fedora* ]]; then
sudo dnf -y install gcc-c++ libasan lld pkgconf-pkg-config python3 \
boost-devel openssl-devel sqlite-devel
brew upgrade
brew install boost pkg-config cryptopp $EXTRA_FLAGS
brew cleanup
fi
if (( ${#PIP_PKGS[@]} )); then
pip3 install --user --upgrade --upgrade-strategy=eager "${PIP_PKGS[@]}"
if has Ubuntu $NODE_LABELS; then
BOOST_PKG=libboost-all-dev
if has Ubuntu-12.04 $NODE_LABELS; then
BOOST_PKG=libboost1.48-all-dev
fi
set -x
sudo apt-get update -qq -y
sudo apt-get -qq -y install build-essential pkg-config $BOOST_PKG \
libcrypto++-dev libsqlite3-dev
fi
-9
View File
@@ -1,9 +0,0 @@
#!/usr/bin/env bash
set -exo pipefail
PROJ=ndn-cxx
sudo rm -f /usr/local/bin/ndnsec*
sudo rm -fr /usr/local/include/"$PROJ"
sudo rm -f /usr/local/lib{,64}/lib"$PROJ"*
sudo rm -f /usr/local/lib{,64}/pkgconfig/{,lib}"$PROJ".pc
+35 -39
View File
@@ -1,49 +1,45 @@
#!/usr/bin/env bash
set -eo pipefail
set -x
set -e
if [[ -z $DISABLE_ASAN ]]; then
ASAN="--with-sanitizer=address"
fi
if [[ $JOB_NAME == *"code-coverage" ]]; then
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source "$JDIR"/util.sh
sudo rm -Rf /usr/local/include/ndn-cxx
sudo rm -f /usr/local/lib/libndn-cxx*
sudo rm -f /usr/local/lib/pkgconfig/libndn-cxx*
# Cleanup
sudo ./waf -j1 --color=yes distclean
# Configure/build static library in debug mode with precompiled headers
./waf -j1 --color=yes configure --enable-static --disable-shared --with-tests --debug
./waf -j1 --color=yes build
# Cleanup
sudo ./waf -j1 --color=yes distclean
# Configure/build static and shared library in optimized mode without tests with precompiled headers
./waf -j1 --color=yes configure --enable-shared --enable-static
./waf -j1 --color=yes build
# Cleanup
sudo ./waf -j1 --color=yes distclean
# Configure/build shared library in debug mode with examples without precompiled headers
if has code-coverage $JOB_NAME; then
COVERAGE="--with-coverage"
fi
if [[ $ID == macos && ${VERSION_ID%%.*} -ge 12 ]]; then
KEYCHAIN="--without-osx-keychain"
fi
if [[ -n $DISABLE_PCH ]]; then
PCH="--without-pch"
fi
./waf -j1 --color=yes configure --debug --enable-shared --disable-static --with-tests --without-pch --with-examples $COVERAGE
./waf -j1 --color=yes build
set -x
if [[ $JOB_NAME != *"code-coverage" && $JOB_NAME != *"limited-build" ]]; then
# Build static library in release mode with tests and without precompiled headers
./waf --color=yes configure --enable-static --disable-shared --with-tests --without-pch
./waf --color=yes build
# Cleanup
./waf --color=yes distclean
# Build static and shared library in release mode without tests
./waf --color=yes configure --enable-static --enable-shared $PCH
./waf --color=yes build
# Cleanup
./waf --color=yes distclean
fi
# Build shared library in debug mode with tests and examples
./waf --color=yes configure --disable-static --enable-shared --debug --with-tests --with-examples $ASAN $COVERAGE $KEYCHAIN $PCH
./waf --color=yes build
# (tests will be run against the debug version)
# (tests will be run against debug version)
# Install
sudo ./waf --color=yes install
sudo ./waf -j1 --color=yes install
if [[ $ID_LIKE == *fedora* ]]; then
sudo tee /etc/ld.so.conf.d/ndn.conf >/dev/null <<< /usr/local/lib64
fi
if [[ $ID_LIKE == *linux* ]]; then
if has Linux $NODE_LABELS; then
sudo ldconfig
elif has FreeBSD $NODE_LABELS; then
sudo ldconfig -a
fi
+17 -20
View File
@@ -1,26 +1,23 @@
#!/usr/bin/env bash
set -eo pipefail
# https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
ASAN_OPTIONS="color=always"
ASAN_OPTIONS+=":check_initialization_order=1"
ASAN_OPTIONS+=":detect_stack_use_after_return=1"
ASAN_OPTIONS+=":strict_init_order=1"
ASAN_OPTIONS+=":strict_string_checks=1"
ASAN_OPTIONS+=":detect_invalid_pointer_pairs=2"
ASAN_OPTIONS+=":strip_path_prefix=${PWD}/"
export ASAN_OPTIONS
# https://www.boost.org/doc/libs/release/libs/test/doc/html/boost_test/runtime_config/summary.html
export BOOST_TEST_BUILD_INFO=1
export BOOST_TEST_COLOR_OUTPUT=1
export BOOST_TEST_DETECT_MEMORY_LEAK=0
export BOOST_TEST_LOGGER=HRF,test_suite,stdout:XML,all,build/xunit-log.xml
set -x
set -e
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source "$JDIR"/util.sh
# Prepare environment
rm -rf ~/.ndn
rm -Rf ~/.ndn
if has OSX $NODE_LABELS; then
echo "Unlocking OSX Keychain"
security unlock-keychain -p "named-data"
fi
ndnsec-keygen "/tmp/jenkins/$NODE_NAME" | ndnsec-install-cert -
# Run unit tests
./build/unit-tests
if [[ -n "$XUNIT" ]]; then
./build/unit-tests --log_format=XML --log_sink=build/xunit-report.xml --log_level=all --report_level=no
else
./build/unit-tests -l test_suite
fi
+7 -28
View File
@@ -1,32 +1,11 @@
#!/usr/bin/env bash
set -exo pipefail
set -x
set -e
if [[ $JOB_NAME == *"code-coverage" ]]; then
# Generate an XML report (Cobertura format) and a detailed HTML report using gcovr
# Note: trailing slashes are important in the paths below. Do not remove them!
gcovr --object-directory build \
--filter ndn-cxx/ \
--exclude ndn-cxx/detail/nonstd/ \
--exclude-throw-branches \
--exclude-unreachable-branches \
--cobertura build/coverage.xml \
--html-details build/gcovr/ \
--print-summary
JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source "$JDIR"/util.sh
# Generate a detailed HTML report using lcov
lcov --quiet \
--capture \
--directory . \
--exclude "$PWD/ndn-cxx/detail/nonstd/*" \
--exclude "$PWD/tests/*" \
--no-external \
--rc lcov_branch_coverage=1 \
--output-file build/coverage.info
genhtml --branch-coverage \
--demangle-cpp \
--legend \
--output-directory build/lcov \
--title "ndn-cxx unit tests" \
build/coverage.info
if has code-coverage $JOB_NAME; then
BASE="`pwd | sed -e 's|/|\\\/|g'`\\"
(cd build && gcovr -x -f $BASE/src -r ../ -o coverage.xml -b ./)
fi
-43
View File
@@ -1,43 +0,0 @@
#!/usr/bin/env bash
set -eo pipefail
# It's intentional not to use `set -x`, because this script explicitly prints useful information
# and should not run in trace mode.
PROJ=ndn-cxx
PCFILE=libndn-cxx
if [[ -n $DISABLE_HEADERS_CHECK ]]; then
echo 'Skipping headers check.'
exit 0
fi
if [[ $ID_LIKE == *fedora* ]]; then
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
fi
CXX=${CXX:-g++}
STD=-std=c++17
CXXFLAGS="-O2 -Wall -Wno-unneeded-internal-declaration -Wno-unused-const-variable $(pkg-config --cflags libndn-cxx $PCFILE)"
INCLUDEDIR="$(pkg-config --variable=includedir $PCFILE)"/$PROJ
echo "Using: $CXX $STD $CXXFLAGS"
NCHECKED=0
NERRORS=0
while IFS= read -r -d '' H; do
echo "Checking header ${H#${INCLUDEDIR}/}"
"$CXX" -xc++ $STD $CXXFLAGS -c -o /dev/null "$H" || : $((NERRORS++))
: $((NCHECKED++))
done < <(find "$INCLUDEDIR" -name '*.hpp' -type f -print0 2>/dev/null)
if [[ $NCHECKED -eq 0 ]]; then
echo "No headers found. Is $PROJ installed?"
exit 1
else
echo "$NCHECKED headers checked."
fi
if [[ $NERRORS -gt 0 ]]; then
echo "$NERRORS headers could not be compiled."
exit 1
fi
+42
View File
@@ -0,0 +1,42 @@
#!/usr/bin/env bash
# It's intentional not to use `set -x`, because this script explicitly prints useful information
# and should not run in trace mode.
# It's intentional not to use `set -e`, because this script wants to check all headers
# (similar to running all test cases), instead of failing at the first error.
CXX=${CXX:-g++}
STD=
if $CXX -xc++ /dev/null -o /dev/null -c -std=c++11 &>/dev/null; then
STD=-std=c++11
elif $CXX -xc++ /dev/null -o /dev/null -c -std=c++0x &>/dev/null; then
STD=-std=c++0x
fi
STDLIB=
if $CXX -xc++ /dev/null -o /dev/null -c $STD -stdlib=libc++ &>/dev/null; then
STDLIB=-stdlib=libc++
fi
echo 'Compiler flags:' $CXX $STD $STDLIB
INCLUDEDIR=/usr/local/include/ndn-cxx
NCHECKED=0
NERRORS=0
while IFS= read -r -d '' H; do
echo 'Verifying standalone header compilation for' $H
$CXX -xc++ "$INCLUDEDIR/$H" -o /dev/null -c $STD $STDLIB $(pkg-config --cflags libndn-cxx)
[[ $? -eq 0 ]] || ((NERRORS++))
((NCHECKED++))
done < <(cd "$INCLUDEDIR" && find * -name '*.hpp' -type f -print0 2>/dev/null)
if [[ $NCHECKED -eq 0 ]]; then
echo 'No header found. Is ndn-cxx installed?'
exit 1
fi
if [[ $NERRORS -gt 0 ]]; then
echo $NERRORS 'headers cannot compile on its own'
exit 1
fi
+20 -26
View File
@@ -1,36 +1,30 @@
# Continuous Integration Scripts
CONTINUOUS INTEGRATION SCRIPTS
==============================
## Environment Variables
Environment Variables Used in Build Scripts
-------------------------------------------
- `ID`: lower-case string that identifies the operating system, for example: `ID=ubuntu`,
`ID=centos`. See [os-release(5)] for more information. On macOS, where `os-release` is
not available, we emulate it by setting `ID=macos`.
- `NODE_LABELS`: the variable defines a list of OS properties. The set values are used by the
build scripts to select proper behavior for different OS.
- `ID_LIKE`: space-separated list of operating system identifiers that are closely related
to the running OS. See [os-release(5)] for more information. The listed values are used
by the CI scripts to select the proper behavior for different platforms and OS flavors.
The list should include at least `[OS_TYPE]`, `[DISTRO_TYPE]`, and `[DISTRO_VERSION]`.
Examples:
Possible values for Linux OS:
- On CentOS, `ID_LIKE="centos rhel fedora linux"`
- On Ubuntu, `ID_LIKE="ubuntu debian linux"`
* `[OS_TYPE]`: `Linux`
* `[DISTRO_TYPE]`: `Ubuntu`
* `[DISTRO_VERSION]`: `Ubuntu-12.04`, `Ubuntu-14.04`, `Ubuntu-15.04`
- `VERSION_ID`: identifies the operating system version, excluding any release code names.
See [os-release(5)] for more information. Examples: `VERSION_ID=42`, `VERSION_ID=22.04`.
Possible values of OSX OS:
- `JOB_NAME`: defines the type of the current CI job. Depending on the job type, the CI
scripts can perform different tasks.
* `[OS_TYPE]`: `OSX`
* `[DISTRO_TYPE]`: `OSX` (can be absent)
* `[DISTRO_VERSION]`: `OSX-10.10`, `OSX-10.9`, `OSX-10.8`, `OSX-10.7`
Supported values:
- `JOB_NAME`: optional variable to define type of the job. Depending on the defined job type,
the build scripts can perform different tasks.
- empty: default build task
- `code-coverage`: debug build with tests and code coverage analysis
- `limited-build`: only a single debug build with tests
Possible values:
- `CACHE_DIR`: directory containing cached files from previous builds, e.g., a compiled
version of ndn-cxx. If not set, `/tmp` is used.
- `DISABLE_ASAN`: disable building with AddressSanitizer. This is automatically set for
the `code-coverage` job type.
[os-release(5)]: https://www.freedesktop.org/software/systemd/man/os-release.html
* empty: default build process
* `code-coverage` (Linux OS is assumed): build process with code coverage analysis
+9
View File
@@ -0,0 +1,9 @@
has() {
local p=$1
shift
local x
for x in "$@"; do
[[ "${x}" == "${p}" ]] && return 0
done
return 1
}
-9
View File
@@ -1,9 +0,0 @@
<jefft0@remap.ucla.edu> <jefft0@gmail.com>
<aa@cs.fiu.edu> <alexander.afanasyev@ucla.edu>
<davidepesa@gmail.com> <davide.pesavento@lip6.fr>
<enewberry@email.arizona.edu> <enewberry@cs.arizona.edu>
Teng Liang <philoliang2011@gmail.com>
<lybmath2009@gmail.com> <lybmath@ucla.edu>
Hila Ben Abraham <hilata@gmail.com>
Laqin Fan <flq12021@gmail.com>
Jeremy Clark <jrclark2@memphis.edu>
+15
View File
@@ -0,0 +1,15 @@
sudo: true
language: cpp
os:
- linux
compiler:
- gcc
notifications:
email:
on_success: always
on_failure: always
script:
- if [[ $TRAVIS_OS_NAME == linux ]]; then export NODE_LABELS="Linux Ubuntu Ubuntu-12.04"; fi
- if [[ $TRAVIS_OS_NAME == osx ]]; then export NODE_LABELS="OSX OSX-10.10"; fi
- echo $NODE_LABELS
- ./.jenkins
+102 -254
View File
@@ -30,15 +30,15 @@ When using this tool, the wscript will look like:
Options are generated, in order to specify the location of boost includes/libraries.
The `check_boost` configuration function allows to specify the used boost libraries.
It can also provide default arguments to the --boost-mt command-line arguments.
It can also provide default arguments to the --boost-static and --boost-mt command-line arguments.
Everything will be packaged together in a BOOST component that you can use.
When using MSVC, a lot of compilation flags need to match your BOOST build configuration:
- you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
Errors: C4530
- boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC
So before calling `conf.check_boost` you might want to disabling by adding
conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
So before calling `conf.check_boost` you might want to disabling by adding:
conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
Errors:
- boost might also be compiled with /MT, which links the runtime statically.
If you have problems with redefined symbols,
@@ -52,60 +52,27 @@ import sys
import re
from waflib import Utils, Logs, Errors
from waflib.Configure import conf
from waflib.TaskGen import feature, after_method
BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/homebrew/lib', '/opt/local/lib', '/sw/lib', '/lib']
BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/homebrew/include', '/opt/local/include', '/sw/include']
BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib',
'/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu',
'/usr/local/ndn/lib', '/opt/ndn/lib']
BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include',
'/usr/local/ndn/include', '/opt/ndn/include']
BOOST_VERSION_FILE = 'boost/version.hpp'
BOOST_VERSION_CODE = '''
#include <iostream>
#include <boost/version.hpp>
int main() { std::cout << BOOST_LIB_VERSION << ":" << BOOST_VERSION << std::endl; }
'''
BOOST_ERROR_CODE = '''
BOOST_SYSTEM_CODE = '''
#include <boost/system/error_code.hpp>
int main() { boost::system::error_code c; }
'''
PTHREAD_CODE = '''
#include <pthread.h>
static void* f(void*) { return 0; }
int main() {
pthread_t th;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&th, &attr, &f, 0);
pthread_join(th, 0);
pthread_cleanup_push(0, 0);
pthread_cleanup_pop(0);
pthread_attr_destroy(&attr);
}
'''
BOOST_THREAD_CODE = '''
#include <boost/thread.hpp>
int main() { boost::thread t; }
'''
BOOST_LOG_CODE = '''
#include <boost/log/trivial.hpp>
int main() { BOOST_LOG_TRIVIAL(info) << "boost_log is working"; }
'''
BOOST_LOG_SETUP_CODE = '''
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
int main() {
using namespace boost::log;
add_common_attributes();
add_console_log(std::clog, keywords::format = "%Message%");
BOOST_LOG_TRIVIAL(info) << "boost_log_setup is working";
}
'''
# toolsets from {boost_dir}/tools/build/v2/tools/common.jam
PLATFORM = Utils.unversioned_sys_platform()
detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il'
@@ -137,37 +104,34 @@ BOOST_TOOLSETS = {
def options(opt):
opt = opt.add_option_group('Boost Options')
opt.add_option('--boost-includes', type='string',
default='', dest='boost_includes',
help='''path to the directory where the boost includes are,
e.g., /path/to/boost_1_55_0/stage/include''')
help='''path to the directory where the boost includes are, e.g., /path/to/boost_1_55_0/stage/include''')
opt.add_option('--boost-libs', type='string',
default='', dest='boost_libs',
help='''path to the directory where the boost libs are,
e.g., path/to/boost_1_55_0/stage/lib''')
help='''path to the directory where the boost libs are, e.g., /path/to/boost_1_55_0/stage/lib''')
opt.add_option('--boost-static', action='store_true',
default=False, dest='boost_static',
help='link with static boost libraries (.lib/.a)')
opt.add_option('--boost-mt', action='store_true',
default=False, dest='boost_mt',
help='select multi-threaded libraries')
opt.add_option('--boost-abi', type='string', default='', dest='boost_abi',
help='''select libraries with tags (gd for debug, static is automatically added),
see doc Boost, Getting Started, chapter 6.1''')
opt.add_option('--boost-linkage_autodetect', action='store_true', dest='boost_linkage_autodetect',
help='''select libraries with tags (dgsyp, d for debug), see doc Boost, Getting Started, chapter 6.1''')
opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect',
help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
opt.add_option('--boost-toolset', type='string',
default='', dest='boost_toolset',
help='force a toolset e.g. msvc, vc90, \
gcc, mingw, mgw45 (default: auto)')
help='force a toolset e.g. msvc, vc90, gcc, mingw, mgw45 (default: auto)')
py_version = '%d%d' % (sys.version_info[0], sys.version_info[1])
opt.add_option('--boost-python', type='string',
default=py_version, dest='boost_python',
help='select the lib python with this version \
(default: %s)' % py_version)
help='select the lib python with this version (default: %s)' % py_version)
@conf
def __boost_get_version_file(self, d):
if not d:
return None
dnode = self.root.find_dir(d)
if dnode:
return dnode.find_node(BOOST_VERSION_FILE)
@@ -180,30 +144,33 @@ def boost_get_version(self, d):
if node:
try:
txt = node.read()
except EnvironmentError:
Logs.error('Could not read the file %r' % node.abspath())
except (OSError, IOError):
Logs.error("Could not read the file %r" % node.abspath())
else:
re_but1 = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.+)"', re.M)
re_but1 = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"', re.M)
m1 = re_but1.search(txt)
re_but2 = re.compile('^#define\\s+BOOST_VERSION\\s+(\\d+)', re.M)
re_but2 = re.compile('^#define\\s+BOOST_VERSION\\s+(\\d*)', re.M)
m2 = re_but2.search(txt)
if m1 and m2:
return (m1.group(1), m2.group(1))
return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(':')
return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(":")
@conf
def boost_get_includes(self, *k, **kw):
includes = k and k[0] or kw.get('includes', None)
if includes and self.__boost_get_version_file(includes):
return includes
for d in self.environ.get('INCLUDE', '').split(';') + BOOST_INCLUDES:
for d in Utils.to_list(self.environ.get('INCLUDE', '')) + BOOST_INCLUDES:
if self.__boost_get_version_file(d):
return d
if includes:
self.end_msg('headers not found in %s' % includes, 'YELLOW')
self.end_msg('headers not found in %s' % includes)
self.fatal('The configuration failed')
else:
self.end_msg('headers not found, please provide a --boost-includes argument (see help)', 'YELLOW')
self.end_msg('headers not found, please provide a --boost-includes argument (see help)')
self.fatal('The configuration failed')
@@ -231,9 +198,7 @@ def __boost_get_libs_path(self, *k, **kw):
path = self.root.find_dir(libs)
files = path.ant_glob('*boost_*')
if not libs or not files:
for d in self.environ.get('LIB', '').split(';') + BOOST_LIBS:
if not d:
continue
for d in Utils.to_list(self.environ.get('LIB', [])) + BOOST_LIBS:
path = self.root.find_dir(d)
if path:
files = path.ant_glob('*boost_*')
@@ -246,10 +211,10 @@ def __boost_get_libs_path(self, *k, **kw):
break
if not path:
if libs:
self.end_msg('libs not found in %s' % libs, 'YELLOW')
self.end_msg('libs not found in %s' % libs)
self.fatal('The configuration failed')
else:
self.end_msg('libs not found, please provide a --boost-libs argument (see help)', 'YELLOW')
self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
self.fatal('The configuration failed')
self.to_log('Found the boost path in %r with the libraries:' % path)
@@ -264,10 +229,15 @@ def boost_get_libs(self, *k, **kw):
according to the parameters
'''
path, files = self.__boost_get_libs_path(**kw)
files = sorted(files, key=lambda f: (len(f.name), f.name), reverse=True)
t = []
if kw.get('mt', False):
t.append('mt')
if kw.get('abi', None):
t.append(kw['abi'])
tags = t and '(-%s)+' % '-'.join(t) or ''
toolset = self.boost_get_toolset(kw.get('toolset', ''))
toolset_pat = '(-%s[0-9]{0,3})' % toolset
version = '-%s' % self.env.BOOST_VERSION
toolset_pat = '(-%s[0-9]{0,3})+' % toolset
version = '(-%s)+' % self.env.BOOST_VERSION
def find_lib(re_lib, files):
for file in files:
@@ -281,109 +251,28 @@ def boost_get_libs(self, *k, **kw):
name = name[3:]
return name[:name.rfind('.')]
def match_libs(lib_names, is_static):
libs = []
lib_names = Utils.to_list(lib_names)
if not lib_names:
return libs
t = []
if kw.get('mt', False):
t.append('-mt')
if kw.get('abi', None):
t.append('%s%s' % (is_static and '-s' or '-', kw['abi']))
elif is_static:
t.append('-s')
tags_pat = t and ''.join(t) or ''
ext = is_static and self.env.cxxstlib_PATTERN or self.env.cxxshlib_PATTERN
ext = ext.partition('%s')[2] # remove '%s' or 'lib%s' from PATTERN
libs = []
for lib in Utils.to_list(k and k[0] or kw.get('lib', None)):
py = (lib == 'python') and '(-py%s)+' % kw['python'] or ''
# Trying libraries, from most strict match to least one
for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version),
'boost_%s%s%s%s' % (lib, tags, py, version),
'boost_%s%s%s' % (lib, tags, version),
# Give up trying to find the right version
'boost_%s%s%s%s' % (lib, toolset_pat, tags, py),
'boost_%s%s%s' % (lib, tags, py),
'boost_%s%s' % (lib, tags)]:
self.to_log('Trying pattern %s' % pattern)
file = find_lib(re.compile(pattern), files)
if file:
libs.append(format_lib_name(file.name))
break
else:
self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
self.fatal('The configuration failed')
for lib in lib_names:
if lib == 'python':
# for instance, with python='27',
# accepts '-py27', '-py2', '27' and '2'
# but will reject '-py3', '-py26', '26' and '3'
tags = '({0})?((-py{2})|(-py{1}(?=[^0-9]))|({2})|({1}(?=[^0-9]))|(?=[^0-9])(?!-py))'.format(tags_pat, kw['python'][0], kw['python'])
else:
tags = tags_pat
# Trying libraries, from most strict match to least one
for pattern in ['boost_%s%s%s%s%s$' % (lib, toolset_pat, tags, version, ext),
'boost_%s%s%s%s$' % (lib, tags, version, ext),
# Give up trying to find the right version
'boost_%s%s%s%s$' % (lib, toolset_pat, tags, ext),
'boost_%s%s%s$' % (lib, tags, ext),
'boost_%s%s$' % (lib, ext),
'boost_%s' % lib]:
self.to_log('Trying pattern %s' % pattern)
file = find_lib(re.compile(pattern), files)
if file:
libs.append(format_lib_name(file.name))
break
else:
self.end_msg('lib %s not found in %s' % (lib, path.abspath()), 'YELLOW')
self.fatal('The configuration failed')
return libs
return path.abspath(), libs
return path.abspath(), match_libs(kw.get('lib', None), False), match_libs(kw.get('stlib', None), True)
@conf
def _check_pthread_flag(self, *k, **kw):
'''
Computes which flags should be added to CXXFLAGS and LINKFLAGS to compile in multi-threading mode
Yes, we *need* to put the -pthread thing in CPPFLAGS because with GCC3,
boost/thread.hpp will trigger a #error if -pthread isn't used:
boost/config/requires_threads.hpp:47:5: #error "Compiler threading support
is not turned on. Please set the correct command line options for
threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)"
Based on _BOOST_PTHREAD_FLAG(): https://github.com/tsuna/boost.m4/blob/master/build-aux/boost.m4
'''
var = kw.get('uselib_store', 'BOOST')
self.start_msg('Checking the flags needed to use pthreads')
# The ordering *is* (sometimes) important. Some notes on the
# individual items follow:
# (none): in case threads are in libc; should be tried before -Kthread and
# other compiler flags to prevent continual compiler warnings
# -lpthreads: AIX (must check this before -lpthread)
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
# -llthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
# -pthread: GNU Linux/GCC (kernel threads), BSD/GCC (userland threads)
# -pthreads: Solaris/GCC
# -mthreads: MinGW32/GCC, Lynx/GCC
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
# doesn't hurt to check since this sometimes defines pthreads too;
# also defines -D_REENTRANT)
# ... -mt is also the pthreads flag for HP/aCC
# -lpthread: GNU Linux, etc.
# --thread-safe: KAI C++
if Utils.unversioned_sys_platform() == 'sunos':
# On Solaris (at least, for some versions), libc contains stubbed
# (non-functional) versions of the pthreads routines, so link-based
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
# a function called by this macro, so we could check for that, but
# who knows whether they'll stub that too in a future libc.) So,
# we'll just look for -pthreads and -lpthread first:
boost_pthread_flags = ['-pthreads', '-lpthread', '-mt', '-pthread']
else:
boost_pthread_flags = ['', '-lpthreads', '-Kthread', '-kthread', '-llthread', '-pthread',
'-pthreads', '-mthreads', '-lpthread', '--thread-safe', '-mt']
for boost_pthread_flag in boost_pthread_flags:
try:
self.env.stash()
self.env['CXXFLAGS_%s' % var] += [boost_pthread_flag]
self.env['LINKFLAGS_%s' % var] += [boost_pthread_flag]
self.check_cxx(code=PTHREAD_CODE, msg=None, use=var, execute=False, quiet=True)
self.end_msg(boost_pthread_flag)
return
except self.errors.ConfigurationError:
self.env.revert()
self.end_msg('none')
@conf
def check_boost(self, *k, **kw):
@@ -396,10 +285,7 @@ def check_boost(self, *k, **kw):
if not self.env['CXX']:
self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
params = {
'lib': k and k[0] or kw.get('lib', None),
'stlib': kw.get('stlib', None)
}
params = {'lib': k and k[0] or kw.get('lib', None)}
for key, value in self.options.__dict__.items():
if not key.startswith('boost_'):
continue
@@ -408,70 +294,48 @@ def check_boost(self, *k, **kw):
var = kw.get('uselib_store', 'BOOST')
if not self.env.DONE_FIND_BOOST_COMMON:
self.find_program('dpkg-architecture', var='DPKG_ARCHITECTURE', mandatory=False)
if self.env.DPKG_ARCHITECTURE:
deb_host_multiarch = self.cmd_and_log([self.env.DPKG_ARCHITECTURE[0], '-qDEB_HOST_MULTIARCH'])
BOOST_LIBS.insert(0, '/usr/lib/%s' % deb_host_multiarch.strip())
self.start_msg('Checking boost includes')
self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
versions = self.boost_get_version(inc)
self.env.BOOST_VERSION = versions[0]
self.env.BOOST_VERSION_NUMBER = int(versions[1])
self.end_msg("%d.%d.%d" % (int(versions[1]) / 100000,
int(versions[1]) / 100 % 1000,
int(versions[1]) % 100))
if Logs.verbose:
Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
self.start_msg('Checking boost includes')
self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
versions = self.boost_get_version(inc)
self.env.BOOST_VERSION = versions[0]
self.env.BOOST_VERSION_NUMBER = int(versions[1])
self.end_msg('%d.%d.%d' % (int(versions[1]) / 100000,
int(versions[1]) / 100 % 1000,
int(versions[1]) % 100))
if Logs.verbose:
Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
self.env.DONE_FIND_BOOST_COMMON = True
if not params['lib'] and not params['stlib']:
if not params['lib']:
return
if 'static' in kw or 'static' in params:
Logs.warn('boost: static parameter is deprecated, use stlib instead.')
self.start_msg('Checking boost libs')
path, libs, stlibs = self.boost_get_libs(**params)
self.env['LIBPATH_%s' % var] = [path]
self.env['STLIBPATH_%s' % var] = [path]
self.env['LIB_%s' % var] = libs
self.env['STLIB_%s' % var] = stlibs
self.end_msg(' '.join(libs + stlibs))
suffix = params.get('static', None) and 'ST' or ''
path, libs = self.boost_get_libs(**params)
self.env['%sLIBPATH_%s' % (suffix, var)] = [path]
self.env['%sLIB_%s' % (suffix, var)] = libs
self.end_msg('ok')
if Logs.verbose:
Logs.pprint('CYAN', ' path : %s' % path)
Logs.pprint('CYAN', ' shared libs : %s' % libs)
Logs.pprint('CYAN', ' static libs : %s' % stlibs)
Logs.pprint('CYAN', ' libs : %s' % libs)
def has_shlib(lib):
return params['lib'] and lib in params['lib']
def has_stlib(lib):
return params['stlib'] and lib in params['stlib']
def has_lib(lib):
return has_shlib(lib) or has_stlib(lib)
if has_lib('thread'):
# not inside try_link to make check visible in the output
self._check_pthread_flag(k, kw)
def try_link():
if has_lib('system'):
self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False)
if has_lib('thread'):
self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False)
if has_lib('log') or has_lib('log_setup'):
if not has_lib('thread'):
self.env['DEFINES_%s' % var] += ['BOOST_LOG_NO_THREADS']
if has_shlib('log') or has_shlib('log_setup'):
self.env['DEFINES_%s' % var] += ['BOOST_LOG_DYN_LINK']
if has_lib('log_setup'):
self.check_cxx(fragment=BOOST_LOG_SETUP_CODE, use=var, execute=False)
else:
self.check_cxx(fragment=BOOST_LOG_CODE, use=var, execute=False)
if 'system' in params['lib']:
self.check_cxx(
fragment=BOOST_SYSTEM_CODE,
use=var,
execute=False,
)
if 'thread' in params['lib']:
self.check_cxx(
fragment=BOOST_THREAD_CODE,
use=var,
execute=False,
)
if params.get('linkage_autodetect', False):
self.start_msg('Attempting to detect boost linkage flags')
self.start_msg("Attempting to detect boost linkage flags")
toolset = self.boost_get_toolset(kw.get('toolset', ''))
if toolset in ('vc',):
if toolset in ['vc']:
# disable auto-linking feature, causing error LNK1181
# because the code wants to be linked against
self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
@@ -491,43 +355,27 @@ def check_boost(self, *k, **kw):
# we attempt to play with some known-to-work CXXFLAGS combinations
for cxxflags in (['/MD', '/EHsc'], []):
self.env.stash()
self.env['CXXFLAGS_%s' % var] += cxxflags
self.env["CXXFLAGS_%s" % var] += cxxflags
try:
try_link()
self.end_msg('ok: winning cxxflags combination: %s' % (self.env['CXXFLAGS_%s' % var]))
exc = None
self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var]))
e = None
break
except Errors.ConfigurationError as e:
except Errors.ConfigurationError as exc:
self.env.revert()
exc = e
e = exc
if exc is not None:
self.end_msg('Could not auto-detect boost linking flags combination, you may report it to boost.py author', ex=exc)
if e is not None:
self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=e)
self.fatal('The configuration failed')
else:
self.end_msg('Boost linkage flags auto-detection not implemented (needed ?) for this toolchain')
self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
self.fatal('The configuration failed')
else:
self.start_msg('Checking for boost linkage')
try:
try_link()
except Errors.ConfigurationError as e:
self.end_msg('Could not link against boost libraries using supplied options', 'YELLOW')
self.end_msg("Could not link against boost libraries using supplied options")
self.fatal('The configuration failed')
self.end_msg('ok')
@feature('cxx')
@after_method('apply_link')
def install_boost(self):
if install_boost.done or not Utils.is_win32 or not self.bld.cmd.startswith('install'):
return
install_boost.done = True
inst_to = getattr(self, 'install_path', '${BINDIR}')
for lib in self.env.LIB_BOOST:
try:
file = self.bld.find_file(self.env.cxxshlib_PATTERN % lib, self.env.LIBPATH_BOOST)
self.bld.install_files(inst_to, self.bld.root.find_node(file))
except:
continue
install_boost.done = False
+98
View File
@@ -0,0 +1,98 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
from waflib.Configure import conf
FRIEND_TYPENAME = '''
class A;
template<typename T>
class B
{
friend T;
};
B<A> g_b;
'''
FRIEND_WRAPPER = '''
class A;
template<typename T>
struct TypeWrapper
{
typedef T Type;
};
template<typename T>
class B
{
friend class TypeWrapper<T>::Type;
};
B<A> g_b;
'''
@conf
def check_friend_typename(self):
if self.check_cxx(msg='Checking for friend typename-specifier',
fragment=FRIEND_TYPENAME,
features='cxx', mandatory=False):
self.define('HAVE_CXX_FRIEND_TYPENAME', 1)
elif self.check_cxx(msg='Checking for friend typename using wrapper',
fragment=FRIEND_WRAPPER,
features='cxx', mandatory=True):
self.define('HAVE_CXX_FRIEND_TYPENAME_WRAPPER', 1)
OVERRIDE = '''
class Base
{
virtual void
f(int a);
};
class Derived : public Base
{
virtual void
f(int a) override;
};
class Final : public Derived
{
virtual void
f(int a) final;
};
'''
@conf
def check_override(self):
if self.check_cxx(msg='Checking for override and final specifiers',
fragment=OVERRIDE,
features='cxx', mandatory=False):
self.define('HAVE_CXX_OVERRIDE_FINAL', 1)
VECTOR_INSERT_ERASE_CONST_ITERATOR = '''
#include <vector>
int
main()
{
std::vector<int> v;
std::vector<int>::const_iterator it = v.cbegin();
v.insert(it, 2);
it = v.cend() - 1;
v.erase(it);
return 0;
}
'''
@conf
def check_vector_const_iterators(self):
if self.check_cxx(msg='Checking for std::vector::insert with const_iterators',
fragment=VECTOR_INSERT_ERASE_CONST_ITERATOR,
features='cxx', mandatory=False):
self.define('NDN_CXX_HAVE_VECTOR_INSERT_ERASE_CONST_ITERATOR', 1)
def configure(conf):
conf.check_friend_typename()
conf.check_override()
conf.check_vector_const_iterators()
+4 -4
View File
@@ -1,15 +1,15 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
from waflib import TaskGen
from waflib import TaskGen, Logs
def options(opt):
opt.add_option('--with-coverage', action='store_true', default=False,
help='Add compiler flags to enable code coverage information')
opt.add_option('--with-coverage', action='store_true', default=False, dest='with_coverage',
help='''Set compiler flags for gcc to enable code coverage information''')
def configure(conf):
if conf.options.with_coverage:
if not conf.options.debug:
conf.fatal('Code coverage flags require debug mode compilation (add --debug)')
conf.fatal("Code coverage flags require debug mode compilation (add --debug)")
conf.check_cxx(cxxflags=['-fprofile-arcs', '-ftest-coverage', '-fPIC'],
linkflags=['-fprofile-arcs'], uselib_store='GCOV', mandatory=True)
-25
View File
@@ -1,25 +0,0 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
from waflib import Utils
def options(opt):
opt.add_option('--build', default=Utils.unversioned_sys_platform(),
help='Build platform that is doing the actual compilation (e.g., darwin)')
opt.add_option('--host', default=Utils.unversioned_sys_platform(),
help='Host platform on which the compiled binary will run (e.g., android)')
# opt.add_option('--target', default=Utils.unversioned_sys_platform(),
# help='Target platform on which the compiled binary's output will run')
def configure(conf):
conf.env.BUILD = conf.options.build
conf.env.HOST = conf.options.host
# conf.env.TARGET = conf.options.target
conf.start_msg('Build platform')
conf.end_msg(conf.env.BUILD)
conf.start_msg('Host platform')
conf.end_msg(conf.env.HOST)
# conf.start_msg('Target platform')
# conf.end_msg(conf.env.TARGET)
+121
View File
@@ -0,0 +1,121 @@
#! /usr/bin/env python
# encoding: utf-8
'''
When using this tool, the wscript will look like:
def options(opt):
opt.load('compiler_cxx cryptopp')
def configure(conf):
conf.load('compiler_cxx cryptopp')
conf.check_cryptopp()
def build(bld):
bld(source='main.cpp', target='app', use='CRYPTOPP')
Options are generated, in order to specify the location of cryptopp includes/libraries.
'''
import sys
import re
from waflib import Utils,Logs,Errors
from waflib.Configure import conf
CRYPTOPP_DIR = ['/usr', '/usr/local', '/opt/local', '/sw', '/usr/local/ndn', '/opt/ndn']
CRYPTOPP_VERSION_FILE = 'config.h'
CRYPTOPP_CHECK_FRAGMENT = '''
#include "../../src/security/cryptopp.hpp"
#include <iostream>
int
main()
{
using namespace CryptoPP;
std::string buffer = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
SHA256 hash;
StringSource(buffer, true, new HashFilter(hash, new FileSink(std::cout)));
StringSource(reinterpret_cast<const uint8_t*>(buffer.c_str()), buffer.size(),
true, new HashFilter(hash, new FileSink(std::cout)));
return 0;
}
'''
def options(opt):
opt.add_option('--with-cryptopp', type='string', default=None, dest='cryptopp_dir',
help='''Path to where CryptoPP is installed, e.g., /usr/local''')
@conf
def __cryptopp_get_version_file(self, dir):
try:
return self.root.find_dir(dir).find_node('%s/%s' % ('include/cryptopp',
CRYPTOPP_VERSION_FILE))
except:
return None
@conf
def __cryptopp_find_root_and_version_file(self, *k, **kw):
root = k and k[0] or kw.get('path', self.options.cryptopp_dir)
file = self.__cryptopp_get_version_file(root)
if root and file:
return (root, file)
for dir in CRYPTOPP_DIR:
file = self.__cryptopp_get_version_file(dir)
if file:
return (dir, file)
if root:
self.fatal('CryptoPP not found in %s' % root)
else:
self.fatal('CryptoPP not found, please provide a --with-cryptopp=PATH argument (see help)')
@conf
def check_cryptopp(self, *k, **kw):
if not self.env['CXX']:
self.fatal('Load a c++ compiler first, e.g., conf.load("compiler_cxx")')
var = kw.get('uselib_store', 'CRYPTOPP')
mandatory = kw.get('mandatory', True)
use = kw.get('use', 'PTHREAD')
self.start_msg('Checking Crypto++ lib')
(root, file) = self.__cryptopp_find_root_and_version_file(*k, **kw)
try:
txt = file.read()
re_version = re.compile('^#define\\s+CRYPTOPP_VERSION\\s+(.*)', re.M)
match = re_version.search(txt)
if match:
self.env.CRYPTOPP_VERSION = match.group(1)
self.end_msg(self.env.CRYPTOPP_VERSION)
else:
self.fatal('CryptoPP files are present, but are not recognizable')
except:
self.fatal('CryptoPP not found or is not usable')
isLibWorking = False
for defines in ['', 'CRYPTOPP_DISABLE_ASM']:
try:
self.check_cxx(msg='Checking if CryptoPP library works',
fragment=CRYPTOPP_CHECK_FRAGMENT,
lib='cryptopp',
includes="%s/include" % root,
libpath="%s/lib" % root,
mandatory=True,
use=use,
defines=defines,
uselib_store=var)
isLibWorking = True
break
except:
# try another flags
pass
if mandatory and not isLibWorking:
self.fatal('CryptoPP is present, but is not usable')
+84 -171
View File
@@ -1,91 +1,54 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
import platform
from waflib import Configure, Logs, Utils
from waflib import Logs, Configure, Utils
def options(opt):
opt.add_option('--debug', '--with-debug', action='store_true', default=False,
help='Compile in debugging mode with minimal optimizations (-Og)')
opt.add_option('--debug', '--with-debug', action='store_true', default=False, dest='debug',
help='''Compile in debugging mode without optimizations (-O0 or -Og)''')
def configure(conf):
conf.start_msg('Checking C++ compiler version')
cxx = conf.env.CXX_NAME # generic name of the compiler
ccver = tuple(int(i) for i in conf.env.CC_VERSION)
ccverstr = '.'.join(conf.env.CC_VERSION)
errmsg = ''
warnmsg = ''
cxx = conf.env['CXX_NAME'] # CXX_NAME represents generic name of the compiler
if cxx == 'gcc':
if ccver < (7, 4, 0):
errmsg = ('The version of gcc you are using is too old.\n'
'The minimum supported gcc version is 9.3.')
elif ccver < (9, 3, 0):
warnmsg = ('Using a version of gcc older than 9.3 is not '
'officially supported and may result in build failures.')
conf.flags = GccFlags()
flags = GccFlags()
elif cxx == 'clang':
if Utils.unversioned_sys_platform() == 'darwin':
if ccver < (10, 0, 0):
errmsg = ('The version of Xcode you are using is too old.\n'
'The minimum supported Xcode version is 12.4.')
elif ccver < (12, 0, 0):
warnmsg = ('Using a version of Xcode older than 12.4 is not '
'officially supported and may result in build failures.')
elif ccver < (7, 0, 0):
errmsg = ('The version of clang you are using is too old.\n'
'The minimum supported clang version is 7.0.')
conf.flags = ClangFlags()
flags = ClangFlags()
else:
warnmsg = f'{cxx} compiler is unsupported'
conf.flags = CompilerFlags()
flags = CompilerFlags()
Logs.warn('The code has not been yet tested with %s compiler' % cxx)
if errmsg:
conf.end_msg(ccverstr, color='RED')
conf.fatal(errmsg)
elif warnmsg:
conf.end_msg(ccverstr, color='YELLOW')
Logs.warn('WARNING: ' + warnmsg)
else:
conf.end_msg(ccverstr)
areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
conf.areCustomCxxflagsPresent = len(conf.env.CXXFLAGS) > 0
# General flags are always applied (e.g., selecting C++ language standard)
generalFlags = conf.flags.getGeneralFlags(conf)
# General flags will alway be applied (e.g., selecting C++11 mode)
generalFlags = flags.getGeneralFlags(conf)
conf.add_supported_cxxflags(generalFlags['CXXFLAGS'])
conf.add_supported_linkflags(generalFlags['LINKFLAGS'])
conf.env.DEFINES += generalFlags['DEFINES']
@Configure.conf
def check_compiler_flags(conf):
# Debug or optimized CXXFLAGS and LINKFLAGS are applied only if the
# Debug or optimization CXXFLAGS and LINKFLAGS will be applied only if the
# corresponding environment variables are not set.
# DEFINES are always applied.
# DEFINES will be always applied
if conf.options.debug:
extraFlags = conf.flags.getDebugFlags(conf)
if conf.areCustomCxxflagsPresent:
missingFlags = [x for x in extraFlags['CXXFLAGS'] if x not in conf.env.CXXFLAGS]
if missingFlags:
Logs.warn('Selected debug mode, but CXXFLAGS is set to a custom value "%s"'
% ' '.join(conf.env.CXXFLAGS))
Logs.warn('Default flags "%s" will not be used' % ' '.join(missingFlags))
else:
extraFlags = conf.flags.getOptimizedFlags(conf)
extraFlags = flags.getDebugFlags(conf)
if not conf.areCustomCxxflagsPresent:
if areCustomCxxflagsPresent:
missingFlags = [x for x in extraFlags['CXXFLAGS'] if x not in conf.env.CXXFLAGS]
if len(missingFlags) > 0:
Logs.warn("Selected debug mode, but CXXFLAGS is set to a custom value '%s'"
% " ".join(conf.env.CXXFLAGS))
Logs.warn("Default flags '%s' are not activated" % " ".join(missingFlags))
else:
extraFlags = flags.getOptimizedFlags(conf)
if not areCustomCxxflagsPresent:
conf.add_supported_cxxflags(extraFlags['CXXFLAGS'])
conf.add_supported_linkflags(extraFlags['LINKFLAGS'])
conf.add_supported_cxxflags(extraFlags['LINKFLAGS'])
conf.env.DEFINES += extraFlags['DEFINES']
@Configure.conf
def add_supported_cxxflags(self, cxxflags):
"""
Check which cxxflags are supported by the active compiler and add them to env.CXXFLAGS variable.
Check which cxxflags are supported by compiler and add them to env.CXXFLAGS variable
"""
if len(cxxflags) == 0:
return
@@ -93,19 +56,17 @@ def add_supported_cxxflags(self, cxxflags):
self.start_msg('Checking supported CXXFLAGS')
supportedFlags = []
for flags in cxxflags:
flags = Utils.to_list(flags)
if self.check_cxx(cxxflags=['-Werror'] + flags, mandatory=False):
supportedFlags += flags
for flag in cxxflags:
if self.check_cxx(cxxflags=['-Werror', flag], mandatory=False):
supportedFlags += [flag]
self.end_msg(' '.join(supportedFlags))
self.env.prepend_value('CXXFLAGS', supportedFlags)
self.env.CXXFLAGS = supportedFlags + self.env.CXXFLAGS
@Configure.conf
def add_supported_linkflags(self, linkflags):
"""
Check which linkflags are supported by the active compiler and add them to env.LINKFLAGS variable.
Check which linkflags are supported by compiler and add them to env.LINKFLAGS variable
"""
if len(linkflags) == 0:
return
@@ -113,129 +74,81 @@ def add_supported_linkflags(self, linkflags):
self.start_msg('Checking supported LINKFLAGS')
supportedFlags = []
for flags in linkflags:
flags = Utils.to_list(flags)
if self.check_cxx(linkflags=['-Werror'] + flags, mandatory=False):
supportedFlags += flags
for flag in linkflags:
if self.check_cxx(linkflags=['-Werror', flag], mandatory=False):
supportedFlags += [flag]
self.end_msg(' '.join(supportedFlags))
self.env.prepend_value('LINKFLAGS', supportedFlags)
self.env.LINKFLAGS = supportedFlags + self.env.LINKFLAGS
class CompilerFlags:
def getCompilerVersion(self, conf):
return tuple(int(i) for i in conf.env.CC_VERSION)
class CompilerFlags(object):
def getGeneralFlags(self, conf):
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are always needed"""
return {
'CXXFLAGS': [],
'LINKFLAGS': [],
'DEFINES': ['BOOST_ASIO_NO_DEPRECATED', 'BOOST_FILESYSTEM_NO_DEPRECATED'],
}
"""Get dict {'CXXFLAGS':[...], LINKFLAGS:[...], DEFINES:[...]} that are always needed"""
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': []}
def getDebugFlags(self, conf):
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are needed only in debug mode"""
"""Get tuple {CXXFLAGS, LINKFLAGS, DEFINES} that are needed in debug mode"""
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['_DEBUG']}
def getOptimizedFlags(self, conf):
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are needed only in optimized mode"""
"""Get tuple {CXXFLAGS, LINKFLAGS, DEFINES} that are needed in optimized mode"""
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['NDEBUG']}
class GccBasicFlags(CompilerFlags):
"""This class defines base flags that work for gcc and clang compiler"""
def getDebugFlags(self, conf):
flags = super(GccBasicFlags, self).getDebugFlags(conf)
flags['CXXFLAGS'] += ['-pedantic', '-Wall',
'-O0',
'-g3',
'-Werror',
'-Wno-error=maybe-uninitialized', # Bug #1615
]
return flags
class GccClangCommonFlags(CompilerFlags):
"""
This class defines common flags that work for both gcc and clang compilers.
"""
def getOptimizedFlags(self, conf):
flags = super(GccBasicFlags, self).getOptimizedFlags(conf)
flags['CXXFLAGS'] += ['-pedantic', '-Wall', '-O2', '-g']
return flags
class GccFlags(GccBasicFlags):
def getGeneralFlags(self, conf):
flags = super().getGeneralFlags(conf)
flags['CXXFLAGS'] += ['-std=c++17']
if Utils.unversioned_sys_platform() != 'darwin':
flags['LINKFLAGS'] += ['-fuse-ld=lld']
flags = super(GccFlags, self).getGeneralFlags(conf)
version = tuple(int(i) for i in conf.env['CC_VERSION'])
if version < (4, 6, 0):
conf.fatal('The version of gcc you are using (%s) is too old.\n' %
'.'.join(conf.env['CC_VERSION']) +
'The minimum supported gcc version is 4.6.0.')
elif version < (4, 7, 0):
flags['CXXFLAGS'] += ['-std=c++0x']
else:
flags['CXXFLAGS'] += ['-std=c++11']
if version < (4, 8, 0):
flags['DEFINES'] += ['_GLIBCXX_USE_NANOSLEEP'] # Bug #2499
return flags
__cxxFlags = [
'-fdiagnostics-color',
'-Wall',
'-Wextra',
'-Wpedantic',
'-Wenum-conversion',
'-Wextra-semi',
'-Wnon-virtual-dtor',
'-Wno-unused-parameter',
]
__linkFlags = ['-Wl,-O1']
def getDebugFlags(self, conf):
flags = super().getDebugFlags(conf)
flags['CXXFLAGS'] += ['-Og', '-g'] + self.__cxxFlags + [
'-Werror',
'-Wno-error=deprecated-declarations', # Bug #3795
'-Wno-error=maybe-uninitialized', # Bug #1615
]
flags['LINKFLAGS'] += self.__linkFlags
flags = super(GccFlags, self).getDebugFlags(conf)
flags['CXXFLAGS'] += ['-Og', # gcc >= 4.8
'-fdiagnostics-color', # gcc >= 4.9
]
return flags
def getOptimizedFlags(self, conf):
flags = super().getOptimizedFlags(conf)
flags['CXXFLAGS'] += ['-O2', '-g1'] + self.__cxxFlags
flags['LINKFLAGS'] += self.__linkFlags
return flags
class GccFlags(GccClangCommonFlags):
__cxxFlags = [
'-Wcatch-value=2',
'-Wcomma-subscript', # enabled by default in C++20
'-Wduplicated-branches',
'-Wduplicated-cond',
'-Wlogical-op',
'-Wredundant-tags',
'-Wvolatile', # enabled by default in C++20
]
def getDebugFlags(self, conf):
flags = super().getDebugFlags(conf)
flags['CXXFLAGS'] += self.__cxxFlags
if platform.machine() == 'armv7l':
flags['CXXFLAGS'] += ['-Wno-psabi'] # Bug #5106
return flags
def getOptimizedFlags(self, conf):
flags = super().getOptimizedFlags(conf)
flags['CXXFLAGS'] += self.__cxxFlags
if platform.machine() == 'armv7l':
flags['CXXFLAGS'] += ['-Wno-psabi'] # Bug #5106
return flags
class ClangFlags(GccClangCommonFlags):
class ClangFlags(GccBasicFlags):
def getGeneralFlags(self, conf):
flags = super().getGeneralFlags(conf)
if Utils.unversioned_sys_platform() == 'darwin':
# Bug #4296
brewdir = '/opt/homebrew' if platform.machine() == 'arm64' else '/usr/local'
flags['CXXFLAGS'] += [
['-isystem', f'{brewdir}/include'], # for Homebrew
['-isystem', '/opt/local/include'], # for MacPorts
]
elif Utils.unversioned_sys_platform() == 'freebsd':
# Bug #4790
flags['CXXFLAGS'] += [['-isystem', '/usr/local/include']]
flags = super(ClangFlags, self).getGeneralFlags(conf)
flags['CXXFLAGS'] += ['-std=c++11',
'-Wno-error=unneeded-internal-declaration', # Bug #1588
'-Wno-error=deprecated-register',
'-Wno-error=unused-local-typedef', # Bug #2657
]
if Utils.unversioned_sys_platform() == "darwin":
flags['CXXFLAGS'] += ['-stdlib=libc++']
flags['LINKFLAGS'] += ['-stdlib=libc++']
return flags
__cxxFlags = [
'-Wundefined-func-template',
'-Wno-unused-local-typedef', # Bugs #2657 and #3209
]
def getDebugFlags(self, conf):
flags = super().getDebugFlags(conf)
flags['CXXFLAGS'] += self.__cxxFlags
return flags
def getOptimizedFlags(self, conf):
flags = super().getOptimizedFlags(conf)
flags['CXXFLAGS'] += self.__cxxFlags
flags = super(ClangFlags, self).getDebugFlags(conf)
flags['CXXFLAGS'] += ['-fcolor-diagnostics']
return flags
+1 -1
View File
@@ -85,7 +85,7 @@ class doxygen(Task.Task):
# Override with any parameters passed to the task generator
if getattr(self.generator, 'pars', None):
for k, v in self.generator.pars.items():
for k, v in self.generator.pars.iteritems():
self.pars[k] = v
self.doxy_inputs = getattr(self, 'doxy_inputs', [])
-108
View File
@@ -1,108 +0,0 @@
#! /usr/bin/env python
# encoding: utf-8
"""
When using this tool, the wscript should look like:
def options(opt):
opt.load('openssl')
def configure(conf):
conf.load('compiler_cxx openssl')
conf.check_openssl()
def build(bld):
bld(source='main.cpp', target='app', use='OPENSSL')
"""
import re
from waflib import Utils
from waflib.Configure import conf
OPENSSL_DIR = ['/usr', '/usr/local', '/opt/local', '/sw']
OPENSSL_DIR_MACOS = ['/usr/local',
'/opt/homebrew/opt/openssl', # Homebrew on arm64
'/usr/local/opt/openssl', # Homebrew on x86_64
'/opt/local'] # MacPorts
def options(opt):
opt.add_option('--with-openssl', type='string', default=None, dest='openssl_dir',
help='directory where OpenSSL is installed, e.g., /usr/local')
@conf
def __openssl_get_version_file(self, dir):
try:
return self.root.find_dir(dir).find_node('include/openssl/opensslv.h')
except:
return None
@conf
def __openssl_find_root_and_version_file(self, root):
if root:
file = self.__openssl_get_version_file(root)
if not file:
self.fatal(f'OpenSSL not found in {root}')
return (root, file)
openssl_dirs = OPENSSL_DIR
if Utils.unversioned_sys_platform() == 'darwin':
openssl_dirs = OPENSSL_DIR_MACOS
for dir in openssl_dirs:
file = self.__openssl_get_version_file(dir)
if file:
return (dir, file)
self.fatal('OpenSSL not found, please provide a --with-openssl=PATH argument (see --help)')
@conf
def __openssl_check_version(self, version_file, atleast_version):
min_version = tuple(int(i) for i in atleast_version.split('.'))
txt = version_file.read()
# OpenSSL 3.0.0 and later
ver_tuple = (re.search(r'^#\s*define\s+OPENSSL_VERSION_MAJOR\s+(\d+)', txt, re.MULTILINE),
re.search(r'^#\s*define\s+OPENSSL_VERSION_MINOR\s+(\d+)', txt, re.MULTILINE),
re.search(r'^#\s*define\s+OPENSSL_VERSION_PATCH\s+(\d+)', txt, re.MULTILINE))
ver_string = re.search(r'^#\s*define\s+OPENSSL_FULL_VERSION_STR\s+"(.+)"', txt, re.MULTILINE)
if all(ver_tuple):
version = tuple(int(i[1]) for i in ver_tuple)
ver_string = ver_string[1] if ver_string else '.'.join(version)
return (version >= min_version, ver_string)
# OpenSSL 1.1.1 and earlier
ver_number = re.search(r'^#\s*define\s+OPENSSL_VERSION_NUMBER\s+(.+)L', txt, re.MULTILINE)
ver_string = re.search(r'^#\s*define\s+OPENSSL_VERSION_TEXT\s+"(.+)"', txt, re.MULTILINE)
if ver_number and ver_string:
version = int(ver_number[1], 16)
min_version = (min_version[0] << 28) | (min_version[1] << 20) | (min_version[2] << 12) | 0xf
return (version >= min_version, ver_string[1])
self.fatal(f'Cannot extract version information from {version_file}')
@conf
def check_openssl(self, *k, **kw):
self.start_msg('Checking for OpenSSL version')
path = k and k[0] or kw.get('path', self.options.openssl_dir)
root, version_file = self.__openssl_find_root_and_version_file(path)
atleast_version = kw.get('atleast_version', 0)
ok, version_str = self.__openssl_check_version(version_file, atleast_version)
self.end_msg(version_str)
if not ok:
self.fatal(f'The version of OpenSSL is too old; {atleast_version} or later is required.\n'
'Please upgrade your distribution or manually install a newer version of OpenSSL.')
if 'msg' not in kw:
kw['msg'] = 'Checking if OpenSSL library works'
if 'lib' not in kw:
kw['lib'] = ['ssl', 'crypto']
if 'uselib_store' not in kw:
kw['uselib_store'] = 'OPENSSL'
if 'define_name' not in kw:
kw['define_name'] = f"HAVE_{kw['uselib_store']}"
kw['includes'] = f'{root}/include'
kw['libpath'] = f'{root}/lib'
self.check_cxx(**kw)
-42
View File
@@ -1,42 +0,0 @@
#! /usr/bin/env python
# encoding: utf-8
from waflib import Logs, Utils, TaskGen
from waflib.Configure import conf
@conf
def check_osx_framework_cxx(conf, fw_name, **kw):
conf.check_cxx(framework_name=fw_name,
uselib_store='OSX_' + fw_name.upper(),
fragment='#include <{0}/{0}.h>\nint main() {{}}'.format(fw_name),
**kw)
@conf
def check_osx_framework_mm(conf, fw_name, **kw):
conf.check_cxx(framework_name=fw_name,
uselib_store='OSX_' + fw_name.upper(),
fragment='#import <{0}/{0}.h>\nint main() {{}}'.format(fw_name),
compile_filename='test.mm',
**kw)
@conf
def check_osx_frameworks(conf, *k, **kw):
if Utils.unversioned_sys_platform() == 'darwin':
try:
conf.check_osx_framework_cxx('CoreFoundation', mandatory=True)
conf.check_osx_framework_cxx('Security', use='OSX_COREFOUNDATION', mandatory=True)
conf.check_osx_framework_cxx('SystemConfiguration', use='OSX_COREFOUNDATION', mandatory=True)
conf.check_osx_framework_mm('Foundation', mandatory=True)
conf.check_osx_framework_mm('CoreWLAN', use='OSX_FOUNDATION', mandatory=True)
conf.define('HAVE_OSX_FRAMEWORKS', 1)
conf.env['HAVE_OSX_FRAMEWORKS'] = True
except:
Logs.warn('Building on macOS, but one or more required frameworks are not functional.')
Logs.warn('Note that the frameworks are known to work only with the Apple clang compiler.')
@TaskGen.extension('.mm')
def m_hook(self, node):
'''Alias .mm files to be compiled the same as .cpp files, clang will do the right thing.'''
return self.create_compiled_task('cxx', node)
+36
View File
@@ -0,0 +1,36 @@
#! /usr/bin/env python
# encoding: utf-8
from waflib import Logs, Utils
from waflib.Configure import conf
OSX_SECURITY_CODE='''
#include <CoreFoundation/CoreFoundation.h>
#include <Security/Security.h>
#include <Security/SecRandom.h>
#include <CoreServices/CoreServices.h>
#include <Security/SecDigestTransform.h>
int main(int argc, char **argv) {
(void)argc; (void)argv;
return 0;
}
'''
@conf
def check_osx_security(conf, *k, **kw):
if Utils.unversioned_sys_platform() == "darwin":
try:
conf.check_cxx(framework_name='CoreFoundation', uselib_store='OSX_COREFOUNDATION',
mandatory=True)
conf.check_cxx(framework_name='CoreServices', uselib_store='OSX_CORESERVICES',
mandatory=True)
conf.check_cxx(framework_name='Security', uselib_store='OSX_SECURITY',
define_name='HAVE_SECURITY', use="OSX_COREFOUNDATION",
fragment=OSX_SECURITY_CODE, mandatory=True)
conf.define('HAVE_OSX_SECURITY', 1)
conf.env['HAVE_OSX_SECURITY'] = True
except:
Logs.warn("Compiling on OSX, but CoreFoundation, CoreServices, or Security framework is not functional.")
Logs.warn("The frameworks are known to work only with Apple-specific compilers: llvm-gcc-4.2 or clang")
+7 -2
View File
@@ -52,7 +52,7 @@ Note that precompiled header must have multiple inclusion guards. If the guards
"""
import os
from waflib import Task, TaskGen, Utils
from waflib import Task, TaskGen, Logs, Utils
from waflib.Tools import c_preproc, cxx
@@ -67,6 +67,11 @@ def options(opt):
def configure(conf):
if (conf.options.with_pch and conf.env['COMPILER_CXX'] in PCH_COMPILER_OPTIONS.keys()):
if Utils.unversioned_sys_platform() == "darwin" and conf.env['CXX_NAME'] == 'clang':
version = tuple(int(i) for i in conf.env['CC_VERSION'])
if version < (6, 1, 0):
# Issue #2804
return
conf.env.WITH_PCH = True
flags = PCH_COMPILER_OPTIONS[conf.env['COMPILER_CXX']]
conf.env.CXXPCH_F = flags[0]
@@ -129,7 +134,7 @@ def add_pch(self):
x.env.append_value('CXXFLAGS', self.env['CXXPCH_F'] + [pch.target])
class gchx(Task.Task):
run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CXXPCH_FLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXXPCH_F:SRC} ${CXX_SRC_F}${SRC[0].abspath()} ${CXX_TGT_F}${TGT[0].abspath()} ${CPPFLAGS}'
run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CPPFLAGS} ${CXXPCH_FLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXXPCH_F:SRC} ${CXX_SRC_F}${SRC[0].abspath()} ${CXX_TGT_F}${TGT[0].abspath()}'
scan = c_preproc.scan
color = 'BLUE'
ext_out=['.h']
-22
View File
@@ -1,22 +0,0 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
def options(opt):
opt.add_option('--with-sanitizer', action='store', default='', dest='sanitizers',
help='Comma-separated list of compiler sanitizers to enable [default=none]')
def configure(conf):
for san in conf.options.sanitizers.split(','):
if not san:
continue
sanflag = '-fsanitize=%s' % san
conf.start_msg('Checking if compiler supports %s' % sanflag)
if conf.check_cxx(cxxflags=['-Werror', sanflag, '-fno-omit-frame-pointer'],
linkflags=[sanflag], mandatory=False):
conf.end_msg('yes')
conf.env.append_unique('CXXFLAGS', [sanflag, '-fno-omit-frame-pointer'])
conf.env.append_unique('LINKFLAGS', [sanflag])
else:
conf.end_msg('no', color='RED')
conf.fatal('%s sanitizer is not supported by the current compiler' % san)
+8 -8
View File
@@ -44,28 +44,28 @@ def apply_sphinx(self):
task.inputs.append(conf)
confdir = conf.parent.abspath()
buildername = getattr(self, 'builder', 'html')
srcdir = getattr(self, 'srcdir', confdir)
outdir = self.path.find_or_declare(getattr(self, 'outdir', buildername)).get_bld()
doctreedir = getattr(self, 'doctreedir', os.path.join(outdir.abspath(), '.doctrees'))
buildername = getattr(self, "builder", "html")
srcdir = getattr(self, "srcdir", confdir)
outdir = self.path.find_or_declare(getattr(self, "outdir", buildername)).get_bld()
doctreedir = getattr(self, "doctreedir", os.path.join(outdir.abspath(), ".doctrees"))
task.env['BUILDERNAME'] = buildername
task.env['SRCDIR'] = srcdir
task.env['DOCTREEDIR'] = doctreedir
task.env['OUTDIR'] = outdir.abspath()
task.env['VERSION'] = 'version=%s' % self.version
task.env['RELEASE'] = 'release=%s' % getattr(self, 'release', self.version)
task.env['VERSION'] = "version=%s" % self.VERSION
task.env['RELEASE'] = "release=%s" % self.VERSION
import imp
confData = imp.load_source('sphinx_conf', conf.abspath())
if buildername == 'man':
if buildername == "man":
for i in confData.man_pages:
target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
task.outputs.append(target)
if self.install_path:
self.bld.install_files('%s/man%d/' % (self.install_path, i[4]), target)
self.bld.install_files("%s/man%d/" % (self.install_path, i[4]), target)
else:
task.outputs.append(outdir)
+6 -5
View File
@@ -1,15 +1,16 @@
#! /usr/bin/env python
# encoding: utf-8
from waflib import Options, Logs
from waflib.Configure import conf
def options(opt):
opt.add_option('--with-sqlite3', type='string', default=None, dest='sqlite3_dir',
help='directory where SQLite3 is installed, e.g., /usr/local')
opt.add_option('--with-sqlite3', type='string', default=None,
dest='with_sqlite3', help='''Path to SQLite3, e.g., /usr/local''')
@conf
def check_sqlite3(self, *k, **kw):
root = k and k[0] or kw.get('path', self.options.sqlite3_dir)
root = k and k[0] or kw.get('path', None) or Options.options.with_sqlite3
mandatory = kw.get('mandatory', True)
var = kw.get('uselib_store', 'SQLITE3')
@@ -19,8 +20,8 @@ def check_sqlite3(self, *k, **kw):
define_name='HAVE_%s' % var,
uselib_store=var,
mandatory=mandatory,
includes='%s/include' % root,
libpath='%s/lib' % root)
includes="%s/include" % root,
libpath="%s/lib" % root)
else:
try:
self.check_cfg(package='sqlite3',
+15
View File
@@ -0,0 +1,15 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
def checkForTypeProperty(conf, prop, tparams):
if conf.check_cxx(msg=('Checking for std::%s' % prop),
fragment=('#include <type_traits>\nstatic_assert(std::%s<%s>::value, "");' %
(prop, tparams)),
features='cxx', mandatory=False):
define = 'HAVE_' + prop.upper()
conf.define(define, 1)
conf.env[define] = True
def configure(conf):
checkForTypeProperty(conf, 'is_default_constructible', 'int')
checkForTypeProperty(conf, 'is_nothrow_move_constructible', 'int')
checkForTypeProperty(conf, 'is_nothrow_move_assignable', 'int')
+33 -57
View File
@@ -1,61 +1,37 @@
# ndn-cxx Authors
ndn-cxx authors
===============
The following lists maintainers, primary developers, and all much-appreciated contributors to ndn-cxx in alphabetical order.
The specific contributions of individual authors can be obtained from the git history of the [official ndn-cxx repository](https://github.com/named-data/ndn-cxx).
If you would like to become a contributor to the official repository, please follow the recommendations in <https://github.com/named-data/.github/blob/main/CONTRIBUTING.md>.
## The primary authors are (and/or have been):
* Sepehr Abdous <https://sepehrabdous.github.io>
* ***(Maintainer)*** Alexander Afanasyev <https://users.cs.fiu.edu/~afanasyev>
* Syed Obaid Amin <http://obaidamin.weebly.com>
* Hila Ben Abraham <https://sites.wustl.edu/hbabraham>
* Shuo Chen <https://github.com/chenatu>
* Muktadir R. Chowdhury <https://github.com/alvyC>
* Jeremy Clark <https://github.com/jrandallclark>
* Damian Coomes <https://github.com/dmcoomes>
* Stephanie DiBenedetto
* Qiuhan Ding <https://irl.cs.ucla.edu/~qiuhanding>
* Chengyu Fan <https://github.com/chengyu>
* Laqin Fan <https://github.com/laqinfan>
* Ashlesh Gawande <https://www.linkedin.com/in/agawande>
* Chavoosh Ghasemi <https://chavoosh.github.io>
* Mathias Gibbens <https://calenhad.com>
* Nick Gordon <https://github.com/gorgonical>
* Xiaoke Jiang <http://netarchlab.tsinghua.edu.cn/~shock>
* Marcin Juszkiewicz <https://marcin.juszkiewicz.com.pl>
* Luca Keidel <https://lucakeidel.de>
* Spencer Lee <https://www.linkedin.com/in/spenlee>
* Vince Lehman <http://vslehman.com>
* Yanbiao Li <https://www.linkedin.com/pub/yanbiao-li/24/7a1/4ba>
* Teng Liang <https://cs.arizona.edu/~philoliang>
* Weiwei Liu <https://www.linkedin.com/in/weiweiliu10>
* Tianxing Ma <https://github.com/matianxing1992>
* Xingyu Ma <https://www.linkedin.com/pub/xingyu-ma/1a/384/5a8>
* Spyridon Mastorakis <https://sites.google.com/site/spyridonmastorakis>
* Ernest McCracken <https://github.com/emccrckn>
* Stephen McQuistin <https://smcquistin.uk>
* Ilya Moiseenko <https://www.linkedin.com/in/ilya-moiseenko-52884317>
* Alex Nano <http://alexnano.net>
* Eric Newberry <https://ericnewberry.com>
* Arthi Padmanabhan <https://github.com/arthipadmanabhan>
* Ju Pan <https://cs-jupan.com>
* João Pereira <http://website.jpereira.co.uk>
* ***(Maintainer)*** Davide Pesavento <https://github.com/Pesa>
* José Quevedo <http://atnog.av.it.pt/members/jquevedo>
* Md Ashiqur Rahman <https://ashiqrahman.com>
* Niv Sardi <http://core.evilgiggle.com>
* Wentao Shang <https://irl.cs.ucla.edu/~wentao>
* Susmit Shannigrahi <https://susm.it>
* Junxiao Shi <https://cs.arizona.edu/~shijunxiao>
* Michael Sweatt <https://www.linkedin.com/in/michaelsweatt>
* Jiewen Tan <https://github.com/alanwaketan>
* ***(Former Maintainer)*** Jeff Thompson <https://remap.ucla.edu/jeff-thompson>
* Yukai Tu <https://irl.cs.ucla.edu/~yukai>
* Yingdi Yu <https://irl.cs.ucla.edu/~yingdi>
* Zhiyi Zhang <https://zhiyi-zhang.com>
* Zhenkai Zhu <https://irl.cs.ucla.edu/~zhenkai>
* Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
* Yingdi Yu <http://irl.cs.ucla.edu/~yingdi/>
* Junxiao Shi <http://www.cs.arizona.edu/people/shijunxiao/>
* Jeff Thompson <jefft0@remap.ucla.edu>
* Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
## Technical Advisors
## All project authors and contributors
* Jeff Burke <https://jeff-burke.com>
* Beichuan Zhang <https://cs.arizona.edu/~bzhang>
* Lixia Zhang <https://cs.ucla.edu/~lixia>
The following is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS,
people who have reported bugs, submitted patches, and implemented new features
in the library:
* Wentao Shang <http://irl.cs.ucla.edu/~wentao/>
* Steve DiBenedetto <http://www.cs.colostate.edu/~dibenede/>
* Davide Pesavento <http://www.lip6.fr/actualite/personnes-fiche.php?ident=D1469>
* Syed Obaid Amin <http://obaidamin.weebly.com/>
* Shuo Chen <chenatu2006@gmail.com>
* Hila Ben Abraham <http://research.engineering.wustl.edu/~abrahamh/>
* Xingyu Ma <http://www.linkedin.com/pub/xingyu-ma/1a/384/5a8>
* Michael Sweatt <https://www.linkedin.com/in/michaelsweatt>
* Lixia Zhang <http://www.cs.ucla.edu/~lixia/home.html>
* Jeff Burke <http://remap.ucla.edu/jburke/>
* Xiaoke Jiang <http://netarchlab.tsinghua.edu.cn/~shock/>
* Jiewen Tan <alanwake@ucla.edu>
* Vince Lehman <http://vslehman.com>
* Mathias Gibbens <gibmat@cs.arizona.edu>
* Chengyu Fan <chengyu@cs.colostate.edu>
* Qiuhan Ding <http://irl.cs.ucla.edu/~qiuhanding/>
* Spyridon Mastorakis <http://cs.ucla.edu/~mastorakis/>
* Eric Newberry <http://ericnewberry.com>
* João Pereira <http://website.jpereira.co.uk>
* Mickey Sweatt <https://www.linkedin.com/in/michaelsweatt>
+483 -474
View File
File diff suppressed because it is too large. Load diff
-26
View File
@@ -1,26 +0,0 @@
FROM gcc:12-bookworm
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
dpkg-dev \
libboost-atomic-dev \
libboost-chrono-dev \
libboost-date-time-dev \
libboost-filesystem-dev \
libboost-iostreams-dev \
libboost-log-dev \
libboost-program-options-dev \
libboost-regex-dev \
libboost-stacktrace-dev \
libboost-system-dev \
pkg-config \
&& rm -rf /var/lib/apt/lists/*
COPY . /ndn-cxx
RUN cd /ndn-cxx \
&& ./waf configure --without-pch --prefix=/usr --sysconfdir=/etc --localstatedir=/var --disable-static --enable-shared \
&& ./waf \
&& ./waf install \
&& cd \
&& rm -rf /ndn-cxx
+13 -66
View File
@@ -1,24 +1,22 @@
Notes for ndn-cxx developers
============================
If you are new to the NDN software community, please read our
[Contributor's Guide](https://github.com/named-data/.github/blob/main/CONTRIBUTING.md).
Code style
----------
ndn-cxx code is subject to [ndn-cxx code style](https://docs.named-data.net/ndn-cxx/current/code-style.html).
ndn-cxx code is subject to [ndn-cxx code style](http://named-data.net/doc/ndn-cxx/current/code-style.html).
Licensing
---------
Contributions to ndn-cxx must be licensed under the LGPL v3 or a compatible license.
If you choose the LGPL v3, please use the following license boilerplate in all `.hpp`
and `.cpp` files:
Contributions to the library must be licensed under LGPL 3.0 or compatible license. If
you are choosing LGPL 3.0, please use the following license boilerplate in all `.hpp` and
`.cpp` files:
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) [Year(s)] [Copyright Holder(s)].
/**
* Copyright (c) [Year(s)] [Copyright Holder].
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -35,63 +33,12 @@ and `.cpp` files:
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
////// [optional part] //////
*
* @author Author's Name <email@domain-or-homepage://url>
* @author Other Author's Name <another.email@domain-or-homepage://url>
////// [end of optional part] //////
*/
If you are affiliated to an NSF-supported NDN project institution, please use the [NDN Team License
Boilerplate](https://redmine.named-data.net/projects/ndn-cxx/wiki/NDN_Team_License_Boilerplate_(ndn-cxx)).
Running unit tests
------------------
To run the unit tests, ndn-cxx needs to be built with unit test support and installed
into the configured location. For example:
./waf configure --with-tests # --debug is also strongly recommended while developing
./waf
sudo ./waf install
**Note**: On Linux you also need to run `sudo ldconfig` to reconfigure dynamic loader
run-time bindings.
The simplest way to run the tests is to launch the compiled binary without any parameters:
./build/unit-tests
The [Boost.Test framework](https://www.boost.org/doc/libs/1_71_0/libs/test/doc/html/index.html)
is very flexible and allows a number of run-time customization of what tests should be run.
For example, it is possible to choose to run only a specific test suite, only a specific
test case within a suite, or specific test cases within specific test suites:
# Run only Face test suite tests (tests/unit/face.t.cpp)
./build/unit-tests -t TestFace
# Run only test case ExpressInterestData from the same test suite
./build/unit-tests -t TestFace/ExpressInterestData
# Run Basic test case from all test suites
./build/unit-tests -t */Basic
By default, Boost.Test framework will produce verbose output only when a test case fails.
If it is desired to see verbose output (result of each test assertion), add `-l all`
option to `./build/unit-tests` command. To see test progress, you can use `-l test_suite`,
or `-p` to show a progress bar:
# Show report all log messages including the passed test notification
./build/unit-tests -l all
# Show test suite messages
./build/unit-tests -l test_suite
# Show nothing
./build/unit-tests -l nothing
# Show progress bar
./build/unit-tests -p
There are many more command line options available, information about which can be obtained
either from the command line using the `--help` switch, or online on the
[Boost.Test website](https://www.boost.org/doc/libs/1_71_0/libs/test/doc/html/boost_test/runtime_config.html).
**Warning:** If you have customized parameters for NDN platform using `client.conf` in
`/etc/ndn` or `/usr/local/etc/ndn` (or other `@SYSCONFDIR@/etc` if it was configured to custom
path during `./waf configure`), Face-related test cases may fail.
Boilerplate](http://redmine.named-data.net/projects/ndn-cxx/wiki/NDN_Team_License_Boilerplate_(ndn-cxx)).
+21 -42
View File
@@ -1,51 +1,30 @@
<div align="center">
ndn-cxx: NDN C++ library with eXperimental eXtensions
=====================================================
[<img alt height="65" src="docs/named_data_theme/static/ndn-logo.svg"/>](https://named-data.net/)
ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be
used to implement various NDN applications. The library is currently being used as part
of the following projects:
# ndn-cxx: NDN C++ library with eXperimental eXtensions
* [NFD - NDN Forwarding Daemon](https://github.com/named-data/NFD)
* [NLSR - Named-data Link-State Routing protocol](https://github.com/named-data/NLSR)
* [repo-ng - Next generation of NDN repository](https://github.com/named-data/repo-ng)
* [ChronoChat - Multi-user NDN chat application](https://github.com/named-data/ChronoChat)
* [ChronoSync - Sync library for multiuser realtime applications for NDN](https://github.com/named-data/ChronoSync)
* [ndn-tlv-ping - Ping Application For NDN](https://github.com/named-data/ndn-tlv-ping)
* [ndn-traffic-generator - Traffic Generator For NDN](https://github.com/named-data/ndn-traffic-generator)
</div>
See the file [`docs/INSTALL.rst`](https://github.com/cawka/ndn-cxx/blob/master/docs/INSTALL.rst)
for build and install instructions.
[![CI](https://github.com/named-data/ndn-cxx/actions/workflows/ci.yml/badge.svg)](https://github.com/named-data/ndn-cxx/actions/workflows/ci.yml)
[![Docs](https://github.com/named-data/ndn-cxx/actions/workflows/docs.yml/badge.svg)](https://github.com/named-data/ndn-cxx/actions/workflows/docs.yml)
![Language](https://img.shields.io/badge/C%2B%2B-17-blue)
![Latest version](https://img.shields.io/github/v/tag/named-data/ndn-cxx?label=Latest%20version)
Please submit any bugs or issues to the ndn-cxx issue tracker:
http://redmine.named-data.net/projects/ndn-cxx/issues
**ndn-cxx** is a C++17 library implementing Named Data Networking (NDN) primitives
that can be used to write various NDN applications. The library is currently being
used by the following projects:
## More documentation
* [**NFD** - NDN Forwarding Daemon](https://github.com/named-data/NFD)
* [**NLSR** - Named-data Link-State Routing protocol](https://github.com/named-data/NLSR)
* [**ndn-tools** - Essential NDN command-line tools](https://github.com/named-data/ndn-tools)
* [**ndn-svs** - State Vector Sync library](https://github.com/named-data/ndn-svs)
* [**PSync** - Partial and full Sync library](https://github.com/named-data/PSync)
* [**ChronoSync** - Sync library for distributed real-time applications *(deprecated)*](https://github.com/named-data/ChronoSync)
* [**NAC** - Name-based Access Control library](https://github.com/named-data/name-based-access-control)
* [**NDNCERT** - NDN certificate management protocol](https://github.com/named-data/ndncert)
* [**repo-ng** - NDN repository implementation in C++ *(deprecated)*](https://github.com/named-data/repo-ng)
* [**ndn-traffic-generator** - Simple NDN traffic generator](https://github.com/named-data/ndn-traffic-generator)
## Documentation
See [`docs/INSTALL.rst`](docs/INSTALL.rst) for compilation and installation instructions.
Extensive documentation is available on the library's [homepage](https://docs.named-data.net/ndn-cxx/).
## Reporting bugs
Please submit any bug reports or feature requests to the
[ndn-cxx issue tracker](https://redmine.named-data.net/projects/ndn-cxx/issues).
## Contributing
Contributions to ndn-cxx are greatly appreciated and can be made through our
[Gerrit code review site](https://gerrit.named-data.net/).
If you are new to the NDN software community, please read our
[Contributor's Guide](https://github.com/named-data/.github/blob/main/CONTRIBUTING.md)
and [`README-dev.md`](README-dev.md) to get started.
Extensive documentation of the library is available on the library's homepage:
http://www.named-data.net/doc/ndn-cxx/
## License
ndn-cxx is free software distributed under the GNU Lesser General Public License version 3.
See [`COPYING.md`](COPYING.md) for details.
ndn-cxx is an open source project licensed under LGPL 3.0 license. For more information about
the license, refer to [`COPYING.md`](https://github.com/named-data/ndn-cxx/blob/master/COPYING.md).
+1
View File
@@ -0,0 +1 @@
docs/RELEASE_NOTES.rst
+12 -14
View File
@@ -1,27 +1,25 @@
; "transport" specifies Face's default transport connection.
; The value can be a "unix:" or "tcp4:" Face URI.
; The value is a unix or tcp4 scheme Face URI.
;
; For example:
;
; unix:///var/run/nfd.sock
; tcp://192.0.2.1
; tcp4://example.com:6363
;
; The default value of this field is platform-dependent, being unix:///run/nfd.sock on Linux and
; unix:///var/run/nfd.sock on other platforms.
;
;transport=unix:///var/run/nfd.sock
transport=unix:///var/run/nfd.sock
; "pib" determines which Public Info Base (PIB) should used by default in applications.
; If "pib" is not specified, a platform-dependent default will be used.
; If "pib" is not specified, the default PIB will be used.
; Note that default PIB could be different on different system.
; If "pib" is specified, it may have a value of:
; pib-sqlite3
;
;pib=pib-sqlite3
; pib=pib-sqlite3
; "tpm" determines which Trusted Platform Module (TPM) should used by default in applications.
; If "tpm" is not specified, a platform-dependent default will be used.
; If "tpm" is not specified, the default TPM will be used.
; Note that default TPM could be different on different system.
; If "tpm" is specified, it may have a value of:
; tpm-osxkeychain (default on macOS)
; tpm-file (default in operating systems other than macOS)
;
;tpm=tpm-file
; tpm-osxkeychain (default in OS X)
; tpm-file (default in operating systems other than OS X)
; tpm=tpm-file
+202 -183
View File
@@ -1,225 +1,226 @@
.. _Getting Started with ndn-cxx:
Getting started with ndn-cxx
============================
Supported platforms
-------------------
ndn-cxx is built against a continuous integration system and has been tested on the
following platforms:
ndn-cxx uses continuous integration and has been tested on the following
platforms:
- Ubuntu 20.04 (focal)
- Ubuntu 22.04 (jammy)
- Debian 11 (bullseye)
- Debian 12 (bookworm)
- CentOS Stream 9
- macOS 11 / 12 / 13 / 14
- Ubuntu 12.04 (64-bit and 32-bit)
- Ubuntu 14.04 (64-bit and 32-bit)
- Ubuntu 14.10 (64-bit and 32-bit)
- OS X 10.8
- OS X 10.9
- OS X 10.10
ndn-cxx should also work on the following platforms, although they are not officially
ndn-cxx is known to work on the following platforms, although they are not officially
supported:
- Any other recent version of Ubuntu not listed above
- Fedora >= 33
- Alpine >= 3.12
- Any version of Raspberry Pi OS based on Debian 11 (bullseye) or later
- macOS 10.15
- FreeBSD >= 12.2
- Fedora >= 20
- CentOS >= 6.2
- Gentoo Linux
- FreeBSD >= 10.0
- Raspbian >= 3.12
Prerequisites
-------------
Required
~~~~~~~~
Required:
~~~~~~~~~
- GCC >= 9.3 or clang >= 7.0 (if you are on Linux or FreeBSD)
- Xcode >= 12.4 or corresponding version of Command Line Tools (if you are on macOS)
- Python >= 3.8
- pkg-config
- Boost >= 1.71.0
- OpenSSL >= 1.1.1
- SQLite 3.x
- ``python`` >= 2.6
- ``libsqlite3``
- ``libcrypto++``
- ``pkg-config``
- Boost libraries >= 1.48
- OSX Security framework (on OSX platform only)
To build ndn-cxx from source, one must first install a C++ compiler and all necessary
development tools and libraries:
Following are the detailed steps for each platform to install the compiler, all necessary
development tools and libraries, and ndn-cxx prerequisites.
- On **Debian** and **Ubuntu**
- OS X
In a terminal, enter::
Install Xcode. In Xcode Preferences > Downloads, install "Command
Line Tools".
sudo apt install build-essential pkg-config python3-minimal libboost-all-dev libssl-dev libsqlite3-dev
If using MacPorts, dependencies can be installed using the following
commands::
- On **CentOS** and **Fedora**
sudo port install pkgconfig boost sqlite3 libcryptopp
In a terminal, enter::
.. note::
sudo dnf install gcc-c++ pkgconf-pkg-config python3 boost-devel openssl-devel sqlite-devel
If a major OS X system upgrade is performed after installing dependencies with MacPorts,
remember to `reinstall all ports <https://trac.macports.org/wiki/Migration>`__.
- On **macOS**
- Ubuntu
* Install either Xcode (from the App Store) or the Command Line Tools
(with ``xcode-select --install``)
In a terminal, enter::
* If using Homebrew (recommended), enter the following in a terminal:
sudo apt-get install build-essential
sudo apt-get install libsqlite3-dev libcrypto++-dev
.. code-block:: sh
# For Ubuntu 12.04
sudo apt-get install libboost1.48-all-dev
brew install boost openssl pkg-config
# For all other Ubuntu versions
sudo apt-get install libboost-all-dev
.. warning::
- Fedora
If a major OS upgrade is performed after installing the dependencies
with Homebrew, remember to reinstall all packages.
In a terminal, enter::
- On **FreeBSD**
sudo yum install gcc-g++ git
sudo yum install sqlite-devel cryptopp-devel boost-devel
In a terminal, enter::
Optional:
~~~~~~~~~
sudo pkg install pkgconf python3 boost-libs openssl sqlite3
To build tutorials, manpages, and API documentation the following
dependencies need to be installed:
Optional
~~~~~~~~
- ``doxygen``
- ``graphviz``
- ``python-sphinx`` and sphinx extensions ``sphinxcontrib-doxylink``,
``sphinxcontrib-googleanalytics``
To build tutorials, man pages, and API documentation the following additional dependencies
need to be installed:
The following lists steps for common platforms to install these prerequisites:
- doxygen
- graphviz
- sphinx >= 4.0
- sphinxcontrib-doxylink
- On OS X with MacPorts::
The following lists the steps to install these prerequisites on various common platforms.
sudo port install doxygen graphviz py27-sphinx sphinx_select
sudo port select sphinx py27-sphinx
.. note::
On Linux, you may need to add ``$HOME/.local/bin`` to the ``PATH`` environment variable
for your user, for example:
# Install sphinx extensions
sudo port install py27-pip
sudo port select pip pip27
sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
.. code-block:: sh
- On Ubuntu::
export PATH="${HOME}/.local/bin${PATH:+:}${PATH}"
sudo apt-get install doxygen graphviz python-sphinx python-pip
sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
- On **Debian** and **Ubuntu**:
- On Fedora::
.. code-block:: sh
sudo yum install doxygen graphviz python-sphinx
sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
sudo apt install doxygen graphviz python3-pip
pip3 install --user sphinx sphinxcontrib-doxylink
- On **CentOS** and **Fedora**:
.. code-block:: sh
sudo dnf install doxygen graphviz python3-pip
pip3 install --user sphinx sphinxcontrib-doxylink
- On **macOS**:
.. code-block:: sh
brew install doxygen graphviz
sudo pip3 install sphinx sphinxcontrib-doxylink
- On **FreeBSD**:
.. code-block:: sh
sudo pkg install doxygen graphviz py39-sphinx
.. _build:
Build
-----
.. note::
These are instructions for regular builds of ndn-cxx (release mode). If you are
planning to develop the ndn-cxx code itself, you should do a :ref:`Development build`.
(These are instructions to build ndn-cxx. To do development of ndn-cxx
code and update the build system, see Development.)
To build in a terminal, change directory to the ndn-cxx root, then enter:
To build in a terminal, change directory to the ndn-cxx root. Enter:
.. code-block:: sh
::
./waf configure
./waf
sudo ./waf install
By default, only the shared variant of the ndn-cxx library will be built. To build the
static library, pass ``--enable-static`` to the ``./waf configure`` command:
.. code-block:: sh
By default, only the shared version of ndn-cxx library is built. To build the static library,
use ``--enable-static`` option for ``./waf configure`` command. For example::
./waf configure --enable-static
To disable the build of the shared library and build only the static library, use the
additional ``--disable-shared`` option. Note that at least one variant of the library
needs to be enabled.
To disable build of the shared library and build only the static library, use additional
``--disable-shared`` option. Note that at least one version of the library needs to be
enabled.
.. code-block:: sh
::
./waf configure --enable-static --disable-shared
On Linux, it is necessary to run the following command after the shared library has
been installed:
.. code-block:: sh
After the shared library is built and installed, some systems require additional actions.
sudo ldconfig
- on Linux::
.. note::
When the library is installed in a non-default location (in general: not in ``/usr/lib``
or ``/usr/local/lib``; on some Linux distros like Fedora and its derivatives, including
CentOS: not in ``/usr/lib``), the following additional actions may be necessary.
sudo ldconfig
The library installation path should be added to ``/etc/ld.so.conf`` or in
``/etc/ld.so.conf.d/*.conf`` **before** running ``ldconfig``. For example:
- on FreeBSD::
.. code-block:: sh
sudo ldconfig -m
echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/ndn-cxx.conf
.. note::
When library is installed in a non-standard path (in general: not in ``/usr/lib`` or
``/usr/local/lib``; on some Linux distros including Fedora: not in ``/usr/lib``),
additional actions may be necessary.
Alternatively, the ``LD_LIBRARY_PATH`` environment variable can be set to point to
the installation directory of the shared library:
The installation path should be added to ``/etc/ld.so.conf`` (or in
``/etc/ld.so.conf.d``) **before** running ``sudo ldconfig``. For example::
.. code-block:: sh
echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/ndn-cxx.conf
export LD_LIBRARY_PATH=/usr/local/lib
Alternatively, ``LD_LIBRARY_PATH`` environment variable should be set to the location of
the library::
The ``./waf install`` command installs the following files:
export LD_LIBRARY_PATH=/usr/local/lib
- ``<LIBPATH>/libndn-cxx.a``: static NDN C++ library (if enabled).
This builds and installs the following items:
- ``<LIBPATH>/libndn-cxx.a``: static NDN C++ library (if enabled)
- ``<LIBPATH>/libndn-cxx.so``, ``<LIBPATH>/libndn-cxx.so.<VERSION>`` (on Linux),
``<LIBPATH>/libndn-cxx.dylib``, ``<LIBPATH>/libndn-cxx.<VERSION>.dylib`` (on macOS):
shared NDN C++ library (if enabled).
- ``<LIBPATH>/pkgconfig/libndn-cxx.pc``: pkgconfig file storing all necessary flags to
build against the library. For example, if the ``pkg-config`` or ``pkgconf-pkg-config``
package is installed and ``PKG_CONFIG_PATH`` is configured properly (or if
``<LIBPATH>/pkgconfig`` is a default search path), the command ``pkg-config --cflags
--libs libndn-cxx`` will return all necessary compile and link flags for the library.
- ``<BINPATH>/ndnsec``: command-line tool to manage NDN keys and certificates.
- ``<BINPATH>/ndnsec-*``: convenience aliases for ``ndnsec`` tools.
``<LIBPATH>/libndn-cxx.dylib``, ``<LIBPATH>/libndn-cxx.<VERSION>.dylib`` (on OS X):
shared NDN C++ library (if enabled)
- ``<LIBPATH>/pkgconfig/libndn-cxx.pc``: pkgconfig file storing all
neccessary flags to build against the library. For example, if
pkgconfig or pkgconf package is installed and ``PKG_CONFIG_PATH`` is
configured properly (or ``<LIBPATH>/pkgconfig`` is a default path),
``pkgconfig --libs --clflags libndn-cxx`` will return all necessary
compile and link flags for the library.
- ``<BINPATH>/tlvdump``: a simple tool to dump contents of
TLV-formatted data
- ``<BINPATH>/ndncatchunks3``: a simplified equivalent to ndncatchunks2
in NDNx package
- ``<BINPATH>/ndnputchunks3``: a simplified equivalent to ndnputchunks2
in NDNx package
- ``<BINPATH>/ndnsec``: tool to manage NDN keys and certificates
- ``<BINPATH>/ndnsec-*``: convenience scripts for ``ndnsec`` tools
If configured with tests (``./waf configure --with-tests``), the above commands
will also produce:
If configured with tests: ``./waf configure --with-tests``), the above
commands will also produce:
- ``build/unit-tests``: a unit test binary for the library.
- ``build/unit-tests``: A unit test binary for the library
1.5 GB available memory per CPU core is necessary for efficient compilation. On a
multi-core machine with less than 1.5 GB available memory per CPU core, limit the
objects being compiled in parallel with ``./waf -jN``, where N is the amount of
available memory divided by 1.5 GB (e.g., ``./waf -j2`` for 3 GB of memory). This
should avoid memory thrashing and result in faster compilation.
1.5GB available memory per CPU core is necessary for efficient compilation.
On a multi-core machine with less than 1.5GB available memory per CPU core,
limit the objects being compiled in parallel with ``./waf -jN`` where N is the amount
of available memory divided by 1.5GB (eg. ``./waf -j1`` for 1.5GB memory),
which could usually avoid memory thrashing and result in faster compilation.
Build with examples
-------------------
By default, the examples in the ``examples/`` directory will not be built. To enable
them, pass ``--with-examples`` during the configuration step:
By default, examples in ``examples/`` are not build. To enable them, use
``--with-examples`` configure option:
.. code-block:: sh
::
./waf configure --with-examples
./waf
sudo ./waf install
sudo ldconfig # on Linux only
To run the examples:
:ref:`Additional step <build>`:
.. code-block:: sh
- on Linux::
sudo ldconfig
- on FreeBSD::
sudo ldconfig -m
To run examples:
::
# trivial producer app
./build/examples/producer
@@ -230,89 +231,107 @@ To run the examples:
# trivial consumer app with timers
./build/examples/consumer-with-timer
If you want to make a new sample application, just create a ``.cpp`` file inside the
``examples/`` directory and it will be compiled during the next run of ``./waf``:
If you want to test out a sample application, just create a ``.cpp`` file in ``examples/``
folder and it will be compiled on the next run on ``./waf``. For example:
.. code-block:: sh
::
cp examples/consumer.cpp examples/my-new-app.cpp
... # edit examples/my-new-app.cpp with your preferred editor
cp examples/consumer.cpp examples/my-new-consumer-app.cpp
./waf
sudo ./waf install
sudo ldconfig # on Linux only
./build/examples/my-new-app
./build/examples/my-new-consumer-app
Debug symbols
-------------
~~~~~~~~~~~~~
The default compiler flags include debug symbols in binaries. This should provide
more meaningful debugging information if ndn-cxx or your application crashes.
The default compiler flags enable debug symbols to be included in binaries (i.e., ``-g``
flag for ``./waf configure`` and ``-g3`` for ``./waf configure --debug``). This
potentially allows more meaningful debugging information if your application crashes.
If this is not desired, the default flags can be overridden to disable debug symbols.
The following example shows how to completely disable debug symbols and configure
ndn-cxx to be installed into ``/usr`` with configuration in the ``/etc`` directory.
If it is undesirable, default flags can be easily overridden:
.. code-block:: sh
::
CXXFLAGS="-O2" ./waf configure --prefix=/usr --sysconfdir=/etc
./waf
sudo ./waf install
Customizing the compiler
------------------------
:ref:`Additional step <build>`:
To build ndn-cxx with a different compiler (rather than the platform default), set the
``CXX`` environment variable to point to the compiler binary. For example, to build
with clang on Linux, use the following:
- on Linux::
.. code-block:: sh
sudo ldconfig
CXX=clang++ ./waf configure
- on FreeBSD::
Building the documentation
--------------------------
sudo ldconfig -m
Tutorials and API documentation can be built using the following commands:
Documentation
-------------
.. code-block:: sh
ndn-cxx tutorials and API documentation can be built using the following
commands:
::
# Full set of documentation (tutorials + API) in build/docs
./waf docs
# Only tutorials in build/docs
# Only tutorials in `build/docs`
./waf sphinx
# Only API docs in build/docs/doxygen
./waf doxygen
# Only API docs in `build/docs/doxygen`
./waf doxgyen
If ``sphinx-build`` is detected during ``./waf configure``, man pages will automatically
be built and installed during the normal build process (i.e., during ``./waf`` and
``./waf install``). By default, man pages will be installed into ``${PREFIX}/share/man``
(the default value for ``PREFIX`` is ``/usr/local``). This location can be changed
during the ``./waf configure`` stage using the ``--prefix``, ``--datarootdir``, or
``--mandir`` options.
Manpages are automatically created and installed during the normal build
process (e.g., during ``./waf`` and ``./waf install``), if
``python-sphinx`` module is detected during ``./waf configure`` stage.
By default, manpages are installed into ``${PREFIX}/share/man`` (where
default value for ``PREFIX`` is ``/usr/local``). This location can be
changed during ``./waf configure`` stage using ``--prefix``,
``--datarootdir``, or ``--mandir`` options.
For further details, please refer to ``./waf --help``.
For more details, refer to ``./waf --help``.
.. _Development build:
Development build
Development Build
-----------------
The following is the suggested build procedure for development builds:
The following is the suggested configure commands for development build.
.. code-block:: sh
::
./waf configure --debug --with-tests
./waf
sudo ./waf install
sudo ldconfig # on Linux only
In a development build, most compiler optimizations will be disabled and all warnings
will be treated as errors. This default behavior can be overridden by setting the
``CXXFLAGS`` environment variable before running ``./waf configure``, for example:
:ref:`Additional step <build>`:
.. code-block:: sh
- on Linux::
CXXFLAGS="-O1 -g3 -Wall" ./waf configure --debug --with-tests
./waf
sudo ldconfig
- on FreeBSD::
sudo ldconfig -m
In the development build all compiler optimizations are disabled by
default and all warnings are treated as error. The default behavior can
be overridden by setting ``CXXFLAGS`` environment variable before
running ``./waf configure``:
::
CXXFLAGS="-O1 -g3" ./waf configure --debug --with-tests
...
Customize Compiler
------------------
To customize compiler, set ``CXX`` environment variable to point to compiler binary and, in
some case, specify type of the compiler using ``--check-cxx-compiler``. For example, when
using clang compiler on Linux system, use the following:
::
CXX=clang++ ./waf configure --check-cxx-compiler=clang++
+23
View File
@@ -0,0 +1,23 @@
ndn-cxx overview
================
ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be
used to implement various NDN applications. The library is currently being used as part of
the following projects:
- `NFD - NDN Forwarding Daemon <http://named-data.net/doc/NFD>`__
- `NLSR - Named-data Link-State Routing
protocol <https://github.com/named-data/NLSR>`__
- `repo-ng - Next generation of NDN
repository <https://github.com/named-data/repo-ng>`__
- `ChronoChat - Multi-user NDN chat
application <https://github.com/named-data/ChronoChat>`__
- `ChronoSync - Sync library for multiuser realtime applications for
NDN <https://github.com/named-data/ChronoSync>`__
- `ndn-tlv-ping - Ping Application For
NDN <https://github.com/named-data/ndn-tlv-ping>`__
- `ndn-traffic-generator - Traffic Generator For
NDN <https://github.com/named-data/ndn-traffic-generator>`__
Please submit any bugs or issues to the `ndn-cxx issue tracker
<http://redmine.named-data.net/projects/ndn-cxx/issues>`__.
+758
View File
@@ -0,0 +1,758 @@
.. _Release Notes:
ndn-cxx Release Notes
---------------------
ndn-cxx version 0.3.3 (changes since version 0.3.2)
+++++++++++++++++++++++++++++++++++++++++++++++++++
Release date: July 1, 2015
New features:
^^^^^^^^^^^^^
- Allow compilation of ndn-cxx as a shared library (:issue:`2243`)
In this release, by default, only a static library is compiled. The next release will change
the default behavior to compile only a shared library.
- Introduce concept of PartialName (:issue:`1962`)
Semantically, PartialName abstraction represents an arbitrary sequence of name components,
while Name represents an absolute name. Currently, PartialName is typedef alias to Name, but
it can be changed in the future releases.
- Introduce generalized signing API in KeyChain (:issue:`2871`, :issue:`1705`)
A new API in KeyChain introduces a general interface to sign interest and data packets and
supply necessary signing information, such as signing identity name, signing key name, or
signing certificate name. In addition, the supplied signing information can include additional
information that signer wants to include in the SignatureInfo of the signed packet.
- Introduce helpers to create SigningInfo for the generalized signing API (:issue:`2922`)
- Sqlite3Statement utility helper that wraps an SQLite3 statements and provide automatic memory
cleanup
- Introduce PibSqlite3 based on PibImpl (:issue:`2807`)
- Make public interface of Pib, Identity, and Key as read-only (:issue:`2928`)
- New encoding block helpers to simplify operations with ``std::string`` (:issue:`2951`):
* ``prependStringBlock``
* ``makeStringBlock``
* ``readString``
Improvements and bug fixes:
^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Use C++11 lambda expression and smart pointers in Face implementation (:issue:`2112`)
- Fix compilation failure on OS X 10.10 with cryptopp from MacPorts
- Update client.conf manpage
- Change Name::compare to return negative, zero, or positive integer (instead of strictly -1,
0, 1) when the first name comes before the other in canonical ordering, is equal, or comes
after (:issue:`2445`)
- IdentityCertificate sets default FreshnessPeriod to 1 hour (:issue:`2872`)
- Unify TPM creation (:issue:`2722`)
- Allow negative start index in Name::getSubName method (:issue:`1962`)
- Improved documentation of PibImpl interfaces (:issue:`2896`, :issue:`2898`)
- Simplify CommandOptions with SigningInfo (:issue:`2893`)
- Refactor internal PIT to use scheduled events (:issue:`1372`, :issue:`2518`)
- Improve structure and documentation of block helpers (:issue:`2951`)
- Declare all move constructors as ``noexcept`` to ensure move operations are used even when a
restrictive move operation (`move_if_noexcept`) is used (e.g., in STL library's containers)
(:issue:`2966`)
Deprecated:
^^^^^^^^^^^
- The following ``KeyChain::sign*`` methods, in favor of generalized ``KeyChain::sign(..., SigningInfo)``
* ``KeyChain::sign(Packet, Name)``
* ``KeyChain::sign(uint8_t*, size_t, Name)``
* ``KeyChain::signByIdentity(Packet, Name)``
* ``KeyChain::signByIdentity(uint8_t*, size_t, Name)``
* ``KeyChain::signWithSha256(Data)``
* ``KeyChain::signWithSha256(Interest)``
- The following encoding block helper functions:
* ``nonNegativeIntegerBlock`` (use ``makeNonNegativeIntegerBlock``)
* ``prependBooleanBlock`` (use ``prependEmptyBlock``)
* ``booleanBlock`` (use ``makeEmptyBlock``)
* ``dataBlock`` (use ``makeBinaryBlock``)
* ``nestedBlock`` (use ``makeNestedBlock``)
- The following methods of ``CommandOptions`` class, use ``setSigningInfo()`` instead (:issue:`2893`):
* ``CommandOptions::getSigningParamsKind``
* ``CommandOptions::getSigningIdentity``
* ``CommandOptions::getSigningCertificate``
* ``CommandOptions::setSigningDefault``
* ``CommandOptions::setSigningIdentity``
* ``CommandOptions::setSigningCertificate``
Removed:
^^^^^^^^
- Remove SCOPE from Interests and all references to it in the related code (:issue:`2345`)
- Direct FIB management in Face class (:issue:`2533`)
``Face::register`` and ``Face::setInterestFilter`` methods now only support NFD RIB management
protocol.
For special needs, FIB management can be implemented using ``nfd::Controller``
(``start<FibAddNextHopCommand>``, and ``start<FibRemoveNextHopCommand>``)
Upcoming features (partially finished in development branches):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- NDNLPv2 (http://redmine.named-data.net/projects/nfd/wiki/NDNLPv2, :issue:`2520`,
:issue:`2879`, :issue:`2763`, :issue:`2883`, :issue:`2841`, :issue:`2866`)
- New NDN certificate format (:issue:`2861`, :issue:`2868`)
- NDN trust schema as a description of application trust model, which can help automate data
and interest packet signing and authentication (:issue:`2829`)
- Refactored KeyChain abstraction (:issue:`2926`)
****************************************************************************
ndn-cxx version 0.3.2 (changes since version 0.3.1)
+++++++++++++++++++++++++++++++++++++++++++++++++++
Release date: May 12, 2015
New features:
^^^^^^^^^^^^^
- Add Link abstraction (:issue:`2587`)
- Add Link and SelectedDelegation fields to the Interest abstraction (:issue:`2587`)
- Initial implementation of several components for the upcoming PIB feature (:issue:`2451`):
* User-facing PIB implementation and implementation-specific PIB interface
* In-memory PIB implementation
* Define new abstraction for identity, key, and certificate
Updates and bug fixes:
^^^^^^^^^^^^^^^^^^^^^^
- Enable decoding Exclude containing ImplicitSha256DigestComponent (:issue:`2629`)
- Update waf build system to version 1.8.9 (:issue:`2209`, :issue:`2657`, :issue:`2792`)
- Avoid duplicating output in IndentedStream (:issue:`2723`)
- Fix skipping empty name component `(...)` during URI decoding (:issue:`2725`)
- Enable ability to exclude empty name component (:issue:`2660`)
- Fix bug with TLV-LENGTH processing in `Block::fromStream` (:issue:`2728`, :issue:`2729`)
- Disable precompiled headers on OS X with clang < 6.1.0 (:issue:`2804`)
Deprecated:
^^^^^^^^^^^
- `Block::fromBuffer` overloads with output parameter (:issue:`2553`)
Removed:
^^^^^^^^
- Delete deprecated Controller functions:
* `Controller::start` overloads, except the overload taking CommandOptions
* `Controller::Sign` typedef
* `Controller::getDefaultCommandTimeout`
* `ControlCommand::getPrefix`
* `ControlCommand::getRequestName(ControlParameters)`
* `Controller::Controller(Face&)`
****************************************************************************
ndn-cxx version 0.3.1 (changes since version 0.3.0)
+++++++++++++++++++++++++++++++++++++++++++++++++++
Release date: March 3, 2015
New features:
^^^^^^^^^^^^^
- **Management**
- Add isConnected() in :ndn-cxx:`signal::Connection` and :ndn-cxx:`signal::ScopedConnection`
(:issue:`2308`)
- Extend :ndn-cxx:`DummyClientFace` to process :ndn-cxx:`LocalControlHeader` (:issue:`2510`)
- Add CachingPolicy to :ndn-cxx:`LocalControlHeader` (:issue:`2183`)
Updates and bug fixes:
^^^^^^^^^^^^^^^^^^^^^^
- **Wire encoding**
- Refactoring of :ndn-cxx:`EncodingImpl` class template (``EncodingBuffer`` and
``EncodingEstimator``) (:issue:`2494`, :issue:`2490`)
- Change :ndn-cxx:`Block::fromBuffer` return type (:issue:`2553`)
- **Miscellaneous tools**
- Mark ``Digest<Hash>::operator==`` as unsuitable in a security sensitive context
(:issue:`2395`)
- Restrict destruction of Signal from handler (:issue:`2313`)
- **Documentation**
- Correct function names in security library tutorial (:issue:`2474`)
- Remind users to reinstall ports after OSX upgrade (:issue:`2284`)
- **Tests**
- Fix global buffer overflow in ``ImplicitSha256Digest`` test case (:issue:`2307`)
- Change naming conventions for unit test files and test suite names (:issue:`2497`)
- **Build**
- Explicitly define ``_GLIBCXX_USE_NANOSLEEP``, necessary for gcc < 4.8 in some environments
(:issue:`2499`)
Removed:
^^^^^^^^
- Delete deprecated ``Block(std::istream&)`` constructor (:issue:`2241`)
- Delete deprecated ``ndn::ptr_lib``, ``ndn::func_lib`` (:issue:`2110`)
- Delete deprecated ``MetaInfo::TYPE_*`` (:issue:`2170`)
****************************************************************************
ndn-cxx version 0.3.0 (changes since version 0.2.0)
+++++++++++++++++++++++++++++++++++++++++++++++++++
Release date: February 2, 2015
New features:
^^^^^^^^^^^^^
- **Build**
+ The code now requires C++11. The minimum supported gcc version is 4.6, as earlier versions
do not have proper support for C++11 features.
- **Base**
+ Enable detailed version information when built from shallow clone or tarball
(:issue:`1915`)
+ Make default transport configurable (:issue:`2189`)
+ Add ability to do partial Name comparison (:issue:`2090`)
- **Security**
+ Add support for KeyDigest key locator (:issue:`1426`)
+ Add a method to get KeyDigest from a PublicKey instance (:issue:`1964`)
+ Add support for KeyChain to sign Interest using SHA256 digest (:issue:`2218`)
+ Add ``ndnsec-dsk-gen`` tool to generate a pair of Data-Signing-Key (DSK) for the specified
identity (:issue:`2246`)
+ Pair-up PIB and TPM in KeyChain: PIB remembers the last used TPM type/location, which is
used during KeyChain construction (unless overriden) (:issue:`2242`)
- **Wire encoding**
+ Add support for application-defined meta information blocks (:issue:`2021`)
+ Introduce new ``name::Component::is*`` methods to allow checking if the name component
follows the specific naming convention without relying on the exception handling
(:issue:`2088`)
+ Add definition of producer-generated NACK (:issue:`2111`)
+ Add ``std::hash<Name>`` specialization to support ``unordered_map`` container
(:issue:`2147`)
+ Add support for ImplicitSha256DigestComponent (:issue:`1640`)
+ Allow tagging Interest and Data packets with arbitrary information (:issue:`2336`)
- **Management**
+ Support NFD face query operation (:issue:`2085`)
- **Miscellaneous tools**
+ Add a new helper to calculate digests over dynamic inputs (:issue:`1934`)
+ Add DNS resolver helper (:issue:`1918`)
+ Import and re-license Ethernet and FaceUri classes from NFD codebase, add FaceUri
canonization support for ``udp``, ``tcp``, and ``ether`` schemas (:issue:`1994`)
+ Add per-application in-memory storage with LRU, LFU, and FIFO replacement policies
(:issue:`1940`)
+ Add ability to specialize system and steady clocks (e.g., for unit tests and simulation
purposes) (:issue:`2158`)
+ Expose DummyClientFace as public API
+ New IndentedStream helper class to simplify writing to streams with the specified indents
or prefixes (:issue:`2238`)
+ New Signal class template as an enhanced version of the deprecated EventEmitter
(:issue:`2279`)
+ New scheduler::ScopedEventId helper to automatically cancel scheduled events upon
destruction (:issue:`2442`)
+ New NetworkMonitor helper to detect network state changes (:issue:`2443`)
Updates and bug fixes:
^^^^^^^^^^^^^^^^^^^^^^
- **Base**
+ Prevent flags being set for rib/unregister command (:issue:`1945`)
+ Fix segfault caused by Face::unregisterPrefix when registeredPrefixId does not exist
+ Add explicit internal KeyChain to Face class. KeyChain previously existed in the Face as
part of NFD controller class. (:issue:`2039`)
+ Properly disable assertions in release builds (:issue:`2135`)
+ Connect to Transport during construction of Face instance (:issue:`2318`)
- **Wire encoding**
+ Fix segfault when decoding empty Exclude element (:issue:`1970`)
+ Provide EqualityComparable concept for Exclude element
+ Correct Marker in Name::appendVersion() (:issue:`2086`)
+ Ensure that wire-encoding errors are inherited from ``tlv::Error`` (:issue:`1983`)
- **Management**
+ Replace FaceFlags with individual fields in face management data structures (:issue:`1992`)
+ ``ndn::nfd::Controller`` extended to allow generating ControlCommand for remote prefix
registration (:issue:`2039`)
+ Change ``ForwarderStatus.NfdVersion`` to string (:issue:`2003`)
- **Security**
+ Fix ``ndnsec-cert-gen`` to correctly infer prefix before KEY component (:issue:`2052`)
+ Help message corrections in ``ndnsec-cert-dump``, ``ndnsec-cert-gen``, and
``ndnsec-key-gen`` (:issue:`2052`)
+ Accept ``--sign-id`` and ``--cert-prefix`` in ``ndnsec-cert-revoke`` (:issue:`2058`)
+ Changes output format of ``ndnsec-cert-revoke`` to base64 encoding (:issue:`2059`)
+ Add a new (safer) option to ``ndnsec-cert-gen`` allowing inclusion of additional
information blocks into the certificate. The new ``--signed-info`` parameter makes minimum
assumptions, treating text before first space as OID and the rest as the associated string
with this OID.
+ Make Face optional in Validator class (:issue:`2124`)
+ Display signature information when printing a certificate (:issue:`2196`)
+ Handle certificate decoding error in validation process (:issue:`2212`)
+ Fix segmentation fault in ``ndnsec-sign-req`` (:issue:`2211`)
+ Allow verbose option in ``ndnsec-list`` (:issue:`2197`)
+ Allow generation of DSK using ``ndnsec-key-gen`` (:issue:`2247`)
+ Allow ``ndnsec-key-gen`` to generate ECDSA keys (:issue:`2248`)
+ Fix memory leak in SecPublicInfoSqlite3 (:issue:`2253`)
+ Properly report status of ``ndnsec-delete`` execution (:issue:`2275`)
- **Miscellaneous tools**
+ Fix incorrect tag map in ``tlvdump`` tool
+ Change to default resolver behavior in util::dns::Resolver (:issue:`2415`)
- **Documentation**
+ Update of tutorials and installation instructions
+ Rename manpage of ``client.conf`` to ``ndn-client.conf`` (:issue:`1967`)
+ Updated and extended ndn-cxx code style:
- add rules for some C++11 constructs
- prefer ``BOOST_ASSERT`` and ``static_assert``
+ Improve example applications (:issue:`1976`)
- **Tests**
+ Improve security unit test cases (:issue:`1683`)
+ Embedding CI build and test running scripts into the repository
+ Partial unit test coverage for Face class (previously covered only by integration tests)
(:issue:`1947`)
+ Improve stability of unit tests by using UnitTestTime (wall clock independent time)
(:issue:`2152`)
- **Build**
+ Redesign the way default compiler flags are determined (:issue:`2209`)
+ Support tools and examples with multiple translation units (:issue:`2344`)
+ Disable installation of internal headers and headers of the disabled components
(:issue:`2266`, and :issue:`2269`)
+ Enable conditional compilation based on presence of ``getpass()`` function
- Other minor fixes and corrections
Deprecated:
^^^^^^^^^^^
- ``ndn::ptr_lib`` and ``ndn::func_lib`` namespace aliases
- The following ``nfd::Controller`` methods:
+ ``Controller::start`` overloads, except the overload taking ``CommandOptions``
+ ``Controller::Sign`` typedef
+ ``Controller::getDefaultCommandTimeout``
+ ``ControlCommand::getPrefix``
+ ``ControlCommand::getRequestName(ControlParameters)``
+ ``Controller::Controller(Face&)``
- ``MetaInfo::TYPE_*`` constants
- ``EventEmitter`` is deprecated in favor of ``Signal``
Removed:
^^^^^^^^
- FaceFlags APIs (:issue:`1992`)
- ``ControlCommand::makeCommandInterest`` (:issue:`2008`)
- namespace ``ndn::Tlv`` (:issue:`2079`)
- ``shared_ptr<io_service>`` constructor and getter in Face class
- ``tlv::ConentType`` (typo in the name)
- ``Selectors::Selectors(int, int, Exclude, int, bool)`` constructor
- ``Interest::Interest(Name, int, int, Exclude, int, bool, int, time::milliseconds, uint32_t)``
constructor
- ``signature-sha256.hpp`` file
- unused ``encryption-manager.hpp`` file
- unused ``openssl`` dependency
****************************************************************************
ndn-cxx version 0.2.0 (changes since version 0.1.0)
+++++++++++++++++++++++++++++++++++++++++++++++++++
Release date: August 25, 2014
New features:
^^^^^^^^^^^^^
- **Base**
+ The license under which the library is released is changed to **Lesser GNU Public
License version 3.0**.
+ New ways to use incoming Interest dispatching:
* New :ndn-cxx:`InterestFilter` abstraction that supports filtering based on name
prefixes and regular expressions.
* Separated :ndn-cxx:`Face::registerPrefix()` and :ndn-cxx:`Face::setInterestFilter()`
methods allow distinct operations of registering with the local NDN forwarder and setting
up application-specific ``OnInterest`` call dispatch using InterestFilters.
+ Add support for new `NDN naming conventions
<http://named-data.net/doc/tech-memos/naming-conventions.pdf>`_ (:issue:`1761`)
- **Security**
+ Add ``type dir`` :ref:`trust-anchor in ValidatorConfig <validator-conf-trust-anchors>`_
to add all certificates under the specified directory as trust anchors.
The new option also allow periodic reloading trust anchors, allowing dynamic trust
models.
+ Added support for multiple signature types to :ndn-cxx:`PublicKey`,
:ndn-cxx:`SecPublicInfo` abstractions
+ New :ndn-cxx:`SignatureSha256WithEcdsa` signature type
+ Updates in :ndn-cxx:`Signature` data structure to reflect changes in `NDN-TLV spec
0.1.1 <http://named-data.net/doc/NDN-TLV/0.1.1/>`_
- **Wire encoding**
+ :ndn-cxx:`Data::getFullName() <getFullName()>` method to get :ndn-cxx:`Data` packet
name with implicit digest
+ New :ndn-cxx:`Name::getSuccessor()` method to get name successor (:issue:`1677`)
+ New in-wire refreshing of Interest's nonce (:issue:`1758`)
- **Management**
+ Support for :ndn-cxx:`ChannelStatus`, :ndn-cxx:`StrategyChoice` datasets
+ Defining new common Route Origins for NFD RIB management protocol (:issue:`1719`)
+ New RibEntry and Route data structures for RIB management protocol (:issue:`1764`)
+ Add support for RIB flags for setInterestFilter and registerPrefix (:issue:`1842`)
- **Miscellaneous tools**
+ Introduce :ndn-cxx:`Scheduler::cancelAllEvents` to cancel all previously scheduled events
(:issue:`1757`)
+ Introduce :ndn-cxx:`util::EventEmitter`, :ndn-cxx:`util::NotificationSubscriber`,
:ndn-cxx:`util::NotificationStream`, and :ndn-cxx:`nfd::FaceMonitor` utility classes
+ Introduce :ndn-cxx:`util::SegmentFetcher` helper class to fetch multi-segmented data
(:issue:`1879`)
- **Build**
+ enabled support of precompiled headers for clang and gcc compilers to speed up compilation
Updates and bug fixes:
^^^^^^^^^^^^^^^^^^^^^^
- **Base**
+ Serialization of socket write operations (:issue:`1707`)
+ Enforcing limit on Interest and Data packet size in :ndn-cxx:`Face::expressInterest` and
:ndn-cxx:`Face::put` methods (:issue:`1774`)
+ Cleaning up transport state on communication failure, so Face can try to reconnect
in the future.
+ Fix bug with Face::removePendingInterest (:issue:`1917`)
- **Wire encoding**
+ Nonce field is now encoded as 4-byte uint8_t value, as defined by NDN-TLV spec.
+ Optimized Data packet signing
:ndn-cxx:`KeyChain::sign` method now pre-allocates :ndn-cxx:`EncodingBuffer`, requests
unsigned portion of :ndn-cxx:`Data` using ``Data::wireEncode(EncodingBuffer, true)``,
and then appends the resulting signature and prepends :ndn-cxx:`Data` packet header.
This way there is no extra memory allocation after :ndn-cxx:`Data` packet is signed.
+ Optimized implicit digest calculation in :ndn-cxx:`Interest::matchesData` method
(:issue:`1769`)
- **Management**
+ Add link-layer byte counts in FaceStatus data structure (:issue:`1765`)
- **Security**
+ Allow user to explicitly specify the cert name prefix before 'KEY' component in
``ndnsec-certgen``
+ ``SignatureSha256`` has been renamed to :ndn-cxx:`DigestSha256` to conform with
`NDN-TLV specification <http://named-data.net/doc/ndn-tlv/>`_.
+ Add checking of ``Timestamp`` and ``Nonce`` fields in signed Interest within
:ndn-cxx:`ValidatorConfig`
+ Allow validator customization using hooks:
Sub-classes of :ndn-cxx:`Validator` class can use the following hooks to fine-tune the
validation process:
* :ndn-cxx:`Validator::preCertificateValidation <preCertificateValidation>` to
process received certificate before validation.
* :ndn-cxx:`Validator::onTimeout <onTimeout>` to process interest timeout
* :ndn-cxx:`Validator::afterCheckPolicy <afterCheckPolicy>` to process validation requests.
+ Fix memory issues in :ndn-cxx:`SecPublicInfoSqlite3`
- **Miscellaneous tools**
+ Redefine method for random number generation: ``random::generateWord*`` and
``random::generateSecureWord*`` to generate cryptographically non-secure (fast) and
secure (slow) random numbers.
- Other minor fixes and corrections
Deprecated:
^^^^^^^^^^^
- ``SignatureSha256`` class, use :ndn-cxx:`DigestSha256` instead.
- All :ndn-cxx:`Face` constructors that accept ``shared_ptr<io_service>``.
Use versions that accept reference to ``io_service`` object.
- ``Face::ioService`` method, use :ndn-cxx:`Face::getIoService` instead.
- :ndn-cxx:`Interest` constructor that accepts name, individual selectors, and individual
guiders as constructor parameters.
Use ``Interest().setX(...).setY(...)`` or use the overload taking ``Selectors``
- ``name::Component::toEscapedString`` method, use :ndn-cxx:`name::Component::toUri` instead.
- ``SecPublicInfo::addPublicKey`` method, use :ndn-cxx:`SecPublicInfo::addKey` instead.
- ``Tlv::ConentType`` constant (typo), use ``Tlv::ContentType`` instead.
- ``CommandInterestGenerator`` and ``CommandInterestValidator`` utility classes.
:ndn-cxx:`ValidatorConfig` should be used instead.
Removed:
^^^^^^^^
- support of ndnd-tlv (only NFD management protocol is supported now)
- ``SecPublicInfoMemory`` and ``SecTpmMemory`` classes that were no longer used
- Removing concept of periodic event from :ndn-cxx:`Scheduler`.
In applications, periodic events should be just re-scheduled within the callback for
single-shot events.
****************************************************************************
ndn-cxx version 0.1.0
+++++++++++++++++++++
Release date: May 7, 2014
Version 0.1.0 is the initial release of ndn-cxx, an NDN C++ library with eXperimental
eXtensions.
Originally based on `ndn-cpp library <https://github.com/named-data/ndn-cpp>`_ the ndn-cxx
library adopts a slightly different design philosophy (including an extensive use of Boost
libraries to facilitate development, as well as the use of Crypto++ library to support
cryptographic operations), and includes a number of extensions that aim to simplify NDN
application development.
The current features include:
- **Base**
+ Fully asynchronous, event-driven communication model, which is implemented using `Boost.Asio
<http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html>`_
+ Single-threaded, but thread-safe Face operations
A single Face object can be safely used in multiple threads to express Interests and
publish Data packets
+ Explicit time management for NDN operations using `Boost.Chrono
<http://www.boost.org/doc/libs/1_48_0/doc/html/chrono.html>`_
+ Simplified and extended `NDN API <doxygen/annotated.html>`_
+ Extensive set of unit-tests based on `Boost.Test framework
<http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/index.html>`_
- Continuous integration using an in-house installation of Jenkins build bots and the
hosted `Travis CI <https://travis-ci.org/named-data/ndn-cxx>`_ continuous
integration service compile and verify correctness of the library for each commit
- **Wire format**
+ Full support of `NDN-TLV packet format v0.1 <http://named-data.net/doc/NDN-TLV/0.1/>`_
+ Pure C++ implementation of wire encoding/decoding with simple access to wire format
of all NDN packet abstractions via ``wireEncode`` and ``wireDecode`` methods
In many cases, NDN packet abstractions are just "indices" to the wire format
- **Communication with the forwarder**
+ Enable connecting to local forwarder via UNIX and TCP transports and to remote
forwarders using TCP transport
+ Full support for communication with `Named Data Networking Forwarding Daemon (NFD)
<https://github.com/named-data/NFD>`_
- Full support for `NFD management protocols
<http://redmine.named-data.net/projects/nfd/wiki/Management>`_ to NFD status
information, create and manage NFD Faces, receive NFD Face status change
notifications, update StrategyChoice for namespaces, and manage routes in RIB
- Support for `LocalControlHeader
<http://redmine.named-data.net/projects/nfd/wiki/LocalControlHeader>`_ to implement
special NDN applications that need low-level control of NDN packet forwarding
- **Security support**
+ A set of security primitives to allowing implementation of secure NDN applications in
a simplified manner
- **KeyChain**: provides simple interfaces of packet signing, and key and certificate
management
- **ValidatorConfig**: validator that implements trust model defined in a configuration
file
- **CommandInterestGenerator** and **CommandInterestValidator**: convenient helpers to produce
and validate command interests, while preventing potential replay attacks
+ Several implementations of trusted platform modules to securely manage private keys
- **SecTpmOsx**: TPM based on OSX KeyChain (OSX-specific)
- **SecTpmFile**: TPM that uses file-based access control to protect keys (cross-platform)
+ Extensive set of security command-line tools to manage security identities and certificates
- Generating private/public keys
- Issuing certificates
- Exporting/importing identities
- Managing default security settings
- **Miscellaneous tools**
+ Scheduler to support delayed time operations
+ NDN regular expressions
+ Simple config file to alter various aspects of the library
+ **tlvdump**: a simple tool to visualize TLV-encoded blocks
+248 -227
View File
@@ -3,11 +3,11 @@ ndn-cxx Code Style and Coding Guidelines
Based on
* "C++ Programming Style Guidelines" by Geotechnical Software Services, Copyright © 1996-2011.
The original document is available at `<http://geosoft.no/development/cppstyle.html>`__
* "C++ Programming Style Guidelines" by Geotechnical Software Services, Copyright © 1996 – 2011.
The original document is available at `<http://geosoft.no/development/cppstyle.html>`_
* NDN Platform "C++, C, C#, Java and JavaScript Code Guidelines".
The original document is available at `<https://named-data.net/codebase/platform/documentation/ndn-platform-development-guidelines/cpp-code-guidelines/>`__
* NDN Platform "C++, C, C#, Java and JavaScript Code Guidelines".
The original document available at `<http://named-data.net/codebase/platform/documentation/ndn-platform-development-guidelines/cpp-code-guidelines/>`_
1. Code layout
--------------
@@ -31,14 +31,14 @@ extended it to C++.
.. code-block:: c++
a = (b + c) * d; // NOT: a=(b+c)*d
a = (b + c) * d; // NOT: a=(b+c)*d
while (true) { // NOT: while(true)
while (true) { // NOT: while(true)
...
doSomething(a, b, c, d); // NOT: doSomething(a,b,c,d);
doSomething(a, b, c, d); // NOT: doSomething(a,b,c,d);
for (i = 0; i < 10; i++) { // NOT: for(i=0;i<10;i++){
for (i = 0; i < 10; i++) { // NOT: for(i=0;i<10;i++){
...
1.3. Namespaces should have the following form:
@@ -52,11 +52,11 @@ extended it to C++.
} // namespace example
Note that code inside the namespace is **not** indented. Avoid the following:
Note that code inside namespace is **not** indented. Avoid following:
.. code-block:: c++
// WRONG
// NOT
//
// namespace example {
//
@@ -65,7 +65,7 @@ extended it to C++.
//
// } // namespace example
1.4. Class declarations should have the following form:
1.4. The class declarations should have the following form:
.. code-block:: c++
@@ -73,25 +73,21 @@ extended it to C++.
{
public:
... <public methods> ...
protected:
... <protected methods> ...
private:
... <private methods> ...
public:
... <public data> ...
protected:
... <protected data> ...
private:
... <private data> ...
};
``public``, ``protected``, ``private`` may be repeated several times without
interleaving (e.g., public, public, public, private, private) if this improves
interleaving (e.g., public, public, public, private, private) if this allows better
readability of the code.
Nested classes can be defined in appropriate visibility section, either in methods
@@ -139,6 +135,23 @@ extended it to C++.
statements;
}
or (less preferred):
.. code-block:: c++
if (condition)
{
statements;
}
else if (condition)
{
statements;
}
else
{
statements;
}
1.7. A ``for`` statement should have the following form:
.. code-block:: c++
@@ -147,14 +160,23 @@ extended it to C++.
statements;
}
An empty ``for`` statement should have the following form:
or (less preferred):
.. code-block:: c++
for (initialization; condition; update)
{
statements;
}
An empty for statement should have the following form:
.. code-block:: c++
for (initialization; condition; update)
;
This emphasizes the fact that the ``for`` statement is empty and makes it obvious for
This emphasizes the fact that the for statement is empty and it makes it obvious for
the reader that this is intentional. Empty loops should be avoided however.
1.8. A ``while`` statement should have the following form:
@@ -165,6 +187,15 @@ extended it to C++.
statements;
}
or (less preferred):
.. code-block:: c++
while (condition)
{
statements;
}
1.9. A ``do-while`` statement should have the following form:
.. code-block:: c++
@@ -178,63 +209,15 @@ extended it to C++.
.. code-block:: c++
switch (condition) {
case ABC: // 2 space indent
statements; // 4 space indent
[[fallthrough]];
case ABC:
statements;
// Fallthrough
case DEF:
statements;
break;
case XYZ: {
statements;
break;
}
default:
statements;
break;
}
When curly braces are used inside a ``case`` block, the braces must cover the entire
``case`` block.
.. code-block:: c++
switch (condition) {
// Correct style
case A0: {
statements;
break;
}
// Correct style
case A1: {
statements;
[[fallthrough]];
}
// Incorrect style: braces should cover the entire case block
case B: {
statements;
}
case DEF:
statements;
break;
default:
break;
}
The following style is still allowed when none of the ``case`` blocks has curly braces.
.. code-block:: c++
switch (condition) {
case ABC: // no indent
statements; // 2 space indent
[[fallthrough]];
case DEF:
case XYZ:
statements;
break;
@@ -243,11 +226,32 @@ extended it to C++.
break;
}
The ``[[fallthrough]]`` annotation must be included whenever there is a
case without a break statement. Leaving the break out is a common error,
and it must be made clear that it is intentional when it is not there.
Moreover, modern compilers will warn when a case that falls through is
not explicitly annotated.
or (less preferred):
.. code-block:: c++
switch (condition)
{
case ABC:
statements;
// Fallthrough
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
The explicit ``Fallthrough`` comment should be included whenever there is a case
statement without a break statement. Leaving the break out is a common error, and it
must be made clear that it is intentional when it is not there.
1.11. A ``try-catch`` statement should have the following form:
@@ -256,10 +260,23 @@ extended it to C++.
try {
statements;
}
catch (const Exception& exception) {
catch (Exception& exception) {
statements;
}
or (less preferred):
.. code-block:: c++
try
{
statements;
}
catch (Exception& exception)
{
statements;
}
1.12. The incompleteness of split lines must be made obvious.
.. code-block:: c++
@@ -273,9 +290,9 @@ extended it to C++.
...
}
Split lines occur when a statement exceeds the column limit given in rule 1.1. It is
Split lines occurs when a statement exceed the 80 column limit given above. It is
difficult to give rigid rules for how lines should be split, but the examples above should
give a general hint. In general:
give a general hint.In general:
* Break after a comma.
* Break after an operator.
@@ -283,7 +300,7 @@ extended it to C++.
Exceptions:
* The following is standard practice with ``operator<<``:
* The following is the standard practice with operator<<:
.. code-block:: c++
@@ -329,6 +346,19 @@ should take the following form:
statements;
}
If the function has no parameters, ``()`` should be omitted.
.. code-block:: c++
[&capture1, capture2] {
statements;
}
Capture-all (``[&]`` and ``[=]``) is permitted, but its usage should be minimized.
Only use capture-all when it significantly simplifies code and improves readability.
.. code-block:: c++
[&] (T arg) {
statements;
}
@@ -337,17 +367,9 @@ should take the following form:
statements;
}
If the lambda has no parameters, ``()`` should be omitted.
.. code-block:: c++
[&capture1, capture2] {
statements;
}
Trailing return types should be omitted whenever possible. Add it only when the compiler
cannot deduce the return type automatically, or when it improves readability. Note that
``()`` is required by the C++ standard when ``mutable`` or a trailing return type is used.
Trailing return type should be omitted. Write them only when compiler cannot deduce
return type automatically, or when it improves readability.
``()`` is required by C++ standard when trailing return type is written.
.. code-block:: c++
@@ -366,7 +388,7 @@ should take the following form:
[&capture1, capture2] (T1 arg1, T2 arg2) { statement; }
A no-op lambda can be written in a more compact form:
No-op can be written in a more compact form:
.. code-block:: c++
@@ -390,20 +412,26 @@ should take the following form:
T({arg1, arg2})
T object = {arg1, arg2};
class Class
{
private:
T m_member{arg1, arg2};
T m_member = {arg1, arg2}; // not supported by GCC 4.6
static T s_member = {arg1, arg2};
};
Class::Class()
: m_member{arg1, arg2}
{
}
T object = {arg1, arg2};
An empty braced-init-list is written as ``{}``. For example:
.. code-block:: c++
T object{};
T object = {};
2. Naming Conventions
@@ -421,6 +449,7 @@ extension ``.cpp``
my-class.hpp, my-class.cpp
2.2. Names representing types must be written in English in mixed case starting with upper case.
.. code-block:: c++
@@ -448,11 +477,11 @@ to separate words.
static const double PI = 3.14;
In some cases, it is a better (or is the only way for complex constants in header-only
classes) to implement the value as a method.
classes) to implement the value as a method:
.. code-block:: c++
static int // declare constexpr if possible
int
getMaxIterations()
{
return 25;
@@ -479,25 +508,27 @@ written in mixed case starting with lower case.
.. code-block:: c++
namespace model::analyzer {
namespace model {
namespace analyzer {
...
} // namespace model::analyzer
} // namespace analyzer
} // namespace model
2.7. Names representing generic template types should be a single uppercase letter.
2.7. Names representing generic template types should be a single uppercase letter
.. code-block:: c++
template<class T> ...
template<class C, class D> ...
However, when a template parameter represents a certain concept and is expected
to have a certain interface, the name should be explicitly spelled out.
However, when template parameter represents a certain concept and expected to have a
certain interface, the name should be explicitly spelled out:
.. code-block:: c++
template<class InputIterator> ...
template<class FaceBase> ...
template<class Packet> ...
2.8. Abbreviations and acronyms must not be uppercase when used as name.
@@ -517,8 +548,8 @@ written in mixed case starting with lower case.
In general, the use of global variables should be avoided. Consider using singleton
objects instead.
2.10. All non-static data members of a class should be prefixed with ``m_`` unless they
are public. Similarly, non-public static data members should be prefixed with ``s_``.
2.10. Private class variables should have ``m_`` prefix. Static class variables should have
``s_`` prefix.
.. code-block:: c++
@@ -530,6 +561,7 @@ are public. Similarly, non-public static data members should be prefixed with ``
static std::string s_name;
};
2.11. Variables with a large scope should have long (explicit) names, variables with a small
scope can have short names.
@@ -597,11 +629,16 @@ scope can have short names.
The notation is taken from mathematics where it is an established convention for
indicating a number of objects.
2.18. The suffix ``Num`` or ``No`` should be used for variables representing an entity number.
2.18. The suffix ``No`` should be used for variables representing an entity number.
.. code-block:: c++
tableNum, tableNo, employeeNum, employeeNo
tableNo, employeeNo
The notation is taken from mathematics where it is an established convention for
indicating an entity number. An elegant alternative is to prefix such variables with
an ``i``: ``iTable``, ``iEmployee``. This effectively makes them named iterators.
2.19. The prefix ``is``, ``has``, ``need``, or similar should be used for boolean variables and
methods.
@@ -616,13 +653,13 @@ symmetry.
::
get/set, add/remove, create/destroy, start/stop, insert/erase,
get/set, add/remove, create/destroy, start/stop, insert/delete,
increment/decrement, old/new, begin/end, first/last, up/down, min/max,
next/previous (and commonly used next/prev), open/close, show/hide,
suspend/resume, etc.
The pair ``insert/erase`` is preferred. ``insert/delete`` can also be used if it
does not conflict with the ``delete`` keyword of C++.
Pair ``insert/erase`` should be preferred. ``insert/delete`` can also be used if it
does not conflict with C++ delete keyword.
2.21. Variable names should not include reference to variable type (do not use Hungarian
notation).
@@ -656,9 +693,9 @@ notation).
2.24. Exceptions can be suffixed with either ``Exception`` (e.g., ``SecurityException``) or
``Error`` (e.g., ``SecurityError``).
The recommended method is to declare an exception class ``Exception`` or ``Error`` as
a nested type inside the class from which the exception is thrown. For example, when
defining a class ``Foo`` that can throw errors, one can write the following:
The recommended method is to declare exception class ``Exception`` or ``Error`` as an
inner class, from which the exception is thrown. For example, when declaring class
``Foo`` that can throw errors, one can write the following:
.. code-block:: c++
@@ -666,16 +703,12 @@ notation).
class Foo
{
public:
class Error : public std::runtime_error
{
public:
// You can inherit constructors from std::runtime_error like this:
using std::runtime_error::runtime_error;
// Additional constructors, if desired, can be declared as usual:
Error(const std::string& what, const std::exception& inner)
: std::runtime_error(what + ": " + inner.what())
explicit
Error(const std::string& what)
: std::runtime_error(what)
{
}
};
@@ -685,6 +718,7 @@ notation).
hierarchy, then child classes should should define their own ``Error`` or
``Exception`` classes that are inherited from the parent's Error class.
2.25. Functions (methods returning something) should be named after what they return and
procedures (void methods) after what they do.
@@ -700,8 +734,8 @@ not in the primary processing path.
3.2. Header files must contain an include guard.
For example, a header file named ``module/class-name.hpp`` or
``src/module/class-name.hpp`` should have a header guard in the following form:
For example, header file located in ``module/class-name.hpp`` or in
``src/module/class-name.hpp`` should have header guard in the following form:
.. code-block:: c++
@@ -710,69 +744,58 @@ not in the primary processing path.
...
#endif // APP_MODULE_CLASS_NAME_HPP
The macro name should reflect the path of the header file relative to the root of the
source tree, in order to prevent naming conflicts. The header guard should be prefixed
with the application/library name to avoid conflicts with other packages and libraries.
The name should follow the location of the file inside the source tree and prevents
naming conflicts. Header guard should be prefixed with the application/library name
to avoid conflicts with other packaged and libraries.
3.3. Include directives for system headers and other external libraries should use
``<angle brackets>``. Header files in the same source code repository should be included
using ``"quotes"``.
3.3. Header files which are in the same source distribution should be included in
``"quotes"``, if possible with a path relative to the source file. Header files for
system and other external libraries should be included in ``<angle brackets>``.
.. code-block:: c++
#include "ndn-cxx/util/random.hpp"
#include <string>
#include <boost/lexical_cast.hpp>
All of a project's header files should be included with their path relative to
the project's source directory. The use of UNIX directory shortcuts ``.``
(the current directory) and ``..`` (the parent directory) is discouraged.
#include "util/random.hpp"
3.4. Include statements should be grouped. Same-project headers should be included first.
Leave an empty line between groups of include statements. Sort alphabetically within a group.
For example, the include section of ``ndn-cxx/foo/bar.cpp`` may look like this:
3.4. Include statements should be sorted and grouped. Sorted by their hierarchical position
in the system with low level files included first. Leave an empty line between groups
of include statements.
.. code-block:: c++
#include "ndn-cxx/impl/pending-interest.hpp"
#include "ndn-cxx/util/random.hpp"
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <boost/lexical_cast.hpp>
#include <boost/regex.hpp>
3.5. Definitions that are local to only one ``.cpp`` file should be declared inside that
file and be placed in an unnamed namespace or declared ``static``.
#include "detail/pending-interest.hpp"
#include "util/random.hpp"
3.5. Types that are local to one file only can be declared inside that file.
3.6. Implicit conversion is generally allowed.
Implicit conversion between integer and floating point numbers can cause problems and
should be avoided.
Implicit conversion in constructors that can be called with a single argument is usually
undesirable. Therefore, all single-argument constructors should be marked ``explicit``,
unless implicit conversion is desirable. In that case, a comment should document the
reason for this.
As an exception, copy and move constructors should not be explicit, since they do not
perform type conversion.
Constructors that cannot be called with a single argument may omit ``explicit``.
Constructors that take a single ``std::initializer_list`` parameter should also omit
``explicit``, in order to support copy-initialization.
Implicit conversion in single-argument constructor is usually undesirable. Therefore, all
single-argument constructors should be marked 'explicit', unless implicit conversion is
desirable. In that case, a comment should document the reason.
Avoid C-style casts. Use ``static_cast``, ``dynamic_cast``, ``reinterpret_cast``,
``const_cast`` instead where appropriate. Use ``static_pointer_cast``,
``dynamic_pointer_cast``, ``const_pointer_cast`` when dealing with ``shared_ptr``.
Avoid C-style casts.
Use ``static_cast``, ``dynamic_cast``, ``const_cast``, ``reinterpret_cast``, or
``bit_cast`` instead where appropriate.
Use ``static_pointer_cast``, ``dynamic_pointer_cast``, or ``const_pointer_cast``
when dealing with ``shared_ptr``.
3.7. Variables should be initialized where they are declared.
This ensures that variables are valid at any time. Sometimes it is impossible to
initialize a variable to a valid value where it is declared.
initialize a variable to a valid value where it is declared:
.. code-block:: c++
@@ -782,20 +805,21 @@ file and be placed in an unnamed namespace or declared ``static``.
In these cases it should be left uninitialized rather than initialized to some phony
value.
3.8. In most cases, class data members should not be declared ``public``.
3.8. In most cases, class instance variables should not be declared public.
Public data members violate the concepts of information hiding and encapsulation.
Use private variables and public accessor methods instead.
The concepts of information hiding and encapsulation are violated by public variables. Use
private variables and access methods instead.
Exceptions to this rule:
* When the class is essentially a passive data structure with no or minimal behavior
(equivalent to a C struct, also known as POD type). In this case, all fields should
be public and the keyword ``struct`` should be used instead of ``class``.
* when the class is essentially a dumb data structure with no or minimal behavior
(equivalent to a C struct, also known as PODS). In this case it is appropriate to make
the instance variables public by using struct.
* When the class is used only inside the compilation unit, e.g., when implementing pImpl
* when the class is used only inside the compilation unit, e.g., when implementing pImpl
idiom (aka Bridge pattern) or similar cases.
3.9. C++ pointers and references should have their reference symbol next to the type rather
than to the name.
@@ -808,25 +832,26 @@ than to the name.
.. code-block:: c++
if (nLines != 0) // NOT: if (nLines)
if (nLines != 0) // NOT: if (nLines)
if (value != 0.0) // NOT: if (value)
int* ptr = ...
if (ptr) // OK
if (ptr != nullptr) // also OK
3.11. When checking if ``shared_ptr`` points to an object, explicit ``static_cast<bool>``
must be used.
3.11. *(removed)*
``shared_ptr`` in C++11 (unlike ``boost::shared_ptr``) does not have implicit
conversion to bool.
3.12. Loop variables should be initialized immediately before the loop.
.. code-block:: c++
bool isDone = false; // NOT: bool isDone = false;
isDone = false; // NOT: bool isDone = false;
while (!isDone) { // // other stuff
... // while (!isDone) {
} // ...
: // while (!isDone) {
} // :
// }
3.13. The form ``while (true)`` should be used for infinite loops.
3.13. The form while (true) should be used for infinite loops.
.. code-block:: c++
@@ -836,10 +861,10 @@ than to the name.
// NOT:
for (;;) { // NO!
...
:
}
while (1) { // NO!
...
:
}
3.14. Complex conditional expressions must be avoided. Introduce temporary boolean variables
@@ -859,7 +884,7 @@ instead.
// }
By assigning boolean variables to expressions, the program gets automatic
documentation. The construction will be easier to read, debug, and maintain.
documentation. The construction will be easier to read, debug and maintain.
3.15. The conditional should be put on a separate line.
@@ -889,11 +914,11 @@ instead.
should be considered declared as named constants instead.
If the number does not have an obvious meaning by itself, the readability is enhanced
by introducing a named constant instead. A different approach is to introduce a method
by introducing a named constant instead. A different approach is to introduce a method
from which the constant can be accessed.
3.18. Floating point literals should always be written with a decimal point, at least one
decimal, and without omitting 0 before the decimal point.
3.18. Floating point constants should always be written with decimal point, at least one
decimal, and without omitting 0 before decimal point.
.. code-block:: c++
@@ -906,9 +931,9 @@ decimal, and without omitting 0 before the decimal point.
3.19. ``goto`` should not be used.
``goto`` statements violate the idea of structured code. Only in very few cases (for
instance, breaking out of deeply nested structures) should ``goto`` be considered,
and only if the alternative structured counterpart is proven to be less readable.
Goto statements violate the idea of structured code. Only in some very few cases (for
instance breaking out of deeply nested structures) should goto be considered, and only if
the alternative structured counterpart is proven to be less readable.
3.20. ``nullptr`` should be used to represent a null pointer, instead of "0" or "NULL".
@@ -958,7 +983,7 @@ decimal, and without omitting 0 before the decimal point.
3.24. All comments should be written in English.
In an international environment, English is the preferred language.
In an international environment English is the preferred language.
3.25. Use ``//`` for all comments, including multi-line comments.
@@ -975,7 +1000,7 @@ decimal, and without omitting 0 before the decimal point.
always start with an upper case letter and end with a period.
However, method and class documentation comments should use ``/** */`` style for
Doxygen, JavaDoc and JSDoc. License boilerplate should use ``/* */`` style.
Doxygen, JavaDoc and JSDoc.
3.26. Comments should be included relative to their position in the code.
@@ -1003,10 +1028,10 @@ decimal, and without omitting 0 before the decimal point.
int z = x + y;
BOOST_ASSERT(z - y == x);
The expression passed to ``BOOST_ASSERT`` must not have side effects,
because it may not be evaluated in release builds.
The expression passed to ``BOOST_ASSERT`` MUST NOT have side effects,
because it MAY NOT be evaluated in release builds.
3.28. Use ``static_assert`` for compile-time assertions.
3.28. Use ``static_assert`` for static assertions.
.. code-block:: c++
@@ -1021,32 +1046,41 @@ decimal, and without omitting 0 before the decimal point.
static_assert(std::is_base_of<BaseClass, DerivedClass>::value,
"DerivedClass must inherit from BaseClass");
3.29. The ``auto`` type specifier may be used for local variables if a human reader can
easily deduce the actual type, or if it makes the code safer.
3.29. ``auto`` type specifier MAY be used for local variables, if a human reader
can easily deduce the actual type.
.. code-block:: c++
std::vector<int> intVector;
auto i = intVector.find(4); // OK
auto i = intVector.find(4);
auto stringSet = std::make_shared<std::set<std::string>>(); // OK
auto stringSet = std::make_shared<std::set<std::string>>();
std::vector<std::string> strings;
for (const auto& str : strings) { // OK, iterating over the elements of a container
std::cout << str;
``auto`` SHOULD NOT be used if a human reader cannot easily deduce the actual type.
.. code-block:: c++
auto x = foo(); // BAD if the declaration of foo() isn't nearby
``const auto&`` SHOULD be used to represent constant reference types.
``auto&&`` SHOULD be used to represent mutable reference types.
.. code-block:: c++
std::list<std::string> strings;
for (const auto& str : strings) {
statements; // cannot modify `str`
}
for (auto&& str : strings) {
statements; // can modify `str`
}
obj.onEvent([] (auto&&...) { std::cout << "hi!"; }); // OK, unused lambda parameters
3.30. Annotate with ``override`` or ``final`` when overriding a virtual method or destructor.
auto x = foo(); // BAD unless foo() is declared nearby or has a well-known prototype
3.30. Use the ``override`` or ``final`` specifier when overriding a virtual
member function or a virtual destructor.
``virtual`` must not be used along with ``final`` so that the compiler can generate
an error when a final function does not override.
``virtual`` should not be used along with ``override`` for consistency with ``final``.
``virtual`` should still be used along with ``override`` and ``final``,
so that a human reader can easily recognize a virtual method
without looking toward the end of the function signature.
.. code-block:: c++
@@ -1060,35 +1094,22 @@ member function or a virtual destructor.
class InputStream : public Stream
{
public:
void
virtual void
open() override;
};
class Console : public InputStream
{
public:
void
open() final;
virtual void
open() override;
};
3.31. The recommended way to throw an exception derived from ``std::exception`` is to use
``NDN_THROW`` or one of the other ``NDN_THROW_*`` macros.
ndn-cxx declares ``NDN_CXX_DECL_OVERRIDE`` and ``NDN_CXX_DECL_FINAL`` macros that
expand to ``override`` and ``final`` if the compiler supports this feature,
but expand to nothing with older compilers.
These must be used in place of ``override`` and ``final``,
so that ndn-cxx remains compatible with older compilers.
Exceptions thrown using these macros will be augmented with additional diagnostic
information, including the file name, line number, and function name from which
the exception was thrown.
The extended diagnostic information contained in the exception can be printed with
``boost::diagnostic_information()``.
.. code-block:: c++
#include <boost/exception/diagnostic_information.hpp>
#include <iostream>
try {
operationThatMayThrow();
}
catch (const std::exception& e) {
std::cerr << boost::diagnostic_information(e);
}
``NDN_CXX_DECL_OVERRIDE`` and ``NDN_CXX_DECL_FINAL`` macros are for ndn-cxx internal use.
Other projects, if adopting this style guide, should define their own macros if needed.
+242 -68
View File
@@ -1,104 +1,278 @@
# Configuration file for the Sphinx documentation builder.
# -*- coding: utf-8 -*-
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# NFD - Named Data Networking Forwarding Daemon documentation build configuration file, created by
# sphinx-quickstart on Sun Apr 6 19:58:22 2014.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import importlib.util
import sys
import os
import re
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('.'))
project = 'ndn-cxx: NDN C++ library with eXperimental eXtensions'
copyright = 'Copyright © 2013-2023 Regents of the University of California.'
author = 'Named Data Networking Project'
# -- General configuration ------------------------------------------------
# The short X.Y version.
#version = ''
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# The full version, including alpha/beta/rc tags.
#release = ''
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.todo',
'redmine_issue',
]
def addExtensionIfExists(extension):
try:
__import__(extension)
extensions.append(extension)
except ImportError:
sys.stderr.write("Extension '%s' in not available. "
"Some documentation may not build correctly.\n" % extension)
sys.stderr.write("To install, use \n"
" sudo pip install %s\n" % extension.replace('.', '-'))
addExtensionIfExists('sphinxcontrib.doxylink')
if os.getenv('GOOGLE_ANALYTICS', None):
addExtensionIfExists('sphinxcontrib.googleanalytics')
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'ndn-cxx: NDN C++ library with eXperimental eXtensions'
copyright = u'Copyright (c) 2013-2015 Regents of the University of California.'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
today_fmt = '%Y-%m-%d'
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = []
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
needs_sphinx = '4.0'
extensions = [
'sphinx.ext.extlinks',
'sphinx.ext.todo',
]
def addExtensionIfExists(extension: str):
try:
if importlib.util.find_spec(extension) is None:
raise ModuleNotFoundError(extension)
except (ImportError, ValueError):
sys.stderr.write(f'WARNING: Extension {extension!r} not found. '
'Some documentation may not build correctly.\n')
else:
extensions.append(extension)
addExtensionIfExists('sphinxcontrib.doxylink')
templates_path = ['_templates']
exclude_patterns = ['Thumbs.db', '.DS_Store']
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
# html_theme = 'default'
html_theme = 'named_data_theme'
html_theme_path = ['.']
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = ['./']
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
html_copy_source = False
html_show_sourcelink = False
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# Disable syntax highlighting of code blocks by default.
highlight_language = 'none'
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
html_file_suffix = ".html"
# Output file base name for HTML help builder.
htmlhelp_basename = 'ndn-cxx-docs'
# -- Options for manual page output ------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-manual-page-output
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'ndn-cxx-docs.tex', u'NDN C++ library with eXperimental eXtensions',
u'Named Data Networking Project', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('manpages/ndnsec', 'ndnsec', 'NDN security toolkit', [], 1),
('manpages/ndnsec-cert-dump', 'ndnsec-cert-dump', 'export an NDN certificate', [], 1),
('manpages/ndnsec-cert-gen', 'ndnsec-cert-gen', 'create an NDN certificate for an identity', [], 1),
('manpages/ndnsec-cert-install', 'ndnsec-cert-install', 'import an NDN certificate from a file', [], 1),
('manpages/ndnsec-delete', 'ndnsec-delete', 'delete an NDN identity, key, or certificate', [], 1),
('manpages/ndnsec-export', 'ndnsec-export', 'export an NDN certificate and its private key to a file', [], 1),
('manpages/ndnsec-get-default', 'ndnsec-get-default', 'show the default NDN identity, key, and certificate for the current user', [], 1),
('manpages/ndnsec-import', 'ndnsec-import', 'import an NDN certificate and its private key from a file', [], 1),
('manpages/ndnsec-key-gen', 'ndnsec-key-gen', 'generate an NDN key for an identity', [], 1),
('manpages/ndnsec-list', 'ndnsec-list', 'list all known NDN identities, keys, and certificates', [], 1),
('manpages/ndnsec-set-default', 'ndnsec-set-default', 'change the default NDN identity, key, or certificate for the current user', [], 1),
('manpages/ndnsec-sign-req', 'ndnsec-sign-req', 'generate an NDN certificate signing request', [], 1),
('manpages/ndnsec-unlock-tpm', 'ndnsec-unlock-tpm', 'unlock the TPM', [], 1),
('manpages/ndn-client.conf', 'ndn-client.conf', 'configuration file for NDN applications', [], 5),
('manpages/ndn-log', 'ndn-log', 'ndn-cxx logging', [], 7),
('manpages/ndnsec', 'ndnsec', u'NDN security tools', None, 1),
('manpages/ndnsec-cert-dump', 'ndnsec-cert-dump', 'part of NDN security tools', None, 1),
('manpages/ndnsec-cert-gen', 'ndnsec-cert-gen', 'part of NDN security tools', None, 1),
('manpages/ndnsec-cert-revoke', 'ndnsec-cert-revoke', 'part of NDN security tools', None, 1),
('manpages/ndnsec-cert-install', 'ndnsec-cert-instal', 'part of NDN security tools', None, 1),
('manpages/ndnsec-delete', 'ndnsec-delete', 'part of NDN security tools', None, 1),
('manpages/ndnsec-export', 'ndnsec-export', 'part of NDN security tools', None, 1),
('manpages/ndnsec-get-default', 'ndnsec-get-default', 'part of NDN security tools', None, 1),
('manpages/ndnsec-import', 'ndnsec-import', 'part of NDN security tools', None, 1),
('manpages/ndnsec-key-gen', 'ndnsec-key-gen', 'part of NDN security tools', None, 1),
('manpages/ndnsec-list', 'ndnsec-list', 'part of NDN security tools', None, 1),
('manpages/ndnsec-set-acl', 'ndnsec-set-acl', 'part of NDN security tools', None, 1),
('manpages/ndnsec-set-default', 'ndnsec-set-default', 'part of NDN security tools', None, 1),
('manpages/ndnsec-sign-req', 'ndnsec-sign-req', 'part of NDN security tools', None, 1),
('manpages/ndnsec-unlock-tpm', 'ndnsec-unlock-tpm', 'part of NDN security tools', None, 1),
('tutorials/security-validator-config', 'ndnsec-validator.conf',
'NDN trust validator configuration file', None, 5),
('manpages/tlvdump', 'tlvdump', 'Decode structure of TLV encoded buffer', None, 1),
('manpages/ndn-client.conf', 'ndn-client.conf', 'Configuration file for NDN platform', None, 5),
]
# -- Misc options ------------------------------------------------------------
# If true, show URL addresses after external links.
man_show_urls = True
# ---- Custom options --------
doxylink = {
'ndn-cxx': ('ndn-cxx.tag', 'doxygen/'),
'ndn-cxx' : ('ndn-cxx.tag', 'doxygen/'),
}
extlinks = {
'issue': ('https://redmine.named-data.net/issues/%s', 'issue #%s'),
}
if os.getenv('GOOGLE_ANALYTICS', None):
googleanalytics_id = os.environ['GOOGLE_ANALYTICS']
googleanalytics_enabled = True
# exclude_patterns = ['RELEASE_NOTES.rst']
redmine_project_url = "http://redmine.named-data.net/"
+226 -324
View File
File diff suppressed because it is too large. Load diff
+20 -17
View File
@@ -5,20 +5,21 @@ Trivial applications
To successfully run the following examples, please make sure that NFD is properly
configured and running. For more information about NFD, refer to `NFD's official
homepage <https://docs.named-data.net/NFD/>`__.
homepage <http://named-data.net/doc/NFD/>`_.
Trivial consumer
----------------
In the following trivial example, a consumer creates a :ndn-cxx:`Face` with default
transport (:ndn-cxx:`UnixTransport`) and sends an Interest for
``/localhost/testApp/randomData``. While expressing Interest, the app specifies three
callbacks to be called when Data/Nack is retrieved or Interest times out.
``/localhost/testApp/randomData``. While expressing Interest, the app specifies two
callbacks to be called when Data is retrieved or Interest times out.
.. literalinclude:: ../examples/consumer.cpp
:language: c++
:linenos:
:emphasize-lines: 43-48,51-54,62,76,82
:emphasize-lines: 24-27,39,43-46,50,57,67
Trivial producer
----------------
@@ -41,27 +42,29 @@ using :ndn-cxx:`Face::put` method.
.. literalinclude:: ../examples/producer.cpp
:language: c++
:linenos:
:emphasize-lines: 39-42,55,60-63,78,86,90
:emphasize-lines: 42,55-58,61,64,67,70,76
Consumer that uses Scheduler
----------------------------
The following example demonstrates how to use :ndn-cxx:`Scheduler` to schedule arbitrary
Consumer that uses ndn::Scheduler
---------------------------------
The following example demonstrates how to use :ndn-cxx:`ndn::Scheduler` to schedule arbitrary
events for execution at specific points of time.
The library internally uses `boost::asio::io_context
<https://www.boost.org/doc/libs/1_71_0/doc/html/boost_asio/reference/io_context.html>`__
to implement fully asynchronous NDN operations (i.e., sending and receiving Interests and
Data). In addition to network-related operations, ``boost::asio::io_context`` can be used
The library internally uses `boost::asio::io_service
<http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/io_service.html>`_ to
implement fully asynchronous NDN operations (i.e., sending and receiving Interests and
Data). In addition to network-related operations, ``boost::asio::io_service`` can be used
to execute any arbitrary callback within the processing thread (run either explicitly via
``io_context::run()`` or implicitly via :ndn-cxx:`Face::processEvents` as in previous
examples). :ndn-cxx:`Scheduler` is just a wrapper on top of ``io_context``, providing a
simple interface to schedule tasks at specific times.
``io.run`` or implicitly via :ndn-cxx:`Face::processEvents` as in previous examples).
:ndn-cxx:`ndn::Scheduler` is just a wrapper on top of ``boost::asio::io_service``,
allowing simple interface to schedule tasks at specific times.
The highlighted lines in the example demonstrate all that is needed to express a second
Interest approximately 3 seconds after the first one.
Interest approximately 2 seconds after the first one.
.. literalinclude:: ../examples/consumer-with-timer.cpp
:language: c++
:linenos:
:emphasize-lines: 47-50,53,84,96-99,104-106
:emphasize-lines: 39-40,51-54,58-59,61-62,99-100
+23 -44
View File
@@ -1,75 +1,54 @@
ndn-cxx: NDN C++ library with eXperimental eXtensions
=====================================================
ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be
used to implement various NDN applications.
Please submit any bugs or issues to the `ndn-cxx issue tracker
<http://redmine.named-data.net/projects/ndn-cxx/issues>`__.
ndn-cxx Documentation
---------------------
.. toctree::
:hidden:
:maxdepth: 3
README
INSTALL
examples
tutorials
specs
manpages
.. toctree::
:hidden:
:maxdepth: 1
code-style
release-notes
releases
**ndn-cxx** is a C++17 library implementing Named Data Networking (NDN) primitives
that can be used to write various NDN applications. The library is currently being
used by the following projects:
* `NFD - NDN Forwarding Daemon <https://github.com/named-data/NFD>`_
* `NLSR - Named-data Link-State Routing protocol <https://github.com/named-data/NLSR>`_
* `ndn-tools - Essential NDN command-line tools <https://github.com/named-data/ndn-tools>`_
* `ndn-svs - State Vector Sync library <https://github.com/named-data/ndn-svs>`_
* `PSync - Partial and full Sync library <https://github.com/named-data/PSync>`_
* `ChronoSync - Sync library for distributed real-time applications (deprecated) <https://github.com/named-data/ChronoSync>`_
* `NAC - Name-based Access Control library <https://github.com/named-data/name-based-access-control>`_
* `NDNCERT - NDN certificate management protocol <https://github.com/named-data/ndncert>`_
* `repo-ng - NDN repository implementation in C++ (deprecated) <https://github.com/named-data/repo-ng>`_
* `ndn-traffic-generator - Simple NDN traffic generator <https://github.com/named-data/ndn-traffic-generator>`_
Documentation
-------------
- :doc:`README`
- :doc:`INSTALL`
- :doc:`examples`
- :doc:`tutorials`
+ :doc:`tutorials/security-library`
+ :doc:`tutorials/utils-ndn-regex`
+ :doc:`tutorials/security-validator-config`
+ :doc:`tutorials/signed-interest`
+ :doc:`tutorials/certificate-format`
+ :doc:`tutorials/security-trust-schema`
- :doc:`manpages`
- :doc:`release-notes`
- :doc:`releases`
For developers
^^^^^^^^^^^^^^
Documentation for ndn-cxx developers and contributors
+++++++++++++++++++++++++++++++++++++++++++++++++++++
- `NDN Software Contributor's Guide <https://github.com/named-data/.github/blob/main/CONTRIBUTING.md>`__
(guide for newcomers to the NDN community of software)
- `API documentation (doxygen) <doxygen/annotated.html>`_
- :doc:`specs`
+ :doc:`specs/safe-bag`
+ :doc:`specs/signed-interest`
- `API documentation (doxygen) <doxygen/annotated.html>`__
- :doc:`code-style`
Issues
------
Please submit any bug reports or feature requests to the
`ndn-cxx issue tracker <https://redmine.named-data.net/projects/ndn-cxx/issues>`__.
- :doc:`Release Notes <RELEASE_NOTES>`
License
-------
ndn-cxx is an open source project licensed under the LGPL version 3. For more information about
the license, refer to `COPYING.md <https://github.com/named-data/ndn-cxx/blob/master/COPYING.md>`__.
ndn-cxx is an open source project licensed under LGPL 3.0 license. For more information about
the license, refer to `COPYING.md <https://github.com/named-data/ndn-cxx/blob/master/COPYING.md>`_.
+25 -7
View File
@@ -1,10 +1,28 @@
Man pages
=========
Manpages
========
.. toctree::
:glob:
:maxdepth: 1
ndn-client.conf <manpages/ndn-client.conf>
manpages/ndnsec
ndnsec-list <manpages/ndnsec-list>
ndnsec-get-default <manpages/ndnsec-get-default>
ndnsec-set-default <manpages/ndnsec-set-default>
ndnsec-key-gen <manpages/ndnsec-key-gen>
ndnsec-dsk-gen <manpages/ndnsec-dsk-gen>
ndnsec-sign-req <manpages/ndnsec-sign-req>
ndnsec-cert-gen <manpages/ndnsec-cert-gen>
ndnsec-cert-revoke <manpages/ndnsec-cert-revoke>
ndnsec-cert-install <manpages/ndnsec-cert-install>
ndnsec-cert-dump <manpages/ndnsec-cert-dump>
ndnsec-delete <manpages/ndnsec-delete>
ndnsec-export <manpages/ndnsec-export>
ndnsec-import <manpages/ndnsec-import>
ndnsec-unlock-tpm <manpages/ndnsec-unlock-tpm>
ndnsec-set-acl <manpages/ndnsec-set-acl>
manpages/tlvdump
:maxdepth: 1
ndn-client.conf <manpages/ndn-client.conf>
ndn-log: ndn-cxx logging <manpages/ndn-log>
manpages/ndnsec*
..
manpages/ndnsec-op-tool
manpages/ndnsec-set-acl
manpages/ndnsec-sig-verify
+35 -48
View File
@@ -1,37 +1,36 @@
client.conf
===========
Description
-----------
System configuration of NDN platform is specified in ``client.conf``.
The configuration file ``client.conf`` is looked up in several directories in the following order:
- ``$HOME/.ndn``: user-specific settings
- ``SYSCONFDIR/ndn``: system-wide settings (where ``SYSCONFDIR`` can be ``/usr/local/etc``,
``/opt/local/etc``, or other, depending on how the library is configured)
- ``$HOME/.ndn/``: user-specific settings
- ``@SYSCONFDIR@/ndn/`` (``/usr/local/etc/ndn``, ``/opt/local/etc/ndn``, or other, depending how the library is configured): system-wide settings
- ``/etc/ndn``: default system-wide settings
Here is an example of ``client.conf`` for the current ndn-cxx package:
Here is an example of ``client.conf`` for current ndn-cxx package:
.. literalinclude:: ../../client.conf.sample
:language: ini
Forwarder
---------
NFD
---
transport
FaceUri for default connection toward local NDN forwarder. Only ``unix``, ``tcp``, ``tcp4``, and
``tcp6`` FaceUris can be specified here.
FaceUri for default connection toward local NDN forwarder. Only ``unix`` and ``tcp4`` FaceUri
can be specified here.
By default, ``unix:///run/nfd.sock`` is used on Linux and ``unix:///var/run/nfd.sock`` is used on
other platforms.
By default, ``unix:///var/run/nfd.sock`` is used.
.. note::
This value can be overridden using the ``NDN_CLIENT_TRANSPORT`` environment variable.
Prefix Registration
-------------------
protocol
The prefix registration protocol. For now, only one protocol ``nrd-0.1`` is supported.
With this protocol, applications send prefix registration requests to NFD RIB manager.
NFD RIB Manager, after authenticating the request, will set up corresponding FIB entries
in NFD.
Key Management
--------------
@@ -41,66 +40,54 @@ pib
pib=[scheme]:[location]
Possible values for ``[scheme]`` are:
Possible values for ``[scheme]``:
* ``pib-sqlite3``: local PIB implementation using the SQLite3 storage engine.
* ``pib-sqlite3``: local PIB implementation with SQLite3 storage engine
Possible values for ``[location]``:
* absolute path where the SQLite3 database will be stored
* relative path (relative to ``client.conf``)
* empty: the default path ``$HOME/.ndn`` will be used
* absolute path where SQLite3 database will be stored
* relative path (relative to ``config.conf``)
* empty: default path ``$HOME/.ndn`` will be used
When ``[location]`` is empty, the trailing ``:`` can be omitted. For example::
When ``[location]`` is empty, trailing ``:`` can be omitted. For example::
pib=pib-sqlite3
Changing PIB scheme without changing location is **not** allowed. If a change like this is
necessary, the whole backend storage must be destroyed. For example, when the default location is
used::
Changing PIB scheme without changing location is **not** allowed. If such change is
necessary, the whole backend storage must be destroyed. For example, when default location
is used::
rm -rf ~/.ndn/ndnsec-*
It is not recommended to share the same directory between machines, e.g. via NFS.
Simultaneous access from multiple machines may cause errors.
.. note::
This value can be overridden using the ``NDN_CLIENT_PIB`` environment variable.
tpm
Trusted Platform Module (TPM) where the private keys are stored. The format for this setting
is::
tpm=[scheme]:[location]
Possible values for ``[scheme]`` are:
Possible values for ``[scheme]``:
* ``tpm-osxkeychain`` (default on macOS): secure storage of private keys in the macOS
* ``tpm-osx-keychain`` (default on OS X platform): secure storage of private keys in OS X
Keychain with OS-provided access restrictions.
The ``[location]`` parameter is ignored.
``[location]`` parameter is ignored.
May not work for daemon applications, as user interaction may be required to access the
macOS Keychain.
May not work for daemon applications, as user interaction may be required to access OS X
Keychain.
* ``tpm-file`` (default on all other platforms): file-based storage of private keys.
* ``tpm-file`` (default on all other platforms): file-based storage of private keys
Possible values for ``[location]``:
* absolute path to directory that will store private/public key files (unencrypted with
``0700`` permission)
* relative path (relative to ``client.conf``)
* empty: the default path ``$HOME/.ndn/ndnsec-tpm-file`` will be used
* relative path (relative to ``config.conf``)
* empty: default path ``$HOME/.ndn/ndnsec-tpm-file`` will be used
When ``[location]`` is empty, the trailing ``:`` can be omitted. For example::
When ``[location]`` is empty, trailing ``:`` can be omitted. For example::
tpm=tpm-file
**Changing the ``tpm`` setting is only possible together with ``pib`` setting. Otherwise,
an error will be generated during PIB/TPM access.**
It is not recommended to share the same directory between machines, e.g. via NFS.
Simultaneous access from multiple machines may cause errors.
.. note::
This value can be overridden using the ``NDN_CLIENT_TPM`` environment variable.
**Change of ``tpm`` setting is only possible together with ``pib`` setting. Otherwise, an
error will be generated during PIB/TPM access**
-103
View File
@@ -1,103 +0,0 @@
ndn-cxx logging
===============
Description
-----------
The ndn-cxx logging facility exposes the internal state of NDN libraries and
applications so the user can investigate internal interactions, such as interest
dispatch inside ndn::Face, Data and Interest validation in the security framework,
sync and recovery Interest processing inside ChronoSync, etc. During runtime, the
user is able to specify the types of messages he or she would like to receive from
a set of logging modules pre-configured by library and application developers.
Environment
-----------
One way to control ndn-cxx logging facility is through the environment variable
``NDN_LOG``. Using this variable, one can set the log levels for the available logging
modules. Logging modules within different libraries and applications usually have
distinguishing prefixes (``ndn.``, ``sync.``, etc.), which can be specified when
setting the environment variable. Wildcards can be used to enable logging for all
modules (just ``*``) or all modules under a selected prefix (e.g., ``ndn.*``).
If an additional environment variable ``NDN_LOG_NOFLUSH`` is set, the automatic flushing
after each log record will be disabled. This can improve logging performance but may
cause the log records to appear delayed or, in case of application crash, the last
few log records may be lost.
ndn-cxx logging facility provides a mechanism to manage the type of log messages
that are written by classifying log messages by severity levels. Listed below
are the available log levels.
**Log Levels:**
::
TRACE
DEBUG
INFO
WARN
ERROR
FATAL
A message's severity level will determine whether the log is written. For instance,
if an application sets its log severity level to DEBUG, all messages marked with
DEBUG, or any of those below that level, are written. FATAL level logs are always
written.
Setting NDN_LOG requires the following syntax with as many prefixes and
corresponding loglevels as the user desires:
.. code-block:: sh
export NDN_LOG="<prefix1>=<loglevel1>:<prefix2>=<loglevel2>"
*Example:*
.. code-block:: sh
export NDN_LOG="ndn.*=DEBUG"
export NDN_LOG="ndn.UnixTransport=INFO"
export NDN_LOG="sync.Logic=ERROR"
export NDN_LOG="*=DEBUG:ndn.UnixTransport=INFO:sync.Logic=ERROR"
**Note:**
The loglevel assignments in ``NDN_LOG`` are processed left-to-right. Thus, shorter
(more general) prefixes should be listed before longer (more specific) prefixes.
Otherwise, the loglevel setting of a more specific prefix may be overwritten by a
more general assignment appearing later in the string. For example:
.. code-block:: sh
export NDN_LOG="ndn.UnixTransport=TRACE:ndn.*=ERROR:*=INFO"
will set all modules to INFO. To obtain the desired effect, it should instead be
written as:
.. code-block:: sh
export NDN_LOG="*=INFO:ndn.*=ERROR:ndn.UnixTransport=TRACE"
**Note:**
Setting the environment variable with sudo requires the application to be run
in the same command.
.. code-block:: sh
# Correct
sudo env NDN_LOG=logLevel ./ndn-application
# Also correct
sudo -s
export NDN_LOG=logLevel
./ndn-application
# Incorrect
sudo export NDN_LOG=logLevel
sudo ./ndn-application
# Incorrect
NDN_LOG=logLevel sudo ./ndn-application
+45 -42
View File
@@ -1,64 +1,67 @@
ndnsec-cert-dump
================
Synopsis
--------
``ndnsec-cert-dump`` is a tool to dump a certificate from **Public Info Base** or file and output
it to standard output.
**ndnsec-cert-dump** [**-h**] [**-p**] [**-r** [**-H** *host*] [**-P** *port*]]
[**-i**\|\ **-k**\|\ **-f**] *name*
Usage
-----
::
$ ndnsec-cert-dump [-h] [-p] [-ikf] name
Description
-----------
:program:`ndnsec-cert-dump` reads a certificate from the **Public Info Base (PIB)**
or from a file, and prints it on the standard output in Base64 encoding.
``ndnsec-cert-dump`` can read a certificate from **Public Info Base (PIB)** or a file and output
the certificate to standard output.
By default, *name* is interpreted as a certificate name.
By default, ``name`` is interpreted as a certificate name.
Options
-------
.. option:: -i, --identity
``-i``
Interpret ``name`` as an identity name. If specified, the certificate to dump is the default
certificate of the identity.
Interpret *name* as an identity name. If specified, the certificate to dump
is the default certificate of the identity.
``-k``
Interpret ``name`` as a key name. If specified, the certificate to dump is the default certificate
of the key.
.. option:: -k, --key
``-f``
Interpret ``name`` as a path to a file containing the certificate. If ``name`` is ``-``,
certificate will be read from standard input.
Interpret *name* as a key name. If specified, the certificate to dump is the
default certificate of the key.
``-p``
Print out the certificate to a human-readable format.
.. option:: -f, --file
Examples
--------
Interpret *name* as a path to a file containing the certificate. If *name*
is "-", the certificate will be read from the standard input.
Dump a certificate from PIB to standard output:
::
.. option:: -p, --pretty
$ ndnsec-cert-dump /ndn/test/KEY/david/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
Print the certificate in a human-readable format.
Dump a certificate to a human-readable format:
::
Example
-------
Dump a certificate from PIB to standard output::
$ ndnsec-cert-dump /ndn/test/david/KEY/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
Print the NDN testbed root certificate in human-readable format::
$ curl -A ndnsec -fsLS https://named-data.net/ndnsec/ndn-testbed-root.ndncert.x3.base64 | ndnsec-cert-dump -fp -
Certificate Name:
/ndn/KEY/%EC%F1L%8EQ%23%15%E0/ndn/%FD%00%00%01u%E6%7F2%10
Additional Description:
fullname: NDN Testbed Root X3
Public Key:
Key Type: 256-bit EC
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGx+3Y4FvYo1eScIvgD74lQhQdzN4
zq021dop8t7kGfEpfGdKf2HGpnn4/qoF9iJ1yUZE/7Na8zzO4xT6RpIM0Q==
$ ndnsec-cert-dump -p /ndn/test/KEY/david/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
Certificate name:
/ndn/test/KEY/david/ksk-1396913058196/ID-CERT/%00%00%01E%3E%9D%A0%DE
Validity:
Not Before: 2020-11-20T16:31:37
Not After: 2024-12-31T23:59:59
Signature Information:
Signature Type: SignatureSha256WithEcdsa
Key Locator: Name=/ndn/KEY/%EC%F1L%8EQ%23%15%E0
Self-Signed: yes
NotBefore: 20140401T000000
NotAfter: 20150331T235959
Subject Description:
2.5.4.41: David
2.5.4.10: Some Organization
Public key bits:
MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAtLq50tpynJ15zExEh9l6
jvh/HOmwhOppr/hTEPYUn2VTh21+JJIg5pHAAH/DQr8Bq5BGrdDUCIShxSxbaHwu
a1y4XgKP1MYBQP/WzcIhIzB/3PBDdmE0jM3Qg6yuk8BOwett3C07GtwW9dfgacwt
aC29xIHnYKfryH/gBSIDUIb38M7ILIDgQeIiQcHGHoFO8CbDtKY2OvVkFNgxowAR
Xn+gtkIfMdE77Z8p0S21pYfdvPuIpVVLy7lnFdwGzyCi3nmbtd/r9NSTepBczWQz
zBbThT7yfeNyHWLu0PZPdz84UpNPsBad3Bx9tT31noIVnt8yyBEfEU1jyEIVkm8U
VQIB
+54 -67
View File
@@ -1,92 +1,79 @@
ndnsec-cert-gen
===============
Synopsis
--------
``ndnsec-cert-gen`` is a tool to issue an identity certificate.
**ndnsec-cert-gen** [**-h**] [**-S** *timestamp*] [**-E** *timestamp*]
[**-I** *info*]... [**-s** *signer*] [**-i** *issuer*] *file*
Usage
-----
::
$ ndnsec-cert-gen [-h] [-S timestamp] [-E timestamp] [-N name] [-I info] [-s sign-id] [-p cert-prefix] request
Description
-----------
:program:`ndnsec-cert-gen` takes a signing request as input and issues an
identity certificate for the key in the signing request. The signing request
can be created with :program:`ndnsec-key-gen` and can be re-generated with
:program:`ndnsec-sign-req`.
``ndnsec-cert-gen`` takes signing request as input and issues an identity certificate for the key in
the signing request. The signing request can be created during ``ndnsec-keygen`` and can be
re-generated with ``ndnsec-sign-req``.
By default, the default key is used to sign the issued certificate.
By default, the default key/certificate will be used to sign the issued certificate.
*file* is the name of a file that contains the signing request. If *file* is
"-", the signing request is read from the standard input.
``request`` could be a path to a file that contains the signing request. If ``request`` is ``-``,
then signing request will be read from standard input.
The generated certificate will be written to standard output in base64 encoding.
The generated certificate is written to the standard output in base64 encoding.
Options
-------
.. option:: -S <timestamp>, --not-before <timestamp>
``-S timestamp``
Timestamp when the certificate becomes valid. The default value is now.
Date and time when the certificate becomes valid, in "YYYYMMDDhhmmss" format.
The default value is now.
``-E timestamp``
Timestamp when the certificate expires. The default value is one year from now.
.. option:: -E <timestamp>, --not-after <timestamp>
``-N name``
Name of the certificate owner.
Date and time when the certificate expires, in "YYYYMMDDhhmmss" format.
The default value is 365 days after the **--not-before** timestamp.
``-I info``
Other information about the certificate owner. ``subject-info`` is a list of pairs of OID and
corresponding value. For example, "2.5.4.10 'Some Organization' 2.5.4.3 'http://home.page/'".
.. option:: -I <info>, --info <info>
``-s sign-id``
Signing identity. The default key/certificate of ``sign-id`` will be used to sign the requested
certificate. If this option is not specified, the system default identity will be used.
Other information to be included in the issued certificate. Must be in the
form of key and value pairs, where the key is an arbitrary string without
spaces, followed by one or more spaces, followed by an arbitrary string
representing the value. This option may be repeated multiple times.
``-p cert-prefix``
The certificate prefix, which is the part of certificate name before ``KEY`` component.
For example::
By default, the certificate prefix will be inferred from the certificate name according
to the relation between the signing identity and the subject identity. If the signing
identity is a prefix of the subject identity, ``KEY`` will be inserted after the
signingIdentity, otherwise ``KEY`` is inserted after subject identity (i.e., before
``ksk-....``).
-I "affiliation Some Organization" -I "homepage https://home.page/"
.. option:: -s <signer>, --sign-id <signer>
Signing identity. The default key/certificate of *signer* will be used to
sign the requested certificate. If this option is not specified, the system
default identity will be used.
.. option:: -i <issuer>, --issuer-id <issuer>
Issuer's ID to be included in the issued certificate name. The default
value is "NA".
Example
-------
Examples
--------
::
$ ndnsec-cert-gen -S 20200501000000 -E 20210101000000 -I "affiliation Some Organization" -I "foobar Foo Bar" -i "Universe" -s /ndn/test request.cert > signed.cert
$ cat signed.cert
Bv0BcgctCAdleGFtcGxlCANLRVkICOQUmX8oloLrCAhVbml2ZXJzZQgJ/QAAAXHR
Ak6CFAkYAQIZBAA27oAVWzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDpJsCkv
E5RMjxRVdyK6W6z+FoCq+qREEn/sxf+n2gnsl25qm1NarCfSGf96zIJy9BRA9btu
MMeuWlAN/ymvMFwWkBsBAxwcBxoIA25kbggEdGVzdAgDS0VZCAhJP1OaKLualf0A
/Sb9AP4PMjAyMDA1MDFUMDAwMDAw/QD/DzIwMjEwMTAxVDAwMDAwMP0BAkH9AgAk
/QIBC2FmZmlsaWF0aW9u/QICEVNvbWUgT3JnYW5pemF0aW9u/QIAFf0CAQZmb29i
YXL9AgIHRm9vIEJhchdHMEUCIQDPT9Hq1kvkE0r9W1aYSBVTnHlTEzgtz+v1DwkC
ug/vLAIgY3xJITCwf55sqey33q5GIQSk1TRCkNNl58ojvPs5sNU=
$ ndnsec-cert-dump -p -f signed.cert
Certificate Name:
/example/KEY/%E4%14%99%7F%28%96%82%EB/Universe/%FD%00%00%01q%D1%02N%82
Additional Description:
affiliation: Some Organization
foobar: Foo Bar
Public Key:
Key Type: 256-bit EC
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOkmwKS8TlEyPFFV3IrpbrP4WgKr6
pEQSf+zF/6faCeyXbmqbU1qsJ9IZ/3rMgnL0FED1u24wx65aUA3/Ka8wXA==
Validity:
Not Before: 2020-05-01T00:00:00
Not After: 2021-01-01T00:00:00
Signature Information:
Signature Type: SignatureSha256WithEcdsa
Key Locator: Name=/ndn/test/KEY/I%3FS%9A%28%BB%9A%95
$ ndnsec-cert-gen -S 20140401000000 -E 20150331235959 -N "David"
-I "2.5.4.10 'Some Organization'" -s /ndn/test sign_request.cert
Bv0C9wc9CANuZG4IBHRlc3QIA0tFWQgFZGF2aWQIEWtzay0xMzk2OTEzMDU4MTk2
CAdJRC1DRVJUCAgAAAFFPp2g3hQDGAECFf0BdjCCAXIwIhgPMjAxNDA0MDEwMDAw
MDBaGA8yMDE1MDMzMTIzNTk1OVowKDAMBgNVBCkTBURhdmlkMBgGA1UEChMRU29t
ZSBPcmdhbml6YXRpb24wggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC0
urnS2nKcnXnMTESH2XqO+H8c6bCE6mmv+FMQ9hSfZVOHbX4kkiDmkcAAf8NCvwGr
kEat0NQIhKHFLFtofC5rXLheAo/UxgFA/9bNwiEjMH/c8EN2YTSMzdCDrK6TwE7B
623cLTsa3Bb11+BpzC1oLb3Egedgp+vIf+AFIgNQhvfwzsgsgOBB4iJBwcYegU7w
JsO0pjY69WQU2DGjABFef6C2Qh8x0TvtnynRLbWlh928+4ilVUvLuWcV3AbPIKLe
eZu13+v01JN6kFzNZDPMFtOFPvJ943IdYu7Q9k93PzhSk0+wFp3cHH21PfWeghWe
3zLIER8RTWPIQhWSbxRVAgERFjMbAQEcLgcsCANuZG4IA0tFWQgEdGVzdAgRa3Nr
LTEzOTQxMjk2OTQ3ODgIB0lELUNFUlQX/QEABUGcl7U+F8cwMHKckerv+1H2Nvsd
OfeqX0+4RzWU+wRx2emMGMZZdHSx8M/i45hb0P5hbNEF99L35/SrSTSzhTZdOriD
t/LQOcKBoNXY+iw3EUFM0gvRGU0kaEVBKAHtbYhtoHc48QLEyrsVaMqmrjCmpeF/
JOcClhzJfFW3cZ/SlhcTEayF0ntogYLR2cMzIwQhhSj5L/Kl7I7uxNxZhK1DS98n
q8oGAxHufEAluPrRpDQfI+jeQ4h/YYKcXPW3Vn7VQAGOqIi6gTlUxrmEbyCDF70E
xj5t3wfSUmDa1N+hLRMdEAI+IjRRHDSx2Lhj/QcoPIZPWwKjBz9CBL92og==
+33 -24
View File
@@ -1,47 +1,56 @@
ndnsec-cert-install
===================
Synopsis
--------
``ndnsec-cert-install`` is a tool to install a certificate into **Public Information Base (PIB)**.
**ndnsec-cert-install** [**-h**] [**-I**\|\ **-K**\|\ **-N**] *file*
Usage
-----
::
$ ndnsec-cert-install [-h] [-IKN] cert-source
Description
-----------
:program:`ndnsec-cert-install` allows importing a certificate into the
**Public Information Base (PIB)**. By default, the installed certificate
will be set as the default certificate for the corresponding identity and
the identity will be set as the user's default identity.
``ndnsec-cert-install`` can insert a certificate into PIB. By default, the installed certificate
will be set as the default certificate of its corresponding identity and the identity is set as
the system default identity.
*file* is a path to a file that contains the certificate to install.
If *file* is "-", the certificate will be read from the standard input.
The certificate should be in Base64 encoding.
``cert-source`` could be a filesystem path or an HTTP URL of a file containing to certificate to
install or . If ``cert-file`` is ``-``, the certificate will be read from standard input.
Options
-------
.. option:: -I, --identity-default
``-I``
Set the certificate as the default certificate of its corresponding identity, but do not change
the system default identity.
Set the certificate as the default certificate for the corresponding identity,
but do not change the user's default identity.
``-K``
Set the certificate as the default certificate of its corresponding key, but do not change the
corresponding identity's default key and the system default identity.
.. option:: -K, --key-default
``-N``
Install the certificate but do not change any default settings.
Set the certificate as the default certificate for the corresponding key, but
do not change the identity's default key or the user's default identity.
Examples
--------
.. option:: -N, --no-default
Install a certificate and set it as the system default certificate:
Install the certificate but do not change any default settings.
Example
-------
Install a certificate and set it as the default certificate::
::
$ ndnsec-cert-install cert_file.cert
Install a certificate but do not change any default settings::
Install a certificate with HTTP URL and set it as the system default certificate:
::
$ ndnsec-install-cert "http://ndncert.domain.com/cert/get/my-certificate.ndncert"
Install a certificate but do not change any default settings:
::
$ ndnsec-cert-install -N cert_file.cert
+36
View File
@@ -0,0 +1,36 @@
ndnsec-cert-revoke
==================
``ndnsec-cert-revoke`` is a tool to generate a certificate revocation data.
Usage
-----
::
$ ndnsec-cert-revoke [-h] request
Description
-----------
This command takes an identity ertificate as input.
The tool will check whether user is the issuer of the certificate (by checking whether user has the key pointed by the KeyLocator of the certificate).
If so, the tool will generate an empty packet named by the certificate name appended with "REVOKED" as a revocation data.
If user is not the issuer of the certificate, the command will return error.
This tool generates a revocation Data.
It does not actually revoke a certificate.
How to publish and use the revocation Data is not finalized yet.
Options
-------
``request``
request is file name of the certificate to revoke (``-`` for standard input)
Examples
--------
::
$ ndnsec-cert-revoke some-cert-to-revoke.ndncert
+20 -18
View File
@@ -1,32 +1,32 @@
ndnsec-delete
=============
Synopsis
--------
``ndnsec-delete`` is a tool to delete security data from both **Public Info Base** and
**Trusted Platform Module**.
**ndnsec-delete** [**-h**] [**-k**\|\ **-c**] *name*
Usage
-----
::
ndnsec-delete [-h] [-kc] name
Description
-----------
:program:`ndnsec-delete` allows to delete security data from both the
**Public Info Base (PIB)** and the **Trusted Platform Module (TPM)**.
By default, ``ndnsec-delete`` interpret ``name`` as an identity name. If an identity is deleted,
all the keys and certificates belonging to the identity will be deleted as well. If a key is
deleted, all the certificate belonging to the key will be deleted as well.
By default, :program:`ndnsec-delete` will interpret *name* as an identity name.
If an identity is deleted, all keys and certificates belonging to that identity
will be deleted as well. If a key is deleted, all certificates associated with
that key will be deleted as well.
Options
-------
.. option:: -k, --delete-key
``-k``
Interpret ``name`` as a key name and delete the key and its related data.
Interpret *name* as a key name and delete the key and its associated data.
.. option:: -c, --delete-cert
Interpret *name* as a certificate name and delete the certificate.
``-c``
Interpret ``name`` as a certificate name and delete the certificate.
Exit Status
-----------
@@ -35,9 +35,11 @@ Normally, the exit status is 0 if the requested entity is deleted successfully.
If the entity to be deleted does not exist, the exit status is 1.
For other errors, the exit status is 2.
Example
-------
Examples
--------
Delete all data related to an identity::
Delete all data related to an identity:
::
$ ndnsec-delete /ndn/test/david
+43
View File
@@ -0,0 +1,43 @@
ndnsec-dsk-gen
==============
``ndnsec-dsk-gen`` is tool to generate a pair of Data-Signing-Key (DSK) for the specified ``identity``
and sign the generated key using the corresponding Key-Signing-Key (KSK).
The generated DSK will be set as the default key of the identity.
Usage
-----
::
$ ndnsec-dsk-gen [-h] [-t keyType] identity
Description
-----------
``ndnsec-dsk-gen`` creates a pair of Data-Signing-Key (DSK) for the specified ``identity``
and sign the generated key using the corresponding Key-Signing-Key (KSK).
The tool will first check the default KSK of the identity, and then generate a DSK
and sign the DSK using the KSK.
The information encoded in the DSK certificate is set the same as the KSK certificate.
In the end, the DSK is set as the default key of the identity.
Options
-------
``-t keyType``
Specify the key type, ``r`` (default) for RSA and ``e`` for ECDSA.
Examples
--------
::
$ ndnsec-dsk-gen /ndn/test
OK: dsk certificate with name [/ndn/test/KEY/dsk-1417501749768/ID-CERT/%FD%00%00%01J%09%B02%8B] has been successfully installed
$ ndnsec-list -c
* /ndn/test
+->* /ndn/test/dsk-1417501749768
+->* /ndn/test/KEY/dsk-1417501749768/ID-CERT/%FD%00%00%01J%09%B02%8B
+-> /ndn/test/ksk-1417475325879
+->* /ndn/test/KEY/ksk-1417475325879/ID-CERT/%FD%00%00%01J%09%AE.Y
+24 -33
View File
@@ -1,53 +1,44 @@
ndnsec-export
=============
Synopsis
--------
``ndnsec-export`` is a tool to export an identity's security data
**ndnsec-export** [**-h**] [**-o** *file*] [**-P** *passphrase*]
[**-i**\|\ **-k**\|\ **-c**] *name*
Usage
-----
::
$ ndnsec-export [-h] [-o output] [-p] identity
Description
-----------
:program:`ndnsec-export` exports a certificate from the **Public Info Base (PIB)** and
its private key to a file. It will ask for a passphrase to encrypt the private key.
The resulting file can be imported again using :program:`ndnsec-import`.
``ndnsec-export`` can export public data of the ``identity`` including default key/certificate.
``ndnsec-export`` can also export sensitive data (such as private key), but the sensitive data will
be encrypted. The exported identity can be imported again using ``ndnsec-import``.
By default, the command will write exported data to standard output.
Options
-------
.. option:: -i, --identity
``-o output``
Output the exported data to a file pointed by ``output``.
Interpret *name* as an identity name. The default certificate of the identity will be exported.
This is the default unless **-k** or **-c** is specified.
``-p``
Export private key of the identity. A password will be asked for data encryption.
.. option:: -k, --key
Examples
--------
Interpret *name* as a key name. The default certificate of the key will be exported.
Export an identity's security data including private key and store the security data in a file:
.. option:: -c, --cert
::
Interpret *name* as a certificate name.
$ ndnsec-export -o id.info -p /ndn/test/alice
.. option:: -o <file>, --output <file>
Export an identity's security data without private key and write it to standard output:
Write to the specified output file instead of the standard output.
::
.. option:: -P <passphrase>, --password <passphrase>
Passphrase to use for the export. If empty or not specified, the user is
interactively asked to type the passphrase on the terminal. Note that
specifying the passphrase via this option is insecure, as it can potentially
end up in the shell's history, be visible in :command:`ps` output, and so on.
Example
-------
Export an identity's default certificate and private key into a file::
$ ndnsec-export -o alice.ndnkey /ndn/test/alice
Export a specific certificate and its private key to the standard output::
$ ndnsec-export -c /ndn/edu/ucla/alice/KEY/1%5D%A7g%90%B2%CF%AA/self/%FD%00%00%01r-%D3%DC%2A
$ ndnsec-export /ndn/test/alice
+31 -26
View File
@@ -1,56 +1,61 @@
ndnsec-get-default
==================
Synopsis
--------
``ndnsec-get-default`` is a tool to display the default setting of a particular entity.
**ndnsec-get-default** [**-h**] [**-k**\|\ **-c**] [**-i** *identity*\|\ **-K** *key*] [**-q**]
Usage
-----
::
$ ndnsec-get-default [-h] [-kc] [-i identity|-K key] [-q]
Description
-----------
Given a particular entity, :program:`ndnsec-get-default` shows its default settings
according to the command-line options. By default, if neither **-i** nor **-K** is
given, the command displays the default identity or the default key/certificate of
the default identity.
Given a particular entity, ``ndnsec-get-default`` can display its default setting as specified in
options. If ``identity`` is specified, the given entity becomes the identity. If ``key`` is
specified, the given identity becomes the key. If no entity is specified, the command will take the
system default identity as the given entity.
Options
-------
.. option:: -k, --default-key
``-k``
Display the given entity's default key name.
Display the chosen entity's default key name.
``-c``
Display the given entity's default certificate name.
.. option:: -c, --default-cert
``-i identity``
Display default setting of the ``identity``
Display the chosen entity's default certificate name.
``-K key``
Display default setting of the ``key``.
.. option:: -i <identity>, --identity <identity>
``-q``
Disable trailling new line character.
Display default settings of *identity*.
Examples
--------
.. option:: -K <key>, --key <key>
Display an identity's default key name.
Display default settings of *key*.
.. option:: -q, --quiet
Disable printing the trailing newline character.
Example
-------
Display an identity's default key name::
::
$ ndnsec-get-default -k -i /ndn/test/alice
/ndn/test/alice/ksk-1394129695025
Display an identity's default certificate name::
Display an identity's default certificate name.
::
$ ndnsec-get-default -c -i /ndn/test/alice
/ndn/test/KEY/alice/ksk-1394129695025/ID-CERT/%FD%01D%98%9A%F2%3F
Display a key's default certificate name::
Display a key's default certificate name.
::
$ ndnsec-get-default -c -K /ndn/test/alice/ksk-1394129695025
/ndn/test/KEY/alice/ksk-1394129695025/ID-CERT/%FD%01D%98%9A%F2%3F
+17 -17
View File
@@ -1,33 +1,33 @@
ndnsec-import
=============
Synopsis
--------
``ndnsec-import`` is a tool to import an identity's security data that is prepared by
``ndnsec-export``.
**ndnsec-import** [**-h**] [**-P** *passphrase*] *file*
Usage
-----
::
$ ndnsec-import [-h] [-p] input
Description
-----------
:program:`ndnsec-import` imports a certificate and its private key from a file
created by :program:`ndnsec-export`. It will ask for the passphrase used to
encrypt the private key.
If *file* is "-", read from the standard input.
``ndnsec-import`` read data from ``input``. It will ask for password if the input contains private
key. If ``input`` is ``-``, security data will be read from standard input.
Options
-------
.. option:: -P <passphrase>, --password <passphrase>
``-p``
Indicates the imported data containing private key. A password will be asked for data encryption.
Passphrase to use for the export. If empty or not specified, the user is
interactively asked to type the passphrase on the terminal. Note that
specifying the passphrase via this option is insecure, as it can potentially
end up in the shell's history, be visible in :command:`ps` output, and so on.
Examples
--------
Example
-------
Import an identity's security data including private key:
Import a certificate and private key from a file::
::
$ ndnsec-import alice.ndnkey
$ ndnsec-import -p input_file
+19 -28
View File
@@ -1,47 +1,38 @@
ndnsec-key-gen
==============
Synopsis
--------
``ndnsec-key-gen`` is tool to generate a pair of key.
**ndnsec-key-gen** [**-h**] [**-n**] [**-t** *type*]
[**-k** *keyidtype*\|\ **--keyid** *keyid*] *identity*
Usage
-----
::
$ ndnsec-key-gen [-h] [-n] [-d] [-t keyType] identity
Description
-----------
:program:`ndnsec-key-gen` generates a key pair for the specified *identity* and
sets the generated public key as the identity's default key.
:program:`ndnsec-key-gen` will also create a signing request for the generated key.
The signing request will be written to the standard output in base64 encoding.
``ndnsec-key-gen`` creates a key pair for the specified ``identity`` and sets the key as the
identity's default key. ``ndnsec-key-gen`` will also create a signing request for the generated key.
The signing request will be written to standard output in base64 encoding.
By default, it will also set the identity as the user's default identity.
By default, it will also set the identity as the system default identity.
Options
-------
.. option:: -n, --not-default
``-n``
Do not set the identity as the system default identity.
Do not set the identity as the user's default identity.
``-d``
Generate Data-Signing-Key (DSK) instead of the default Key-Signing-Key (KSK).
Note that if no other identity/key/certificate exists, then the identity
will become the default regardless of this option.
``-t keyType``
Specify the key type. ``r`` (default) for RSA key. ``e`` for ECDSA key.
.. option:: -t <type>, --type <type>
Type of key to generate. "r" for RSA, "e" for ECDSA (the default).
.. option:: -k <keyidtype>, --keyid-type <keyidtype>
Type of KeyId for the generated key. "r" for a 64-bit random number (the default
unless **--keyid** is specified), "h" for the SHA-256 of the public key.
.. option:: --keyid <keyid>
User-specified KeyId. Must be a non-empty generic name component.
Example
-------
Examples
--------
::
+26 -19
View File
@@ -1,20 +1,24 @@
ndnsec-list
===========
Synopsis
--------
``ndnsec-list`` is a tool to display entities stored in **Public Information Base (PIB)**, such as
identities, keys, and certificates.
**ndnsec-list** [**-h**] [**-k**\|\ **-c**]
Usage
-----
::
$ ndnsec-list [-h] [-KkCc]
Description
-----------
:program:`ndnsec-list` prints the names of all the entities stored in the
**Public Information Base (PIB)**, such as identities, keys, and certificates,
up to the given granularity level. By default, only the identity names are
shown. The default entities will be marked with a "*" in front of their names.
``ndnsec-list`` lists names of all the entities according to the granularity specified in options
(The default granularity is identity). The default entities will be marked with ``*`` in front of
their names. For example:
For example::
::
$ ndnsec list
* /ndn/edu/ucla/cs/yingdi
@@ -22,23 +26,24 @@ For example::
/ndn/test/bob
/ndn/test/alice
Options
-------
.. option:: -k, --key
``-K, -k``
Display key names for each identity. The key name with ``*`` in front is the default key name of
the corresponding identity.
Display key names for each identity. The key name with a "*" in front is
the default key name of the corresponding identity.
``-C, -c``
Display certificate names for each key. The certificate name with ``*`` in front is the default
certificate name of the corresponding key.
.. option:: -c, --cert
Examples
--------
Display certificate names for each key. The certificate name with a "*"
in front is the default certificate name of the corresponding key.
Display all the key names in PIB.
Example
-------
Display all the key names in PIB::
::
$ ndnsec-list -k
* /ndn/edu/ucla/cs/yingdi
@@ -54,7 +59,9 @@ Display all the key names in PIB::
/ndn/test/alice
+->* /ndn/test/alice/ksk-1394129695025
Display all the certificate names in PIB::
Display all the certificate names in PIB.
::
$ ndnsec-list -c
* /ndn/edu/ucla/cs/yingdi
+26
View File
@@ -0,0 +1,26 @@
ndnsec-set-acl
==============
``ndnsec-set-acl`` is a tool to add an application into access control list of an private key.
Usage
-----
::
$ ndnsec-set-acl [-h] keyName appPath
Description
-----------
``ndnsec-set-acl`` will add the application pointed by ``appPath`` into the ACL of a key with name
``keyName``.
Examples
--------
Add an application into a key's ACL:
::
$ ndnsec-set-acl /ndn/test/alice/ksk-1394129695025 /test/app/path
+25 -19
View File
@@ -1,43 +1,49 @@
ndnsec-set-default
==================
Synopsis
--------
``ndnsec-set-default`` is a tool to change the default security settings.
**ndnsec-set-default** [**-h**] [**-k**\|\ **-c**] *name*
Usage
-----
::
$ ndnsec-set-default [-h] [-k|c] name
Description
-----------
:program:`ndnsec-set-default` allows changing the default security settings.
Without any options, *name*, which must be an identity name, is set as the
default identity for the current user.
By default, ``ndnsec-set-default`` takes ``name`` as an identity name and sets the identity as the
system default identity.
Options
-------
.. option:: -k, --default-key
``-k``
Set default key. ``name`` should be a key name, ``ndnsec-set-default`` can infer the corresponding
identity and set the key as the identity's default key.
Set *name*, which must be a key name, as the default key for the
corresponding identity.
``-c``
Set default certificate. ``name`` should be a certificate name, ``ndnsec-set-default`` can
infer the corresponding key name and set the certificate as the key's default certificate.
.. option:: -c, --default-cert
Examples
--------
Set *name*, which must be a certificate name, as the default certificate
for the corresponding key.
Set a key's default certificate:
Example
-------
Set a key's default certificate::
::
$ ndnsec-set-default -c /ndn/test/KEY/alice/ksk-1394129695025/ID-CERT/%FD%01D%98%9A%F2%3F
Set an identity's default key::
Set an identity's default key:
::
$ ndnsec-set-default -k /ndn/test/alice/ksk-1394129695025
Set the user's default identity::
Set system default identity:
::
$ ndnsec-set-default /ndn/test/alice
+22 -17
View File
@@ -1,35 +1,37 @@
ndnsec-sign-req
===============
Synopsis
--------
``ndnsec-sign-req`` is a tool to generate a signing request for a particular key.
**ndnsec-sign-req** [**-h**] [**-k**] *name*
Usage
-----
::
$ ndnsec-sign-req [-h] [-k] name
Description
-----------
:program:`ndnsec-sign-req` generates a signing request for a key.
The signing request of a key is actually a self-signed certificate. Given key's information,
``ndnsec-sign-req`` looks up the key in PIB. If such a key exists, a self-signed certificate of the
key, or its signing request, will be outputed to **stdout** with base64 encoding.
The signing request of a key is actually a self-signed certificate. Given the
key's information, :program:`ndnsec-sign-req` looks up the key in the PIB.
If such a key exists, a self-signed certificate for the key, i.e. its signing
request, is written to the standard output in base64 encoding.
By default, *name* is interpreted as an identity name, and the signing request
will be generated for that identity's default key.
By default, ``name`` is interpreted as an identity name. ``ndnsec-sign-req`` will generate a
signing request for the identity's default key.
Options
-------
.. option:: -k, --key
``-k``
Interpret ``name`` as a key name.
Interpret *name* as a key name, instead of an identity name.
Examples
--------
Example
-------
Create a signing request for an identity's default key.
Create a signing request for an identity's default key::
::
$ ndnsec-sign-req /ndn/test/david
Bv0DAAc9CANuZG4IBHRlc3QIBWRhdmlkCANLRVkIEWtzay0xMzk2OTk4Mzg5MjU3
@@ -50,7 +52,10 @@ Create a signing request for an identity's default key::
0wHjvDS1cuIH2j6XveoUYapRjZXaEZqB/YoBwRqEYq2KVn/ol5knLM6FIISXXjxn
cIh62A==
Create a signing request for a particular key::
Create a signing request for a particular key.
::
$ ndnsec-sign-req -k /ndn/test/david/ksk-1396913058196
Bv0DAAc9CANuZG4IBHRlc3QIBWRhdmlkCANLRVkIEWtzay0xMzk2OTEzMDU4MTk2
+9 -5
View File
@@ -1,13 +1,17 @@
ndnsec-unlock-tpm
=================
Synopsis
--------
``ndnsec-unlock-tpm`` is a tool to (temporarily) unlock the **Trusted Platform Module (TPM)** that
manages private keys.
ndnsec-unlock-tpm [**-h**]
Usage
-----
::
$ ndnsec-unlock-tpm [-h]
Description
-----------
:program:`ndnsec-unlock-tpm` can be used to (temporarily) unlock the
**Trusted Platform Module (TPM)** that manages private keys.
``ndnsec-unlock-tpm`` will ask for password to unlock the TPM.
+65 -36
View File
@@ -1,60 +1,89 @@
ndnsec
======
:program:`ndnsec` is a command-line toolkit to perform various NDN security
management operations.
``ndnsec`` is a command-line toolkit to perform various NDN security management
operation.
Synopsis
--------
Usage
-----
**ndnsec** *command* [*argument*]...
::
**ndnsec-**\ *command* [*argument*]...
$ ndnsec <command> [<args>]
or alternatively
::
$ ndnsec-command [<args>]
Description
-----------
The NDN security data are stored in two places: **Public Information Base**
(PIB) and **Trusted Platform Module** (TPM). The :program:`ndnsec` toolkit
provides a command-line interface for managing and using the NDN security data.
The NDN security data are stored and managed in two places: **Public Information Base** and
**Trusted Platform Module**. ``ndnsec`` toolkit provides a command-line interface of managing and
using the NDN security data.
Commands
--------
ndnsec commands
---------------
The following commands are understood:
ndnsec-list_
Display information in PublicInfo.
:doc:`list <ndnsec-list>`
List all known identities/keys/certificates.
ndnsec-get-default_
Get default setting info.
:doc:`get-default <ndnsec-get-default>`
Show the default identity/key/certificate.
ndnsec-set-default_
Configure default setting.
:doc:`set-default <ndnsec-set-default>`
Change the default identity/key/certificate.
ndnsec-key-gen_
Generate a Key-Signing-Key for an identity.
:doc:`delete <ndnsec-delete>`
Delete an identity/key/certificate.
ndnsec-dsk-gen_
Generate a Data-Signing-Key (DSK) for an identity and sign the DSK using the corresponding KSK.
:doc:`key-gen <ndnsec-key-gen>`
Generate a key for an identity.
:doc:`sign-req <ndnsec-sign-req>`
ndnsec-sign-req_
Generate a certificate signing request.
:doc:`cert-gen <ndnsec-cert-gen>`
Create a certificate for an identity.
ndnsec-cert-gen_
Generate an identity certificate.
:doc:`cert-dump <ndnsec-cert-dump>`
Export a certificate.
ndnsec-cert-dump_
Dump a certificate from PublicInfo.
:doc:`cert-install <ndnsec-cert-install>`
Import a certificate from a file.
ndnsec-cert-install_
Install a certificate into PublicInfo.
:doc:`export <ndnsec-export>`
Export an identity as a SafeBag.
ndnsec-delete_
Delete identity/key/certificate.
:doc:`import <ndnsec-import>`
Import an identity from a SafeBag.
ndnsec-export_
Export an identity package.
:doc:`unlock-tpm <ndnsec-unlock-tpm>`
Unlock the TPM.
ndnsec-import_
Import an identity package.
ndnsec-set-acl_
Configure ACL of a private key.
ndnsec-unlock-tpm_
Unlock Tpm.
ndnsec-op-tool_
Operator tool.
.. _ndnsec-list: ndnsec-list.html
.. _ndnsec-get-default: ndnsec-get-default.html
.. _ndnsec-set-default: ndnsec-set-default.html
.. _ndnsec-key-gen: ndnsec-key-gen.html
.. _ndnsec-dsk-gen: ndnsec-dsk-gen.html
.. _ndnsec-sign-req: ndnsec-sign-req.html
.. _ndnsec-cert-gen: ndnsec-cert-gen.html
.. _ndnsec-cert-dump: ndnsec-cert-dump.html
.. _ndnsec-cert-install: ndnsec-cert-install.html
.. _ndnsec-delete: ndnsec-delete.html
.. _ndnsec-export: ndnsec-export.html
.. _ndnsec-import: ndnsec-import.html
.. _ndnsec-set-acl: ndnsec-set-acl.html
.. _ndnsec-unlock-tpm: ndnsec-unlock-tpm.html
.. _ndnsec-op-tool: ndnsec-op-tool.html
+46
View File
@@ -0,0 +1,46 @@
tlvdump
=======
``tlvdump`` is a simple application allowing to decode structure of TLV-encoded packet.
Usage
-----
::
tlvdump [filename]
Description
-----------
If filename is specified, ``tlvdump`` will attempt to read and decode content of the file,
otherwise data will be read from standard input.
Example
-------
::
$ tlvdump interest.tlv
5 (Interest) (size: 89)
7 (Name) (size: 20)
8 (NameComponent) (size: 5) [[local]]
8 (NameComponent) (size: 3) [[ndn]]
8 (NameComponent) (size: 6) [[prefix]]
9 (Selectors) (size: 55)
13 (MinSuffixComponents) (size: 1) [[%01]]
14 (MaxSuffixComponents) (size: 1) [[%01]]
28 (KeyLocatorDigest) (size: 22)
7 (Name) (size: 20)
8 (NameComponent) (size: 4) [[test]]
8 (NameComponent) (size: 3) [[key]]
8 (NameComponent) (size: 7) [[locator]]
16 (Exclude) (size: 20)
8 (NameComponent) (size: 4) [[alex]]
8 (NameComponent) (size: 4) [[xxxx]]
19 (Any) (size: 0) [[...]]
8 (NameComponent) (size: 4) [[yyyy]]
17 (ChildSelector) (size: 1) [[%01]]
10 (Nonce) (size: 1) [[%01]]
11 (Scope) (size: 1) [[%01]]
12 (InterestLifetime) (size: 2) [[%03%E8]]
+68 -27
View File
@@ -1,45 +1,86 @@
{#
named_data_theme/layout.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~
#}
{%- extends "agogo/layout.html" %}
{% extends "basic/layout.html" %}
{% block header %}
<!--headercontainer-->
<div id="header_container">
<div class="row">
<div class="three columns">
<p class="logo"><a href="https://named-data.net" title="A Future Internet Architecture">
<img class="logo" src="{{ pathto('_static/ndn-logo.svg', 1)|e }}" alt="Logo" width="210"/>
</a></p>
<!--header-->
<div class="row">
<div class="three columns">
<div id="logo">
<a href="http://named-data.net" title="A Future Internet Architecture"><img src="http://named-data.net/wp-content/uploads/cropped-20130722_Logo2.png" alt="" /></a>
</div><!--logo end-->
</div>
<!--top menu-->
<div class="nine columns" id="menu_container" >
<h1><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a></h1>
</div>
</div>
<div id="menu_container" class="nine columns">
<h1><a href="{{ pathto(master_doc)|e }}">{{ shorttitle|e }}</a></h1>
</div><!--header container end-->
{% endblock %}
{% block content %}
<div class="content-wrapper">
<div class="content">
<div class="document">
{%- block document %}
{{ super() }}
{%- endblock %}
</div>
<div class="sidebar">
{%- block sidebartoc %}
<h3>{{ _('Table Of Contents') }}</h3>
{{ toctree(includehidden=True) }}
<h3>{{ _('Developer documentation') }}</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="doxygen/annotated.html">API documentation (doxygen)</a></li>
<li class="toctree-l1"><a class="reference internal" href="code-style.html">ndn-cxx Code Style and Coding Guidelines</a></li>
</ul>
{%- endblock %}
{%- block sidebarsearch %}
<h3 style="margin-top: 1.5em;">{{ _('Search') }}</h3>
<form class="search" action="{{ pathto('search') }}" method="get">
<input type="text" name="q" />
<input type="submit" value="{{ _('Go') }}" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
{{ _('Enter search terms or a module, class or function name.') }}
</p>
{%- endblock %}
</div>
<div class="clearer"></div>
</div>
</div>
{% endblock %}
{%- block sidebartoc %}
<h3>{{ _('Table of Contents') }}</h3>
{{ toctree(includehidden=True) }}
<h3>{{ _('Developer Documentation') }}</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="doxygen/annotated.html">API Documentation (doxygen)</a></li>
<li class="toctree-l1"><a class="reference internal" href="code-style.html">ndn-cxx Code Style and Coding Guidelines</a></li>
</ul>
{%- endblock %}
{% block footer %}
<div id="footer-container">
<!--footer container-->
<div class="row">
</div><!-- footer container-->
</div>
<div id="footer-info">
<div class="row">
<div class="twelve columns">
<div id="copyright">
This research is partially supported by NSF (Award <a href="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1040868" target="_blank">CNS-1040868</a>).<br/><br/>
Licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/" target="_blank">Creative Commons Attribution 3.0 Unported License</a> except where noted.
</div>
<!--footer container-->
<div class="row">
<div class="twelve columns">
<div id="copyright">This research is partially supported by NSF (Award <a href="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1040868" target="_blank>">CNS-1040868</a>)<br/><br/><a rel="license" href="http://creativecommons.org/licenses/by/3.0/deed.en_US" target="_blank">Creative Commons Attribution 3.0 Unported License</a> except where noted.</div>
</div>
</div>
</div>
</div>
</div><!--footer info end-->
{% endblock %}
{% block relbar1 %}{% endblock %}
{% block relbar2 %}{% endblock %}
+2 -2
View File
@@ -26,13 +26,13 @@ $mathjax
<div class="row">
<div class="three columns">
<div id="logo">
<a href="https://named-data.net" title="A Future Internet Architecture"><img src="https://named-data.net/wp-content/uploads/cropped-20130722_Logo2.png" alt="" /></a>
<a href="http://named-data.net" title="A Future Internet Architecture"><img src="http://named-data.net/wp-content/uploads/cropped-20130722_Logo2.png" alt="" /></a>
</div><!--logo end-->
</div>
<!--top menu-->
<div class="nine columns" id="menu_container" >
<h1><a href="https://docs.named-data.net/ndn-cxx/$projectnumber/">$projectname $projectnumber documentation</a></h1>
<h1><a href="http://named-data.net/doc/ndn-cxx/$projectnumber/">$projectname $projectnumber documentation</a></h1>
</div>
</div>
</div><!--header container end-->
+459
View File
@@ -0,0 +1,459 @@
* {
margin: 0px;
padding: 0px;
}
html { font-size: 62.5%; }
body {
font-family: {{ theme_bodyfont }};
background-color: {{ theme_bgcolor }};
color: #777;
border-top: 4px solid #fd7800;
}
body { background: white; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1; color: #222222; position: relative; -webkit-font-smoothing: antialiased; }
/* Page layout */
div.header, div.content, div.footer {
width: 90%;
margin-left: auto;
margin-right: auto;
}
div.header-wrapper {
background: {{ theme_headerbg }};
border-bottom: 3px solid #2e3436;
}
/* Default body styles */
a {
color: {{ theme_linkcolor }};
}
div.bodywrapper a, div.footer a {
text-decoration: none;
}
.clearer {
clear: both;
}
.left {
float: left;
}
.right {
float: right;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
h1, h2, h3, h4 {
font-family: {{ theme_headerfont }};
font-weight: normal;
color: {{ theme_headercolor2 }};
margin-bottom: .8em;
}
h1 {
color: {{ theme_headercolor1 }};
}
h2 {
padding-bottom: .5em;
border-bottom: 1px solid {{ theme_headercolor2 }};
}
a.headerlink {
visibility: hidden;
color: #dddddd;
padding-left: .3em;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink {
visibility: visible;
}
img {
border: 0;
}
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 2px 7px 1px 7px;
border-left: 0.2em solid black;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
dt:target, .highlighted {
background-color: #fbe54e;
}
/* Header */
div.header {
padding-top: 10px;
padding-bottom: 10px;
}
div.header .headertitle {
font-family: {{ theme_headerfont }};
font-weight: normal;
font-size: 180%;
letter-spacing: .08em;
margin-bottom: .8em;
}
div.header .headertitle a {
color: white;
}
div.header div.rel {
margin-top: 1em;
}
div.header div.rel a {
color: {{ theme_headerlinkcolor }};
letter-spacing: .1em;
text-transform: uppercase;
}
p.logo {
float: right;
}
img.logo {
border: 0;
}
/* Content */
div.content-wrapper {
background-color: white;
padding-top: 20px;
padding-bottom: 20px;
}
div.document {
width: 70%;
float: left;
}
div.body {
padding-right: 2em;
text-align: left;
}
div.document h1 {
line-height: 120%;
}
div.document ul {
margin-left: 1.5em;
list-style-type: square;
}
div.document dd {
margin-left: 1.2em;
margin-top: .4em;
margin-bottom: 1em;
}
div.document .section {
margin-top: 1.7em;
}
div.document .section:first-child {
margin-top: 0px;
}
div.document div.highlight {
padding: 3px;
background-color: #eeeeec;
border-top: 2px solid #dddddd;
border-bottom: 2px solid #dddddd;
margin-bottom: .8em;
}
div.document h2 {
margin-top: .7em;
}
div.document p {
margin-bottom: .5em;
}
div.document li.toctree-l1 {
margin-bottom: 1em;
}
div.document .descname {
font-weight: bold;
}
div.document .docutils.literal {
background-color: #eeeeec;
padding: 1px;
}
div.document .docutils.xref.literal {
background-color: transparent;
padding: 0px;
}
div.document ol {
margin: 1.5em;
}
/* Sidebar */
div.sidebar {
width: 20%;
float: right;
font-size: .9em;
}
div.sidebar a, div.header a {
text-decoration: none;
}
div.sidebar a:hover, div.header a:hover {
text-decoration: none;
}
div.sidebar h3 {
color: #2e3436;
text-transform: uppercase;
font-size: 130%;
letter-spacing: .1em;
}
div.sidebar ul {
list-style-type: none;
}
div.sidebar li.toctree-l1 a {
display: block;
padding: 1px;
border: 1px solid #dddddd;
background-color: #eeeeec;
margin-bottom: .4em;
padding-left: 3px;
color: #2e3436;
}
div.sidebar li.toctree-l2 a {
background-color: transparent;
border: none;
margin-left: 1em;
border-bottom: 1px solid #dddddd;
}
div.sidebar li.toctree-l3 a {
background-color: transparent;
border: none;
margin-left: 2em;
border-bottom: 1px solid #dddddd;
}
div.sidebar li.toctree-l2:last-child a {
border-bottom: none;
}
div.sidebar li.toctree-l1.current a {
border-right: 5px solid {{ theme_headerlinkcolor }};
}
div.sidebar li.toctree-l1.current li.toctree-l2 a {
border-right: none;
}
div.sidebar input[type="text"] {
width: 170px;
}
div.sidebar input[type="submit"] {
width: 30px;
}
/* Footer */
div.footer-wrapper {
background: {{ theme_footerbg }};
border-top: 4px solid #babdb6;
padding-top: 10px;
padding-bottom: 10px;
min-height: 80px;
}
div.footer, div.footer a {
color: #888a85;
}
div.footer .right {
text-align: right;
}
div.footer .left {
text-transform: uppercase;
}
/* Styles copied from basic theme */
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable dl, table.indextable dd {
margin-top: 0;
margin-bottom: 0;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
/* -- viewcode extension ---------------------------------------------------- */
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family:: {{ theme_bodyfont }};
}
div.viewcode-block:target {
margin: -1px -3px;
padding: 0 3px;
background-color: #f4debf;
border-top: 1px solid #ac9;
border-bottom: 1px solid #ac9;
}
td.linenos pre {
padding: 5px 0px;
border: 0;
background-color: transparent;
color: #aaa;
margin-top: -10pt;
}
@@ -0,0 +1,14 @@
@import url("agogo.css");
pre {
padding: 10px;
background-color: #fafafa;
color: #222;
line-height: 1.2em;
border: 2px solid #C6C9CB;
font-size: 1.1em;
/* margin: 1.5em 0 1.5em 0; */
margin: 0;
border-right-style: none;
border-left-style: none;
}
+3 -26
View File
@@ -123,10 +123,10 @@ ul.large li { line-height: 21px; }
ol li ul, ol li ol { margin-left: 20px; margin-bottom: 0; }
/* Blockquotes ---------------------- */
blockquote, blockquote p { line-height: 1.5; color: #6f6f6f; }
blockquote, blockquote p { line-height: 1.5; }
blockquote { margin: 0 0 17px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; }
blockquote cite { display: block; font-size: 13px; color: #555555; }
blockquote { margin: 0 0 17px; padding: 9px 20px 0 19px; }
blockquote cite { display: block; font-size: 13pt; color: #555555; }
blockquote cite:before { content: "\2014 \0020"; }
blockquote cite a, blockquote cite a:visited { color: #555555; }
@@ -786,26 +786,3 @@ ul.link-list li a { display: block; }
.flex-video.widescreen { padding-bottom: 57.25%; }
.flex-video.vimeo { padding-top: 0; }
.flex-video iframe, .flex-video object, .flex-video embed, .flex-video video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
@media only screen and (max-device-width: 800px), only screen and (device-width: 1024px) and (device-height: 600px), only screen and (width: 1280px) and (orientation: landscape), only screen and (device-width: 800px), only screen and (max-width: 767px) { .flex-video { padding-top: 0; } }
/* Microformats ---------------------- */
ul.vcard { display: inline-block; margin: 0 0 12px 0; border: 1px solid #ddd; padding: 10px; }
ul.vcard li { margin: 0; display: block; }
ul.vcard li.fn { font-weight: bold; font-size: 15px; font-size: 1.5rem; }
p.vevent span.summary { font-weight: bold; }
p.vevent abbr { cursor: default; text-decoration: none; font-weight: bold; border: none; padding: 0 1px; }
/* Progress Bar ---------------------- */
div.progress { padding: 2px; margin-bottom: 10px; border: 1px solid #cccccc; height: 25px; /* meter */ /* border radii */ }
div.progress .meter { background: #fd7800; height: 100%; display: block; width: 50%; }
div.progress.secondary .meter { background: #e9e9e9; }
div.progress.success .meter { background: #5da423; }
div.progress.alert .meter { background: #c60f13; }
div.progress.radius { -webkit-border-radius: 3px; -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; border-radius: 3px; }
div.progress.radius .meter { -webkit-border-radius: 2px; -moz-border-radius: 2px; -ms-border-radius: 2px; -o-border-radius: 2px; border-radius: 2px; }
div.progress.round { -webkit-border-radius: 1000px; -moz-border-radius: 1000px; -ms-border-radius: 1000px; -o-border-radius: 1000px; border-radius: 1000px; }
div.progress.round .meter { -webkit-border-radius: 1000px; -moz-border-radius: 1000px; -ms-border-radius: 1000px; -o-border-radius: 1000px; border-radius: 1000px; }
ul li p { display: inline; }
@@ -1,75 +0,0 @@
@import "agogo.css";
@import "foundation.css";
@import "named_data_style.css";
body, h1, h2, h3, h4, p {
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
}
h1 { font-size: 26px; }
h2 { font-size: 20px; }
h3 { font-size: 17px; }
h4 { font-size: 15px; }
h1, h2, h3, h4 {
font-weight: bold;
}
h2, h3, h4 {
line-height: 1.2;
}
blockquote {
border-left: none;
font-style: normal;
}
blockquote p {
color: #222;
}
p.logo {
float: left;
margin: 1px 0 0 0;
padding: 0;
}
table {
border-collapse: collapse;
}
th, td {
border: 1px solid #666;
padding: 5px;
}
div.document p {
margin: 0.5em 0;
padding: 0;
}
div.document ol,
div.document ul {
margin: 0 0 0 2em;
}
div.document pre {
font-size: 13px;
line-height: 1.3;
margin: 0;
padding: 10px 20px;
}
div.document table p {
margin: 0;
}
div.document th p {
font-weight: bold;
}
div.bodywrapper a,
div.header a:hover,
div.sidebar a:hover {
text-decoration: none;
}
@@ -1,713 +0,0 @@
/* General */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
body {
/* background: #ccc;
font: normal 12px Verdana, sans-serif;
color: #777;
line-height:18px; */
border-top: 4px solid #fd7800;
}
a {
/* color: #000;
outline: 0; */
}
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
}
a:active,
a:hover {
/* color: #ccc; */
text-decoration: none;
}
h1,h2,h3,h4,h5,h6 {
color: #000;
margin-bottom: 18px;
}
h1 { font-weight: normal; font-size: 24px; line-height: 24px; }
h2 { font-weight: normal; font-size: 18px; line-height: 18px; }
h3 { font-weight: normal; font-size: 14px; line-height: 14px; }
h4 { font-weight: normal; font-size: 12px; line-height: 12px; }
hr {
background-color: #c6c6c6;
border:0;
height: 1px;
margin-bottom: 18px;
clear:both;
}
div.hr {
height: 1px;
background: #c6c6c6;
}
div.hr2 {
height: 1px;
background: #c6c6c6;
}
div.hr hr, div.hr2 hr {
display: none;
}
p {
padding: 0 0 0.5em;
line-height:1.6em;
}
ul {
list-style: square;
margin: 0 0 18px 0;
}
ol {
list-style: decimal;
margin: 0 0 18px 1.5em;
}
ol ol {
list-style:upper-alpha;
}
ol ol ol {
list-style:lower-roman;
}
ol ol ol ol {
list-style:lower-alpha;
}
ul ul,
ol ol,
ul ol,
ol ul {
margin-bottom:0;
}
dl {
margin:0 0 24px 0;
}
dt {
font-weight: bold;
}
dd {
margin-bottom: 18px;
}
strong {
font-weight: bold;
color: #000;
}
cite,
em,
i {
font-style: italic;
border: none;
}
big {
font-size: 131.25%;
}
ins {
background: #FFFFCC;
border: none;
color: #333;
}
del {
text-decoration: line-through;
color: #555;
}
blockquote {
font-style: italic;
padding: 0 3em;
}
blockquote cite,
blockquote em,
blockquote i {
font-style: normal;
}
pre {
background: #f7f7f7;
color: #222;
line-height: 18px;
margin-bottom: 18px;
padding: 1.5em;
}
abbr,
acronym {
border-bottom: 1px solid #666;
cursor: help;
}
ins {
text-decoration: none;
}
sup,
sub {
height: 0;
line-height: 1;
vertical-align: baseline;
position: relative;
font-size: 10px;
}
sup {
bottom: 1ex;
}
sub {
top: .5ex;
}
p,
ul,
ol,
dd,
pre,
hr {
margin-bottom:10px;
}
ul ul,
ol ol,
ul ol,
ol ul {
margin-bottom:0;
}
pre,
kbd,
tt,
var {
font-size: 15px;
line-height: 21px;
}
code {
font-size: 13px;
}
strong,
b,
dt,
th {
color: #000;
}
/* main_container */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#wrapper {
padding: 0px 0px;
margin-top: 20px;
}
/* header*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#search-header{
margin-top:15px;
padding-bottom:13px;
}
#search-header #search{
background: #222;
}
#search-header #search #s{
background: #222;
font-size:12px;
color: #aaa;
}
#header_container{
padding-bottom: 25px;
padding-top: 0px;
background: #fff;
}
#header {
}
#header2 {
}
#content_container{
padding-top: 15px;
}
#left-col {
padding: 10px 20px;
padding-left: 0px;
background: #fff;
}
/*footer*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#footer {
padding: 5px 20px;
background: #ddd;
}
#footer-container{
padding: 5px 20px;
background: #303030;
border-top: 8px solid #000;
font-size:11px;
}
#footer-info {
color:#ccc;
text-align:left;
background: #1b1b1b;
padding: 20px 0;
}
#footer-info a{
text-decoration:none;
color: #fff;
}
#footer-info a:hover{
color: #ebebeb;
}
#copyright{float: left;}
.scroll-top {
text-align:right;
}
#footer-bar1 {
padding-right: 40px;
}
#footer-bar2 {
padding-right: 40px;
}
#footer-bar3 {
}
#footer-bar4 {
}
span#follow-box{
position: absolute;
right: 100px;
}
span#follow-box img{
margin: 0 2px;
}
/*logo*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#logo {
margin: 0px 0px 0px 0px;
}
#logo2 {
margin: 0px 0px 0px 0px;
}
#logo img{
border: none;
}
#logo2{
text-decoration: none;
font-size: 42px;
letter-spacing: -1pt;
font-weight: bold;
font-family:arial, "Times New Roman", Times, serif;
text-align: left;
line-height: 57px;
padding-left: 0px;
}
#logo2 a, #slogan{
color: #fd7800;
}
#slogan{
text-align: left;
padding-left: 0px;
}
/*search*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#search {
width:180px;
height:28px;
border: 1px solid #ccc;
margin-left: 10px;
position: relative;
}
#sidebar #search {
margin-top: 20px;
}
#search #searchsubmit {
background:url(images/go-btn.png) no-repeat top right;
width:28px;
height:28px;
border:0px;
position:absolute;
right: -35px;
}
#search #s {
width:170px;
height:23px;
border:0px;
margin-left:7px;
margin-right:10px;
margin-top:3px;
color:#000;
display: inline;
float: left;
}
/*menu bar*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#menu_container{
padding-top: 0px;
}
/*responsive menu*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
/* default style */
.selectnav { display: none; }
/* small screen */
@media screen and (max-width: 600px) {
.js #nav { display: none; }
.js #nav2 { display: none; }
.js .selectnav { display: block; }
}
/*homepage boxes*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#box_container{
padding-top: 35px;
padding-bottom: 15px;
}
.box-head {
float: left;
padding-bottom: 20px;
}
.box-head img{
}
.title-head{
padding-top:2px;
}
.title-box{
color: #333;
line-height: 15px;
text-transform: uppercase;
}
.title-box h1 {
font-size: 18px;
margin-bottom: 3px;
}
.box-content {
float: left;
padding-top: 10px;
line-height: 20px;
}
/* POST */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
.post {
overflow: hidden;
}
.post-shadow{
background: url("images/post_shadow.png") no-repeat bottom;
height: 9px;
margin-bottom: 25px;
}
.post ol{
margin-left: 20px;
}
.post ul {
margin-left: 15px;
}
.post-entry ul { margin: 0 0 10px 10px; }
.post-entry ul li {
display: block;
margin: 5px 0;
padding: 0 0 0 20px;
/*background: url(images/bullet.png) no-repeat 0 7px;*/
}
.post-entry ol {
list-style: decimal;
margin: 0 0 18px 1.6em;
}
.post-entry ol li {
list-style: decimal;
}
.post-entry {
padding-bottom: 10px;
padding-top: 10px;
overflow: hidden;
}
.post-head {
margin-bottom: 5px;
padding-top: 15px;
}
.post-head h1 a, .post-head h1 {
text-decoration:none;
color:#000;
margin: 0px;
font-size: 27px;
}
.post-head h1 a:hover {
color:#777;
}
.post-head-notfound h1, .post-head-404 h1, .post-head-archive h1, .post-head-search h1 {
margin-bottom: 10px;
font-weight:normal;
text-decoration:none;
color:#000;
font-size: 27px;
}
.post-thumb img {
border: 0px solid #ebebeb;
}
.post-entry img{
margin-bottom: 10px;
height:auto;
max-width:100% !important;
}
.meta-data{
line-height: 16px;
padding: 6px 3px;
margin-bottom: 3px;
font-size: 11px;
border-bottom: 1px solid #e9e9e9;
}
.meta-data a{
color: #fd7800;
}
.meta-data a:hover{
color: #777;
}
.read-more {
color: #000;
background: #fff;
padding: 4px 8px;
border-radius: 3px;
display: inline-block;
font-size: 11px;
font-weight: bold;
text-decoration: none;
text-transform: capitalize;
cursor: pointer;
margin-top: 20px;
}
.read-more:hover{
background: #fff;
color: #666;
}
.clear {
clear:both;
}
.sticky {
}
/* content */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#content_container table {
border: 1px solid #e7e7e7;
margin: 0 -1px 24px 0;
text-align: left;
width: 100%;
}
#content_container tr th,
#content_container thead th {
color: #888;
font-size: 12px;
font-weight: bold;
line-height: 18px;
padding: 9px 10px;
}
#content_container tr td {
padding: 6px 10px;
}
#content_container tr.odd td {
background: #f2f7fc;
}
/* sidebar*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#sidebar {
padding:0px 20px 20px 0px;
}
#sidebar ul {
list-style: none;
}
#sidebar { word-wrap: break-word;}
/*--navigation--*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
.navigation {
float: left;
width: 100%;
margin: 20px 0;
}
.navigation .alignleft a {
float: left;
}
.navigation .alignright a {
float: right;
}
#nav-single {
overflow:hidden;
margin-top:20px;
margin-bottom:10px;
}
.nav-previous {
float: left;
width: 50%;
}
.nav-next {
float: right;
text-align: right;
width: 50%;
}
/*--slider--*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#slider_container {
background: #fff;
}
.flex-caption{
background: #232323;
color: #fff;
padding: 7px;
}
.flexslider p{
margin: 0px;
}
/*--sub head and breadcrumbs--*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#subhead_container{
padding: 7px 0px;
}
#subhead h1{
color: #000;
padding-top: 10px;
padding-left: 0px;
font-size: 30px;
}
#breadcrumbs {
padding-left: 25px;
margin-bottom: 15px;
color: #9e9e9e;
margin:0 auto;
width: 964px;
font-size: 10px;
}
#breadcrumbs a{
text-decoration: none;
color: #9e9e9e;
}
/*Alignments */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
.alignleft,
img.alignleft {
display: inline;
float: left;
margin-right: 22px;
margin-top: 9px;
}
.alignright,
img.alignright {
display: inline;
float: right;
margin-left: 22px;
margin-top: 8px;
}
.aligncenter,
img.aligncenter {
clear: both;
display: block;
margin-left: auto;
margin-right: auto;
}
.alignleft,
.alignright,
.aligncenter,
img.alignleft,
img.alignright,
img.aligncenter
{
margin-bottom: 10px;
}
a img.aligncenter {
display:block;
margin-left:auto;
margin-right:auto;
}
@@ -0,0 +1,813 @@
@import url("base.css");
@import url("foundation.css");
table {
border: 0;
}
pre {
padding: 10px;
background-color: #fafafa;
color: #222;
/* line-height: 1.0em; */
border: 2px solid #C6C9CB;
font-size: 0.9em;
/* margin: 1.5em 0 1.5em 0; */
margin: 0;
border-right-style: none;
border-left-style: none;
}
/* General */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
}
a:active,
a:hover {
text-decoration: none;
}
h1,h2,h3,h4,h5,h6 {
color: #000;
margin-bottom: 18px;
}
h1 { font-weight: bold; font-size: 24px; }
h2 { font-weight: bold; font-size: 18px; }
h3 { font-weight: bold; font-size: 16px; }
h4 { font-weight: bold; font-size: 14px; }
hr {
background-color: #c6c6c6;
border:0;
height: 1px;
margin-bottom: 18px;
clear:both;
}
div.hr {
height: 1px;
background: #c6c6c6;
}
div.hr2 {
height: 1px;
background: #c6c6c6;
}
div.hr hr, div.hr2 hr {
display: none;
}
p {
padding: 0;
line-height:1.6em;
}
ul {
list-style: square;
margin: 0 0 18px 0;
}
ol {
list-style: decimal;
margin: 0 0 18px 1.5em;
}
ol ol {
list-style:upper-alpha;
}
ol ol ol {
list-style:lower-roman;
}
ol ol ol ol {
list-style:lower-alpha;
}
ul ul,
ol ol,
ul ol,
ol ul {
margin-bottom:0;
}
dl {
margin:0 0 24px 0;
}
dt {
font-weight: bold;
}
dd {
margin-bottom: 18px;
}
strong {
font-weight: bold;
color: #000;
}
cite,
em,
i {
font-style: italic;
border: none;
}
big {
font-size: 131.25%;
}
ins {
background: #FFFFCC;
border: none;
color: #333;
}
del {
text-decoration: line-through;
color: #555;
}
blockquote {
padding: 0 3em;
}
blockquote cite,
blockquote em,
blockquote i {
font-style: normal;
}
pre {
background: #f7f7f7;
color: #222;
padding: 1.5em;
}
abbr,
acronym {
border-bottom: 1px solid #666;
cursor: help;
}
ins {
text-decoration: none;
}
sup,
sub {
height: 0;
line-height: 1;
vertical-align: baseline;
position: relative;
font-size: 10px;
}
sup {
bottom: 1ex;
}
sub {
top: .5ex;
}
p,
ul,
ol,
dd,
hr {
margin-bottom:10px;
}
ul ul,
ol ol,
ul ol,
ol ul {
margin-bottom:0;
}
pre,
kbd,
tt,
var {
}
code {
font-size: 13px;
}
strong,
b,
dt,
th {
color: #000;
}
/* main_container */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#wrapper {
padding: 0px 0px;
margin-top: 20px;
}
/* header*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#search-header{
margin-top:15px;
padding-bottom:13px;
}
#search-header #search{
background: #222;
}
#search-header #search #s{
background: #222;
font-size:12px;
color: #aaa;
}
#header_container{
padding-bottom: 25px;
padding-top: 0px;
background: #fff;
}
#header {
}
#header2 {
}
#content_container{
padding-top: 15px;
}
#left-col {
padding: 10px 20px;
padding-left: 0px;
background: #fff;
}
/*footer*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#footer {
padding: 5px 20px;
background: #ddd;
}
#footer-container{
padding: 5px 20px;
background: #303030;
border-top: 8px solid #000;
font-size:11px;
}
#footer-info {
color:#ccc;
text-align:left;
background: #1b1b1b;
padding: 20px 0;
}
#footer-info a{
text-decoration:none;
color: #fff;
}
#footer-info a:hover{
color: #ebebeb;
}
#copyright{float: left;}
.scroll-top {
text-align:right;
}
#footer-widget{
padding: 8px 0px 8px 0px;
color:#6f6f6f;
}
#footer-widget #search {
width:120px;
height:28px;
background: #222;
margin-left: 0px;
position: relative;
border: 1px solid #666;
}
#footer-widget #search #s {
width:110px;
height:23px;
border:0px;
margin-left:7px;
margin-right:10px;
margin-top:3px;
color:#fff;
display: inline;
background: #222;
float: left;
}
#footer-widget #calendar_wrap {
padding: 8px 0px;
}
#footer-widget #wp-calendar td{
padding:2px;
}
#footer-widget .textwidget {
padding: 5px 0px;
line-height: 23px;
}
#footer-widget .widget_tag_cloud a{
text-decoration: none;
margin: 5px;
line-height: 24px;
margin-left: 0px;
color: #6f6f6f;
}
#footer-widget .widget_tag_cloud a:hover{
color: #fff;
}
#footer-widget .widget-container ul li a {
color:#fd7800;
}
#footer-widget .widget-container ul li a:hover {
color: #ccc;
}
#footer-widget .widget-container h3 {
color: #a5a5a5;
text-transform: uppercase;
margin-bottom: 0px;
padding-top: 10px;
padding-left: 0px;
font-size: 25px;
padding-bottom: 8px;
font-weight: bold;
}
#footer-widget .widget-container ul li {
padding: 5px 0px;
background: none;
}
#footer-widget ul {
margin-left: 0px;
}
#footer-bar1 {
padding-right: 40px;
}
#footer-bar2 {
padding-right: 40px;
}
#footer-bar3 {
}
#footer-bar4 {
}
span#follow-box{
position: absolute;
right: 100px;
}
span#follow-box img{
margin: 0 2px;
}
/*logo*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#logo {
margin: 0px 0px 0px 0px;
}
#logo2 {
margin: 0px 0px 0px 0px;
}
#logo img{
border: none;
}
#logo2{
text-decoration: none;
font-size: 42px;
letter-spacing: -1pt;
font-weight: bold;
font-family:arial, "Times New Roman", Times, serif;
text-align: left;
line-height: 57px;
padding-left: 0px;
}
#logo2 a, #slogan{
color: #fd7800;
}
#slogan{
text-align: left;
padding-left: 0px;
}
/*search*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#search {
width:180px;
height:28px;
border: 1px solid #ccc;
margin-left: 10px;
position: relative;
}
#sidebar #search {
margin-top: 20px;
}
#search #searchsubmit {
background:url(images/go-btn.png) no-repeat top right;
width:28px;
height:28px;
border:0px;
position:absolute;
right: -35px;
}
#search #s {
width:170px;
height:23px;
border:0px;
margin-left:7px;
margin-right:10px;
margin-top:3px;
color:#000;
display: inline;
float: left;
}
/*menu bar*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#menu_container{
padding-top: 0px;
}
/*responsive menu*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
/* default style */
.selectnav { display: none; }
/* small screen */
@media screen and (max-width: 600px) {
.js #nav { display: none; }
.js #nav2 { display: none; }
.js .selectnav { display: block; }
}
/*welcome*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#welcome_container h1{
margin-top: 0px;
}
/*homepage boxes*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#box_container{
padding-top: 35px;
padding-bottom: 15px;
}
.box-head {
float: left;
padding-bottom: 20px;
}
.box-head img{
}
.title-head{
padding-top:2px;
}
.title-box{
color: #333;
line-height: 15px;
text-transform: uppercase;
}
.title-box h1 {
font-size: 18px;
margin-bottom: 3px;
}
.box-content {
float: left;
padding-top: 10px;
line-height: 20px;
}
/* POST */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
.post {
overflow: hidden;
}
.post-shadow{
background: url("images/post_shadow.png") no-repeat bottom;
height: 9px;
margin-bottom: 25px;
}
.post ol{
margin-left: 20px;
}
.post ul {
margin-left: 15px;
}
.post-entry ul { margin: 0 0 10px 10px; }
.post-entry ul li {
display: block;
margin: 5px 0;
padding: 0 0 0 20px;
/*background: url(images/bullet.png) no-repeat 0 7px;*/
}
.post-entry ol {
list-style: decimal;
margin: 0 0 18px 1.6em;
}
.post-entry ol li {
list-style: decimal;
}
.post-entry {
padding-bottom: 10px;
padding-top: 10px;
overflow: hidden;
}
.post-head {
margin-bottom: 5px;
padding-top: 15px;
}
.post-head h1 a, .post-head h1 {
text-decoration:none;
color:#000;
margin: 0px;
font-size: 27px;
}
.post-head h1 a:hover {
color:#777;
}
.post-head-notfound h1, .post-head-404 h1, .post-head-archive h1, .post-head-search h1 {
margin-bottom: 10px;
font-weight:normal;
text-decoration:none;
color:#000;
font-size: 27px;
}
.post-thumb img {
border: 0px solid #ebebeb;
}
.post-entry img{
margin-bottom: 10px;
height:auto;
max-width:100% !important;
}
.meta-data{
line-height: 16px;
padding: 6px 3px;
margin-bottom: 3px;
font-size: 11px;
border-bottom: 1px solid #e9e9e9;
}
.meta-data a{
color: #fd7800;
}
.meta-data a:hover{
color: #777;
}
.read-more {
color: #000;
background: #fff;
padding: 4px 8px;
border-radius: 3px;
display: inline-block;
font-size: 11px;
font-weight: bold;
text-decoration: none;
text-transform: capitalize;
cursor: pointer;
margin-top: 20px;
}
.read-more:hover{
background: #fff;
color: #666;
}
.clear {
clear:both;
}
.sticky {
}
/* content */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#content_container table {
border: 1px solid #e7e7e7;
margin: 0 -1px 24px 0;
text-align: left;
width: 100%;
}
#content_container tr th,
#content_container thead th {
color: #888;
font-size: 12px;
font-weight: bold;
line-height: 18px;
padding: 9px 10px;
}
#content_container tr td {
padding: 6px 10px;
}
#content_container tr.odd td {
background: #f2f7fc;
}
/* sidebar*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#sidebar {
padding:0px 20px 20px 0px;
}
#sidebar ul {
list-style: none;
}
#sidebar { word-wrap: break-word;}
/*--navigation--*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
.navigation {
float: left;
width: 100%;
margin: 20px 0;
}
.navigation .alignleft a {
float: left;
}
.navigation .alignright a {
float: right;
}
#nav-single {
overflow:hidden;
margin-top:20px;
margin-bottom:10px;
}
.nav-previous {
float: left;
width: 50%;
}
.nav-next {
float: right;
text-align: right;
width: 50%;
}
/*--slider--*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#slider_container {
background: #fff;
}
.flex-caption{
background: #232323;
color: #fff;
padding: 7px;
}
.flexslider p{
margin: 0px;
}
/*--sub head and breadcrumbs--*/
/*////////////////////////////////////////////////////////////////////////////////////////////*/
#subhead_container{
padding: 7px 0px;
}
#subhead h1{
color: #000;
padding-top: 10px;
padding-left: 0px;
font-size: 30px;
}
#breadcrumbs {
padding-left: 25px;
margin-bottom: 15px;
color: #9e9e9e;
margin:0 auto;
width: 964px;
font-size: 10px;
}
#breadcrumbs a{
text-decoration: none;
color: #9e9e9e;
}
/*Alignments */
/*////////////////////////////////////////////////////////////////////////////////////////////*/
.alignleft,
img.alignleft {
display: inline;
float: left;
margin-right: 22px;
margin-top: 9px;
}
.alignright,
img.alignright {
display: inline;
float: right;
margin-left: 22px;
margin-top: 8px;
}
.aligncenter,
img.aligncenter {
clear: both;
display: block;
margin-left: auto;
margin-right: auto;
}
.alignleft,
.alignright,
.aligncenter,
img.alignleft,
img.alignright,
img.aligncenter
{
margin-bottom: 10px;
}
a img.aligncenter {
display:block;
margin-left:auto;
margin-right:auto;
}
table {
border-collapse:collapse;
}
table, th, td {
border: 1px solid black;
padding: 5px;
}
@@ -1 +0,0 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 152.13 43.86"><defs><style>.cls-1{fill:#dc9610;}.cls-2{fill:#fff;}.cls-3{fill:#bf4818;}</style></defs><rect class="cls-1" width="87.68" height="22.95" rx="5"/><rect class="cls-1" x="89.93" width="62.2" height="22.95" rx="5"/><path class="cls-2" d="M94.88,4.14h5.28c3.16,0,4.82.55,6.22,2.11a8.1,8.1,0,0,1,1.92,5.47,8.41,8.41,0,0,1-2,5.71c-1.35,1.42-3.08,2-6,2h-5.4Zm5.87,12.37A3.29,3.29,0,0,0,104,15a6.14,6.14,0,0,0,.77-3.24A5.94,5.94,0,0,0,104,8.62a3.09,3.09,0,0,0-3-1.54H98.39v9.43Z" transform="translate(-0.18)"/><path class="cls-2" d="M113.7,16.37l-1,3.08h-3.81l5.45-15.31h4.37l5,15.31h-4l-.84-3.08Zm2.76-8.81-1.89,6h3.53Z" transform="translate(-0.18)"/><path class="cls-2" d="M131,19.45h-3.5V7.08h-4.73V4.14h13V7.08H131Z" transform="translate(-0.18)"/><path class="cls-2" d="M139.37,16.37l-1,3.08h-3.81L140,4.14h4.37l4.95,15.31h-4l-.84-3.08Zm2.76-8.81-1.89,6h3.53Z" transform="translate(-0.18)"/><path class="cls-3" d="M10.82,43.52,6.4,35.69l-1.61-3c0,.8,0,1.38,0,1.83,0,.83,0,1.72,0,2.69v6.29H1.66V28.21H5.3l4.3,7.62c.61,1.15,1,2,1.59,3.1,0-.62,0-1,0-1.49l0-1.15V28.21h3.2V43.52Z" transform="translate(-0.18)"/><path class="cls-3" d="M29.23,31.15H21.12v3H28.2v2.71H21.12v3.74h8.25v2.94H17.61V28.21H29.23Z" transform="translate(-0.18)"/><path class="cls-3" d="M39,43.52H35.53V31.15H30.81V28.21H43.75v2.94H39Z" transform="translate(-0.18)"/><path class="cls-3" d="M49,43.52l-4.2-15.31h3.48L50,35.07c.3,1.29.47,2,.86,3.81.26-1.74.42-2.66.66-3.81L53,28.21h3.36l1.45,7c.31,1.51.47,2.34.68,3.69.14-.66.4-1.9.79-3.69l1.73-7h3.48L60.11,43.52H56.84l-1.43-6.38c-.35-1.59-.67-3.24-.77-4-.3,1.65-.49,2.64-.79,4l-1.47,6.38Z" transform="translate(-0.18)"/><path class="cls-3" d="M80.76,36c0,4.66-3.15,7.87-7.71,7.87s-7.73-3.21-7.73-8a7.92,7.92,0,0,1,2.4-6A7.73,7.73,0,0,1,73,27.87C77.72,27.87,80.76,31.06,80.76,36ZM69,35.85C69,39,70.5,41,73.05,41s4-1.91,4-5S75.6,30.78,73,30.78,69,32.68,69,35.85Z" transform="translate(-0.18)"/><path class="cls-3" d="M86.88,43.52H83.45V28.21h6.79c2,0,3.13.25,4.07.92a3.81,3.81,0,0,1,1.49,3.21A3.59,3.59,0,0,1,93.21,36c1.54.48,2.08,1.28,2.2,3.3l.11,2.18a3.24,3.24,0,0,0,.63,2H92.72c-.42-.32-.54-.55-.58-1.33L92,40.1c-.14-1.88-1-2.71-2.78-2.71H86.88Zm3.43-8.84c1.29,0,2-.64,2-1.77s-.7-1.76-2-1.76H86.88v3.53Z" transform="translate(-0.18)"/><path class="cls-3" d="M112.65,43.52h-4.21l-4.72-6.93L102.27,38v5.49H98.84V28.21h3.43v5.65l5.26-5.65h4.6l-6.07,6Z" transform="translate(-0.18)"/><path class="cls-3" d="M117.83,43.52h-3.5V28.21h3.5Z" transform="translate(-0.18)"/><path class="cls-3" d="M130.28,43.52l-4.41-7.83-1.61-3c0,.8,0,1.38,0,1.83,0,.83,0,1.72,0,2.69v6.29h-3.2V28.21h3.64l4.3,7.62c.61,1.15,1,2,1.59,3.1,0-.62,0-1,0-1.49l0-1.15V28.21h3.2V43.52Z" transform="translate(-0.18)"/><path class="cls-3" d="M151,35.05v8.47h-2.1l-.49-2c-1.08,1.65-2.41,2.29-4.67,2.29-4.42,0-7.13-3-7.13-7.89s3-8.1,7.57-8.1a6.48,6.48,0,0,1,6.71,5l-3.39.2a3.13,3.13,0,0,0-3.3-2.27c-2.52,0-4.08,1.88-4.08,5,0,3.3,1.51,5.28,4.06,5.28A3.71,3.71,0,0,0,148,37.87h-3.81V35.05Z" transform="translate(-0.18)"/><path class="cls-2" d="M14.72,19.45,10.3,11.62l-1.61-3c.05.8.05,1.38.05,1.84,0,.82,0,1.72,0,2.68v6.29H5.56V4.14H9.2l4.3,7.62c.61,1.15,1,2,1.59,3.1,0-.62,0-1,0-1.49l0-1.15V4.14h3.21V19.45Z" transform="translate(-0.18)"/><path class="cls-2" d="M24.82,16.37l-1,3.08H20L25.47,4.14h4.38L34.8,19.45h-4L30,16.37Zm2.76-8.81-1.89,6h3.52Z" transform="translate(-0.18)"/><path class="cls-2" d="M42.43,19.45,40.27,11.3c-.16-.69-.3-1.17-.39-1.49-.12-.48-.14-.57-.28-1,0,.55,0,.94,0,1.19l0,1.47v8H36.46V4.14H41.4l2,8c.31,1.19.57,2.46.75,3.47a4.72,4.72,0,0,0,.1-.49l.25-1c.05-.28.14-.62.24-1s.23-1,.23-1l2-8h4.89V19.45h-3.2v-8l0-1.47a11.79,11.79,0,0,1,.05-1.19c-.26.92-.42,1.54-.49,1.74-.14.42-.21.72-.24.74l-2.13,8.17Z" transform="translate(-0.18)"/><path class="cls-2" d="M66.81,7.08H58.7v3h7.08v2.71H58.7v3.74H67v2.94H55.19V4.14H66.81Z" transform="translate(-0.18)"/><path class="cls-2" d="M69.53,4.14h5.28c3.15,0,4.81.55,6.22,2.11a8.09,8.09,0,0,1,1.91,5.47,8.41,8.41,0,0,1-2,5.71c-1.36,1.42-3.09,2-6,2H69.53Zm5.86,12.37A3.29,3.29,0,0,0,78.59,15a6,6,0,0,0,.78-3.24,6,6,0,0,0-.75-3.16,3.11,3.11,0,0,0-3-1.54H73v9.43Z" transform="translate(-0.18)"/></svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

+11 -8
View File
@@ -1,12 +1,15 @@
[theme]
inherit = agogo
stylesheet = named_data.css
stylesheet = named_data_style.css
# pygments_style = sphinx
theme_bodyfont = "normal 12px Verdana, sans-serif"
theme_bgcolor = "#ccc"
theme_documentwidth = "100%"
theme_textalign = "left"
[options]
pagewidth = 90%
documentwidth = 70%
sidebarwidth = 20%
bgcolor = white
headerbg = none
footerbg = none
textalign = left
stickysidebar = true
collapsiblesidebar = true
+70
View File
@@ -0,0 +1,70 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
# Based on http://doughellmann.com/2010/05/09/defining-custom-roles-in-sphinx.html
"""Integration of Sphinx with Redmine.
"""
from docutils import nodes, utils
from docutils.parsers.rst.roles import set_classes
def redmine_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
"""Link to a Redmine issue.
Returns 2 part tuple containing list of nodes to insert into the
document and a list of system messages. Both are allowed to be
empty.
:param name: The role name used in the document.
:param rawtext: The entire markup snippet, with role.
:param text: The text marked with the role.
:param lineno: The line number where rawtext appears in the input.
:param inliner: The inliner instance that called us.
:param options: Directive options for customization.
:param content: The directive content for customization.
"""
try:
issue_num = int(text)
if issue_num <= 0:
raise ValueError
except ValueError:
msg = inliner.reporter.error(
'Redmine issue number must be a number greater than or equal to 1; '
'"%s" is invalid.' % text, line=lineno)
prb = inliner.problematic(rawtext, rawtext, msg)
return [prb], [msg]
app = inliner.document.settings.env.app
node = make_link_node(rawtext, app, 'issues', str(issue_num), options)
return [node], []
def make_link_node(rawtext, app, type, slug, options):
"""Create a link to a Redmine resource.
:param rawtext: Text being replaced with link node.
:param app: Sphinx application context
:param type: Link type (issue, changeset, etc.)
:param slug: ID of the thing to link to
:param options: Options dictionary passed to role func.
"""
#
try:
base = app.config.redmine_project_url
if not base:
raise AttributeError
except AttributeError, err:
raise ValueError('redmine_project_url configuration value is not set (%s)' % str(err))
#
slash = '/' if base[-1] != '/' else ''
ref = base + slash + type + '/' + slug + '/'
set_classes(options)
node = nodes.reference(rawtext, 'Issue #' + utils.unescape(slug), refuri=ref,
**options)
return node
def setup(app):
"""Install the plugin.
:param app: Sphinx application context.
"""
app.add_role('issue', redmine_role)
app.add_config_value('redmine_project_url', None, 'env')
return
-4
View File
@@ -1,4 +0,0 @@
Release Notes
=============
.. include:: release-notes/release-notes-0.8.1.rst
@@ -1,88 +0,0 @@
ndn-cxx version 0.1.0
---------------------
Release date: May 7, 2014
Version 0.1.0 is the initial release of ndn-cxx, an NDN C++ library with eXperimental
eXtensions.
Originally based on `ndn-cpp library <https://github.com/named-data/ndn-cpp>`_ the ndn-cxx
library adopts a slightly different design philosophy (including an extensive use of Boost
libraries to facilitate development, as well as the use of Crypto++ library to support
cryptographic operations), and includes a number of extensions that aim to simplify NDN
application development.
The current features include:
- **Base**
+ Fully asynchronous, event-driven communication model, which is implemented using `Boost.Asio
<https://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html>`_
+ Single-threaded, but thread-safe Face operations
A single Face object can be safely used in multiple threads to express Interests and
publish Data packets
+ Explicit time management for NDN operations using `Boost.Chrono
<https://www.boost.org/doc/libs/1_48_0/doc/html/chrono.html>`_
+ Simplified and extended `NDN API <doxygen/annotated.html>`_
+ Extensive set of unit-tests based on `Boost.Test framework
<https://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/index.html>`_
- Continuous integration using an in-house installation of Jenkins build bots and the
hosted `Travis CI <https://travis-ci.org/named-data/ndn-cxx>`_ continuous
integration service compile and verify correctness of the library for each commit
- **Wire format**
+ Full support of `NDN-TLV packet format v0.1 <https://docs.named-data.net/NDN-packet-spec/0.1/>`__
+ Pure C++ implementation of wire encoding/decoding with simple access to wire format
of all NDN packet abstractions via ``wireEncode`` and ``wireDecode`` methods
In many cases, NDN packet abstractions are just "indices" to the wire format
- **Communication with the forwarder**
+ Enable connecting to local forwarder via UNIX and TCP transports and to remote
forwarders using TCP transport
+ Full support for communication with `Named Data Networking Forwarding Daemon (NFD)
<https://github.com/named-data/NFD>`_
- Full support for `NFD management protocols
<https://redmine.named-data.net/projects/nfd/wiki/Management>`_ to NFD status
information, create and manage NFD Faces, receive NFD Face status change
notifications, update StrategyChoice for namespaces, and manage routes in RIB
- Support for `LocalControlHeader
<https://redmine.named-data.net/projects/nfd/wiki/LocalControlHeader>`_ to implement
special NDN applications that need low-level control of NDN packet forwarding
- **Security support**
+ A set of security primitives to allowing implementation of secure NDN applications in
a simplified manner
- **KeyChain**: provides simple interfaces of packet signing, and key and certificate
management
- **ValidatorConfig**: validator that implements trust model defined in a configuration
file
- **CommandInterestGenerator** and **CommandInterestValidator**: convenient helpers to produce
and validate command interests, while preventing potential replay attacks
+ Several implementations of trusted platform modules to securely manage private keys
- **SecTpmOsx**: TPM based on OSX KeyChain (OSX-specific)
- **SecTpmFile**: TPM that uses file-based access control to protect keys (cross-platform)
+ Extensive set of security command-line tools to manage security identities and certificates
- Generating private/public keys
- Issuing certificates
- Exporting/importing identities
- Managing default security settings
- **Miscellaneous tools**
+ Scheduler to support delayed time operations
+ NDN regular expressions
+ Simple config file to alter various aspects of the library
+ **tlvdump**: a simple tool to visualize TLV-encoded blocks
-174
View File
@@ -1,174 +0,0 @@
ndn-cxx version 0.2.0
---------------------
Release date: August 25, 2014
Changes since version 0.1.0:
New features
^^^^^^^^^^^^
- **Base**
+ The license under which the library is released is changed to the **GNU Lesser
General Public License version 3.0**
+ New ways to use incoming Interest dispatching:
* New :ndn-cxx:`InterestFilter` abstraction that supports filtering based on name
prefixes and regular expressions.
* Separate ``Face::registerPrefix()`` and ``Face::setInterestFilter()`` methods
allow distinct operations of registering with the local NDN forwarder and setting
up application-specific ``OnInterest`` call dispatch using InterestFilters.
+ Add support for the `NDN naming conventions (revision 1)
<https://named-data.net/publications/techreports/ndn-tr-22-ndn-memo-naming-conventions/>`_
(:issue:`1761`)
- **Security**
+ Add ``type dir`` :ref:`trust-anchor in ValidatorConfig <validator-conf-trust-anchors>`
to add all certificates under the specified directory as trust anchors.
The new option also allow periodic reloading trust anchors, allowing dynamic trust
models.
+ Added support for multiple signature types to ``PublicKey``, ``SecPublicInfo`` abstractions
+ New :ndn-cxx:`SignatureSha256WithEcdsa` signature type
+ Updates in ``Signature`` data structure to reflect changes in the `NDN-TLV spec v0.1.1
<https://docs.named-data.net/NDN-packet-spec/0.1.1/>`__
- **Wire encoding**
+ :ndn-cxx:`Data::getFullName` method to get the Data packet name including the implicit digest
+ :ndn-cxx:`Name::getSuccessor` method to get name successor (:issue:`1677`)
+ New in-wire refreshing of Interest's nonce (:issue:`1758`)
- **Management**
+ Support for :ndn-cxx:`ChannelStatus` and :ndn-cxx:`StrategyChoice` datasets
+ Defining new common Route Origins for NFD RIB management protocol (:issue:`1719`)
+ New ``RibEntry`` and ``Route`` data structures for RIB management protocol (:issue:`1764`)
+ Add support for RIB flags in ``setInterestFilter()`` and ``registerPrefix()`` (:issue:`1842`)
- **Miscellaneous tools**
+ Introduce :ndn-cxx:`Scheduler::cancelAllEvents` to cancel all previously scheduled events
(:issue:`1757`)
+ Introduce ``util::EventEmitter``, :ndn-cxx:`util::NotificationSubscriber`,
:ndn-cxx:`util::NotificationStream`, and :ndn-cxx:`nfd::FaceMonitor` utility classes
+ Introduce :ndn-cxx:`SegmentFetcher` helper class to fetch multi-segmented data
(:issue:`1879`)
- **Build**
+ Enabled support of precompiled headers for clang and gcc compilers to speed up compilation
Updates and bug fixes
^^^^^^^^^^^^^^^^^^^^^
- **Base**
+ Serialization of socket write operations (:issue:`1769`)
+ Enforcing limit on Interest and Data packet size in :ndn-cxx:`Face::expressInterest` and
:ndn-cxx:`Face::put` methods (:issue:`1774`)
+ Cleaning up transport state on communication failure, so Face can try to reconnect
in the future
+ Fix bug in ``Face::removePendingInterest()`` (:issue:`1917`)
- **Wire encoding**
+ The Nonce field is now encoded as a 4-byte value, as defined by NDN-TLV spec
+ Optimized Data packet signing
:ndn-cxx:`KeyChain::sign` method now pre-allocates :ndn-cxx:`EncodingBuffer`, requests
unsigned portion of :ndn-cxx:`Data` using ``Data::wireEncode(EncodingBuffer, true)``,
and then appends the resulting signature and prepends :ndn-cxx:`Data` packet header.
This way there is no extra memory allocation after :ndn-cxx:`Data` packet is signed.
+ Optimized implicit digest calculation in :ndn-cxx:`Interest::matchesData` method
(:issue:`1769`)
- **Management**
+ Add link-layer byte counts in ``FaceStatus`` data structure (:issue:`1765`)
- **Security**
+ Allow user to explicitly specify the cert name prefix before 'KEY' component in
``ndnsec-certgen``
+ ``SignatureSha256`` has been renamed to :ndn-cxx:`DigestSha256` to conform to the
`NDN-TLV specification <https://docs.named-data.net/NDN-packet-spec/0.1.1/>`__
+ Add checking of Timestamp and Nonce fields in signed Interest within
:ndn-cxx:`ValidatorConfig`
+ Allow validator customization using hooks.
Sub-classes of :ndn-cxx:`Validator` class can use the following hooks to fine-tune the
validation process:
* ``preCertificateValidation`` to process received certificate before validation
* ``onTimeout`` to process interest timeout
* ``afterCheckPolicy`` to process validation requests
+ Fix memory issues in ``SecPublicInfoSqlite3``
- **Miscellaneous tools**
+ Redefine method for random number generation: ``random::generateWord*`` and
``random::generateSecureWord*`` to generate cryptographically non-secure (fast) and
secure (slow) random numbers.
- Other minor fixes and corrections
Deprecated
^^^^^^^^^^
- ``SignatureSha256`` class, use :ndn-cxx:`DigestSha256` instead.
- All :ndn-cxx:`Face` constructors that accept ``shared_ptr<io_service>``.
Use versions that accept reference to ``io_service`` object.
- ``Face::ioService`` method, use ``Face::getIoService`` instead.
- :ndn-cxx:`Interest` constructor that accepts name, individual selectors, and individual
guiders as constructor parameters.
Use ``Interest().setX(...).setY(...)`` or use the overload taking ``Selectors``
- ``name::Component::toEscapedString`` method, use :ndn-cxx:`name::Component::toUri` instead.
- ``SecPublicInfo::addPublicKey`` method, use ``SecPublicInfo::addKey`` instead.
- ``Tlv::ConentType`` constant (typo), use ``Tlv::ContentType`` instead.
- ``CommandInterestGenerator`` and ``CommandInterestValidator`` utility classes.
:ndn-cxx:`ValidatorConfig` should be used instead.
Removed
^^^^^^^
- Support for ndnd-tlv (only NFD management protocol is supported now)
- ``SecPublicInfoMemory`` and ``SecTpmMemory`` classes that were no longer used
- Removing concept of periodic event from :ndn-cxx:`Scheduler`.
In applications, periodic events should be just re-scheduled within the callback for
single-shot events.
-241
View File
@@ -1,241 +0,0 @@
ndn-cxx version 0.3.0
---------------------
Release date: February 2, 2015
Changes since version 0.2.0:
New features
^^^^^^^^^^^^
- **Build**
+ The code now requires C++11. The minimum supported gcc version is 4.6, as earlier versions
do not have proper support for C++11 features.
- **Base**
+ Enable detailed version information when built from shallow clone or tarball
(:issue:`1915`)
+ Make default transport configurable (:issue:`2189`)
+ Add ability to do partial Name comparison (:issue:`2090`)
- **Security**
+ Add support for KeyDigest key locator (:issue:`1426`)
+ Add a method to get KeyDigest from a PublicKey instance (:issue:`1964`)
+ Add support for KeyChain to sign Interest using SHA256 digest (:issue:`2218`)
+ Add ``ndnsec-dsk-gen`` tool to generate a pair of Data-Signing-Key (DSK) for the specified
identity (:issue:`2246`)
+ Pair-up PIB and TPM in KeyChain: PIB remembers the last used TPM type/location, which is
used during KeyChain construction (unless overriden) (:issue:`2242`)
- **Wire encoding**
+ Add support for application-defined meta information blocks (:issue:`2021`)
+ Introduce new ``name::Component::is*`` methods to allow checking if the name component
follows the specific naming convention without relying on the exception handling
(:issue:`2088`)
+ Add definition of producer-generated NACK (:issue:`2111`)
+ Add ``std::hash<Name>`` specialization to support ``unordered_map`` container
(:issue:`2147`)
+ Add support for ImplicitSha256DigestComponent (:issue:`1640`)
+ Allow tagging Interest and Data packets with arbitrary information (:issue:`2336`)
- **Management**
+ Support NFD face query operation (:issue:`2085`)
- **Miscellaneous tools**
+ Add a new helper to calculate digests over dynamic inputs (:issue:`1934`)
+ Add DNS resolver helper (:issue:`1918`)
+ Import and re-license Ethernet and FaceUri classes from NFD codebase, add FaceUri
canonization support for ``udp``, ``tcp``, and ``ether`` schemas (:issue:`1994`)
+ Add per-application in-memory storage with LRU, LFU, and FIFO replacement policies
(:issue:`1940`)
+ Add ability to specialize system and steady clocks (e.g., for unit tests and simulation
purposes) (:issue:`2158`)
+ Expose DummyClientFace as public API
+ New IndentedStream helper class to simplify writing to streams with the specified indents
or prefixes (:issue:`2238`)
+ New Signal class template as an enhanced version of the deprecated EventEmitter
(:issue:`2279`)
+ New scheduler::ScopedEventId helper to automatically cancel scheduled events upon
destruction (:issue:`2442`)
+ New NetworkMonitor helper to detect network state changes (:issue:`2443`)
Updates and bug fixes
^^^^^^^^^^^^^^^^^^^^^
- **Base**
+ Prevent flags being set for rib/unregister command (:issue:`1945`)
+ Fix segfault caused by Face::unregisterPrefix when registeredPrefixId does not exist
+ Add explicit internal KeyChain to Face class. KeyChain previously existed in the Face as
part of NFD controller class. (:issue:`2039`)
+ Properly disable assertions in release builds (:issue:`2135`)
+ Connect to Transport during construction of Face instance (:issue:`2318`)
- **Wire encoding**
+ Fix segfault when decoding empty Exclude element (:issue:`1970`)
+ Provide EqualityComparable concept for Exclude element
+ Correct Marker in Name::appendVersion() (:issue:`2086`)
+ Ensure that wire-encoding errors are inherited from ``tlv::Error`` (:issue:`1983`)
- **Management**
+ Replace FaceFlags with individual fields in face management data structures (:issue:`1992`)
+ ``ndn::nfd::Controller`` extended to allow generating ControlCommand for remote prefix
registration (:issue:`2039`)
+ Change ``ForwarderStatus.NfdVersion`` to string (:issue:`2003`)
- **Security**
+ Fix ``ndnsec-cert-gen`` to correctly infer prefix before KEY component (:issue:`2052`)
+ Help message corrections in ``ndnsec-cert-dump``, ``ndnsec-cert-gen``, and
``ndnsec-key-gen`` (:issue:`2052`)
+ Accept ``--sign-id`` and ``--cert-prefix`` in ``ndnsec-cert-revoke`` (:issue:`2058`)
+ Changes output format of ``ndnsec-cert-revoke`` to base64 encoding (:issue:`2059`)
+ Add a new (safer) option to ``ndnsec-cert-gen`` allowing inclusion of additional
information blocks into the certificate. The new ``--signed-info`` parameter makes minimum
assumptions, treating text before first space as OID and the rest as the associated string
with this OID.
+ Make Face optional in Validator class (:issue:`2124`)
+ Display signature information when printing a certificate (:issue:`2196`)
+ Handle certificate decoding error in validation process (:issue:`2212`)
+ Fix segmentation fault in ``ndnsec-sign-req`` (:issue:`2211`)
+ Allow verbose option in ``ndnsec-list`` (:issue:`2197`)
+ Allow generation of DSK using ``ndnsec-key-gen`` (:issue:`2247`)
+ Allow ``ndnsec-key-gen`` to generate ECDSA keys (:issue:`2248`)
+ Fix memory leak in SecPublicInfoSqlite3 (:issue:`2253`)
+ Properly report status of ``ndnsec-delete`` execution (:issue:`2275`)
- **Miscellaneous tools**
+ Fix incorrect tag map in ``tlvdump`` tool
+ Change to default resolver behavior in util::dns::Resolver (:issue:`2415`)
- **Documentation**
+ Update of tutorials and installation instructions
+ Rename manpage of ``client.conf`` to ``ndn-client.conf`` (:issue:`1967`)
+ Updated and extended ndn-cxx code style:
- add rules for some C++11 constructs
- prefer ``BOOST_ASSERT`` and ``static_assert``
+ Improve example applications (:issue:`1976`)
- **Tests**
+ Improve security unit test cases (:issue:`1683`)
+ Embedding CI build and test running scripts into the repository
+ Partial unit test coverage for Face class (previously covered only by integration tests)
(:issue:`1947`)
+ Improve stability of unit tests by using UnitTestTime (wall clock independent time)
(:issue:`2152`)
- **Build**
+ Redesign the way default compiler flags are determined (:issue:`2209`)
+ Support tools and examples with multiple translation units (:issue:`2344`)
+ Disable installation of internal headers and headers of the disabled components
(:issue:`2266`, and :issue:`2269`)
+ Enable conditional compilation based on presence of ``getpass()`` function
- Other minor fixes and corrections
Deprecated
^^^^^^^^^^
- ``ndn::ptr_lib`` and ``ndn::func_lib`` namespace aliases
- The following ``nfd::Controller`` methods:
+ ``Controller::start`` overloads, except the overload taking ``CommandOptions``
+ ``Controller::Sign`` typedef
+ ``Controller::getDefaultCommandTimeout``
+ ``ControlCommand::getPrefix``
+ ``ControlCommand::getRequestName(ControlParameters)``
+ ``Controller::Controller(Face&)``
- ``MetaInfo::TYPE_*`` constants
- ``EventEmitter`` is deprecated in favor of ``Signal``
Removed
^^^^^^^
- FaceFlags APIs (:issue:`1992`)
- ``ControlCommand::makeCommandInterest`` (:issue:`2008`)
- namespace ``ndn::Tlv`` (:issue:`2079`)
- ``shared_ptr<io_service>`` constructor and getter in Face class
- ``tlv::ConentType`` (typo in the name)
- ``Selectors::Selectors(int, int, Exclude, int, bool)`` constructor
- ``Interest::Interest(Name, int, int, Exclude, int, bool, int, time::milliseconds, uint32_t)``
constructor
- ``signature-sha256.hpp`` file
- unused ``encryption-manager.hpp`` file
- unused ``openssl`` dependency
@@ -1,61 +0,0 @@
ndn-cxx version 0.3.1
---------------------
Release date: March 3, 2015
Changes since version 0.3.0:
New features
^^^^^^^^^^^^
- **Management**
- Add isConnected() in :ndn-cxx:`signal::Connection` and :ndn-cxx:`signal::ScopedConnection`
(:issue:`2308`)
- Extend :ndn-cxx:`DummyClientFace` to process ``LocalControlHeader`` (:issue:`2510`)
- Add CachingPolicy to ``LocalControlHeader`` (:issue:`2183`)
Updates and bug fixes
^^^^^^^^^^^^^^^^^^^^^
- **Wire encoding**
- Refactoring of :ndn-cxx:`EncodingImpl` class template (``EncodingBuffer`` and
``EncodingEstimator``) (:issue:`2494`, :issue:`2490`)
- Change :ndn-cxx:`Block::fromBuffer` return type (:issue:`2553`)
- **Miscellaneous tools**
- Mark ``Digest<Hash>::operator==`` as unsuitable in a security sensitive context
(:issue:`2395`)
- Restrict destruction of Signal from handler (:issue:`2313`)
- **Documentation**
- Correct function names in security library tutorial (:issue:`2474`)
- Remind users to reinstall ports after OSX upgrade (:issue:`2284`)
- **Tests**
- Fix global buffer overflow in ``ImplicitSha256Digest`` test case (:issue:`2307`)
- Change naming conventions for unit test files and test suite names (:issue:`2497`)
- **Build**
- Explicitly define ``_GLIBCXX_USE_NANOSLEEP``, necessary for gcc < 4.8 in some environments
(:issue:`2499`)
Removed
^^^^^^^
- Delete deprecated ``Block(std::istream&)`` constructor (:issue:`2241`)
- Delete deprecated ``ndn::ptr_lib``, ``ndn::func_lib`` (:issue:`2110`)
- Delete deprecated ``MetaInfo::TYPE_*`` (:issue:`2170`)
@@ -1,53 +0,0 @@
ndn-cxx version 0.3.2
---------------------
Release date: May 12, 2015
Changes since version 0.3.1:
New features
^^^^^^^^^^^^
- Add Link abstraction (:issue:`2587`)
- Add Link and SelectedDelegation fields to the Interest abstraction (:issue:`2587`)
- Initial implementation of several components for the upcoming PIB feature (:issue:`2451`):
* User-facing PIB implementation and implementation-specific PIB interface
* In-memory PIB implementation
* Define new abstraction for identity, key, and certificate
Updates and bug fixes
^^^^^^^^^^^^^^^^^^^^^
- Enable decoding Exclude containing ImplicitSha256DigestComponent (:issue:`2629`)
- Update waf build system to version 1.8.9 (:issue:`2209`, :issue:`2657`, :issue:`2792`)
- Avoid duplicating output in IndentedStream (:issue:`2723`)
- Fix skipping empty name component `(...)` during URI decoding (:issue:`2725`)
- Enable ability to exclude empty name component (:issue:`2660`)
- Fix bug with TLV-LENGTH processing in `Block::fromStream` (:issue:`2728`, :issue:`2729`)
- Disable precompiled headers on OS X with clang < 6.1.0 (:issue:`2804`)
Deprecated
^^^^^^^^^^
- `Block::fromBuffer` overloads with output parameter (:issue:`2553`)
Removed
^^^^^^^
- Delete deprecated Controller functions:
* `Controller::start` overloads, except the overload taking CommandOptions
* `Controller::Sign` typedef
* `Controller::getDefaultCommandTimeout`
* `ControlCommand::getPrefix`
* `ControlCommand::getRequestName(ControlParameters)`
* `Controller::Controller(Face&)`
-128
View File
@@ -1,128 +0,0 @@
ndn-cxx version 0.3.3
---------------------
Release date: July 1, 2015
Changes since version 0.3.2:
New features
^^^^^^^^^^^^
- Allow compilation of ndn-cxx as a shared library (:issue:`2243`)
In this release, by default, only a static library is compiled. The next release will change
the default behavior to compile only a shared library.
- Introduce concept of PartialName (:issue:`1962`)
Semantically, PartialName abstraction represents an arbitrary sequence of name components,
while Name represents an absolute name. Currently, PartialName is typedef alias to Name, but
it can be changed in the future releases.
- Introduce generalized signing API in KeyChain (:issue:`2871`, :issue:`1705`)
A new API in KeyChain introduces a general interface to sign interest and data packets and
supply necessary signing information, such as signing identity name, signing key name, or
signing certificate name. In addition, the supplied signing information can include additional
information that signer wants to include in the SignatureInfo of the signed packet.
- Introduce helpers to create SigningInfo for the generalized signing API (:issue:`2922`)
- Sqlite3Statement utility helper that wraps an SQLite3 statements and provide automatic memory
cleanup
- Introduce PibSqlite3 based on PibImpl (:issue:`2807`)
- Make public interface of Pib, Identity, and Key as read-only (:issue:`2928`)
- New encoding block helpers to simplify operations with ``std::string`` (:issue:`2951`):
* ``prependStringBlock``
* ``makeStringBlock``
* ``readString``
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Use C++11 lambda expression and smart pointers in Face implementation (:issue:`2112`)
- Fix compilation failure on OS X 10.10 with cryptopp from MacPorts
- Update client.conf manpage
- Change Name::compare to return negative, zero, or positive integer (instead of strictly -1,
0, 1) when the first name comes before the other in canonical ordering, is equal, or comes
after (:issue:`2445`)
- IdentityCertificate sets default FreshnessPeriod to 1 hour (:issue:`2872`)
- Unify TPM creation (:issue:`2722`)
- Allow negative start index in Name::getSubName method (:issue:`1962`)
- Improved documentation of PibImpl interfaces (:issue:`2896`, :issue:`2898`)
- Simplify CommandOptions with SigningInfo (:issue:`2893`)
- Refactor internal PIT to use scheduled events (:issue:`1372`, :issue:`2518`)
- Improve structure and documentation of block helpers (:issue:`2951`)
- Declare all move constructors as ``noexcept`` to ensure move operations are used even when a
restrictive move operation (`move_if_noexcept`) is used (e.g., in STL library's containers)
(:issue:`2966`)
Deprecated
^^^^^^^^^^
- The following ``KeyChain::sign*`` methods, in favor of generalized ``KeyChain::sign(..., SigningInfo)``
* ``KeyChain::sign(Packet, Name)``
* ``KeyChain::sign(uint8_t*, size_t, Name)``
* ``KeyChain::signByIdentity(Packet, Name)``
* ``KeyChain::signByIdentity(uint8_t*, size_t, Name)``
* ``KeyChain::signWithSha256(Data)``
* ``KeyChain::signWithSha256(Interest)``
- The following encoding block helper functions:
* ``nonNegativeIntegerBlock`` (use ``makeNonNegativeIntegerBlock``)
* ``prependBooleanBlock`` (use ``prependEmptyBlock``)
* ``booleanBlock`` (use ``makeEmptyBlock``)
* ``dataBlock`` (use ``makeBinaryBlock``)
* ``nestedBlock`` (use ``makeNestedBlock``)
- The following methods of ``CommandOptions`` class, use ``setSigningInfo()`` instead (:issue:`2893`):
* ``CommandOptions::getSigningParamsKind``
* ``CommandOptions::getSigningIdentity``
* ``CommandOptions::getSigningCertificate``
* ``CommandOptions::setSigningDefault``
* ``CommandOptions::setSigningIdentity``
* ``CommandOptions::setSigningCertificate``
Removed
^^^^^^^
- Remove SCOPE from Interests and all references to it in the related code (:issue:`2345`)
- Direct FIB management in Face class (:issue:`2533`).
``Face::register`` and ``Face::setInterestFilter`` methods now only support NFD RIB management
protocol.
For special needs, FIB management can be implemented using ``nfd::Controller``
(``start<FibAddNextHopCommand>`` and ``start<FibRemoveNextHopCommand>``).
Upcoming features (partially finished in development branches)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- NDNLPv2 (https://redmine.named-data.net/projects/nfd/wiki/NDNLPv2, :issue:`2520`,
:issue:`2879`, :issue:`2763`, :issue:`2883`, :issue:`2841`, :issue:`2866`)
- New NDN certificate format (:issue:`2861`, :issue:`2868`)
- NDN trust schema as a description of application trust model, which can help automate data
and interest packet signing and authentication (:issue:`2829`)
- Refactored KeyChain abstraction (:issue:`2926`)
@@ -1,72 +0,0 @@
ndn-cxx version 0.3.4
---------------------
Release date: August 31, 2015
Changes since version 0.3.3:
New features
^^^^^^^^^^^^
- By default, library is now compiled as a shared library (:issue:`2867`)
- Specification for the new NDN certificate format. The reference implementation is being
developed and will be merged in a future release. (:issue:`2861`)
- Add new ValidityPeriod abstraction into SignatureInfo (:issue:`2868`)
- Add new optional AdditionalInfo abstraction for SignatureInfo (:issue:`3058`)
- Implementation of basic NDNLP2 abstractions (:issue:`2875`, :issue:`2878`,
:issue:`2963`, :issue:`2879`)
- ``Face::registerPrefix`` and ``Face::setInterestFilter`` are now unified with the use
of SigningInfo abstraction (:issue:`2932`)
- New Dispatcher class to simplify server-side implementation of NFD management protocol
(:issue:`2107`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Fix compilation error with Boost 1.59 (:issue:`3128`)
- Enhance exception throwing with Boost Exception library (:issue:`2997`)
- Improvements of string helpers (:issue:`3006`)
- Add API in ``Block`` class to add sub-elements (:issue:`2998`)
- Add constructor to create sub-elements using the underlying buffer (:issue:`3100`)
- Fix bug in ``Block::remove``, so it removes all sub-elements of the specified type
(:issue:`2998`)
- Add ability to create ``util::Digest`` object from ``std::istream&`` (:issue:`3022`)
Deprecated
^^^^^^^^^^
- The following methods of ``CommandOptions`` class in favor of ``getSigningInfo`` and
``setSigningInfo`` methods (:issue:`2893`):
* ``getSigningParamsKind``
* ``getSigningIdentity``
* ``getSigningCertificate``
* ``setSigningDefault``
* ``setSigningIdentity``
* ``setSigningCertificate``
* ``setSigningCertificate``
- Overloads of ``Face::registerPrefix`` and ``Face::setInterestFilter`` that do not accept
SigningInfo parameter (:issue:`2932`)
Upcoming features (partially implemented in development branches)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Introduce new API to simplify security transformations (:issue:`3009`)
- NDN trust schema as a description of application trust model, which can help automate data
and interest packet signing and authentication (:issue:`2829`)
- Refactored KeyChain abstraction (:issue:`2926`)
@@ -1,77 +0,0 @@
ndn-cxx version 0.4.0
---------------------
Release date: December 31, 2015
.. note::
Version 0.4.0 introduces several breaking changes to API and wire format of management protocols
Changes since version 0.3.4:
New features
^^^^^^^^^^^^
- **(breaking change)** LocalControlHeader for special signaling between application and NFD has
been replaced with NDNLPv2 signaling (:issue:`2879`, :issue:`2930`)
- NDNLPv2 Network NACK support in Face abstraction (:issue:`2930`)
- **(breaking change)** FacePersistency field added to API and wire format of ControlParameters abstraction (:issue:`2991`)
- **(breaking change)** NACK counters added to ForwarderStatus and FaceStatus datasets (:issue:`3174`)
- Backport C++14 ``std::make_unique`` (:issue:`3093`)
- Emulate ``std::to_string`` on platforms that do not provide it (:issue:`2743`)
- New API in Face class to remove all pending Interests (:issue:`3300`)
- Ability to choose signing parameters (a specific certificate, the default certificate for
a key, or the default certificate for the default key) using a specially URI string
(:issue:`3281`)
- Ability to create Face with custom IO service and default transport (:issue:`2500`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- **(breaking change)** SegmentFetcher helper changed to use asynchronous data validation (:issue:`2734`)
- Support Interest Nack in nfd::Controller (:issue:`3264`)
- Fix bug causing failure of Face if there is a large delay between construction of Face and calling processEvents
(:issue:`2742`, :issue:`2526`)
- Cache Link object after the first call to getLink (:issue:`3158`)
- Minor documentation updates (:issue:`3207`, :issue:`3210`, :issue:`3221`)
Deprecated
^^^^^^^^^^
- Overloads of ``Face::registerPrefix`` and ``Face::setInterestFilter`` that do not accept
SigningInfo parameter (:issue:`2932`)
- tlvdump tool (:issue:`3196`). Use ``ndn-dissect`` program from ndn-tools repository
`<https://github.com/named-data/ndn-tools>`__
- ndn::util::makeDummyClientFace, use ndn::util::DummyClientFace constructors directly
(:issue:`3146`)
- ndn::util::DummyClientFace::sentDatas, use ndn::util::DummyClientFace.sentData instead
(:issue:`3146`)
Removed
^^^^^^^
- Deprecated EventEmitter class (:issue:`2351`)
Planned features for future releases
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Introduce new API to simplify security transformations (:issue:`3009`)
- NDN trust schema as a description of application trust model, which can help automate data
and interest packet signing and authentication (:issue:`2829`)
- Refactored KeyChain abstraction (:issue:`2926`)
@@ -1,32 +0,0 @@
ndn-cxx version 0.4.1
---------------------
Release date: March 25, 2016
Changes since version 0.4.0:
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Improved support for ECDSA signatures (:issue:`3438`, :issue:`3439`)
- Support for MustBeFresh selector processing in InMemoryStorage (:issue:`3274`)
- Use InMemoryStorage for StatusDataset and Notification produced by managers based on
Dispatcher class (:issue:`2182`)
Removed
^^^^^^^
- Deprecated ``tlvdump`` command-line tool (use ``ndn-dissect`` tool from `NDN Essential Tools
<https://github.com/named-data/ndn-tools>`__ instead
Planned features for future releases
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Introduce new API to simplify security transformations (:issue:`3009`)
- NDN trust schema as a description of application trust model, which can help automate data
and interest packet signing and authentication (:issue:`2829`)
- Refactored KeyChain abstraction (:issue:`2926`)
-152
View File
@@ -1,152 +0,0 @@
ndn-cxx version 0.5.0
---------------------
Release date: October 4, 2016
.. note::
As of version 0.5.0, ndn-cxx requires a modern compiler (gcc >= 4.8.2, clang >= 3.4) and a
relatively new version of Boost libraries (>= 1.54). This means that the code no longer compiles
with the packaged version of gcc and boost libraries on Ubuntu 12.04. ndn-cxx can still be
compiled on such systems, but requires separate installation of a newer version of the compiler
(e.g., clang-3.4) and dependencies.
.. note::
The library now has a dependency on OpenSSL >= 1.0.1
Changes since version 0.4.1:
New features
^^^^^^^^^^^^
- New transformation API (:issue:`3009`)
* base64 and hex encoding/decoding
* digest calculation (SHA256)
* HMAC calculation
* block cipher operations (AES in CBC mode)
* public key signing/verification
- Introduce environment variables to set/override transport, pib, and tpm configurations
(:issue:`2925`, :issue:`2514`)
* ``NDN_CLIENT_TRANSPORT``: equivalent of transport in client.conf
* ``NDN_CLIENT_PIB``: equivalent of pib in client.conf
* ``NDN_CLIENT_TPM``: equivalent of tpm in client.conf
Whenever an environment variable is set, it takes precedence over any values specified in the
configuration file.
- Introduce logging facility based on Boost.Log (:issue:`3562`)
The logging can be enabled on selected moduled at the selected log level through ``NDN_LOG``
environment variable. For example,
::
export NDN_LOG=ndn.mgmt.Dispatcher=TRACE
- Introduce ``Name::deepCopy`` to allow memory optimizations when working with ``Name`` objects
(:issue:`3618`)
- New ``ndn::security::CommandInterestValidator`` class (:issue:`2376`)
- Add ``StatusDataset`` client functionality into ``ndn::nfd::Controller`` (:issue:`3329`)
- New ``FaceUpdateCommand`` structure for NFD management protocols (:issue:`3232`)
- **breaking change** Add Flags and Mask fields to faces/create and faces/update, add Flags field to
FaceStatus (:issue:`3731`, :issue:`3732`)
- New ``SafeBag`` structure for private key export/import (:issue:`3048`)
- ``ndn::io::loadBlock`` and ``saveBlock`` (:issue:`3741`)
- Backport of C++17 ``std::clamp`` and ``std::optional`` (:issue:`3636`, :issue:`3753`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- **breaking change** Expose ``ControlResponse`` as part of ``Controller::CommandFailCallback``
(:issue:`3739`)
- **breaking change** Change security constants to corresponding strongly typed enumerations
(:issue:`3083`)
- Fix ``SegmentFetcher`` restarting from segment 0 upon Nack (:issue:`3554`)
- Fix support for ``ImplicitSha256Digest`` name component in ``Exclude`` selector
(:issue:`3665`)
- Enable ``KeyChain`` customization in ``DummyClientFace`` (:issue:`3435`)
- Make ``ValidatorConfig`` to evaluate all checkers inside a rule (:issue:`3645`)
- Add validation of ``StatusDataset`` and ``ControlCommand`` responses in
``ndn::nfd::Controller`` (:issue:`3653`)
- Enable handling of NACKs in Validator and NotificationSubscriber classes (:issue:`3332`,
:issue:`3662`)
- Several fixes in ``Scheduler`` class (:issue:`3722`, :issue:`3691`)
- Add option to override ``processEvents`` method in ``DummyClientFace`` class (:issue:`3769`)
- Several other improvements, including fixes of potential segmentation faults and memory leaks
(:issue:`3136`, :issue:`3248`, :issue:`3723`, :issue:`3727`)
Deprecated
^^^^^^^^^^
- Constant ``io::BASE_64``, use ``io::BASE64`` instead (:issue:`3741`)
- Headers ``management/nfd-*``, use ``mgmt/nfd/*`` instead (:issue:`3760`)
- ``ndn::crypto::sha256`` in favor of ``ndn::crypto::computeSha256Digest``
- ``security/cryptopp.hpp`` header. Use ``security/v1/cryptopp.hpp`` when needed, avoid direct
include as CryptoPP dependency will be removed from future versions of the library.
- ``security/identity-certificate.hpp`` header. Use ``security/v1/identity-certificate.hpp`` instead.
- ``ndn::PublicKey``, ``ndn::Certificate``, ``ndn::IdentityCertificate``,
``ndn::CertificateExtension``, ``ndn::CertificateSubjectDescription``. When necessary, use
``security::v1::PublicKey``, ``security::v1::Certificate``, ``security::v1::IdentityCertificate``,
``security::v1::CertificateExtension``, ``security::v1::CertificateSubjectDescription`` instead.
The next release will feature `a new version of the NDN Certificate format
<https://docs.named-data.net/NDN-packet-spec/0.3/certificate.html>`__.
Removed
^^^^^^^
- Previously deprecated LocalControlHeader (:issue:`3755`)
- Previously deprecated ``makeDummyClientFace`` function, use ``DummyClientFace`` constructors
directly (:issue:`3383`)
- Previously deprecated ``Name::set``, use constructors directly (:issue:`2506`)
- Previously deprecated ``Block::fromBuffer`` and block helpers (:issue:`2950`, :issue:`2636`)
* ``Block::fromBuffer`` overloads with output parameter
* ``ndn::encoding::prependBlock``
* ``ndn::encoding::prependByteArrayBlock``
* ``ndn::encoding::nonNegativeIntegerBlock``
* ``ndn::encoding::prependBooleanBlock``
* ``ndn::encoding::booleanBlock``
* ``ndn::encoding::dataBlock``
* ``ndn::encoding::nestedBlock``
- Previously deprecated Command Interest classes (:issue:`2008`)
* ``CommandInterestGenerator``, replaced by ``KeyChain::sign``
* ``ndn::util::CommandInterestValidator``, replaced by
``ndn::security::CommandInterestValidator``
- ndncatchunks3 and ndnputchunks3 apps. Use ndncatchunks and ndnputchunks from `NDN Essential
Tools (ndn-tools) <https://github.com/named-data/ndn-tools>`__ (:issue:`3547`)
- ``ndn::ndn_digestSha256`` function. Use ``ndn::crypto::computeSha256Digest`` instead.
- **potentially breaking change** Headers ``security/certificate-extension.hpp``,
``security/certificate-subject-description.hpp``, and ``security/certificate.hpp``. When necessary,
use the corresponding headers in ``security/v1/*`` or ``security/v1/identity-certificate.hpp``.
-102
View File
@@ -1,102 +0,0 @@
ndn-cxx version 0.5.1
---------------------
Release date: January 25, 2017
.. note::
This is the last release of the library that supports NDN Certificate format version 1 and
the existing implementations of validators. The upcoming 0.6.0 release will include
multiple breaking changes of the security framework.
Changes since version 0.5.0:
New features
^^^^^^^^^^^^
- Add version 2 of the security framework in ``security::v2`` namespace
* `NDN Certificate Format version 2.0
<https://docs.named-data.net/NDN-packet-spec/0.3/certificate.html>`__ (:issue:`3103`)
* New Public Information Base (PIB) and Trusted Platform Module (TPM) framework to manage
public/private keys and NDN Certificate version 2.0 (:issue:`2948`, :issue:`3202`)
* New KeyChain implementation (:issue:`2926`)
* New Validator implementation (:issue:`3289`, :issue:`1872`)
* New security-supporting utilities: trust anchor container and certificate cache
* Creation of `Command Interests
<https://redmine.named-data.net/projects/ndn-cxx/wiki/CommandInterest>`__ delegated to
``CommandInterestSigner`` class, while the new KeyChain only :doc:`signs Interests
</specs/signed-interest>` (:issue:`3912`)
- Enable validator to fetch certificates directly from the signed/command interest sender
(:issue:`3921`)
- Add UP and DOWN kinds to :ndn-cxx:`FaceEventNotification` (issue:`3794`)
- Add support for NIC-associated permanent faces in FaceUri (:issue:`3522`)
- Add support for CongestionMark and Ack NDNLPv2 fields (:issue:`3797`, :issue:`3931`)
- Add StrategyChoice equality operators and formatted output (:issue:`3903`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Ensure that NACK callback is called for matching Interests, regardless of their nonce
(:issue:`3908`)
- Optimize :ndn-cxx:`name::Component::compare` implementation (:issue:`3807`)
- Fix memory leak in ndn-cxx:`Regex` (:issue:`3673`)
- Correct NDNLPv2 rules for whether an unknown field can be ignored (:issue:`3884`)
- Ensure that port numbers in FaceUri are 16 bits wide
- Correct ValidityPeriod::isValid check (:issue:`2868`)
- Fix encoding of type-specific TLV (:issue:`3914`)
- Rename previously incorrectly named EcdsaKeyParams to EcKeyParams (:issue:`3135`)
- Various documentation improvements, including ndn-cxx code style updates (:issue:`3795`, :issue:`3857`)
Deprecated
^^^^^^^^^^
- Old security framework. All old security framework classes are moved to the
``ndn::security::v1`` namespace in this release and will be removed in the next release.
* ``v1::KeyChain``; use ``v2::KeyChain`` instead.
* ``v1::Validator`` interface and all implementations of this interface (``ValidatorRegex``,
``ValidatorConfig``, ``ValidatorNull``). Use ``v2::Validator`` and the corresponding
implementations of :ndn-cxx:`ValidationPolicy` interfaces (will be introduced before
the 0.6.0 release).
* ``v1::SecPublicInfo`` and its implementation (``SecPublicInfoSqlite``), ``SecTpm`` and its
implementations (``SecTpmFile``, ``SecTpmOsx``). These classes are internal implementation
and not intended to be used without ``v1::KeyChain``. ``v2::KeyChain`` internally uses
the newly introduced :ndn-cxx:`Pib` and :ndn-cxx:`Tpm` interfaces with their corresponding
implementations.
* ``v1::Certificate``, ``v1::IdentityCertificate``, ``v1::CertificateExtension``,
``v1::CertificateSubjectDescription``; use ``v2::Certificate`` and ``AdditionalDescription``
instead.
* ``v1::SecuredBag``; use :ndn-cxx:`SafeBag` instead.
- Constant ``io::BASE_64``, use ``io::BASE64`` instead (:issue:`3741`)
- Headers ``management/nfd-*``, use ``mgmt/nfd/*`` instead (:issue:`3760`)
- ``ndn::crypto::sha256`` in favor of ``ndn::crypto::computeSha256Digest``
- ``security/cryptopp.hpp`` header. Use ``security/v1/cryptopp.hpp`` when needed, avoid direct
include as CryptoPP dependency will be removed from future versions of the library.
- ``security/identity-certificate.hpp`` header. Use ``security/v1/identity-certificate.hpp`` instead.
- ``ndn::PublicKey``, ``ndn::Certificate``, ``ndn::IdentityCertificate``,
``ndn::CertificateExtension``, ``ndn::CertificateSubjectDescription``. When necessary, use
``security::v1::PublicKey``, ``security::v1::Certificate``, ``security::v1::IdentityCertificate``,
``security::v1::CertificateExtension``, ``security::v1::CertificateSubjectDescription`` instead.
-148
View File
@@ -1,148 +0,0 @@
ndn-cxx version 0.6.0
---------------------
Release date: October 16, 2017
Changes since version 0.5.1:
New features
^^^^^^^^^^^^
- **(breaking change)** Security framework version 2 (:issue:`3098`, :issue:`3920`,
:issue:`3644`, :issue:`4085`, :issue:`4323`, :issue:`4339`).
This release of the library supports only the new version of the security framework
and features a number of updates to the KeyChain and Validator interfaces.
At the same time, management APIs for :ndn-cxx:`ValidatorConfig` remained intact;
transition to the new framework only requires adjusting :ndn-cxx:`Validator::validate`
calls and updating configuration files to follow the naming conventions of the new
`Certificate format <https://docs.named-data.net/NDN-packet-spec/0.3/certificate.html>`__.
- Integration of fetching certificates using Certificate Bundle as part of specialized
``CertificateFetcher`` (:issue:`3891`)
- ``ForwardingHint``, ``Delegation``, and ``DelegationList``; refactoring of Interest encoding
to include ``ForwardingHint`` instead of ``LinkObject``, following the latest NDN
specification updates (:issue:`4054`, :issue:`4055`)
- Fine-grained signals on interface/address changes in :ndn-cxx:`NetworkMonitor`
for all supported platforms (:issue:`3353`, :issue:`4025`, :issue:`3817`, :issue:`4024`)
- Addition of ``TxSequence`` field and ``Ack``, the first repeatable field in
NDNLPv2 (:issue:`3931`)
- Optional ``LocalUri`` as part of ``ControlParameters`` and adjusting face creation command
and responses to handle the new optional field (:issue:`4014`, :issue:`4015`, :issue:`3956`)
- ``LpReliability`` flag in Face management data structures (:issue:`4003`)
- Backported implementation of C++17 classes ``ostream_joiner`` and ``optional``
(:issue:`3962`, :issue:`3753`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Removed dependency on CryptoPP library. All cryptographic operations are now realized using
OpenSSL library routines and/or with the help of ``security::transform`` framework
(:issue:`3006`, :issue:`3946`, :issue:`3924`, :issue:`3886`).
- Improved APIs for NFD management data structures, including equality comparators, formatted
output, etc. (:issue:`3932`, :issue:`3903`, :issue:`3864`)
- FaceUri now accepts link-local IPv6 addresses (:issue:`1428`)
- Rename fields in :ndn-cxx:`FaceStatus` and :ndn-cxx:`ForwarderStatus` ('datas' => 'data')
(:issue:`3955`)
- Improve logging framework and its uses
* Add API to enumerate Logger modules (:issue:`4013`)
* Advanced filtering of the logging modules (:issue:`3918`)
* Add logging capabilities to ``Face``, ``UnixTransport``, ``TcpTransport``, and the new
security framework (:issue:`3563`)
To configure logging, set the environment variable :doc:`NDN_LOG </manpages/ndn-log>`.
Examples:
.. code-block:: sh
export NDN_LOG="*=ALL"
export NDN_LOG="ndn.*=ALL"
export NDN_LOG="ndn.security=DEBUG:ndn.TcpTransport=ALL"
- Ensure that :ndn-cxx:`Face` sends a ``Nack`` only after every ``InterestCallback`` has
responded (:issue:`4228`)
- Fix potential overflow in :ndn-cxx:`time::toIsoString` (:issue:`3915`)
- Fix potentially misaligned memory accesses (:issue:`4172`, :issue:`4097`, :issue:`4175`,
:issue:`4190`, :issue:`4191`)
- Fix potential memory access error in ``Face/PendingInterest`` (:issue:`4228`)
- Improvements and streamlining of the ``security::transform`` framework
- Source/header reorganization (:issue:`3940`)
* Move network-related files to ``src/net``. Note the following namespace changes:
+ ``ndn::util::FaceUri`` is now ``ndn::FaceUri``
+ ``ndn::util::ethernet`` is now ``ndn::ethernet``
+ ``ndn::util::NetworkMonitor`` and related classes are now in ``ndn::net``
* Move signal-related files into ``src/util/signal`` directory, except for
the main include ``signal.hpp``
* Move :ndn-cxx:`InMemoryStorage` and related classes to ``src/ims``
* Rename ``digest.hpp`` to ``sha256.hpp`` to match the ``Sha256`` class declared within
Removed
^^^^^^^
- Old security framework.
* ``v1::KeyChain``; use :ndn-cxx:`KeyChain` instead.
* ``v1::Validator`` interface and ``ValidatorRegex`` implementation of this
interface. ``ValidatorConfig``, ``ValidatorNull`` implementation refactored to be based on
the new validation framework.
* ``v1::SecPublicInfo`` and its implementation (``SecPublicInfoSqlite``), ``SecTpm`` and its
implementations (``SecTpmFile``, ``SecTpmOsx``). These classes are internal implementation
and not intended to be used without ``v1::KeyChain``. The new :ndn-cxx:`KeyChain` internally
uses the newly introduced :ndn-cxx:`Pib` and :ndn-cxx:`Tpm` interfaces with their
corresponding implementations.
* ``v1::Certificate``, ``v1::IdentityCertificate``, ``v1::CertificateExtension``,
``v1::CertificateSubjectDescription``; use the new :ndn-cxx:`Certificate` and
:ndn-cxx:`AdditionalDescription` instead.
* ``v1::SecuredBag``; use :ndn-cxx:`SafeBag` instead.
- Constant ``io::BASE_64``, use ``io::BASE64`` instead (:issue:`3741`)
- Headers ``management/nfd-*``, use ``mgmt/nfd/*`` instead (:issue:`3760`)
- ``security/cryptopp.hpp`` header
- ``security/identity-certificate.hpp`` header
- ``ndn::PublicKey``, ``ndn::Certificate``, ``ndn::IdentityCertificate``,
``ndn::CertificateExtension``, ``ndn::CertificateSubjectDescription``.
- ``Link`` and ``SelectedDelegation`` fields in ``Interest``, replaced by
``ForwardingHint`` following the latest version of NDN specification (:issue:`4055`)
- ``LocalControlHeader`` constants (:issue:`3755`)
- ``NInDatas`` and ``NOutDatas`` (:issue:`3955`)
- Overload of ``Block::Block`` that parses a ``Block`` from a ``void*`` buffer
- Duplicate ``buf()`` and ``get()`` methods from ``Buffer`` class in favor of ``data()``
- ``util/crypto.hpp``, ``crypto::sha256()``, and ``crypto::computeSha256Digest()`` in favor of
``Sha256::computeDigest()``
- Previously deprecated functions (:issue:`4055`)
@@ -1,57 +0,0 @@
ndn-cxx version 0.6.1
---------------------
Release date: February 19, 2018
New features
^^^^^^^^^^^^
- (potentially breaking change) :ndn-cxx:`expressInterest` now by default loopbacks Interests to
producer callbacks on the same :ndn-cxx:`Face`. When undesired, use
``InterestFilter::allowLoopback(false)`` (:issue:`3979`)
- New signal in :ndn-cxx:`SegmentFetcher` to notify retrieval of Data segments
(:issue:`4438`)
- Initial support for the Content Store management protocol (:issue:`4050`)
- Literal operators for ``time::duration`` types, such as ``1_s``, ``42_ms``, ``30_days``
(:issue:`4468`)
- Support for BLAKE2 hash function (requires OpenSSL >= 1.1.0)
- An ``escape()`` helper function complementing the existing ``unescape()`` (:issue:`4484`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- ``ndnsec key-gen`` command line now allows customization of key ID (:issue:`4294`)
- Fixed encoding of ``'~'`` and ``'+'`` in ``name::Component::toUri()`` (:issue:`4484`)
- Fixed handling of large dates when converting to/from string (:issue:`4478`, :issue:`3915`)
- Fixed error handling in ``KeyChain::importSafeBag()`` (:issue:`4359`)
- Fixed parsing of IPv6 addresses with scope-id (:issue:`4474`)
- ``io::load()`` now handles empty files properly (:issue:`4434`)
- Switched to using ``boost::asio::basic_waitable_timer`` (:issue:`4431`)
- Allow linking multiple :ndn-cxx:`DummyClientFace` instances together to emulate a broadcast
medium (:issue:`3913`)
- Fixed build when ``std::to_string`` is not available (:issue:`4393`)
- Avoid undefined behavior when casting to :ndn-cxx:`tlv::SignatureTypeValue` (:issue:`4370`)
- Fixed compilation with Boost 1.66.0 (:issue:`4422`)
- Various documentation updates
(:issue:`3918`, :issue: `4184`, :issue: `4275`)
Removed
^^^^^^^
- Removed obsolete TLV-TYPE constants (:issue:`4055`, :issue:`3098`, :issue: `3755`)
@@ -1,53 +0,0 @@
ndn-cxx version 0.6.2
---------------------
Release date: May 4, 2018
New features
^^^^^^^^^^^^
- Initial support for `NDN packet format version 0.3
<https://docs.named-data.net/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
* Recognize typed name components, allow typed name component in ``FinalBlockId``
(:issue:`4526`)
* Recognize Interest in Packet Format v0.3 (:issue:`4527`)
In this release, ``Interest::wireDecode`` accepts both v0.2 and v0.3 formats, but
``Interest::wireEncode`` only encodes into v0.2 format. A future release of the
library will switch the encoding to v0.3 format.
* Recognize Data in Packet Format v0.3 (:issue:`4568`)
In this release, ``Data::wireDecode`` accepts both v0.2 and v0.3 formats, but
``Data::wireEncode`` only encodes into v0.2 format. A future release of the library
will switch the encoding to v0.3 format.
- Library support for cs/erase command of NFD Management (:issue:`4318`)
- A convenience function to print out ``Block`` structures (:issue:`2225`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Change encoding of NDNLPv2 sequence number from nonNegativeInteger to fixed-width
integer (8 bytes in network order) (:issue:`4403`)
- Fix compilation with Boost 1.67 (:issue:`4584`)
- Upgrade build environment to latest version of ``waf`` and other improvements
- Logging system improvements (:issue:`4552`)
Deprecated
^^^^^^^^^^
- Selectors (:issue:`4527`)
NDN Packet Format v0.3 replaces Selectors with ``CanBePrefix`` and ``MustBeFresh`` elements.
This commit deprecates getter/setter for Selectors in Interest class. Getter/setter for
CanBePrefix and MustBeFresh are mapped to the closest v0.2 semantics and encoded as
selectors.
- ``Data::get/setFinalBlockId()`` in favor of ``Data::get/setFinalBlock()``
@@ -1,88 +0,0 @@
ndn-cxx version 0.6.3
---------------------
Release date: September 18, 2018
The build requirements have been upgraded to gcc >= 5.3 or clang >= 3.6, boost >= 1.58,
openssl >= 1.0.2. This effectively drops support for all versions of Ubuntu older than 16.04
that use distribution-provided compilers and packages.
The compilation now uses the C++14 standard.
New features
^^^^^^^^^^^^
- More support for `NDN packet format version 0.3
<https://docs.named-data.net/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
- Allow applications to declare a default ``CanBePrefix`` setting (:issue:`4581`)
- Accommodate typed name components in ``Name::getSuccessor`` (:issue:`4570`)
- Support Parameters element (:issue:`4658`)
- Recognize alternative type representations in URI syntax (:issue:`4690`)
- Introduce ``ParametersSha256DigestComponent`` (:issue:`4658`, :issue:`4570`)
- Prefix announcement object (:issue:`4650`)
- MTU element in ``ControlParameters`` and ``FaceStatus`` (:issue:`4005`)
- Enable congestion control features in ``SegmentFetcher`` (:issue:`4364`)
- ``_block`` literal operator (:issue:`4722`)
- Add official support for CentOS 7 (:issue:`4610`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Fix a segfault in ``Face::satisfyPendingInterests`` when ``Face::put`` is
called in DataCallback (:issue:`4596`)
- Allow specifying passphrase for ndnsec import/export on the command line (:issue:`4633`)
- Fix bug preventing customization of KeyChain's TPM on macOS (:issue:`4297`)
- Fix bug with handling Sha256-signed Command Interests (:issue:`4635`)
- Eliminate selector usage in ``SegmentFetcher`` (:issue:`4555`)
- Improvements in ``netlink`` message processing
- Gracefully handle ``NetworkMonitor`` backend initialization failure (:issue:`4668`)
- Add support 224-bit and 521-bit NIST elliptic curves, add support for SHA-3 (with
openssl >= 1.1.1-pre1), and forbid RSA keys shorter than 2048 bits in security helpers
- Improve and simplify code with modern C++ features
- Properly declare move constructors
- Improve error handling
- Improve test cases
- Correct and improve documentation
Deprecated
^^^^^^^^^^
- ``SegmentFetcher::fetch()`` static functions in favor of ``start()`` (:issue:`4464`)
- ``ndn::ip::address{,V6}FromString`` as Boost.Asio >= 1.58 has proper implementation of
``addressFromString``
- Selectors (:issue:`4527`)
NDN Packet Format v0.3 replaces Selectors with ``CanBePrefix`` and ``MustBeFresh`` elements.
``CanBePrefix`` and ``MustBeFresh`` are currently mapped to the closest v0.2 semantics and
encoded as selectors.
- ``Data::get/setFinalBlockId()`` in favor of ``Data::get/setFinalBlock()``
Removed
^^^^^^^
- Dependency on Boost.Regex in favor of ``std::regex``
@@ -1,79 +0,0 @@
ndn-cxx version 0.6.5
---------------------
Release date: February 4, 2019
New features
^^^^^^^^^^^^
- More support for `NDN packet format version 0.3
<https://docs.named-data.net/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
* Stop using ``ChildSelector`` in ``NotificationSubscriber`` (:issue:`4664`)
* Stop using ``ChildSelector`` in ``CertificateBundleFetcher`` (:issue:`4665`)
- Support floating point numbers in TLV-VALUE (:issue:`4612`)
- Scoped prefix registration, scoped Interest filter, and scoped pending Interest
(:issue:`3919`, :issue:`4316`)
- Counters for satisfied and unsatisfied Interests in :ndn-cxx:`ForwarderStatus`
(:issue:`4720`)
- :ndn-cxx:`random::getRandomNumberEngine` in the public API
- :ndn-cxx:`MetadataObject` class to encode/decode RDR-style metadata (:issue:`4707`)
- :ndn-cxx:`SegmentFetcher::stop` (:issue:`4692`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Switch to AES-256 for private key encryption in PKCS #8 export
- Use OpenSSL-based routines for PKCS #8 decoding/decryption when exporting keys from the
macOS Keychain (:issue:`4450`)
- Forbid unrecognized TLVs before ``Name`` (:issue:`4667`)
- Stop accepting NonNegativeInteger as sequence number in NDNLP (:issue:`4598`)
- Add exponential backoff in :ndn-cxx:`CertificateFetcherFromNetwork` (:issue:`4718`,
:issue:`4712`)
- Throw exception when loading an orphaned ``ValidationPolicyConfig`` (API violation)
(:issue:`4758`)
- Prevent memory pool size from becoming zero in :ndn-cxx:`InMemoryStorage` (:issue:`4769`)
- Clean up fetchers when destructing :ndn-cxx:`nfd::Controller` (:issue:`4775`)
- Fix ``SegmentFetcher`` undefined behavior caused by uncanceled pending interest
(:issue:`4770`)
- Seed the PRNG with more entropy (:issue:`4808`)
- Backport C++17 ``std::any`` and ``std::variant`` as ``ndn::any`` and ``ndn::variant``
- Reimplement ``scheduler::EventId`` with ``CancelHandle`` (:issue:`4698`)
Deprecated
^^^^^^^^^^
- ``ndn-cxx/util/scheduler-scoped-event-id.hpp`` header, as it is now sufficient to use
``ndn-cxx/util/scheduler.hpp`` header (:issue:`4698`)
- Implicit conversion from nullptr to ``scheduler::EventId`` (:issue:`4698`)
Removed
^^^^^^^
- ``ndn::ip::address{,V6}FromString``
- ``SegmentFetcher::fetch`` (:issue:`4464`)
- ``{get,set}FinalBlockId()``
- Headers that were already considered internal implementation details have been explicitly
moved to a ``detail/`` subdir to more clearly separate private and public headers
@@ -1,63 +0,0 @@
ndn-cxx version 0.6.6
---------------------
Release date: April 27, 2019
.. note::
This is the last release to support the `NDN packet format version 0.2.1
<https://docs.named-data.net/NDN-packet-spec/0.2.1/>`__.
The next release will be able to encode and decode only the `v0.3 packet format
<https://docs.named-data.net/NDN-packet-spec/0.3/>`__.
New features
^^^^^^^^^^^^
- More support for `NDN packet format version 0.3
<https://docs.named-data.net/NDN-packet-spec/0.3/>`__ (:issue:`4527`)
* Support new naming conventions to encode/decode segment numbers, byte offsets, versions,
timestamps, and sequence numbers based on typed name components (:issue:`4777`)
* Stop using ``ChildSelector`` in ``CertificateBundleFetcher`` (:issue:`4665`)
- ``NDN_THROW`` macro to throw exceptions including file position and runtime context of the
throw statement (:issue:`4834`)
- Ensure that a :ndn-cxx:`Block` with TLV-TYPE zero is treated as invalid (:issue:`4726`,
:issue:`4895`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Avoid directly using memory address as ``PendingInterestId`` to prevent potential false
removal of an entry (:issue:`2865`)
- Follow up packet specification changes to rename the ``Parameters`` element to
``ApplicationParameters`` and to change its number to be a non-critical element type
(:issue:`4658`, :issue:`4780`)
- Add an option to disable the infrastructure Interest in ``CertificateFetcherDirectFetch``
(:issue:`4879`)
- Fix compilation against recent versions of Boost libraries and issues with Xcode 10.2 and
older versions of Boost libraries (:issue:`4890`, :issue:`4923`, :issue:`4860`)
- Improve the "CanBePrefix unset" warning (:issue:`4581`)
- Improve documentation
Deprecated
^^^^^^^^^^
- ``PendingInterestId``, ``RegisteredPrefixId``, and ``InterestFilterId`` types in favor of
``PendingInterestHandle``, ``RegisteredPrefixHandle``, and ``InterestFilterHandle``
(:issue:`4316`, :issue:`3919`)
- ``Block::empty`` in favor of ``Block::isValid`` (with inverted semantics)
- ``Scheduler::scheduleEvent`` and ``Scheduler::cancelEvent`` in favor of ``Scheduler::schedule``
and ``EventId::cancel`` (or use ``ScopedEventId`` to automatically cancel the event when
the object goes out of scope) (:issue:`4883`)
- ``ndn::util::Scheduler`` (use ``ndn::Scheduler`` or ``ndn::scheduler::Scheduler``) and
``ndn::EventId`` (use ``ndn::scheduler::EventId``) (:issue:`4883`)
@@ -1,80 +0,0 @@
ndn-cxx version 0.7.0
---------------------
Release date: January 13, 2020
**Breaking Change**
This release features support of only `NDN packet format version 0.3
<https://docs.named-data.net/NDN-packet-spec/0.3/>`__ (:issue:`4527`, :issue:`4567`,
:issue:`4709`, :issue:`4913`). The library encodes and interprets Interest and Data
packets only in 0.3 format; support for version 0.2 has been completely removed. In
addition, the URI representation of Interest packets has been updated to follow the
packet format changes.
New features
^^^^^^^^^^^^
- HMAC signing support (:issue:`3075`)
- Support for ``ParametersSha256DigestComponent`` in :ndn-cxx:`Name` and :ndn-cxx:`Interest`
(:issue:`4658`)
- Encoding and decoding of ``HopLimit`` field in Interest (:issue:`4806`)
- Support for encoding and decoding PIT token as NDNLPv2 field (:issue:`4532`).
PIT token is a hop-by-hop header field that identifies an Interest-Data exchange. The
downstream node can assign an opaque token to an outgoing Interest, and the upstream node
is expected to return the same token on the Data or Nack in reply to that Interest. This
would allow the downstream node to accelerate its processing, especially in PIT lookup.
- :ndn-cxx:`io::loadBuffer` and :ndn-cxx:`io::saveBuffer` helper functions
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Various improvements in the Linux implementation of :ndn-cxx:`NetworkMonitor`
- Rework of ``RttEstimator`` class:
* split into two classes: :ndn-cxx:`RttEstimator` and :ndn-cxx:`RttEstimatorWithStats`
(:issue:`4887`)
* add a getter for the smoothed RTT value (:issue:`4892`)
* switch to use ``time::nanoseconds`` (:issue:`4887`)
- Make use of attributes in logging facilities and generalize logger backend support
(:issue:`4969`, :issue:`3782`)
- Silently accept an empty validation policy instead of throwing an exception (:issue:`5049`)
- Introduce alternative URI syntax for component types used in naming conventions, with
ability to choose between canonical and alternate format (:issue:`4777`)
- Don't force the generation of an Interest nonce during decoding (:issue:`4685`)
- Various documentation improvements
Removals
^^^^^^^^
- ``ndn::util::Scheduler`` (use ``ndn::Scheduler`` or ``ndn::scheduler::Scheduler``) and
``ndn::EventId`` (use ``ndn::scheduler::EventId``) (:issue:`4883`)
- Unused ``KeyClass`` and ``AclType`` enums
- Unused ``v2::PublicKey`` alias of ``transform::PublicKey``
- ``HmacFilter`` class, use :ndn-cxx:`SignerFilter` and :ndn-cxx:`VerifierFilter` instead
- Ill-defined equality operators for ``Interest``, ``MetaInfo``, ``Signature`` (:issue:`4569`)
- Implicit conversion from the ``xyzHandle`` types to ``const xyzId*`` (where ``xyz`` is
``PendingInterest``, ``RegisteredPrefixId``, and ``InterestFilterId``)
- Deprecated ``KeyLocator::Type`` enum
- Private header files of concrete PIB, TPM, and KeyHandle implementations are no longer
installed (:issue:`4782`)
- Renamed ``util/backports-ostream-joiner.hpp`` to ``util/ostream-joiner.hpp``
@@ -1,78 +0,0 @@
ndn-cxx version 0.7.1
---------------------
Release date: October 8, 2020
The build requirements have been increased to require Clang >= 4.0, Xcode >= 9.0, and Python >= 3.6.
Meanwhile, it is *recommended* to use GCC >= 7.4.0 and Boost >= 1.65.1.
This effectively drops official support for Ubuntu 16.04 when using distribution-provided Boost
packages -- ndn-cxx may still work on this platform, but we provide no official support for it.
Additionally, this release drops support for CentOS 7 and adds support for CentOS 8.
New features
^^^^^^^^^^^^
- `Signed Interests <https://docs.named-data.net/NDN-packet-spec/0.3/signed-interest.html>`__
according to Packet Specification v0.3 (:issue:`4804`)
- Add "in-order" mode to :ndn-cxx:`SegmentFetcher` and a corresponding signal that is emitted after
each segment is received and validated in segment order. Segments that arrive out-of-order will be
buffered internally until all earlier segments have arrived and passed validation.
- Allow ``KeyLocator`` to either identify the full name of a certificate, an unversioned certificate
prefix, or the name of a public key (without issuer and version) (:issue:`5115`)
- Allow face MTU to be changed via management (:issue:`5056`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Change default key type generated by ndnsec to ECDSA
- Use named curve when encoding ECDSA public keys (:issue:`5037`)
- Allow non-default key to be exported for an identity via ``ndnsec-export`` (:issue:`5043`)
- Fix spurious error message from ``ndnsec-key-gen`` when ``key-id`` is specified (:issue:`5057`)
- Provide more fine-grained choices for :ndn-cxx:`name::UriFormat` (:issue:`4777`)
- Allow automatic log flushing to be disabled (:issue:`3668`)
- Avoid unnecessarily invalidating cached wire encodings of Data packets
- Correct extraction of signed portion of Data packets to be compatible with Packet Specification
v0.3 (:issue:`4583`)
- Fix regression in ``CertificateBundleFetcher`` with ``FinalBlockId`` handling
- Improve error handling during TPM signing (:issue:`4585`, :issue:`5086`)
- Correctly handle non-existent identity in ``PibImpl::setDefaultIdentity``
- Fix incompatibility with Boost 1.73.0+ in :ndn-cxx:`time::toIsoString`
- Fix incompatibility with ``<version>`` header in C++20
- Various fixes for Android
- Various improvements to documentation, test suite structure, and authors list
Deprecations
^^^^^^^^^^^^
- Deprecate old Signed Interest and Command Interest formats (:issue:`4804`)
- Deprecate ``Signature`` in favor of ``SignatureInfo`` in Data packets and certificates (:issue:`4804`)
- ``SignatureInfo::unsetKeyLocator`` and ``SignatureInfo::unsetValidityPeriod`` have been deprecated
- Header files under ``ndn/security/v2`` have been moved into the main ``ndn/security`` directory
Removals
^^^^^^^^
- Remove deprecated ``PendingInterestId``, ``InterestFilterId``, and ``RegisteredPrefixId``
(:issue:`4885`)
- Remove a number of long-deprecated functions and enums
@@ -1,84 +0,0 @@
ndn-cxx version 0.8.0
---------------------
Release date: February 15, 2022
Important changes
^^^^^^^^^^^^^^^^^
- Flip default value of ``CanBePrefix`` to **false** (:issue:`4582`). This means that
Interests created without explicitly specifying ``CanBePrefix`` option will be treated
as Interests for exact Data name.
- Change default name component encoding convention to ``TYPED`` (:issue:`5044`)
- Update TLV-TYPE numbers to revision 3 of the `naming conventions`_
.. _naming conventions:
https://named-data.net/publications/techreports/ndn-tr-22-3-ndn-memo-naming-conventions/
- Change TLV-TYPE number of ``IncomingFaceId`` field in NDNLP (:issue:`5185`)
- Update Interest ``ForwardingHint`` format (:issue:`5187`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Support certificate name, versionless certificate name, and key name options for
KeyLocator name in ``ValidatorConfig`` (:issue:`5142`)
- Generalize signature verification to allow ``digest-sha256``, effectively adding
support of digest integrity verification in ``ValidatorConfig``
- Enforce ``sig-type`` check in ``ValidatorConfig`` (:issue:`4524`)
- Fix ``ValidatorConfig`` rule processing bug (:issue:`5145`)
- Prevent potential dereferencing of past-the-end iterator in ``Block::value()``
- Fail early in :ndn-cxx:`Block::blockFromValue` if TLV length is zero
- Refactor and cleanup of :ndn-cxx:`StatusDatasetContext`, including increase of maximum
payload size of each produced segment to 8000 bytes
- Improve error reporting when loading a ``Certificate`` or ``SafeBag`` fails
- Add API to get the keyword name component for Metadata and Prefix Announcements
- Backport C++20 ``std::span`` and convert most APIs to use it
- Introduce ``time::{to,from}IsoExtendedString()`` utility functions
- Add support for OpenSSL 3.0. Note that because of the API changes, HMAC implementation
does not currently work when compiled with OpenSSL 3.0+, use older version of OpenSSL
when needed.
- Various build system and documentation extension and fixes
Deprecations
^^^^^^^^^^^^
- ``Interest::setDefaultCanBePrefix()``
- ``Name::append(Block)`` overload, as it has confusing semantics (:issue:`5186`)
- ``ndnsec`` tool aliases: ``ndnsec-certgen``, ``ndnsec-dump-certificate``,
``ndnsec-install-cert``, ``ndnsec-keygen``, ``ndnsec-ls-identity``
Removals
^^^^^^^^
- Previously deprecated ``Signature`` class, its subclasses, and deprecated methods from
``Data``, ``KeyChain``, ``SignatureInfo``, and ``SigningInfo``
- Redundant overloads of ``verifySignature()`` and ``verifyDigest()``
- Previously deprecated ``security/v2`` headers
- Previously deprecated ``CommandInterestSigner``
- Unused ``Transport::send()`` overload
- Remove HTTP download feature in ``ndnsec cert-install``, as it does not support HTTPS
retrieval. The recommended way of installing certificates published over HTTP/HTTPS has
been changed to use ``curl`` or ``wget`` (:issue:`4506`)
-102
View File
@@ -1,102 +0,0 @@
ndn-cxx version 0.8.1
---------------------
Release date: December 31, 2022
.. note::
This is the last release of ndn-cxx to support the C++14 standard.
Future versions will require C++17 to build.
Important changes and new features
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The minimum build requirements have been increased as follows:
- Either GCC >= 7.4.0 or Clang >= 6.0 is required on Linux
- On macOS, Xcode 11.3 or later is recommended; older versions may still work but are not
officially supported
- Boost >= 1.65.1 and OpenSSL >= 1.1.1 are required on all platforms
- Sphinx 4.0 or later is required to build the documentation
- CentOS Stream 9 is now officially supported; CentOS 8 has been dropped (:issue:`5181`)
- macOS 12 (Monterey) and 13 (Ventura) running on arm64 are now officially supported
(:issue:`5135`)
- Add the initial version of a :ndn-cxx:`Segmenter` API that applications can use to simplify
the process of chunking a large object into multiple signed Data packets (:issue:`5247`)
- Add ``KeyChain::makeCertificate()`` to simplify the creation of certificates
- Put the full certificate name in the ``KeyLocator`` field, instead of just the key name
(:issue:`5112`)
- NFD management commands sent by :ndn-cxx:`nfd::Controller` now use the `new signed Interest
format <https://docs.named-data.net/NDN-packet-spec/0.3/signed-interest.html>`__ (:issue:`4804`)
Improvements and bug fixes
^^^^^^^^^^^^^^^^^^^^^^^^^^
- Several enhancements and cleanups in :ndn-cxx:`Name` and :ndn-cxx:`Component` to make
the API more consistent and simpler to use (:issue:`5186`)
- Various improvements in the validation framework and policies
- Avoid redundant TLV decoding during Interest validation
- Fix validation of signed Interests with malformed ``InterestSignatureInfo``
- More accurate validation error codes are returned in several cases
- Rename ``ValidationError::NO_SIGNATURE`` to ``MALFORMED_SIGNATURE``
- Optimize parsing of PIB and TPM locators in :ndn-cxx:`KeyChain`
- Major cleanup and modernization of PIB implementation
- Gracefully handle invalid or unsupported public keys stored in the PIB
- Fix OpenSSL 3.0 deprecation warnings in private key generation routines (:issue:`5154`)
- Change ``Certificate::getPublicKey()`` to return a ``span``
- Make :ndn-cxx:`Block` convertible to ``span<const uint8_t>``
- Avoid assertion failure in :ndn-cxx:`OBufferStream` under certain conditions (:issue:`5240`)
- Allow customizing the FaceId in :ndn-cxx:`DummyClientFace` (:issue:`5011`)
- Improve pretty-printing of certificates, e.g., in ``ndnsec list`` and ``ndnsec cert-dump``
- Relax restrictions on KeyId component type in ``ndnsec key-gen``
- Fix handling of ``--without-osx-keychain`` configure option (:issue:`3338`)
- Stop using the ``gold`` linker on Linux; prefer instead linking with ``lld`` if installed
- Update waf build system to version 2.0.24
- Various documentation improvements
Deprecations
^^^^^^^^^^^^
- ``Name::append()`` overloads and :ndn-cxx:`Component` constructors that take a
``const uint8_t*``. Use the ``span``-based overloads instead.
- ``Component::fromImplicitSha256Digest()`` and ``Component::fromParametersSha256Digest()``.
Use one of the constructors directly instead.
Removals
^^^^^^^^
- Obsolete TLV-TYPE definitions
- Many previously deprecated functions that take raw byte buffers as ``uint8_t*`` + ``size_t``,
replaced by equivalent functions that take a ``span``. These include ``Data::setContent()``,
``Interest::setApplicationParameters()``, ``Block::fromBuffer()``, ``verifySignature()``,
``PublicKey::loadPkcs8()``, ``transform::bufferSource()``, ``random::generateSecureBytes()``,
``printHex()``, ``toHex()``, and so on.
- Previously deprecated ``Name::append(Block)`` overload
- Previously deprecated ``Interest::setDefaultCanBePrefix()``
- ``ndn::any`` and related functionality
-147
View File
@@ -1,147 +0,0 @@
All ndn-cxx Releases
====================
.. toctree::
:glob:
:hidden:
:maxdepth: 1
:reversed:
release-notes/*
* **ndn-cxx version 0.8.1**
(:doc:`Release Notes <release-notes/release-notes-0.8.1>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.8.1/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.8.1>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.8.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.8.1.tar.bz2.sha256>`__)
* **ndn-cxx version 0.8.0**
(:doc:`Release Notes <release-notes/release-notes-0.8.0>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.8.0/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.8.0>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.8.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.8.0.tar.bz2.sha256>`__)
* **ndn-cxx version 0.7.1**
(:doc:`Release Notes <release-notes/release-notes-0.7.1>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.7.1/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.7.1>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.7.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.7.1.tar.bz2.sha256>`__)
* **ndn-cxx version 0.7.0**
(:doc:`Release Notes <release-notes/release-notes-0.7.0>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.7.0/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.7.0>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.7.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.7.0.tar.bz2.sha256>`__)
* **ndn-cxx version 0.6.6**
(:doc:`Release Notes <release-notes/release-notes-0.6.6>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.6.6/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.6>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.6.6.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.6.6.tar.bz2.sha256>`__)
* **ndn-cxx version 0.6.5**
(:doc:`Release Notes <release-notes/release-notes-0.6.5>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.6.5/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.5>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.6.5.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.6.5.tar.bz2.sha256>`__)
* **ndn-cxx version 0.6.4** was skipped
* **ndn-cxx version 0.6.3**
(:doc:`Release Notes <release-notes/release-notes-0.6.3>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.6.3/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.3>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.6.3.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.6.3.tar.bz2.sha256>`__)
* **ndn-cxx version 0.6.2**
(:doc:`Release Notes <release-notes/release-notes-0.6.2>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.6.2/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.2>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.6.2.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.6.2.tar.bz2.sha256>`__)
* **ndn-cxx version 0.6.1**
(:doc:`Release Notes <release-notes/release-notes-0.6.1>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.6.1/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.1>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.6.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.6.1.tar.bz2.sha256>`__)
* **ndn-cxx version 0.6.0**
(:doc:`Release Notes <release-notes/release-notes-0.6.0>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.6.0/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.6.0>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.6.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.6.0.tar.bz2.sha256>`__)
* **ndn-cxx version 0.5.1**
(:doc:`Release Notes <release-notes/release-notes-0.5.1>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.5.1/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.5.1>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.5.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.5.1.tar.bz2.sha256>`__)
* **ndn-cxx version 0.5.0**
(:doc:`Release Notes <release-notes/release-notes-0.5.0>`, `Documentation <https://docs.named-data.net/ndn-cxx/0.5.0/>`__)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.5.0>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.5.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.5.0.tar.bz2.sha256>`__)
* **ndn-cxx version 0.4.1**
(:doc:`Release Notes <release-notes/release-notes-0.4.1>`)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.4.1>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.4.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.4.1.tar.bz2.sha256>`__)
* **ndn-cxx version 0.4.0**
(:doc:`Release Notes <release-notes/release-notes-0.4.0>`)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.4.0>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.4.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.4.0.tar.bz2.sha256>`__)
* **ndn-cxx version 0.3.4**
(:doc:`Release Notes <release-notes/release-notes-0.3.4>`)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.4>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.3.4.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.3.4.tar.bz2.sha256>`__)
* **ndn-cxx version 0.3.3**
(:doc:`Release Notes <release-notes/release-notes-0.3.3>`)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.3>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.3.3.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.3.3.tar.bz2.sha256>`__)
* **ndn-cxx version 0.3.2**
(:doc:`Release Notes <release-notes/release-notes-0.3.2>`)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.2>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.3.2.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.3.2.tar.bz2.sha256>`__)
* **ndn-cxx version 0.3.1**
(:doc:`Release Notes <release-notes/release-notes-0.3.1>`)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.1>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.3.1.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.3.1.tar.bz2.sha256>`__)
* **ndn-cxx version 0.3.0**
(:doc:`Release Notes <release-notes/release-notes-0.3.0>`)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.3.0>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.3.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.3.0.tar.bz2.sha256>`__)
* **ndn-cxx version 0.2.0**
(:doc:`Release Notes <release-notes/release-notes-0.2.0>`)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.2.0>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.2.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.2.0.tar.bz2.sha256>`__)
- ndn-cxx version 0.2.0-rc1
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.2.0-rc1>`__
- ndn-cxx version 0.2.0-rc2
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.2.0-rc2>`__
* **ndn-cxx version 0.1.0**
(:doc:`Release Notes <release-notes/release-notes-0.1.0>`)
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.1.0>`__,
`src (tarball) <https://named-data.net/downloads/ndn-cxx-0.1.0.tar.bz2>`__ (`checksum <https://named-data.net/downloads/ndn-cxx-0.1.0.tar.bz2.sha256>`__)
- ndn-cxx version 0.1.0-rc1
`src (git) <https://github.com/named-data/ndn-cxx/releases/tag/ndn-cxx-0.1.0-rc1>`__
Loaded 100 of 1023 files, more files were not shown because too many files have changed in this diff. Show more