├── .gitignore ├── CMakeLists.txt ├── LICENSE ├── MANIFEST.md ├── README.md ├── apps └── CMakeLists.txt ├── cmake ├── Modules │ ├── CMakeParseArgumentsCopy.cmake │ ├── FindCppUnit.cmake │ ├── FindGnuradioRuntime.cmake │ ├── FindSodium.cmake │ ├── GrMiscUtils.cmake │ ├── GrPlatform.cmake │ ├── GrPython.cmake │ ├── GrSwig.cmake │ ├── GrTest.cmake │ ├── UseSWIG.cmake │ └── naclConfig.cmake └── cmake_uninstall.cmake.in ├── docs ├── CMakeLists.txt ├── README.nacl └── doxygen │ ├── CMakeLists.txt │ ├── Doxyfile.in │ ├── Doxyfile.swig_doc.in │ ├── doxyxml │ ├── __init__.py │ ├── base.py │ ├── doxyindex.py │ ├── generated │ │ ├── __init__.py │ │ ├── compound.py │ │ ├── compoundsuper.py │ │ ├── index.py │ │ └── indexsuper.py │ └── text.py │ ├── other │ ├── group_defs.dox │ └── main_page.dox │ └── swig_doc.py ├── examples ├── README ├── arch_makepkg │ └── PKGBUILD ├── generate_key.grc ├── generate_keypair.grc ├── input.file ├── public_encryption.grc ├── secret_encryption.grc └── stream_encryption.grc ├── grc ├── CMakeLists.txt ├── nacl_crypt_tagged_stream.xml ├── nacl_decrypt_public.xml ├── nacl_decrypt_secret.xml ├── nacl_encrypt_public.xml ├── nacl_encrypt_secret.xml ├── nacl_generate_key.xml └── nacl_generate_keypair.xml ├── include └── nacl │ ├── CMakeLists.txt │ ├── api.h │ ├── crypt_tagged_stream.h │ ├── decrypt_public.h │ ├── decrypt_secret.h │ ├── encrypt_public.h │ ├── encrypt_secret.h │ ├── generate_key.h │ └── generate_keypair.h ├── lib ├── CMakeLists.txt ├── crypt_tagged_stream_impl.cc ├── crypt_tagged_stream_impl.h ├── decrypt_public_impl.cc ├── decrypt_public_impl.h ├── decrypt_secret_impl.cc ├── decrypt_secret_impl.h ├── encrypt_public_impl.cc ├── encrypt_public_impl.h ├── encrypt_secret_impl.cc ├── encrypt_secret_impl.h ├── generate_key_impl.cc ├── generate_key_impl.h ├── generate_keypair_impl.cc ├── generate_keypair_impl.h ├── qa_nacl.cc ├── qa_nacl.h └── test_nacl.cc ├── python ├── CMakeLists.txt ├── __init__.py ├── build_utils.py ├── build_utils_codes.py ├── qa_crypt_tagged_stream.py ├── qa_decrypt_public.py ├── qa_decrypt_secret.py ├── qa_encrypt_public.py └── qa_encrypt_secret.py └── swig ├── CMakeLists.txt └── nacl_swig.i /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | top_block.py 3 | *.example 4 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2011,2012,2014 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | ######################################################################## 21 | # Project setup 22 | ######################################################################## 23 | cmake_minimum_required(VERSION 2.6) 24 | project(gr-nacl CXX C) 25 | if(APPLE) 26 | include_directories(/opt/local/include) 27 | endif(APPLE) 28 | enable_testing() 29 | 30 | #select the release build type by default to get optimization flags 31 | if(NOT CMAKE_BUILD_TYPE) 32 | set(CMAKE_BUILD_TYPE "Release") 33 | message(STATUS "Build type not specified: defaulting to release.") 34 | endif(NOT CMAKE_BUILD_TYPE) 35 | set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "") 36 | 37 | #make sure our local CMake Modules path comes first 38 | list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules) 39 | 40 | ######################################################################## 41 | # Compiler specific setup 42 | ######################################################################## 43 | if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) 44 | #http://gcc.gnu.org/wiki/Visibility 45 | add_definitions(-fvisibility=hidden) 46 | endif() 47 | 48 | ######################################################################## 49 | # Find boost 50 | ######################################################################## 51 | if(UNIX AND EXISTS "/usr/lib64") 52 | list(APPEND BOOST_LIBRARYDIR "/usr/lib64") #fedora 64-bit fix 53 | endif(UNIX AND EXISTS "/usr/lib64") 54 | set(Boost_ADDITIONAL_VERSIONS 55 | "1.35.0" "1.35" "1.36.0" "1.36" "1.37.0" "1.37" "1.38.0" "1.38" "1.39.0" "1.39" 56 | "1.40.0" "1.40" "1.41.0" "1.41" "1.42.0" "1.42" "1.43.0" "1.43" "1.44.0" "1.44" 57 | "1.45.0" "1.45" "1.46.0" "1.46" "1.47.0" "1.47" "1.48.0" "1.48" "1.49.0" "1.49" 58 | "1.50.0" "1.50" "1.51.0" "1.51" "1.52.0" "1.52" "1.53.0" "1.53" "1.54.0" "1.54" 59 | "1.55.0" "1.55" "1.56.0" "1.56" "1.57.0" "1.57" "1.58.0" "1.58" "1.59.0" "1.59" 60 | "1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64" 61 | "1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69" 62 | ) 63 | find_package(Boost "1.35" COMPONENTS filesystem system) 64 | 65 | if(NOT Boost_FOUND) 66 | message(FATAL_ERROR "Boost required to compile nacl") 67 | endif() 68 | 69 | ######################################################################## 70 | # Install directories 71 | ######################################################################## 72 | include(GrPlatform) #define LIB_SUFFIX 73 | set(GR_RUNTIME_DIR bin) 74 | set(GR_LIBRARY_DIR lib${LIB_SUFFIX}) 75 | set(GR_INCLUDE_DIR include/nacl) 76 | set(GR_DATA_DIR share) 77 | set(GR_PKG_DATA_DIR ${GR_DATA_DIR}/${CMAKE_PROJECT_NAME}) 78 | set(GR_DOC_DIR ${GR_DATA_DIR}/doc) 79 | set(GR_PKG_DOC_DIR ${GR_DOC_DIR}/${CMAKE_PROJECT_NAME}) 80 | set(GR_CONF_DIR etc) 81 | set(GR_PKG_CONF_DIR ${GR_CONF_DIR}/${CMAKE_PROJECT_NAME}/conf.d) 82 | set(GR_LIBEXEC_DIR libexec) 83 | set(GR_PKG_LIBEXEC_DIR ${GR_LIBEXEC_DIR}/${CMAKE_PROJECT_NAME}) 84 | set(GRC_BLOCKS_DIR ${GR_PKG_DATA_DIR}/grc/blocks) 85 | 86 | ######################################################################## 87 | # On Apple only, set install name and use rpath correctly, if not already set 88 | ######################################################################## 89 | if(APPLE) 90 | if(NOT CMAKE_INSTALL_NAME_DIR) 91 | set(CMAKE_INSTALL_NAME_DIR 92 | ${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE 93 | PATH "Library Install Name Destination Directory" FORCE) 94 | endif(NOT CMAKE_INSTALL_NAME_DIR) 95 | if(NOT CMAKE_INSTALL_RPATH) 96 | set(CMAKE_INSTALL_RPATH 97 | ${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE 98 | PATH "Library Install RPath" FORCE) 99 | endif(NOT CMAKE_INSTALL_RPATH) 100 | if(NOT CMAKE_BUILD_WITH_INSTALL_RPATH) 101 | set(CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE 102 | BOOL "Do Build Using Library Install RPath" FORCE) 103 | endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH) 104 | endif(APPLE) 105 | 106 | ######################################################################## 107 | # Find gnuradio build dependencies 108 | ######################################################################## 109 | find_package(CppUnit) 110 | find_package(Doxygen) 111 | find_package(Sodium) 112 | 113 | # Search for GNU Radio and its components and versions. Add any 114 | # components required to the list of GR_REQUIRED_COMPONENTS (in all 115 | # caps such as FILTER or FFT) and change the version to the minimum 116 | # API compatible version required. 117 | set(GR_REQUIRED_COMPONENTS RUNTIME) 118 | find_package(Gnuradio "3.7.2" REQUIRED) 119 | 120 | if(NOT CPPUNIT_FOUND) 121 | message(FATAL_ERROR "CppUnit required to compile nacl") 122 | endif() 123 | 124 | ######################################################################## 125 | # Setup doxygen option 126 | ######################################################################## 127 | if(DOXYGEN_FOUND) 128 | option(ENABLE_DOXYGEN "Build docs using Doxygen" ON) 129 | else(DOXYGEN_FOUND) 130 | option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF) 131 | endif(DOXYGEN_FOUND) 132 | 133 | ######################################################################## 134 | # Setup the include and linker paths 135 | ######################################################################## 136 | include_directories( 137 | ${CMAKE_SOURCE_DIR}/lib 138 | ${CMAKE_SOURCE_DIR}/include 139 | ${CMAKE_BINARY_DIR}/lib 140 | ${CMAKE_BINARY_DIR}/include 141 | ${Boost_INCLUDE_DIRS} 142 | ${CPPUNIT_INCLUDE_DIRS} 143 | ${GNURADIO_ALL_INCLUDE_DIRS} 144 | ${SODIUM_INCLUDE_DIRS} 145 | ) 146 | 147 | link_directories( 148 | ${Boost_LIBRARY_DIRS} 149 | ${CPPUNIT_LIBRARY_DIRS} 150 | ${GNURADIO_RUNTIME_LIBRARY_DIRS} 151 | ${SODIUM_LIBRARY_DIRS} 152 | ) 153 | 154 | # Set component parameters 155 | set(GR_NACL_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL "" FORCE) 156 | set(GR_NACL_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE INTERNAL "" FORCE) 157 | 158 | ######################################################################## 159 | # Create uninstall target 160 | ######################################################################## 161 | configure_file( 162 | ${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in 163 | ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake 164 | @ONLY) 165 | 166 | add_custom_target(uninstall 167 | ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake 168 | ) 169 | 170 | ######################################################################## 171 | # Add subdirectories 172 | ######################################################################## 173 | add_subdirectory(include/nacl) 174 | add_subdirectory(lib) 175 | add_subdirectory(swig) 176 | add_subdirectory(python) 177 | add_subdirectory(grc) 178 | add_subdirectory(apps) 179 | add_subdirectory(docs) 180 | 181 | ######################################################################## 182 | # Install cmake search helper for this library 183 | ######################################################################## 184 | if(NOT CMAKE_MODULES_DIR) 185 | set(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake) 186 | endif(NOT CMAKE_MODULES_DIR) 187 | 188 | install(FILES cmake/Modules/naclConfig.cmake 189 | DESTINATION ${CMAKE_MODULES_DIR}/nacl 190 | ) 191 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2015 Stefan Wunsch 2 | 3 | This is free software; you can redistribute it and/or modify 4 | it under the terms of the GNU General Public License as published by 5 | the Free Software Foundation; either version 3, or (at your option) 6 | any later version. 7 | 8 | This software is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | 13 | You should have received a copy of the GNU General Public License 14 | along with this software; see the file COPYING. If not, write to 15 | the Free Software Foundation, Inc., 51 Franklin Street, 16 | Boston, MA 02110-1301, USA. 17 | -------------------------------------------------------------------------------- /MANIFEST.md: -------------------------------------------------------------------------------- 1 | title: gr-nacl 2 | brief: GNU Radio module for data encryption using NaCl library 3 | tags: 4 | - encryption 5 | author: 6 | - Stefan Wunsch 7 | copyright_owner: 8 | - Stefan Wunsch 9 | dependencies: 10 | - gnuradio 3.7.6.1 11 | - libsodium 12 | repo: https://github.com/stwunsch/gr-nacl 13 | icon: https://openclipart.org/image/300px/svg_to_png/204662/encryption2.png 14 | --- 15 | 16 | The gr-nacl module for GNU Radio provides functionality from the NaCl crypto library implemented with the fork libsodium. This contains public-key and secret-key encryption. The implementation is based on encryption of messages, which are passed in GNU Radio via the message system. Furthermore, a byte stream encryption method via tagged streams is implemented. 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | gr-nacl: GNU Radio data encryption module 2 | ======== 3 | GNU Radio module for data encryption using NaCl library 4 | 5 | **Features** 6 | The gr-nacl module for GNU Radio provides functionality from the NaCl crypto library implemented with the fork libsodium (see section 'Dependency' for more information). This contains public-key and secret-key encryption. The difference is explained, e.g., on Wikipedia [0]. The implementation is based on encryption of messages, which are passed in GNU Radio via the message system. Check out the GNU Radio documentation for further information [1]. Furthermore, a byte stream encryption method via tagged streams is implemented. 7 | 8 | The functionality can be tested with the example flowgraphs for GNU Radio Companion at the subfolder examples/ or directly with the provided test-cases for ctest. 9 | 10 | **Install guide (Linux)** 11 | Change to any folder in your home directory and enter following commands in your terminal. Check out the section 'Dependency' first. As well, you can install GNU Radio with PyBOMBS and use the provided install recipe for gr-nacl. The recipe builds and installs the dependency automatically. 12 | 13 | `git clone https://github.com/stwunsch/gr-nacl.git` // clone this repository 14 | `cd gr-nacl/` 15 | `mkdir build` // make build folder 16 | `cd build/` 17 | `cmake ../` // build makefiles 18 | `make` // build toolbox 19 | `ctest` // run tests, check if all have passed, the option -V provides an extended output 20 | `sudo make install` // install toolbox 21 | 22 | **Install guide (Mac OS X)** 23 | The following commands will work if you have installed Gnuradio and libsodium via Macports. 24 | Change to any folder in your home directory and enter following commands in your terminal. 25 | 26 | `git clone https://github.com/stwunsch/gr-nacl.git` // clone this repository 27 | `cd gr-nacl/` 28 | `mkdir build` // make build folder 29 | `cd build/` 30 | `cmake -DCMAKE_INSTALL_PREFIX:PATH=/opt/local ../` // build makefiles 31 | `make` // build toolbox 32 | `ctest` // run tests, check if all have passed, the option -V provides an extended output. This actually did not work for me 33 | `sudo make install` // install toolbox 34 | 35 | **Development platform** 36 | Ubuntu 15.04 37 | GNU Radio 3.7.6.1 38 | 39 | **Dependency** 40 | The NaCl (pronounced 'salt') crypto library [2] by Daniel J. Bernstein, Tanja Lange and Peter Schwabe has a well maintained fork called 'libsodium' [3]. Follow the instructions to build and install it. 41 | 42 | `git clone https://github.com/jedisct1/libsodium.git` // clone libsodium 43 | `cd libsodium/` 44 | `./autogen.sh` // build libsodium 45 | `./configure` 46 | `make` 47 | `sudo make install` // install libsodium 48 | 49 | **Contact** 50 | Stefan Wunsch 51 | stefan.wunsch[at]student.kit.edu 52 | 53 | **Links** 54 | [0] https://en.wikipedia.org/wiki/Public-key_cryptography, https://en.wikipedia.org/wiki/Symmetric-key_algorithm 55 | [1] http://gnuradio.org/doc/doxygen/, http://gnuradio.org/doc/doxygen/page_msg_passing.html, http://gnuradio.org/doc/doxygen/page_tagged_stream_blocks.html 56 | [2] http://nacl.cr.yp.to/ 57 | [3] http://doc.libsodium.org/, https://github.com/jedisct1/libsodium 58 | -------------------------------------------------------------------------------- /apps/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | include(GrPython) 21 | 22 | GR_PYTHON_INSTALL( 23 | PROGRAMS 24 | DESTINATION bin 25 | ) 26 | -------------------------------------------------------------------------------- /cmake/Modules/CMakeParseArgumentsCopy.cmake: -------------------------------------------------------------------------------- 1 | # CMAKE_PARSE_ARGUMENTS( args...) 2 | # 3 | # CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions for 4 | # parsing the arguments given to that macro or function. 5 | # It processes the arguments and defines a set of variables which hold the 6 | # values of the respective options. 7 | # 8 | # The argument contains all options for the respective macro, 9 | # i.e. keywords which can be used when calling the macro without any value 10 | # following, like e.g. the OPTIONAL keyword of the install() command. 11 | # 12 | # The argument contains all keywords for this macro 13 | # which are followed by one value, like e.g. DESTINATION keyword of the 14 | # install() command. 15 | # 16 | # The argument contains all keywords for this macro 17 | # which can be followed by more than one value, like e.g. the TARGETS or 18 | # FILES keywords of the install() command. 19 | # 20 | # When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the 21 | # keywords listed in , and 22 | # a variable composed of the given 23 | # followed by "_" and the name of the respective keyword. 24 | # These variables will then hold the respective value from the argument list. 25 | # For the keywords this will be TRUE or FALSE. 26 | # 27 | # All remaining arguments are collected in a variable 28 | # _UNPARSED_ARGUMENTS, this can be checked afterwards to see whether 29 | # your macro was called with unrecognized parameters. 30 | # 31 | # As an example here a my_install() macro, which takes similar arguments as the 32 | # real install() command: 33 | # 34 | # function(MY_INSTALL) 35 | # set(options OPTIONAL FAST) 36 | # set(oneValueArgs DESTINATION RENAME) 37 | # set(multiValueArgs TARGETS CONFIGURATIONS) 38 | # cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) 39 | # ... 40 | # 41 | # Assume my_install() has been called like this: 42 | # my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub) 43 | # 44 | # After the cmake_parse_arguments() call the macro will have set the following 45 | # variables: 46 | # MY_INSTALL_OPTIONAL = TRUE 47 | # MY_INSTALL_FAST = FALSE (this option was not used when calling my_install() 48 | # MY_INSTALL_DESTINATION = "bin" 49 | # MY_INSTALL_RENAME = "" (was not used) 50 | # MY_INSTALL_TARGETS = "foo;bar" 51 | # MY_INSTALL_CONFIGURATIONS = "" (was not used) 52 | # MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL" 53 | # 54 | # You can the continue and process these variables. 55 | # 56 | # Keywords terminate lists of values, e.g. if directly after a one_value_keyword 57 | # another recognized keyword follows, this is interpreted as the beginning of 58 | # the new option. 59 | # E.g. my_install(TARGETS foo DESTINATION OPTIONAL) would result in 60 | # MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION would 61 | # be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor. 62 | 63 | #============================================================================= 64 | # Copyright 2010 Alexander Neundorf 65 | # 66 | # Distributed under the OSI-approved BSD License (the "License"); 67 | # see accompanying file Copyright.txt for details. 68 | # 69 | # This software is distributed WITHOUT ANY WARRANTY; without even the 70 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 71 | # See the License for more information. 72 | #============================================================================= 73 | # (To distribute this file outside of CMake, substitute the full 74 | # License text for the above reference.) 75 | 76 | 77 | if(__CMAKE_PARSE_ARGUMENTS_INCLUDED) 78 | return() 79 | endif() 80 | set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE) 81 | 82 | 83 | function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames) 84 | # first set all result variables to empty/FALSE 85 | foreach(arg_name ${_singleArgNames} ${_multiArgNames}) 86 | set(${prefix}_${arg_name}) 87 | endforeach(arg_name) 88 | 89 | foreach(option ${_optionNames}) 90 | set(${prefix}_${option} FALSE) 91 | endforeach(option) 92 | 93 | set(${prefix}_UNPARSED_ARGUMENTS) 94 | 95 | set(insideValues FALSE) 96 | set(currentArgName) 97 | 98 | # now iterate over all arguments and fill the result variables 99 | foreach(currentArg ${ARGN}) 100 | list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword 101 | list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword 102 | list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword 103 | 104 | if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1) 105 | if(insideValues) 106 | if("${insideValues}" STREQUAL "SINGLE") 107 | set(${prefix}_${currentArgName} ${currentArg}) 108 | set(insideValues FALSE) 109 | elseif("${insideValues}" STREQUAL "MULTI") 110 | list(APPEND ${prefix}_${currentArgName} ${currentArg}) 111 | endif() 112 | else(insideValues) 113 | list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg}) 114 | endif(insideValues) 115 | else() 116 | if(NOT ${optionIndex} EQUAL -1) 117 | set(${prefix}_${currentArg} TRUE) 118 | set(insideValues FALSE) 119 | elseif(NOT ${singleArgIndex} EQUAL -1) 120 | set(currentArgName ${currentArg}) 121 | set(${prefix}_${currentArgName}) 122 | set(insideValues "SINGLE") 123 | elseif(NOT ${multiArgIndex} EQUAL -1) 124 | set(currentArgName ${currentArg}) 125 | set(${prefix}_${currentArgName}) 126 | set(insideValues "MULTI") 127 | endif() 128 | endif() 129 | 130 | endforeach(currentArg) 131 | 132 | # propagate the result variables to the caller: 133 | foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames}) 134 | set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE) 135 | endforeach(arg_name) 136 | set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE) 137 | 138 | endfunction(CMAKE_PARSE_ARGUMENTS _options _singleArgs _multiArgs) 139 | -------------------------------------------------------------------------------- /cmake/Modules/FindCppUnit.cmake: -------------------------------------------------------------------------------- 1 | # http://www.cmake.org/pipermail/cmake/2006-October/011446.html 2 | # Modified to use pkg config and use standard var names 3 | 4 | # 5 | # Find the CppUnit includes and library 6 | # 7 | # This module defines 8 | # CPPUNIT_INCLUDE_DIR, where to find tiff.h, etc. 9 | # CPPUNIT_LIBRARIES, the libraries to link against to use CppUnit. 10 | # CPPUNIT_FOUND, If false, do not try to use CppUnit. 11 | 12 | INCLUDE(FindPkgConfig) 13 | PKG_CHECK_MODULES(PC_CPPUNIT "cppunit") 14 | 15 | FIND_PATH(CPPUNIT_INCLUDE_DIRS 16 | NAMES cppunit/TestCase.h 17 | HINTS ${PC_CPPUNIT_INCLUDE_DIR} 18 | ${CMAKE_INSTALL_PREFIX}/include 19 | PATHS 20 | /usr/local/include 21 | /usr/include 22 | ) 23 | 24 | FIND_LIBRARY(CPPUNIT_LIBRARIES 25 | NAMES cppunit 26 | HINTS ${PC_CPPUNIT_LIBDIR} 27 | ${CMAKE_INSTALL_PREFIX}/lib 28 | ${CMAKE_INSTALL_PREFIX}/lib64 29 | PATHS 30 | ${CPPUNIT_INCLUDE_DIRS}/../lib 31 | /usr/local/lib 32 | /usr/lib 33 | ) 34 | 35 | LIST(APPEND CPPUNIT_LIBRARIES ${CMAKE_DL_LIBS}) 36 | 37 | INCLUDE(FindPackageHandleStandardArgs) 38 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(CPPUNIT DEFAULT_MSG CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS) 39 | MARK_AS_ADVANCED(CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS) 40 | -------------------------------------------------------------------------------- /cmake/Modules/FindGnuradioRuntime.cmake: -------------------------------------------------------------------------------- 1 | INCLUDE(FindPkgConfig) 2 | PKG_CHECK_MODULES(PC_GNURADIO_RUNTIME gnuradio-runtime) 3 | 4 | if(PC_GNURADIO_RUNTIME_FOUND) 5 | # look for include files 6 | FIND_PATH( 7 | GNURADIO_RUNTIME_INCLUDE_DIRS 8 | NAMES gnuradio/top_block.h 9 | HINTS $ENV{GNURADIO_RUNTIME_DIR}/include 10 | ${PC_GNURADIO_RUNTIME_INCLUDE_DIRS} 11 | ${CMAKE_INSTALL_PREFIX}/include 12 | PATHS /usr/local/include 13 | /usr/include 14 | ) 15 | 16 | # look for libs 17 | FIND_LIBRARY( 18 | GNURADIO_RUNTIME_LIBRARIES 19 | NAMES gnuradio-runtime 20 | HINTS $ENV{GNURADIO_RUNTIME_DIR}/lib 21 | ${PC_GNURADIO_RUNTIME_LIBDIR} 22 | ${CMAKE_INSTALL_PREFIX}/lib/ 23 | ${CMAKE_INSTALL_PREFIX}/lib64/ 24 | PATHS /usr/local/lib 25 | /usr/local/lib64 26 | /usr/lib 27 | /usr/lib64 28 | ) 29 | 30 | set(GNURADIO_RUNTIME_FOUND ${PC_GNURADIO_RUNTIME_FOUND}) 31 | endif(PC_GNURADIO_RUNTIME_FOUND) 32 | 33 | INCLUDE(FindPackageHandleStandardArgs) 34 | # do not check GNURADIO_RUNTIME_INCLUDE_DIRS, is not set when default include path us used. 35 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(GNURADIO_RUNTIME DEFAULT_MSG GNURADIO_RUNTIME_LIBRARIES) 36 | MARK_AS_ADVANCED(GNURADIO_RUNTIME_LIBRARIES GNURADIO_RUNTIME_INCLUDE_DIRS) 37 | -------------------------------------------------------------------------------- /cmake/Modules/FindSodium.cmake: -------------------------------------------------------------------------------- 1 | find_package(PkgConfig) 2 | pkg_check_modules(PC_SODIUM QUIET libsodium) 3 | 4 | find_path( 5 | SODIUM_INCLUDE_DIRS 6 | NAMES sodium.h 7 | HINTS ${PC_SODIUM_INCLUDEDIR} 8 | ${PC_SODIUM_INCLUDE_DIRS} 9 | PATH_SUFFIXES sodium 10 | ) 11 | 12 | if(APPLE) 13 | find_library( 14 | SODIUM_LIBRARIES 15 | NAMES libsodium.dylib 16 | HINTS ${PC_LIBXML_LIBDIR} 17 | ${PC_LIBXML_LIBRARY_DIRS} 18 | ) 19 | else(APPLE) 20 | find_library( 21 | SODIUM_LIBRARIES 22 | NAMES libsodium.so 23 | HINTS ${PC_LIBXML_LIBDIR} 24 | ${PC_LIBXML_LIBRARY_DIRS} 25 | ) 26 | endif(APPLE) 27 | 28 | #message(WARNING "SODIUM INCLUDE " ${SODIUM_INCLUDE_DIRS}) 29 | #message(WARNING "SODIUM LIBRARY " ${SODIUM_LIBRARIES}) 30 | 31 | if(SODIUM_LIBRARIES AND SODIUM_INCLUDE_DIRS) 32 | include(FindPackageHandleStandardArgs) 33 | find_package_handle_standard_args(SODIUM DEFAULT_MSG SODIUM_LIBRARIES SODIUM_INCLUDE_DIRS) 34 | mark_as_advanced(SODIUM_LIBRARIES SODIUM_INCLUDE_DIRS) 35 | else() 36 | message(FATAL_ERROR "Sodium is required, but was not found.") 37 | endif() 38 | -------------------------------------------------------------------------------- /cmake/Modules/GrPlatform.cmake: -------------------------------------------------------------------------------- 1 | # Copyright 2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | if(DEFINED __INCLUDED_GR_PLATFORM_CMAKE) 21 | return() 22 | endif() 23 | set(__INCLUDED_GR_PLATFORM_CMAKE TRUE) 24 | 25 | ######################################################################## 26 | # Setup additional defines for OS types 27 | ######################################################################## 28 | if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 29 | set(LINUX TRUE) 30 | endif() 31 | 32 | if(LINUX AND EXISTS "/etc/debian_version") 33 | set(DEBIAN TRUE) 34 | endif() 35 | 36 | if(LINUX AND EXISTS "/etc/redhat-release") 37 | set(REDHAT TRUE) 38 | endif() 39 | 40 | if(LINUX AND EXISTS "/etc/slackware-version") 41 | set(SLACKWARE TRUE) 42 | endif() 43 | 44 | ######################################################################## 45 | # when the library suffix should be 64 (applies to redhat linux family) 46 | ######################################################################## 47 | if (REDHAT OR SLACKWARE) 48 | set(LIB64_CONVENTION TRUE) 49 | endif() 50 | 51 | if(NOT DEFINED LIB_SUFFIX AND LIB64_CONVENTION AND CMAKE_SYSTEM_PROCESSOR MATCHES "64$") 52 | set(LIB_SUFFIX 64) 53 | endif() 54 | set(LIB_SUFFIX ${LIB_SUFFIX} CACHE STRING "lib directory suffix") 55 | -------------------------------------------------------------------------------- /cmake/Modules/GrPython.cmake: -------------------------------------------------------------------------------- 1 | # Copyright 2010-2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | if(DEFINED __INCLUDED_GR_PYTHON_CMAKE) 21 | return() 22 | endif() 23 | set(__INCLUDED_GR_PYTHON_CMAKE TRUE) 24 | 25 | ######################################################################## 26 | # Setup the python interpreter: 27 | # This allows the user to specify a specific interpreter, 28 | # or finds the interpreter via the built-in cmake module. 29 | ######################################################################## 30 | #this allows the user to override PYTHON_EXECUTABLE 31 | if(PYTHON_EXECUTABLE) 32 | 33 | set(PYTHONINTERP_FOUND TRUE) 34 | 35 | #otherwise if not set, try to automatically find it 36 | else(PYTHON_EXECUTABLE) 37 | 38 | #use the built-in find script 39 | find_package(PythonInterp 2) 40 | 41 | #and if that fails use the find program routine 42 | if(NOT PYTHONINTERP_FOUND) 43 | find_program(PYTHON_EXECUTABLE NAMES python python2 python2.7 python2.6 python2.5) 44 | if(PYTHON_EXECUTABLE) 45 | set(PYTHONINTERP_FOUND TRUE) 46 | endif(PYTHON_EXECUTABLE) 47 | endif(NOT PYTHONINTERP_FOUND) 48 | 49 | endif(PYTHON_EXECUTABLE) 50 | 51 | if (CMAKE_CROSSCOMPILING) 52 | set(QA_PYTHON_EXECUTABLE "/usr/bin/python") 53 | else (CMAKE_CROSSCOMPILING) 54 | set(QA_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE}) 55 | endif(CMAKE_CROSSCOMPILING) 56 | 57 | #make the path to the executable appear in the cmake gui 58 | set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter") 59 | set(QA_PYTHON_EXECUTABLE ${QA_PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter for QA tests") 60 | 61 | #make sure we can use -B with python (introduced in 2.6) 62 | if(PYTHON_EXECUTABLE) 63 | execute_process( 64 | COMMAND ${PYTHON_EXECUTABLE} -B -c "" 65 | OUTPUT_QUIET ERROR_QUIET 66 | RESULT_VARIABLE PYTHON_HAS_DASH_B_RESULT 67 | ) 68 | if(PYTHON_HAS_DASH_B_RESULT EQUAL 0) 69 | set(PYTHON_DASH_B "-B") 70 | endif() 71 | endif(PYTHON_EXECUTABLE) 72 | 73 | ######################################################################## 74 | # Check for the existence of a python module: 75 | # - desc a string description of the check 76 | # - mod the name of the module to import 77 | # - cmd an additional command to run 78 | # - have the result variable to set 79 | ######################################################################## 80 | macro(GR_PYTHON_CHECK_MODULE desc mod cmd have) 81 | message(STATUS "") 82 | message(STATUS "Python checking for ${desc}") 83 | execute_process( 84 | COMMAND ${PYTHON_EXECUTABLE} -c " 85 | ######################################### 86 | try: 87 | import ${mod} 88 | assert ${cmd} 89 | except ImportError, AssertionError: exit(-1) 90 | except: pass 91 | #########################################" 92 | RESULT_VARIABLE ${have} 93 | ) 94 | if(${have} EQUAL 0) 95 | message(STATUS "Python checking for ${desc} - found") 96 | set(${have} TRUE) 97 | else(${have} EQUAL 0) 98 | message(STATUS "Python checking for ${desc} - not found") 99 | set(${have} FALSE) 100 | endif(${have} EQUAL 0) 101 | endmacro(GR_PYTHON_CHECK_MODULE) 102 | 103 | ######################################################################## 104 | # Sets the python installation directory GR_PYTHON_DIR 105 | ######################################################################## 106 | if(NOT DEFINED GR_PYTHON_DIR) 107 | execute_process(COMMAND ${PYTHON_EXECUTABLE} -c " 108 | from distutils import sysconfig 109 | print sysconfig.get_python_lib(plat_specific=True, prefix='') 110 | " OUTPUT_VARIABLE GR_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE 111 | ) 112 | endif() 113 | file(TO_CMAKE_PATH ${GR_PYTHON_DIR} GR_PYTHON_DIR) 114 | 115 | ######################################################################## 116 | # Create an always-built target with a unique name 117 | # Usage: GR_UNIQUE_TARGET( ) 118 | ######################################################################## 119 | function(GR_UNIQUE_TARGET desc) 120 | file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}) 121 | execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib 122 | unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5] 123 | print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))" 124 | OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE) 125 | add_custom_target(${_target} ALL DEPENDS ${ARGN}) 126 | endfunction(GR_UNIQUE_TARGET) 127 | 128 | ######################################################################## 129 | # Install python sources (also builds and installs byte-compiled python) 130 | ######################################################################## 131 | function(GR_PYTHON_INSTALL) 132 | include(CMakeParseArgumentsCopy) 133 | CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN}) 134 | 135 | #################################################################### 136 | if(GR_PYTHON_INSTALL_FILES) 137 | #################################################################### 138 | install(${ARGN}) #installs regular python files 139 | 140 | #create a list of all generated files 141 | unset(pysrcfiles) 142 | unset(pycfiles) 143 | unset(pyofiles) 144 | foreach(pyfile ${GR_PYTHON_INSTALL_FILES}) 145 | get_filename_component(pyfile ${pyfile} ABSOLUTE) 146 | list(APPEND pysrcfiles ${pyfile}) 147 | 148 | #determine if this file is in the source or binary directory 149 | file(RELATIVE_PATH source_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${pyfile}) 150 | string(LENGTH "${source_rel_path}" source_rel_path_len) 151 | file(RELATIVE_PATH binary_rel_path ${CMAKE_CURRENT_BINARY_DIR} ${pyfile}) 152 | string(LENGTH "${binary_rel_path}" binary_rel_path_len) 153 | 154 | #and set the generated path appropriately 155 | if(${source_rel_path_len} GREATER ${binary_rel_path_len}) 156 | set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path}) 157 | else() 158 | set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path}) 159 | endif() 160 | list(APPEND pycfiles ${pygenfile}c) 161 | list(APPEND pyofiles ${pygenfile}o) 162 | 163 | #ensure generation path exists 164 | get_filename_component(pygen_path ${pygenfile} PATH) 165 | file(MAKE_DIRECTORY ${pygen_path}) 166 | 167 | endforeach(pyfile) 168 | 169 | #the command to generate the pyc files 170 | add_custom_command( 171 | DEPENDS ${pysrcfiles} OUTPUT ${pycfiles} 172 | COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pycfiles} 173 | ) 174 | 175 | #the command to generate the pyo files 176 | add_custom_command( 177 | DEPENDS ${pysrcfiles} OUTPUT ${pyofiles} 178 | COMMAND ${PYTHON_EXECUTABLE} -O ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pyofiles} 179 | ) 180 | 181 | #create install rule and add generated files to target list 182 | set(python_install_gen_targets ${pycfiles} ${pyofiles}) 183 | install(FILES ${python_install_gen_targets} 184 | DESTINATION ${GR_PYTHON_INSTALL_DESTINATION} 185 | COMPONENT ${GR_PYTHON_INSTALL_COMPONENT} 186 | ) 187 | 188 | 189 | #################################################################### 190 | elseif(GR_PYTHON_INSTALL_PROGRAMS) 191 | #################################################################### 192 | file(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native) 193 | 194 | if (CMAKE_CROSSCOMPILING) 195 | set(pyexe_native "/usr/bin/env python") 196 | endif() 197 | 198 | foreach(pyfile ${GR_PYTHON_INSTALL_PROGRAMS}) 199 | get_filename_component(pyfile_name ${pyfile} NAME) 200 | get_filename_component(pyfile ${pyfile} ABSOLUTE) 201 | string(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" pyexefile "${pyfile}.exe") 202 | list(APPEND python_install_gen_targets ${pyexefile}) 203 | 204 | get_filename_component(pyexefile_path ${pyexefile} PATH) 205 | file(MAKE_DIRECTORY ${pyexefile_path}) 206 | 207 | add_custom_command( 208 | OUTPUT ${pyexefile} DEPENDS ${pyfile} 209 | COMMAND ${PYTHON_EXECUTABLE} -c 210 | "open('${pyexefile}','w').write('\#!${pyexe_native}\\n'+open('${pyfile}').read())" 211 | COMMENT "Shebangin ${pyfile_name}" 212 | VERBATIM 213 | ) 214 | 215 | #on windows, python files need an extension to execute 216 | get_filename_component(pyfile_ext ${pyfile} EXT) 217 | if(WIN32 AND NOT pyfile_ext) 218 | set(pyfile_name "${pyfile_name}.py") 219 | endif() 220 | 221 | install(PROGRAMS ${pyexefile} RENAME ${pyfile_name} 222 | DESTINATION ${GR_PYTHON_INSTALL_DESTINATION} 223 | COMPONENT ${GR_PYTHON_INSTALL_COMPONENT} 224 | ) 225 | endforeach(pyfile) 226 | 227 | endif() 228 | 229 | GR_UNIQUE_TARGET("pygen" ${python_install_gen_targets}) 230 | 231 | endfunction(GR_PYTHON_INSTALL) 232 | 233 | ######################################################################## 234 | # Write the python helper script that generates byte code files 235 | ######################################################################## 236 | file(WRITE ${CMAKE_BINARY_DIR}/python_compile_helper.py " 237 | import sys, py_compile 238 | files = sys.argv[1:] 239 | srcs, gens = files[:len(files)/2], files[len(files)/2:] 240 | for src, gen in zip(srcs, gens): 241 | py_compile.compile(file=src, cfile=gen, doraise=True) 242 | ") 243 | -------------------------------------------------------------------------------- /cmake/Modules/GrSwig.cmake: -------------------------------------------------------------------------------- 1 | # Copyright 2010-2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | if(DEFINED __INCLUDED_GR_SWIG_CMAKE) 21 | return() 22 | endif() 23 | set(__INCLUDED_GR_SWIG_CMAKE TRUE) 24 | 25 | include(GrPython) 26 | 27 | ######################################################################## 28 | # Builds a swig documentation file to be generated into python docstrings 29 | # Usage: GR_SWIG_MAKE_DOCS(output_file input_path input_path....) 30 | # 31 | # Set the following variable to specify extra dependent targets: 32 | # - GR_SWIG_DOCS_SOURCE_DEPS 33 | # - GR_SWIG_DOCS_TARGET_DEPS 34 | ######################################################################## 35 | function(GR_SWIG_MAKE_DOCS output_file) 36 | if(ENABLE_DOXYGEN) 37 | 38 | #setup the input files variable list, quote formated 39 | set(input_files) 40 | unset(INPUT_PATHS) 41 | foreach(input_path ${ARGN}) 42 | if(IS_DIRECTORY ${input_path}) #when input path is a directory 43 | file(GLOB input_path_h_files ${input_path}/*.h) 44 | else() #otherwise its just a file, no glob 45 | set(input_path_h_files ${input_path}) 46 | endif() 47 | list(APPEND input_files ${input_path_h_files}) 48 | set(INPUT_PATHS "${INPUT_PATHS} \"${input_path}\"") 49 | endforeach(input_path) 50 | 51 | #determine the output directory 52 | get_filename_component(name ${output_file} NAME_WE) 53 | get_filename_component(OUTPUT_DIRECTORY ${output_file} PATH) 54 | set(OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/${name}_swig_docs) 55 | make_directory(${OUTPUT_DIRECTORY}) 56 | 57 | #generate the Doxyfile used by doxygen 58 | configure_file( 59 | ${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.swig_doc.in 60 | ${OUTPUT_DIRECTORY}/Doxyfile 61 | @ONLY) 62 | 63 | #Create a dummy custom command that depends on other targets 64 | include(GrMiscUtils) 65 | GR_GEN_TARGET_DEPS(_${name}_tag tag_deps ${GR_SWIG_DOCS_TARGET_DEPS}) 66 | 67 | #call doxygen on the Doxyfile + input headers 68 | add_custom_command( 69 | OUTPUT ${OUTPUT_DIRECTORY}/xml/index.xml 70 | DEPENDS ${input_files} ${GR_SWIG_DOCS_SOURCE_DEPS} ${tag_deps} 71 | COMMAND ${DOXYGEN_EXECUTABLE} ${OUTPUT_DIRECTORY}/Doxyfile 72 | COMMENT "Generating doxygen xml for ${name} docs" 73 | ) 74 | 75 | #call the swig_doc script on the xml files 76 | add_custom_command( 77 | OUTPUT ${output_file} 78 | DEPENDS ${input_files} ${stamp-file} ${OUTPUT_DIRECTORY}/xml/index.xml 79 | COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B} 80 | ${CMAKE_SOURCE_DIR}/docs/doxygen/swig_doc.py 81 | ${OUTPUT_DIRECTORY}/xml 82 | ${output_file} 83 | COMMENT "Generating python docstrings for ${name}" 84 | WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen 85 | ) 86 | 87 | else(ENABLE_DOXYGEN) 88 | file(WRITE ${output_file} "\n") #no doxygen -> empty file 89 | endif(ENABLE_DOXYGEN) 90 | endfunction(GR_SWIG_MAKE_DOCS) 91 | 92 | ######################################################################## 93 | # Build a swig target for the common gnuradio use case. Usage: 94 | # GR_SWIG_MAKE(target ifile ifile ifile...) 95 | # 96 | # Set the following variables before calling: 97 | # - GR_SWIG_FLAGS 98 | # - GR_SWIG_INCLUDE_DIRS 99 | # - GR_SWIG_LIBRARIES 100 | # - GR_SWIG_SOURCE_DEPS 101 | # - GR_SWIG_TARGET_DEPS 102 | # - GR_SWIG_DOC_FILE 103 | # - GR_SWIG_DOC_DIRS 104 | ######################################################################## 105 | macro(GR_SWIG_MAKE name) 106 | set(ifiles ${ARGN}) 107 | 108 | # Shimming this in here to take care of a SWIG bug with handling 109 | # vector and vector (on 32-bit machines) and 110 | # vector (on 64-bit machines). Use this to test 111 | # the size of size_t, then set SIZE_T_32 if it's a 32-bit machine 112 | # or not if it's 64-bit. The logic in gr_type.i handles the rest. 113 | INCLUDE(CheckTypeSize) 114 | CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T) 115 | CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT) 116 | if(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT}) 117 | list(APPEND GR_SWIG_FLAGS -DSIZE_T_32) 118 | endif(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT}) 119 | 120 | #do swig doc generation if specified 121 | if(GR_SWIG_DOC_FILE) 122 | set(GR_SWIG_DOCS_SOURCE_DEPS ${GR_SWIG_SOURCE_DEPS}) 123 | list(APPEND GR_SWIG_DOCS_TARGET_DEPS ${GR_SWIG_TARGET_DEPS}) 124 | GR_SWIG_MAKE_DOCS(${GR_SWIG_DOC_FILE} ${GR_SWIG_DOC_DIRS}) 125 | add_custom_target(${name}_swig_doc DEPENDS ${GR_SWIG_DOC_FILE}) 126 | list(APPEND GR_SWIG_TARGET_DEPS ${name}_swig_doc ${GR_RUNTIME_SWIG_DOC_FILE}) 127 | endif() 128 | 129 | #append additional include directories 130 | find_package(PythonLibs 2) 131 | list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_PATH}) #deprecated name (now dirs) 132 | list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS}) 133 | 134 | #prepend local swig directories 135 | list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_SOURCE_DIR}) 136 | list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_BINARY_DIR}) 137 | 138 | #determine include dependencies for swig file 139 | execute_process( 140 | COMMAND ${PYTHON_EXECUTABLE} 141 | ${CMAKE_BINARY_DIR}/get_swig_deps.py 142 | "${ifiles}" "${GR_SWIG_INCLUDE_DIRS}" 143 | OUTPUT_STRIP_TRAILING_WHITESPACE 144 | OUTPUT_VARIABLE SWIG_MODULE_${name}_EXTRA_DEPS 145 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 146 | ) 147 | 148 | #Create a dummy custom command that depends on other targets 149 | include(GrMiscUtils) 150 | GR_GEN_TARGET_DEPS(_${name}_swig_tag tag_deps ${GR_SWIG_TARGET_DEPS}) 151 | set(tag_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.tag) 152 | add_custom_command( 153 | OUTPUT ${tag_file} 154 | DEPENDS ${GR_SWIG_SOURCE_DEPS} ${tag_deps} 155 | COMMAND ${CMAKE_COMMAND} -E touch ${tag_file} 156 | ) 157 | 158 | #append the specified include directories 159 | include_directories(${GR_SWIG_INCLUDE_DIRS}) 160 | list(APPEND SWIG_MODULE_${name}_EXTRA_DEPS ${tag_file}) 161 | 162 | #setup the swig flags with flags and include directories 163 | set(CMAKE_SWIG_FLAGS -fvirtual -modern -keyword -w511 -module ${name} ${GR_SWIG_FLAGS}) 164 | foreach(dir ${GR_SWIG_INCLUDE_DIRS}) 165 | list(APPEND CMAKE_SWIG_FLAGS "-I${dir}") 166 | endforeach(dir) 167 | 168 | #set the C++ property on the swig .i file so it builds 169 | set_source_files_properties(${ifiles} PROPERTIES CPLUSPLUS ON) 170 | 171 | #setup the actual swig library target to be built 172 | include(UseSWIG) 173 | SWIG_ADD_MODULE(${name} python ${ifiles}) 174 | SWIG_LINK_LIBRARIES(${name} ${PYTHON_LIBRARIES} ${GR_SWIG_LIBRARIES}) 175 | if(${name} STREQUAL "runtime_swig") 176 | SET_TARGET_PROPERTIES(${SWIG_MODULE_runtime_swig_REAL_NAME} PROPERTIES DEFINE_SYMBOL "gnuradio_runtime_EXPORTS") 177 | endif(${name} STREQUAL "runtime_swig") 178 | 179 | endmacro(GR_SWIG_MAKE) 180 | 181 | ######################################################################## 182 | # Install swig targets generated by GR_SWIG_MAKE. Usage: 183 | # GR_SWIG_INSTALL( 184 | # TARGETS target target target... 185 | # [DESTINATION destination] 186 | # [COMPONENT component] 187 | # ) 188 | ######################################################################## 189 | macro(GR_SWIG_INSTALL) 190 | 191 | include(CMakeParseArgumentsCopy) 192 | CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN}) 193 | 194 | foreach(name ${GR_SWIG_INSTALL_TARGETS}) 195 | install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME} 196 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION} 197 | COMPONENT ${GR_SWIG_INSTALL_COMPONENT} 198 | ) 199 | 200 | include(GrPython) 201 | GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py 202 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION} 203 | COMPONENT ${GR_SWIG_INSTALL_COMPONENT} 204 | ) 205 | 206 | GR_LIBTOOL( 207 | TARGET ${SWIG_MODULE_${name}_REAL_NAME} 208 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION} 209 | ) 210 | 211 | endforeach(name) 212 | 213 | endmacro(GR_SWIG_INSTALL) 214 | 215 | ######################################################################## 216 | # Generate a python file that can determine swig dependencies. 217 | # Used by the make macro above to determine extra dependencies. 218 | # When you build C++, CMake figures out the header dependencies. 219 | # This code essentially performs that logic for swig includes. 220 | ######################################################################## 221 | file(WRITE ${CMAKE_BINARY_DIR}/get_swig_deps.py " 222 | 223 | import os, sys, re 224 | 225 | i_include_matcher = re.compile('%(include|import)\\s*[<|\"](.*)[>|\"]') 226 | h_include_matcher = re.compile('#(include)\\s*[<|\"](.*)[>|\"]') 227 | include_dirs = sys.argv[2].split(';') 228 | 229 | def get_swig_incs(file_path): 230 | if file_path.endswith('.i'): matcher = i_include_matcher 231 | else: matcher = h_include_matcher 232 | file_contents = open(file_path, 'r').read() 233 | return matcher.findall(file_contents, re.MULTILINE) 234 | 235 | def get_swig_deps(file_path, level): 236 | deps = [file_path] 237 | if level == 0: return deps 238 | for keyword, inc_file in get_swig_incs(file_path): 239 | for inc_dir in include_dirs: 240 | inc_path = os.path.join(inc_dir, inc_file) 241 | if not os.path.exists(inc_path): continue 242 | deps.extend(get_swig_deps(inc_path, level-1)) 243 | break #found, we dont search in lower prio inc dirs 244 | return deps 245 | 246 | if __name__ == '__main__': 247 | ifiles = sys.argv[1].split(';') 248 | deps = sum([get_swig_deps(ifile, 3) for ifile in ifiles], []) 249 | #sys.stderr.write(';'.join(set(deps)) + '\\n\\n') 250 | print(';'.join(set(deps))) 251 | ") 252 | -------------------------------------------------------------------------------- /cmake/Modules/GrTest.cmake: -------------------------------------------------------------------------------- 1 | # Copyright 2010-2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | if(DEFINED __INCLUDED_GR_TEST_CMAKE) 21 | return() 22 | endif() 23 | set(__INCLUDED_GR_TEST_CMAKE TRUE) 24 | 25 | ######################################################################## 26 | # Add a unit test and setup the environment for a unit test. 27 | # Takes the same arguments as the ADD_TEST function. 28 | # 29 | # Before calling set the following variables: 30 | # GR_TEST_TARGET_DEPS - built targets for the library path 31 | # GR_TEST_LIBRARY_DIRS - directories for the library path 32 | # GR_TEST_PYTHON_DIRS - directories for the python path 33 | # GR_TEST_ENVIRONS - other environment key/value pairs 34 | ######################################################################## 35 | function(GR_ADD_TEST test_name) 36 | 37 | #Ensure that the build exe also appears in the PATH. 38 | list(APPEND GR_TEST_TARGET_DEPS ${ARGN}) 39 | 40 | #In the land of windows, all libraries must be in the PATH. 41 | #Since the dependent libraries are not yet installed, 42 | #we must manually set them in the PATH to run tests. 43 | #The following appends the path of a target dependency. 44 | foreach(target ${GR_TEST_TARGET_DEPS}) 45 | get_target_property(location ${target} LOCATION) 46 | if(location) 47 | get_filename_component(path ${location} PATH) 48 | string(REGEX REPLACE "\\$\\(.*\\)" ${CMAKE_BUILD_TYPE} path ${path}) 49 | list(APPEND GR_TEST_LIBRARY_DIRS ${path}) 50 | endif(location) 51 | endforeach(target) 52 | 53 | if(WIN32) 54 | #SWIG generates the python library files into a subdirectory. 55 | #Therefore, we must append this subdirectory into PYTHONPATH. 56 | #Only do this for the python directories matching the following: 57 | foreach(pydir ${GR_TEST_PYTHON_DIRS}) 58 | get_filename_component(name ${pydir} NAME) 59 | if(name MATCHES "^(swig|lib|src)$") 60 | list(APPEND GR_TEST_PYTHON_DIRS ${pydir}/${CMAKE_BUILD_TYPE}) 61 | endif() 62 | endforeach(pydir) 63 | endif(WIN32) 64 | 65 | file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} srcdir) 66 | file(TO_NATIVE_PATH "${GR_TEST_LIBRARY_DIRS}" libpath) #ok to use on dir list? 67 | file(TO_NATIVE_PATH "${GR_TEST_PYTHON_DIRS}" pypath) #ok to use on dir list? 68 | 69 | set(environs "VOLK_GENERIC=1" "GR_DONT_LOAD_PREFS=1" "srcdir=${srcdir}") 70 | list(APPEND environs ${GR_TEST_ENVIRONS}) 71 | 72 | #http://www.cmake.org/pipermail/cmake/2009-May/029464.html 73 | #Replaced this add test + set environs code with the shell script generation. 74 | #Its nicer to be able to manually run the shell script to diagnose problems. 75 | #ADD_TEST(${ARGV}) 76 | #SET_TESTS_PROPERTIES(${test_name} PROPERTIES ENVIRONMENT "${environs}") 77 | 78 | if(UNIX) 79 | set(LD_PATH_VAR "LD_LIBRARY_PATH") 80 | if(APPLE) 81 | set(LD_PATH_VAR "DYLD_LIBRARY_PATH") 82 | endif() 83 | 84 | set(binpath "${CMAKE_CURRENT_BINARY_DIR}:$PATH") 85 | list(APPEND libpath "$${LD_PATH_VAR}") 86 | list(APPEND pypath "$PYTHONPATH") 87 | 88 | #replace list separator with the path separator 89 | string(REPLACE ";" ":" libpath "${libpath}") 90 | string(REPLACE ";" ":" pypath "${pypath}") 91 | list(APPEND environs "PATH=${binpath}" "${LD_PATH_VAR}=${libpath}" "PYTHONPATH=${pypath}") 92 | 93 | #generate a bat file that sets the environment and runs the test 94 | if (CMAKE_CROSSCOMPILING) 95 | set(SHELL "/bin/sh") 96 | else(CMAKE_CROSSCOMPILING) 97 | find_program(SHELL sh) 98 | endif(CMAKE_CROSSCOMPILING) 99 | set(sh_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.sh) 100 | file(WRITE ${sh_file} "#!${SHELL}\n") 101 | #each line sets an environment variable 102 | foreach(environ ${environs}) 103 | file(APPEND ${sh_file} "export ${environ}\n") 104 | endforeach(environ) 105 | #load the command to run with its arguments 106 | foreach(arg ${ARGN}) 107 | file(APPEND ${sh_file} "${arg} ") 108 | endforeach(arg) 109 | file(APPEND ${sh_file} "\n") 110 | 111 | #make the shell file executable 112 | execute_process(COMMAND chmod +x ${sh_file}) 113 | 114 | add_test(${test_name} ${SHELL} ${sh_file}) 115 | 116 | endif(UNIX) 117 | 118 | if(WIN32) 119 | list(APPEND libpath ${DLL_PATHS} "%PATH%") 120 | list(APPEND pypath "%PYTHONPATH%") 121 | 122 | #replace list separator with the path separator (escaped) 123 | string(REPLACE ";" "\\;" libpath "${libpath}") 124 | string(REPLACE ";" "\\;" pypath "${pypath}") 125 | list(APPEND environs "PATH=${libpath}" "PYTHONPATH=${pypath}") 126 | 127 | #generate a bat file that sets the environment and runs the test 128 | set(bat_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.bat) 129 | file(WRITE ${bat_file} "@echo off\n") 130 | #each line sets an environment variable 131 | foreach(environ ${environs}) 132 | file(APPEND ${bat_file} "SET ${environ}\n") 133 | endforeach(environ) 134 | #load the command to run with its arguments 135 | foreach(arg ${ARGN}) 136 | file(APPEND ${bat_file} "${arg} ") 137 | endforeach(arg) 138 | file(APPEND ${bat_file} "\n") 139 | 140 | add_test(${test_name} ${bat_file}) 141 | endif(WIN32) 142 | 143 | endfunction(GR_ADD_TEST) 144 | -------------------------------------------------------------------------------- /cmake/Modules/naclConfig.cmake: -------------------------------------------------------------------------------- 1 | INCLUDE(FindPkgConfig) 2 | PKG_CHECK_MODULES(PC_NACL nacl) 3 | 4 | FIND_PATH( 5 | NACL_INCLUDE_DIRS 6 | NAMES nacl/api.h 7 | HINTS $ENV{NACL_DIR}/include 8 | ${PC_NACL_INCLUDEDIR} 9 | PATHS ${CMAKE_INSTALL_PREFIX}/include 10 | /usr/local/include 11 | /usr/include 12 | ) 13 | 14 | FIND_LIBRARY( 15 | NACL_LIBRARIES 16 | NAMES gnuradio-nacl 17 | HINTS $ENV{NACL_DIR}/lib 18 | ${PC_NACL_LIBDIR} 19 | PATHS ${CMAKE_INSTALL_PREFIX}/lib 20 | ${CMAKE_INSTALL_PREFIX}/lib64 21 | /usr/local/lib 22 | /usr/local/lib64 23 | /usr/lib 24 | /usr/lib64 25 | ) 26 | 27 | INCLUDE(FindPackageHandleStandardArgs) 28 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(NACL DEFAULT_MSG NACL_LIBRARIES NACL_INCLUDE_DIRS) 29 | MARK_AS_ADVANCED(NACL_LIBRARIES NACL_INCLUDE_DIRS) 30 | -------------------------------------------------------------------------------- /cmake/cmake_uninstall.cmake.in: -------------------------------------------------------------------------------- 1 | # http://www.vtk.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F 2 | 3 | IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") 4 | MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") 5 | ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") 6 | 7 | FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) 8 | STRING(REGEX REPLACE "\n" ";" files "${files}") 9 | FOREACH(file ${files}) 10 | MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") 11 | IF(EXISTS "$ENV{DESTDIR}${file}") 12 | EXEC_PROGRAM( 13 | "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" 14 | OUTPUT_VARIABLE rm_out 15 | RETURN_VALUE rm_retval 16 | ) 17 | IF(NOT "${rm_retval}" STREQUAL 0) 18 | MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") 19 | ENDIF(NOT "${rm_retval}" STREQUAL 0) 20 | ELSEIF(IS_SYMLINK "$ENV{DESTDIR}${file}") 21 | EXEC_PROGRAM( 22 | "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" 23 | OUTPUT_VARIABLE rm_out 24 | RETURN_VALUE rm_retval 25 | ) 26 | IF(NOT "${rm_retval}" STREQUAL 0) 27 | MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") 28 | ENDIF(NOT "${rm_retval}" STREQUAL 0) 29 | ELSE(EXISTS "$ENV{DESTDIR}${file}") 30 | MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") 31 | ENDIF(EXISTS "$ENV{DESTDIR}${file}") 32 | ENDFOREACH(file) 33 | -------------------------------------------------------------------------------- /docs/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | ######################################################################## 21 | # Setup dependencies 22 | ######################################################################## 23 | find_package(Doxygen) 24 | 25 | ######################################################################## 26 | # Begin conditional configuration 27 | ######################################################################## 28 | if(ENABLE_DOXYGEN) 29 | 30 | ######################################################################## 31 | # Add subdirectories 32 | ######################################################################## 33 | add_subdirectory(doxygen) 34 | 35 | endif(ENABLE_DOXYGEN) 36 | -------------------------------------------------------------------------------- /docs/README.nacl: -------------------------------------------------------------------------------- 1 | This is the nacl-write-a-block package meant as a guide to building 2 | out-of-tree packages. To use the nacl blocks, the Python namespaces 3 | is in 'nacl', which is imported as: 4 | 5 | import nacl 6 | 7 | See the Doxygen documentation for details about the blocks available 8 | in this package. A quick listing of the details can be found in Python 9 | after importing by using: 10 | 11 | help(nacl) 12 | -------------------------------------------------------------------------------- /docs/doxygen/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | ######################################################################## 21 | # Create the doxygen configuration file 22 | ######################################################################## 23 | file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} top_srcdir) 24 | file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} top_builddir) 25 | file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} abs_top_srcdir) 26 | file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} abs_top_builddir) 27 | 28 | set(HAVE_DOT ${DOXYGEN_DOT_FOUND}) 29 | set(enable_html_docs YES) 30 | set(enable_latex_docs NO) 31 | set(enable_xml_docs YES) 32 | 33 | configure_file( 34 | ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in 35 | ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile 36 | @ONLY) 37 | 38 | set(BUILT_DIRS ${CMAKE_CURRENT_BINARY_DIR}/xml ${CMAKE_CURRENT_BINARY_DIR}/html) 39 | 40 | ######################################################################## 41 | # Make and install doxygen docs 42 | ######################################################################## 43 | add_custom_command( 44 | OUTPUT ${BUILT_DIRS} 45 | COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile 46 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 47 | COMMENT "Generating documentation with doxygen" 48 | ) 49 | 50 | add_custom_target(doxygen_target ALL DEPENDS ${BUILT_DIRS}) 51 | 52 | install(DIRECTORY ${BUILT_DIRS} DESTINATION ${GR_PKG_DOC_DIR}) 53 | -------------------------------------------------------------------------------- /docs/doxygen/doxyxml/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2010 Free Software Foundation, Inc. 3 | # 4 | # This file is part of GNU Radio 5 | # 6 | # GNU Radio is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3, or (at your option) 9 | # any later version. 10 | # 11 | # GNU Radio is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with GNU Radio; see the file COPYING. If not, write to 18 | # the Free Software Foundation, Inc., 51 Franklin Street, 19 | # Boston, MA 02110-1301, USA. 20 | # 21 | """ 22 | Python interface to contents of doxygen xml documentation. 23 | 24 | Example use: 25 | See the contents of the example folder for the C++ and 26 | doxygen-generated xml used in this example. 27 | 28 | >>> # Parse the doxygen docs. 29 | >>> import os 30 | >>> this_dir = os.path.dirname(globals()['__file__']) 31 | >>> xml_path = this_dir + "/example/xml/" 32 | >>> di = DoxyIndex(xml_path) 33 | 34 | Get a list of all top-level objects. 35 | 36 | >>> print([mem.name() for mem in di.members()]) 37 | [u'Aadvark', u'aadvarky_enough', u'main'] 38 | 39 | Get all functions. 40 | 41 | >>> print([mem.name() for mem in di.in_category(DoxyFunction)]) 42 | [u'aadvarky_enough', u'main'] 43 | 44 | Check if an object is present. 45 | 46 | >>> di.has_member(u'Aadvark') 47 | True 48 | >>> di.has_member(u'Fish') 49 | False 50 | 51 | Get an item by name and check its properties. 52 | 53 | >>> aad = di.get_member(u'Aadvark') 54 | >>> print(aad.brief_description) 55 | Models the mammal Aadvark. 56 | >>> print(aad.detailed_description) 57 | Sadly the model is incomplete and cannot capture all aspects of an aadvark yet. 58 | 59 | This line is uninformative and is only to test line breaks in the comments. 60 | >>> [mem.name() for mem in aad.members()] 61 | [u'aadvarkness', u'print', u'Aadvark', u'get_aadvarkness'] 62 | >>> aad.get_member(u'print').brief_description 63 | u'Outputs the vital aadvark statistics.' 64 | 65 | """ 66 | 67 | from doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther 68 | 69 | def _test(): 70 | import os 71 | this_dir = os.path.dirname(globals()['__file__']) 72 | xml_path = this_dir + "/example/xml/" 73 | di = DoxyIndex(xml_path) 74 | # Get the Aadvark class 75 | aad = di.get_member('Aadvark') 76 | aad.brief_description 77 | import doctest 78 | return doctest.testmod() 79 | 80 | if __name__ == "__main__": 81 | _test() 82 | 83 | -------------------------------------------------------------------------------- /docs/doxygen/doxyxml/base.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2010 Free Software Foundation, Inc. 3 | # 4 | # This file is part of GNU Radio 5 | # 6 | # GNU Radio is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3, or (at your option) 9 | # any later version. 10 | # 11 | # GNU Radio is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with GNU Radio; see the file COPYING. If not, write to 18 | # the Free Software Foundation, Inc., 51 Franklin Street, 19 | # Boston, MA 02110-1301, USA. 20 | # 21 | """ 22 | A base class is created. 23 | 24 | Classes based upon this are used to make more user-friendly interfaces 25 | to the doxygen xml docs than the generated classes provide. 26 | """ 27 | 28 | import os 29 | import pdb 30 | 31 | from xml.parsers.expat import ExpatError 32 | 33 | from generated import compound 34 | 35 | 36 | class Base(object): 37 | 38 | class Duplicate(StandardError): 39 | pass 40 | 41 | class NoSuchMember(StandardError): 42 | pass 43 | 44 | class ParsingError(StandardError): 45 | pass 46 | 47 | def __init__(self, parse_data, top=None): 48 | self._parsed = False 49 | self._error = False 50 | self._parse_data = parse_data 51 | self._members = [] 52 | self._dict_members = {} 53 | self._in_category = {} 54 | self._data = {} 55 | if top is not None: 56 | self._xml_path = top._xml_path 57 | # Set up holder of references 58 | else: 59 | top = self 60 | self._refs = {} 61 | self._xml_path = parse_data 62 | self.top = top 63 | 64 | @classmethod 65 | def from_refid(cls, refid, top=None): 66 | """ Instantiate class from a refid rather than parsing object. """ 67 | # First check to see if its already been instantiated. 68 | if top is not None and refid in top._refs: 69 | return top._refs[refid] 70 | # Otherwise create a new instance and set refid. 71 | inst = cls(None, top=top) 72 | inst.refid = refid 73 | inst.add_ref(inst) 74 | return inst 75 | 76 | @classmethod 77 | def from_parse_data(cls, parse_data, top=None): 78 | refid = getattr(parse_data, 'refid', None) 79 | if refid is not None and top is not None and refid in top._refs: 80 | return top._refs[refid] 81 | inst = cls(parse_data, top=top) 82 | if refid is not None: 83 | inst.refid = refid 84 | inst.add_ref(inst) 85 | return inst 86 | 87 | def add_ref(self, obj): 88 | if hasattr(obj, 'refid'): 89 | self.top._refs[obj.refid] = obj 90 | 91 | mem_classes = [] 92 | 93 | def get_cls(self, mem): 94 | for cls in self.mem_classes: 95 | if cls.can_parse(mem): 96 | return cls 97 | raise StandardError(("Did not find a class for object '%s'." \ 98 | % (mem.get_name()))) 99 | 100 | def convert_mem(self, mem): 101 | try: 102 | cls = self.get_cls(mem) 103 | converted = cls.from_parse_data(mem, self.top) 104 | if converted is None: 105 | raise StandardError('No class matched this object.') 106 | self.add_ref(converted) 107 | return converted 108 | except StandardError, e: 109 | print e 110 | 111 | @classmethod 112 | def includes(cls, inst): 113 | return isinstance(inst, cls) 114 | 115 | @classmethod 116 | def can_parse(cls, obj): 117 | return False 118 | 119 | def _parse(self): 120 | self._parsed = True 121 | 122 | def _get_dict_members(self, cat=None): 123 | """ 124 | For given category a dictionary is returned mapping member names to 125 | members of that category. For names that are duplicated the name is 126 | mapped to None. 127 | """ 128 | self.confirm_no_error() 129 | if cat not in self._dict_members: 130 | new_dict = {} 131 | for mem in self.in_category(cat): 132 | if mem.name() not in new_dict: 133 | new_dict[mem.name()] = mem 134 | else: 135 | new_dict[mem.name()] = self.Duplicate 136 | self._dict_members[cat] = new_dict 137 | return self._dict_members[cat] 138 | 139 | def in_category(self, cat): 140 | self.confirm_no_error() 141 | if cat is None: 142 | return self._members 143 | if cat not in self._in_category: 144 | self._in_category[cat] = [mem for mem in self._members 145 | if cat.includes(mem)] 146 | return self._in_category[cat] 147 | 148 | def get_member(self, name, cat=None): 149 | self.confirm_no_error() 150 | # Check if it's in a namespace or class. 151 | bits = name.split('::') 152 | first = bits[0] 153 | rest = '::'.join(bits[1:]) 154 | member = self._get_dict_members(cat).get(first, self.NoSuchMember) 155 | # Raise any errors that are returned. 156 | if member in set([self.NoSuchMember, self.Duplicate]): 157 | raise member() 158 | if rest: 159 | return member.get_member(rest, cat=cat) 160 | return member 161 | 162 | def has_member(self, name, cat=None): 163 | try: 164 | mem = self.get_member(name, cat=cat) 165 | return True 166 | except self.NoSuchMember: 167 | return False 168 | 169 | def data(self): 170 | self.confirm_no_error() 171 | return self._data 172 | 173 | def members(self): 174 | self.confirm_no_error() 175 | return self._members 176 | 177 | def process_memberdefs(self): 178 | mdtss = [] 179 | for sec in self._retrieved_data.compounddef.sectiondef: 180 | mdtss += sec.memberdef 181 | # At the moment we lose all information associated with sections. 182 | # Sometimes a memberdef is in several sectiondef. 183 | # We make sure we don't get duplicates here. 184 | uniques = set([]) 185 | for mem in mdtss: 186 | converted = self.convert_mem(mem) 187 | pair = (mem.name, mem.__class__) 188 | if pair not in uniques: 189 | uniques.add(pair) 190 | self._members.append(converted) 191 | 192 | def retrieve_data(self): 193 | filename = os.path.join(self._xml_path, self.refid + '.xml') 194 | try: 195 | self._retrieved_data = compound.parse(filename) 196 | except ExpatError: 197 | print('Error in xml in file %s' % filename) 198 | self._error = True 199 | self._retrieved_data = None 200 | 201 | def check_parsed(self): 202 | if not self._parsed: 203 | self._parse() 204 | 205 | def confirm_no_error(self): 206 | self.check_parsed() 207 | if self._error: 208 | raise self.ParsingError() 209 | 210 | def error(self): 211 | self.check_parsed() 212 | return self._error 213 | 214 | def name(self): 215 | # first see if we can do it without processing. 216 | if self._parse_data is not None: 217 | return self._parse_data.name 218 | self.check_parsed() 219 | return self._retrieved_data.compounddef.name 220 | -------------------------------------------------------------------------------- /docs/doxygen/doxyxml/doxyindex.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2010 Free Software Foundation, Inc. 3 | # 4 | # This file is part of GNU Radio 5 | # 6 | # GNU Radio is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3, or (at your option) 9 | # any later version. 10 | # 11 | # GNU Radio is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with GNU Radio; see the file COPYING. If not, write to 18 | # the Free Software Foundation, Inc., 51 Franklin Street, 19 | # Boston, MA 02110-1301, USA. 20 | # 21 | """ 22 | Classes providing more user-friendly interfaces to the doxygen xml 23 | docs than the generated classes provide. 24 | """ 25 | 26 | import os 27 | 28 | from generated import index 29 | from base import Base 30 | from text import description 31 | 32 | class DoxyIndex(Base): 33 | """ 34 | Parses a doxygen xml directory. 35 | """ 36 | 37 | __module__ = "gnuradio.utils.doxyxml" 38 | 39 | def _parse(self): 40 | if self._parsed: 41 | return 42 | super(DoxyIndex, self)._parse() 43 | self._root = index.parse(os.path.join(self._xml_path, 'index.xml')) 44 | for mem in self._root.compound: 45 | converted = self.convert_mem(mem) 46 | # For files we want the contents to be accessible directly 47 | # from the parent rather than having to go through the file 48 | # object. 49 | if self.get_cls(mem) == DoxyFile: 50 | if mem.name.endswith('.h'): 51 | self._members += converted.members() 52 | self._members.append(converted) 53 | else: 54 | self._members.append(converted) 55 | 56 | 57 | def generate_swig_doc_i(self): 58 | """ 59 | %feature("docstring") gr_make_align_on_samplenumbers_ss::align_state " 60 | Wraps the C++: gr_align_on_samplenumbers_ss::align_state"; 61 | """ 62 | pass 63 | 64 | 65 | class DoxyCompMem(Base): 66 | 67 | 68 | kind = None 69 | 70 | def __init__(self, *args, **kwargs): 71 | super(DoxyCompMem, self).__init__(*args, **kwargs) 72 | 73 | @classmethod 74 | def can_parse(cls, obj): 75 | return obj.kind == cls.kind 76 | 77 | def set_descriptions(self, parse_data): 78 | bd = description(getattr(parse_data, 'briefdescription', None)) 79 | dd = description(getattr(parse_data, 'detaileddescription', None)) 80 | self._data['brief_description'] = bd 81 | self._data['detailed_description'] = dd 82 | 83 | class DoxyCompound(DoxyCompMem): 84 | pass 85 | 86 | class DoxyMember(DoxyCompMem): 87 | pass 88 | 89 | 90 | class DoxyFunction(DoxyMember): 91 | 92 | __module__ = "gnuradio.utils.doxyxml" 93 | 94 | kind = 'function' 95 | 96 | def _parse(self): 97 | if self._parsed: 98 | return 99 | super(DoxyFunction, self)._parse() 100 | self.set_descriptions(self._parse_data) 101 | self._data['params'] = [] 102 | prms = self._parse_data.param 103 | for prm in prms: 104 | self._data['params'].append(DoxyParam(prm)) 105 | 106 | brief_description = property(lambda self: self.data()['brief_description']) 107 | detailed_description = property(lambda self: self.data()['detailed_description']) 108 | params = property(lambda self: self.data()['params']) 109 | 110 | Base.mem_classes.append(DoxyFunction) 111 | 112 | 113 | class DoxyParam(DoxyMember): 114 | 115 | __module__ = "gnuradio.utils.doxyxml" 116 | 117 | def _parse(self): 118 | if self._parsed: 119 | return 120 | super(DoxyParam, self)._parse() 121 | self.set_descriptions(self._parse_data) 122 | self._data['declname'] = self._parse_data.declname 123 | 124 | brief_description = property(lambda self: self.data()['brief_description']) 125 | detailed_description = property(lambda self: self.data()['detailed_description']) 126 | declname = property(lambda self: self.data()['declname']) 127 | 128 | class DoxyClass(DoxyCompound): 129 | 130 | __module__ = "gnuradio.utils.doxyxml" 131 | 132 | kind = 'class' 133 | 134 | def _parse(self): 135 | if self._parsed: 136 | return 137 | super(DoxyClass, self)._parse() 138 | self.retrieve_data() 139 | if self._error: 140 | return 141 | self.set_descriptions(self._retrieved_data.compounddef) 142 | # Sectiondef.kind tells about whether private or public. 143 | # We just ignore this for now. 144 | self.process_memberdefs() 145 | 146 | brief_description = property(lambda self: self.data()['brief_description']) 147 | detailed_description = property(lambda self: self.data()['detailed_description']) 148 | 149 | Base.mem_classes.append(DoxyClass) 150 | 151 | 152 | class DoxyFile(DoxyCompound): 153 | 154 | __module__ = "gnuradio.utils.doxyxml" 155 | 156 | kind = 'file' 157 | 158 | def _parse(self): 159 | if self._parsed: 160 | return 161 | super(DoxyFile, self)._parse() 162 | self.retrieve_data() 163 | self.set_descriptions(self._retrieved_data.compounddef) 164 | if self._error: 165 | return 166 | self.process_memberdefs() 167 | 168 | brief_description = property(lambda self: self.data()['brief_description']) 169 | detailed_description = property(lambda self: self.data()['detailed_description']) 170 | 171 | Base.mem_classes.append(DoxyFile) 172 | 173 | 174 | class DoxyNamespace(DoxyCompound): 175 | 176 | __module__ = "gnuradio.utils.doxyxml" 177 | 178 | kind = 'namespace' 179 | 180 | Base.mem_classes.append(DoxyNamespace) 181 | 182 | 183 | class DoxyGroup(DoxyCompound): 184 | 185 | __module__ = "gnuradio.utils.doxyxml" 186 | 187 | kind = 'group' 188 | 189 | def _parse(self): 190 | if self._parsed: 191 | return 192 | super(DoxyGroup, self)._parse() 193 | self.retrieve_data() 194 | if self._error: 195 | return 196 | cdef = self._retrieved_data.compounddef 197 | self._data['title'] = description(cdef.title) 198 | # Process inner groups 199 | grps = cdef.innergroup 200 | for grp in grps: 201 | converted = DoxyGroup.from_refid(grp.refid, top=self.top) 202 | self._members.append(converted) 203 | # Process inner classes 204 | klasses = cdef.innerclass 205 | for kls in klasses: 206 | converted = DoxyClass.from_refid(kls.refid, top=self.top) 207 | self._members.append(converted) 208 | # Process normal members 209 | self.process_memberdefs() 210 | 211 | title = property(lambda self: self.data()['title']) 212 | 213 | 214 | Base.mem_classes.append(DoxyGroup) 215 | 216 | 217 | class DoxyFriend(DoxyMember): 218 | 219 | __module__ = "gnuradio.utils.doxyxml" 220 | 221 | kind = 'friend' 222 | 223 | Base.mem_classes.append(DoxyFriend) 224 | 225 | 226 | class DoxyOther(Base): 227 | 228 | __module__ = "gnuradio.utils.doxyxml" 229 | 230 | kinds = set(['variable', 'struct', 'union', 'define', 'typedef', 'enum', 'dir', 'page']) 231 | 232 | @classmethod 233 | def can_parse(cls, obj): 234 | return obj.kind in cls.kinds 235 | 236 | Base.mem_classes.append(DoxyOther) 237 | 238 | -------------------------------------------------------------------------------- /docs/doxygen/doxyxml/generated/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Contains generated files produced by generateDS.py. 3 | 4 | These do the real work of parsing the doxygen xml files but the 5 | resultant classes are not very friendly to navigate so the rest of the 6 | doxyxml module processes them further. 7 | """ 8 | -------------------------------------------------------------------------------- /docs/doxygen/doxyxml/generated/index.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ 4 | Generated Mon Feb 9 19:08:05 2009 by generateDS.py. 5 | """ 6 | 7 | from xml.dom import minidom 8 | 9 | import os 10 | import sys 11 | import compound 12 | 13 | import indexsuper as supermod 14 | 15 | class DoxygenTypeSub(supermod.DoxygenType): 16 | def __init__(self, version=None, compound=None): 17 | supermod.DoxygenType.__init__(self, version, compound) 18 | 19 | def find_compounds_and_members(self, details): 20 | """ 21 | Returns a list of all compounds and their members which match details 22 | """ 23 | 24 | results = [] 25 | for compound in self.compound: 26 | members = compound.find_members(details) 27 | if members: 28 | results.append([compound, members]) 29 | else: 30 | if details.match(compound): 31 | results.append([compound, []]) 32 | 33 | return results 34 | 35 | supermod.DoxygenType.subclass = DoxygenTypeSub 36 | # end class DoxygenTypeSub 37 | 38 | 39 | class CompoundTypeSub(supermod.CompoundType): 40 | def __init__(self, kind=None, refid=None, name='', member=None): 41 | supermod.CompoundType.__init__(self, kind, refid, name, member) 42 | 43 | def find_members(self, details): 44 | """ 45 | Returns a list of all members which match details 46 | """ 47 | 48 | results = [] 49 | 50 | for member in self.member: 51 | if details.match(member): 52 | results.append(member) 53 | 54 | return results 55 | 56 | supermod.CompoundType.subclass = CompoundTypeSub 57 | # end class CompoundTypeSub 58 | 59 | 60 | class MemberTypeSub(supermod.MemberType): 61 | 62 | def __init__(self, kind=None, refid=None, name=''): 63 | supermod.MemberType.__init__(self, kind, refid, name) 64 | 65 | supermod.MemberType.subclass = MemberTypeSub 66 | # end class MemberTypeSub 67 | 68 | 69 | def parse(inFilename): 70 | 71 | doc = minidom.parse(inFilename) 72 | rootNode = doc.documentElement 73 | rootObj = supermod.DoxygenType.factory() 74 | rootObj.build(rootNode) 75 | 76 | return rootObj 77 | 78 | -------------------------------------------------------------------------------- /docs/doxygen/doxyxml/text.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2010 Free Software Foundation, Inc. 3 | # 4 | # This file is part of GNU Radio 5 | # 6 | # GNU Radio is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3, or (at your option) 9 | # any later version. 10 | # 11 | # GNU Radio is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with GNU Radio; see the file COPYING. If not, write to 18 | # the Free Software Foundation, Inc., 51 Franklin Street, 19 | # Boston, MA 02110-1301, USA. 20 | # 21 | """ 22 | Utilities for extracting text from generated classes. 23 | """ 24 | 25 | def is_string(txt): 26 | if isinstance(txt, str): 27 | return True 28 | try: 29 | if isinstance(txt, unicode): 30 | return True 31 | except NameError: 32 | pass 33 | return False 34 | 35 | def description(obj): 36 | if obj is None: 37 | return None 38 | return description_bit(obj).strip() 39 | 40 | def description_bit(obj): 41 | if hasattr(obj, 'content'): 42 | contents = [description_bit(item) for item in obj.content] 43 | result = ''.join(contents) 44 | elif hasattr(obj, 'content_'): 45 | contents = [description_bit(item) for item in obj.content_] 46 | result = ''.join(contents) 47 | elif hasattr(obj, 'value'): 48 | result = description_bit(obj.value) 49 | elif is_string(obj): 50 | return obj 51 | else: 52 | raise StandardError('Expecting a string or something with content, content_ or value attribute') 53 | # If this bit is a paragraph then add one some line breaks. 54 | if hasattr(obj, 'name') and obj.name == 'para': 55 | result += "\n\n" 56 | return result 57 | -------------------------------------------------------------------------------- /docs/doxygen/other/group_defs.dox: -------------------------------------------------------------------------------- 1 | /*! 2 | * \defgroup block GNU Radio NACL C++ Signal Processing Blocks 3 | * \brief All C++ blocks that can be used from the NACL GNU Radio 4 | * module are listed here or in the subcategories below. 5 | * 6 | */ 7 | 8 | -------------------------------------------------------------------------------- /docs/doxygen/other/main_page.dox: -------------------------------------------------------------------------------- 1 | /*! \mainpage 2 | 3 | Welcome to the GNU Radio NACL Block 4 | 5 | This is the intro page for the Doxygen manual generated for the NACL 6 | block (docs/doxygen/other/main_page.dox). Edit it to add more detailed 7 | documentation about the new GNU Radio modules contained in this 8 | project. 9 | 10 | */ 11 | -------------------------------------------------------------------------------- /docs/doxygen/swig_doc.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2010,2011 Free Software Foundation, Inc. 3 | # 4 | # This file is part of GNU Radio 5 | # 6 | # GNU Radio is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3, or (at your option) 9 | # any later version. 10 | # 11 | # GNU Radio is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with GNU Radio; see the file COPYING. If not, write to 18 | # the Free Software Foundation, Inc., 51 Franklin Street, 19 | # Boston, MA 02110-1301, USA. 20 | # 21 | """ 22 | Creates the swig_doc.i SWIG interface file. 23 | Execute using: python swig_doc.py xml_path outputfilename 24 | 25 | The file instructs SWIG to transfer the doxygen comments into the 26 | python docstrings. 27 | 28 | """ 29 | 30 | import sys 31 | 32 | try: 33 | from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base 34 | except ImportError: 35 | from gnuradio.doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base 36 | 37 | 38 | def py_name(name): 39 | bits = name.split('_') 40 | return '_'.join(bits[1:]) 41 | 42 | def make_name(name): 43 | bits = name.split('_') 44 | return bits[0] + '_make_' + '_'.join(bits[1:]) 45 | 46 | 47 | class Block(object): 48 | """ 49 | Checks if doxyxml produced objects correspond to a gnuradio block. 50 | """ 51 | 52 | @classmethod 53 | def includes(cls, item): 54 | if not isinstance(item, DoxyClass): 55 | return False 56 | # Check for a parsing error. 57 | if item.error(): 58 | return False 59 | return item.has_member(make_name(item.name()), DoxyFriend) 60 | 61 | 62 | def utoascii(text): 63 | """ 64 | Convert unicode text into ascii and escape quotes. 65 | """ 66 | if text is None: 67 | return '' 68 | out = text.encode('ascii', 'replace') 69 | out = out.replace('"', '\\"') 70 | return out 71 | 72 | 73 | def combine_descriptions(obj): 74 | """ 75 | Combines the brief and detailed descriptions of an object together. 76 | """ 77 | description = [] 78 | bd = obj.brief_description.strip() 79 | dd = obj.detailed_description.strip() 80 | if bd: 81 | description.append(bd) 82 | if dd: 83 | description.append(dd) 84 | return utoascii('\n\n'.join(description)).strip() 85 | 86 | 87 | entry_templ = '%feature("docstring") {name} "{docstring}"' 88 | def make_entry(obj, name=None, templ="{description}", description=None): 89 | """ 90 | Create a docstring entry for a swig interface file. 91 | 92 | obj - a doxyxml object from which documentation will be extracted. 93 | name - the name of the C object (defaults to obj.name()) 94 | templ - an optional template for the docstring containing only one 95 | variable named 'description'. 96 | description - if this optional variable is set then it's value is 97 | used as the description instead of extracting it from obj. 98 | """ 99 | if name is None: 100 | name=obj.name() 101 | if "operator " in name: 102 | return '' 103 | if description is None: 104 | description = combine_descriptions(obj) 105 | docstring = templ.format(description=description) 106 | if not docstring: 107 | return '' 108 | return entry_templ.format( 109 | name=name, 110 | docstring=docstring, 111 | ) 112 | 113 | 114 | def make_func_entry(func, name=None, description=None, params=None): 115 | """ 116 | Create a function docstring entry for a swig interface file. 117 | 118 | func - a doxyxml object from which documentation will be extracted. 119 | name - the name of the C object (defaults to func.name()) 120 | description - if this optional variable is set then it's value is 121 | used as the description instead of extracting it from func. 122 | params - a parameter list that overrides using func.params. 123 | """ 124 | if params is None: 125 | params = func.params 126 | params = [prm.declname for prm in params] 127 | if params: 128 | sig = "Params: (%s)" % ", ".join(params) 129 | else: 130 | sig = "Params: (NONE)" 131 | templ = "{description}\n\n" + sig 132 | return make_entry(func, name=name, templ=utoascii(templ), 133 | description=description) 134 | 135 | 136 | def make_class_entry(klass, description=None): 137 | """ 138 | Create a class docstring for a swig interface file. 139 | """ 140 | output = [] 141 | output.append(make_entry(klass, description=description)) 142 | for func in klass.in_category(DoxyFunction): 143 | name = klass.name() + '::' + func.name() 144 | output.append(make_func_entry(func, name=name)) 145 | return "\n\n".join(output) 146 | 147 | 148 | def make_block_entry(di, block): 149 | """ 150 | Create class and function docstrings of a gnuradio block for a 151 | swig interface file. 152 | """ 153 | descriptions = [] 154 | # Get the documentation associated with the class. 155 | class_desc = combine_descriptions(block) 156 | if class_desc: 157 | descriptions.append(class_desc) 158 | # Get the documentation associated with the make function 159 | make_func = di.get_member(make_name(block.name()), DoxyFunction) 160 | make_func_desc = combine_descriptions(make_func) 161 | if make_func_desc: 162 | descriptions.append(make_func_desc) 163 | # Get the documentation associated with the file 164 | try: 165 | block_file = di.get_member(block.name() + ".h", DoxyFile) 166 | file_desc = combine_descriptions(block_file) 167 | if file_desc: 168 | descriptions.append(file_desc) 169 | except base.Base.NoSuchMember: 170 | # Don't worry if we can't find a matching file. 171 | pass 172 | # And join them all together to make a super duper description. 173 | super_description = "\n\n".join(descriptions) 174 | # Associate the combined description with the class and 175 | # the make function. 176 | output = [] 177 | output.append(make_class_entry(block, description=super_description)) 178 | creator = block.get_member(block.name(), DoxyFunction) 179 | output.append(make_func_entry(make_func, description=super_description, 180 | params=creator.params)) 181 | return "\n\n".join(output) 182 | 183 | 184 | def make_swig_interface_file(di, swigdocfilename, custom_output=None): 185 | 186 | output = [""" 187 | /* 188 | * This file was automatically generated using swig_doc.py. 189 | * 190 | * Any changes to it will be lost next time it is regenerated. 191 | */ 192 | """] 193 | 194 | if custom_output is not None: 195 | output.append(custom_output) 196 | 197 | # Create docstrings for the blocks. 198 | blocks = di.in_category(Block) 199 | make_funcs = set([]) 200 | for block in blocks: 201 | try: 202 | make_func = di.get_member(make_name(block.name()), DoxyFunction) 203 | make_funcs.add(make_func.name()) 204 | output.append(make_block_entry(di, block)) 205 | except block.ParsingError: 206 | print('Parsing error for block %s' % block.name()) 207 | 208 | # Create docstrings for functions 209 | # Don't include the make functions since they have already been dealt with. 210 | funcs = [f for f in di.in_category(DoxyFunction) if f.name() not in make_funcs] 211 | for f in funcs: 212 | try: 213 | output.append(make_func_entry(f)) 214 | except f.ParsingError: 215 | print('Parsing error for function %s' % f.name()) 216 | 217 | # Create docstrings for classes 218 | block_names = [block.name() for block in blocks] 219 | klasses = [k for k in di.in_category(DoxyClass) if k.name() not in block_names] 220 | for k in klasses: 221 | try: 222 | output.append(make_class_entry(k)) 223 | except k.ParsingError: 224 | print('Parsing error for class %s' % k.name()) 225 | 226 | # Docstrings are not created for anything that is not a function or a class. 227 | # If this excludes anything important please add it here. 228 | 229 | output = "\n\n".join(output) 230 | 231 | swig_doc = file(swigdocfilename, 'w') 232 | swig_doc.write(output) 233 | swig_doc.close() 234 | 235 | if __name__ == "__main__": 236 | # Parse command line options and set up doxyxml. 237 | err_msg = "Execute using: python swig_doc.py xml_path outputfilename" 238 | if len(sys.argv) != 3: 239 | raise StandardError(err_msg) 240 | xml_path = sys.argv[1] 241 | swigdocfilename = sys.argv[2] 242 | di = DoxyIndex(xml_path) 243 | 244 | # gnuradio.gr.msq_queue.insert_tail and delete_head create errors unless docstrings are defined! 245 | # This is presumably a bug in SWIG. 246 | #msg_q = di.get_member(u'gr_msg_queue', DoxyClass) 247 | #insert_tail = msg_q.get_member(u'insert_tail', DoxyFunction) 248 | #delete_head = msg_q.get_member(u'delete_head', DoxyFunction) 249 | output = [] 250 | #output.append(make_func_entry(insert_tail, name='gr_py_msg_queue__insert_tail')) 251 | #output.append(make_func_entry(delete_head, name='gr_py_msg_queue__delete_head')) 252 | custom_output = "\n\n".join(output) 253 | 254 | # Generate the docstrings interface file. 255 | make_swig_interface_file(di, swigdocfilename, custom_output=custom_output) 256 | -------------------------------------------------------------------------------- /examples/README: -------------------------------------------------------------------------------- 1 | Given examples: 2 | 3 | 1) Public-key encryption 4 | This means that the message is encrypted with the public-key of the addressee and signed with the private key of the sender. Decryption is done with the secret key of the addressee and the message is authenticated with the public key of the sender. 5 | All information is passed with the GNU Radio message system. 6 | 7 | 2) Secret-key encryption 8 | The secret-key encryption is like encryption via password. A single key for sender and addressee is used for encryption. 9 | The information is passed like the public-key encryption via the message system. 10 | 11 | 3) Stream encryption 12 | The stream encryption is done via a stream cipher. The stream cipher is generated with a nonce and a secret key. The nonce can be rotated after every data block. 13 | The information is passed as a tagged stream (see GNU Radio documentation). 14 | -------------------------------------------------------------------------------- /examples/arch_makepkg/PKGBUILD: -------------------------------------------------------------------------------- 1 | pkgname=gr-nacl 2 | _gitname=gr-nacl 3 | pkgver=git 4 | pkgrel=1 5 | pkgdesc="GNU Radio module for data encryption using NaCl library" 6 | arch=('x86_64') 7 | license=('GPL') 8 | depends=('libsodium') 9 | makedepends=('git' 'cmake' 'make') 10 | optdepends=() 11 | source=("git://github.com/stwunsch/gr-nacl") 12 | md5sums=('SKIP') 13 | conflicts=() 14 | provides=() 15 | 16 | build() { 17 | mkdir -p $_gitname/build 18 | cd $_gitname/build 19 | pwd 20 | cmake .. 21 | make -j4 22 | } 23 | 24 | package() { 25 | cd "$srcdir/$_gitname/build" 26 | make DESTDIR="$pkgdir" install 27 | } 28 | -------------------------------------------------------------------------------- /examples/generate_key.grc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Tue Apr 14 18:15:30 2015 5 | 6 | options 7 | 8 | id 9 | top_block 10 | 11 | 12 | _enabled 13 | True 14 | 15 | 16 | title 17 | 18 | 19 | 20 | author 21 | 22 | 23 | 24 | description 25 | 26 | 27 | 28 | window_size 29 | 1280, 1024 30 | 31 | 32 | generate_options 33 | qt_gui 34 | 35 | 36 | category 37 | Custom 38 | 39 | 40 | run_options 41 | prompt 42 | 43 | 44 | run 45 | True 46 | 47 | 48 | max_nouts 49 | 0 50 | 51 | 52 | realtime_scheduling 53 | 54 | 55 | 56 | alias 57 | 58 | 59 | 60 | _coordinate 61 | (10, 10) 62 | 63 | 64 | _rotation 65 | 0 66 | 67 | 68 | 69 | variable 70 | 71 | id 72 | samp_rate 73 | 74 | 75 | _enabled 76 | True 77 | 78 | 79 | value 80 | 32000 81 | 82 | 83 | alias 84 | 85 | 86 | 87 | _coordinate 88 | (10, 170) 89 | 90 | 91 | _rotation 92 | 0 93 | 94 | 95 | 96 | nacl_generate_key 97 | 98 | id 99 | nacl_generate_key_0 100 | 101 | 102 | _enabled 103 | True 104 | 105 | 106 | filename_key 107 | "test.key" 108 | 109 | 110 | alias 111 | 112 | 113 | 114 | _coordinate 115 | (184, 259) 116 | 117 | 118 | _rotation 119 | 0 120 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /examples/generate_keypair.grc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sun Apr 5 20:23:17 2015 5 | 6 | options 7 | 8 | id 9 | top_block 10 | 11 | 12 | _enabled 13 | True 14 | 15 | 16 | title 17 | 18 | 19 | 20 | author 21 | 22 | 23 | 24 | description 25 | 26 | 27 | 28 | window_size 29 | 1280, 1024 30 | 31 | 32 | generate_options 33 | qt_gui 34 | 35 | 36 | category 37 | Custom 38 | 39 | 40 | run_options 41 | prompt 42 | 43 | 44 | run 45 | True 46 | 47 | 48 | max_nouts 49 | 0 50 | 51 | 52 | realtime_scheduling 53 | 54 | 55 | 56 | alias 57 | 58 | 59 | 60 | _coordinate 61 | (10, 10) 62 | 63 | 64 | _rotation 65 | 0 66 | 67 | 68 | 69 | variable 70 | 71 | id 72 | samp_rate 73 | 74 | 75 | _enabled 76 | True 77 | 78 | 79 | value 80 | 32000 81 | 82 | 83 | alias 84 | 85 | 86 | 87 | _coordinate 88 | (8, 171) 89 | 90 | 91 | _rotation 92 | 0 93 | 94 | 95 | 96 | nacl_generate_keypair 97 | 98 | id 99 | nacl_generate_keypair_0 100 | 101 | 102 | _enabled 103 | True 104 | 105 | 106 | filename_sk 107 | "secret.alice" 108 | 109 | 110 | filename_pk 111 | "public.alice" 112 | 113 | 114 | alias 115 | 116 | 117 | 118 | _coordinate 119 | (104, 171) 120 | 121 | 122 | _rotation 123 | 0 124 | 125 | 126 | 127 | nacl_generate_keypair 128 | 129 | id 130 | nacl_generate_keypair_0_0 131 | 132 | 133 | _enabled 134 | True 135 | 136 | 137 | filename_sk 138 | "secret.bob" 139 | 140 | 141 | filename_pk 142 | "public.bob" 143 | 144 | 145 | alias 146 | 147 | 148 | 149 | _coordinate 150 | (280, 171) 151 | 152 | 153 | _rotation 154 | 0 155 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /examples/input.file: -------------------------------------------------------------------------------- 1 | This is a test text. Hello world! 2 | -------------------------------------------------------------------------------- /examples/public_encryption.grc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sun Apr 5 20:23:17 2015 5 | 6 | options 7 | 8 | id 9 | top_block 10 | 11 | 12 | _enabled 13 | True 14 | 15 | 16 | title 17 | 18 | 19 | 20 | author 21 | 22 | 23 | 24 | description 25 | 26 | 27 | 28 | window_size 29 | 1280, 1024 30 | 31 | 32 | generate_options 33 | qt_gui 34 | 35 | 36 | category 37 | Custom 38 | 39 | 40 | run_options 41 | prompt 42 | 43 | 44 | run 45 | True 46 | 47 | 48 | max_nouts 49 | 0 50 | 51 | 52 | realtime_scheduling 53 | 54 | 55 | 56 | alias 57 | 58 | 59 | 60 | _coordinate 61 | (10, 10) 62 | 63 | 64 | _rotation 65 | 0 66 | 67 | 68 | 69 | variable 70 | 71 | id 72 | samp_rate 73 | 74 | 75 | _enabled 76 | True 77 | 78 | 79 | value 80 | 32000 81 | 82 | 83 | alias 84 | 85 | 86 | 87 | _coordinate 88 | (8, 171) 89 | 90 | 91 | _rotation 92 | 0 93 | 94 | 95 | 96 | nacl_generate_keypair 97 | 98 | id 99 | nacl_generate_keypair_0 100 | 101 | 102 | _enabled 103 | True 104 | 105 | 106 | filename_sk 107 | "secret.alice" 108 | 109 | 110 | filename_pk 111 | "public.alice" 112 | 113 | 114 | alias 115 | 116 | 117 | 118 | _coordinate 119 | (104, 171) 120 | 121 | 122 | _rotation 123 | 0 124 | 125 | 126 | 127 | nacl_generate_keypair 128 | 129 | id 130 | nacl_generate_keypair_0_0 131 | 132 | 133 | _enabled 134 | True 135 | 136 | 137 | filename_sk 138 | "secret.bob" 139 | 140 | 141 | filename_pk 142 | "public.bob" 143 | 144 | 145 | alias 146 | 147 | 148 | 149 | _coordinate 150 | (280, 171) 151 | 152 | 153 | _rotation 154 | 0 155 | 156 | 157 | 158 | blocks_message_strobe 159 | 160 | id 161 | blocks_message_strobe_0 162 | 163 | 164 | _enabled 165 | True 166 | 167 | 168 | msg 169 | pmt.list1(pmt.list2(pmt.string_to_symbol("msg_clear"),pmt.init_u8vector(4,[116,101,115,116]))) 170 | 171 | 172 | period 173 | 1000 174 | 175 | 176 | alias 177 | 178 | 179 | 180 | affinity 181 | 182 | 183 | 184 | minoutbuf 185 | 0 186 | 187 | 188 | maxoutbuf 189 | 0 190 | 191 | 192 | _coordinate 193 | (96, 291) 194 | 195 | 196 | _rotation 197 | 0 198 | 199 | 200 | 201 | nacl_decrypt_public 202 | 203 | id 204 | nacl_decrypt_public_0 205 | 206 | 207 | _enabled 208 | True 209 | 210 | 211 | filename_pk 212 | public.alice 213 | 214 | 215 | filename_sk 216 | secret.bob 217 | 218 | 219 | alias 220 | 221 | 222 | 223 | affinity 224 | 225 | 226 | 227 | minoutbuf 228 | 0 229 | 230 | 231 | maxoutbuf 232 | 0 233 | 234 | 235 | _coordinate 236 | (88, 515) 237 | 238 | 239 | _rotation 240 | 0 241 | 242 | 243 | 244 | nacl_encrypt_public 245 | 246 | id 247 | nacl_encrypt_public_0 248 | 249 | 250 | _enabled 251 | True 252 | 253 | 254 | filename_pk 255 | public.bob 256 | 257 | 258 | filename_sk 259 | secret.alice 260 | 261 | 262 | alias 263 | 264 | 265 | 266 | affinity 267 | 268 | 269 | 270 | minoutbuf 271 | 0 272 | 273 | 274 | maxoutbuf 275 | 0 276 | 277 | 278 | _coordinate 279 | (88, 403) 280 | 281 | 282 | _rotation 283 | 0 284 | 285 | 286 | 287 | blocks_message_debug 288 | 289 | id 290 | blocks_message_debug_0_0_0 291 | 292 | 293 | _enabled 294 | True 295 | 296 | 297 | alias 298 | 299 | 300 | 301 | affinity 302 | 303 | 304 | 305 | _coordinate 306 | (496, 416) 307 | 308 | 309 | _rotation 310 | 0 311 | 312 | 313 | 314 | blocks_message_debug 315 | 316 | id 317 | blocks_message_debug_0_0 318 | 319 | 320 | _enabled 321 | True 322 | 323 | 324 | alias 325 | 326 | 327 | 328 | affinity 329 | 330 | 331 | 332 | _coordinate 333 | (496, 304) 334 | 335 | 336 | _rotation 337 | 0 338 | 339 | 340 | 341 | blocks_message_debug 342 | 343 | id 344 | blocks_message_debug_0 345 | 346 | 347 | _enabled 348 | True 349 | 350 | 351 | alias 352 | 353 | 354 | 355 | affinity 356 | 357 | 358 | 359 | _coordinate 360 | (496, 528) 361 | 362 | 363 | _rotation 364 | 0 365 | 366 | 367 | 368 | nacl_encrypt_public_0 369 | nacl_decrypt_public_0 370 | Msg encrypted 371 | Msg encrypted 372 | 373 | 374 | nacl_decrypt_public_0 375 | blocks_message_debug_0 376 | Msg decrypted 377 | print 378 | 379 | 380 | blocks_message_strobe_0 381 | nacl_encrypt_public_0 382 | strobe 383 | Msg clear 384 | 385 | 386 | blocks_message_strobe_0 387 | blocks_message_debug_0_0 388 | strobe 389 | print 390 | 391 | 392 | nacl_encrypt_public_0 393 | blocks_message_debug_0_0_0 394 | Msg encrypted 395 | print 396 | 397 | 398 | -------------------------------------------------------------------------------- /examples/secret_encryption.grc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sun Apr 5 20:23:17 2015 5 | 6 | options 7 | 8 | id 9 | top_block 10 | 11 | 12 | _enabled 13 | True 14 | 15 | 16 | title 17 | 18 | 19 | 20 | author 21 | 22 | 23 | 24 | description 25 | 26 | 27 | 28 | window_size 29 | 1280, 1024 30 | 31 | 32 | generate_options 33 | qt_gui 34 | 35 | 36 | category 37 | Custom 38 | 39 | 40 | run_options 41 | prompt 42 | 43 | 44 | run 45 | True 46 | 47 | 48 | max_nouts 49 | 0 50 | 51 | 52 | realtime_scheduling 53 | 54 | 55 | 56 | alias 57 | 58 | 59 | 60 | _coordinate 61 | (10, 10) 62 | 63 | 64 | _rotation 65 | 0 66 | 67 | 68 | 69 | variable 70 | 71 | id 72 | samp_rate 73 | 74 | 75 | _enabled 76 | True 77 | 78 | 79 | value 80 | 32000 81 | 82 | 83 | alias 84 | 85 | 86 | 87 | _coordinate 88 | (8, 171) 89 | 90 | 91 | _rotation 92 | 0 93 | 94 | 95 | 96 | blocks_message_debug 97 | 98 | id 99 | blocks_message_debug_0_0 100 | 101 | 102 | _enabled 103 | True 104 | 105 | 106 | alias 107 | 108 | 109 | 110 | affinity 111 | 112 | 113 | 114 | _coordinate 115 | (496, 304) 116 | 117 | 118 | _rotation 119 | 0 120 | 121 | 122 | 123 | nacl_generate_key 124 | 125 | id 126 | nacl_generate_key_0 127 | 128 | 129 | _enabled 130 | True 131 | 132 | 133 | filename_key 134 | "secret.key" 135 | 136 | 137 | alias 138 | 139 | 140 | 141 | _coordinate 142 | (104, 187) 143 | 144 | 145 | _rotation 146 | 0 147 | 148 | 149 | 150 | blocks_message_strobe 151 | 152 | id 153 | blocks_message_strobe_0 154 | 155 | 156 | _enabled 157 | True 158 | 159 | 160 | msg 161 | pmt.list1(pmt.list2(pmt.string_to_symbol("msg_clear"),pmt.init_u8vector(4,[116,101,115,116]))) 162 | 163 | 164 | period 165 | 1000 166 | 167 | 168 | alias 169 | 170 | 171 | 172 | affinity 173 | 174 | 175 | 176 | minoutbuf 177 | 0 178 | 179 | 180 | maxoutbuf 181 | 0 182 | 183 | 184 | _coordinate 185 | (96, 291) 186 | 187 | 188 | _rotation 189 | 0 190 | 191 | 192 | 193 | blocks_message_debug 194 | 195 | id 196 | blocks_message_debug_0_0_0 197 | 198 | 199 | _enabled 200 | True 201 | 202 | 203 | alias 204 | 205 | 206 | 207 | affinity 208 | 209 | 210 | 211 | _coordinate 212 | (496, 416) 213 | 214 | 215 | _rotation 216 | 0 217 | 218 | 219 | 220 | blocks_message_debug 221 | 222 | id 223 | blocks_message_debug_0 224 | 225 | 226 | _enabled 227 | True 228 | 229 | 230 | alias 231 | 232 | 233 | 234 | affinity 235 | 236 | 237 | 238 | _coordinate 239 | (496, 528) 240 | 241 | 242 | _rotation 243 | 0 244 | 245 | 246 | 247 | nacl_encrypt_secret 248 | 249 | id 250 | nacl_encrypt_secret_0 251 | 252 | 253 | _enabled 254 | True 255 | 256 | 257 | filename_key 258 | "secret.key" 259 | 260 | 261 | alias 262 | 263 | 264 | 265 | affinity 266 | 267 | 268 | 269 | minoutbuf 270 | 0 271 | 272 | 273 | maxoutbuf 274 | 0 275 | 276 | 277 | _coordinate 278 | (112, 411) 279 | 280 | 281 | _rotation 282 | 0 283 | 284 | 285 | 286 | nacl_decrypt_secret 287 | 288 | id 289 | nacl_decrypt_secret_0 290 | 291 | 292 | _enabled 293 | True 294 | 295 | 296 | filename_key 297 | "secret.key" 298 | 299 | 300 | alias 301 | 302 | 303 | 304 | affinity 305 | 306 | 307 | 308 | minoutbuf 309 | 0 310 | 311 | 312 | maxoutbuf 313 | 0 314 | 315 | 316 | _coordinate 317 | (112, 523) 318 | 319 | 320 | _rotation 321 | 0 322 | 323 | 324 | 325 | blocks_message_strobe_0 326 | blocks_message_debug_0_0 327 | strobe 328 | print 329 | 330 | 331 | nacl_encrypt_secret_0 332 | blocks_message_debug_0_0_0 333 | Msg encrypted 334 | print 335 | 336 | 337 | nacl_encrypt_secret_0 338 | nacl_decrypt_secret_0 339 | Msg encrypted 340 | Msg encrypted 341 | 342 | 343 | nacl_decrypt_secret_0 344 | blocks_message_debug_0 345 | Msg decrypted 346 | print 347 | 348 | 349 | blocks_message_strobe_0 350 | nacl_encrypt_secret_0 351 | strobe 352 | Msg clear 353 | 354 | 355 | -------------------------------------------------------------------------------- /grc/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | install(FILES 21 | nacl_encrypt_public.xml 22 | nacl_generate_keypair.xml 23 | nacl_decrypt_public.xml 24 | nacl_generate_key.xml 25 | nacl_encrypt_secret.xml 26 | nacl_decrypt_secret.xml 27 | nacl_crypt_tagged_stream.xml DESTINATION share/gnuradio/grc/blocks 28 | ) 29 | -------------------------------------------------------------------------------- /grc/nacl_crypt_tagged_stream.xml: -------------------------------------------------------------------------------- 1 | 2 | Crypt Tagged Stream 3 | nacl_crypt_tagged_stream 4 | NACL 5 | import nacl 6 | nacl.crypt_tagged_stream($key, $nonce, $rotate_nonce, $len_key) 7 | 8 | Key 9 | key 10 | string 11 | 12 | 13 | Nonce 14 | nonce 15 | string 16 | 17 | 18 | Rotate nonce 19 | rotate_nonce 20 | False 21 | bool 22 | 26 | 30 | 31 | 32 | Packet length key 33 | len_key 34 | "packet_len" 35 | string 36 | 37 | 38 | in 39 | byte 40 | 41 | 42 | out 43 | byte 44 | 45 | 46 | -------------------------------------------------------------------------------- /grc/nacl_decrypt_public.xml: -------------------------------------------------------------------------------- 1 | 2 | Decrypt Public 3 | nacl_decrypt_public 4 | NACL 5 | import nacl 6 | nacl.decrypt_public($filename_pk, $filename_sk) 7 | 8 | Filename public-key (sender) 9 | filename_pk 10 | string 11 | 12 | 13 | Filename secret-key (receiver) 14 | filename_sk 15 | string 16 | 17 | 18 | Msg encrypted 19 | message 20 | 1 21 | 22 | 23 | Msg decrypted 24 | message 25 | 1 26 | 27 | 28 | -------------------------------------------------------------------------------- /grc/nacl_decrypt_secret.xml: -------------------------------------------------------------------------------- 1 | 2 | Decrypt Secret 3 | nacl_decrypt_secret 4 | NACL 5 | import nacl 6 | nacl.decrypt_secret($filename_key) 7 | 8 | Filename key 9 | filename_key 10 | string 11 | 12 | 13 | Msg encrypted 14 | message 15 | 1 16 | 17 | 18 | Msg decrypted 19 | message 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /grc/nacl_encrypt_public.xml: -------------------------------------------------------------------------------- 1 | 2 | Encrypt Public 3 | nacl_encrypt_public 4 | NACL 5 | import nacl 6 | nacl.encrypt_public($filename_pk, $filename_sk) 7 | 8 | Filename public-key (receiver) 9 | filename_pk 10 | string 11 | 12 | 13 | Filename secret-key (sender) 14 | filename_sk 15 | string 16 | 17 | 18 | Msg clear 19 | message 20 | 1 21 | 22 | 23 | Msg encrypted 24 | message 25 | 1 26 | 27 | 28 | -------------------------------------------------------------------------------- /grc/nacl_encrypt_secret.xml: -------------------------------------------------------------------------------- 1 | 2 | Encrypt Secret 3 | nacl_encrypt_secret 4 | NACL 5 | import nacl 6 | nacl.encrypt_secret($filename_key) 7 | 8 | Filename key 9 | filename_key 10 | string 11 | 12 | 13 | Msg clear 14 | message 15 | 1 16 | 17 | 18 | Msg encrypted 19 | message 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /grc/nacl_generate_key.xml: -------------------------------------------------------------------------------- 1 | 2 | Generate Key 3 | nacl_generate_key 4 | NACL 5 | import nacl 6 | nacl.generate_key($filename_key) 7 | 8 | Filename key 9 | filename_key 10 | string 11 | 12 | 13 | -------------------------------------------------------------------------------- /grc/nacl_generate_keypair.xml: -------------------------------------------------------------------------------- 1 | 2 | Generate Keypair 3 | nacl_generate_keypair 4 | NACL 5 | import nacl 6 | nacl.generate_keypair($filename_sk, $filename_pk) 7 | 8 | Filename secret-key 9 | filename_sk 10 | string 11 | 12 | 13 | Filename public-key 14 | filename_pk 15 | string 16 | 17 | 18 | -------------------------------------------------------------------------------- /include/nacl/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2011,2012 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | ######################################################################## 21 | # Install public header files 22 | ######################################################################## 23 | install(FILES 24 | api.h 25 | encrypt_public.h 26 | generate_keypair.h 27 | decrypt_public.h 28 | generate_key.h 29 | encrypt_secret.h 30 | decrypt_secret.h 31 | crypt_tagged_stream.h DESTINATION include/nacl 32 | ) 33 | -------------------------------------------------------------------------------- /include/nacl/api.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2011 Free Software Foundation, Inc. 3 | * 4 | * This file is part of GNU Radio 5 | * 6 | * GNU Radio is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation; either version 3, or (at your option) 9 | * any later version. 10 | * 11 | * GNU Radio is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with GNU Radio; see the file COPYING. If not, write to 18 | * the Free Software Foundation, Inc., 51 Franklin Street, 19 | * Boston, MA 02110-1301, USA. 20 | */ 21 | 22 | #ifndef INCLUDED_NACL_API_H 23 | #define INCLUDED_NACL_API_H 24 | 25 | #include 26 | 27 | #ifdef gnuradio_nacl_EXPORTS 28 | # define NACL_API __GR_ATTR_EXPORT 29 | #else 30 | # define NACL_API __GR_ATTR_IMPORT 31 | #endif 32 | 33 | #endif /* INCLUDED_NACL_API_H */ 34 | -------------------------------------------------------------------------------- /include/nacl/crypt_tagged_stream.h: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* Copyright 2015 Stefan Wunsch 3 | * 4 | * This is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This software is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this software; see the file COPYING. If not, write to 16 | * the Free Software Foundation, Inc., 51 Franklin Street, 17 | * Boston, MA 02110-1301, USA. 18 | */ 19 | 20 | 21 | #ifndef INCLUDED_NACL_CRYPT_TAGGED_STREAM_H 22 | #define INCLUDED_NACL_CRYPT_TAGGED_STREAM_H 23 | 24 | #include 25 | #include 26 | 27 | namespace gr { 28 | namespace nacl { 29 | 30 | /*! 31 | * \brief <+description of block+> 32 | * \ingroup nacl 33 | * 34 | */ 35 | class NACL_API crypt_tagged_stream : virtual public gr::tagged_stream_block 36 | { 37 | public: 38 | typedef boost::shared_ptr sptr; 39 | 40 | /*! 41 | * \brief Return a shared_ptr to a new instance of nacl::crypt_tagged_stream. 42 | * 43 | * To avoid accidental use of raw pointers, nacl::crypt_tagged_stream's 44 | * constructor is in a private implementation 45 | * class. nacl::crypt_tagged_stream::make is the public interface for 46 | * creating new instances. 47 | */ 48 | static sptr make(std::string key, std::string nonce, bool rotate_nonce=false, const std::string& len_key="packet_len"); 49 | }; 50 | 51 | } // namespace nacl 52 | } // namespace gr 53 | 54 | #endif /* INCLUDED_NACL_CRYPT_TAGGED_STREAM_H */ 55 | 56 | -------------------------------------------------------------------------------- /include/nacl/decrypt_public.h: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* /* 3 | * * Copyright 2015 Stefan Wunsch 4 | * * 5 | * * This is free software; you can redistribute it and/or modify 6 | * * it under the terms of the GNU General Public License as published by 7 | * * the Free Software Foundation; either version 3, or (at your option) 8 | * * any later version. 9 | * * 10 | * * This software is distributed in the hope that it will be useful, 11 | * * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * * GNU General Public License for more details. 14 | * * 15 | * * You should have received a copy of the GNU General Public License 16 | * * along with this software; see the file COPYING. If not, write to 17 | * * the Free Software Foundation, Inc., 51 Franklin Street, 18 | * * Boston, MA 02110-1301, USA. 19 | * */ 20 | 21 | 22 | #ifndef INCLUDED_NACL_DECRYPT_PUBLIC_H 23 | #define INCLUDED_NACL_DECRYPT_PUBLIC_H 24 | 25 | #include 26 | #include 27 | 28 | namespace gr { 29 | namespace nacl { 30 | 31 | /*! 32 | * \brief <+description of block+> 33 | * \ingroup nacl 34 | * 35 | */ 36 | class NACL_API decrypt_public : virtual public gr::block 37 | { 38 | public: 39 | typedef boost::shared_ptr sptr; 40 | 41 | /*! 42 | * \brief Return a shared_ptr to a new instance of nacl::decrypt_public. 43 | * 44 | * To avoid accidental use of raw pointers, nacl::decrypt_public's 45 | * constructor is in a private implementation 46 | * class. nacl::decrypt_public::make is the public interface for 47 | * creating new instances. 48 | */ 49 | static sptr make(std::string filename_pk, std::string filename_sk); 50 | }; 51 | 52 | } // namespace nacl 53 | } // namespace gr 54 | 55 | #endif /* INCLUDED_NACL_DECRYPT_PUBLIC_H */ 56 | 57 | -------------------------------------------------------------------------------- /include/nacl/decrypt_secret.h: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* Copyright 2015 Stefan Wunsch 3 | * 4 | * This is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This software is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this software; see the file COPYING. If not, write to 16 | * the Free Software Foundation, Inc., 51 Franklin Street, 17 | * Boston, MA 02110-1301, USA. 18 | */ 19 | 20 | 21 | #ifndef INCLUDED_NACL_DECRYPT_SECRET_H 22 | #define INCLUDED_NACL_DECRYPT_SECRET_H 23 | 24 | #include 25 | #include 26 | 27 | namespace gr { 28 | namespace nacl { 29 | 30 | /*! 31 | * \brief <+description of block+> 32 | * \ingroup nacl 33 | * 34 | */ 35 | class NACL_API decrypt_secret : virtual public gr::block 36 | { 37 | public: 38 | typedef boost::shared_ptr sptr; 39 | 40 | /*! 41 | * \brief Return a shared_ptr to a new instance of nacl::decrypt_secret. 42 | * 43 | * To avoid accidental use of raw pointers, nacl::decrypt_secret's 44 | * constructor is in a private implementation 45 | * class. nacl::decrypt_secret::make is the public interface for 46 | * creating new instances. 47 | */ 48 | static sptr make(std::string filename_key); 49 | }; 50 | 51 | } // namespace nacl 52 | } // namespace gr 53 | 54 | #endif /* INCLUDED_NACL_DECRYPT_SECRET_H */ 55 | 56 | -------------------------------------------------------------------------------- /include/nacl/encrypt_public.h: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* 3 | * Copyright 2015 Stefan Wunsch 4 | * 5 | * This is free software; you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation; either version 3, or (at your option) 8 | * any later version. 9 | * 10 | * This software is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this software; see the file COPYING. If not, write to 17 | * the Free Software Foundation, Inc., 51 Franklin Street, 18 | * Boston, MA 02110-1301, USA. 19 | */ 20 | 21 | 22 | #ifndef INCLUDED_NACL_ENCRYPT_PUBLIC_H 23 | #define INCLUDED_NACL_ENCRYPT_PUBLIC_H 24 | 25 | #include 26 | #include 27 | 28 | namespace gr { 29 | namespace nacl { 30 | 31 | /*! 32 | * \brief <+description of block+> 33 | * \ingroup nacl 34 | * 35 | */ 36 | class NACL_API encrypt_public : virtual public gr::block 37 | { 38 | public: 39 | typedef boost::shared_ptr sptr; 40 | 41 | /*! 42 | * \brief Return a shared_ptr to a new instance of nacl::encrypt_public. 43 | * 44 | * To avoid accidental use of raw pointers, nacl::encrypt_public's 45 | * constructor is in a private implementation 46 | * class. nacl::encrypt_public::make is the public interface for 47 | * creating new instances. 48 | */ 49 | static sptr make(std::string filename_pk, std::string filename_sk); 50 | }; 51 | 52 | } // namespace nacl 53 | } // namespace gr 54 | 55 | #endif /* INCLUDED_NACL_ENCRYPT_PUBLIC_H */ 56 | 57 | -------------------------------------------------------------------------------- /include/nacl/encrypt_secret.h: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* Copyright 2015 Stefan Wunsch 3 | * 4 | * This is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This software is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this software; see the file COPYING. If not, write to 16 | * the Free Software Foundation, Inc., 51 Franklin Street, 17 | * Boston, MA 02110-1301, USA. 18 | */ 19 | 20 | 21 | #ifndef INCLUDED_NACL_ENCRYPT_SECRET_H 22 | #define INCLUDED_NACL_ENCRYPT_SECRET_H 23 | 24 | #include 25 | #include 26 | 27 | namespace gr { 28 | namespace nacl { 29 | 30 | /*! 31 | * \brief <+description of block+> 32 | * \ingroup nacl 33 | * 34 | */ 35 | class NACL_API encrypt_secret : virtual public gr::block 36 | { 37 | public: 38 | typedef boost::shared_ptr sptr; 39 | 40 | /*! 41 | * \brief Return a shared_ptr to a new instance of nacl::encrypt_secret. 42 | * 43 | * To avoid accidental use of raw pointers, nacl::encrypt_secret's 44 | * constructor is in a private implementation 45 | * class. nacl::encrypt_secret::make is the public interface for 46 | * creating new instances. 47 | */ 48 | static sptr make(std::string filename_key); 49 | }; 50 | 51 | } // namespace nacl 52 | } // namespace gr 53 | 54 | #endif /* INCLUDED_NACL_ENCRYPT_SECRET_H */ 55 | 56 | -------------------------------------------------------------------------------- /include/nacl/generate_key.h: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* Copyright 2015 Stefan Wunsch 3 | * 4 | * This is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This software is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this software; see the file COPYING. If not, write to 16 | * the Free Software Foundation, Inc., 51 Franklin Street, 17 | * Boston, MA 02110-1301, USA. 18 | */ 19 | 20 | 21 | #ifndef INCLUDED_NACL_GENERATE_KEY_H 22 | #define INCLUDED_NACL_GENERATE_KEY_H 23 | 24 | #include 25 | #include 26 | 27 | namespace gr { 28 | namespace nacl { 29 | 30 | /*! 31 | * \brief <+description of block+> 32 | * \ingroup nacl 33 | * 34 | */ 35 | class NACL_API generate_key : virtual public gr::block 36 | { 37 | public: 38 | typedef boost::shared_ptr sptr; 39 | 40 | /*! 41 | * \brief Return a shared_ptr to a new instance of nacl::generate_key. 42 | * 43 | * To avoid accidental use of raw pointers, nacl::generate_key's 44 | * constructor is in a private implementation 45 | * class. nacl::generate_key::make is the public interface for 46 | * creating new instances. 47 | */ 48 | static sptr make(std::string filename_key); 49 | }; 50 | 51 | } // namespace nacl 52 | } // namespace gr 53 | 54 | #endif /* INCLUDED_NACL_GENERATE_KEY_H */ 55 | 56 | -------------------------------------------------------------------------------- /include/nacl/generate_keypair.h: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* 3 | * Copyright 2015 Stefan Wunsch 4 | * 5 | * This is free software; you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation; either version 3, or (at your option) 8 | * any later version. 9 | * 10 | * This software is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this software; see the file COPYING. If not, write to 17 | * the Free Software Foundation, Inc., 51 Franklin Street, 18 | * Boston, MA 02110-1301, USA. 19 | */ 20 | 21 | 22 | #ifndef INCLUDED_NACL_GENERATE_KEYPAIR_H 23 | #define INCLUDED_NACL_GENERATE_KEYPAIR_H 24 | 25 | #include 26 | #include 27 | 28 | namespace gr { 29 | namespace nacl { 30 | 31 | /*! 32 | * \brief <+description of block+> 33 | * \ingroup nacl 34 | * 35 | */ 36 | class NACL_API generate_keypair : virtual public gr::block 37 | { 38 | public: 39 | typedef boost::shared_ptr sptr; 40 | 41 | /*! 42 | * \brief Return a shared_ptr to a new instance of nacl::generate_keypair. 43 | * 44 | * To avoid accidental use of raw pointers, nacl::generate_keypair's 45 | * constructor is in a private implementation 46 | * class. nacl::generate_keypair::make is the public interface for 47 | * creating new instances. 48 | */ 49 | static sptr make(std::string filename_sk, std::string filename_pk); 50 | }; 51 | 52 | } // namespace nacl 53 | } // namespace gr 54 | 55 | #endif /* INCLUDED_NACL_GENERATE_KEYPAIR_H */ 56 | 57 | -------------------------------------------------------------------------------- /lib/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2011,2012 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | ######################################################################## 21 | # Setup library 22 | ######################################################################## 23 | include(GrPlatform) #define LIB_SUFFIX 24 | 25 | include_directories(${Boost_INCLUDE_DIR}) 26 | link_directories(${Boost_LIBRARY_DIRS}) 27 | 28 | list(APPEND nacl_sources 29 | encrypt_public_impl.cc 30 | generate_keypair_impl.cc 31 | decrypt_public_impl.cc 32 | generate_key_impl.cc 33 | encrypt_secret_impl.cc 34 | decrypt_secret_impl.cc 35 | crypt_tagged_stream_impl.cc 36 | ) 37 | 38 | set(nacl_sources "${nacl_sources}" PARENT_SCOPE) 39 | if(NOT nacl_sources) 40 | MESSAGE(STATUS "No C++ sources... skipping lib/") 41 | return() 42 | endif(NOT nacl_sources) 43 | 44 | add_library(gnuradio-nacl SHARED ${nacl_sources}) 45 | target_link_libraries(gnuradio-nacl ${Boost_LIBRARIES} ${GNURADIO_ALL_LIBRARIES} ${SODIUM_LIBRARIES}) 46 | set_target_properties(gnuradio-nacl PROPERTIES DEFINE_SYMBOL "gnuradio_nacl_EXPORTS") 47 | 48 | if(APPLE) 49 | set_target_properties(gnuradio-nacl PROPERTIES 50 | INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib" 51 | ) 52 | endif(APPLE) 53 | 54 | ######################################################################## 55 | # Install built library files 56 | ######################################################################## 57 | install(TARGETS gnuradio-nacl 58 | LIBRARY DESTINATION lib${LIB_SUFFIX} # .so/.dylib file 59 | ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file 60 | RUNTIME DESTINATION bin # .dll file 61 | ) 62 | 63 | ######################################################################## 64 | # Build and register unit test 65 | ######################################################################## 66 | include(GrTest) 67 | 68 | include_directories(${CPPUNIT_INCLUDE_DIRS}) 69 | 70 | list(APPEND test_nacl_sources 71 | ${CMAKE_CURRENT_SOURCE_DIR}/test_nacl.cc 72 | ${CMAKE_CURRENT_SOURCE_DIR}/qa_nacl.cc 73 | ) 74 | 75 | add_executable(test-nacl ${test_nacl_sources}) 76 | 77 | target_link_libraries( 78 | test-nacl 79 | ${GNURADIO_RUNTIME_LIBRARIES} 80 | ${Boost_LIBRARIES} 81 | ${CPPUNIT_LIBRARIES} 82 | ${SODIUM_LIBRARIES} 83 | gnuradio-nacl 84 | ) 85 | 86 | GR_ADD_TEST(test_nacl test-nacl) 87 | -------------------------------------------------------------------------------- /lib/crypt_tagged_stream_impl.cc: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* Copyright 2015 Stefan Wunsch 3 | * 4 | * This is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This software is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this software; see the file COPYING. If not, write to 16 | * the Free Software Foundation, Inc., 51 Franklin Street, 17 | * Boston, MA 02110-1301, USA. 18 | */ 19 | 20 | #ifdef HAVE_CONFIG_H 21 | #include "config.h" 22 | #endif 23 | 24 | #include 25 | #include "crypt_tagged_stream_impl.h" 26 | 27 | #include 28 | 29 | namespace gr { 30 | namespace nacl { 31 | 32 | crypt_tagged_stream::sptr 33 | crypt_tagged_stream::make(std::string key, std::string nonce, bool rotate_nonce, const std::string& len_key) 34 | { 35 | return gnuradio::get_initial_sptr 36 | (new crypt_tagged_stream_impl(key, nonce, rotate_nonce, len_key)); 37 | } 38 | 39 | /* 40 | * The private constructor 41 | */ 42 | crypt_tagged_stream_impl::crypt_tagged_stream_impl(std::string key, std::string nonce, bool rotate_nonce, const std::string& len_key) 43 | : gr::tagged_stream_block("crypt_tagged_stream", 44 | gr::io_signature::make(1, 1, sizeof(uint8_t)), 45 | gr::io_signature::make(1, 1, sizeof(uint8_t)), len_key) 46 | { 47 | d_key = new uint8_t[crypto_stream_KEYBYTES]; 48 | d_nonce = new uint8_t[crypto_stream_NONCEBYTES]; 49 | d_rotate_nonce = rotate_nonce; 50 | 51 | // Error-handling nonce and key sizes 52 | if(key.size()!=crypto_stream_KEYBYTES){ 53 | std::cout << "Key size (needed/given): " << crypto_stream_KEYBYTES << "/" << key.size() << std::endl; 54 | throw std::runtime_error("Wrong key size."); 55 | } 56 | if(nonce.size()!=crypto_stream_NONCEBYTES){ 57 | std::cout << "Nonce size (needed/given): " << crypto_stream_NONCEBYTES << "/" << nonce.size() << std::endl; 58 | throw std::runtime_error("Wrong nonce size."); 59 | } 60 | 61 | // Copy nonce and key from string to unsigend char array 62 | for(int k=0; k=ninput_items[0]){ 94 | status = crypto_stream_xor(out, in, ninput_items[0], d_nonce, d_key); 95 | } 96 | 97 | // Tell runtime system how many output items we produced. 98 | if(status==0){ 99 | if(d_rotate_nonce){ 100 | // Store first bit 101 | d_nonce[0] = 0b00000000; 102 | unsigned char store_bit = 0b10000000&d_nonce[0]; // FIXME: not final 103 | 104 | // Shift left char array and add stored bit at the end // FIXME: check this implementation! 105 | for(int k=0; k 24 | 25 | namespace gr { 26 | namespace nacl { 27 | 28 | class crypt_tagged_stream_impl : public crypt_tagged_stream 29 | { 30 | private: 31 | // Nothing to declare in this block. 32 | 33 | protected: 34 | int calculate_output_stream_length(const gr_vector_int &ninput_items); 35 | 36 | public: 37 | crypt_tagged_stream_impl(std::string key, std::string nonce, bool rotate_nonce, const std::string& len_key); 38 | ~crypt_tagged_stream_impl(); 39 | 40 | uint8_t* d_key; 41 | uint8_t* d_nonce; 42 | bool d_rotate_nonce; 43 | 44 | // Where all the action really happens 45 | int work(int noutput_items, 46 | gr_vector_int &ninput_items, 47 | gr_vector_const_void_star &input_items, 48 | gr_vector_void_star &output_items); 49 | }; 50 | 51 | } // namespace nacl 52 | } // namespace gr 53 | 54 | #endif /* INCLUDED_NACL_CRYPT_TAGGED_STREAM_IMPL_H */ 55 | 56 | -------------------------------------------------------------------------------- /lib/decrypt_public_impl.cc: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* /* 3 | * * Copyright 2015 Stefan Wunsch 4 | * * 5 | * * This is free software; you can redistribute it and/or modify 6 | * * it under the terms of the GNU General Public License as published by 7 | * * the Free Software Foundation; either version 3, or (at your option) 8 | * * any later version. 9 | * * 10 | * * This software is distributed in the hope that it will be useful, 11 | * * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * * GNU General Public License for more details. 14 | * * 15 | * * You should have received a copy of the GNU General Public License 16 | * * along with this software; see the file COPYING. If not, write to 17 | * * the Free Software Foundation, Inc., 51 Franklin Street, 18 | * * Boston, MA 02110-1301, USA. 19 | * */ 20 | 21 | #ifdef HAVE_CONFIG_H 22 | #include "config.h" 23 | #endif 24 | 25 | #include 26 | #include "decrypt_public_impl.h" 27 | 28 | #include 29 | #include 30 | 31 | namespace gr { 32 | namespace nacl { 33 | 34 | decrypt_public::sptr 35 | decrypt_public::make(std::string filename_pk, std::string filename_sk) 36 | { 37 | return gnuradio::get_initial_sptr 38 | (new decrypt_public_impl(filename_pk, filename_sk)); 39 | } 40 | 41 | /* 42 | * The private constructor 43 | */ 44 | decrypt_public_impl::decrypt_public_impl(std::string filename_pk, std::string filename_sk) 45 | : gr::block("decrypt_public", 46 | gr::io_signature::make(0,0,0), 47 | gr::io_signature::make(0,0,0)) 48 | { 49 | d_filename_pk = filename_pk; 50 | d_filename_sk = filename_sk; 51 | d_pk = new unsigned char[crypto_box_PUBLICKEYBYTES]; 52 | d_sk = new unsigned char[crypto_box_SECRETKEYBYTES]; 53 | 54 | // Load keys from files 55 | char c; 56 | 57 | std::ifstream file_sk(filename_sk.c_str()); 58 | if(!(file_sk.is_open())) throw std::runtime_error("Secret-key file not found."); 59 | for(int k=0; k data, nonce; 98 | bool msg_encrypted_found = false; 99 | bool nonce_found = false; 100 | for(int k=0; k msg_decrypted_vec; msg_decrypted_vec.resize(msg_len); 132 | for(int k=0; k 25 | 26 | namespace gr { 27 | namespace nacl { 28 | 29 | class decrypt_public_impl : public decrypt_public 30 | { 31 | private: 32 | // Nothing to declare in this block. 33 | 34 | public: 35 | decrypt_public_impl(std::string filename_pk, std::string filename_sk); 36 | ~decrypt_public_impl(); 37 | 38 | void handle_msg(pmt::pmt_t msg); 39 | 40 | pmt::pmt_t d_port_id_in, d_port_id_out; 41 | std::string d_filename_pk, d_filename_sk; 42 | unsigned char *d_pk, *d_sk; 43 | }; 44 | 45 | } // namespace nacl 46 | } // namespace gr 47 | 48 | #endif /* INCLUDED_NACL_DECRYPT_PUBLIC_IMPL_H */ 49 | 50 | -------------------------------------------------------------------------------- /lib/decrypt_secret_impl.cc: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* Copyright 2015 Stefan Wunsch 3 | * 4 | * This is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This software is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this software; see the file COPYING. If not, write to 16 | * the Free Software Foundation, Inc., 51 Franklin Street, 17 | * Boston, MA 02110-1301, USA. 18 | */ 19 | 20 | #ifdef HAVE_CONFIG_H 21 | #include "config.h" 22 | #endif 23 | 24 | #include 25 | #include "decrypt_secret_impl.h" 26 | 27 | #include 28 | #include "sodium.h" 29 | 30 | namespace gr { 31 | namespace nacl { 32 | 33 | decrypt_secret::sptr 34 | decrypt_secret::make(std::string filename_key) 35 | { 36 | return gnuradio::get_initial_sptr 37 | (new decrypt_secret_impl(filename_key)); 38 | } 39 | 40 | /* 41 | * The private constructor 42 | */ 43 | decrypt_secret_impl::decrypt_secret_impl(std::string filename_key) 44 | : gr::block("decrypt_secret", 45 | gr::io_signature::make(0,0,0), 46 | gr::io_signature::make(0,0,0)) 47 | { 48 | d_filename_key = filename_key; 49 | d_key = new unsigned char[crypto_secretbox_KEYBYTES]; 50 | 51 | // Load key from file 52 | char c; 53 | 54 | std::ifstream file_key(filename_key.c_str()); 55 | if(!(file_key.is_open())) throw std::runtime_error("Key file not found."); 56 | for(int k=0; k data, nonce; 78 | bool msg_encrypted_found = false; 79 | bool nonce_found = false; 80 | for(int k=0; k msg_decrypted_vec; msg_decrypted_vec.resize(msg_len); 112 | for(int k=0; k 24 | 25 | namespace gr { 26 | namespace nacl { 27 | 28 | class decrypt_secret_impl : public decrypt_secret 29 | { 30 | private: 31 | // Nothing to declare in this block. 32 | 33 | public: 34 | decrypt_secret_impl(std::string filename_key); 35 | ~decrypt_secret_impl(); 36 | 37 | void handle_msg(pmt::pmt_t msg); 38 | 39 | pmt::pmt_t d_port_id_in, d_port_id_out; 40 | std::string d_filename_key; 41 | unsigned char *d_key; 42 | }; 43 | 44 | } // namespace nacl 45 | } // namespace gr 46 | 47 | #endif /* INCLUDED_NACL_DECRYPT_SECRET_IMPL_H */ 48 | 49 | -------------------------------------------------------------------------------- /lib/encrypt_public_impl.cc: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* 3 | * Copyright 2015 Stefan Wunsch 4 | * 5 | * This is free software; you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation; either version 3, or (at your option) 8 | * any later version. 9 | * 10 | * This software is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this software; see the file COPYING. If not, write to 17 | * the Free Software Foundation, Inc., 51 Franklin Street, 18 | * Boston, MA 02110-1301, USA. 19 | */ 20 | 21 | #ifdef HAVE_CONFIG_H 22 | #include "config.h" 23 | #endif 24 | 25 | #include 26 | #include "encrypt_public_impl.h" 27 | 28 | #include 29 | #include 30 | 31 | namespace gr { 32 | namespace nacl { 33 | 34 | encrypt_public::sptr 35 | encrypt_public::make(std::string filename_pk, std::string filename_sk) 36 | { 37 | return gnuradio::get_initial_sptr 38 | (new encrypt_public_impl(filename_pk, filename_sk)); 39 | } 40 | 41 | /* 42 | * The private constructor 43 | */ 44 | encrypt_public_impl::encrypt_public_impl(std::string filename_pk, std::string filename_sk) 45 | : gr::block("encrypt_public", 46 | gr::io_signature::make(0, 0, 0), 47 | gr::io_signature::make(0, 0, 0)) 48 | { 49 | d_filename_pk = filename_pk; 50 | d_filename_sk = filename_sk; 51 | d_pk = new unsigned char[crypto_box_PUBLICKEYBYTES]; 52 | d_sk = new unsigned char[crypto_box_SECRETKEYBYTES]; 53 | 54 | // Load keys from files 55 | char c; 56 | 57 | std::ifstream file_sk(filename_sk.c_str()); 58 | if(!(file_sk.is_open())) throw std::runtime_error("Secret-key file not found."); 59 | for(int k=0; k data; 89 | for(int k=0; k msg_encrypted; msg_encrypted.resize(ciphertext_len); 113 | for(int k=0; k nonce_vec; nonce_vec.resize(crypto_box_NONCEBYTES); 116 | for(int k=0; k 25 | 26 | namespace gr { 27 | namespace nacl { 28 | 29 | class encrypt_public_impl : public encrypt_public 30 | { 31 | private: 32 | // Nothing to declare in this block. 33 | 34 | public: 35 | encrypt_public_impl(std::string filename_pk, std::string filename_sk); 36 | ~encrypt_public_impl(); 37 | 38 | void handle_msg(pmt::pmt_t msg); 39 | 40 | pmt::pmt_t d_port_id_in, d_port_id_out; 41 | std::string d_filename_pk, d_filename_sk; 42 | unsigned char *d_pk, *d_sk; 43 | }; 44 | 45 | } // namespace nacl 46 | } // namespace gr 47 | 48 | #endif /* INCLUDED_NACL_ENCRYPT_PUBLIC_IMPL_H */ 49 | 50 | -------------------------------------------------------------------------------- /lib/encrypt_secret_impl.cc: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* Copyright 2015 Stefan Wunsch 3 | * 4 | * This is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This software is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this software; see the file COPYING. If not, write to 16 | * the Free Software Foundation, Inc., 51 Franklin Street, 17 | * Boston, MA 02110-1301, USA. 18 | */ 19 | 20 | #ifdef HAVE_CONFIG_H 21 | #include "config.h" 22 | #endif 23 | 24 | #include 25 | #include "encrypt_secret_impl.h" 26 | 27 | #include 28 | #include "sodium.h" 29 | 30 | namespace gr { 31 | namespace nacl { 32 | 33 | encrypt_secret::sptr 34 | encrypt_secret::make(std::string filename_key) 35 | { 36 | return gnuradio::get_initial_sptr 37 | (new encrypt_secret_impl(filename_key)); 38 | } 39 | 40 | /* 41 | * The private constructor 42 | */ 43 | encrypt_secret_impl::encrypt_secret_impl(std::string filename_key) 44 | : gr::block("encrypt_secret", 45 | gr::io_signature::make(0,0,0), 46 | gr::io_signature::make(0,0,0)) 47 | { 48 | d_filename_key = filename_key; 49 | d_key = new unsigned char[crypto_secretbox_KEYBYTES]; 50 | 51 | // Load key from file 52 | char c; 53 | 54 | std::ifstream file_key(filename_key.c_str()); 55 | if(!(file_key.is_open())) throw std::runtime_error("Key file not found."); 56 | for(int k=0; k data; 78 | for(int k=0; k msg_encrypted; msg_encrypted.resize(ciphertext_len); 102 | for(int k=0; k nonce_vec; nonce_vec.resize(crypto_secretbox_NONCEBYTES); 105 | for(int k=0; k 24 | 25 | namespace gr { 26 | namespace nacl { 27 | 28 | class encrypt_secret_impl : public encrypt_secret 29 | { 30 | private: 31 | // Nothing to declare in this block. 32 | 33 | public: 34 | encrypt_secret_impl(std::string filename_key); 35 | ~encrypt_secret_impl(); 36 | 37 | void handle_msg(pmt::pmt_t msg); 38 | 39 | pmt::pmt_t d_port_id_in, d_port_id_out; 40 | std::string d_filename_key; 41 | unsigned char *d_key; 42 | }; 43 | 44 | } // namespace nacl 45 | } // namespace gr 46 | 47 | #endif /* INCLUDED_NACL_ENCRYPT_SECRET_IMPL_H */ 48 | 49 | -------------------------------------------------------------------------------- /lib/generate_key_impl.cc: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* Copyright 2015 Stefan Wunsch 3 | * 4 | * This is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This software is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this software; see the file COPYING. If not, write to 16 | * the Free Software Foundation, Inc., 51 Franklin Street, 17 | * Boston, MA 02110-1301, USA. 18 | */ 19 | 20 | #ifdef HAVE_CONFIG_H 21 | #include "config.h" 22 | #endif 23 | 24 | #include 25 | #include "generate_key_impl.h" 26 | 27 | #include 28 | #include "sodium.h" 29 | 30 | namespace gr { 31 | namespace nacl { 32 | 33 | generate_key::sptr 34 | generate_key::make(std::string filename_key) 35 | { 36 | return gnuradio::get_initial_sptr 37 | (new generate_key_impl(filename_key)); 38 | } 39 | 40 | /* 41 | * The private constructor 42 | */ 43 | generate_key_impl::generate_key_impl(std::string filename_key) 44 | : gr::block("generate_key", 45 | gr::io_signature::make(0,0,0), 46 | gr::io_signature::make(0,0,0)) 47 | { 48 | unsigned char *key = new unsigned char[crypto_secretbox_KEYBYTES]; 49 | 50 | // generate keypair 51 | randombytes_buf(key,sizeof(key)); 52 | std::cout << "Key " << filename_key << " generated successfully." << std::endl; 53 | 54 | // save keys to files 55 | std::ofstream file_key(filename_key.c_str()); 56 | for(int k=0;k 24 | 25 | namespace gr { 26 | namespace nacl { 27 | 28 | class generate_key_impl : public generate_key 29 | { 30 | private: 31 | // Nothing to declare in this block. 32 | 33 | public: 34 | generate_key_impl(std::string filename_key); 35 | ~generate_key_impl(); 36 | }; 37 | 38 | } // namespace nacl 39 | } // namespace gr 40 | 41 | #endif /* INCLUDED_NACL_GENERATE_KEY_IMPL_H */ 42 | 43 | -------------------------------------------------------------------------------- /lib/generate_keypair_impl.cc: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* 3 | * Copyright 2015 Stefan Wunsch 4 | * 5 | * This is free software; you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation; either version 3, or (at your option) 8 | * any later version. 9 | * 10 | * This software is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this software; see the file COPYING. If not, write to 17 | * the Free Software Foundation, Inc., 51 Franklin Street, 18 | * Boston, MA 02110-1301, USA. 19 | */ 20 | 21 | #ifdef HAVE_CONFIG_H 22 | #include "config.h" 23 | #endif 24 | 25 | #include 26 | #include "generate_keypair_impl.h" 27 | 28 | #include 29 | #include "sodium.h" 30 | 31 | namespace gr { 32 | namespace nacl { 33 | 34 | generate_keypair::sptr 35 | generate_keypair::make(std::string filename_sk, std::string filename_pk) 36 | { 37 | return gnuradio::get_initial_sptr 38 | (new generate_keypair_impl(filename_sk, filename_pk)); 39 | } 40 | 41 | /* 42 | * The private constructor 43 | */ 44 | generate_keypair_impl::generate_keypair_impl(std::string filename_sk, std::string filename_pk) 45 | : gr::block("generate_keypair", 46 | gr::io_signature::make(0,0,0), 47 | gr::io_signature::make(0,0,0)) 48 | { 49 | unsigned char *pk = new unsigned char[crypto_box_PUBLICKEYBYTES]; 50 | unsigned char *sk = new unsigned char[crypto_box_SECRETKEYBYTES]; 51 | 52 | // generate keypair 53 | crypto_box_keypair(pk,sk); 54 | std::cout << "Keypair [" << filename_sk << ", " << filename_pk << "] generated successfully." << std::endl; 55 | 56 | // save keys to files 57 | std::ofstream file_sk(filename_sk.c_str()); 58 | for(int k=0;k 25 | 26 | namespace gr { 27 | namespace nacl { 28 | 29 | class generate_keypair_impl : public generate_keypair 30 | { 31 | private: 32 | // Nothing to declare in this block. 33 | 34 | public: 35 | generate_keypair_impl(std::string filename_sk, std::string filename_pk); 36 | ~generate_keypair_impl(); 37 | }; 38 | 39 | } // namespace nacl 40 | } // namespace gr 41 | 42 | #endif /* INCLUDED_NACL_GENERATE_KEYPAIR_IMPL_H */ 43 | 44 | -------------------------------------------------------------------------------- /lib/qa_nacl.cc: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Free Software Foundation, Inc. 3 | * 4 | * This file is part of GNU Radio 5 | * 6 | * GNU Radio is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation; either version 3, or (at your option) 9 | * any later version. 10 | * 11 | * GNU Radio is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with GNU Radio; see the file COPYING. If not, write to 18 | * the Free Software Foundation, Inc., 51 Franklin Street, 19 | * Boston, MA 02110-1301, USA. 20 | */ 21 | 22 | /* 23 | * This class gathers together all the test cases for the gr-filter 24 | * directory into a single test suite. As you create new test cases, 25 | * add them here. 26 | */ 27 | 28 | #include "qa_nacl.h" 29 | 30 | CppUnit::TestSuite * 31 | qa_nacl::suite() 32 | { 33 | CppUnit::TestSuite *s = new CppUnit::TestSuite("nacl"); 34 | 35 | return s; 36 | } 37 | -------------------------------------------------------------------------------- /lib/qa_nacl.h: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* 3 | * Copyright 2012 Free Software Foundation, Inc. 4 | * 5 | * This file is part of GNU Radio 6 | * 7 | * GNU Radio is free software; you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as published by 9 | * the Free Software Foundation; either version 3, or (at your option) 10 | * any later version. 11 | * 12 | * GNU Radio is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public License 18 | * along with GNU Radio; see the file COPYING. If not, write to 19 | * the Free Software Foundation, Inc., 51 Franklin Street, 20 | * Boston, MA 02110-1301, USA. 21 | */ 22 | 23 | #ifndef _QA_NACL_H_ 24 | #define _QA_NACL_H_ 25 | 26 | #include 27 | #include 28 | 29 | //! collect all the tests for the gr-filter directory 30 | 31 | class __GR_ATTR_EXPORT qa_nacl 32 | { 33 | public: 34 | //! return suite of tests for all of gr-filter directory 35 | static CppUnit::TestSuite *suite(); 36 | }; 37 | 38 | #endif /* _QA_NACL_H_ */ 39 | -------------------------------------------------------------------------------- /lib/test_nacl.cc: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | /* 3 | * Copyright 2012 Free Software Foundation, Inc. 4 | * 5 | * This file is part of GNU Radio 6 | * 7 | * GNU Radio is free software; you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as published by 9 | * the Free Software Foundation; either version 3, or (at your option) 10 | * any later version. 11 | * 12 | * GNU Radio is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public License 18 | * along with GNU Radio; see the file COPYING. If not, write to 19 | * the Free Software Foundation, Inc., 51 Franklin Street, 20 | * Boston, MA 02110-1301, USA. 21 | */ 22 | 23 | #ifdef HAVE_CONFIG_H 24 | #include "config.h" 25 | #endif 26 | 27 | #include 28 | #include 29 | 30 | #include 31 | #include "qa_nacl.h" 32 | #include 33 | #include 34 | 35 | int 36 | main (int argc, char **argv) 37 | { 38 | CppUnit::TextTestRunner runner; 39 | std::ofstream xmlfile(get_unittest_path("nacl.xml").c_str()); 40 | CppUnit::XmlOutputter *xmlout = new CppUnit::XmlOutputter(&runner.result(), xmlfile); 41 | 42 | runner.addTest(qa_nacl::suite()); 43 | runner.setOutputter(xmlout); 44 | 45 | bool was_successful = runner.run("", false); 46 | 47 | return was_successful ? 0 : 1; 48 | } 49 | -------------------------------------------------------------------------------- /python/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | ######################################################################## 21 | # Include python install macros 22 | ######################################################################## 23 | include(GrPython) 24 | if(NOT PYTHONINTERP_FOUND) 25 | return() 26 | endif() 27 | 28 | ######################################################################## 29 | # Install python sources 30 | ######################################################################## 31 | GR_PYTHON_INSTALL( 32 | FILES 33 | __init__.py 34 | DESTINATION ${GR_PYTHON_DIR}/nacl 35 | ) 36 | 37 | ######################################################################## 38 | # Handle the unit tests 39 | ######################################################################## 40 | include(GrTest) 41 | 42 | set(GR_TEST_TARGET_DEPS gnuradio-nacl) 43 | set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig) 44 | GR_ADD_TEST(qa_encrypt_public ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_encrypt_public.py) 45 | GR_ADD_TEST(qa_decrypt_public ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_decrypt_public.py) 46 | GR_ADD_TEST(qa_encrypt_secret ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_encrypt_secret.py) 47 | GR_ADD_TEST(qa_decrypt_secret ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_decrypt_secret.py) 48 | GR_ADD_TEST(qa_crypt_tagged_stream ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_crypt_tagged_stream.py) 49 | -------------------------------------------------------------------------------- /python/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2008,2009 Free Software Foundation, Inc. 3 | # 4 | # This application is free software; you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation; either version 3, or (at your option) 7 | # any later version. 8 | # 9 | # This application is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License along 15 | # with this program; if not, write to the Free Software Foundation, Inc., 16 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 17 | # 18 | 19 | # The presence of this file turns this directory into a Python package 20 | 21 | ''' 22 | This is the GNU Radio NACL module. Place your Python package 23 | description here (python/__init__.py). 24 | ''' 25 | 26 | # import swig generated symbols into the nacl namespace 27 | try: 28 | # this might fail if the module is python-only 29 | from nacl_swig import * 30 | except ImportError: 31 | pass 32 | 33 | # import any pure python here 34 | # 35 | -------------------------------------------------------------------------------- /python/build_utils.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2004,2009,2012 Free Software Foundation, Inc. 3 | # 4 | # This file is part of GNU Radio 5 | # 6 | # GNU Radio is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3, or (at your option) 9 | # any later version. 10 | # 11 | # GNU Radio is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with GNU Radio; see the file COPYING. If not, write to 18 | # the Free Software Foundation, Inc., 51 Franklin Street, 19 | # Boston, MA 02110-1301, USA. 20 | # 21 | 22 | """Misc utilities used at build time 23 | """ 24 | 25 | import re, os, os.path 26 | from build_utils_codes import * 27 | 28 | 29 | # set srcdir to the directory that contains Makefile.am 30 | try: 31 | srcdir = os.environ['srcdir'] 32 | except KeyError, e: 33 | srcdir = "." 34 | srcdir = srcdir + '/' 35 | 36 | # set do_makefile to either true or false dependeing on the environment 37 | try: 38 | if os.environ['do_makefile'] == '0': 39 | do_makefile = False 40 | else: 41 | do_makefile = True 42 | except KeyError, e: 43 | do_makefile = False 44 | 45 | # set do_sources to either true or false dependeing on the environment 46 | try: 47 | if os.environ['do_sources'] == '0': 48 | do_sources = False 49 | else: 50 | do_sources = True 51 | except KeyError, e: 52 | do_sources = True 53 | 54 | name_dict = {} 55 | 56 | def log_output_name (name): 57 | (base, ext) = os.path.splitext (name) 58 | ext = ext[1:] # drop the leading '.' 59 | 60 | entry = name_dict.setdefault (ext, []) 61 | entry.append (name) 62 | 63 | def open_and_log_name (name, dir): 64 | global do_sources 65 | if do_sources: 66 | f = open (name, dir) 67 | else: 68 | f = None 69 | log_output_name (name) 70 | return f 71 | 72 | def expand_template (d, template_filename, extra = ""): 73 | '''Given a dictionary D and a TEMPLATE_FILENAME, expand template into output file 74 | ''' 75 | global do_sources 76 | output_extension = extract_extension (template_filename) 77 | template = open_src (template_filename, 'r') 78 | output_name = d['NAME'] + extra + '.' + output_extension 79 | log_output_name (output_name) 80 | if do_sources: 81 | output = open (output_name, 'w') 82 | do_substitution (d, template, output) 83 | output.close () 84 | template.close () 85 | 86 | def output_glue (dirname): 87 | output_makefile_fragment () 88 | output_ifile_include (dirname) 89 | 90 | def output_makefile_fragment (): 91 | global do_makefile 92 | if not do_makefile: 93 | return 94 | # overwrite the source, which must be writable; this should have been 95 | # checked for beforehand in the top-level Makefile.gen.gen . 96 | f = open (os.path.join (os.environ.get('gendir', os.environ.get('srcdir', '.')), 'Makefile.gen'), 'w') 97 | f.write ('#\n# This file is machine generated. All edits will be overwritten\n#\n') 98 | output_subfrag (f, 'h') 99 | output_subfrag (f, 'i') 100 | output_subfrag (f, 'cc') 101 | f.close () 102 | 103 | def output_ifile_include (dirname): 104 | global do_sources 105 | if do_sources: 106 | f = open ('%s_generated.i' % (dirname,), 'w') 107 | f.write ('//\n// This file is machine generated. All edits will be overwritten\n//\n') 108 | files = name_dict.setdefault ('i', []) 109 | files.sort () 110 | f.write ('%{\n') 111 | for file in files: 112 | f.write ('#include <%s>\n' % (file[0:-1] + 'h',)) 113 | f.write ('%}\n\n') 114 | for file in files: 115 | f.write ('%%include <%s>\n' % (file,)) 116 | 117 | def output_subfrag (f, ext): 118 | files = name_dict.setdefault (ext, []) 119 | files.sort () 120 | f.write ("GENERATED_%s =" % (ext.upper ())) 121 | for file in files: 122 | f.write (" \\\n\t%s" % (file,)) 123 | f.write ("\n\n") 124 | 125 | def extract_extension (template_name): 126 | # template name is something like: GrFIRfilterXXX.h.t 127 | # we return everything between the penultimate . and .t 128 | mo = re.search (r'\.([a-z]+)\.t$', template_name) 129 | if not mo: 130 | raise ValueError, "Incorrectly formed template_name '%s'" % (template_name,) 131 | return mo.group (1) 132 | 133 | def open_src (name, mode): 134 | global srcdir 135 | return open (os.path.join (srcdir, name), mode) 136 | 137 | def do_substitution (d, in_file, out_file): 138 | def repl (match_obj): 139 | key = match_obj.group (1) 140 | # print key 141 | return d[key] 142 | 143 | inp = in_file.read () 144 | out = re.sub (r"@([a-zA-Z0-9_]+)@", repl, inp) 145 | out_file.write (out) 146 | 147 | 148 | 149 | copyright = '''/* -*- c++ -*- */ 150 | /* 151 | * Copyright 2003,2004 Free Software Foundation, Inc. 152 | * 153 | * This file is part of GNU Radio 154 | * 155 | * GNU Radio is free software; you can redistribute it and/or modify 156 | * it under the terms of the GNU General Public License as published by 157 | * the Free Software Foundation; either version 3, or (at your option) 158 | * any later version. 159 | * 160 | * GNU Radio is distributed in the hope that it will be useful, 161 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 162 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 163 | * GNU General Public License for more details. 164 | * 165 | * You should have received a copy of the GNU General Public License 166 | * along with GNU Radio; see the file COPYING. If not, write to 167 | * the Free Software Foundation, Inc., 51 Franklin Street, 168 | * Boston, MA 02110-1301, USA. 169 | */ 170 | ''' 171 | 172 | def is_complex (code3): 173 | if i_code (code3) == 'c' or o_code (code3) == 'c': 174 | return '1' 175 | else: 176 | return '0' 177 | 178 | 179 | def standard_dict (name, code3, package='gr'): 180 | d = {} 181 | d['NAME'] = name 182 | d['NAME_IMPL'] = name+'_impl' 183 | d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper()) 184 | d['GUARD_NAME_IMPL'] = 'INCLUDED_%s_%s_IMPL_H' % (package.upper(), name.upper()) 185 | d['BASE_NAME'] = re.sub ('^' + package + '_', '', name) 186 | d['SPTR_NAME'] = '%s_sptr' % name 187 | d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten' 188 | d['COPYRIGHT'] = copyright 189 | d['TYPE'] = i_type (code3) 190 | d['I_TYPE'] = i_type (code3) 191 | d['O_TYPE'] = o_type (code3) 192 | d['TAP_TYPE'] = tap_type (code3) 193 | d['IS_COMPLEX'] = is_complex (code3) 194 | return d 195 | 196 | 197 | def standard_dict2 (name, code3, package): 198 | d = {} 199 | d['NAME'] = name 200 | d['BASE_NAME'] = name 201 | d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper()) 202 | d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten' 203 | d['COPYRIGHT'] = copyright 204 | d['TYPE'] = i_type (code3) 205 | d['I_TYPE'] = i_type (code3) 206 | d['O_TYPE'] = o_type (code3) 207 | d['TAP_TYPE'] = tap_type (code3) 208 | d['IS_COMPLEX'] = is_complex (code3) 209 | return d 210 | 211 | def standard_impl_dict2 (name, code3, package): 212 | d = {} 213 | d['NAME'] = name 214 | d['IMPL_NAME'] = name 215 | d['BASE_NAME'] = name.rstrip("impl").rstrip("_") 216 | d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper()) 217 | d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten' 218 | d['COPYRIGHT'] = copyright 219 | d['FIR_TYPE'] = "fir_filter_" + code3 220 | d['CFIR_TYPE'] = "fir_filter_" + code3[0:2] + 'c' 221 | d['TYPE'] = i_type (code3) 222 | d['I_TYPE'] = i_type (code3) 223 | d['O_TYPE'] = o_type (code3) 224 | d['TAP_TYPE'] = tap_type (code3) 225 | d['IS_COMPLEX'] = is_complex (code3) 226 | return d 227 | -------------------------------------------------------------------------------- /python/build_utils_codes.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2004 Free Software Foundation, Inc. 3 | # 4 | # This file is part of GNU Radio 5 | # 6 | # GNU Radio is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3, or (at your option) 9 | # any later version. 10 | # 11 | # GNU Radio is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with GNU Radio; see the file COPYING. If not, write to 18 | # the Free Software Foundation, Inc., 51 Franklin Street, 19 | # Boston, MA 02110-1301, USA. 20 | # 21 | 22 | def i_code (code3): 23 | return code3[0] 24 | 25 | def o_code (code3): 26 | if len (code3) >= 2: 27 | return code3[1] 28 | else: 29 | return code3[0] 30 | 31 | def tap_code (code3): 32 | if len (code3) >= 3: 33 | return code3[2] 34 | else: 35 | return code3[0] 36 | 37 | def i_type (code3): 38 | return char_to_type[i_code (code3)] 39 | 40 | def o_type (code3): 41 | return char_to_type[o_code (code3)] 42 | 43 | def tap_type (code3): 44 | return char_to_type[tap_code (code3)] 45 | 46 | 47 | char_to_type = {} 48 | char_to_type['s'] = 'short' 49 | char_to_type['i'] = 'int' 50 | char_to_type['f'] = 'float' 51 | char_to_type['c'] = 'gr_complex' 52 | char_to_type['b'] = 'unsigned char' 53 | -------------------------------------------------------------------------------- /python/qa_crypt_tagged_stream.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # Copyright 2015 Stefan Wunsch 4 | # 5 | # This is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # This software is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this software; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | # 20 | 21 | from gnuradio import gr, gr_unittest 22 | from gnuradio import blocks 23 | import nacl_swig as nacl 24 | 25 | class qa_crypt_tagged_stream (gr_unittest.TestCase): 26 | 27 | def setUp (self): 28 | self.tb = gr.top_block () 29 | 30 | def tearDown (self): 31 | self.tb = None 32 | 33 | def test_001_t (self): 34 | # set up fg 35 | data = [ord('t'),ord('e'),ord('s'),ord('t'),ord('#')]*8 36 | packet_len = len(data)/8 37 | key = "12345678123456781234567812345678" 38 | nonce = "abcdefghabcdefghabcdefgh" 39 | rotate_nonce = True 40 | 41 | src = blocks.vector_source_b(data) 42 | s2ts = blocks.stream_to_tagged_stream(1,1,packet_len,"packet_len") 43 | encrypt = nacl.crypt_tagged_stream(key,nonce,rotate_nonce) 44 | decrypt = nacl.crypt_tagged_stream(key,nonce,rotate_nonce) 45 | sink_encrypt = blocks.vector_sink_b() 46 | sink_decrypt = blocks.vector_sink_b() 47 | 48 | self.tb.connect(src,s2ts,encrypt,decrypt,sink_decrypt) 49 | self.tb.connect(encrypt,sink_encrypt) 50 | 51 | self.tb.run () 52 | # print data 53 | print "INPUT DATA" 54 | for k in range(len(data)): 55 | print chr(data[k]), 56 | print 57 | print "INPUT DATA ENCRYPTED" 58 | for k in range(len(sink_encrypt.data())): 59 | print chr(sink_encrypt.data()[k]), 60 | print 61 | print "OUTPUT DATA (EQUALS INPUT DATA ENCRYPTED AND DECRYPTED)" 62 | for k in range(len(sink_decrypt.data())): 63 | print chr(sink_decrypt.data()[k]), 64 | print 65 | 66 | # check data 67 | data_out = sink_decrypt.data() 68 | for k in range(len(data)): 69 | self.assertEqual(data[k],data_out[k]) 70 | 71 | if __name__ == '__main__': 72 | gr_unittest.run(qa_crypt_tagged_stream)#, "qa_crypt_tagged_stream.xml") 73 | -------------------------------------------------------------------------------- /python/qa_decrypt_public.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # /* 4 | # * Copyright 2015 Stefan Wunsch 5 | # * 6 | # * This is free software; you can redistribute it and/or modify 7 | # * it under the terms of the GNU General Public License as published by 8 | # * the Free Software Foundation; either version 3, or (at your option) 9 | # * any later version. 10 | # * 11 | # * This software is distributed in the hope that it will be useful, 12 | # * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # * GNU General Public License for more details. 15 | # * 16 | # * You should have received a copy of the GNU General Public License 17 | # * along with this software; see the file COPYING. If not, write to 18 | # * the Free Software Foundation, Inc., 51 Franklin Street, 19 | # * Boston, MA 02110-1301, USA. 20 | # */ 21 | # 22 | 23 | from gnuradio import gr, gr_unittest 24 | from gnuradio import blocks 25 | import nacl_swig as nacl 26 | import pmt 27 | from time import sleep 28 | 29 | class qa_decrypt_public (gr_unittest.TestCase): 30 | 31 | def setUp (self): 32 | self.tb = gr.top_block () 33 | 34 | def tearDown (self): 35 | self.tb = None 36 | 37 | def test_001_t (self): 38 | data = [ord('a'),ord('b'),ord('c'),ord('d')] 39 | msg = pmt.list1(pmt.list2(pmt.string_to_symbol("msg_clear"),pmt.init_u8vector(len(data),data))) 40 | filename_sk_a = "secret.a" 41 | filename_pk_a = "public.a" 42 | nacl.generate_keypair(filename_sk_a,filename_pk_a) 43 | filename_sk_b = "secret.b" 44 | filename_pk_b = "public.b" 45 | nacl.generate_keypair(filename_sk_b,filename_pk_b) 46 | 47 | strobe = blocks.message_strobe(msg, 100) 48 | encrypt_public = nacl.encrypt_public(filename_pk_b,filename_sk_a) 49 | decrypt_public = nacl.decrypt_public(filename_pk_a,filename_sk_b) 50 | debug = blocks.message_debug() 51 | 52 | self.tb.msg_connect(strobe,"strobe",encrypt_public,"Msg clear") 53 | self.tb.msg_connect(encrypt_public,"Msg encrypted",decrypt_public,"Msg encrypted") 54 | self.tb.msg_connect(decrypt_public,"Msg decrypted",debug,"store") 55 | 56 | self.tb.start() 57 | sleep(0.15) 58 | self.tb.stop() 59 | self.tb.wait() 60 | 61 | # check results 62 | msg_out = debug.get_message(0) 63 | msg_symbol = pmt.symbol_to_string(pmt.nth(0,pmt.nth(0,msg_out))) 64 | msg_decrypted = pmt.u8vector_elements(pmt.nth(1,pmt.nth(0,msg_out))) 65 | print msg_symbol, msg_decrypted 66 | print "msg_clear", data 67 | 68 | for k in range(len(data)): 69 | self.assertEqual(data[k],msg_decrypted[k]) 70 | 71 | if __name__ == '__main__': 72 | gr_unittest.run(qa_decrypt_public)#, "qa_decrypt_public.xml") 73 | -------------------------------------------------------------------------------- /python/qa_decrypt_secret.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # Copyright 2015 Stefan Wunsch 4 | # 5 | # This is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # This software is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this software; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | # 20 | 21 | from gnuradio import gr, gr_unittest 22 | from gnuradio import blocks 23 | import nacl_swig as nacl 24 | import pmt 25 | from time import sleep 26 | 27 | class qa_decrypt_secret (gr_unittest.TestCase): 28 | 29 | def setUp (self): 30 | self.tb = gr.top_block () 31 | 32 | def tearDown (self): 33 | self.tb = None 34 | 35 | def test_001_t (self): 36 | data = [ord('a'),ord('b'),ord('c'),ord('d')] 37 | msg = pmt.list1(pmt.list2(pmt.string_to_symbol("msg_clear"),pmt.init_u8vector(len(data),data))) 38 | filename_key = "secret.a" 39 | nacl.generate_key(filename_key) 40 | 41 | strobe = blocks.message_strobe(msg, 100) 42 | encrypt_secret = nacl.encrypt_secret(filename_key) 43 | decrypt_secret = nacl.decrypt_secret(filename_key) 44 | debug = blocks.message_debug() 45 | 46 | self.tb.msg_connect(strobe,"strobe",encrypt_secret,"Msg clear") 47 | self.tb.msg_connect(encrypt_secret,"Msg encrypted",decrypt_secret,"Msg encrypted") 48 | self.tb.msg_connect(decrypt_secret,"Msg decrypted",debug,"store") 49 | 50 | self.tb.start() 51 | sleep(0.15) 52 | self.tb.stop() 53 | self.tb.wait() 54 | 55 | # check results 56 | msg_out = debug.get_message(0) 57 | msg_symbol = pmt.symbol_to_string(pmt.nth(0,pmt.nth(0,msg_out))) 58 | msg_decrypted = pmt.u8vector_elements(pmt.nth(1,pmt.nth(0,msg_out))) 59 | print msg_symbol, msg_decrypted 60 | print "msg_clear", data 61 | 62 | for k in range(len(data)): 63 | self.assertEqual(data[k],msg_decrypted[k]) 64 | 65 | 66 | if __name__ == '__main__': 67 | gr_unittest.run(qa_decrypt_secret)#, "qa_decrypt_secret.xml") 68 | -------------------------------------------------------------------------------- /python/qa_encrypt_public.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # Copyright 2015 <+YOU OR YOUR COMPANY+>. 5 | # 6 | # This is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3, or (at your option) 9 | # any later version. 10 | # 11 | # This software is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this software; see the file COPYING. If not, write to 18 | # the Free Software Foundation, Inc., 51 Franklin Street, 19 | # Boston, MA 02110-1301, USA. 20 | # 21 | 22 | from gnuradio import gr, gr_unittest 23 | from gnuradio import blocks 24 | import nacl_swig as nacl 25 | import pmt 26 | from time import sleep 27 | 28 | class qa_encrypt_public (gr_unittest.TestCase): 29 | 30 | def setUp (self): 31 | self.tb = gr.top_block () 32 | 33 | def tearDown (self): 34 | self.tb = None 35 | 36 | def test_001_t (self): 37 | data = [ord('t'),ord('e'),ord('s'),ord('t')] 38 | msg = pmt.list1(pmt.list2(pmt.string_to_symbol("msg_clear"),pmt.init_u8vector(len(data),data))) 39 | filename_sk = "secret.key" 40 | filename_pk = "public.key" 41 | nacl.generate_keypair(filename_sk,filename_pk) 42 | 43 | strobe = blocks.message_strobe(msg, 100) 44 | encrypt_public = nacl.encrypt_public(filename_pk,filename_sk) 45 | debug = blocks.message_debug() 46 | 47 | self.tb.msg_connect(strobe,"strobe",encrypt_public,"Msg clear") 48 | self.tb.msg_connect(encrypt_public,"Msg encrypted",debug,"store") 49 | 50 | self.tb.start() 51 | sleep(0.15) 52 | self.tb.stop() 53 | self.tb.wait() 54 | 55 | # check results 56 | msg_stored = debug.get_message(0) 57 | nonce = pmt.nth(0,msg_stored) 58 | msg_encrypted = pmt.nth(1,msg_stored) 59 | print pmt.symbol_to_string(pmt.nth(0,nonce)), pmt.u8vector_elements(pmt.nth(1,nonce)) 60 | print pmt.symbol_to_string(pmt.nth(0,msg_encrypted)), pmt.u8vector_elements(pmt.nth(1,msg_encrypted)) 61 | 62 | 63 | if __name__ == '__main__': 64 | gr_unittest.run(qa_encrypt_public)#, "qa_encrypt_public.xml") 65 | -------------------------------------------------------------------------------- /python/qa_encrypt_secret.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # Copyright 2015 Stefan Wunsch 4 | # 5 | # This is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # This software is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this software; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | # 20 | 21 | from gnuradio import gr, gr_unittest 22 | from gnuradio import blocks 23 | import nacl_swig as nacl 24 | import pmt 25 | from time import sleep 26 | 27 | class qa_encrypt_secret (gr_unittest.TestCase): 28 | 29 | def setUp (self): 30 | self.tb = gr.top_block () 31 | 32 | def tearDown (self): 33 | self.tb = None 34 | 35 | def test_001_t (self): 36 | data = [ord('t'),ord('e'),ord('s'),ord('t')] 37 | msg = pmt.list1(pmt.list2(pmt.string_to_symbol("msg_clear"),pmt.init_u8vector(len(data),data))) 38 | filename_key = "secret.key" 39 | nacl.generate_key(filename_key) 40 | 41 | strobe = blocks.message_strobe(msg, 100) 42 | encrypt_secret = nacl.encrypt_secret(filename_key) 43 | debug = blocks.message_debug() 44 | 45 | self.tb.msg_connect(strobe,"strobe",encrypt_secret,"Msg clear") 46 | self.tb.msg_connect(encrypt_secret,"Msg encrypted",debug,"store") 47 | 48 | self.tb.start() 49 | sleep(0.15) 50 | self.tb.stop() 51 | self.tb.wait() 52 | 53 | # check results 54 | msg_stored = debug.get_message(0) 55 | nonce = pmt.nth(0,msg_stored) 56 | msg_encrypted = pmt.nth(1,msg_stored) 57 | print pmt.symbol_to_string(pmt.nth(0,nonce)), pmt.u8vector_elements(pmt.nth(1,nonce)) 58 | print pmt.symbol_to_string(pmt.nth(0,msg_encrypted)), pmt.u8vector_elements(pmt.nth(1,msg_encrypted)) 59 | 60 | 61 | if __name__ == '__main__': 62 | gr_unittest.run(qa_encrypt_secret)#, "qa_encrypt_secret.xml") 63 | -------------------------------------------------------------------------------- /swig/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2011 Free Software Foundation, Inc. 2 | # 3 | # This file is part of GNU Radio 4 | # 5 | # GNU Radio is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | # 10 | # GNU Radio is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with GNU Radio; see the file COPYING. If not, write to 17 | # the Free Software Foundation, Inc., 51 Franklin Street, 18 | # Boston, MA 02110-1301, USA. 19 | 20 | ######################################################################## 21 | # Check if there is C++ code at all 22 | ######################################################################## 23 | if(NOT nacl_sources) 24 | MESSAGE(STATUS "No C++ sources... skipping swig/") 25 | return() 26 | endif(NOT nacl_sources) 27 | 28 | ######################################################################## 29 | # Include swig generation macros 30 | ######################################################################## 31 | find_package(SWIG) 32 | find_package(PythonLibs 2) 33 | if(NOT SWIG_FOUND OR NOT PYTHONLIBS_FOUND) 34 | return() 35 | endif() 36 | include(GrSwig) 37 | include(GrPython) 38 | 39 | ######################################################################## 40 | # Setup swig generation 41 | ######################################################################## 42 | foreach(incdir ${GNURADIO_RUNTIME_INCLUDE_DIRS}) 43 | list(APPEND GR_SWIG_INCLUDE_DIRS ${incdir}/gnuradio/swig) 44 | endforeach(incdir) 45 | 46 | set(GR_SWIG_LIBRARIES gnuradio-nacl) 47 | set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/nacl_swig_doc.i) 48 | set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include) 49 | 50 | GR_SWIG_MAKE(nacl_swig nacl_swig.i) 51 | 52 | ######################################################################## 53 | # Install the build swig module 54 | ######################################################################## 55 | GR_SWIG_INSTALL(TARGETS nacl_swig DESTINATION ${GR_PYTHON_DIR}/nacl) 56 | 57 | ######################################################################## 58 | # Install swig .i files for development 59 | ######################################################################## 60 | install( 61 | FILES 62 | nacl_swig.i 63 | ${CMAKE_CURRENT_BINARY_DIR}/nacl_swig_doc.i 64 | DESTINATION ${GR_INCLUDE_DIR}/nacl/swig 65 | ) 66 | -------------------------------------------------------------------------------- /swig/nacl_swig.i: -------------------------------------------------------------------------------- 1 | /* -*- c++ -*- */ 2 | 3 | #define NACL_API 4 | 5 | %include "gnuradio.i" // the common stuff 6 | 7 | //load generated python docstrings 8 | %include "nacl_swig_doc.i" 9 | 10 | %{ 11 | #include "nacl/encrypt_public.h" 12 | #include "nacl/generate_keypair.h" 13 | #include "nacl/decrypt_public.h" 14 | #include "nacl/generate_key.h" 15 | #include "nacl/encrypt_secret.h" 16 | #include "nacl/decrypt_secret.h" 17 | #include "nacl/crypt_tagged_stream.h" 18 | %} 19 | 20 | 21 | %include "nacl/encrypt_public.h" 22 | GR_SWIG_BLOCK_MAGIC2(nacl, encrypt_public); 23 | %include "nacl/generate_keypair.h" 24 | GR_SWIG_BLOCK_MAGIC2(nacl, generate_keypair); 25 | %include "nacl/decrypt_public.h" 26 | GR_SWIG_BLOCK_MAGIC2(nacl, decrypt_public); 27 | %include "nacl/generate_key.h" 28 | GR_SWIG_BLOCK_MAGIC2(nacl, generate_key); 29 | %include "nacl/encrypt_secret.h" 30 | GR_SWIG_BLOCK_MAGIC2(nacl, encrypt_secret); 31 | %include "nacl/decrypt_secret.h" 32 | GR_SWIG_BLOCK_MAGIC2(nacl, decrypt_secret); 33 | %include "nacl/crypt_tagged_stream.h" 34 | GR_SWIG_BLOCK_MAGIC2(nacl, crypt_tagged_stream); 35 | --------------------------------------------------------------------------------