.
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
cmake_minimum_required(VERSION 2.8.3)
|
||||
project(hos_libhttpserver)
|
||||
|
||||
## Find catkin macros and libraries
|
||||
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
|
||||
## is used, also find other catkin packages
|
||||
find_package(catkin REQUIRED)
|
||||
|
||||
## System dependencies are found with CMake's conventions
|
||||
# find_package(Boost REQUIRED COMPONENTS system)
|
||||
|
||||
|
||||
## Uncomment this if the package has a setup.py. This macro ensures
|
||||
## modules and global scripts declared therein get installed
|
||||
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
|
||||
# catkin_python_setup()
|
||||
|
||||
################################################
|
||||
## Declare ROS messages, services and actions ##
|
||||
################################################
|
||||
|
||||
## To declare and build messages, services or actions from within this
|
||||
## package, follow these steps:
|
||||
## * Let MSG_DEP_SET be the set of packages whose message types you use in
|
||||
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
|
||||
## * In the file package.xml:
|
||||
## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET
|
||||
## * If MSG_DEP_SET isn't empty the following dependencies might have been
|
||||
## pulled in transitively but can be declared for certainty nonetheless:
|
||||
## * add a build_depend tag for "message_generation"
|
||||
## * add a run_depend tag for "message_runtime"
|
||||
## * In this file (CMakeLists.txt):
|
||||
## * add "message_generation" and every package in MSG_DEP_SET to
|
||||
## find_package(catkin REQUIRED COMPONENTS ...)
|
||||
## * add "message_runtime" and every package in MSG_DEP_SET to
|
||||
## catkin_package(CATKIN_DEPENDS ...)
|
||||
## * uncomment the add_*_files sections below as needed
|
||||
## and list every .msg/.srv/.action file to be processed
|
||||
## * uncomment the generate_messages entry below
|
||||
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
|
||||
|
||||
## Generate messages in the 'msg' folder
|
||||
# add_message_files(
|
||||
# FILES
|
||||
# Message1.msg
|
||||
# Message2.msg
|
||||
# )
|
||||
|
||||
## Generate services in the 'srv' folder
|
||||
# add_service_files(
|
||||
# FILES
|
||||
# Service1.srv
|
||||
# Service2.srv
|
||||
# )
|
||||
|
||||
## Generate actions in the 'action' folder
|
||||
# add_action_files(
|
||||
# FILES
|
||||
# Action1.action
|
||||
# Action2.action
|
||||
# )
|
||||
|
||||
## Generate added messages and services with any dependencies listed here
|
||||
# generate_messages(
|
||||
# DEPENDENCIES
|
||||
# std_msgs # Or other packages containing msgs
|
||||
# )
|
||||
|
||||
###################################
|
||||
## catkin specific configuration ##
|
||||
###################################
|
||||
## The catkin_package macro generates cmake config files for your package
|
||||
## Declare things to be passed to dependent projects
|
||||
## INCLUDE_DIRS: uncomment this if you package contains header files
|
||||
## LIBRARIES: libraries you create in this project that dependent projects also need
|
||||
## CATKIN_DEPENDS: catkin_packages dependent projects also need
|
||||
## DEPENDS: system dependencies of this project that dependent projects also need
|
||||
catkin_package(
|
||||
# INCLUDE_DIRS include
|
||||
# LIBRARIES hos_libhttpserver
|
||||
# CATKIN_DEPENDS other_catkin_pkg
|
||||
# DEPENDS system_lib
|
||||
)
|
||||
|
||||
###########
|
||||
## Build ##
|
||||
###########
|
||||
|
||||
|
||||
include(ExternalProject)
|
||||
|
||||
ExternalProject_Add( libgcrypt_project
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/libgcrypt
|
||||
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/src/libgcrypt/configure --prefix ${CATKIN_DEVEL_PREFIX} --libdir=${CATKIN_DEVEL_PREFIX}/lib
|
||||
BUILD_COMMAND make all
|
||||
INSTALL_COMMAND make install
|
||||
)
|
||||
|
||||
|
||||
ExternalProject_Add( libmicrohttpd_project
|
||||
DEPENDS libgcrypt_project
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/libmicrohttpd
|
||||
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/src/libmicrohttpd/configure --prefix ${CATKIN_DEVEL_PREFIX} --with-libgcrypt-prefix=${CATKIN_DEVEL_PREFIX} --libdir=${CATKIN_DEVEL_PREFIX}/lib
|
||||
BUILD_COMMAND make all
|
||||
INSTALL_COMMAND make install
|
||||
)
|
||||
|
||||
|
||||
ExternalProject_Add( libhttpserver
|
||||
DEPENDS libmicrohttpd_project
|
||||
#SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/libhttpserver
|
||||
DOWNLOAD_COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/src/libhttpserver ${CMAKE_CURRENT_BINARY_DIR} && cd ${CMAKE_CURRENT_BINARY_DIR}/libhttpserver && ./bootstrap
|
||||
CONFIGURE_COMMAND PKG_CONFIG_PATH=${CATKIN_DEVEL_PREFIX}/lib/pkgconfig ${CMAKE_CURRENT_BINARY_DIR}/libhttpserver/configure --prefix ${CATKIN_DEVEL_PREFIX} --libdir=${CATKIN_DEVEL_PREFIX}/lib --enable-cpp11
|
||||
BUILD_COMMAND make
|
||||
INSTALL_COMMAND make install
|
||||
)
|
||||
|
||||
|
||||
## Specify additional locations of header files
|
||||
## Your package locations should be listed before other locations
|
||||
# include_directories(include)
|
||||
|
||||
## Declare a cpp library
|
||||
# add_library(hos_libhttpserver
|
||||
# src/${PROJECT_NAME}/hos_libhttpserver.cpp
|
||||
# )
|
||||
|
||||
## Declare a cpp executable
|
||||
# add_executable(hos_libhttpserver_node src/hos_libhttpserver_node.cpp)
|
||||
|
||||
## Add cmake target dependencies of the executable/library
|
||||
## as an example, message headers may need to be generated before nodes
|
||||
# add_dependencies(hos_libhttpserver_node hos_libhttpserver_generate_messages_cpp)
|
||||
|
||||
## Specify libraries to link a library or executable target against
|
||||
# target_link_libraries(hos_libhttpserver_node
|
||||
# ${catkin_LIBRARIES}
|
||||
# )
|
||||
|
||||
#############
|
||||
## Install ##
|
||||
#############
|
||||
|
||||
|
||||
install(DIRECTORY include/${PROJECT_NAME}/
|
||||
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
|
||||
)
|
||||
install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/lib/
|
||||
DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
|
||||
)
|
||||
install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/bin/
|
||||
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
|
||||
USE_SOURCE_PERMISSIONS
|
||||
)
|
||||
|
||||
# all install targets should use catkin DESTINATION variables
|
||||
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
|
||||
|
||||
## Mark executable scripts (Python etc.) for installation
|
||||
## in contrast to setup.py, you can choose the destination
|
||||
# install(PROGRAMS
|
||||
# scripts/my_python_script
|
||||
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
|
||||
# )
|
||||
|
||||
## Mark executables and/or libraries for installation
|
||||
# install(TARGETS hos_libhttpserver hos_libhttpserver_node
|
||||
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
|
||||
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
|
||||
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
|
||||
# )
|
||||
|
||||
## Mark cpp header files for installation
|
||||
# install(DIRECTORY include/${PROJECT_NAME}/
|
||||
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
|
||||
# FILES_MATCHING PATTERN "*.h"
|
||||
# PATTERN ".svn" EXCLUDE
|
||||
# )
|
||||
|
||||
## Mark other files for installation (e.g. launch and bag files, etc.)
|
||||
# install(FILES
|
||||
# # myfile1
|
||||
# # myfile2
|
||||
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
|
||||
# )
|
||||
|
||||
#############
|
||||
## Testing ##
|
||||
#############
|
||||
|
||||
## Add gtest based cpp test target and link libraries
|
||||
# catkin_add_gtest(${PROJECT_NAME}-test test/test_hos_libhttpserver.cpp)
|
||||
# if(TARGET ${PROJECT_NAME}-test)
|
||||
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
|
||||
# endif()
|
||||
|
||||
## Add folders to be run by python nosetests
|
||||
# catkin_add_nosetests(test)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#ifndef _HTTPSERVER_HPP_
|
||||
#define _HTTPSERVER_HPP_
|
||||
|
||||
#define _HTTPSERVER_HPP_INSIDE_
|
||||
|
||||
#include "httpserver/http_utils.hpp"
|
||||
#include "httpserver/details/http_endpoint.hpp"
|
||||
#include "httpserver/http_resource.hpp"
|
||||
#include "httpserver/http_response.hpp"
|
||||
#include "httpserver/http_response_builder.hpp"
|
||||
#include "httpserver/http_request.hpp"
|
||||
#include "httpserver/event_supplier.hpp"
|
||||
#include "httpserver/details/event_tuple.hpp"
|
||||
#include "httpserver/details/http_resource_mirror.hpp"
|
||||
#include "httpserver/webserver.hpp"
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,374 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _BINDERS_HPP_
|
||||
#define _BINDERS_HPP_
|
||||
|
||||
namespace httpserver {
|
||||
namespace details
|
||||
{
|
||||
namespace binders
|
||||
{
|
||||
class generic_class;
|
||||
const int MEMFUNC_SIZE = sizeof(void (generic_class::*)());
|
||||
|
||||
template<int N>
|
||||
struct converter
|
||||
{
|
||||
template<typename X,
|
||||
typename func_type,
|
||||
typename generic_mem_func_type>
|
||||
inline static generic_class* convert(
|
||||
X* pmem,
|
||||
func_type func,
|
||||
generic_mem_func_type &bound
|
||||
)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct converter<MEMFUNC_SIZE>
|
||||
{
|
||||
template<typename X,
|
||||
typename func_type,
|
||||
typename generic_mem_func_type>
|
||||
inline static generic_class* convert(
|
||||
X* pmem,
|
||||
func_type func,
|
||||
generic_mem_func_type &bound
|
||||
)
|
||||
{
|
||||
bound = reinterpret_cast<generic_mem_func_type>(func);
|
||||
return reinterpret_cast<generic_class*>(pmem);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename generic_mem,
|
||||
typename static_function,
|
||||
typename void_static_function>
|
||||
class binder
|
||||
{
|
||||
private:
|
||||
typedef void (generic_class::*generic_mem_fun)();
|
||||
typedef void (*generic_mem_ptr)();
|
||||
|
||||
generic_class *pmem;
|
||||
generic_mem_fun _pfunc;
|
||||
generic_mem_ptr _spfunc;
|
||||
|
||||
public:
|
||||
binder()
|
||||
{
|
||||
}
|
||||
|
||||
binder(const binder& o):
|
||||
pmem(o.pmem),
|
||||
_pfunc(o._pfunc),
|
||||
_spfunc(o._spfunc)
|
||||
{
|
||||
}
|
||||
|
||||
template<typename X, typename Y>
|
||||
binder(X* pmem, Y fun):
|
||||
pmem(converter<sizeof(fun)>::convert(pmem, fun, _pfunc)),
|
||||
_spfunc(0)
|
||||
{
|
||||
}
|
||||
|
||||
template<class DC, class parent_invoker>
|
||||
binder(DC* pp, parent_invoker invoker, static_function fun):
|
||||
pmem(converter<sizeof(invoker)>::convert(pp, invoker, _pfunc)),
|
||||
_spfunc(reinterpret_cast<generic_mem_ptr>(fun))
|
||||
{
|
||||
}
|
||||
|
||||
inline generic_class* exec() const
|
||||
{
|
||||
return pmem;
|
||||
}
|
||||
inline generic_mem get_mem_ptr() const
|
||||
{
|
||||
return reinterpret_cast<const generic_mem>(_pfunc);
|
||||
}
|
||||
inline void_static_function get_static_func() const
|
||||
{
|
||||
return reinterpret_cast<void_static_function>(_spfunc);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename RET_TYPE=void>
|
||||
class functor_zero
|
||||
{
|
||||
private:
|
||||
typedef RET_TYPE (*static_function)();
|
||||
typedef RET_TYPE (*void_static_function)();
|
||||
typedef RET_TYPE (generic_class::*generic_mem)();
|
||||
typedef binder<generic_mem,
|
||||
static_function, void_static_function> binder_type;
|
||||
binder_type _binder;
|
||||
|
||||
RET_TYPE exec_static() const
|
||||
{
|
||||
return (*(_binder.get_static_func()))();
|
||||
}
|
||||
|
||||
functor_zero& operator=(const functor_zero&)
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
public:
|
||||
typedef functor_zero type;
|
||||
functor_zero() { }
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_zero(Y* pmem, RET_TYPE(X::*func)()):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_zero(Y* pmem, RET_TYPE(X::*func)() const ):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
functor_zero(RET_TYPE(*func)() ):
|
||||
_binder(this, &functor_zero::exec_static, func)
|
||||
{
|
||||
}
|
||||
|
||||
RET_TYPE operator() () const
|
||||
{
|
||||
return (_binder.exec()->*(_binder.get_mem_ptr()))();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename PAR1, typename RET_TYPE=void>
|
||||
class functor_one
|
||||
{
|
||||
private:
|
||||
typedef RET_TYPE (*static_function)(PAR1 p1);
|
||||
typedef RET_TYPE (*void_static_function)(PAR1 p1);
|
||||
typedef RET_TYPE (generic_class::*generic_mem)(PAR1 p1);
|
||||
typedef binder<generic_mem,
|
||||
static_function, void_static_function> binder_type;
|
||||
binder_type _binder;
|
||||
|
||||
RET_TYPE exec_static(PAR1 p1) const
|
||||
{
|
||||
return (*(_binder.get_static_func()))(p1);
|
||||
}
|
||||
|
||||
functor_one& operator=(const functor_one&)
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
public:
|
||||
typedef functor_one type;
|
||||
functor_one() { }
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_one(Y* pmem, RET_TYPE(X::*func)(PAR1 p1) ):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_one(Y* pmem, RET_TYPE(X::*func)(PAR1 p1) const ):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
functor_one(RET_TYPE(*func)(PAR1 p1) ):
|
||||
_binder(this, &functor_one::exec_static, func)
|
||||
{
|
||||
}
|
||||
|
||||
RET_TYPE operator() (PAR1 p1) const
|
||||
{
|
||||
return (_binder.exec()->*(_binder.get_mem_ptr()))(p1);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename PAR1, typename PAR2, typename RET_TYPE=void>
|
||||
class functor_two
|
||||
{
|
||||
private:
|
||||
typedef RET_TYPE (*static_function)(PAR1 p1, PAR2 p2);
|
||||
typedef RET_TYPE (*void_static_function)(PAR1 p1, PAR2 p2);
|
||||
|
||||
typedef RET_TYPE
|
||||
(generic_class::*generic_mem)(PAR1 p1, PAR2 p2);
|
||||
|
||||
typedef binder<
|
||||
generic_mem, static_function, void_static_function
|
||||
> binder_type;
|
||||
|
||||
binder_type _binder;
|
||||
|
||||
RET_TYPE exec_static(PAR1 p1, PAR2 p2) const
|
||||
{
|
||||
return (*(_binder.get_static_func()))(p1, p2);
|
||||
}
|
||||
public:
|
||||
typedef functor_two type;
|
||||
functor_two() { }
|
||||
|
||||
functor_two(const functor_two& o):
|
||||
_binder(o._binder)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_two(Y* pmem, RET_TYPE(X::*func)(PAR1 p1, PAR2 p2) const ):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_two(Y* pmem, RET_TYPE(X::*func)(PAR1 p1, PAR2 p2) ):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
functor_two(RET_TYPE(*func)(PAR1 p1, PAR2 p2) ):
|
||||
_binder(this, &functor_two::exec_static, func)
|
||||
{
|
||||
}
|
||||
|
||||
RET_TYPE operator() (PAR1 p1, PAR2 p2) const
|
||||
{
|
||||
return (_binder.exec()->*(_binder.get_mem_ptr()))(p1, p2);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename PAR1, typename PAR2, typename PAR3, typename RET_TYPE=void>
|
||||
class functor_three
|
||||
{
|
||||
private:
|
||||
typedef RET_TYPE (*static_function)(PAR1 p1, PAR2 p2, PAR3 p3);
|
||||
typedef RET_TYPE (*void_static_function)(PAR1 p1, PAR2 p2, PAR3 p3);
|
||||
|
||||
typedef RET_TYPE
|
||||
(generic_class::*generic_mem)(PAR1 p1, PAR2 p2, PAR3 p3);
|
||||
|
||||
typedef binder<
|
||||
generic_mem, static_function, void_static_function
|
||||
> binder_type;
|
||||
|
||||
binder_type _binder;
|
||||
|
||||
RET_TYPE exec_static(PAR1 p1, PAR2 p2, PAR3 p3) const
|
||||
{
|
||||
return (*(_binder.get_static_func()))(p1, p2, p3);
|
||||
}
|
||||
public:
|
||||
typedef functor_three type;
|
||||
functor_three() { }
|
||||
|
||||
functor_three(const functor_three& o):
|
||||
_binder(o._binder)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_three(Y* pmem, RET_TYPE(X::*func)(PAR1 p1, PAR2 p2, PAR3 p3) const ):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_three(Y* pmem, RET_TYPE(X::*func)(PAR1 p1, PAR2 p2, PAR3 p3) ):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
functor_three(RET_TYPE(*func)(PAR1 p1, PAR2 p2, PAR3 p3) ):
|
||||
_binder(this, &functor_three::exec_static, func)
|
||||
{
|
||||
}
|
||||
|
||||
RET_TYPE operator() (PAR1 p1, PAR2 p2, PAR3 p3) const
|
||||
{
|
||||
return (_binder.exec()->*(_binder.get_mem_ptr()))(p1, p2, p3);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename PAR1, typename PAR2, typename PAR3, typename PAR4, typename RET_TYPE=void>
|
||||
class functor_four
|
||||
{
|
||||
private:
|
||||
typedef RET_TYPE (*static_function)(PAR1 p1, PAR2 p2, PAR3 p3, PAR4 p4);
|
||||
typedef RET_TYPE (*void_static_function)(PAR1 p1, PAR2 p2, PAR3 p3, PAR4 p4);
|
||||
|
||||
typedef RET_TYPE
|
||||
(generic_class::*generic_mem)(PAR1 p1, PAR2 p2, PAR3 p3, PAR4 p4);
|
||||
|
||||
typedef binder<
|
||||
generic_mem, static_function, void_static_function
|
||||
> binder_type;
|
||||
|
||||
binder_type _binder;
|
||||
|
||||
RET_TYPE exec_static(PAR1 p1, PAR2 p2, PAR3 p3, PAR4 p4) const
|
||||
{
|
||||
return (*(_binder.get_static_func()))(p1, p2, p3, p4);
|
||||
}
|
||||
public:
|
||||
typedef functor_four type;
|
||||
functor_four() { }
|
||||
|
||||
functor_four(const functor_four& o):
|
||||
_binder(o._binder)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_four(Y* pmem, RET_TYPE(X::*func)(PAR1 p1, PAR2 p2, PAR3 p3, PAR4 p4) const ):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename X, typename Y>
|
||||
functor_four(Y* pmem, RET_TYPE(X::*func)(PAR1 p1, PAR2 p2, PAR3 p3, PAR4 p4) ):
|
||||
_binder(reinterpret_cast<X*>(pmem), func)
|
||||
{
|
||||
}
|
||||
|
||||
functor_four(RET_TYPE(*func)(PAR1 p1, PAR2 p2, PAR3 p3, PAR4 p4) ):
|
||||
_binder(this, &functor_four::exec_static, func)
|
||||
{
|
||||
}
|
||||
|
||||
RET_TYPE operator() (PAR1 p1, PAR2 p2, PAR3 p3, PAR4 p4) const
|
||||
{
|
||||
return (_binder.exec()->*(_binder.get_mem_ptr()))(p1, p2, p3, p4);
|
||||
}
|
||||
};
|
||||
}
|
||||
}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,363 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _CREATE_WEBSERVER_HPP_
|
||||
#define _CREATE_WEBSERVER_HPP_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "httpserver/http_utils.hpp"
|
||||
|
||||
#define DEFAULT_WS_TIMEOUT 180
|
||||
#define DEFAULT_WS_PORT 9898
|
||||
|
||||
namespace httpserver {
|
||||
|
||||
class webserver;
|
||||
class http_request;
|
||||
class http_response;
|
||||
|
||||
typedef void(*render_ptr)(const http_request&, http_response**);
|
||||
typedef bool(*validator_ptr)(const std::string&);
|
||||
typedef void(*unescaper_ptr)(char*);
|
||||
typedef void(*log_access_ptr)(const std::string&);
|
||||
typedef void(*log_error_ptr)(const std::string&);
|
||||
|
||||
class create_webserver
|
||||
{
|
||||
public:
|
||||
create_webserver():
|
||||
_port(DEFAULT_WS_PORT),
|
||||
_start_method(http::http_utils::INTERNAL_SELECT),
|
||||
_max_threads(0),
|
||||
_max_connections(0),
|
||||
_memory_limit(0),
|
||||
_connection_timeout(DEFAULT_WS_TIMEOUT),
|
||||
_per_IP_connection_limit(0),
|
||||
_log_access(0x0),
|
||||
_log_error(0x0),
|
||||
_validator(0x0),
|
||||
_unescaper(0x0),
|
||||
_bind_address(0x0),
|
||||
_bind_socket(0),
|
||||
_max_thread_stack_size(0),
|
||||
_use_ssl(false),
|
||||
_use_ipv6(false),
|
||||
_debug(false),
|
||||
_pedantic(false),
|
||||
_https_mem_key(""),
|
||||
_https_mem_cert(""),
|
||||
_https_mem_trust(""),
|
||||
_https_priorities(""),
|
||||
_cred_type(http::http_utils::NONE),
|
||||
_digest_auth_random(""),
|
||||
_nonce_nc_size(0),
|
||||
_default_policy(http::http_utils::ACCEPT),
|
||||
_basic_auth_enabled(true),
|
||||
_digest_auth_enabled(true),
|
||||
_regex_checking(true),
|
||||
_ban_system_enabled(true),
|
||||
_post_process_enabled(true),
|
||||
_single_resource(0x0),
|
||||
_not_found_resource(0x0),
|
||||
_method_not_allowed_resource(0x0),
|
||||
_method_not_acceptable_resource(0x0),
|
||||
_internal_error_resource(0x0)
|
||||
{
|
||||
}
|
||||
|
||||
explicit create_webserver(uint16_t port):
|
||||
_port(port),
|
||||
_start_method(http::http_utils::INTERNAL_SELECT),
|
||||
_max_threads(0),
|
||||
_max_connections(0),
|
||||
_memory_limit(0),
|
||||
_connection_timeout(DEFAULT_WS_TIMEOUT),
|
||||
_per_IP_connection_limit(0),
|
||||
_log_access(0x0),
|
||||
_log_error(0x0),
|
||||
_validator(0x0),
|
||||
_unescaper(0x0),
|
||||
_bind_address(0x0),
|
||||
_bind_socket(0),
|
||||
_max_thread_stack_size(0),
|
||||
_use_ssl(false),
|
||||
_use_ipv6(false),
|
||||
_debug(false),
|
||||
_pedantic(false),
|
||||
_https_mem_key(""),
|
||||
_https_mem_cert(""),
|
||||
_https_mem_trust(""),
|
||||
_https_priorities(""),
|
||||
_cred_type(http::http_utils::NONE),
|
||||
_digest_auth_random(""),
|
||||
_nonce_nc_size(0),
|
||||
_default_policy(http::http_utils::ACCEPT),
|
||||
_basic_auth_enabled(true),
|
||||
_digest_auth_enabled(true),
|
||||
_regex_checking(true),
|
||||
_ban_system_enabled(true),
|
||||
_post_process_enabled(true),
|
||||
_single_resource(0x0),
|
||||
_not_found_resource(0x0),
|
||||
_method_not_allowed_resource(0x0),
|
||||
_method_not_acceptable_resource(0x0),
|
||||
_internal_error_resource(0x0)
|
||||
{
|
||||
}
|
||||
|
||||
create_webserver& port(uint16_t port) { _port = port; return *this; }
|
||||
create_webserver& start_method(
|
||||
const http::http_utils::start_method_T& start_method
|
||||
)
|
||||
{
|
||||
_start_method = start_method; return *this;
|
||||
}
|
||||
create_webserver& max_threads(int max_threads)
|
||||
{
|
||||
_max_threads = max_threads; return *this;
|
||||
}
|
||||
create_webserver& max_connections(int max_connections)
|
||||
{
|
||||
_max_connections = max_connections; return *this;
|
||||
}
|
||||
create_webserver& memory_limit(int memory_limit)
|
||||
{
|
||||
_memory_limit = memory_limit; return *this;
|
||||
}
|
||||
create_webserver& connection_timeout(int connection_timeout)
|
||||
{
|
||||
_connection_timeout = connection_timeout; return *this;
|
||||
}
|
||||
create_webserver& per_IP_connection_limit(int per_IP_connection_limit)
|
||||
{
|
||||
_per_IP_connection_limit = per_IP_connection_limit; return *this;
|
||||
}
|
||||
create_webserver& log_access(log_access_ptr log_access)
|
||||
{
|
||||
_log_access = log_access; return *this;
|
||||
}
|
||||
create_webserver& log_error(log_error_ptr log_error)
|
||||
{
|
||||
_log_error = log_error; return *this;
|
||||
}
|
||||
create_webserver& validator(validator_ptr validator)
|
||||
{
|
||||
_validator = validator; return *this;
|
||||
}
|
||||
create_webserver& unescaper(unescaper_ptr unescaper)
|
||||
{
|
||||
_unescaper = unescaper; return *this;
|
||||
}
|
||||
create_webserver& bind_address(const struct sockaddr* bind_address)
|
||||
{
|
||||
_bind_address = bind_address; return *this;
|
||||
}
|
||||
create_webserver& bind_socket(int bind_socket)
|
||||
{
|
||||
_bind_socket = bind_socket; return *this;
|
||||
}
|
||||
create_webserver& max_thread_stack_size(int max_thread_stack_size)
|
||||
{
|
||||
_max_thread_stack_size = max_thread_stack_size; return *this;
|
||||
}
|
||||
create_webserver& use_ssl() { _use_ssl = true; return *this; }
|
||||
create_webserver& no_ssl() { _use_ssl = false; return *this; }
|
||||
create_webserver& use_ipv6() { _use_ipv6 = true; return *this; }
|
||||
create_webserver& no_ipv6() { _use_ipv6 = false; return *this; }
|
||||
create_webserver& debug() { _debug = true; return *this; }
|
||||
create_webserver& no_debug() { _debug = false; return *this; }
|
||||
create_webserver& pedantic() { _pedantic = true; return *this; }
|
||||
create_webserver& no_pedantic() { _pedantic = false; return *this; }
|
||||
create_webserver& https_mem_key(const std::string& https_mem_key)
|
||||
{
|
||||
char* _https_mem_key_pt = http::load_file(https_mem_key.c_str());
|
||||
_https_mem_key = _https_mem_key_pt;
|
||||
free(_https_mem_key_pt);
|
||||
return *this;
|
||||
}
|
||||
create_webserver& https_mem_cert(const std::string& https_mem_cert)
|
||||
{
|
||||
char* _https_mem_cert_pt = http::load_file(https_mem_cert.c_str());
|
||||
_https_mem_cert = _https_mem_cert_pt;
|
||||
free(_https_mem_cert_pt);
|
||||
return *this;
|
||||
}
|
||||
create_webserver& https_mem_trust(const std::string& https_mem_trust)
|
||||
{
|
||||
char* _https_mem_trust_pt = http::load_file(https_mem_trust.c_str());
|
||||
_https_mem_trust = _https_mem_trust_pt;
|
||||
free(_https_mem_trust_pt);
|
||||
return *this;
|
||||
}
|
||||
create_webserver& raw_https_mem_key(const std::string& https_mem_key)
|
||||
{
|
||||
_https_mem_key = https_mem_key; return *this;
|
||||
}
|
||||
create_webserver& raw_https_mem_cert(const std::string& https_mem_cert)
|
||||
{
|
||||
_https_mem_cert = https_mem_cert; return *this;
|
||||
}
|
||||
create_webserver& raw_https_mem_trust(
|
||||
const std::string& https_mem_trust
|
||||
)
|
||||
{
|
||||
_https_mem_trust = https_mem_trust; return *this;
|
||||
}
|
||||
create_webserver& https_priorities(const std::string& https_priorities)
|
||||
{
|
||||
_https_priorities = https_priorities; return *this;
|
||||
}
|
||||
create_webserver& cred_type(const http::http_utils::cred_type_T& cred_type)
|
||||
{
|
||||
_cred_type = cred_type; return *this;
|
||||
}
|
||||
create_webserver& digest_auth_random(
|
||||
const std::string& digest_auth_random
|
||||
)
|
||||
{
|
||||
_digest_auth_random = digest_auth_random; return *this;
|
||||
}
|
||||
create_webserver& nonce_nc_size(int nonce_nc_size)
|
||||
{
|
||||
_nonce_nc_size = nonce_nc_size; return *this;
|
||||
}
|
||||
create_webserver& default_policy(
|
||||
const http::http_utils::policy_T& default_policy
|
||||
)
|
||||
{
|
||||
_default_policy = default_policy; return *this;
|
||||
}
|
||||
create_webserver& basic_auth()
|
||||
{
|
||||
_basic_auth_enabled = true; return *this;
|
||||
}
|
||||
create_webserver& no_basic_auth()
|
||||
{
|
||||
_basic_auth_enabled = false; return *this;
|
||||
}
|
||||
create_webserver& digest_auth()
|
||||
{
|
||||
_digest_auth_enabled = true; return *this;
|
||||
}
|
||||
create_webserver& no_digest_auth()
|
||||
{
|
||||
_digest_auth_enabled = false; return *this;
|
||||
}
|
||||
create_webserver& regex_checking()
|
||||
{
|
||||
_regex_checking = true; return *this;
|
||||
}
|
||||
create_webserver& no_regex_checking()
|
||||
{
|
||||
_regex_checking = false; return *this;
|
||||
}
|
||||
create_webserver& ban_system()
|
||||
{
|
||||
_ban_system_enabled = true; return *this;
|
||||
}
|
||||
create_webserver& no_ban_system()
|
||||
{
|
||||
_ban_system_enabled = false; return *this;
|
||||
}
|
||||
create_webserver& post_process()
|
||||
{
|
||||
_post_process_enabled = true; return *this;
|
||||
}
|
||||
create_webserver& no_post_process()
|
||||
{
|
||||
_post_process_enabled = false; return *this;
|
||||
}
|
||||
create_webserver& single_resource(render_ptr single_resource)
|
||||
{
|
||||
_single_resource = single_resource; return *this;
|
||||
}
|
||||
create_webserver& not_found_resource(render_ptr not_found_resource)
|
||||
{
|
||||
_not_found_resource = not_found_resource; return *this;
|
||||
}
|
||||
create_webserver& method_not_allowed_resource(
|
||||
render_ptr method_not_allowed_resource
|
||||
)
|
||||
{
|
||||
_method_not_allowed_resource = method_not_allowed_resource;
|
||||
return *this;
|
||||
}
|
||||
create_webserver& method_not_acceptable_resource(
|
||||
render_ptr method_not_acceptable_resource
|
||||
)
|
||||
{
|
||||
_method_not_acceptable_resource = method_not_acceptable_resource;
|
||||
return *this;
|
||||
}
|
||||
create_webserver& internal_error_resource(
|
||||
render_ptr internal_error_resource
|
||||
)
|
||||
{
|
||||
_internal_error_resource = internal_error_resource; return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
uint16_t _port;
|
||||
http::http_utils::start_method_T _start_method;
|
||||
int _max_threads;
|
||||
int _max_connections;
|
||||
int _memory_limit;
|
||||
int _connection_timeout;
|
||||
int _per_IP_connection_limit;
|
||||
log_access_ptr _log_access;
|
||||
log_error_ptr _log_error;
|
||||
validator_ptr _validator;
|
||||
unescaper_ptr _unescaper;
|
||||
const struct sockaddr* _bind_address;
|
||||
int _bind_socket;
|
||||
int _max_thread_stack_size;
|
||||
bool _use_ssl;
|
||||
bool _use_ipv6;
|
||||
bool _debug;
|
||||
bool _pedantic;
|
||||
std::string _https_mem_key;
|
||||
std::string _https_mem_cert;
|
||||
std::string _https_mem_trust;
|
||||
std::string _https_priorities;
|
||||
http::http_utils::cred_type_T _cred_type;
|
||||
std::string _digest_auth_random;
|
||||
int _nonce_nc_size;
|
||||
http::http_utils::policy_T _default_policy;
|
||||
bool _basic_auth_enabled;
|
||||
bool _digest_auth_enabled;
|
||||
bool _regex_checking;
|
||||
bool _ban_system_enabled;
|
||||
bool _post_process_enabled;
|
||||
render_ptr _single_resource;
|
||||
render_ptr _not_found_resource;
|
||||
render_ptr _method_not_allowed_resource;
|
||||
render_ptr _method_not_acceptable_resource;
|
||||
render_ptr _internal_error_resource;
|
||||
|
||||
friend class webserver;
|
||||
};
|
||||
|
||||
} //httpserver
|
||||
|
||||
#endif //_CREATE_WEBSERVER_HPP_
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _EVENT_TUPLE_HPP_
|
||||
#define _EVENT_TUPLE_HPP_
|
||||
|
||||
#include "httpserver/event_supplier.hpp"
|
||||
#include "httpserver/binders.hpp"
|
||||
|
||||
namespace httpserver {
|
||||
|
||||
namespace details
|
||||
{
|
||||
class http_endpoint;
|
||||
struct modded_request;
|
||||
struct daemon_item;
|
||||
|
||||
class event_tuple
|
||||
{
|
||||
private:
|
||||
typedef void(*supply_events_ptr)(
|
||||
fd_set*,
|
||||
fd_set*,
|
||||
fd_set*,
|
||||
MHD_socket*
|
||||
);
|
||||
|
||||
binders::functor_four<fd_set*, fd_set*, fd_set*, MHD_socket*, void> supply_events;
|
||||
binders::functor_zero<struct timeval> get_timeout;
|
||||
binders::functor_zero<void> dispatch_events;
|
||||
|
||||
event_tuple();
|
||||
|
||||
friend class ::httpserver::webserver;
|
||||
public:
|
||||
template<typename T>
|
||||
event_tuple(event_supplier<T>* es):
|
||||
supply_events(binders::functor_four<fd_set*, fd_set*, fd_set*, MHD_socket*, void>(es, &T::supply_events)),
|
||||
get_timeout(binders::functor_zero<struct timeval>(es, &T::get_timeout)),
|
||||
dispatch_events(binders::functor_zero<void>(es, &T::dispatch_events))
|
||||
{
|
||||
}
|
||||
};
|
||||
} //details
|
||||
|
||||
} //httpserver
|
||||
|
||||
#endif //_EVENT_TUPLE_HPP_
|
||||
@@ -0,0 +1,250 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _HTTP_ENDPOINT_HPP_
|
||||
#define _HTTP_ENDPOINT_HPP_
|
||||
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
#include <regex.h>
|
||||
#include <string>
|
||||
|
||||
namespace httpserver
|
||||
{
|
||||
|
||||
class webserver;
|
||||
|
||||
namespace details
|
||||
{
|
||||
|
||||
class http_resource_mirror;
|
||||
|
||||
/**
|
||||
* Exception class throwed when a bad formatted http url is used
|
||||
**/
|
||||
class bad_http_endpoint : public std::exception
|
||||
{
|
||||
/**
|
||||
* Method used to see error details
|
||||
* @return a const char* containing the error message
|
||||
**/
|
||||
virtual const char* what() const throw()
|
||||
{
|
||||
return "Bad url format!";
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Class representing an Http Endpoint. It is an abstraction used by the APIs.
|
||||
**/
|
||||
class http_endpoint
|
||||
{
|
||||
private:
|
||||
/**
|
||||
* Copy constructor. It is useful expecially to copy regex_t structure that contains dinamically allocated data.
|
||||
* @param h The http_endpoint to copy
|
||||
**/
|
||||
http_endpoint(const http_endpoint& h);
|
||||
/**
|
||||
* Class Destructor
|
||||
**/
|
||||
~http_endpoint(); //if inlined it causes problems during ruby wrapper compiling
|
||||
/**
|
||||
* Operator overload for "less than operator". It is used to order endpoints in maps.
|
||||
* @param b The http_endpoint to compare to
|
||||
* @return boolean indicating if this is less than b.
|
||||
**/
|
||||
bool operator <(const http_endpoint& b) const;
|
||||
/**
|
||||
* Operator overload for "assignment operator". It is used to copy endpoints to existing objects.
|
||||
* Is is functional expecially to copy regex_t structure that contains dinamically allocated data.
|
||||
* @param h The http_endpoint to copy
|
||||
* @return a reference to the http_endpoint obtained
|
||||
**/
|
||||
http_endpoint& operator =(const http_endpoint& h);
|
||||
/**
|
||||
* Method indicating if this endpoint 'matches' with the one passed. A passed endpoint matches a registered endpoint if
|
||||
* the regex represented by the registered endpoint matches the passed one.
|
||||
* @param url The endpoint to match
|
||||
* @return true if the passed endpoint matches this.
|
||||
**/
|
||||
bool match(const http_endpoint& url) const;
|
||||
/**
|
||||
* Method used to get the complete endpoint url
|
||||
* @return a string representing the url
|
||||
**/
|
||||
const std::string get_url_complete() const
|
||||
{
|
||||
return this->url_complete;
|
||||
}
|
||||
/**
|
||||
* Method used to get the complete endpoint url
|
||||
* @param result a string reference that will be filled with the url
|
||||
**/
|
||||
void get_url_complete(std::string& result) const
|
||||
{
|
||||
result = this->url_complete;
|
||||
}
|
||||
/**
|
||||
* Method used to find the size of the complete endpoint url
|
||||
* @return the size
|
||||
**/
|
||||
size_t get_url_complete_size() const
|
||||
{
|
||||
return this->url_complete.size();
|
||||
}
|
||||
/**
|
||||
* Method used to get all pars defined inside an url.
|
||||
* @return a vector of strings representing all found pars.
|
||||
**/
|
||||
const std::vector<std::string> get_url_pars() const
|
||||
{
|
||||
return this->url_pars;
|
||||
}
|
||||
size_t get_url_pars(std::vector<std::string>& result) const
|
||||
{
|
||||
result = this->url_pars;
|
||||
return result.size();
|
||||
}
|
||||
/**
|
||||
* Method used to get all pieces of an url; considering an url splitted by '/'.
|
||||
* @return a vector of strings representing all found pieces.
|
||||
**/
|
||||
const std::vector<std::string> get_url_pieces() const
|
||||
{
|
||||
return this->url_pieces;
|
||||
}
|
||||
/**
|
||||
* Method used to get all pieces of an url; considering an url splittet by '/'.
|
||||
* @param result a vector of strings to fill with url pieces.
|
||||
* @return the size of the vector in output
|
||||
**/
|
||||
size_t get_url_pieces(std::vector<std::string>& result) const
|
||||
{
|
||||
result = this->url_pieces;
|
||||
return result.size();
|
||||
}
|
||||
/**
|
||||
* Method used to get the number of pieces the url is composed of
|
||||
* @return the number of pieces
|
||||
**/
|
||||
size_t get_url_pieces_num() const
|
||||
{
|
||||
return this->url_pieces.size();
|
||||
}
|
||||
/**
|
||||
* Method used to get indexes of all parameters inside url
|
||||
* @return a vector of int indicating all positions.
|
||||
**/
|
||||
const std::vector<int> get_chunk_positions() const
|
||||
{
|
||||
return this->chunk_positions;
|
||||
}
|
||||
/**
|
||||
* Method used to get indexes of all parameters inside url
|
||||
* @param result a vector to fill with ints indicating chunk positions
|
||||
* @return the size of the vector filled
|
||||
**/
|
||||
size_t get_chunk_positions(std::vector<int>& result) const
|
||||
{
|
||||
result = this->chunk_positions;
|
||||
return result.size();
|
||||
}
|
||||
/**
|
||||
* Default constructor of the class.
|
||||
* @param family boolean that indicates if the endpoint is a family endpoint.
|
||||
* A family endpoint is an endpoint that identifies a root and all its child like the same resource.
|
||||
* For example, if I identify "/path/" like a family endpoint and I associate to it the resource "A", also
|
||||
* "/path/to/res/" is automatically associated to resource "A".
|
||||
**/
|
||||
http_endpoint(bool family = false):
|
||||
url_complete("/"),
|
||||
url_modded("/"),
|
||||
family_url(family),
|
||||
reg_compiled(false)
|
||||
{
|
||||
}
|
||||
/**
|
||||
* Constructor of the class http_endpoint. It is used to initialize an http_endpoint starting from a string form URL.
|
||||
* @param url The string representation of the endpoint. All endpoints are in the form "/path/to/resource".
|
||||
* @param family boolean that indicates if the endpoint is a family endpoint.
|
||||
* A family endpoint is an endpoint that identifies a root and all its child like the same resource.
|
||||
* For example, if I identify "/path/" like a family endpoint and I associate to it the resource "A", also
|
||||
* "/path/to/res/" is automatically associated to resource "A". Default is false.
|
||||
* @param registration boolean that indicates to the system if this is an endpoint that need to be registered to a webserver
|
||||
* or it is simply an endpoint to be used for comparisons. Default is false.
|
||||
* @param use_regex boolean that indicates if regexes are checked or not. Default is true.
|
||||
**/
|
||||
http_endpoint(const std::string& url,
|
||||
bool family = false,
|
||||
bool registration = false,
|
||||
bool use_regex = true
|
||||
);
|
||||
/**
|
||||
* The complete url extracted
|
||||
**/
|
||||
std::string url_complete;
|
||||
/**
|
||||
* The url standardized in order to use standard comparisons or regexes
|
||||
**/
|
||||
std::string url_modded;
|
||||
/**
|
||||
* Vector containing parameters extracted from url
|
||||
**/
|
||||
std::vector<std::string> url_pars;
|
||||
/**
|
||||
* Pieces the url can be splitted into (consider '/' as separator)
|
||||
**/
|
||||
std::vector<std::string> url_pieces;
|
||||
/**
|
||||
* Position of url pieces representing parameters
|
||||
**/
|
||||
std::vector<int> chunk_positions;
|
||||
/**
|
||||
* Regex used in comparisons
|
||||
**/
|
||||
regex_t re_url_modded;
|
||||
/**
|
||||
* Boolean indicating wheter the endpoint represents a family
|
||||
**/
|
||||
bool family_url;
|
||||
/**
|
||||
* Boolean indicating if the regex is compiled
|
||||
**/
|
||||
bool reg_compiled;
|
||||
friend class httpserver::webserver;
|
||||
friend void _register_resource(
|
||||
webserver*,
|
||||
const std::string&,
|
||||
details::http_resource_mirror&,
|
||||
bool
|
||||
);
|
||||
template<typename, typename> friend struct std::pair;
|
||||
template<typename> friend struct std::less;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
#endif
|
||||
+206
@@ -0,0 +1,206 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _HTTP_RESOURCE_MIRROR_HPP_
|
||||
#define _HTTP_RESOURCE_MIRROR_HPP_
|
||||
|
||||
#include "httpserver/binders.hpp"
|
||||
|
||||
#define CREATE_METHOD_DETECTOR(X) \
|
||||
template<typename T, typename RESULT, typename ARG1, typename ARG2> \
|
||||
class has_##X \
|
||||
{ \
|
||||
template <typename U, RESULT (U::*)(ARG1, ARG2)> struct Check; \
|
||||
template <typename U> static char func(Check<U, &U::X> *); \
|
||||
template <typename U> static int func(...); \
|
||||
public: \
|
||||
enum { value = sizeof(func<T>(0)) == sizeof(char) }; \
|
||||
};
|
||||
|
||||
#define HAS_METHOD(X, T, RESULT, ARG1, ARG2) \
|
||||
has_##X<T, RESULT, ARG1, ARG2>::value
|
||||
|
||||
namespace httpserver {
|
||||
|
||||
template<typename CHILD> class http_resource;
|
||||
class http_request;
|
||||
class http_response;
|
||||
class webserver;
|
||||
|
||||
namespace details
|
||||
{
|
||||
class http_endpoint;
|
||||
struct modded_request;
|
||||
struct daemon_item;
|
||||
typedef bool(*is_allowed_ptr)(const std::string&);
|
||||
|
||||
CREATE_METHOD_DETECTOR(render);
|
||||
CREATE_METHOD_DETECTOR(render_GET);
|
||||
CREATE_METHOD_DETECTOR(render_POST);
|
||||
CREATE_METHOD_DETECTOR(render_PUT);
|
||||
CREATE_METHOD_DETECTOR(render_HEAD);
|
||||
CREATE_METHOD_DETECTOR(render_DELETE);
|
||||
CREATE_METHOD_DETECTOR(render_TRACE);
|
||||
CREATE_METHOD_DETECTOR(render_OPTIONS);
|
||||
CREATE_METHOD_DETECTOR(render_CONNECT);
|
||||
CREATE_METHOD_DETECTOR(render_not_acceptable);
|
||||
|
||||
void empty_render(const http_request& r, http_response** res);
|
||||
void empty_not_acceptable_render(
|
||||
const http_request& r, http_response** res
|
||||
);
|
||||
bool empty_is_allowed(const std::string& method);
|
||||
|
||||
class http_resource_mirror
|
||||
{
|
||||
public:
|
||||
http_resource_mirror()
|
||||
{
|
||||
}
|
||||
|
||||
~http_resource_mirror()
|
||||
{
|
||||
}
|
||||
private:
|
||||
typedef binders::functor_two<const http_request&,
|
||||
http_response**, void> functor;
|
||||
|
||||
typedef binders::functor_one<const std::string&,
|
||||
bool> functor_allowed;
|
||||
|
||||
const functor render;
|
||||
const functor render_GET;
|
||||
const functor render_POST;
|
||||
const functor render_PUT;
|
||||
const functor render_HEAD;
|
||||
const functor render_DELETE;
|
||||
const functor render_TRACE;
|
||||
const functor render_OPTIONS;
|
||||
const functor render_CONNECT;
|
||||
const functor_allowed is_allowed;
|
||||
|
||||
functor method_not_acceptable_resource;
|
||||
|
||||
http_resource_mirror& operator= (const http_resource_mirror& o)
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
http_resource_mirror(http_resource<T>* res):
|
||||
render(
|
||||
HAS_METHOD(render, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render) : functor(&empty_render)
|
||||
),
|
||||
render_GET(
|
||||
HAS_METHOD(render_GET, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render_GET) :
|
||||
(
|
||||
HAS_METHOD(render, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render) : functor(&empty_render)
|
||||
)
|
||||
),
|
||||
render_POST(
|
||||
HAS_METHOD(render_POST, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render_POST) :
|
||||
(
|
||||
HAS_METHOD(render, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render) : functor(&empty_render)
|
||||
)
|
||||
),
|
||||
render_PUT(
|
||||
HAS_METHOD(render_PUT, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render_PUT) :
|
||||
(
|
||||
HAS_METHOD(render, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render) : functor(&empty_render)
|
||||
)
|
||||
),
|
||||
render_HEAD(
|
||||
HAS_METHOD(render_HEAD, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render_HEAD) :
|
||||
(
|
||||
HAS_METHOD(render, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render) : functor(&empty_render)
|
||||
)
|
||||
),
|
||||
render_DELETE(
|
||||
HAS_METHOD(render_DELETE, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render_DELETE) :
|
||||
(
|
||||
HAS_METHOD(render, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render) : functor(&empty_render)
|
||||
)
|
||||
),
|
||||
render_TRACE(
|
||||
HAS_METHOD(render_TRACE, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render_TRACE) :
|
||||
(
|
||||
HAS_METHOD(render, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render) : functor(&empty_render)
|
||||
)
|
||||
),
|
||||
render_OPTIONS(
|
||||
HAS_METHOD(render_OPTIONS, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render_OPTIONS) :
|
||||
(
|
||||
HAS_METHOD(render, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render) : functor(&empty_render)
|
||||
)
|
||||
),
|
||||
render_CONNECT(
|
||||
HAS_METHOD(render_CONNECT, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render_CONNECT) :
|
||||
(
|
||||
HAS_METHOD(render, T, void,
|
||||
const http_request&, http_response**
|
||||
) ? functor(res, &T::render) : functor(&empty_render)
|
||||
)
|
||||
),
|
||||
is_allowed(res, &T::is_allowed)
|
||||
{
|
||||
}
|
||||
|
||||
friend class ::httpserver::webserver;
|
||||
};
|
||||
} //details
|
||||
} //httpserver
|
||||
|
||||
#endif //_HTTP_RESOURCE_MIRROR_HPP_
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _EVENT_SUPPLIER_HPP_
|
||||
#define _EVENT_SUPPLIER_HPP_
|
||||
|
||||
namespace httpserver {
|
||||
|
||||
template <typename CHILD>
|
||||
class event_supplier
|
||||
{
|
||||
public:
|
||||
event_supplier()
|
||||
{
|
||||
}
|
||||
|
||||
~event_supplier()
|
||||
{
|
||||
}
|
||||
|
||||
void supply_events(
|
||||
fd_set* read_fdset,
|
||||
fd_set* write_fdset,
|
||||
fd_set* exc_fdset,
|
||||
MHD_socket* max
|
||||
) const
|
||||
{
|
||||
static_cast<CHILD*>(this)->supply_events(
|
||||
read_fdset, write_fdset, exc_fdset, max
|
||||
);
|
||||
}
|
||||
|
||||
struct timeval get_timeout() const
|
||||
{
|
||||
return static_cast<CHILD*>(this)->get_timeout();
|
||||
}
|
||||
|
||||
void dispatch_events() const
|
||||
{
|
||||
static_cast<CHILD*>(this)->dispatch_events();
|
||||
}
|
||||
};
|
||||
|
||||
} //event_supplier
|
||||
|
||||
#endif //_EVENT_SUPPLIER_HPP_
|
||||
@@ -0,0 +1,594 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _HTTP_REQUEST_HPP_
|
||||
#define _HTTP_REQUEST_HPP_
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <iosfwd>
|
||||
|
||||
struct MHD_Connection;
|
||||
|
||||
namespace httpserver
|
||||
{
|
||||
|
||||
class webserver;
|
||||
|
||||
namespace http
|
||||
{
|
||||
class header_comparator;
|
||||
class arg_comparator;
|
||||
};
|
||||
|
||||
using namespace http;
|
||||
|
||||
/**
|
||||
* Class representing an abstraction for an Http Request. It is used from classes using these apis to receive information through http protocol.
|
||||
**/
|
||||
class http_request
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Method used to get the username eventually passed through basic authentication.
|
||||
* @return string representation of the username.
|
||||
**/
|
||||
const std::string get_user() const
|
||||
{
|
||||
return this->user;
|
||||
}
|
||||
/**
|
||||
* Method used to get the username eventually passed through basic authentication.
|
||||
* @param result string that will be filled with the username
|
||||
**/
|
||||
void get_user(std::string& result) const
|
||||
{
|
||||
result = this->user;
|
||||
}
|
||||
/**
|
||||
* Method used to get the username extracted from a digest authentication
|
||||
* @return the username
|
||||
**/
|
||||
const std::string get_digested_user() const
|
||||
{
|
||||
return this->digested_user;
|
||||
}
|
||||
/**
|
||||
* Method used to get the username extracted from a digest authentication
|
||||
* @param result string that will be filled with the username
|
||||
**/
|
||||
void get_digested_user(std::string& result) const
|
||||
{
|
||||
result = this->digested_user;
|
||||
}
|
||||
/**
|
||||
* Method used to get the password eventually passed through basic authentication.
|
||||
* @return string representation of the password.
|
||||
**/
|
||||
const std::string get_pass() const
|
||||
{
|
||||
return this->pass;
|
||||
}
|
||||
/**
|
||||
* Method used to get the password eventually passed through basic authentication.
|
||||
* @param result string that will be filled with the password.
|
||||
**/
|
||||
void get_pass(std::string& result) const
|
||||
{
|
||||
result = this->pass;
|
||||
}
|
||||
/**
|
||||
* Method used to get the path requested
|
||||
* @return string representing the path requested.
|
||||
**/
|
||||
const std::string get_path() const
|
||||
{
|
||||
return this->path;
|
||||
}
|
||||
/**
|
||||
* Method used to get the path requested
|
||||
* @param result string that will be filled with the path.
|
||||
**/
|
||||
void get_path(std::string& result) const
|
||||
{
|
||||
result = this->path;
|
||||
}
|
||||
/**
|
||||
* Method used to get all pieces of the path requested; considering an url splitted by '/'.
|
||||
* @return a vector of strings containing all pieces
|
||||
**/
|
||||
const std::vector<std::string> get_path_pieces() const
|
||||
{
|
||||
return this->post_path;
|
||||
}
|
||||
/**
|
||||
* Method used to get all pieces of the path requested; considering an url splitted by '/'.
|
||||
* @param result vector of strings containing the path
|
||||
* @return the size of the vector filled
|
||||
**/
|
||||
size_t get_path_pieces(std::vector<std::string>& result) const
|
||||
{
|
||||
result = this->post_path;
|
||||
return result.size();
|
||||
}
|
||||
/**
|
||||
* Method used to obtain the size of path in terms of pieces; considering an url splitted by '/'.
|
||||
* @return an integer representing the number of pieces
|
||||
**/
|
||||
size_t get_path_pieces_size() const
|
||||
{
|
||||
return this->post_path.size();
|
||||
}
|
||||
/**
|
||||
* Method used to obtain a specified piece of the path; considering an url splitted by '/'.
|
||||
* @param index the index of the piece selected
|
||||
* @return the selected piece in form of string
|
||||
**/
|
||||
const std::string get_path_piece(int index) const
|
||||
{
|
||||
if(((int)(this->post_path.size())) > index)
|
||||
return this->post_path[index];
|
||||
return "";
|
||||
}
|
||||
/**
|
||||
* Method used to obtain a specified piece of the path; considering an url splitted by '/'.
|
||||
* @param index the index of the piece selected
|
||||
* @param result a string that will be filled with the piece found
|
||||
* @return the length of the piece found
|
||||
**/
|
||||
size_t get_path_piece(int index, std::string& result) const
|
||||
{
|
||||
if(((int)(this->post_path.size())) > index)
|
||||
{
|
||||
result = this->post_path[index];
|
||||
return result.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
result = "";
|
||||
return result.size();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Method used to get the METHOD used to make the request.
|
||||
* @return string representing the method.
|
||||
**/
|
||||
const std::string get_method() const
|
||||
{
|
||||
return this->method;
|
||||
}
|
||||
/**
|
||||
* Method used to get the METHOD used to make the request.
|
||||
* @param result string that will be filled with the method.
|
||||
**/
|
||||
void get_method(std::string& result) const
|
||||
{
|
||||
result = this->method;
|
||||
}
|
||||
/**
|
||||
* Method used to get all headers passed with the request.
|
||||
* @param result a map<string, string> > that will be filled with all headers
|
||||
* @result the size of the map
|
||||
**/
|
||||
size_t get_headers(std::map<std::string, std::string, header_comparator>& result) const;
|
||||
/**
|
||||
* Method used to get all footers passed with the request.
|
||||
* @param result a map<string, string> > that will be filled with all footers
|
||||
* @result the size of the map
|
||||
**/
|
||||
size_t get_footers(std::map<std::string, std::string, header_comparator>& result) const;
|
||||
/**
|
||||
* Method used to get all cookies passed with the request.
|
||||
* @param result a map<string, string> > that will be filled with all cookies
|
||||
* @result the size of the map
|
||||
**/
|
||||
size_t get_cookies(std::map<std::string, std::string, header_comparator>& result) const;
|
||||
/**
|
||||
* Method used to get all args passed with the request.
|
||||
* @param result a map<string, string> > that will be filled with all args
|
||||
* @result the size of the map
|
||||
**/
|
||||
size_t get_args(std::map<std::string, std::string, arg_comparator>& result) const;
|
||||
/**
|
||||
* Method used to get a specific header passed with the request.
|
||||
* @param key the specific header to get the value from
|
||||
* @return the value of the header.
|
||||
**/
|
||||
const std::string get_header(const std::string& key) const
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it =
|
||||
this->headers.find(key);
|
||||
if(it != this->headers.end())
|
||||
return it->second;
|
||||
else
|
||||
return "";
|
||||
}
|
||||
void get_header(const std::string& key, std::string& result) const
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it =
|
||||
this->headers.find(key);
|
||||
if(it != this->headers.end())
|
||||
result = it->second;
|
||||
else
|
||||
result = "";
|
||||
}
|
||||
const std::string get_cookie(const std::string& key) const
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it =
|
||||
this->cookies.find(key);
|
||||
if(it != this->cookies.end())
|
||||
return it->second;
|
||||
else
|
||||
return "";
|
||||
}
|
||||
void get_cookie(const std::string& key, std::string& result) const
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it =
|
||||
this->cookies.find(key);
|
||||
if(it != this->cookies.end())
|
||||
result = it->second;
|
||||
else
|
||||
result = "";
|
||||
}
|
||||
/**
|
||||
* Method used to get a specific footer passed with the request.
|
||||
* @param key the specific footer to get the value from
|
||||
* @return the value of the footer.
|
||||
**/
|
||||
const std::string get_footer(const std::string& key) const
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it =
|
||||
this->footers.find(key);
|
||||
if(it != this->footers.end())
|
||||
return it->second;
|
||||
else
|
||||
return "";
|
||||
}
|
||||
void get_footer(const std::string& key, std::string& result) const
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it =
|
||||
this->footers.find(key);
|
||||
if(it != this->footers.end())
|
||||
result = it->second;
|
||||
else
|
||||
result = "";
|
||||
}
|
||||
/**
|
||||
* Method used to get a specific argument passed with the request.
|
||||
* @param ket the specific argument to get the value from
|
||||
* @return the value of the arg.
|
||||
**/
|
||||
const std::string get_arg(const std::string& key) const
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it =
|
||||
this->args.find(key);
|
||||
if(it != this->args.end())
|
||||
return it->second;
|
||||
else
|
||||
return "";
|
||||
}
|
||||
void get_arg(const std::string& key, std::string& result) const
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it =
|
||||
this->args.find(key);
|
||||
if(it != this->args.end())
|
||||
result = it->second;
|
||||
else
|
||||
result = "";
|
||||
}
|
||||
/**
|
||||
* Method used to get the content of the request.
|
||||
* @return the content in string representation
|
||||
**/
|
||||
const std::string get_content() const
|
||||
{
|
||||
return this->content;
|
||||
}
|
||||
void get_content(std::string& result) const
|
||||
{
|
||||
result = this->content;
|
||||
}
|
||||
const std::string get_querystring() const
|
||||
{
|
||||
return this->querystring;
|
||||
}
|
||||
void get_querystring(std::string& result) const
|
||||
{
|
||||
result = this->querystring;
|
||||
}
|
||||
/**
|
||||
* Method used to get the version of the request.
|
||||
* @return the version in string representation
|
||||
**/
|
||||
const std::string get_version() const
|
||||
{
|
||||
return this->version;
|
||||
}
|
||||
void get_version(std::string& result) const
|
||||
{
|
||||
result = this->version;
|
||||
}
|
||||
/**
|
||||
* Method used to get the requestor.
|
||||
* @return the requestor
|
||||
**/
|
||||
const std::string get_requestor() const
|
||||
{
|
||||
return this->requestor;
|
||||
}
|
||||
void get_requestor(std::string& result) const
|
||||
{
|
||||
result = this->requestor;
|
||||
}
|
||||
/**
|
||||
* Method used to get the requestor port used.
|
||||
* @return the requestor port
|
||||
**/
|
||||
short get_requestor_port() const
|
||||
{
|
||||
return this->requestor_port;
|
||||
}
|
||||
bool check_digest_auth(const std::string& realm,
|
||||
const std::string& password,
|
||||
int nonce_timeout, bool& reload_nonce
|
||||
) const;
|
||||
|
||||
friend std::ostream &operator<< (std::ostream &os, const http_request &r);
|
||||
private:
|
||||
/**
|
||||
* Default constructor of the class. It is a specific responsibility of apis to initialize this type of objects.
|
||||
**/
|
||||
http_request():
|
||||
content("")
|
||||
{
|
||||
}
|
||||
/**
|
||||
* Copy constructor.
|
||||
* @param b http_request b to copy attributes from.
|
||||
**/
|
||||
http_request(const http_request& b):
|
||||
user(b.user),
|
||||
pass(b.pass),
|
||||
path(b.path),
|
||||
digested_user(b.digested_user),
|
||||
method(b.method),
|
||||
post_path(b.post_path),
|
||||
headers(b.headers),
|
||||
footers(b.footers),
|
||||
cookies(b.cookies),
|
||||
args(b.args),
|
||||
querystring(b.querystring),
|
||||
content(b.content),
|
||||
version(b.version),
|
||||
requestor(b.requestor),
|
||||
underlying_connection(b.underlying_connection)
|
||||
{
|
||||
}
|
||||
std::string user;
|
||||
std::string pass;
|
||||
std::string path;
|
||||
std::string digested_user;
|
||||
std::string method;
|
||||
std::vector<std::string> post_path;
|
||||
std::map<std::string, std::string, header_comparator> headers;
|
||||
std::map<std::string, std::string, header_comparator> footers;
|
||||
std::map<std::string, std::string, header_comparator> cookies;
|
||||
std::map<std::string, std::string, arg_comparator> args;
|
||||
std::string querystring;
|
||||
std::string content;
|
||||
std::string version;
|
||||
std::string requestor;
|
||||
|
||||
short requestor_port;
|
||||
struct MHD_Connection* underlying_connection;
|
||||
|
||||
void set_underlying_connection(struct MHD_Connection* conn)
|
||||
{
|
||||
this->underlying_connection = conn;
|
||||
}
|
||||
/**
|
||||
* Method used to set an header value by key.
|
||||
* @param key The name identifying the header
|
||||
* @param value The value assumed by the header
|
||||
**/
|
||||
void set_header(const std::string& key, const std::string& value)
|
||||
{
|
||||
this->headers[key] = value;
|
||||
}
|
||||
/**
|
||||
* Method used to set a footer value by key.
|
||||
* @param key The name identifying the footer
|
||||
* @param value The value assumed by the footer
|
||||
**/
|
||||
void set_footer(const std::string& key, const std::string& value)
|
||||
{
|
||||
this->footers[key] = value;
|
||||
}
|
||||
/**
|
||||
* Method used to set a cookie value by key.
|
||||
* @param key The name identifying the cookie
|
||||
* @param value The value assumed by the cookie
|
||||
**/
|
||||
void set_cookie(const std::string& key, const std::string& value)
|
||||
{
|
||||
this->cookies[key] = value;
|
||||
}
|
||||
/**
|
||||
* Method used to set an argument value by key.
|
||||
* @param key The name identifying the argument
|
||||
* @param value The value assumed by the argument
|
||||
**/
|
||||
void set_arg(const std::string& key, const std::string& value)
|
||||
{
|
||||
this->args[key] = value;
|
||||
}
|
||||
/**
|
||||
* Method used to set an argument value by key.
|
||||
* @param key The name identifying the argument
|
||||
* @param value The value assumed by the argument
|
||||
* @param size The size in number of char of the value parameter.
|
||||
**/
|
||||
void set_arg(const char* key, const char* value, size_t size)
|
||||
{
|
||||
this->args[key] = std::string(value, size);
|
||||
}
|
||||
/**
|
||||
* Method used to set the content of the request
|
||||
* @param content The content to set.
|
||||
**/
|
||||
void set_content(const std::string& content)
|
||||
{
|
||||
this->content = content;
|
||||
}
|
||||
/**
|
||||
* Method used to append content to the request preserving the previous inserted content
|
||||
* @param content The content to append.
|
||||
* @param size The size of the data to append.
|
||||
**/
|
||||
void grow_content(const char* content, size_t size)
|
||||
{
|
||||
this->content.append(content, size);
|
||||
}
|
||||
/**
|
||||
* Method used to set the path requested.
|
||||
* @param path The path searched by the request.
|
||||
**/
|
||||
void set_path(const std::string& path)
|
||||
{
|
||||
this->path = path;
|
||||
std::vector<std::string> complete_path;
|
||||
http_utils::tokenize_url(this->path, complete_path);
|
||||
for(unsigned int i = 0; i < complete_path.size(); i++)
|
||||
{
|
||||
this->post_path.push_back(complete_path[i]);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Method used to set the request METHOD
|
||||
* @param method The method to set for the request
|
||||
**/
|
||||
void set_method(const std::string& method);
|
||||
/**
|
||||
* Method used to set the request http version (ie http 1.1)
|
||||
* @param version The version to set in form of string
|
||||
**/
|
||||
void set_version(const std::string& version)
|
||||
{
|
||||
this->version = version;
|
||||
}
|
||||
/**
|
||||
* Method used to set the requestor
|
||||
* @param requestor The requestor to set
|
||||
**/
|
||||
void set_requestor(const std::string& requestor)
|
||||
{
|
||||
this->requestor = requestor;
|
||||
}
|
||||
/**
|
||||
* Method used to set the requestor port
|
||||
* @param requestor The requestor port to set
|
||||
**/
|
||||
void set_requestor_port(short requestor_port)
|
||||
{
|
||||
this->requestor_port = requestor_port;
|
||||
}
|
||||
/**
|
||||
* Method used to remove an header previously inserted
|
||||
* @param key The key identifying the header to remove.
|
||||
**/
|
||||
void remove_header(const std::string& key)
|
||||
{
|
||||
this->headers.erase(key);
|
||||
}
|
||||
/**
|
||||
* Method used to set all headers of the request.
|
||||
* @param headers The headers key-value map to set for the request.
|
||||
**/
|
||||
void set_headers(const std::map<std::string, std::string>& headers)
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it;
|
||||
for(it = headers.begin(); it != headers.end(); ++it)
|
||||
this->headers[it->first] = it->second;
|
||||
}
|
||||
/**
|
||||
* Method used to set all footers of the request.
|
||||
* @param footers The footers key-value map to set for the request.
|
||||
**/
|
||||
void set_footers(const std::map<std::string, std::string>& footers)
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it;
|
||||
for(it = footers.begin(); it != footers.end(); ++it)
|
||||
this->footers[it->first] = it->second;
|
||||
}
|
||||
/**
|
||||
* Method used to set all cookies of the request.
|
||||
* @param cookies The cookies key-value map to set for the request.
|
||||
**/
|
||||
void set_cookies(const std::map<std::string, std::string>& cookies)
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it;
|
||||
for(it = cookies.begin(); it != cookies.end(); ++it)
|
||||
this->cookies[it->first] = it->second;
|
||||
}
|
||||
/**
|
||||
* Method used to set all arguments of the request.
|
||||
* @param args The args key-value map to set for the request.
|
||||
**/
|
||||
void set_args(const std::map<std::string, std::string>& args)
|
||||
{
|
||||
std::map<std::string, std::string>::const_iterator it;
|
||||
for(it = args.begin(); it != args.end(); ++it)
|
||||
this->args[it->first] = it->second;
|
||||
}
|
||||
/**
|
||||
* Method used to set the username of the request.
|
||||
* @param user The username to set.
|
||||
**/
|
||||
void set_user(const std::string& user)
|
||||
{
|
||||
this->user = user;
|
||||
}
|
||||
void set_digested_user(const std::string& digested_user)
|
||||
{
|
||||
this->digested_user = digested_user;
|
||||
}
|
||||
/**
|
||||
* Method used to set the password of the request.
|
||||
* @param pass The password to set.
|
||||
**/
|
||||
void set_pass(const std::string& pass)
|
||||
{
|
||||
this->pass = pass;
|
||||
}
|
||||
|
||||
friend class webserver;
|
||||
};
|
||||
|
||||
std::ostream &operator<< (std::ostream &os, const http_request &r);
|
||||
|
||||
};
|
||||
#endif
|
||||
@@ -0,0 +1,218 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _http_resource_hpp_
|
||||
#define _http_resource_hpp_
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <iostream>
|
||||
#endif
|
||||
|
||||
namespace httpserver
|
||||
{
|
||||
|
||||
class webserver;
|
||||
class http_request;
|
||||
class http_response;
|
||||
|
||||
/**
|
||||
* Class representing a callable http resource.
|
||||
**/
|
||||
|
||||
void resource_init(std::map<std::string, bool>& res);
|
||||
|
||||
template<typename CHILD>
|
||||
class http_resource
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Method used to answer to a generic request
|
||||
* @param req Request passed through http
|
||||
* @return A http_response object
|
||||
**/
|
||||
void render(const http_request& r, http_response** res)
|
||||
{
|
||||
static_cast<CHILD*>(this)->render(r, res);
|
||||
}
|
||||
/**
|
||||
* Method used to answer to a GET request
|
||||
* @param req Request passed through http
|
||||
* @return A http_response object
|
||||
**/
|
||||
void render_GET(const http_request& req, http_response** res)
|
||||
{
|
||||
static_cast<CHILD*>(this)->render_GET(req, res);
|
||||
}
|
||||
/**
|
||||
* Method used to answer to a POST request
|
||||
* @param req Request passed through http
|
||||
* @return A http_response object
|
||||
**/
|
||||
void render_POST(const http_request& req, http_response** res)
|
||||
{
|
||||
static_cast<CHILD*>(this)->render_POST(req, res);
|
||||
}
|
||||
/**
|
||||
* Method used to answer to a PUT request
|
||||
* @param req Request passed through http
|
||||
* @return A http_response object
|
||||
**/
|
||||
void render_PUT(const http_request& req, http_response** res)
|
||||
{
|
||||
static_cast<CHILD*>(this)->render_PUT(req, res);
|
||||
}
|
||||
/**
|
||||
* Method used to answer to a HEAD request
|
||||
* @param req Request passed through http
|
||||
* @return A http_response object
|
||||
**/
|
||||
void render_HEAD(const http_request& req, http_response** res)
|
||||
{
|
||||
static_cast<CHILD*>(this)->render_HEAD(req, res);
|
||||
}
|
||||
/**
|
||||
* Method used to answer to a DELETE request
|
||||
* @param req Request passed through http
|
||||
* @return A http_response object
|
||||
**/
|
||||
void render_DELETE(const http_request& req, http_response** res)
|
||||
{
|
||||
static_cast<CHILD*>(this)->render_DELETE(req, res);
|
||||
}
|
||||
/**
|
||||
* Method used to answer to a TRACE request
|
||||
* @param req Request passed through http
|
||||
* @return A http_response object
|
||||
**/
|
||||
void render_TRACE(const http_request& req, http_response** res)
|
||||
{
|
||||
static_cast<CHILD*>(this)->render_TRACE(req, res);
|
||||
}
|
||||
/**
|
||||
* Method used to answer to a OPTIONS request
|
||||
* @param req Request passed through http
|
||||
* @return A http_response object
|
||||
**/
|
||||
void render_OPTIONS(const http_request& req, http_response** res)
|
||||
{
|
||||
static_cast<CHILD*>(this)->render_OPTIONS(req, res);
|
||||
}
|
||||
/**
|
||||
* Method used to answer to a CONNECT request
|
||||
* @param req Request passed through http
|
||||
* @return A http_response object
|
||||
**/
|
||||
void render_CONNECT(const http_request& req, http_response** res)
|
||||
{
|
||||
static_cast<CHILD*>(this)->render_CONNECT(req, res);
|
||||
}
|
||||
/**
|
||||
* Method used to set if a specific method is allowed or not on this request
|
||||
* @param method method to set permission on
|
||||
* @param allowed boolean indicating if the method is allowed or not
|
||||
**/
|
||||
void set_allowing(const std::string& method, bool allowed)
|
||||
{
|
||||
if(this->allowed_methods.count(method))
|
||||
{
|
||||
this->allowed_methods[method] = allowed;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Method used to implicitly allow all methods
|
||||
**/
|
||||
void allow_all()
|
||||
{
|
||||
std::map<std::string,bool>::iterator it;
|
||||
for ( it=this->allowed_methods.begin() ; it != this->allowed_methods.end(); ++it )
|
||||
this->allowed_methods[(*it).first] = true;
|
||||
}
|
||||
/**
|
||||
* Method used to implicitly disallow all methods
|
||||
**/
|
||||
void disallow_all()
|
||||
{
|
||||
std::map<std::string,bool>::iterator it;
|
||||
for ( it=this->allowed_methods.begin() ; it != this->allowed_methods.end(); ++it )
|
||||
this->allowed_methods[(*it).first] = false;
|
||||
}
|
||||
/**
|
||||
* Method used to discover if an http method is allowed or not for this resource
|
||||
* @param method Method to discover allowings
|
||||
* @return true if the method is allowed
|
||||
**/
|
||||
bool is_allowed(const std::string& method)
|
||||
{
|
||||
if(this->allowed_methods.count(method))
|
||||
{
|
||||
return this->allowed_methods[method];
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef DEBUG
|
||||
std::map<std::string, bool>::iterator it;
|
||||
for(it = allowed_methods.begin(); it != allowed_methods.end(); ++it)
|
||||
{
|
||||
std::cout << (*it).first << " -> " << (*it).second << std::endl;
|
||||
}
|
||||
#endif //DEBUG
|
||||
return false;
|
||||
}
|
||||
}
|
||||
protected:
|
||||
/**
|
||||
* Constructor of the class
|
||||
**/
|
||||
http_resource()
|
||||
{
|
||||
resource_init(allowed_methods);
|
||||
}
|
||||
/**
|
||||
* Copy constructor
|
||||
**/
|
||||
http_resource(const http_resource& b) : allowed_methods(b.allowed_methods) { }
|
||||
|
||||
http_resource& operator = (const http_resource& b)
|
||||
{
|
||||
allowed_methods = b.allowed_methods;
|
||||
return (*this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Class destructor
|
||||
**/
|
||||
~http_resource()
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
friend class webserver;
|
||||
friend void resource_init(std::map<std::string, bool>& res);
|
||||
std::map<std::string, bool> allowed_methods;
|
||||
};
|
||||
|
||||
};
|
||||
#endif
|
||||
@@ -0,0 +1,311 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _HTTP_RESPONSE_HPP_
|
||||
#define _HTTP_RESPONSE_HPP_
|
||||
#include <map>
|
||||
#include <utility>
|
||||
#include <string>
|
||||
#include <iosfwd>
|
||||
|
||||
#include "httpserver/details/http_resource_mirror.hpp"
|
||||
|
||||
struct MHD_Connection;
|
||||
|
||||
namespace httpserver
|
||||
{
|
||||
|
||||
class webserver;
|
||||
class http_response_builder;
|
||||
|
||||
namespace http
|
||||
{
|
||||
class header_comparator;
|
||||
class arg_comparator;
|
||||
};
|
||||
|
||||
namespace details
|
||||
{
|
||||
struct http_response_ptr;
|
||||
ssize_t cb(void*, uint64_t, char*, size_t);
|
||||
struct cache_entry;
|
||||
};
|
||||
|
||||
using namespace http;
|
||||
|
||||
class bad_caching_attempt: public std::exception
|
||||
{
|
||||
virtual const char* what() const throw()
|
||||
{
|
||||
return "You cannot pass ce = 0x0 without key!";
|
||||
}
|
||||
};
|
||||
|
||||
typedef ssize_t(*cycle_callback_ptr)(char*, size_t);
|
||||
|
||||
/**
|
||||
* Class representing an abstraction for an Http Response. It is used from classes using these apis to send information through http protocol.
|
||||
**/
|
||||
class http_response
|
||||
{
|
||||
public:
|
||||
|
||||
http_response(const http_response_builder& builder);
|
||||
|
||||
/**
|
||||
* Copy constructor
|
||||
* @param b The http_response object to copy attributes value from.
|
||||
**/
|
||||
http_response(const http_response& b):
|
||||
content(b.content),
|
||||
response_code(b.response_code),
|
||||
autodelete(b.autodelete),
|
||||
realm(b.realm),
|
||||
opaque(b.opaque),
|
||||
reload_nonce(b.reload_nonce),
|
||||
fp(b.fp),
|
||||
filename(b.filename),
|
||||
headers(b.headers),
|
||||
footers(b.footers),
|
||||
cookies(b.cookies),
|
||||
topics(b.topics),
|
||||
keepalive_secs(b.keepalive_secs),
|
||||
keepalive_msg(b.keepalive_msg),
|
||||
send_topic(b.send_topic),
|
||||
underlying_connection(b.underlying_connection),
|
||||
ca(0x0),
|
||||
closure_data(0x0),
|
||||
ce(b.ce),
|
||||
cycle_callback(b.cycle_callback),
|
||||
get_raw_response(b.get_raw_response),
|
||||
decorate_response(b.decorate_response),
|
||||
enqueue_response(b.enqueue_response),
|
||||
completed(b.completed),
|
||||
ws(b.ws),
|
||||
connection_id(b.connection_id)
|
||||
{
|
||||
}
|
||||
|
||||
~http_response();
|
||||
/**
|
||||
* Method used to get the content from the response.
|
||||
* @return the content in string form
|
||||
**/
|
||||
const std::string get_content()
|
||||
{
|
||||
return this->content;
|
||||
}
|
||||
|
||||
void get_content(std::string& result)
|
||||
{
|
||||
result = this->content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used to get a specified header defined for the response
|
||||
* @param key The header identification
|
||||
* @return a string representing the value assumed by the header
|
||||
**/
|
||||
const std::string get_header(const std::string& key)
|
||||
{
|
||||
return this->headers[key];
|
||||
}
|
||||
|
||||
void get_header(const std::string& key, std::string& result)
|
||||
{
|
||||
result = this->headers[key];
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used to get a specified footer defined for the response
|
||||
* @param key The footer identification
|
||||
* @return a string representing the value assumed by the footer
|
||||
**/
|
||||
const std::string get_footer(const std::string& key)
|
||||
{
|
||||
return this->footers[key];
|
||||
}
|
||||
|
||||
void get_footer(const std::string& key, std::string& result)
|
||||
{
|
||||
result = this->footers[key];
|
||||
}
|
||||
|
||||
const std::string get_cookie(const std::string& key)
|
||||
{
|
||||
return this->cookies[key];
|
||||
}
|
||||
|
||||
void get_cookie(const std::string& key, std::string& result)
|
||||
{
|
||||
result = this->cookies[key];
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used to get all headers passed with the request.
|
||||
* @return a map<string,string> containing all headers.
|
||||
**/
|
||||
size_t get_headers(
|
||||
std::map<std::string, std::string, header_comparator>& result
|
||||
) const;
|
||||
|
||||
/**
|
||||
* Method used to get all footers passed with the request.
|
||||
* @return a map<string,string> containing all footers.
|
||||
**/
|
||||
size_t get_footers(
|
||||
std::map<std::string, std::string, header_comparator>& result
|
||||
) const;
|
||||
|
||||
size_t get_cookies(
|
||||
std::map<std::string, std::string, header_comparator>& result
|
||||
) const;
|
||||
|
||||
/**
|
||||
* Method used to get the response code from the response
|
||||
* @return The response code
|
||||
**/
|
||||
int get_response_code()
|
||||
{
|
||||
return this->response_code;
|
||||
}
|
||||
|
||||
const std::string get_realm() const
|
||||
{
|
||||
return this->realm;
|
||||
}
|
||||
|
||||
void get_realm(std::string& result) const
|
||||
{
|
||||
result = this->realm;
|
||||
}
|
||||
|
||||
const std::string get_opaque() const
|
||||
{
|
||||
return this->opaque;
|
||||
}
|
||||
|
||||
void get_opaque(std::string& result) const
|
||||
{
|
||||
result = this->opaque;
|
||||
}
|
||||
|
||||
const bool need_nonce_reload() const
|
||||
{
|
||||
return this->reload_nonce;
|
||||
}
|
||||
|
||||
int get_switch_callback() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool is_autodelete() const
|
||||
{
|
||||
return autodelete;
|
||||
}
|
||||
|
||||
size_t get_topics(std::vector<std::string>& topics) const
|
||||
{
|
||||
typedef std::vector<std::string>::const_iterator topics_it;
|
||||
for(topics_it it=this->topics.begin();it != this->topics.end();++it)
|
||||
topics.push_back(*it);
|
||||
return topics.size();
|
||||
}
|
||||
protected:
|
||||
typedef details::binders::functor_two<MHD_Response**, webserver*, void> get_raw_response_t;
|
||||
|
||||
typedef details::binders::functor_one<MHD_Response*, void> decorate_response_t;
|
||||
|
||||
typedef details::binders::functor_two<MHD_Connection* ,MHD_Response*, int> enqueue_response_t;
|
||||
|
||||
std::string content;
|
||||
int response_code;
|
||||
bool autodelete;
|
||||
std::string realm;
|
||||
std::string opaque;
|
||||
bool reload_nonce;
|
||||
int fp;
|
||||
std::string filename;
|
||||
std::map<std::string, std::string, header_comparator> headers;
|
||||
std::map<std::string, std::string, header_comparator> footers;
|
||||
std::map<std::string, std::string, header_comparator> cookies;
|
||||
std::vector<std::string> topics;
|
||||
int keepalive_secs;
|
||||
std::string keepalive_msg;
|
||||
std::string send_topic;
|
||||
struct MHD_Connection* underlying_connection;
|
||||
void(*ca)(void*);
|
||||
void* closure_data;
|
||||
details::cache_entry* ce;
|
||||
cycle_callback_ptr cycle_callback;
|
||||
|
||||
const get_raw_response_t get_raw_response;
|
||||
const decorate_response_t decorate_response;
|
||||
const enqueue_response_t enqueue_response;
|
||||
|
||||
bool completed;
|
||||
|
||||
webserver* ws;
|
||||
struct httpserver_ska connection_id;
|
||||
|
||||
void get_raw_response_str(MHD_Response** res, webserver* ws = 0x0);
|
||||
void get_raw_response_file(MHD_Response** res, webserver* ws = 0x0);
|
||||
void get_raw_response_switch_r(MHD_Response** res, webserver* ws = 0x0);
|
||||
|
||||
void get_raw_response_lp_receive(MHD_Response** res,
|
||||
webserver* ws = 0x0);
|
||||
|
||||
void get_raw_response_lp_send(MHD_Response** res, webserver* ws = 0x0);
|
||||
void get_raw_response_cache(MHD_Response** res, webserver* ws = 0x0);
|
||||
void get_raw_response_deferred(MHD_Response** res, webserver* ws = 0x0);
|
||||
void decorate_response_str(MHD_Response* res);
|
||||
void decorate_response_cache(MHD_Response* res);
|
||||
void decorate_response_deferred(MHD_Response* res);
|
||||
int enqueue_response_str(MHD_Connection* connection, MHD_Response* res);
|
||||
|
||||
int enqueue_response_basic(MHD_Connection* connection,
|
||||
MHD_Response* res
|
||||
);
|
||||
|
||||
int enqueue_response_digest(MHD_Connection* connection,
|
||||
MHD_Response* res
|
||||
);
|
||||
|
||||
friend class webserver;
|
||||
friend struct details::http_response_ptr;
|
||||
friend class http_response_builder;
|
||||
friend void clone_response(const http_response& hr, http_response** dhr);
|
||||
friend ssize_t details::cb(void* cls, uint64_t pos, char* buf, size_t max);
|
||||
friend std::ostream &operator<< (std::ostream &os, const http_response &r);
|
||||
private:
|
||||
http_response& operator=(const http_response& b);
|
||||
|
||||
static ssize_t data_generator (void* cls, uint64_t pos, char* buf, size_t max);
|
||||
};
|
||||
|
||||
std::ostream &operator<< (std::ostream &os, const http_response &r);
|
||||
|
||||
};
|
||||
#endif
|
||||
@@ -0,0 +1,298 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _HTTP_RESPONSE_BUILDER_HPP_
|
||||
#define _HTTP_RESPONSE_BUILDER_HPP_
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include "httpserver/http_response.hpp"
|
||||
|
||||
struct MHD_Connection;
|
||||
|
||||
namespace httpserver
|
||||
{
|
||||
|
||||
class webserver;
|
||||
|
||||
namespace http
|
||||
{
|
||||
class header_comparator;
|
||||
};
|
||||
|
||||
namespace details
|
||||
{
|
||||
struct cache_entry;
|
||||
};
|
||||
|
||||
using namespace http;
|
||||
|
||||
struct byte_string
|
||||
{
|
||||
public:
|
||||
byte_string(const char* content_hook, size_t content_length):
|
||||
content_hook(content_hook),
|
||||
content_length(content_length)
|
||||
{
|
||||
}
|
||||
|
||||
const char* get_content_hook() const
|
||||
{
|
||||
return content_hook;
|
||||
}
|
||||
|
||||
size_t get_content_length() const
|
||||
{
|
||||
return content_length;
|
||||
}
|
||||
|
||||
private:
|
||||
const char* content_hook;
|
||||
size_t content_length;
|
||||
};
|
||||
|
||||
class http_response_builder
|
||||
{
|
||||
public:
|
||||
explicit http_response_builder(
|
||||
const std::string& content_hook,
|
||||
int response_code = 200,
|
||||
const std::string& content_type = "text/plain",
|
||||
bool autodelete = true
|
||||
):
|
||||
_content_hook(content_hook),
|
||||
_response_code(response_code),
|
||||
_autodelete(autodelete),
|
||||
_realm(""),
|
||||
_opaque(""),
|
||||
_reload_nonce(false),
|
||||
_headers(std::map<std::string, std::string, header_comparator>()),
|
||||
_footers(std::map<std::string, std::string, header_comparator>()),
|
||||
_cookies(std::map<std::string, std::string, header_comparator>()),
|
||||
_topics(std::vector<std::string>()),
|
||||
_keepalive_secs(-1),
|
||||
_keepalive_msg(""),
|
||||
_send_topic(""),
|
||||
_ce(0x0),
|
||||
_get_raw_response(&http_response::get_raw_response_str),
|
||||
_decorate_response(&http_response::decorate_response_str),
|
||||
_enqueue_response(&http_response::enqueue_response_str)
|
||||
{
|
||||
_headers[http_utils::http_header_content_type] = content_type;
|
||||
}
|
||||
|
||||
http_response_builder(
|
||||
const byte_string& content_hook,
|
||||
int response_code = 200,
|
||||
const std::string& content_type = "text/plain",
|
||||
bool autodelete = true
|
||||
):
|
||||
_content_hook(std::string(content_hook.get_content_hook(), content_hook.get_content_length())),
|
||||
_response_code(response_code),
|
||||
_autodelete(autodelete),
|
||||
_realm(""),
|
||||
_opaque(""),
|
||||
_reload_nonce(false),
|
||||
_headers(std::map<std::string, std::string, header_comparator>()),
|
||||
_footers(std::map<std::string, std::string, header_comparator>()),
|
||||
_cookies(std::map<std::string, std::string, header_comparator>()),
|
||||
_topics(std::vector<std::string>()),
|
||||
_keepalive_secs(-1),
|
||||
_keepalive_msg(""),
|
||||
_send_topic(""),
|
||||
_ce(0x0),
|
||||
_get_raw_response(&http_response::get_raw_response_str),
|
||||
_decorate_response(&http_response::decorate_response_str),
|
||||
_enqueue_response(&http_response::enqueue_response_str)
|
||||
{
|
||||
_headers[http_utils::http_header_content_type] = content_type;
|
||||
}
|
||||
|
||||
http_response_builder(const http_response_builder& b):
|
||||
_content_hook(b._content_hook),
|
||||
_response_code(b._response_code),
|
||||
_autodelete(b._autodelete),
|
||||
_realm(b._realm),
|
||||
_opaque(b._opaque),
|
||||
_reload_nonce(b._reload_nonce),
|
||||
_headers(b._headers),
|
||||
_footers(b._footers),
|
||||
_cookies(b._cookies),
|
||||
_topics(b._topics),
|
||||
_keepalive_secs(b._keepalive_secs),
|
||||
_keepalive_msg(b._keepalive_msg),
|
||||
_send_topic(b._send_topic),
|
||||
_ce(b._ce),
|
||||
_get_raw_response(b._get_raw_response),
|
||||
_decorate_response(b._decorate_response),
|
||||
_enqueue_response(b._enqueue_response)
|
||||
{
|
||||
}
|
||||
|
||||
http_response_builder& operator=(const http_response_builder& b)
|
||||
{
|
||||
_content_hook = b._content_hook;
|
||||
_response_code = b._response_code;
|
||||
_autodelete = b._autodelete;
|
||||
_realm = b._realm;
|
||||
_opaque = b._opaque;
|
||||
_reload_nonce = b._reload_nonce;
|
||||
_headers = b._headers;
|
||||
_footers = b._footers;
|
||||
_cookies = b._cookies;
|
||||
_topics = b._topics;
|
||||
_keepalive_secs = b._keepalive_secs;
|
||||
_keepalive_msg = b._keepalive_msg;
|
||||
_send_topic = b._send_topic;
|
||||
_ce = b._ce;
|
||||
_get_raw_response = b._get_raw_response;
|
||||
_decorate_response = b._decorate_response;
|
||||
_enqueue_response = b._enqueue_response;
|
||||
return *this;
|
||||
}
|
||||
|
||||
~http_response_builder()
|
||||
{
|
||||
}
|
||||
|
||||
http_response_builder& string_response()
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
http_response_builder& file_response()
|
||||
{
|
||||
_get_raw_response = &http_response::get_raw_response_file;
|
||||
return *this;
|
||||
}
|
||||
|
||||
http_response_builder& basic_auth_fail_response(const std::string& realm = "")
|
||||
{
|
||||
_realm = realm;
|
||||
_enqueue_response = &http_response::enqueue_response_basic;
|
||||
return *this;
|
||||
}
|
||||
|
||||
http_response_builder& digest_auth_fail_response(
|
||||
const std::string& realm = "",
|
||||
const std::string& opaque = "",
|
||||
bool reload_nonce = false
|
||||
)
|
||||
{
|
||||
_realm = realm;
|
||||
_opaque = opaque;
|
||||
_reload_nonce = reload_nonce;
|
||||
_enqueue_response = &http_response::enqueue_response_digest;
|
||||
return *this;
|
||||
}
|
||||
|
||||
http_response_builder& long_polling_receive_response(
|
||||
const std::vector<std::string>& topics,
|
||||
int keepalive_secs = -1,
|
||||
std::string keepalive_msg = ""
|
||||
)
|
||||
{
|
||||
_topics = topics;
|
||||
_keepalive_secs = keepalive_secs;
|
||||
_keepalive_msg = keepalive_msg;
|
||||
_get_raw_response = &http_response::get_raw_response_lp_receive;
|
||||
return *this;
|
||||
}
|
||||
|
||||
http_response_builder& long_polling_send_response(const std::string& send_topic)
|
||||
{
|
||||
_send_topic = send_topic;
|
||||
_get_raw_response = &http_response::get_raw_response_lp_send;
|
||||
return *this;
|
||||
}
|
||||
|
||||
http_response_builder& cache_response()
|
||||
{
|
||||
_get_raw_response = &http_response::get_raw_response_cache;
|
||||
_decorate_response = &http_response::decorate_response_cache;
|
||||
return *this;
|
||||
}
|
||||
|
||||
http_response_builder& deferred_response(cycle_callback_ptr cycle_callback)
|
||||
{
|
||||
_cycle_callback = cycle_callback;
|
||||
_get_raw_response = &http_response::get_raw_response_deferred;
|
||||
_decorate_response = &http_response::decorate_response_deferred;
|
||||
return *this;
|
||||
}
|
||||
|
||||
http_response_builder& shoutCAST_response()
|
||||
{
|
||||
_response_code |= http_utils::shoutcast_response;
|
||||
return *this;
|
||||
}
|
||||
|
||||
http_response_builder& with_header(const std::string& key, const std::string& value)
|
||||
{
|
||||
_headers[key] = value; return *this;
|
||||
}
|
||||
|
||||
http_response_builder& with_footer(const std::string& key, const std::string& value)
|
||||
{
|
||||
_footers[key] = value; return *this;
|
||||
}
|
||||
|
||||
http_response_builder& with_cookie(const std::string& key, const std::string& value)
|
||||
{
|
||||
_cookies[key] = value; return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
std::string _content_hook;
|
||||
int _response_code;
|
||||
bool _autodelete;
|
||||
std::string _realm;
|
||||
std::string _opaque;
|
||||
bool _reload_nonce;
|
||||
std::map<std::string, std::string, header_comparator> _headers;
|
||||
std::map<std::string, std::string, header_comparator> _footers;
|
||||
std::map<std::string, std::string, header_comparator> _cookies;
|
||||
std::vector<std::string> _topics;
|
||||
int _keepalive_secs;
|
||||
std::string _keepalive_msg;
|
||||
std::string _send_topic;
|
||||
cycle_callback_ptr _cycle_callback;
|
||||
details::cache_entry* _ce;
|
||||
|
||||
void (http_response::*_get_raw_response)(MHD_Response**, webserver*);
|
||||
void (http_response::*_decorate_response)(MHD_Response*);
|
||||
int (http_response::*_enqueue_response)(MHD_Connection*, MHD_Response*);
|
||||
|
||||
http_response_builder& cache_response(details::cache_entry* ce)
|
||||
{
|
||||
_ce = ce;
|
||||
_get_raw_response = &http_response::get_raw_response_cache;
|
||||
_decorate_response = &http_response::decorate_response_cache;
|
||||
return *this;
|
||||
}
|
||||
|
||||
friend class http_response;
|
||||
};
|
||||
|
||||
};
|
||||
#endif //_HTTP_RESPONSE_BUILDER_HPP_
|
||||
@@ -0,0 +1,422 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _HTTPUTILS_H_
|
||||
#define _HTTPUTILS_H_
|
||||
|
||||
#include <microhttpd.h>
|
||||
#include <string>
|
||||
#include <cctype>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
#include <exception>
|
||||
#include <iosfwd>
|
||||
#ifdef HAVE_GNUTLS
|
||||
#include <gnutls/gnutls.h>
|
||||
#endif
|
||||
|
||||
#define DEFAULT_MASK_VALUE 0xFFFF
|
||||
|
||||
namespace httpserver {
|
||||
namespace http {
|
||||
|
||||
class bad_ip_format_exception: public std::exception
|
||||
{
|
||||
virtual const char* what() const throw()
|
||||
{
|
||||
return "IP is badly formatted!";
|
||||
}
|
||||
};
|
||||
|
||||
class file_access_exception: public std::exception
|
||||
{
|
||||
virtual const char* what() const throw()
|
||||
{
|
||||
return "Unable to open file!";
|
||||
}
|
||||
};
|
||||
|
||||
class http_utils
|
||||
{
|
||||
public:
|
||||
|
||||
enum cred_type_T
|
||||
{
|
||||
NONE = -1
|
||||
#ifdef HAVE_GNUTLS
|
||||
,CERTIFICATE = GNUTLS_CRD_CERTIFICATE,
|
||||
ANON = GNUTLS_CRD_ANON,
|
||||
SRP = GNUTLS_CRD_SRP,
|
||||
PSK = GNUTLS_CRD_PSK,
|
||||
IA = GNUTLS_CRD_IA
|
||||
#endif
|
||||
};
|
||||
|
||||
enum start_method_T
|
||||
{
|
||||
INTERNAL_SELECT = MHD_NO_FLAG,
|
||||
THREADS = MHD_USE_THREAD_PER_CONNECTION,
|
||||
POLL = MHD_USE_THREAD_PER_CONNECTION | MHD_USE_POLL
|
||||
};
|
||||
|
||||
enum policy_T
|
||||
{
|
||||
ACCEPT,
|
||||
REJECT
|
||||
};
|
||||
|
||||
enum IP_version_T
|
||||
{
|
||||
IPV4 = 4, IPV6 = 16
|
||||
};
|
||||
|
||||
static const short http_method_connect_code;
|
||||
static const short http_method_delete_code;
|
||||
static const short http_method_get_code;
|
||||
static const short http_method_head_code;
|
||||
static const short http_method_options_code;
|
||||
static const short http_method_post_code;
|
||||
static const short http_method_put_code;
|
||||
static const short http_method_trace_code;
|
||||
static const short http_method_unknown_code;
|
||||
|
||||
static const int http_continue;
|
||||
static const int http_switching_protocol;
|
||||
static const int http_processing;
|
||||
|
||||
static const int http_ok;
|
||||
static const int http_created;
|
||||
static const int http_accepted;
|
||||
static const int http_non_authoritative_information;
|
||||
static const int http_no_content;
|
||||
static const int http_reset_content;
|
||||
static const int http_partial_content;
|
||||
static const int http_multi_status;
|
||||
|
||||
static const int http_multiple_choices;
|
||||
static const int http_moved_permanently;
|
||||
static const int http_found;
|
||||
static const int http_see_other;
|
||||
static const int http_not_modified;
|
||||
static const int http_use_proxy;
|
||||
static const int http_switch_proxy;
|
||||
static const int http_temporary_redirect;
|
||||
|
||||
static const int http_bad_request;
|
||||
static const int http_unauthorized;
|
||||
static const int http_payment_required;
|
||||
static const int http_forbidden;
|
||||
static const int http_not_found;
|
||||
static const int http_method_not_allowed;
|
||||
static const int http_method_not_acceptable;
|
||||
static const int http_proxy_authentication_required;
|
||||
static const int http_request_timeout;
|
||||
static const int http_conflict;
|
||||
static const int http_gone;
|
||||
static const int http_length_required;
|
||||
static const int http_precondition_failed;
|
||||
static const int http_request_entity_too_large;
|
||||
static const int http_request_uri_too_long;
|
||||
static const int http_unsupported_media_type;
|
||||
static const int http_requested_range_not_satisfiable;
|
||||
static const int http_expectation_failed;
|
||||
static const int http_unprocessable_entity;
|
||||
static const int http_locked;
|
||||
static const int http_failed_dependency;
|
||||
static const int http_unordered_collection;
|
||||
static const int http_upgrade_required;
|
||||
static const int http_retry_with;
|
||||
|
||||
static const int http_internal_server_error;
|
||||
static const int http_not_implemented;
|
||||
static const int http_bad_gateway;
|
||||
static const int http_service_unavailable;
|
||||
static const int http_gateway_timeout;
|
||||
static const int http_version_not_supported;
|
||||
static const int http_variant_also_negotiated;
|
||||
static const int http_insufficient_storage;
|
||||
static const int http_bandwidth_limit_exceeded;
|
||||
static const int http_not_extended;
|
||||
|
||||
static const int shoutcast_response;
|
||||
|
||||
/* See also: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html */
|
||||
static const std::string http_header_accept;
|
||||
static const std::string http_header_accept_charset;
|
||||
static const std::string http_header_accept_encoding;
|
||||
static const std::string http_header_accept_language;
|
||||
static const std::string http_header_accept_ranges;
|
||||
static const std::string http_header_age;
|
||||
static const std::string http_header_allow;
|
||||
static const std::string http_header_authorization;
|
||||
static const std::string http_header_cache_control;
|
||||
static const std::string http_header_connection;
|
||||
static const std::string http_header_content_encoding;
|
||||
static const std::string http_header_content_language;
|
||||
static const std::string http_header_content_length;
|
||||
static const std::string http_header_content_location;
|
||||
static const std::string http_header_content_md5;
|
||||
static const std::string http_header_content_range;
|
||||
static const std::string http_header_content_type;
|
||||
static const std::string http_header_date;
|
||||
static const std::string http_header_etag;
|
||||
static const std::string http_header_expect;
|
||||
static const std::string http_header_expires;
|
||||
static const std::string http_header_from;
|
||||
static const std::string http_header_host;
|
||||
static const std::string http_header_if_match;
|
||||
static const std::string http_header_if_modified_since;
|
||||
static const std::string http_header_if_none_match;
|
||||
static const std::string http_header_if_range;
|
||||
static const std::string http_header_if_unmodified_since;
|
||||
static const std::string http_header_last_modified;
|
||||
static const std::string http_header_location;
|
||||
static const std::string http_header_max_forwards;
|
||||
static const std::string http_header_pragma;
|
||||
static const std::string http_header_proxy_authenticate;
|
||||
static const std::string http_header_proxy_authentication;
|
||||
static const std::string http_header_range;
|
||||
static const std::string http_header_referer;
|
||||
static const std::string http_header_retry_after;
|
||||
static const std::string http_header_server;
|
||||
static const std::string http_header_te;
|
||||
static const std::string http_header_trailer;
|
||||
static const std::string http_header_transfer_encoding;
|
||||
static const std::string http_header_upgrade;
|
||||
static const std::string http_header_user_agent;
|
||||
static const std::string http_header_vary;
|
||||
static const std::string http_header_via;
|
||||
static const std::string http_header_warning;
|
||||
static const std::string http_header_www_authenticate;
|
||||
|
||||
static const std::string http_version_1_0;
|
||||
static const std::string http_version_1_1;
|
||||
|
||||
static const std::string http_method_connect;
|
||||
static const std::string http_method_delete;
|
||||
static const std::string http_method_head;
|
||||
static const std::string http_method_get;
|
||||
static const std::string http_method_options;
|
||||
static const std::string http_method_post;
|
||||
static const std::string http_method_put;
|
||||
static const std::string http_method_trace;
|
||||
|
||||
static const std::string http_post_encoding_form_urlencoded;
|
||||
static const std::string http_post_encoding_multipart_formdata;
|
||||
static size_t tokenize_url(const std::string&,
|
||||
std::vector<std::string>& result, const char separator = '/'
|
||||
);
|
||||
static void standardize_url(const std::string&, std::string& result);
|
||||
};
|
||||
|
||||
#define COMPARATOR(x, y, op) \
|
||||
{ \
|
||||
size_t l1 = (x).size();\
|
||||
size_t l2 = (y).size();\
|
||||
if (l1 < l2) return true;\
|
||||
if (l1 > l2) return false;\
|
||||
\
|
||||
for (size_t n = 0; n < l1; n++)\
|
||||
{\
|
||||
int xc = op((x)[n]);\
|
||||
int yc = op((y)[n]);\
|
||||
if (xc < yc) return true;\
|
||||
if (xc > yc) return false;\
|
||||
}\
|
||||
return false;\
|
||||
}
|
||||
|
||||
class header_comparator {
|
||||
public:
|
||||
/**
|
||||
* Operator used to compare strings.
|
||||
* @param first string
|
||||
* @param second string
|
||||
**/
|
||||
bool operator()(const std::string& x,const std::string& y) const
|
||||
{
|
||||
COMPARATOR(x, y, std::toupper);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Operator Class that is used to compare two strings. The comparison can be sensitive or insensitive.
|
||||
* The default comparison is case sensitive. To obtain insensitive comparison you have to pass in
|
||||
* compilation phase the flag CASE_INSENSITIVE to the preprocessor.
|
||||
**/
|
||||
class arg_comparator {
|
||||
public:
|
||||
/**
|
||||
* Operator used to compare strings.
|
||||
* @param first string
|
||||
* @param second string
|
||||
**/
|
||||
bool operator()(const std::string& x,const std::string& y) const
|
||||
{
|
||||
#ifdef CASE_INSENSITIVE
|
||||
COMPARATOR(x, y, std::toupper);
|
||||
#else
|
||||
COMPARATOR(x, y, );
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
struct ip_representation
|
||||
{
|
||||
http_utils::IP_version_T ip_version;
|
||||
unsigned short pieces[16];
|
||||
unsigned int mask:16;
|
||||
|
||||
ip_representation(http_utils::IP_version_T ip_version) :
|
||||
ip_version(ip_version)
|
||||
{
|
||||
mask = DEFAULT_MASK_VALUE;
|
||||
std::fill(pieces, pieces + 16, 0);
|
||||
}
|
||||
|
||||
ip_representation(const std::string& ip);
|
||||
ip_representation(const struct sockaddr* ip);
|
||||
|
||||
bool operator <(const ip_representation& b) const;
|
||||
const int weight() const
|
||||
{
|
||||
//variable-precision SWAR algorithm
|
||||
unsigned int x = mask;
|
||||
x = x - ((x >> 1) & 0x55555555);
|
||||
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
|
||||
return (((x + (x >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Method used to get an ip in form of string from a sockaddr structure
|
||||
* @param sa The sockaddr object to find the ip address from
|
||||
* @param maxlen Maxlen of the address (automatically discovered if not passed)
|
||||
* @return string containing the ip address
|
||||
**/
|
||||
void get_ip_str(const struct sockaddr *sa,
|
||||
std::string& result, socklen_t maxlen = 0
|
||||
);
|
||||
|
||||
std::string get_ip_str_new(const struct sockaddr* sa,
|
||||
socklen_t maxlen = 0
|
||||
);
|
||||
/**
|
||||
* Method used to get a port from a sockaddr
|
||||
* @param sa The sockaddr object to find the port from
|
||||
* @return short representing the port
|
||||
**/
|
||||
short get_port(const struct sockaddr* sa);
|
||||
|
||||
/**
|
||||
* Method to output the contents of a headers map to a std::ostream
|
||||
* @param os The ostream
|
||||
* @param prefix Prefix to identify the map
|
||||
* @param map
|
||||
**/
|
||||
void dump_header_map(std::ostream &os, const std::string &prefix,
|
||||
const std::map<std::string,std::string,header_comparator> &map);
|
||||
|
||||
/**
|
||||
* Method to output the contents of an arguments map to a std::ostream
|
||||
* @param os The ostream
|
||||
* @param prefix Prefix to identify the map
|
||||
* @param map
|
||||
**/
|
||||
void dump_arg_map(std::ostream &os, const std::string &prefix,
|
||||
const std::map<std::string,std::string,arg_comparator> &map);
|
||||
|
||||
/**
|
||||
* Process escape sequences ('+'=space, %HH) Updates val in place; the
|
||||
* result should be UTF-8 encoded and cannot be larger than the input.
|
||||
* The result must also still be 0-terminated.
|
||||
*
|
||||
* @param val the string to unescape
|
||||
* @return length of the resulting val (strlen(val) maybe
|
||||
* shorter afterwards due to elimination of escape sequences)
|
||||
*/
|
||||
size_t http_unescape (char *val);
|
||||
|
||||
char* load_file (const char *filename);
|
||||
|
||||
size_t load_file (const char* filename, char** content);
|
||||
|
||||
struct httpserver_ska
|
||||
{
|
||||
httpserver_ska(struct sockaddr* addr):
|
||||
addr(addr),
|
||||
ip(get_ip_str_new(addr)),
|
||||
port(get_port(addr))
|
||||
{
|
||||
}
|
||||
|
||||
httpserver_ska(): addr(0x0) { }
|
||||
|
||||
httpserver_ska(const httpserver_ska& o):
|
||||
addr(o.addr),
|
||||
ip(o.ip),
|
||||
port(o.port)
|
||||
{
|
||||
}
|
||||
|
||||
bool operator<(const httpserver_ska& o) const
|
||||
{
|
||||
if(this->ip < o.ip)
|
||||
return true;
|
||||
else if(this->ip > o.ip)
|
||||
return false;
|
||||
else if(this->port < o.port)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
httpserver_ska& operator=(const httpserver_ska& o)
|
||||
{
|
||||
this->addr = o.addr;
|
||||
this->ip = o.ip;
|
||||
this->port = o.port;
|
||||
return *this;
|
||||
}
|
||||
|
||||
httpserver_ska& operator=(struct sockaddr* addr)
|
||||
{
|
||||
this->addr = addr;
|
||||
this->ip = get_ip_str_new(addr);
|
||||
this->port = get_port(addr);
|
||||
return *this;
|
||||
}
|
||||
|
||||
struct sockaddr* addr;
|
||||
std::string ip;
|
||||
int port;
|
||||
};
|
||||
|
||||
|
||||
|
||||
};
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,364 @@
|
||||
/*
|
||||
This file is part of libhttpserver
|
||||
Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
*/
|
||||
|
||||
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
|
||||
#error "Only <httpserver.hpp> or <httpserverpp> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef _FRAMEWORK_WEBSERVER_HPP_
|
||||
#define _FRAMEWORK_WEBSERVER_HPP_
|
||||
|
||||
#define NOT_FOUND_ERROR "Not Found"
|
||||
#define METHOD_ERROR "Method not Allowed"
|
||||
#define NOT_METHOD_ERROR "Method not Acceptable"
|
||||
#define GENERIC_ERROR "Internal Error"
|
||||
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <stdlib.h>
|
||||
#include <memory>
|
||||
#include <deque>
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#include "httpserver/create_webserver.hpp"
|
||||
|
||||
namespace httpserver {
|
||||
|
||||
template<typename CHILD> class http_resource;
|
||||
class http_response;
|
||||
template<typename CHILD> class event_supplier;
|
||||
class create_webserver;
|
||||
|
||||
namespace http {
|
||||
struct ip_representation;
|
||||
struct httpserver_ska;
|
||||
};
|
||||
|
||||
namespace details {
|
||||
class http_resource_mirror;
|
||||
class event_tuple;
|
||||
class http_endpoint;
|
||||
struct daemon_item;
|
||||
struct modded_request;
|
||||
struct cache_entry;
|
||||
class comet_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Class representing the webserver. Main class of the apis.
|
||||
**/
|
||||
class webserver
|
||||
{
|
||||
public:
|
||||
webserver(const create_webserver& params);
|
||||
/**
|
||||
* Destructor of the class
|
||||
**/
|
||||
~webserver();
|
||||
/**
|
||||
* Method used to start the webserver.
|
||||
* This method can be blocking or not.
|
||||
* @param blocking param indicating if the method is blocking or not
|
||||
* @return a boolean indicating if the webserver is running or not.
|
||||
**/
|
||||
bool start(bool blocking = false);
|
||||
/**
|
||||
* Method used to stop the webserver.
|
||||
* @return true if the webserver is stopped.
|
||||
**/
|
||||
bool stop();
|
||||
/**
|
||||
* Method used to evaluate if the server is running or not.
|
||||
* @return true if the webserver is running
|
||||
**/
|
||||
bool is_running();
|
||||
/**
|
||||
* Method used to register a resource with the webserver.
|
||||
* @param resource The url pointing to the resource. This url could be also parametrized in the form /path/to/url/{par1}/and/{par2}
|
||||
* or a regular expression.
|
||||
* @param http_resource http_resource pointer to register.
|
||||
* @param family boolean indicating whether the resource is registered for the endpoint and its child or not.
|
||||
* @return true if the resource was registered
|
||||
**/
|
||||
template <typename T>
|
||||
bool register_resource(const std::string& resource,
|
||||
http_resource<T>* res, bool family = false
|
||||
)
|
||||
{
|
||||
details::http_resource_mirror hrm(res);
|
||||
return register_resource(resource, hrm, family);
|
||||
}
|
||||
|
||||
void unregister_resource(const std::string& resource);
|
||||
void ban_ip(const std::string& ip);
|
||||
void allow_ip(const std::string& ip);
|
||||
void unban_ip(const std::string& ip);
|
||||
void disallow_ip(const std::string& ip);
|
||||
|
||||
void send_message_to_topic(const std::string& topic,
|
||||
const std::string& message
|
||||
);
|
||||
void send_message_to_consumer(const http::httpserver_ska& connection_id,
|
||||
const std::string& message, bool to_lock = true
|
||||
);
|
||||
void register_to_topics(const std::vector<std::string>& topics,
|
||||
const http::httpserver_ska& connection_id, int keepalive_secs = -1,
|
||||
std::string keepalive_msg = ""
|
||||
);
|
||||
size_t read_message(const http::httpserver_ska& connection_id,
|
||||
std::string& message
|
||||
);
|
||||
size_t get_topic_consumers(const std::string& topic,
|
||||
std::set<http::httpserver_ska>& consumers
|
||||
);
|
||||
bool pop_signaled(const http::httpserver_ska& consumer);
|
||||
|
||||
http_response* get_from_cache(const std::string& key, bool* valid,
|
||||
bool lock = false, bool write = false
|
||||
);
|
||||
http_response* get_from_cache(const std::string& key, bool* valid,
|
||||
details::cache_entry** ce, bool lock = false, bool write = false
|
||||
);
|
||||
void lock_cache_element(details::cache_entry* ce, bool write = false);
|
||||
void unlock_cache_element(details::cache_entry* ce);
|
||||
details::cache_entry* put_in_cache(const std::string& key, http_response* value,
|
||||
bool* new_elem, bool lock = false,
|
||||
bool write = false, int validity = -1
|
||||
);
|
||||
void remove_from_cache(const std::string& key);
|
||||
bool is_valid(const std::string& key);
|
||||
void clean_cache();
|
||||
|
||||
const log_access_ptr get_access_logger() const
|
||||
{
|
||||
return this->log_access;
|
||||
}
|
||||
|
||||
const log_error_ptr get_error_logger() const
|
||||
{
|
||||
return this->log_error;
|
||||
}
|
||||
|
||||
const validator_ptr get_request_validator() const
|
||||
{
|
||||
return this->validator;
|
||||
}
|
||||
|
||||
const unescaper_ptr get_unescaper() const
|
||||
{
|
||||
return this->unescaper;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void register_event_supplier(const std::string& id,
|
||||
event_supplier<T>* ev_supplier
|
||||
)
|
||||
{
|
||||
register_event_supplier(id, details::event_tuple(ev_supplier));
|
||||
}
|
||||
|
||||
void remove_event_supplier(const std::string& id);
|
||||
|
||||
/**
|
||||
* Method used to kill the webserver waiting for it to terminate
|
||||
**/
|
||||
void sweet_kill();
|
||||
|
||||
protected:
|
||||
webserver& operator=(const webserver& other);
|
||||
|
||||
private:
|
||||
const uint16_t port;
|
||||
http::http_utils::start_method_T start_method;
|
||||
const int max_threads;
|
||||
const int max_connections;
|
||||
const int memory_limit;
|
||||
const int connection_timeout;
|
||||
const int per_IP_connection_limit;
|
||||
log_access_ptr log_access;
|
||||
log_error_ptr log_error;
|
||||
validator_ptr validator;
|
||||
unescaper_ptr unescaper;
|
||||
const struct sockaddr* bind_address;
|
||||
/* Changed type to MHD_socket because this type will always reflect the
|
||||
platform's actual socket type (e.g. SOCKET on windows, int on unixes)*/
|
||||
MHD_socket bind_socket;
|
||||
const int max_thread_stack_size;
|
||||
const bool use_ssl;
|
||||
const bool use_ipv6;
|
||||
const bool debug;
|
||||
const bool pedantic;
|
||||
const std::string https_mem_key;
|
||||
const std::string https_mem_cert;
|
||||
const std::string https_mem_trust;
|
||||
const std::string https_priorities;
|
||||
const http::http_utils::cred_type_T cred_type;
|
||||
const std::string digest_auth_random;
|
||||
const int nonce_nc_size;
|
||||
bool running;
|
||||
const http::http_utils::policy_T default_policy;
|
||||
const bool basic_auth_enabled;
|
||||
const bool digest_auth_enabled;
|
||||
const bool regex_checking;
|
||||
const bool ban_system_enabled;
|
||||
const bool post_process_enabled;
|
||||
bool single_resource;
|
||||
pthread_mutex_t mutexwait;
|
||||
pthread_rwlock_t runguard;
|
||||
pthread_cond_t mutexcond;
|
||||
render_ptr not_found_resource;
|
||||
render_ptr method_not_allowed_resource;
|
||||
render_ptr method_not_acceptable_resource;
|
||||
render_ptr internal_error_resource;
|
||||
std::map<details::http_endpoint, details::http_resource_mirror> registered_resources;
|
||||
std::map<std::string, details::http_resource_mirror*> registered_resources_str;
|
||||
|
||||
std::map<std::string, details::cache_entry*> response_cache;
|
||||
int next_to_choose;
|
||||
pthread_rwlock_t cache_guard;
|
||||
std::set<http::ip_representation> bans;
|
||||
std::set<http::ip_representation> allowances;
|
||||
|
||||
std::vector<details::daemon_item*> daemons;
|
||||
std::vector<pthread_t> threads;
|
||||
|
||||
std::map<std::string, details::event_tuple> event_suppliers;
|
||||
|
||||
details::comet_manager* internal_comet_manager;
|
||||
|
||||
static void* select(void* self);
|
||||
static void* cleaner(void* self);
|
||||
|
||||
bool register_resource(const std::string& resource,
|
||||
details::http_resource_mirror hrm, bool family = false
|
||||
);
|
||||
|
||||
void method_not_allowed_page(http_response** dhrs,
|
||||
details::modded_request* mr
|
||||
);
|
||||
void internal_error_page(http_response** dhrs,
|
||||
details::modded_request* mr, bool force_our = false
|
||||
);
|
||||
void not_found_page(http_response** dhrs, details::modded_request* mr);
|
||||
|
||||
static int method_not_acceptable_page
|
||||
(
|
||||
const void *cls,
|
||||
struct MHD_Connection *connection
|
||||
);
|
||||
static void request_completed(void *cls,
|
||||
struct MHD_Connection *connection, void **con_cls,
|
||||
enum MHD_RequestTerminationCode toe
|
||||
);
|
||||
static int build_request_header (void *cls, enum MHD_ValueKind kind,
|
||||
const char *key, const char *value
|
||||
);
|
||||
static int build_request_footer (void *cls, enum MHD_ValueKind kind,
|
||||
const char *key, const char *value
|
||||
);
|
||||
static int build_request_cookie (void *cls, enum MHD_ValueKind kind,
|
||||
const char *key, const char *value
|
||||
);
|
||||
static int build_request_args (void *cls, enum MHD_ValueKind kind,
|
||||
const char *key, const char *value
|
||||
);
|
||||
static int answer_to_connection
|
||||
(
|
||||
void* cls, MHD_Connection* connection,
|
||||
const char* url, const char* method,
|
||||
const char* version, const char* upload_data,
|
||||
size_t* upload_data_size, void** con_cls
|
||||
);
|
||||
static int post_iterator
|
||||
(
|
||||
void *cls,
|
||||
enum MHD_ValueKind kind,
|
||||
const char *key,
|
||||
const char *filename,
|
||||
const char *content_type,
|
||||
const char *transfer_encoding,
|
||||
const char *data, uint64_t off, size_t size
|
||||
);
|
||||
static void upgrade_handler
|
||||
(
|
||||
void *cls,
|
||||
struct MHD_Connection* connection,
|
||||
void **con_cls, int upgrade_socket
|
||||
);
|
||||
|
||||
static void unlock_cache_entry(details::cache_entry*);
|
||||
static void lock_cache_entry(details::cache_entry*);
|
||||
static void get_response(details::cache_entry*, http_response** res);
|
||||
|
||||
int bodyless_requests_answer(MHD_Connection* connection,
|
||||
const char* method, const char* version,
|
||||
struct details::modded_request* mr
|
||||
);
|
||||
|
||||
int bodyfull_requests_answer_first_step(MHD_Connection* connection,
|
||||
struct details::modded_request* mr
|
||||
);
|
||||
|
||||
int bodyfull_requests_answer_second_step(MHD_Connection* connection,
|
||||
const char* method, const char* version, const char* upload_data,
|
||||
size_t* upload_data_size, struct details::modded_request* mr
|
||||
);
|
||||
|
||||
void end_request_construction(MHD_Connection* connection,
|
||||
struct details::modded_request* mr, const char* version,
|
||||
const char* method, char* user, char* pass, char* digested_user
|
||||
);
|
||||
|
||||
int finalize_answer(MHD_Connection* connection,
|
||||
struct details::modded_request* mr, const char* method
|
||||
);
|
||||
|
||||
int complete_request(MHD_Connection* connection,
|
||||
struct details::modded_request* mr,
|
||||
const char* version, const char* method
|
||||
);
|
||||
|
||||
void register_event_supplier(const std::string& id, const details::event_tuple& evt);
|
||||
|
||||
bool use_internal_select()
|
||||
{
|
||||
return this->start_method == http::http_utils::INTERNAL_SELECT;
|
||||
}
|
||||
|
||||
friend int policy_callback (void *cls,
|
||||
const struct sockaddr* addr, socklen_t addrlen
|
||||
);
|
||||
friend void error_log(void* cls, const char* fmt, va_list ap);
|
||||
friend void access_log(webserver* cls, std::string uri);
|
||||
friend void* uri_log(void* cls, const char* uri);
|
||||
friend size_t unescaper_func(void * cls,
|
||||
struct MHD_Connection *c, char *s
|
||||
);
|
||||
friend size_t internal_unescaper(void * cls, char *s);
|
||||
friend class http_response;
|
||||
};
|
||||
|
||||
};
|
||||
#endif //_FRAMEWORK_WEBSERVER_HPP__
|
||||
@@ -0,0 +1 @@
|
||||
httpserver.hpp
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
||||
GNU libgcrypt: 1.6.3
|
||||
GNU libmicrohttpd: 0.9.42
|
||||
libhttpserver: https://github.com/etr/libhttpserver
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0"?>
|
||||
<package>
|
||||
<name>hos_libhttpserver</name>
|
||||
<version>0.0.0</version>
|
||||
<description>The hos_libhttpserver package</description>
|
||||
|
||||
<!-- One maintainer tag required, multiple allowed, one person per tag -->
|
||||
<!-- Example: -->
|
||||
<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
|
||||
<maintainer email="matthias@todo.todo">matthias</maintainer>
|
||||
|
||||
|
||||
<!-- One license tag required, multiple allowed, one license per tag -->
|
||||
<!-- Commonly used license strings: -->
|
||||
<!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
|
||||
<license>TODO</license>
|
||||
|
||||
|
||||
<!-- Url tags are optional, but mutiple are allowed, one per tag -->
|
||||
<!-- Optional attribute type can be: website, bugtracker, or repository -->
|
||||
<!-- Example: -->
|
||||
<!-- <url type="website">http://wiki.ros.org/hos_libhttpserver</url> -->
|
||||
|
||||
|
||||
<!-- Author tags are optional, mutiple are allowed, one per tag -->
|
||||
<!-- Authors do not have to be maintianers, but could be -->
|
||||
<!-- Example: -->
|
||||
<!-- <author email="jane.doe@example.com">Jane Doe</author> -->
|
||||
|
||||
|
||||
<!-- The *_depend tags are used to specify dependencies -->
|
||||
<!-- Dependencies can be catkin packages or system dependencies -->
|
||||
<!-- Examples: -->
|
||||
<!-- Use build_depend for packages you need at compile time: -->
|
||||
<!-- <build_depend>message_generation</build_depend> -->
|
||||
<!-- Use buildtool_depend for build tool packages: -->
|
||||
<!-- <buildtool_depend>catkin</buildtool_depend> -->
|
||||
<!-- Use run_depend for packages you need at runtime: -->
|
||||
<!-- <run_depend>message_runtime</run_depend> -->
|
||||
<!-- Use test_depend for packages you need only for testing: -->
|
||||
<!-- <test_depend>gtest</test_depend> -->
|
||||
<buildtool_depend>catkin</buildtool_depend>
|
||||
|
||||
|
||||
<!-- The export tag contains other, unspecified, tags -->
|
||||
<export>
|
||||
<!-- Other tools can request additional information be placed here -->
|
||||
|
||||
</export>
|
||||
</package>
|
||||
@@ -0,0 +1,208 @@
|
||||
Library: Libgcrypt
|
||||
Homepage: https://www.gnu.org/software/libgcrypt/
|
||||
Maintainer: Werner Koch <wk@gnupg.org>
|
||||
Bug reports: http://bugs.gnupg.org
|
||||
Security related bug reports: <security@gnupg.org>
|
||||
License (library): LGPLv2.1+
|
||||
License (manual and tools): GPLv2+
|
||||
|
||||
Libgcrypt is free software. See the files COPYING.LIB and COPYING for
|
||||
copying conditions, and LICENSES for notices about a few contributions
|
||||
that require these additional notices to be distributed. License
|
||||
copyright years may be listed using range notation, e.g., 2000-2013,
|
||||
indicating that every year in the range, inclusive, is a copyrightable
|
||||
year that would otherwise be listed individually.
|
||||
|
||||
|
||||
List of Copyright holders
|
||||
=========================
|
||||
|
||||
Copyright (C) 1989,1991-2015 Free Software Foundation, Inc.
|
||||
Copyright (C) 1994 X Consortium
|
||||
Copyright (C) 1996 L. Peter Deutsch
|
||||
Copyright (C) 1997 Werner Koch
|
||||
Copyright (C) 1998 The Internet Society
|
||||
Copyright (C) 1996-1999 Peter Gutmann, Paul Kendall, and Chris Wedgwood
|
||||
Copyright (C) 1996-2006 Peter Gutmann, Matt Thomlinson and Blake Coverett
|
||||
Copyright (C) 2003 Nikos Mavroyanopoulos
|
||||
Copyright (C) 2006-2007 NTT (Nippon Telegraph and Telephone Corporation)
|
||||
Copyright (C) 2012-2015 g10 Code GmbH
|
||||
Copyright (C) 2012 Simon Josefsson, Niels Möller
|
||||
Copyright (c) 2012 Intel Corporation
|
||||
Copyright (C) 2013 Christian Grothoff
|
||||
Copyright (C) 2013-2015 Jussi Kivilinna
|
||||
Copyright (C) 2013-2014 Dmitry Eremin-Solenikov
|
||||
|
||||
|
||||
Authors with a FSF copyright assignment
|
||||
=======================================
|
||||
|
||||
LIBGCRYPT Werner Koch 2001-06-07
|
||||
Assigns past and future changes.
|
||||
Assignment for future changes terminated on 2012-12-04.
|
||||
wk@gnupg.org
|
||||
Designed and implemented Libgcrypt.
|
||||
|
||||
GNUPG Matthew Skala 1998-08-10
|
||||
Disclaims changes.
|
||||
mskala@ansuz.sooke.bc.ca
|
||||
Wrote cipher/twofish.c.
|
||||
|
||||
GNUPG Natural Resources Canada 1998-08-11
|
||||
Disclaims changes by Matthew Skala.
|
||||
|
||||
GNUPG Michael Roth Germany 1998-09-17
|
||||
Assigns changes.
|
||||
mroth@nessie.de
|
||||
Wrote cipher/des.c.
|
||||
Changes and bug fixes all over the place.
|
||||
|
||||
GNUPG Niklas Hernaeus 1998-09-18
|
||||
Disclaims changes.
|
||||
nh@df.lth.se
|
||||
Weak key patches.
|
||||
|
||||
GNUPG Rémi Guyomarch 1999-05-25
|
||||
Assigns past and future changes. (g10/compress.c, g10/encr-data.c,
|
||||
g10/free-packet.c, g10/mdfilter.c, g10/plaintext.c, util/iobuf.c)
|
||||
rguyom@mail.dotcom.fr
|
||||
|
||||
ANY g10 Code GmbH 2001-06-07
|
||||
Assignment for future changes terminated on 2012-12-04.
|
||||
Code marked with ChangeLog entries of g10 Code employees.
|
||||
|
||||
LIBGCRYPT Timo Schulz 2001-08-31
|
||||
Assigns past and future changes.
|
||||
twoaday@freakmail.de
|
||||
|
||||
LIBGCRYPT Simon Josefsson 2002-10-25
|
||||
Assigns past and future changes to FSF (cipher/{md4,crc}.c, CTR mode,
|
||||
CTS/MAC flags, self test improvements)
|
||||
simon@josefsson.org
|
||||
|
||||
LIBGCRYPT Moritz Schulte 2003-04-17
|
||||
Assigns past and future changes.
|
||||
moritz@g10code.com
|
||||
|
||||
GNUTLS Nikolaos Mavrogiannopoulos 2003-11-22
|
||||
nmav@gnutls.org
|
||||
Original code for cipher/rfc2268.c.
|
||||
|
||||
LIBGCRYPT The Written Word 2005-04-15
|
||||
Assigns past and future changes. (new: src/libgcrypt.pc.in,
|
||||
src/Makefile.am, src/secmem.c, mpi/hppa1.1/mpih-mul3.S,
|
||||
mpi/hppa1.1/udiv-qrnnd.S, mpi/hppa1.1/mpih-mul2.S,
|
||||
mpi/hppa1.1/mpih-mul1.S, mpi/Makefile.am, tests/prime.c,
|
||||
tests/register.c, tests/ac.c, tests/basic.c, tests/tsexp.c,
|
||||
tests/keygen.c, tests/pubkey.c, configure.ac, acinclude.m4)
|
||||
|
||||
LIBGCRYPT Brad Hards 2006-02-09
|
||||
Assigns Past and Future Changes
|
||||
bradh@frogmouth.net
|
||||
(Added OFB mode. Changed cipher/cipher.c, test/basic.c doc/gcrypt.tex.
|
||||
added SHA-224, changed cipher/sha256.c, added HMAC tests.)
|
||||
|
||||
LIBGCRYPT Hye-Shik Chang 2006-09-07
|
||||
Assigns Past and Future Changes
|
||||
perky@freebsd.org
|
||||
(SEED cipher)
|
||||
|
||||
LIBGCRYPT Werner Dittmann 2009-05-20
|
||||
Assigns Past and Future Changes
|
||||
werner.dittmann@t-online.de
|
||||
(mpi/amd64, tests/mpitests.c)
|
||||
|
||||
GNUPG David Shaw
|
||||
Assigns past and future changes.
|
||||
dshaw@jabberwocky.com
|
||||
(cipher/camellia-glue.c and related stuff)
|
||||
|
||||
LIBGCRYPT Andrey Jivsov 2010-12-09
|
||||
Assigns Past and Future Changes
|
||||
openpgp@brainhub.org
|
||||
(cipher/ecc.c and related files)
|
||||
|
||||
LIBGCRYPT Ulrich Müller 2012-02-15
|
||||
Assigns Past and Future Changes
|
||||
ulm@gentoo.org
|
||||
(Changes to cipher/idea.c and related files)
|
||||
|
||||
LIBGCRYPT Vladimir Serbinenko 2012-04-26
|
||||
Assigns Past and Future Changes
|
||||
phcoder@gmail.com
|
||||
(cipher/serpent.c)
|
||||
|
||||
|
||||
Authors with a DCO
|
||||
==================
|
||||
|
||||
Christian Aistleitner <christian@quelltextlich.at>
|
||||
2013-02-26:20130226110144.GA12678@quelltextlich.at:
|
||||
|
||||
Christian Grothoff <christian@grothoff.org>
|
||||
2013-03-21:514B5D8A.6040705@grothoff.org:
|
||||
|
||||
Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
|
||||
2013-07-13:20130713144407.GA27334@fangorn.rup.mentorg.com:
|
||||
|
||||
Dmitry Kasatkin <dmitry.kasatkin@intel.com>
|
||||
2012-12-14:50CAE2DB.80302@intel.com:
|
||||
|
||||
Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
|
||||
2012-11-15:20121115172331.150537dzb5i6jmy8@www.dalek.fi:
|
||||
|
||||
Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
2013-05-06:5186720A.4090101@iki.fi:
|
||||
|
||||
Rafaël Carré <funman@videolan.org>
|
||||
2012-04-20:4F91988B.1080502@videolan.org:
|
||||
|
||||
Sergey V. <sftp.mtuci@gmail.com>
|
||||
2013-11-07:2066221.5IYa7Yq760@darkstar:
|
||||
|
||||
Tomáš Mráz <tm@t8m.info>
|
||||
2012-04-16:1334571250.5056.52.camel@vespa.frost.loc:
|
||||
|
||||
Werner Koch <wk@gnupg.org> (g10 Code GmbH)
|
||||
2012-12-05:87obi8u4h2.fsf@vigenere.g10code.de:
|
||||
|
||||
|
||||
More credits
|
||||
============
|
||||
|
||||
Libgcrypt used to be part of GnuPG but has been taken out into its own
|
||||
package on 2000-12-21.
|
||||
|
||||
The ATH implementation (src/ath*) has been taken from GPGME and
|
||||
relicensed to the LGPL by the copyright holder of GPGME (g10 Code
|
||||
GmbH); it is now considered to be a part of Libgcrypt.
|
||||
|
||||
Most of the stuff in mpi has been taken from an old GMP library
|
||||
version by Torbjorn Granlund <tege@noisy.tmg.se>.
|
||||
|
||||
The files cipher/rndunix.c and cipher/rndw32.c are based on those
|
||||
files from Cryptlib. Copyright Peter Gutmann, Paul Kendall, and Chris
|
||||
Wedgwood 1996-1999.
|
||||
|
||||
The ECC code cipher/ecc.c was based on code by Sergi Blanch i Torne,
|
||||
sergi at calcurco dot org.
|
||||
|
||||
The implementation of the Camellia cipher has been been taken from the
|
||||
original NTT provided GPL source.
|
||||
|
||||
The CAVS testing program tests/cavs_driver.pl is not to be considered
|
||||
a part of libgcrypt proper. We distribute it merely for convenience.
|
||||
It has a permissive license and is copyrighted by atsec information
|
||||
security corporation. See the file for details.
|
||||
|
||||
The file salsa20.c is based on D.J. Bernstein's public domain code and
|
||||
taken from Nettle. Copyright 2012 Simon Josefsson and Niels Möller.
|
||||
|
||||
|
||||
This file is free software; as a special exception the author gives
|
||||
unlimited permission to copy and/or distribute it, with or without
|
||||
modifications, as long as this notice is preserved.
|
||||
|
||||
This file is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
@@ -0,0 +1,340 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
@@ -0,0 +1,510 @@
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations
|
||||
below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
^L
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it
|
||||
becomes a de-facto standard. To achieve this, non-free programs must
|
||||
be allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
^L
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control
|
||||
compilation and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
^L
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
^L
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at least
|
||||
three years, to give the same user the materials specified in
|
||||
Subsection 6a, above, for a charge no more than the cost of
|
||||
performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
^L
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
^L
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply, and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License
|
||||
may add an explicit geographical distribution limitation excluding those
|
||||
countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
^L
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
^L
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms
|
||||
of the ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library.
|
||||
It is safest to attach them to the start of each source file to most
|
||||
effectively convey the exclusion of warranty; and each file should
|
||||
have at least the "copyright" line and a pointer to where the full
|
||||
notice is found.
|
||||
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or
|
||||
your school, if any, to sign a "copyright disclaimer" for the library,
|
||||
if necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James
|
||||
Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,234 @@
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
|
||||
2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is free documentation; the Free Software Foundation gives
|
||||
unlimited permission to copy, distribute and modify it.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
|
||||
5. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that the
|
||||
`configure' script does not know about. Run `./configure --help' for
|
||||
details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them.
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out automatically,
|
||||
but needs to determine by the type of machine the package will run on.
|
||||
Usually, assuming the package is built to be run on the _same_
|
||||
architectures, `configure' can figure that out, but if it prints a
|
||||
message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share, you
|
||||
can create a site shell script called `config.site' that gives default
|
||||
values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
Additional license notices for Libgcrypt. -*- org -*-
|
||||
|
||||
This file contains the copying permission notices for various files in
|
||||
the Libgcrypt distribution which are not covered by the GNU Lesser
|
||||
General Public License (LGPL) or the GNU General Public License (GPL).
|
||||
|
||||
These notices all require that a copy of the notice be included
|
||||
in the accompanying documentation and be distributed with binary
|
||||
distributions of the code, so be sure to include this file along
|
||||
with any binary distributions derived from the GNU C Library.
|
||||
|
||||
* BSD_3Clause
|
||||
|
||||
For files:
|
||||
- cipher/sha256-ssse3-amd64.S
|
||||
- cipher/sha512-avx-amd64.S
|
||||
- cipher/sha512-avx2-bmi2-amd64.S
|
||||
- cipher/sha512-ssse3-amd64.S
|
||||
|
||||
#+begin_quote
|
||||
Copyright (c) 2012, Intel Corporation
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of the Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#+end_quote
|
||||
|
||||
* Simple permissive licenses
|
||||
|
||||
For files:
|
||||
- cipher/crc.c
|
||||
|
||||
#+begin_quote
|
||||
Copyright (c) 1996 L. Peter Deutsch
|
||||
|
||||
Permission is granted to copy and distribute this document for
|
||||
any purpose and without charge, including translations into
|
||||
other languages and incorporation into compilations, provided
|
||||
that the copyright notice and this notice are preserved, and
|
||||
that any substantive changes or deletions from the original are
|
||||
clearly marked.
|
||||
#+end_quote
|
||||
|
||||
* IETF permissive licenses
|
||||
|
||||
For files:
|
||||
- cipher/crc.c
|
||||
|
||||
#+begin_quote
|
||||
Copyright (C) The Internet Society (1998). All Rights Reserved.
|
||||
|
||||
This document and translations of it may be copied and furnished
|
||||
to others, and derivative works that comment on or otherwise
|
||||
explain it or assist in its implementation may be prepared,
|
||||
copied, published and distributed, in whole or in part, without
|
||||
restriction of any kind, provided that the above copyright notice
|
||||
and this paragraph are included on all such copies and derivative
|
||||
works. However, this document itself may not be modified in any
|
||||
way, such as by removing the copyright notice or references to
|
||||
the Internet Society or other Internet organizations, except as
|
||||
needed for the purpose of developing Internet standards in which
|
||||
case the procedures for copyrights defined in the Internet
|
||||
Standards process must be followed, or as required to translate
|
||||
it into languages other than English.
|
||||
|
||||
The limited permissions granted above are perpetual and will not be
|
||||
revoked by the Internet Society or its successors or assigns.
|
||||
|
||||
This document and the information contained herein is provided on
|
||||
an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET
|
||||
ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE
|
||||
OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
||||
PURPOSE.
|
||||
#+end_quote
|
||||
|
||||
* X License
|
||||
|
||||
For files:
|
||||
- install.sh
|
||||
|
||||
#+begin_quote
|
||||
Copyright (C) 1994 X Consortium
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||
TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of the X Consortium shall not
|
||||
be used in advertising or otherwise to promote the sale, use or other deal-
|
||||
ings in this Software without prior written authorization from the X Consor-
|
||||
tium.
|
||||
#+end_quote
|
||||
@@ -0,0 +1,72 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
# Copyright (C) 1992, 1999, 2000, 2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
DISTCHECK_CONFIGURE_FLAGS = --disable-random-daemon \
|
||||
--enable-ciphers=arcfour:blowfish:cast5:des:aes:twofish:serpent:rfc2268:seed:camellia
|
||||
|
||||
# (A suitable gitlog-to-changelog script can be found in GnuPG master.)
|
||||
GITLOG_TO_CHANGELOG=gitlog-to-changelog
|
||||
|
||||
DIST_SUBDIRS = m4 compat mpi cipher random src doc tests
|
||||
SUBDIRS = compat mpi cipher random src doc tests
|
||||
|
||||
EXTRA_DIST = autogen.sh autogen.rc README.GIT LICENSES \
|
||||
ChangeLog-2011 build-aux/ChangeLog-2011 doc/ChangeLog-2011 \
|
||||
m4/ChangeLog-2011 cipher/ChangeLog-2011 src/ChangeLog-2011 \
|
||||
random/ChangeLog-2011 tests/ChangeLog-2011 mpi/ChangeLog-2011 \
|
||||
build-aux/git-log-footer build-aux/git-log-fix
|
||||
|
||||
DISTCLEANFILES =
|
||||
|
||||
|
||||
# Add all the files listed in "distfiles" files to the distribution,
|
||||
# apply version number s to some files and create a VERSION file which
|
||||
# we need for the Prereq: patch file trick.
|
||||
dist-hook: gen-ChangeLog
|
||||
@set -e; \
|
||||
for file in `cd $(top_srcdir); \
|
||||
find mpi -type f -name distfiles`; do \
|
||||
dir=`dirname $$file` ; $(mkinstalldirs) $(distdir)/$$dir ; \
|
||||
for i in distfiles `cat $(top_srcdir)/$$file` ; do \
|
||||
ln $(top_srcdir)/$$dir/$$i $(distdir)/$$dir/$$i 2> /dev/null \
|
||||
|| cp -p $(top_srcdir)/$$dir/$$i $(distdir)/$$dir/$$i; \
|
||||
done ; \
|
||||
done
|
||||
@set -e; \
|
||||
echo "$(VERSION)" > $(distdir)/VERSION
|
||||
|
||||
|
||||
gen_start_date = 2011-12-01T14:00:00
|
||||
.PHONY: gen-ChangeLog
|
||||
gen-ChangeLog:
|
||||
if test -d $(top_srcdir)/.git; then \
|
||||
(cd $(top_srcdir) && \
|
||||
$(GITLOG_TO_CHANGELOG) --append-dot --tear-off \
|
||||
--amend=build-aux/git-log-fix \
|
||||
--since=$(gen_start_date) ) > $(distdir)/cl-t; \
|
||||
cat $(top_srcdir)/build-aux/git-log-footer >> $(distdir)/cl-t;\
|
||||
rm -f $(distdir)/ChangeLog; \
|
||||
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
|
||||
fi
|
||||
|
||||
|
||||
|
||||
stowinstall:
|
||||
$(MAKE) $(AM_MAKEFLAGS) install prefix=/usr/local/stow/libgcrypt
|
||||
@@ -0,0 +1,924 @@
|
||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
# Copyright (C) 1992, 1999, 2000, 2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
subdir = .
|
||||
DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \
|
||||
$(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||
$(top_srcdir)/configure $(am__configure_deps) \
|
||||
$(srcdir)/config.h.in COPYING COPYING.LIB THANKS TODO \
|
||||
build-aux/compile build-aux/config.guess \
|
||||
build-aux/config.rpath build-aux/config.sub build-aux/depcomp \
|
||||
build-aux/install-sh build-aux/mdate-sh build-aux/missing \
|
||||
mkinstalldirs build-aux/texinfo.tex build-aux/ltmain.sh \
|
||||
$(top_srcdir)/build-aux/compile \
|
||||
$(top_srcdir)/build-aux/config.guess \
|
||||
$(top_srcdir)/build-aux/config.sub \
|
||||
$(top_srcdir)/build-aux/install-sh \
|
||||
$(top_srcdir)/build-aux/ltmain.sh \
|
||||
$(top_srcdir)/build-aux/missing
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/gpg-error.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lock.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/onceonly.m4 \
|
||||
$(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sys_socket_h.m4 \
|
||||
$(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||
configure.lineno config.status.lineno
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||
ctags-recursive dvi-recursive html-recursive info-recursive \
|
||||
install-data-recursive install-dvi-recursive \
|
||||
install-exec-recursive install-html-recursive \
|
||||
install-info-recursive install-pdf-recursive \
|
||||
install-ps-recursive install-recursive installcheck-recursive \
|
||||
installdirs-recursive pdf-recursive ps-recursive \
|
||||
tags-recursive uninstall-recursive
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||
distclean-recursive maintainer-clean-recursive
|
||||
am__recursive_targets = \
|
||||
$(RECURSIVE_TARGETS) \
|
||||
$(RECURSIVE_CLEAN_TARGETS) \
|
||||
$(am__extra_recursive_targets)
|
||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||
cscope distdir dist dist-all distcheck
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
|
||||
$(LISP)config.h.in
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
CSCOPE = cscope
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
distdir = $(PACKAGE)-$(VERSION)
|
||||
top_distdir = $(distdir)
|
||||
am__remove_distdir = \
|
||||
if test -d "$(distdir)"; then \
|
||||
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||
&& rm -rf "$(distdir)" \
|
||||
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
||||
else :; fi
|
||||
am__post_remove_distdir = $(am__remove_distdir)
|
||||
am__relativize = \
|
||||
dir0=`pwd`; \
|
||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
||||
sed_rest='s,^[^/]*/*,,'; \
|
||||
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
||||
sed_butlast='s,/*[^/]*$$,,'; \
|
||||
while test -n "$$dir1"; do \
|
||||
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
||||
if test "$$first" != "."; then \
|
||||
if test "$$first" = ".."; then \
|
||||
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
||||
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
||||
else \
|
||||
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
||||
if test "$$first2" = "$$first"; then \
|
||||
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
||||
else \
|
||||
dir2="../$$dir2"; \
|
||||
fi; \
|
||||
dir0="$$dir0"/"$$first"; \
|
||||
fi; \
|
||||
fi; \
|
||||
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
||||
done; \
|
||||
reldir="$$dir2"
|
||||
DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
|
||||
GZIP_ENV = --best
|
||||
DIST_TARGETS = dist-bzip2 dist-gzip
|
||||
distuninstallcheck_listfiles = find . -type f -print
|
||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||
distcleancheck_listfiles = find . -type f -print
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
BUILD_FILEVERSION = @BUILD_FILEVERSION@
|
||||
BUILD_REVISION = @BUILD_REVISION@
|
||||
BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
|
||||
CC = @CC@
|
||||
CCAS = @CCAS@
|
||||
CCASDEPMODE = @CCASDEPMODE@
|
||||
CCASFLAGS = @CCASFLAGS@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CC_FOR_BUILD = @CC_FOR_BUILD@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DL_LIBS = @DL_LIBS@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
FALLBACK_SOCKLEN_T = @FALLBACK_SOCKLEN_T@
|
||||
FGREP = @FGREP@
|
||||
GCRYPT_CIPHERS = @GCRYPT_CIPHERS@
|
||||
GCRYPT_DIGESTS = @GCRYPT_DIGESTS@
|
||||
GCRYPT_HWF_MODULES = @GCRYPT_HWF_MODULES@
|
||||
GCRYPT_KDFS = @GCRYPT_KDFS@
|
||||
GCRYPT_PUBKEY_CIPHERS = @GCRYPT_PUBKEY_CIPHERS@
|
||||
GCRYPT_RANDOM = @GCRYPT_RANDOM@
|
||||
GPG_ERROR_CFLAGS = @GPG_ERROR_CFLAGS@
|
||||
GPG_ERROR_CONFIG = @GPG_ERROR_CONFIG@
|
||||
GPG_ERROR_LIBS = @GPG_ERROR_LIBS@
|
||||
GREP = @GREP@
|
||||
INSERT_SYS_SELECT_H = @INSERT_SYS_SELECT_H@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBGCRYPT_CIPHERS = @LIBGCRYPT_CIPHERS@
|
||||
LIBGCRYPT_CONFIG_API_VERSION = @LIBGCRYPT_CONFIG_API_VERSION@
|
||||
LIBGCRYPT_CONFIG_CFLAGS = @LIBGCRYPT_CONFIG_CFLAGS@
|
||||
LIBGCRYPT_CONFIG_HOST = @LIBGCRYPT_CONFIG_HOST@
|
||||
LIBGCRYPT_CONFIG_LIBS = @LIBGCRYPT_CONFIG_LIBS@
|
||||
LIBGCRYPT_DIGESTS = @LIBGCRYPT_DIGESTS@
|
||||
LIBGCRYPT_LT_AGE = @LIBGCRYPT_LT_AGE@
|
||||
LIBGCRYPT_LT_CURRENT = @LIBGCRYPT_LT_CURRENT@
|
||||
LIBGCRYPT_LT_REVISION = @LIBGCRYPT_LT_REVISION@
|
||||
LIBGCRYPT_PUBKEY_CIPHERS = @LIBGCRYPT_PUBKEY_CIPHERS@
|
||||
LIBGCRYPT_THREAD_MODULES = @LIBGCRYPT_THREAD_MODULES@
|
||||
LIBMULTITHREAD = @LIBMULTITHREAD@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTHREAD = @LIBTHREAD@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LTLIBTHREAD = @LTLIBTHREAD@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MPI_SFLAGS = @MPI_SFLAGS@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PTH_CFLAGS = @PTH_CFLAGS@
|
||||
PTH_CONFIG = @PTH_CONFIG@
|
||||
PTH_LIBS = @PTH_LIBS@
|
||||
RANLIB = @RANLIB@
|
||||
RC = @RC@
|
||||
RUN_LARGE_DATA_TESTS = @RUN_LARGE_DATA_TESTS@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
SYS_SOCKET_H = @SYS_SOCKET_H@
|
||||
VERSION = @VERSION@
|
||||
VERSION_NUMBER = @VERSION_NUMBER@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
emacs_local_vars_begin = @emacs_local_vars_begin@
|
||||
emacs_local_vars_end = @emacs_local_vars_end@
|
||||
emacs_local_vars_read_only = @emacs_local_vars_read_only@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
DISTCHECK_CONFIGURE_FLAGS = --disable-random-daemon \
|
||||
--enable-ciphers=arcfour:blowfish:cast5:des:aes:twofish:serpent:rfc2268:seed:camellia
|
||||
|
||||
|
||||
# (A suitable gitlog-to-changelog script can be found in GnuPG master.)
|
||||
GITLOG_TO_CHANGELOG = gitlog-to-changelog
|
||||
DIST_SUBDIRS = m4 compat mpi cipher random src doc tests
|
||||
SUBDIRS = compat mpi cipher random src doc tests
|
||||
EXTRA_DIST = autogen.sh autogen.rc README.GIT LICENSES \
|
||||
ChangeLog-2011 build-aux/ChangeLog-2011 doc/ChangeLog-2011 \
|
||||
m4/ChangeLog-2011 cipher/ChangeLog-2011 src/ChangeLog-2011 \
|
||||
random/ChangeLog-2011 tests/ChangeLog-2011 mpi/ChangeLog-2011 \
|
||||
build-aux/git-log-footer build-aux/git-log-fix
|
||||
|
||||
DISTCLEANFILES =
|
||||
gen_start_date = 2011-12-01T14:00:00
|
||||
all: config.h
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
||||
|
||||
.SUFFIXES:
|
||||
am--refresh: Makefile
|
||||
@:
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
|
||||
$(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
|
||||
&& exit 0; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
echo ' $(SHELL) ./config.status'; \
|
||||
$(SHELL) ./config.status;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
$(am__cd) $(srcdir) && $(AUTOCONF)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
config.h: stamp-h1
|
||||
@test -f $@ || rm -f stamp-h1
|
||||
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
|
||||
|
||||
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||
@rm -f stamp-h1
|
||||
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||
$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||
rm -f stamp-h1
|
||||
touch $@
|
||||
|
||||
distclean-hdr:
|
||||
-rm -f config.h stamp-h1
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
distclean-libtool:
|
||||
-rm -f libtool config.lt
|
||||
|
||||
# This directory's subdirectories are mostly independent; you can cd
|
||||
# into them and run 'make' without going through this Makefile.
|
||||
# To change the values of 'make' variables: instead of editing Makefiles,
|
||||
# (1) if the variable is set in 'config.status', edit 'config.status'
|
||||
# (which will cause the Makefiles to be regenerated when you run 'make');
|
||||
# (2) otherwise, pass the desired values on the 'make' command line.
|
||||
$(am__recursive_targets):
|
||||
@fail=; \
|
||||
if $(am__make_keepgoing); then \
|
||||
failcom='fail=yes'; \
|
||||
else \
|
||||
failcom='exit 1'; \
|
||||
fi; \
|
||||
dot_seen=no; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
case "$@" in \
|
||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||
*) list='$(SUBDIRS)' ;; \
|
||||
esac; \
|
||||
for subdir in $$list; do \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
if test "$$subdir" = "."; then \
|
||||
dot_seen=yes; \
|
||||
local_target="$$target-am"; \
|
||||
else \
|
||||
local_target="$$target"; \
|
||||
fi; \
|
||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||
|| eval $$failcom; \
|
||||
done; \
|
||||
if test "$$dot_seen" = "no"; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||
fi; test -z "$$fail"
|
||||
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-recursive
|
||||
TAGS: tags
|
||||
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||
include_option=--etags-include; \
|
||||
empty_fix=.; \
|
||||
else \
|
||||
include_option=--include; \
|
||||
empty_fix=; \
|
||||
fi; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
test ! -f $$subdir/TAGS || \
|
||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
||||
fi; \
|
||||
done; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
if test $$# -gt 0; then \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
"$$@" $$unique; \
|
||||
else \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: ctags-recursive
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscope: cscope.files
|
||||
test ! -s cscope.files \
|
||||
|| $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
|
||||
clean-cscope:
|
||||
-rm -f cscope.files
|
||||
cscope.files: clean-cscope cscopelist
|
||||
cscopelist: cscopelist-recursive
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
$(am__remove_distdir)
|
||||
test -d "$(distdir)" || mkdir "$(distdir)"
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
$(am__make_dryrun) \
|
||||
|| test -d "$(distdir)/$$subdir" \
|
||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||
|| exit 1; \
|
||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
||||
$(am__relativize); \
|
||||
new_distdir=$$reldir; \
|
||||
dir1=$$subdir; dir2="$(top_distdir)"; \
|
||||
$(am__relativize); \
|
||||
new_top_distdir=$$reldir; \
|
||||
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
||||
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
||||
($(am__cd) $$subdir && \
|
||||
$(MAKE) $(AM_MAKEFLAGS) \
|
||||
top_distdir="$$new_top_distdir" \
|
||||
distdir="$$new_distdir" \
|
||||
am__remove_distdir=: \
|
||||
am__skip_length_check=: \
|
||||
am__skip_mode_fix=: \
|
||||
distdir) \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
$(MAKE) $(AM_MAKEFLAGS) \
|
||||
top_distdir="$(top_distdir)" distdir="$(distdir)" \
|
||||
dist-hook
|
||||
-test -n "$(am__skip_mode_fix)" \
|
||||
|| find "$(distdir)" -type d ! -perm -755 \
|
||||
-exec chmod u+rwx,go+rx {} \; -o \
|
||||
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||
|| chmod -R a+r "$(distdir)"
|
||||
dist-gzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||
$(am__post_remove_distdir)
|
||||
dist-bzip2: distdir
|
||||
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-lzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-xz: distdir
|
||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-tarZ: distdir
|
||||
@echo WARNING: "Support for shar distribution archives is" \
|
||||
"deprecated." >&2
|
||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-shar: distdir
|
||||
@echo WARNING: "Support for distribution archives compressed with" \
|
||||
"legacy program 'compress' is deprecated." >&2
|
||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-zip: distdir
|
||||
-rm -f $(distdir).zip
|
||||
zip -rq $(distdir).zip $(distdir)
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist dist-all:
|
||||
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
# This target untars the dist file and tries a VPATH configuration. Then
|
||||
# it guarantees that the distribution is self-contained by making another
|
||||
# tarfile.
|
||||
distcheck: dist
|
||||
case '$(DIST_ARCHIVES)' in \
|
||||
*.tar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||
*.tar.bz2*) \
|
||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||
*.tar.lz*) \
|
||||
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
||||
*.tar.xz*) \
|
||||
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
||||
*.tar.Z*) \
|
||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||
*.shar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
||||
*.zip*) \
|
||||
unzip $(distdir).zip ;;\
|
||||
esac
|
||||
chmod -R a-w $(distdir)
|
||||
chmod u+w $(distdir)
|
||||
mkdir $(distdir)/_build $(distdir)/_inst
|
||||
chmod a-w $(distdir)
|
||||
test -d $(distdir)/_build || exit 0; \
|
||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||
&& am__cwd=`pwd` \
|
||||
&& $(am__cd) $(distdir)/_build \
|
||||
&& ../configure \
|
||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||
--srcdir=.. --prefix="$$dc_install_base" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||
distuninstallcheck \
|
||||
&& chmod -R a-w "$$dc_install_base" \
|
||||
&& ({ \
|
||||
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||
&& rm -rf "$$dc_destdir" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||
&& rm -rf $(DIST_ARCHIVES) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
||||
&& cd "$$am__cwd" \
|
||||
|| exit 1
|
||||
$(am__post_remove_distdir)
|
||||
@(echo "$(distdir) archives ready for distribution: "; \
|
||||
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
||||
distuninstallcheck:
|
||||
@test -n '$(distuninstallcheck_dir)' || { \
|
||||
echo 'ERROR: trying to run $@ with an empty' \
|
||||
'$$(distuninstallcheck_dir)' >&2; \
|
||||
exit 1; \
|
||||
}; \
|
||||
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
||||
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
||||
exit 1; \
|
||||
}; \
|
||||
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
||||
|| { echo "ERROR: files left after uninstall:" ; \
|
||||
if test -n "$(DESTDIR)"; then \
|
||||
echo " (check DESTDIR support)"; \
|
||||
fi ; \
|
||||
$(distuninstallcheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
distcleancheck: distclean
|
||||
@if test '$(srcdir)' = . ; then \
|
||||
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||
$(distcleancheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
check-am: all-am
|
||||
check: check-recursive
|
||||
all-am: Makefile config.h
|
||||
installdirs: installdirs-recursive
|
||||
installdirs-am:
|
||||
install: install-recursive
|
||||
install-exec: install-exec-recursive
|
||||
install-data: install-data-recursive
|
||||
uninstall: uninstall-recursive
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-recursive
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-recursive
|
||||
|
||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||
|
||||
distclean: distclean-recursive
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-generic distclean-hdr \
|
||||
distclean-libtool distclean-tags
|
||||
|
||||
dvi: dvi-recursive
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-recursive
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-recursive
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am:
|
||||
|
||||
install-dvi: install-dvi-recursive
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-recursive
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-recursive
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-recursive
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-recursive
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-recursive
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -rf $(top_srcdir)/autom4te.cache
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-recursive
|
||||
|
||||
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
||||
|
||||
pdf: pdf-recursive
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-recursive
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am:
|
||||
|
||||
.MAKE: $(am__recursive_targets) all install-am install-strip
|
||||
|
||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
||||
am--refresh check check-am clean clean-cscope clean-generic \
|
||||
clean-libtool cscope cscopelist-am ctags ctags-am dist \
|
||||
dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
|
||||
dist-tarZ dist-xz dist-zip distcheck distclean \
|
||||
distclean-generic distclean-hdr distclean-libtool \
|
||||
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-info install-info-am install-man install-pdf \
|
||||
install-pdf-am install-ps install-ps-am install-strip \
|
||||
installcheck installcheck-am installdirs installdirs-am \
|
||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||
tags tags-am uninstall uninstall-am
|
||||
|
||||
|
||||
# Add all the files listed in "distfiles" files to the distribution,
|
||||
# apply version number s to some files and create a VERSION file which
|
||||
# we need for the Prereq: patch file trick.
|
||||
dist-hook: gen-ChangeLog
|
||||
@set -e; \
|
||||
for file in `cd $(top_srcdir); \
|
||||
find mpi -type f -name distfiles`; do \
|
||||
dir=`dirname $$file` ; $(mkinstalldirs) $(distdir)/$$dir ; \
|
||||
for i in distfiles `cat $(top_srcdir)/$$file` ; do \
|
||||
ln $(top_srcdir)/$$dir/$$i $(distdir)/$$dir/$$i 2> /dev/null \
|
||||
|| cp -p $(top_srcdir)/$$dir/$$i $(distdir)/$$dir/$$i; \
|
||||
done ; \
|
||||
done
|
||||
@set -e; \
|
||||
echo "$(VERSION)" > $(distdir)/VERSION
|
||||
.PHONY: gen-ChangeLog
|
||||
gen-ChangeLog:
|
||||
if test -d $(top_srcdir)/.git; then \
|
||||
(cd $(top_srcdir) && \
|
||||
$(GITLOG_TO_CHANGELOG) --append-dot --tear-off \
|
||||
--amend=build-aux/git-log-fix \
|
||||
--since=$(gen_start_date) ) > $(distdir)/cl-t; \
|
||||
cat $(top_srcdir)/build-aux/git-log-footer >> $(distdir)/cl-t;\
|
||||
rm -f $(distdir)/ChangeLog; \
|
||||
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
|
||||
fi
|
||||
|
||||
stowinstall:
|
||||
$(MAKE) $(AM_MAKEFLAGS) install prefix=/usr/local/stow/libgcrypt
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
@@ -0,0 +1,874 @@
|
||||
Noteworthy changes in version 1.6.3 (2015-02-27) [C20/A0/R3]
|
||||
------------------------------------------------
|
||||
|
||||
* Use ciphertext blinding for Elgamal decryption [CVE-2014-3591].
|
||||
See http://www.cs.tau.ac.il/~tromer/radioexp/ for details.
|
||||
|
||||
* Fixed data-dependent timing variations in modular exponentiation
|
||||
[related to CVE-2015-0837, Last-Level Cache Side-Channel Attacks
|
||||
are Practical].
|
||||
|
||||
* Improved asm support for older toolchains.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.6.2 (2014-08-21) [C20/A0/R2]
|
||||
------------------------------------------------
|
||||
|
||||
* Map deprecated RSA algo number to the RSA algo number for better
|
||||
backward compatibility.
|
||||
|
||||
* Support a 0x40 compression prefix for EdDSA.
|
||||
|
||||
* Improve ARM hardware feature detection and building.
|
||||
|
||||
* Fix powerpc-apple-darwin detection
|
||||
|
||||
* Fix building for the x32 ABI platform.
|
||||
|
||||
* Support building using the latest mingw-w64 toolchain.
|
||||
|
||||
* Fix some possible NULL deref bugs.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.6.1 (2014-01-29) [C20/A0/R1]
|
||||
------------------------------------------------
|
||||
|
||||
* Added emulation for broken Whirlpool code prior to 1.6.0.
|
||||
|
||||
* Improved performance of KDF functions.
|
||||
|
||||
* Improved ECDSA compliance.
|
||||
|
||||
* Fixed locking for Windows and non-ELF Pthread systems (regression
|
||||
in 1.6.0)
|
||||
|
||||
* Fixed message digest lookup by OID (regression in 1.6.0).
|
||||
|
||||
* Fixed a build problem on NetBSD.
|
||||
|
||||
* Fixed memory leaks in ECC code.
|
||||
|
||||
* Fixed some asm build problems and feature detection bugs.
|
||||
|
||||
* Interface changes relative to the 1.6.0 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
GCRY_MD_FLAG_BUGEMU1 NEW (minor API change).
|
||||
|
||||
|
||||
Noteworthy changes in version 1.6.0 (2013-12-16) [C20/A0/R0]
|
||||
------------------------------------------------
|
||||
|
||||
* Removed the long deprecated gcry_ac interface. Thus Libgcrypt is
|
||||
not anymore ABI compatible to previous versions if they used the ac
|
||||
interface.
|
||||
|
||||
* Removed the module register subsystem.
|
||||
|
||||
* The deprecated message digest debug macros have been removed. Use
|
||||
gcry_md_debug instead.
|
||||
|
||||
* Removed deprecated control codes.
|
||||
|
||||
* Improved performance of most cipher algorithms as well as for the
|
||||
SHA family of hash functions.
|
||||
|
||||
* Added support for the IDEA cipher algorithm.
|
||||
|
||||
* Added support for the Salsa20 and reduced Salsa20/12 stream ciphers.
|
||||
|
||||
* Added limited support for the GOST 28147-89 cipher algorithm.
|
||||
|
||||
* Added support for the GOST R 34.11-94 and R 34.11-2012 (Stribog)
|
||||
hash algorithms.
|
||||
|
||||
* Added a random number generator to directly use the system's RNG.
|
||||
Also added an interface to prefer the use of a specified RNG.
|
||||
|
||||
* Added support for the SCRYPT algorithm.
|
||||
|
||||
* Mitigated the Yarom/Falkner flush+reload side-channel attack on RSA
|
||||
secret keys. See <http://eprint.iacr.org/2013/448> [CVE-2013-4242].
|
||||
|
||||
* Added support for Deterministic DSA as per RFC-6969.
|
||||
|
||||
* Added support for curve Ed25519.
|
||||
|
||||
* Added a scatter gather hash convenience function.
|
||||
|
||||
* Added several MPI amd SEXP helper functions.
|
||||
|
||||
* Added support for negative numbers to gcry_mpi_print,
|
||||
gcry_mpi_aprint and gcry_mpi_scan.
|
||||
|
||||
* The algorithm ids GCRY_PK_ECDSA and GCRY_PK_ECDH are now
|
||||
deprecated. Use GCRY_PK_ECC if you need an algorithm id.
|
||||
|
||||
* Changed gcry_pk_genkey for "ecc" to only include the curve name and
|
||||
not the parameters. The flag "param" may be used to revert this.
|
||||
|
||||
* Added a feature to globally disable selected hardware features.
|
||||
|
||||
* Added debug helper functions.
|
||||
|
||||
* Interface changes relative to the 1.5.0 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
gcry_ac_* REMOVED.
|
||||
GCRY_AC_* REMOVED.
|
||||
gcry_module_t REMOVED.
|
||||
gcry_cipher_register REMOVED.
|
||||
gcry_cipher_unregister REMOVED.
|
||||
gcry_cipher_list REMOVED.
|
||||
gcry_pk_register REMOVED.
|
||||
gcry_pk_unregister REMOVED.
|
||||
gcry_pk_list REMOVED.
|
||||
gcry_md_register REMOVED.
|
||||
gcry_md_unregister REMOVED.
|
||||
gcry_md_list REMOVED.
|
||||
gcry_md_start_debug REMOVED (macro).
|
||||
gcry_md_stop_debug REMOVED (macro).
|
||||
GCRYCTL_SET_KEY REMOVED.
|
||||
GCRYCTL_SET_IV REMOVED.
|
||||
GCRYCTL_SET_CTR REMOVED.
|
||||
GCRYCTL_DISABLE_ALGO CHANGED: Not anymore thread-safe.
|
||||
gcry_pk_genkey CHANGED: ECC curve params not returned.
|
||||
gcry_md_hash_buffers NEW.
|
||||
gcry_buffer_t NEW.
|
||||
GCRYCTL_SET_ENFORCED_FIPS_FLAG NEW.
|
||||
GCRYCTL_SET_PREFERRED_RNG_TYPE NEW.
|
||||
GCRYCTL_GET_CURRENT_RNG_TYPE NEW.
|
||||
GCRYCTL_CLOSE_RANDOM_DEVICE NEW.
|
||||
GCRY_RNG_TYPE_STANDARD NEW.
|
||||
GCRY_RNG_TYPE_FIPS NEW.
|
||||
GCRY_RNG_TYPE_SYSTEM NEW.
|
||||
gcry_mpi_is_neg NEW.
|
||||
gcry_mpi_neg NEW.
|
||||
gcry_mpi_abs NEW.
|
||||
gcry_mpi_snatch NEW.
|
||||
gcry_mpi_set_opaque_copy NEW.
|
||||
gcry_mpi_point_t NEW.
|
||||
gcry_mpi_point_new NEW.
|
||||
gcry_mpi_point_release NEW.
|
||||
gcry_mpi_point_get NEW.
|
||||
gcry_mpi_point_snatch_get NEW.
|
||||
gcry_mpi_point_set NEW.
|
||||
gcry_mpi_point_snatch_set NEW.
|
||||
gcry_ctx_t NEW.
|
||||
gcry_ctx_release NEW.
|
||||
gcry_mpi_ec_new NEW.
|
||||
gcry_mpi_ec_get_mpi NEW.
|
||||
gcry_mpi_ec_get_point NEW.
|
||||
gcry_mpi_ec_set_mpi NEW.
|
||||
gcry_mpi_ec_set_point NEW.
|
||||
gcry_mpi_ec_get_affine NEW.
|
||||
gcry_mpi_ec_dup NEW.
|
||||
gcry_mpi_ec_add NEW.
|
||||
gcry_mpi_ec_mul NEW.
|
||||
gcry_mpi_ec_curve_point NEW.
|
||||
GCRYMPI_FLAG_IMMUTABLE NEW.
|
||||
GCRYMPI_FLAG_CONST NEW.
|
||||
GCRYMPI_FLAG_USER1 NEW.
|
||||
GCRYMPI_FLAG_USER2 NEW.
|
||||
GCRYMPI_FLAG_USER3 NEW.
|
||||
GCRYMPI_FLAG_USER4 NEW.
|
||||
GCRYMPI_CONST_ONE NEW.
|
||||
GCRYMPI_CONST_TWO NEW.
|
||||
GCRYMPI_CONST_THREE NEW.
|
||||
GCRYMPI_CONST_FOUR NEW.
|
||||
GCRYMPI_CONST_EIGHT NEW.
|
||||
GCRYMPI_FMT_OPAQUE NEW.
|
||||
GCRYPT_VERSION_NUMBER NEW.
|
||||
GCRY_KDF_SCRYPT NEW.
|
||||
gcry_pubkey_get_sexp NEW.
|
||||
GCRYCTL_DISABLE_LOCKED_SECMEM NEW.
|
||||
GCRYCTL_DISABLE_PRIV_DROP NEW.
|
||||
GCRY_CIPHER_SALSA20 NEW.
|
||||
gcry_sexp_nth_buffer NEW.
|
||||
gcry_sexp_extract_param NEW.
|
||||
GCRY_CIPHER_SALSA20R12 NEW.
|
||||
GCRY_CIPHER_GOST28147 NEW.
|
||||
GCRY_MD_GOSTR3411_94 NEW.
|
||||
GCRY_MD_STRIBOG256 NEW.
|
||||
GCRY_MD_STRIBOG512 NEW.
|
||||
GCRY_PK_ECC NEW.
|
||||
gcry_log_debug NEW.
|
||||
gcry_log_debughex NEW.
|
||||
gcry_log_debugmpi NEW.
|
||||
gcry_log_debugpnt NEW.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.5.0 (2011-06-29)
|
||||
------------------------------------------------
|
||||
|
||||
* New function gcry_kdf_derive implementing OpenPGP S2K algorithms
|
||||
and PBKDF2.
|
||||
|
||||
* Support for WindowsCE.
|
||||
|
||||
* Support for ECDH.
|
||||
|
||||
* Support for OAEP and PSS methods as described by RFC-3447.
|
||||
|
||||
* Fixed PKCS v1.5 code to always return the leading zero.
|
||||
|
||||
* New format specifiers "%M" and "%u" for gcry_sexp_build.
|
||||
|
||||
* Support opaque MPIs with "%m" and "%M" in gcry_sexp_build.
|
||||
|
||||
* New functions gcry_pk_get_curve and gcry_pk_get_param to map ECC
|
||||
parameters to a curve name and to retrieve parameter values.
|
||||
|
||||
* gcry_mpi_cmp applied to opaque values has a defined semantic now.
|
||||
|
||||
* Uses the Intel AES-NI instructions if available.
|
||||
|
||||
* The use of the deprecated Alternative Public Key Interface
|
||||
(gcry_ac_*) will now print compile time warnings.
|
||||
|
||||
* The module register subsystem has been deprecated. This subsystem
|
||||
is not flexible enough and would always require ABI changes to
|
||||
extend the internal interfaces. It will eventually be removed.
|
||||
Please contact us on the gcrypt-devel mailing list to discuss
|
||||
whether you really need this feature or how it can be replaced by
|
||||
an internal plugin mechanism.
|
||||
|
||||
* CTR mode may now be used with data chunks of arbitrary length.
|
||||
|
||||
* Changes also done in 1.4.6 (2010-07-13):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* New variants of the TIGER algorithm.
|
||||
|
||||
* New cipher algorithm mode for AES-WRAP.
|
||||
|
||||
* Changes also done in 1.4.5 (2009-12-11):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Fixed minor memory leak in DSA key generation.
|
||||
|
||||
* No more switching to FIPS mode if /proc/version is not readable.
|
||||
|
||||
* Fixed sigill during Padlock detection on old CPUs.
|
||||
|
||||
* Fixed a hang on some W2000 machines.
|
||||
|
||||
* Boosted SHA-512 performance by 30% on ia32 boxes and gcc 4.3;
|
||||
SHA-256 went up by 25%.
|
||||
|
||||
* Interface changes relative to the 1.4.6 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
GCRY_PK_ECDH NEW.
|
||||
gcry_pk_get_curve NEW.
|
||||
gcry_pk_get_param NEW.
|
||||
GCRYCTL_DISABLE_HWF NEW.
|
||||
gcry_kdf_derive NEW.
|
||||
gcry_pk_encrypt EXTENDED: Support OAEP.
|
||||
gcry_pk_decrypt EXTENDED: Support OAEP.
|
||||
gcry_pk_sign EXTENDED: Support PSS.
|
||||
gcry_pk_verify EXTENDED: Support PSS.
|
||||
gcry_sexp_build EXTENDED: Add format specifiers M and u.
|
||||
|
||||
* Interface changes relative to the 1.4.2 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
GCRY_CIPHER_MODE_AESWRAP NEW.
|
||||
GCRY_MD_TIGER1 NEW.
|
||||
GCRY_MD_TIGER2 NEW.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.4.4 (2009-01-22)
|
||||
------------------------------------------------
|
||||
|
||||
* Publish GCRY_MODULE_ID_USER and GCRY_MODULE_ID_USER_LAST constants.
|
||||
This functionality has been in Libgcrypt since 1.3.0.
|
||||
|
||||
* MD5 may now be used in non-enforced fips mode.
|
||||
|
||||
* Fixed HMAC for SHA-384 and SHA-512 with keys longer than 64 bytes.
|
||||
|
||||
* In fips mode, RSA keys are now generated using the X9.31 algorithm
|
||||
and DSA keys using the FIPS 186-2 algorithm.
|
||||
|
||||
* The transient-key flag is now also supported for DSA key
|
||||
generation. DSA domain parameters may be given as well.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.4.3 (2008-09-18)
|
||||
------------------------------------------------
|
||||
|
||||
* Try to auto-initialize Libgcrypt to minimize the effect of
|
||||
applications not doing that correctly. This is not a perfect
|
||||
solution but given that many applicationion would totally fail
|
||||
without such a hack, we try to help at least with the most common
|
||||
cases. Folks, please read the manual to learn how to properly
|
||||
initialize Libgcrypt!
|
||||
|
||||
* Auto-initialize the secure memory to 32k instead of aborting the
|
||||
process.
|
||||
|
||||
* Log fatal errors via syslog.
|
||||
|
||||
* Changed the name and the semantics of the fips mode config file.
|
||||
|
||||
* Add convenience macro gcry_fips_mode_active.
|
||||
|
||||
* More self-tests.
|
||||
|
||||
* Documentation cleanups.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.4.2 (2008-09-08)
|
||||
------------------------------------------------
|
||||
|
||||
* The long missing gcry_mpi_lshift function has been added.
|
||||
|
||||
* RSA key generation now supports a "transient-key" flag.
|
||||
|
||||
* The keygrip computation for ECDSA has been implemented thus ECDSA
|
||||
is now fully supported.
|
||||
|
||||
* A few macros have been replaced by functions for better type
|
||||
checking.
|
||||
|
||||
* The thread initialization structure now carries version
|
||||
information.
|
||||
|
||||
* The manual describes more clearly how to initialize Libgcrypt.
|
||||
|
||||
* The library may now be switched into a FIPS mode.
|
||||
|
||||
* Interface changes relative to the 1.3.0 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
GCRYCTL_OPERATIONAL_P NEW.
|
||||
GCRYCTL_FIPS_MODE_P NEW.
|
||||
GCRYCTL_FORCE_FIPS_MODE NEW.
|
||||
gcry_cipher_setkey NEW: Replaces macro.
|
||||
gcry_cipher_setiv NEW: Replaces macro.
|
||||
gcry_cipher_setctr NEW: Replaces macro.
|
||||
gcry_mpi_lshift NEW.
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
Noteworthy changes in version 1.4.1 (2008-04-25)
|
||||
------------------------------------------------
|
||||
|
||||
* Fixed a bug introduced by 1.3.1 which led to the comsumption of far
|
||||
too much entropy for the intial seeding.
|
||||
|
||||
* Improved AES performance for CFB and CBC modes.
|
||||
|
||||
* Removed build problems for the Padlock support.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.4.0 (2007-12-10)
|
||||
------------------------------------------------
|
||||
|
||||
* New configure option --disable-padlock-support which is mostly
|
||||
useful in case of build problems.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.3.2 (2007-12-03)
|
||||
------------------------------------------------
|
||||
|
||||
* The visibility attribute is now used if supported by the toolchain.
|
||||
|
||||
* The ACE engine of VIA processors is now used for AES-128.
|
||||
|
||||
* The ASN.1 DER template for SHA-224 has been fixed.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.3.1 (2007-10-26)
|
||||
------------------------------------------------
|
||||
|
||||
* The entire library is now under the LGPL. The helper programs and
|
||||
the manual are under the GPL. Kudos to Peter Gutmann for giving
|
||||
permissions to relicense the rndw32 and rndunix modules.
|
||||
|
||||
* The Camellia cipher is now under the LGPL and included by default.
|
||||
|
||||
* Fixed a bug in the detection of symbol prefixes which inhibited the
|
||||
build of optimzied assembler code on certain systems.
|
||||
|
||||
* Updated the entropy gatherer for W32.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.3.0 (2007-05-04)
|
||||
------------------------------------------------
|
||||
|
||||
* Changed the way the RNG gets initialized. This allows to keep it
|
||||
uninitialized as long as no random numbers are used. To override
|
||||
this, the new macro gcry_fast_random_poll may be used. It is in
|
||||
general a good idea to spread this macro into the application code
|
||||
to make sure that these polls happen often enough.
|
||||
|
||||
* Made the RNG immune against fork without exec.
|
||||
|
||||
* Reading and writing the random seed file is now protected by a
|
||||
fcntl style file lock on systems that provide this function.
|
||||
|
||||
* Support for SHA-224 and HMAC using SHA-384 and SHA-512.
|
||||
|
||||
* Support for the SEED cipher.
|
||||
|
||||
* Support for the Camellia cipher. Note that Camellia is disabled by
|
||||
default, and that enabling it changes the license of libgcrypt from
|
||||
LGPL to GPL.
|
||||
|
||||
* Support for OFB encryption mode.
|
||||
|
||||
* gcry_mpi_rshift does not anymore truncate the shift count.
|
||||
|
||||
* Reserved algorithm ranges for use by applications.
|
||||
|
||||
* Support for DSA2.
|
||||
|
||||
* The new function gcry_md_debug should be used instead of the
|
||||
gcry_md_start_debug and gcry_md_stop_debug macros.
|
||||
|
||||
* New configure option --enable-random-daemon to support a system
|
||||
wide random daemon. The daemon code is experimental and not yet
|
||||
very well working. It will eventually allow to keep a global
|
||||
random pool for the sake of short living processes.
|
||||
|
||||
* Non executable stack support is now used by default on systems
|
||||
supporting it.
|
||||
|
||||
* Support for Microsoft Windows.
|
||||
|
||||
* Assembler support for the AMD64 architecture.
|
||||
|
||||
* New configure option --enable-mpi-path for optimized builds.
|
||||
|
||||
* Experimental support for ECDSA; should only be used for testing.
|
||||
|
||||
* New control code GCRYCTL_PRINT_CONFIG to print the build
|
||||
configuration.
|
||||
|
||||
* Minor changes to some function declarations. Buffer arguments are
|
||||
now typed as void pointer. This should not affect any compilation.
|
||||
Fixed two bugs in return values and clarified documentation.
|
||||
|
||||
* Interface changes relative to the 1.2.0 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
gcry_fast_random_poll NEW
|
||||
gcry_md_debug NEW
|
||||
gcry_sexp_nth_string NEW
|
||||
GCRY_MD_SHA224 NEW
|
||||
GCRY_PK_USAGE_CERT NEW
|
||||
GCRY_PK_USAGE_AUTH NEW
|
||||
GCRY_PK_USAGE_UNKN NEW
|
||||
GCRY_PK_ECDSA NEW
|
||||
GCRY_CIPHER_SEED NEW
|
||||
GCRY_CIPHER_CAMELLIA128 NEW
|
||||
GCRY_CIPHER_CAMELLIA192 NEW
|
||||
GCRY_CIPHER_CAMELLIA256 NEW
|
||||
GCRYCTL_FAKED_RANDOM_P NEW
|
||||
GCRYCTL_PRINT_CONFIG NEW
|
||||
GCRYCTL_SET_RNDEGD_SOCKET NEW.
|
||||
gcry_mpi_scan CHANGED: Argument BUFFER is now void*.
|
||||
gcry_pk_algo_name CHANGED: Returns "?" instead of NULL.
|
||||
gcry_cipher_algo_name CHANGED: Returns "?" instead of "".
|
||||
gcry_pk_spec_t CHANGED: Element ALIASES is now const ptr.
|
||||
gcry_md_write_t CHANGED: Argument BUF is now a const void*.
|
||||
gcry_md_ctl CHANGED: Argument BUFFER is now void*.
|
||||
gcry_cipher_encrypt CHANGED: Arguments IN and OUT are now void*.
|
||||
gcry_cipher_decrypt CHANGED: Arguments IN and OUT are now void*.
|
||||
gcry_sexp_sprint CHANGED: Argument BUFFER is now void*.
|
||||
gcry_create_nonce CHANGED: Argument BUFFER is now void*.
|
||||
gcry_randomize CHANGED: Argument BUFFER is now void*.
|
||||
gcry_cipher_register CHANGED: Argument ALGORITHM_ID is now int*.
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
Noteworthy changes in version 1.2.0 (2004-04-15)
|
||||
------------------------------------------------
|
||||
|
||||
* First stable release.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.94 (2004-03-29)
|
||||
-------------------------------------------------
|
||||
|
||||
* The support for multi-threaded users goes into its third
|
||||
incarnation. We removed compile time support for thread libraries.
|
||||
To support the thread library of your choice, you have to set up
|
||||
callback handlers at initialization time. New data structures, a
|
||||
new control command, and default initializers are provided for this
|
||||
purpose.
|
||||
|
||||
* Interface changes relative to the 1.1.93 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
libgcrypt-config --thread OBSOLETE
|
||||
libgcrypt-pth.la REMOVED
|
||||
libgcrypt-pthread.la REMOVED
|
||||
GCRYCTL_SET_THREAD_CBS NEW
|
||||
struct gcrypt_thread_cbs NEW
|
||||
enum gcry_thread_option NEW
|
||||
GCRY_THREAD_OPTION_PTH_IMPL NEW
|
||||
GCRY_THREAD_OPTION_PTHREAD_IMPL NEW
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Noteworthy changes in version 1.1.93 (2004-03-06)
|
||||
-------------------------------------------------
|
||||
|
||||
* The automatic thread library detection has finally been removed.
|
||||
From now on, only linking explicitely to libgcrypt, libgcrypt-pth
|
||||
or libgcrypt-pthread is supported.
|
||||
|
||||
Noteworthy changes in version 1.1.92 (2004-02-20)
|
||||
-------------------------------------------------
|
||||
|
||||
* Minor bug fixes.
|
||||
|
||||
* Included a limited implementation of RFC2268.
|
||||
|
||||
* Changed API of the gcry_ac_ functions. Only a very few programs
|
||||
should be affected by this.
|
||||
|
||||
* Interface changes relative to the 1.1.91 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
GCRY_CIPHER_RFC2268_40 NEW.
|
||||
gcry_ac_data_set CHANGED: New argument FLAGS.
|
||||
gcry_ac_data_get_name CHANGED: New argument FLAGS.
|
||||
gcry_ac_data_get_index CHANGED: New argument FLAGS.
|
||||
gcry_ac_key_pair_generate CHANGED: New and reordered arguments.
|
||||
gcry_ac_key_test CHANGED: New argument HANDLE.
|
||||
gcry_ac_key_get_nbits CHANGED: New argument HANDLE.
|
||||
gcry_ac_key_get_grip CHANGED: New argument HANDLE.
|
||||
gcry_ac_data_search REMOVED.
|
||||
gcry_ac_data_add REMOVED.
|
||||
GCRY_AC_DATA_FLAG_NO_BLINDING REMOVED.
|
||||
GCRY_AC_FLAG_NO_BLINDING NEW: Replaces above.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.91 (2003-12-19)
|
||||
-------------------------------------------------
|
||||
|
||||
* Code cleanups and minor bug fixes.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.90 (2003-11-14)
|
||||
-------------------------------------------------
|
||||
|
||||
* The use of the GCRY_WEAK_RANDOM level is now deprecated in favor of
|
||||
the new gcry_create_nonce function.
|
||||
|
||||
* gcry_sexp_build now supports a "%b" format to include a memory buffer.
|
||||
|
||||
* Minor configuration fixes.
|
||||
|
||||
* Interface changes relative to the 1.1.44 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
gcry_create_nonce NEW
|
||||
gcry_sexp_build ENHANCED
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.44 (2003-10-31)
|
||||
-------------------------------------------------
|
||||
|
||||
* Bug fixes and more code cleanups.
|
||||
|
||||
* Enhanced the prime API.
|
||||
|
||||
* Interface changes relative to the 1.1.43 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
gcry_prime_group_generator NEW
|
||||
gcry_prime_release_factors NEW
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.43 (2003-09-04)
|
||||
-------------------------------------------------
|
||||
|
||||
* Bug fixes and internal code cleanups.
|
||||
|
||||
* Support for the Serpent cipher algorithm.
|
||||
|
||||
* Interface changes relative to the 1.1.42 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
gcry_prime_generate NEW
|
||||
gcry_prime_check NEW
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.42 (2003-07-31)
|
||||
-------------------------------------------------
|
||||
|
||||
* Major API cleanup. Applications need to be converted to the new
|
||||
API. See README.apichanges for hints on how to do that. Backward
|
||||
compatibility is provided where it was possible without too much
|
||||
effort and did not collide with the overall sanitization effort.
|
||||
However, this is only for ease of transition. NO DEPRECATED
|
||||
FUNCTION OR DATA TYPE IS CONSIDERED A PART OF THE API OR ABI AND
|
||||
WILL BE DROPPED IN THE FUTURE WITHOUT CHANGING THE SONAME OF THE
|
||||
LIBRARY.
|
||||
|
||||
* If gcrypt.h is included in sources compiled by GCC 3.1 or later,
|
||||
deprecated attributes will warn about use of obsolete functions and
|
||||
type definitions. You can suppress these warnings by passing
|
||||
-Wno-deprecated-declarations to the gcc command.
|
||||
|
||||
* gcry_check_version must be called from now on to initialize the
|
||||
library, it is not longer optional.
|
||||
|
||||
* Removed `libgcrypt errno' concept.
|
||||
|
||||
* Libgcrypt depends on libgpg-error, a library that provides error
|
||||
codes and according functions for all GnuPG components. Functions
|
||||
that used to return error codes asa `int' have been changed to
|
||||
return a code of type `gcry_error_t'. All GCRYERR_* error symbols
|
||||
have been removed, since they are now contained in libgpg-error
|
||||
(GPG_ERR_*). All functions and types in libgpg-error have also been
|
||||
wrapped in Libgcrypt. The new types are gcry_err_code_t and
|
||||
gcry_err_source_t. The new functions are gcry_err_code,
|
||||
gcry_err_source, gcry_error, gcry_err_make, gcry_error_from_errno,
|
||||
gcry_err_make_from_errno, gcry_err_code_from_errno,
|
||||
gcry_err_code_to_errno, gcry_strsource.
|
||||
|
||||
* New function gcry_mpi_dump to help in debugging.
|
||||
|
||||
* Added alternative interface for asymmetric cryptography.
|
||||
|
||||
* CRC-32, CRC-32 a'la RFC 1510, CRC-24 a'la RFC 2440 are now
|
||||
supported.
|
||||
|
||||
* SHA-256, SHA-384 and SHA-512 are now supported.
|
||||
|
||||
* 128 bit Twofish is now supported.
|
||||
|
||||
* The random module won't print the "not enough random bytes
|
||||
available" anymore. A new progress status is issued instead.
|
||||
|
||||
* CBC-MAC for block ciphers is now supported, by using a
|
||||
GCRY_CIPHER_CBC_MAC cipher flag.
|
||||
|
||||
* CTR mode for block ciphers is now supported.
|
||||
|
||||
* The public RSA exponent can now be specified in key generation.
|
||||
|
||||
* RSA blinding is now supported and is used automatically for RSA
|
||||
decryption. It can be explicitely disabled by using the
|
||||
`no-blinding' symbol in the `flags' S-Expression or by using the
|
||||
GCRY_AC_FLAG_DATA_NO_BLINDING flag when using the ac interface.
|
||||
|
||||
* gcry_sexp_canon_len does not use a `historically encoded' error
|
||||
code anymore.
|
||||
|
||||
|
||||
* Interface changes relative to the 1.1.12 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
GCRY_MPI DEPRECATED; Use: gcry_mpi_t
|
||||
GcryMPI DEPRECATED; Use: gcry_mpi_t
|
||||
GCRY_SEXP DEPRECATED; Use: gcry_sexp_t
|
||||
GcrySexp DEPRECATED; Use: gcry_sexp_t
|
||||
GCRY_CIPHER_HD DEPRECATED; Use: gcry_cipher_hd_t
|
||||
GcryCipherHd DEPRECATED; Use: gcry_cipher_hd_t
|
||||
GCRY_MD_HD DEPRECATED; Use: gcry_md_hd_t
|
||||
GcryMDHd DEPRECATED; Use: gcry_md_hd_t
|
||||
gcry_error_t NEW
|
||||
gcry_err_code_t NEW
|
||||
gcry_err_source_t NEW
|
||||
gcry_err_make NEW
|
||||
gcry_error NEW
|
||||
gcry_err_code NEW
|
||||
gcry_err_source NEW
|
||||
gcry_err_code_from_errno NEW
|
||||
gcry_err_code_to_errno NEW
|
||||
gcry_err_make_from_errno NEW
|
||||
gcry_error_from_errno NEW
|
||||
gcry_strsource NEW
|
||||
GCRYERR_{some error code} REMOVED; Use GPG_ERR_*
|
||||
from libgpg-error instead.
|
||||
gcry_errno REMOVED
|
||||
gcry_sexp_canon_len CHANGED
|
||||
gcry_sexp_build_array NEW
|
||||
gcry_mpi_scan CHANGED: New argument to separate in/out args.
|
||||
gcry_mpi_print CHANGED: Ditto.
|
||||
gcry_mpi_dump NEW
|
||||
gcry_cipher_open CHANGED
|
||||
gcry_cipher_reset NEW
|
||||
gcry_cipher_register NEW
|
||||
gcry_cipher_unregister NEW
|
||||
gcry_cipher_list NEW
|
||||
gcry_cipher_algo_keylen REPLACED macro with function.
|
||||
gcry_cipher_algo_blklen REPLACED macro with function.
|
||||
gcry_pk_register NEW
|
||||
gcry_pk_unregister NEW
|
||||
gcry_pk_list NEW
|
||||
gcry_pk_decrypt ENHANCED: Allows flag to return
|
||||
complete S-expression.
|
||||
gcry_md_open CHANGED
|
||||
gcry_md_copy CHANGED
|
||||
gcry_md_is_enabled NEW
|
||||
gcry_md_is_secure NEW
|
||||
gcry_md_register NEW
|
||||
gcry_md_unregister NEW
|
||||
gcry_md_list NEW
|
||||
gcry_ac_data_t NEW
|
||||
gcry_ac_key_t NEW
|
||||
gcry_ac_key_pair_t NEW
|
||||
gcry_ac_handle_t NEW
|
||||
gcry_ac_key_spec_rsa_t NEW
|
||||
gcry_ac_data_new NEW
|
||||
gcry_ac_data_destroy NEW
|
||||
gcry_ac_data_set NEW
|
||||
gcry_ac_data_copy NEW
|
||||
gcry_ac_data_length NEW
|
||||
gcry_ac_data_get_name NEW
|
||||
gcry_ac_data_get_index NEW
|
||||
gcry_ac_data_clear NEW
|
||||
gcry_ac_open NEW
|
||||
gcry_ac_close NEW
|
||||
gcry_ac_key_init NEW
|
||||
gcry_ac_key_pair_generate NEW
|
||||
gcry_ac_key_pair_extract NEW
|
||||
gcry_ac_key_data_get NEW
|
||||
gcry_ac_key_test NEW
|
||||
gcry_ac_key_get_nbits NEW
|
||||
gcry_ac_key_get_grip NEW
|
||||
gcry_ac_key_destroy NEW
|
||||
gcry_ac_key_pair_destroy NEW
|
||||
gcry_ac_data_encrypt NEW
|
||||
gcry_ac_data_decrypt NEW
|
||||
gcry_ac_data_sign NEW
|
||||
gcry_ac_data_verify NEW
|
||||
gcry_ac_id_to_name NEW
|
||||
gcry_ac_name_to_id NEW
|
||||
gcry_handler_progress_t NEW
|
||||
gcry_handler_alloc_t NEW
|
||||
gcry_handler_secure_check_t NEW
|
||||
gcry_handle_realloc_t NEW
|
||||
gcry_handler_free_t NEW
|
||||
gcry_handler_no_mem_t NEW
|
||||
gcry_handler_error_t NEW
|
||||
gcry_handler_log_t NEW
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Noteworthy changes in version 1.1.12 (2003-01-20)
|
||||
-------------------------------------------------
|
||||
|
||||
* gcry_pk_sign, gcry_pk_verify and gcry_pk_encrypt can now handle an
|
||||
optional pkcs1 flags parameter in the S-expression. A similar flag
|
||||
may be passed to gcry_pk_decrypt but it is only syntactically
|
||||
implemented.
|
||||
|
||||
* New convenience macro gcry_md_get_asnoid.
|
||||
|
||||
* There is now some real stuff in the manual.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.11 (2002-12-21)
|
||||
-------------------------------------------------
|
||||
|
||||
* Don't export internal symbols anymore (currently only for GNU systems)
|
||||
|
||||
* New algorithm: MD4
|
||||
|
||||
* Implemented ciphertext stealing.
|
||||
|
||||
* Smaller bugs fixes and a few new OIDs.
|
||||
|
||||
* Interface changes relative to the 1.1.8 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
gcry_cipher_cts NEW
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.10 (2002-09-20)
|
||||
-------------------------------------------------
|
||||
|
||||
* Fixed shared library builds for i386, PPC and Sparc.
|
||||
|
||||
* Added simple benchmark tool.
|
||||
|
||||
* Replaced the internal mutexes by code which automatically adapts to
|
||||
the used threading library. Currently Pth and Pthread are
|
||||
supported. For non-ELF systems the GNU toolchain is now required..
|
||||
|
||||
* Added untested support to build Windows DLLs.
|
||||
|
||||
Noteworthy changes in version 1.1.9 (2002-08-23)
|
||||
------------------------------------------------
|
||||
|
||||
* Support for plain old DES.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.8 (2002-06-25)
|
||||
------------------------------------------------
|
||||
|
||||
* Minor cleanups and exported a few new functions.
|
||||
|
||||
* Interface changes relative to the 1.1.7 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
gcry_mpi_div NEW
|
||||
gcry_mpi_mod NEW
|
||||
gcry_mpi_invm NEW
|
||||
gcry_mpi_swap NEW
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Noteworthy changes in version 1.1.7 (2002-05-21)
|
||||
------------------------------------------------
|
||||
|
||||
* Libgcrypt is now distributed under the terms of the GNU Lesser
|
||||
General Public License; see the README file for details.
|
||||
|
||||
* It is possible to use libgcrypt w/o intialized secure memory.
|
||||
|
||||
* Libgcrypt should now be thread safe after the initialization.
|
||||
gcry_control (GCRYCRL_INITIALIZATION_FINISHED,NULL,0) should have
|
||||
been called before creating additional threads.
|
||||
|
||||
* Interface changes relative to the 1.1.6 release:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
GCRYCTL_DISABLE_INTERNAL_LOCKING NEW
|
||||
GCRYCTL_DISABLE_SECMEM NEW
|
||||
GCRYCTL_INITIALIZATION_FINISHED NEW
|
||||
GCRYCTL_INITIALIZATION_FINISHED_P NEW
|
||||
GCRYCTL_ANY_INITIALIZATION_P NEW
|
||||
gcry_strdup NEW
|
||||
gcry_sexp_create NEW
|
||||
gcry_sexp_new NEW
|
||||
gcry_set_progress_handler NEW
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Noteworthy changes in version 1.1.6 (2002-02-07)
|
||||
------------------------------------------------
|
||||
|
||||
* Enhanced the S-expression conversion functions.
|
||||
|
||||
Noteworthy changes in version 1.1.5 (2001-12-18)
|
||||
------------------------------------------------
|
||||
|
||||
* gcry_{cipher,md}_map_name are now able to map stringified object IDs.
|
||||
|
||||
* New functions gcry_sexp_canon_len and gcry_cipher_mode_from_oid.
|
||||
|
||||
* Closed some memory leaks.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.4 (2001-08-03)
|
||||
------------------------------------------------
|
||||
|
||||
* Arcfour does now work.
|
||||
|
||||
* Some minor fixes.
|
||||
|
||||
* Added a first test program
|
||||
|
||||
* Migrated to autoconf 2.52.
|
||||
|
||||
|
||||
Noteworthy changes in version 1.1.3 (2001-05-31)
|
||||
------------------------------------------------
|
||||
|
||||
* First release of Libgcrypt which is a result of splitting GnuPG
|
||||
into into libgcrypt and GnuPG.
|
||||
|
||||
|
||||
Copyright 2001, 2002, 2003, 2004, 2007, 2008,
|
||||
2009, 2011 Free Software Foundation, Inc.
|
||||
Copyright 2013 g10 Code GmbH
|
||||
|
||||
This file is free software; as a special exception the author gives
|
||||
unlimited permission to copy and/or distribute it, with or without
|
||||
modifications, as long as this notice is preserved.
|
||||
|
||||
This file is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
@@ -0,0 +1,284 @@
|
||||
Libgcrypt - The GNU Crypto Library
|
||||
------------------------------------
|
||||
Version 1.6
|
||||
|
||||
Copyright (C) 1989,1991-2015 Free Software Foundation, Inc.
|
||||
Copyright (C) 2012-2015 g10 Code GmbH
|
||||
Copyright (C) 2013-2015 Jussi Kivilinna
|
||||
|
||||
Libgcrypt is free software. See the file AUTHORS for full copying
|
||||
notices, and LICENSES for notices about contributions that require
|
||||
these additional notices to be distributed.
|
||||
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
Libgcrypt is a general purpose crypto library based on the code
|
||||
used in GnuPG. Libgcrypt depends on the library `libgpg-error',
|
||||
which must be installed correctly before Libgcrypt is to be built.
|
||||
Libgcrypt is distributed under the LGPL, see the section "License"
|
||||
below for details.
|
||||
|
||||
|
||||
Build Instructions
|
||||
------------------
|
||||
|
||||
The download canonical location for libgcrypt is:
|
||||
|
||||
ftp://ftp.gnupg.org/gcrypt/libgcrypt/
|
||||
|
||||
To build libgcrypt you need libgpg-error:
|
||||
|
||||
ftp://ftp.gnupg.org/gcrypt/libgpg-error/
|
||||
|
||||
You should get the latest versions of course.
|
||||
|
||||
After building and installing the libgpg-error package, you may
|
||||
continue with Libgcrypt installation as with allmost all GNU
|
||||
packages, you just have to do
|
||||
|
||||
./configure
|
||||
make
|
||||
make check
|
||||
make install
|
||||
|
||||
The "make check" is not required but a good idea to see whether
|
||||
the library works as expected. The check takes some while and
|
||||
prints some benchmarking results. Before doing "make install" you
|
||||
probably need to become root.
|
||||
|
||||
To build libgcrypt for Microsoft Windows, you need to have the
|
||||
mingw32 cross-building toolchain installed. Instead of running a
|
||||
plain configure you use
|
||||
|
||||
./autogen.sh --build-w32
|
||||
make
|
||||
make install
|
||||
|
||||
By default this command sequences expectsd a libgpg-error
|
||||
installed below $HOME/w32root and installs libgcrypt to that
|
||||
directory too. See the autogen.sh code for details.
|
||||
|
||||
The documentation is available as an Info file (gcrypt.info). To
|
||||
build documentation in PDF, run this:
|
||||
|
||||
cd doc
|
||||
make pdf
|
||||
|
||||
|
||||
|
||||
Mailing List
|
||||
------------
|
||||
|
||||
You may want to join the developer's mailing list
|
||||
gcrypt-devel@gnupg.org by sending mail with a subject of
|
||||
"subscribe" to gcrypt-devel-request@gnupg.org. An archive of this
|
||||
list is available at http://lists.gnupg.org .
|
||||
|
||||
|
||||
Configure options
|
||||
-----------------
|
||||
Here is a list of configure options which are sometimes useful
|
||||
for installation.
|
||||
|
||||
--enable-large-data-tests
|
||||
With this option a "make check" will take really
|
||||
long due to extra checks for the hash algorithms.
|
||||
|
||||
--enable-m-guard
|
||||
Enable the integrated malloc checking code. Please
|
||||
note that this feature does not work on all CPUs
|
||||
(e.g. SunOS 5.7 on UltraSparc-2) and might give
|
||||
you a bus error.
|
||||
|
||||
--disable-asm
|
||||
Do not use assembler modules. It is not possible
|
||||
to use this on some CPU types.
|
||||
|
||||
--enable-ld-version-script
|
||||
Libgcrypt tries to build a library where internal
|
||||
symbols are not exported. This requires support
|
||||
from ld and is currently enabled for a few OSes.
|
||||
If you know that your ld supports the so called
|
||||
ELF version scripts, you can use this option to
|
||||
force its use. OTOH, if you get error message
|
||||
from the linker, you probably want to use this
|
||||
option to disable the use of version scripts.
|
||||
Note, that you should never ever use an
|
||||
undocumented symbol or one which is prefixed with
|
||||
an underscore.
|
||||
|
||||
--enable-ciphers=list
|
||||
--enable-pubkey-ciphers=list
|
||||
--enable-digests=list
|
||||
If not otherwise specified, all algorithms
|
||||
included in the libgcrypt source tree are built.
|
||||
An exception are algorithms, which depend on
|
||||
features not provided by the system, like 64bit
|
||||
data types. With these switches it is possible
|
||||
to select exactly those algorithm modules, which
|
||||
should be built. The algorithms are to be
|
||||
separated by spaces, commas or colons. To view
|
||||
the list used with the current build the program
|
||||
tests/version may be used.
|
||||
|
||||
--disable-endian-check
|
||||
Don't let configure test for the endianness but
|
||||
try to use the OS provided macros at compile
|
||||
time. This is helpful to create OS X fat binaries.
|
||||
|
||||
--enable-random-daemon
|
||||
Include support for a global random daemon and
|
||||
build the daemon. This is an experimental feature.
|
||||
|
||||
--enable-mpi-path=EXTRA_PATH
|
||||
Prepend EXTRA_PATH to list of CPU specific
|
||||
optimizations. For example, if you want to add
|
||||
optimizations forn a Intel Pentium 4 compatible
|
||||
CPU, you may use
|
||||
--enable-mpi-path=pentium4/sse2:pentium4/mmx
|
||||
Take care: The generated library may crash on
|
||||
non-compatible CPUs.
|
||||
|
||||
--enable-random=NAME
|
||||
Force the use of the random gathering module
|
||||
NAME. Default is either to use /dev/random or
|
||||
the auto mode. Possible values for NAME are:
|
||||
egd - Use the module which accesses the
|
||||
Entropy Gathering Daemon. See the webpages
|
||||
for more information about it.
|
||||
unix - Use the standard Unix module which does not
|
||||
have a very good performance.
|
||||
linux - Use the module which accesses /dev/random.
|
||||
This is the first choice and the default one
|
||||
for GNU/Linux or *BSD.
|
||||
auto - Compile linux, egd and unix in and
|
||||
automagically select at runtime.
|
||||
|
||||
--enable-hmac-binary-check
|
||||
Include support to check the binary at runtime
|
||||
against a HMAC checksum. This works only in FIPS
|
||||
mode and on systems providing the dladdr function.
|
||||
|
||||
--disable-padlock-support
|
||||
Disable support for the PadLock engine of VIA
|
||||
processors. The default is to use PadLock if
|
||||
available. Try this if you get problems with
|
||||
assembler code.
|
||||
|
||||
--disable-aesni-support
|
||||
Disable support for the AES-NI instructions of
|
||||
newer Intel CPUs. The default is to use AES-NI
|
||||
if available. Try this if you get problems with
|
||||
assembler code.
|
||||
|
||||
--disable-O-flag-munging
|
||||
Some code is too complex for some compilers while
|
||||
in higher optimization modes, thus the compiler
|
||||
invocation is modified to use a lower
|
||||
optimization level. Usually this works very well
|
||||
but on some platforms these rules break the
|
||||
invocation. This option may be used to disable
|
||||
the feature under the assumption that either good
|
||||
CFLAGS are given or the compiler can grok the code.
|
||||
|
||||
|
||||
|
||||
|
||||
Build Problems
|
||||
--------------
|
||||
|
||||
We can't check all assembler files, so if you have problems
|
||||
assembling them (or the program crashes) use --disable-asm with
|
||||
./configure. If you opt to delete individual replacement files in
|
||||
hopes of using the remaining ones, be aware that the configure
|
||||
scripts may consider several subdirectories to get all available
|
||||
assembler files; be sure to delete the correct ones. Never delete
|
||||
udiv-qrnnd.S in any CPU directory, because there may be no C
|
||||
substitute (in mpi/genereic). Don't forget to delete
|
||||
"config.cache" and run "./config.status --recheck". We got a few
|
||||
reports about problems using versions of gcc earlier than 2.96
|
||||
along with a non-GNU assembler (as). If this applies to your
|
||||
platform, you can either upgrade gcc to a more recent version, or
|
||||
use the GNU assembler.
|
||||
|
||||
Some make tools are broken - the best solution is to use GNU's
|
||||
make. Try gmake or grab the sources from a GNU archive and
|
||||
install them.
|
||||
|
||||
Specific problems on some machines:
|
||||
|
||||
* IBM RS/6000 running AIX
|
||||
|
||||
Due to a change in gcc (since version 2.8) the MPI stuff may
|
||||
not build. In this case try to run configure using:
|
||||
CFLAGS="-g -O2 -mcpu=powerpc" ./configure
|
||||
|
||||
* SVR4.2 (ESIX V4.2 cc)
|
||||
|
||||
Due to problems with the ESIX as(1), you probably want to do:
|
||||
CFLAGS="-O -K pentium" ./configure --disable-asm
|
||||
|
||||
* SunOS 4.1.4
|
||||
|
||||
./configure ac_cv_sys_symbol_underscore=yes
|
||||
|
||||
* Sparc64 CPUs
|
||||
|
||||
We have reports about failures in the AES module when
|
||||
compiling using gcc (e.g. version 4.1.2) and the option -O3;
|
||||
using -O2 solves the problem.
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
The library is distributed under the terms of the GNU Lesser
|
||||
General Public License (LGPL); see the file COPYING.LIB for the
|
||||
actual terms. The helper programs (e.g. gcryptrnd and getrandom)
|
||||
as well as the documentation are distributed under the terms of
|
||||
the GNU General Public License (GPL); see the file COPYING for the
|
||||
actual terms. The file LICENSES has notices about contributions
|
||||
that require these additional notices are distributed.
|
||||
|
||||
This library used to be available under the GPL - this was changed
|
||||
with version 1.1.7 with the rationale that there are now many free
|
||||
crypto libraries available and many of them come with capabilities
|
||||
similar to Libcrypt. We decided that to foster the use of
|
||||
cryptography in Free Software an LGPLed library would make more
|
||||
sense because it avoids problems due to license incompatibilities
|
||||
between some Free Software licenses and the GPL.
|
||||
|
||||
Please note that in many cases it is better for a library to be
|
||||
licensed under the GPL, so that it provides an advantage for free
|
||||
software projects. The Lesser GPL is so named because it does
|
||||
less to protect the freedom of the users of the code that it
|
||||
covers. See http://www.gnu.org/philosophy/why-not-lgpl.html for
|
||||
more explanation.
|
||||
|
||||
|
||||
Contact
|
||||
-------
|
||||
|
||||
See the file AUTHORS.
|
||||
|
||||
Commercial grade support for Libgcrypt is available; please see
|
||||
http://www.gnupg.org/service.html .
|
||||
|
||||
Commercial grade support for Libgcrypt is available; for a listing
|
||||
of offers see http://www.gnupg.org/service.html . The driving
|
||||
force behind the development of Libgcrypt is the company of its
|
||||
principal author, Werner Koch. Maintenance and improvement of
|
||||
Libgcrypt takes up a lot resources. To allow him to continue his
|
||||
work, he asks to either purchase a support contract, engage them
|
||||
for custom enhancements, or to donate money. See http://g10code.com .
|
||||
|
||||
|
||||
This file is Free Software; as a special exception the authors gives
|
||||
unlimited permission to copy and/or distribute it, with or without
|
||||
modifications, as long as this notice is preserved. For conditions
|
||||
of the whole package, please see the file COPYING. This file is
|
||||
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY, to the extent permitted by law; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
@@ -0,0 +1,49 @@
|
||||
If you are building from GIT, run the script
|
||||
|
||||
./autogen.sh
|
||||
|
||||
first, to make sure that you have all the necessary maintainer tools
|
||||
are installed and to build the actual configuration files. If you
|
||||
have just checked out from GIT, you should add the option "--force" to
|
||||
autogen.sh so that meta data is noticed by autom4te.cache. Then run
|
||||
|
||||
./configure --enable-maintainer-mode
|
||||
|
||||
followed by the usual make.
|
||||
|
||||
If autogen.sh complains about insufficient versions of the required
|
||||
tools, or the tools are not installed, you may use environment
|
||||
variables to override the default tool names:
|
||||
|
||||
AUTOMAKE_SUFFIX is used as a suffix for all tools from the automake
|
||||
package. For example
|
||||
AUTOMAKE_SUFFIX="-1.7" ./autogen.sh
|
||||
uses "automake-1.7" and "aclocal-1.7.
|
||||
AUTOMAKE_PREFIX is used as a prefix for all tools from the automake
|
||||
page and may be combined with AUTOMAKE_SUFFIX. e.g.:
|
||||
AUTOMAKE_PREFIX=/usr/foo/bin ./autogen.sh
|
||||
uses "automake" and "aclocal" in the /usr/foo/bin
|
||||
directory.
|
||||
AUTOCONF_SUFFIX is used as a suffix for all tools from the automake
|
||||
package
|
||||
AUTOCONF_PREFIX is used as a prefix for all tools from the automake
|
||||
package
|
||||
GETTEXT_SUFFIX is used as a suffix for all tools from the gettext
|
||||
package
|
||||
GETTEXT_PREFIX is used as a prefix for all tools from the gettext
|
||||
package
|
||||
|
||||
It is also possible to use the variable name AUTOMAKE, AUTOCONF,
|
||||
ACLOCAL, AUTOHEADER, GETTEXT and MSGMERGE to directly specify the name
|
||||
of the programs to run. It is however better to use the suffix and
|
||||
prefix forms as described above because that does not require
|
||||
knowledge about the actual tools used by autogen.sh.
|
||||
|
||||
|
||||
Please don't use autopoint, libtoolize or autoreconf unless you are
|
||||
the current maintainer and want to update the standard configuration
|
||||
files. All those files should be in GIT and only updated manually
|
||||
if the maintainer decides that newer versions are required. The
|
||||
maintainer should also make sure that the required version of automake
|
||||
et al. are properly indicated at the top of configure.ac and take care
|
||||
to copy the files and not merely use symlinks.
|
||||
@@ -0,0 +1,168 @@
|
||||
Libgcrypt is based on the GnuPG code. Here is a list of people, who
|
||||
helped in GnuPG and Libgcrypt development. Please help us to keep it
|
||||
complete and free of errors.
|
||||
|
||||
Albert Chin china at thewrittenword com
|
||||
Allan Clark allanc@sco.com
|
||||
Anand Kumria wildfire@progsoc.uts.edu.au
|
||||
Andreas Metzler ametzler at downhill.at.eu.org
|
||||
Ariel T Glenn ariel@columbia.edu
|
||||
Aurelien Jarno aurel32 at debian.org
|
||||
Ben Hutchings ben decadent org uk
|
||||
Bodo Moeller Bodo_Moeller@public.uni-hamburg.de
|
||||
Brenno de Winter brenno@dewinter.com
|
||||
Brian Moore bem@cmc.net
|
||||
Brian Warner warner@lothar.com
|
||||
Brieuc Jeunhomme bbp@via.ecp.fr
|
||||
Bryan Fullerton bryanf@samurai.com
|
||||
Caskey L. Dickson caskey@technocage.com
|
||||
Cees van de Griend cees-list@griend.xs4all.nl
|
||||
Charles Levert charles@comm.polymtl.ca
|
||||
Christian Biere christianbiere@gmx.de
|
||||
Christian Grothoff christian at grothoff org
|
||||
Christian von Roques roques@pond.sub.org
|
||||
Christopher Oliver oliver@fritz.traverse.net
|
||||
Christian Recktenwald chris@citecs.de
|
||||
Daiki Ueno ueno at unixuser org
|
||||
Dan Fandrich dan at coneharvesters com
|
||||
Daniel Eisenbud eisenbud@cs.swarthmore.edu
|
||||
Daniel Koening dan@mail.isis.de
|
||||
David Ellement ellement@sdd.hp.com
|
||||
Detlef Lannert lannert@lannert.rz.uni-duesseldorf.de
|
||||
Dirk Lattermann dlatt@t-online.de
|
||||
Dirk Stoecker gcrypt@dstoecker.de
|
||||
Ed Boraas ecxjo@esperanto.org
|
||||
Elie De Brauwer elie@de-brauwer.be
|
||||
Enzo Michelangeli em@MailAndNews.com
|
||||
Ernst Molitor ernst.molitor@uni-bonn.de
|
||||
Fabian Keil fk at fabiankeil de
|
||||
Fabio Coatti cova@felix.unife.it
|
||||
Felix von Leitner leitner@amdiv.de
|
||||
Frank Heckenbach heckenb@mi.uni-erlangen.de
|
||||
Frank Stajano frank.stajano@cl.cam.ac.uk
|
||||
Gabriele Monti psicus78 gmail com
|
||||
Gaël Quéri gqueri@mail.dotcom.fr
|
||||
Gregor Riepl seto-kun@freesurf.ch
|
||||
Gerlinde Klaes gk@u64.de
|
||||
Greg Louis glouis@dynamicro.on.ca
|
||||
Greg Troxel gdt@ir.bbn.com
|
||||
Gregory Steuck steuck@iname.com
|
||||
Geoff Keating geoffk@ozemail.com.au
|
||||
Harald Denker harry@hal.westfalen.de
|
||||
Hendrik Buschkamp buschkamp@rheumanet.org
|
||||
Holger Schurig holger@d.om.org
|
||||
Hugh Daniel hugh@toad.com
|
||||
Ian McKellar imckellar@harvestroad.com.au
|
||||
Ian Peters itp@ximian.com
|
||||
Janusz A. Urbanowicz alex@bofh.torun.pl
|
||||
James Troup james@nocrew.org
|
||||
Jean-loup Gailly gzip@prep.ai.mit.edu
|
||||
Jeff Johnson jbj@redhat.com
|
||||
Jens Bachem bachem@rrz.uni-koeln.de
|
||||
J Horacio MG homega@ciberia.es
|
||||
Joachim Backes backes@rhrk.uni-kl.de
|
||||
Jordi Mallach jordi@sindominio.net
|
||||
John A. Martin jam@jamux.com
|
||||
Johnny Teveßen j.tevessen@gmx.de
|
||||
Jörg Schilling schilling@fokus.gmd.de
|
||||
Jun Kuriyama kuriyama@sky.rim.or.jp
|
||||
Karl Fogel kfogel@guanabana.onshore.com
|
||||
Karsten Thygesen karthy@kom.auc.dk
|
||||
Katsuhiro Kondou kondou@nec.co.jp
|
||||
Kazu Yamamoto kazu@iijlab.net
|
||||
Lars Kellogg-Stedman lars@bu.edu
|
||||
Lee Fisher blibbet at gmail dot com
|
||||
Marco d'Itri md@linux.it
|
||||
Mark Adler madler@alumni.caltech.edu
|
||||
Mark Elbrecht snowball3@bigfoot.com
|
||||
Markus Friedl Markus.Friedl@informatik.uni-erlangen.de
|
||||
Matthias Urlichs smurf@smurf.noris.de
|
||||
Martin Kahlert martin.kahlert@provi.de
|
||||
Martin Hamilton
|
||||
Martin Schulte schulte@thp.uni-koeln.de
|
||||
Matthew Skala mskala@ansuz.sooke.bc.ca
|
||||
Max Kellermann max@duempel.org
|
||||
Max Valianskiy maxcom@maxcom.ml.org
|
||||
Michael Fischer v. Mollard mfvm@gmx.de
|
||||
Michael Roth mroth@nessie.de
|
||||
Michael Sobolev mss@despair.transas.com
|
||||
Michele Baldessari michele@pupazzo.org
|
||||
Modestas Vainius geromanas@mailas.com
|
||||
Neil Dunbar neil.dunbar at pobox.com
|
||||
Neil Spring nspring@cs.washington.edu
|
||||
Newton Hammet newton@hammet.net
|
||||
Nicolas Graner Nicolas.Graner@cri.u-psud.fr
|
||||
NIIBE Yutaka gniibe@chroot.org
|
||||
Niklas Hernaeus
|
||||
Nikolay Sturm sturm@sec.informatik.tu-darmstadt.de
|
||||
Nikos Mavroyanopoulos nmav@hellug.gr
|
||||
Nimrod Zimerman zimerman@forfree.at
|
||||
N J Doye nic@niss.ac.uk
|
||||
Oliver Haakert haakert@hsp.de
|
||||
Oskari Jääskeläinen f33003a@cc.hut.fi
|
||||
Paul D. Smith psmith@baynetworks.com
|
||||
Philippe Laliberte arsphl@oeil.qc.ca
|
||||
Peter Gutmann pgut001@cs.auckland.ac.nz
|
||||
QingLong qinglong@bolizm.ihep.su
|
||||
Rafael Ávila de Espíndola rafael.espindola@gmail.com
|
||||
Rafaël Carré funman@videolan.org
|
||||
Ralf Fassel ralf@akutech.de
|
||||
Ralf Hildebrandt Ralf.Hildebrandt@innominate.com
|
||||
Ralf Schneider ralf@tapfere-schneiderleins.de
|
||||
Ralph Gillen gillen@theochem.uni-duesseldorf.de
|
||||
Rami Lehti Rami.Lehti@finland.sun.com
|
||||
Randolph Chung tausq@debian.org
|
||||
Randy mcclellr@oit.edu
|
||||
Rat ratinox@peorth.gweep.net
|
||||
Reinhard Wobst R.Wobst@ifw-dresden.de
|
||||
Rémi Guyomarch rguyom@mail.dotcom.fr
|
||||
Reuben Sumner rasumner@wisdom.weizmann.ac.il
|
||||
Richard Outerbridge outer@interlog.com
|
||||
Roddy Strachan roddy@satlink.com.au
|
||||
Roland Rosenfeld roland@spinnaker.rhein.de
|
||||
Ross Golder rossigee@bigfoot.com
|
||||
Serge Munhoven munhoven@mema.ucl.ac.be
|
||||
Sergi Blanch i Torné sergi at calcurco cat
|
||||
Simon Josefsson jas@extundo.com
|
||||
SL Baur steve@xemacs.org
|
||||
Stephan Austermuehle au@hcsd.de
|
||||
Stephan Müller smueller at atsec com
|
||||
Stephane Corthesy stephane@sente.ch
|
||||
Stefan Karrmann S.Karrmann@gmx.net
|
||||
Stefan Keller dres@cs.tu-berlin.de
|
||||
Stefan Krüger stadtkind2 at gmx de
|
||||
Steffen Ullrich ccrlphr@xensei.com
|
||||
Steffen Zahn zahn@berlin.snafu.de
|
||||
Steven Bakker steven@icoe.att.com
|
||||
Susanne Schultz schultz@hsp.de
|
||||
Sven Bjorn
|
||||
Szakats Istvan szaki.ms@gmail.com
|
||||
Thiago Jung Bauermann jungmann@cwb.matrix.com.br
|
||||
Thomas Roessler roessler@guug.de
|
||||
Tom Holroyd tomh@po.crl.go.jp
|
||||
Tom Spindler dogcow@home.merit.edu
|
||||
Tom Zerucha tzeruch@ceddec.com
|
||||
Tomas Fasth tomas.fasth@twinspot.net
|
||||
Tommi Komulainen Tommi.Komulainen@iki.fi
|
||||
Thomas Mikkelsen tbm@image.dk
|
||||
Ulf Möller 3umoelle@informatik.uni-hamburg.de
|
||||
Umberto Salsi salsi@icosaedro.it
|
||||
Uoti Urpala
|
||||
Urko Lusa ulusa@euskalnet.net
|
||||
Victor Stinner haypo@inl.fr
|
||||
Walter Koch koch@u32.de
|
||||
Werner Koch wk@gnupg.org
|
||||
Wim Vandeputte wim@kd85.com
|
||||
nbecker@hns.com
|
||||
|
||||
|
||||
Copyright 1998, 1999, 2000, 2001, 2002, 2003,
|
||||
2009, 2011 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; as a special exception the author gives
|
||||
unlimited permission to copy and/or distribute it, with or without
|
||||
modifications, as long as this notice is preserved.
|
||||
|
||||
This file is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
@@ -0,0 +1,59 @@
|
||||
# What's left to do -*- org -*-
|
||||
|
||||
* Next API break:
|
||||
** gcry_ac_io_t
|
||||
Remove use of anonymous union.
|
||||
** gcry_ac
|
||||
Consider to remove it.
|
||||
|
||||
* udiv-qrnbd.o should get build as *.lo [HPUX]
|
||||
|
||||
* Allow operation using RSA keys consisting of the OpenSSL keys.
|
||||
This requires the introduction of a parameter names (say) U which
|
||||
is calculated according to OpenSSL/PKCS#1 rules.
|
||||
|
||||
* linker script test
|
||||
Write an autoconf test to check whether the linker supports a
|
||||
version script.
|
||||
|
||||
* Add attributes to the MPI functions.
|
||||
|
||||
* cipher/pubkey.c and pubkey implementaions.
|
||||
Don't rely on the secure memory based wiping function but add an
|
||||
extra wiping.
|
||||
|
||||
* Use builtin bit functions of gcc 3.4
|
||||
|
||||
* Consider using a daemon to maintain the random pool
|
||||
[Partly done] The down side of this is that we can't assume that the
|
||||
random has has always been stored in "secure memory". And we rely
|
||||
on that sniffing of Unix domain sockets is not possible. We can
|
||||
implement this simply by detecting a special prefixed random seed
|
||||
name and divert in this case to the daemon. There are several
|
||||
benefits with such an approach: We keep the state of the RNG over
|
||||
invocations of libgcrypt based applications, don't need time
|
||||
consuming initialization of the pool and in case the entropy
|
||||
collectros need to run that bunch of Unix utilities we don't waste
|
||||
their precious results.
|
||||
|
||||
* gcryptrnd.c
|
||||
Requires a test for pth [done] as well as some other tests.
|
||||
|
||||
* secmem.c
|
||||
Check whether the memory block is valid before releasing it and
|
||||
print a diagnosic, like glibc does.
|
||||
|
||||
* threads
|
||||
** We need to document fork problems
|
||||
In particular that reinitialization is required in random.c
|
||||
However, there is no code yet to do it.
|
||||
|
||||
* Tests
|
||||
We need a lot more tests. Lets keep an ever growing list here.
|
||||
** Write tests for the progress function
|
||||
** mpitests does no real checks yet.
|
||||
** pthreads
|
||||
To catch simple errors like the one fixed on 2007-03-16.
|
||||
** C++ tests
|
||||
We have some code to allow using libgcrypt from C++, so we also
|
||||
should have a test case.
|
||||
@@ -0,0 +1 @@
|
||||
1.6.3
|
||||
@@ -0,0 +1,393 @@
|
||||
dnl macros to configure Libgcrypt
|
||||
dnl Copyright (C) 1998, 1999, 2000, 2001, 2002,
|
||||
dnl 2003 Free Software Foundation, Inc.
|
||||
dnl Copyright (C) 2013 g10 Code GmbH
|
||||
dnl
|
||||
dnl This file is part of Libgcrypt.
|
||||
dnl
|
||||
dnl Libgcrypt is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU Lesser General Public License as
|
||||
dnl published by the Free Software Foundation; either version 2.1 of
|
||||
dnl the License, or (at your option) any later version.
|
||||
dnl
|
||||
dnl Libgcrypt is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU Lesser General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU Lesser General Public
|
||||
dnl License along with this program; if not, write to the Free Software
|
||||
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
dnl GCRY_MSG_SHOW(PREFIX,STRING)
|
||||
dnl Print a message with a prefix.
|
||||
dnl
|
||||
define([GCRY_MSG_SHOW],
|
||||
[
|
||||
echo " $1 $2" 1>&AS_MESSAGE_FD([])
|
||||
])
|
||||
|
||||
dnl GCRY_MSG_WRAP(PREFIX, ALGOLIST)
|
||||
dnl Print a nicely formatted list of algorithms
|
||||
dnl with an approriate line wrap.
|
||||
dnl
|
||||
define([GCRY_MSG_WRAP],
|
||||
[
|
||||
tmp=" $1"
|
||||
tmpi="abc"
|
||||
if test "${#tmpi}" -ne 3 >/dev/null 2>&1 ; then
|
||||
dnl Without a POSIX shell, we don't botter to wrap it
|
||||
echo "$tmp $2" 1>&AS_MESSAGE_FD([])
|
||||
else
|
||||
tmpi=`echo "$tmp"| sed 's/./ /g'`
|
||||
echo $2 EOF | tr ' ' '\n' | \
|
||||
while read word; do
|
||||
if test "${#tmp}" -gt 70 ; then
|
||||
echo "$tmp" 1>&AS_MESSAGE_FD([])
|
||||
tmp="$tmpi"
|
||||
fi
|
||||
if test "$word" = "EOF" ; then
|
||||
echo "$tmp" 1>&AS_MESSAGE_FD([])
|
||||
else
|
||||
tmp="$tmp $word"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl GNUPG_CHECK_TYPEDEF(TYPE, HAVE_NAME)
|
||||
dnl Check whether a typedef exists and create a #define $2 if it exists
|
||||
dnl
|
||||
AC_DEFUN([GNUPG_CHECK_TYPEDEF],
|
||||
[ AC_MSG_CHECKING(for $1 typedef)
|
||||
AC_CACHE_VAL(gnupg_cv_typedef_$1,
|
||||
[AC_TRY_COMPILE([#define _GNU_SOURCE 1
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>], [
|
||||
#undef $1
|
||||
int a = sizeof($1);
|
||||
], gnupg_cv_typedef_$1=yes, gnupg_cv_typedef_$1=no )])
|
||||
AC_MSG_RESULT($gnupg_cv_typedef_$1)
|
||||
if test "$gnupg_cv_typedef_$1" = yes; then
|
||||
AC_DEFINE($2,1,[Defined if a `]$1[' is typedef'd])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl GNUPG_CHECK_GNUMAKE
|
||||
dnl
|
||||
AC_DEFUN([GNUPG_CHECK_GNUMAKE],
|
||||
[
|
||||
if ${MAKE-make} --version 2>/dev/null | grep '^GNU ' >/dev/null 2>&1; then
|
||||
:
|
||||
else
|
||||
AC_MSG_WARN([[
|
||||
***
|
||||
*** It seems that you are not using GNU make. Some make tools have serious
|
||||
*** flaws and you may not be able to build this software at all. Before you
|
||||
*** complain, please try GNU make: GNU make is easy to build and available
|
||||
*** at all GNU archives. It is always available from ftp.gnu.org:/gnu/make.
|
||||
***]])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
#
|
||||
# GNUPG_SYS_SYMBOL_UNDERSCORE
|
||||
# Does the compiler prefix global symbols with an underscore?
|
||||
#
|
||||
# Taken from GnuPG 1.2 and modified to use the libtool macros.
|
||||
AC_DEFUN([GNUPG_SYS_SYMBOL_UNDERSCORE],
|
||||
[tmp_do_check="no"
|
||||
case "${host}" in
|
||||
*-mingw32*)
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
;;
|
||||
i386-emx-os2 | i[3456]86-pc-os2*emx | i386-pc-msdosdjgpp)
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
;;
|
||||
*)
|
||||
if test "$cross_compiling" = yes; then
|
||||
if test "x$ac_cv_sys_symbol_underscore" = x ; then
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
fi
|
||||
else
|
||||
tmp_do_check="yes"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
if test "$tmp_do_check" = "yes"; then
|
||||
AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])
|
||||
AC_MSG_CHECKING([for _ prefix in compiled symbols])
|
||||
AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
|
||||
[ac_cv_sys_symbol_underscore=no
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
void nm_test_func(){}
|
||||
int main(){nm_test_func;return 0;}
|
||||
EOF
|
||||
if AC_TRY_EVAL(ac_compile); then
|
||||
# Now try to grab the symbols.
|
||||
ac_nlist=conftest.nm
|
||||
if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \| cut -d \' \' -f 2 \> $ac_nlist) && test -s "$ac_nlist"; then
|
||||
# See whether the symbols have a leading underscore.
|
||||
if egrep '^_nm_test_func' "$ac_nlist" >/dev/null; then
|
||||
ac_cv_sys_symbol_underscore=yes
|
||||
else
|
||||
if egrep '^nm_test_func ' "$ac_nlist" >/dev/null; then
|
||||
:
|
||||
else
|
||||
echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC
|
||||
fi
|
||||
else
|
||||
echo "configure: failed program was:" >&AC_FD_CC
|
||||
cat conftest.c >&AC_FD_CC
|
||||
fi
|
||||
rm -rf conftest*
|
||||
])
|
||||
else
|
||||
AC_MSG_CHECKING([for _ prefix in compiled symbols])
|
||||
fi
|
||||
AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
|
||||
if test x$ac_cv_sys_symbol_underscore = xyes; then
|
||||
AC_DEFINE(WITH_SYMBOL_UNDERSCORE,1,
|
||||
[Defined if compiled symbols have a leading underscore])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
######################################################################
|
||||
# Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
|
||||
# is not called from uid 0 (not tested whether uid 0 works)
|
||||
# For DECs Tru64 we have also to check whether mlock is in librt
|
||||
# mlock is there a macro using memlk()
|
||||
######################################################################
|
||||
dnl GNUPG_CHECK_MLOCK
|
||||
dnl
|
||||
define(GNUPG_CHECK_MLOCK,
|
||||
[ AC_CHECK_FUNCS(mlock)
|
||||
if test "$ac_cv_func_mlock" = "no"; then
|
||||
AC_CHECK_HEADERS(sys/mman.h)
|
||||
if test "$ac_cv_header_sys_mman_h" = "yes"; then
|
||||
# Add librt to LIBS:
|
||||
AC_CHECK_LIB(rt, memlk)
|
||||
AC_CACHE_CHECK([whether mlock is in sys/mman.h],
|
||||
gnupg_cv_mlock_is_in_sys_mman,
|
||||
[AC_TRY_LINK([
|
||||
#include <assert.h>
|
||||
#ifdef HAVE_SYS_MMAN_H
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
], [
|
||||
int i;
|
||||
|
||||
/* glibc defines this for functions which it implements
|
||||
* to always fail with ENOSYS. Some functions are actually
|
||||
* named something starting with __ and the normal name
|
||||
* is an alias. */
|
||||
#if defined (__stub_mlock) || defined (__stub___mlock)
|
||||
choke me
|
||||
#else
|
||||
mlock(&i, 4);
|
||||
#endif
|
||||
; return 0;
|
||||
],
|
||||
gnupg_cv_mlock_is_in_sys_mman=yes,
|
||||
gnupg_cv_mlock_is_in_sys_mman=no)])
|
||||
if test "$gnupg_cv_mlock_is_in_sys_mman" = "yes"; then
|
||||
AC_DEFINE(HAVE_MLOCK,1,
|
||||
[Defined if the system supports an mlock() call])
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if test "$ac_cv_func_mlock" = "yes"; then
|
||||
AC_CHECK_FUNCS(sysconf getpagesize)
|
||||
AC_MSG_CHECKING(whether mlock is broken)
|
||||
AC_CACHE_VAL(gnupg_cv_have_broken_mlock,
|
||||
AC_TRY_RUN([
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
char *pool;
|
||||
int err;
|
||||
long int pgsize;
|
||||
|
||||
#if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
|
||||
pgsize = sysconf (_SC_PAGESIZE);
|
||||
#elif defined (HAVE_GETPAGESIZE)
|
||||
pgsize = getpagesize();
|
||||
#else
|
||||
pgsize = -1;
|
||||
#endif
|
||||
|
||||
if (pgsize == -1)
|
||||
pgsize = 4096;
|
||||
|
||||
pool = malloc( 4096 + pgsize );
|
||||
if( !pool )
|
||||
return 2;
|
||||
pool += (pgsize - ((long int)pool % pgsize));
|
||||
|
||||
err = mlock( pool, 4096 );
|
||||
if( !err || errno == EPERM )
|
||||
return 0; /* okay */
|
||||
|
||||
return 1; /* hmmm */
|
||||
}
|
||||
|
||||
],
|
||||
gnupg_cv_have_broken_mlock="no",
|
||||
gnupg_cv_have_broken_mlock="yes",
|
||||
gnupg_cv_have_broken_mlock="assume-no"
|
||||
)
|
||||
)
|
||||
if test "$gnupg_cv_have_broken_mlock" = "yes"; then
|
||||
AC_DEFINE(HAVE_BROKEN_MLOCK,1,
|
||||
[Defined if the mlock() call does not work])
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
if test "$gnupg_cv_have_broken_mlock" = "no"; then
|
||||
AC_MSG_RESULT(no)
|
||||
else
|
||||
AC_MSG_RESULT(assuming no)
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
# GNUPG_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32
|
||||
AC_DEFUN([GNUPG_SYS_LIBTOOL_CYGWIN32],
|
||||
[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
||||
AC_CHECK_TOOL(AS, as, false)
|
||||
])
|
||||
|
||||
dnl LIST_MEMBER()
|
||||
dnl Check wether an element ist contained in a list. Set `found' to
|
||||
dnl `1' if the element is found in the list, to `0' otherwise.
|
||||
AC_DEFUN([LIST_MEMBER],
|
||||
[
|
||||
name=$1
|
||||
list=$2
|
||||
found=0
|
||||
|
||||
for n in $list; do
|
||||
if test "x$name" = "x$n"; then
|
||||
found=1
|
||||
fi
|
||||
done
|
||||
])
|
||||
|
||||
|
||||
dnl Check for socklen_t: historically on BSD it is an int, and in
|
||||
dnl POSIX 1g it is a type of its own, but some platforms use different
|
||||
dnl types for the argument to getsockopt, getpeername, etc. So we
|
||||
dnl have to test to find something that will work.
|
||||
AC_DEFUN([TYPE_SOCKLEN_T],
|
||||
[
|
||||
AC_CHECK_TYPE([socklen_t], ,[
|
||||
AC_MSG_CHECKING([for socklen_t equivalent])
|
||||
AC_CACHE_VAL([socklen_t_equiv],
|
||||
[
|
||||
# Systems have either "struct sockaddr *" or
|
||||
# "void *" as the second argument to getpeername
|
||||
socklen_t_equiv=
|
||||
for arg2 in "struct sockaddr" void; do
|
||||
for t in int size_t unsigned long "unsigned long"; do
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
int getpeername (int, $arg2 *, $t *);
|
||||
],[
|
||||
$t len;
|
||||
getpeername(0,0,&len);
|
||||
],[
|
||||
socklen_t_equiv="$t"
|
||||
break
|
||||
])
|
||||
done
|
||||
done
|
||||
|
||||
if test "x$socklen_t_equiv" = x; then
|
||||
AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
|
||||
fi
|
||||
])
|
||||
AC_MSG_RESULT($socklen_t_equiv)
|
||||
AC_DEFINE_UNQUOTED(socklen_t, $socklen_t_equiv,
|
||||
[type to use in place of socklen_t if not defined])],
|
||||
[#include <sys/types.h>
|
||||
#include <sys/socket.h>])
|
||||
])
|
||||
|
||||
|
||||
# GNUPG_PTH_VERSION_CHECK(REQUIRED)
|
||||
#
|
||||
# If the version is sufficient, HAVE_PTH will be set to yes.
|
||||
#
|
||||
# Taken form the m4 macros which come with Pth
|
||||
AC_DEFUN([GNUPG_PTH_VERSION_CHECK],
|
||||
[
|
||||
_pth_version=`$PTH_CONFIG --version | awk 'NR==1 {print [$]3}'`
|
||||
_req_version="ifelse([$1],,1.2.0,$1)"
|
||||
|
||||
AC_MSG_CHECKING(for PTH - version >= $_req_version)
|
||||
for _var in _pth_version _req_version; do
|
||||
eval "_val=\"\$${_var}\""
|
||||
_major=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\1/'`
|
||||
_minor=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\2/'`
|
||||
_rtype=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\3/'`
|
||||
_micro=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[ab.]]\)\([[0-9]]*\)/\4/'`
|
||||
case $_rtype in
|
||||
"a" ) _rtype=0 ;;
|
||||
"b" ) _rtype=1 ;;
|
||||
"." ) _rtype=2 ;;
|
||||
esac
|
||||
_hex=`echo dummy | awk '{ printf("%d%02d%1d%02d", major, minor, rtype, micro); }' \
|
||||
"major=$_major" "minor=$_minor" "rtype=$_rtype" "micro=$_micro"`
|
||||
eval "${_var}_hex=\"\$_hex\""
|
||||
done
|
||||
have_pth=no
|
||||
if test ".$_pth_version_hex" != .; then
|
||||
if test ".$_req_version_hex" != .; then
|
||||
if test $_pth_version_hex -ge $_req_version_hex; then
|
||||
have_pth=yes
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if test $have_pth = yes; then
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_MSG_CHECKING([whether PTH installation is sane])
|
||||
AC_CACHE_VAL(gnupg_cv_pth_is_sane,[
|
||||
_gnupg_pth_save_cflags=$CFLAGS
|
||||
_gnupg_pth_save_ldflags=$LDFLAGS
|
||||
_gnupg_pth_save_libs=$LIBS
|
||||
CFLAGS="$CFLAGS `$PTH_CONFIG --cflags`"
|
||||
LDFLAGS="$LDFLAGS `$PTH_CONFIG --ldflags`"
|
||||
LIBS="$LIBS `$PTH_CONFIG --libs`"
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pth.h>
|
||||
],
|
||||
[[ pth_init ();]])],
|
||||
gnupg_cv_pth_is_sane=yes,
|
||||
gnupg_cv_pth_is_sane=no)
|
||||
CFLAGS=$_gnupg_pth_save_cflags
|
||||
LDFLAGS=$_gnupg_pth_save_ldflags
|
||||
LIBS=$_gnupg_pth_save_libs
|
||||
])
|
||||
if test $gnupg_cv_pth_is_sane != yes; then
|
||||
have_pth=no
|
||||
fi
|
||||
AC_MSG_RESULT($gnupg_cv_pth_is_sane)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
])
|
||||
+1218
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,17 @@
|
||||
# autogen.sh configuration for Libgcrypt -*- sh -*-
|
||||
|
||||
case "$myhost" in
|
||||
w32)
|
||||
configure_opts="
|
||||
--with-gpg-error-prefix=@SYSROOT@
|
||||
"
|
||||
;;
|
||||
|
||||
amd64)
|
||||
configure_opts="
|
||||
--with-gpg-error-prefix=@SYSROOT@
|
||||
"
|
||||
;;
|
||||
esac
|
||||
|
||||
final_info="./configure --enable-maintainer-mode && make"
|
||||
+393
@@ -0,0 +1,393 @@
|
||||
#! /bin/sh
|
||||
# autogen.sh
|
||||
# Copyright (C) 2003, 2014 g10 Code GmbH
|
||||
#
|
||||
# This file is free software; as a special exception the author gives
|
||||
# unlimited permission to copy and/or distribute it, with or without
|
||||
# modifications, as long as this notice is preserved.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
#
|
||||
# This is a generic script to create the configure script and handle cross
|
||||
# build environments. It requires the presence of a autogen.rc file to
|
||||
# configure it for the respective package. It is maintained as part of
|
||||
# GnuPG and source copied by other packages.
|
||||
#
|
||||
# Version: 2014-01-10
|
||||
|
||||
configure_ac="configure.ac"
|
||||
|
||||
cvtver () {
|
||||
awk 'NR==1 {split($NF,A,".");X=1000000*A[1]+1000*A[2]+A[3];print X;exit 0}'
|
||||
}
|
||||
|
||||
check_version () {
|
||||
if [ $(( `("$1" --version || echo "0") | cvtver` >= $2 )) = 1 ]; then
|
||||
return 0
|
||||
fi
|
||||
echo "**Error**: "\`$1\'" not installed or too old." >&2
|
||||
echo ' Version '$3' or newer is required.' >&2
|
||||
[ -n "$4" ] && echo ' Note that this is part of '\`$4\''.' >&2
|
||||
DIE="yes"
|
||||
return 1
|
||||
}
|
||||
|
||||
fatal () {
|
||||
echo "autogen.sh:" "$*" >&2
|
||||
DIE=yes
|
||||
}
|
||||
|
||||
info () {
|
||||
if [ -z "${SILENT}" ]; then
|
||||
echo "autogen.sh:" "$*"
|
||||
fi
|
||||
}
|
||||
|
||||
die_p () {
|
||||
if [ "$DIE" = "yes" ]; then
|
||||
echo "autogen.sh: Stop." >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
replace_sysroot () {
|
||||
configure_opts=$(echo $configure_opts | sed "s#@SYSROOT@#${w32root}#g")
|
||||
extraoptions=$(echo $extraoptions | sed "s#@SYSROOT@#${w32root}#g")
|
||||
}
|
||||
|
||||
# Allow to override the default tool names
|
||||
AUTOCONF=${AUTOCONF_PREFIX}${AUTOCONF:-autoconf}${AUTOCONF_SUFFIX}
|
||||
AUTOHEADER=${AUTOCONF_PREFIX}${AUTOHEADER:-autoheader}${AUTOCONF_SUFFIX}
|
||||
|
||||
AUTOMAKE=${AUTOMAKE_PREFIX}${AUTOMAKE:-automake}${AUTOMAKE_SUFFIX}
|
||||
ACLOCAL=${AUTOMAKE_PREFIX}${ACLOCAL:-aclocal}${AUTOMAKE_SUFFIX}
|
||||
|
||||
GETTEXT=${GETTEXT_PREFIX}${GETTEXT:-gettext}${GETTEXT_SUFFIX}
|
||||
MSGMERGE=${GETTEXT_PREFIX}${MSGMERGE:-msgmerge}${GETTEXT_SUFFIX}
|
||||
|
||||
DIE=no
|
||||
FORCE=
|
||||
SILENT=
|
||||
tmp=$(dirname "$0")
|
||||
tsdir=$(cd "${tmp}"; pwd)
|
||||
|
||||
if [ -n "${AUTOGEN_SH_SILENT}" ]; then
|
||||
SILENT=" --silent"
|
||||
fi
|
||||
if test x"$1" = x"--help"; then
|
||||
echo "usage: ./autogen.sh [--silent] [--force] [--build-TYPE] [ARGS]"
|
||||
exit 0
|
||||
fi
|
||||
if test x"$1" = x"--silent"; then
|
||||
SILENT=" --silent"
|
||||
shift
|
||||
fi
|
||||
if test x"$1" = x"--force"; then
|
||||
FORCE=" --force"
|
||||
shift
|
||||
fi
|
||||
|
||||
|
||||
# Reject unsafe characters in $HOME, $tsdir and cwd. We consider spaces
|
||||
# as unsafe because it is too easy to get scripts wrong in this regard.
|
||||
am_lf='
|
||||
'
|
||||
case `pwd` in
|
||||
*[\;\\\"\#\$\&\'\`$am_lf\ \ ]*)
|
||||
fatal "unsafe working directory name" ;;
|
||||
esac
|
||||
case $tsdir in
|
||||
*[\;\\\"\#\$\&\'\`$am_lf\ \ ]*)
|
||||
fatal "unsafe source directory: \`$tsdir'" ;;
|
||||
esac
|
||||
case $HOME in
|
||||
*[\;\\\"\#\$\&\'\`$am_lf\ \ ]*)
|
||||
fatal "unsafe home directory: \`$HOME'" ;;
|
||||
esac
|
||||
die_p
|
||||
|
||||
|
||||
# List of variables sourced from autogen.rc. The strings '@SYSROOT@' in
|
||||
# these variables are replaced by the actual system root.
|
||||
configure_opts=
|
||||
extraoptions=
|
||||
# List of optional variables sourced from autogen.rc and ~/.gnupg-autogen.rc
|
||||
w32_toolprefixes=
|
||||
w32_extraoptions=
|
||||
w32ce_toolprefixes=
|
||||
w32ce_extraoptions=
|
||||
w64_toolprefixes=
|
||||
w64_extraoptions=
|
||||
amd64_toolprefixes=
|
||||
# End list of optional variables sourced from ~/.gnupg-autogen.rc
|
||||
# What follows are variables which are sourced but default to
|
||||
# environment variables or lacking them hardcoded values.
|
||||
#w32root=
|
||||
#w32ce_root=
|
||||
#w64root=
|
||||
#amd64root=
|
||||
|
||||
# Convenience option to use certain configure options for some hosts.
|
||||
myhost=""
|
||||
myhostsub=""
|
||||
case "$1" in
|
||||
--build-w32)
|
||||
myhost="w32"
|
||||
shift
|
||||
;;
|
||||
--build-w32ce)
|
||||
myhost="w32"
|
||||
myhostsub="ce"
|
||||
shift
|
||||
;;
|
||||
--build-w64)
|
||||
myhost="w32"
|
||||
myhostsub="64"
|
||||
shift
|
||||
;;
|
||||
--build-amd64)
|
||||
myhost="amd64"
|
||||
shift
|
||||
;;
|
||||
--build*)
|
||||
fatal "**Error**: invalid build option $1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
die_p
|
||||
|
||||
|
||||
# Source our configuration
|
||||
if [ -f "${tsdir}/autogen.rc" ]; then
|
||||
. "${tsdir}/autogen.rc"
|
||||
fi
|
||||
|
||||
# Source optional site specific configuration
|
||||
if [ -f "$HOME/.gnupg-autogen.rc" ]; then
|
||||
info "sourcing extra definitions from $HOME/.gnupg-autogen.rc"
|
||||
. "$HOME/.gnupg-autogen.rc"
|
||||
fi
|
||||
|
||||
# ******************
|
||||
# W32 build script
|
||||
# ******************
|
||||
if [ "$myhost" = "w32" ]; then
|
||||
if [ ! -f "$tsdir/build-aux/config.guess" ]; then
|
||||
fatal "$tsdir/build-aux/config.guess not found"
|
||||
exit 1
|
||||
fi
|
||||
build=`$tsdir/build-aux/config.guess`
|
||||
|
||||
case $myhostsub in
|
||||
ce)
|
||||
w32root="$w32ce_root"
|
||||
[ -z "$w32root" ] && w32root="$HOME/w32ce_root"
|
||||
toolprefixes="$w32ce_toolprefixes arm-mingw32ce"
|
||||
extraoptions="$extraoptions $w32ce_extraoptions"
|
||||
;;
|
||||
64)
|
||||
w32root="$w64root"
|
||||
[ -z "$w32root" ] && w32root="$HOME/w64root"
|
||||
toolprefixes="$w64_toolprefixes x86_64-w64-mingw32"
|
||||
extraoptions="$extraoptions $w64_extraoptions"
|
||||
;;
|
||||
*)
|
||||
[ -z "$w32root" ] && w32root="$HOME/w32root"
|
||||
toolprefixes="$w32_toolprefixes i686-w64-mingw32 i586-mingw32msvc"
|
||||
toolprefixes="$toolprefixes i386-mingw32msvc mingw32"
|
||||
extraoptions="$extraoptions $w32_extraoptions"
|
||||
;;
|
||||
esac
|
||||
info "Using $w32root as standard install directory"
|
||||
replace_sysroot
|
||||
|
||||
# Locate the cross compiler
|
||||
crossbindir=
|
||||
for host in $toolprefixes; do
|
||||
if ${host}-gcc --version >/dev/null 2>&1 ; then
|
||||
crossbindir=/usr/${host}/bin
|
||||
conf_CC="CC=${host}-gcc"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
if [ -z "$crossbindir" ]; then
|
||||
fatal "cross compiler kit not installed"
|
||||
if [ -z "$myhostsub" ]; then
|
||||
info "Under Debian GNU/Linux, you may install it using"
|
||||
info " apt-get install mingw32 mingw32-runtime mingw32-binutils"
|
||||
fi
|
||||
die_p
|
||||
fi
|
||||
|
||||
if [ -f "$tsdir/config.log" ]; then
|
||||
if ! head $tsdir/config.log | grep "$host" >/dev/null; then
|
||||
fatal "Please run a 'make distclean' first"
|
||||
die_p
|
||||
fi
|
||||
fi
|
||||
|
||||
$tsdir/configure --enable-maintainer-mode ${SILENT} \
|
||||
--prefix=${w32root} \
|
||||
--host=${host} --build=${build} \
|
||||
${configure_opts} ${extraoptions} "$@"
|
||||
rc=$?
|
||||
exit $rc
|
||||
fi
|
||||
# ***** end W32 build script *******
|
||||
|
||||
# ***** AMD64 cross build script *******
|
||||
# Used to cross-compile for AMD64 (for testing)
|
||||
if [ "$myhost" = "amd64" ]; then
|
||||
shift
|
||||
if [ ! -f $tsdir/build-aux/config.guess ]; then
|
||||
echo "$tsdir/build-aux/config.guess not found" >&2
|
||||
exit 1
|
||||
fi
|
||||
build=`$tsdir/build-aux/config.guess`
|
||||
|
||||
[ -z "$amd64root" ] && amd64root="$HOME/amd64root"
|
||||
info "Using $amd64root as standard install directory"
|
||||
replace_sysroot
|
||||
|
||||
toolprefixes="$amd64_toolprefixes x86_64-linux-gnu amd64-linux-gnu"
|
||||
|
||||
# Locate the cross compiler
|
||||
crossbindir=
|
||||
for host in $toolprefixes ; do
|
||||
if ${host}-gcc --version >/dev/null 2>&1 ; then
|
||||
crossbindir=/usr/${host}/bin
|
||||
conf_CC="CC=${host}-gcc"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
if [ -z "$crossbindir" ]; then
|
||||
echo "Cross compiler kit not installed" >&2
|
||||
echo "Stop." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f "$tsdir/config.log" ]; then
|
||||
if ! head $tsdir/config.log | grep "$host" >/dev/null; then
|
||||
echo "Please run a 'make distclean' first" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
$tsdir/configure --enable-maintainer-mode ${SILENT} \
|
||||
--prefix=${amd64root} \
|
||||
--host=${host} --build=${build} \
|
||||
${configure_opts} ${extraoptions} "$@"
|
||||
rc=$?
|
||||
exit $rc
|
||||
fi
|
||||
# ***** end AMD64 cross build script *******
|
||||
|
||||
|
||||
# Grep the required versions from configure.ac
|
||||
autoconf_vers=`sed -n '/^AC_PREREQ(/ {
|
||||
s/^.*(\(.*\))/\1/p
|
||||
q
|
||||
}' ${configure_ac}`
|
||||
autoconf_vers_num=`echo "$autoconf_vers" | cvtver`
|
||||
|
||||
automake_vers=`sed -n '/^min_automake_version=/ {
|
||||
s/^.*="\(.*\)"/\1/p
|
||||
q
|
||||
}' ${configure_ac}`
|
||||
automake_vers_num=`echo "$automake_vers" | cvtver`
|
||||
|
||||
if [ -d "${tsdir}/po" ]; then
|
||||
gettext_vers=`sed -n '/^AM_GNU_GETTEXT_VERSION(/ {
|
||||
s/^.*\[\(.*\)])/\1/p
|
||||
q
|
||||
}' ${configure_ac}`
|
||||
gettext_vers_num=`echo "$gettext_vers" | cvtver`
|
||||
else
|
||||
gettext_vers="n/a"
|
||||
fi
|
||||
|
||||
if [ -z "$autoconf_vers" -o -z "$automake_vers" -o -z "$gettext_vers" ]
|
||||
then
|
||||
echo "**Error**: version information not found in "\`${configure_ac}\'"." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
if check_version $AUTOCONF $autoconf_vers_num $autoconf_vers ; then
|
||||
check_version $AUTOHEADER $autoconf_vers_num $autoconf_vers autoconf
|
||||
fi
|
||||
if check_version $AUTOMAKE $automake_vers_num $automake_vers; then
|
||||
check_version $ACLOCAL $automake_vers_num $autoconf_vers automake
|
||||
fi
|
||||
if [ "$gettext_vers" != "n/a" ]; then
|
||||
if check_version $GETTEXT $gettext_vers_num $gettext_vers; then
|
||||
check_version $MSGMERGE $gettext_vers_num $gettext_vers gettext
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$DIE" = "yes" ]; then
|
||||
cat <<EOF
|
||||
|
||||
Note that you may use alternative versions of the tools by setting
|
||||
the corresponding environment variables; see README.GIT for details.
|
||||
|
||||
EOF
|
||||
die_p
|
||||
fi
|
||||
|
||||
# Check the git setup.
|
||||
if [ -d .git ]; then
|
||||
CP="cp -a"
|
||||
[ -z "${SILENT}" ] && CP="$CP -v"
|
||||
if [ -f .git/hooks/pre-commit.sample -a ! -f .git/hooks/pre-commit ] ; then
|
||||
[ -z "${SILENT}" ] && cat <<EOF
|
||||
*** Activating trailing whitespace git pre-commit hook. ***
|
||||
For more information see this thread:
|
||||
http://mail.gnome.org/archives/desktop-devel-list/2009-May/msg00084html
|
||||
To deactivate this pre-commit hook again move .git/hooks/pre-commit
|
||||
and .git/hooks/pre-commit.sample out of the way.
|
||||
EOF
|
||||
$CP .git/hooks/pre-commit.sample .git/hooks/pre-commit
|
||||
chmod +x .git/hooks/pre-commit
|
||||
fi
|
||||
|
||||
if [ "$gettext_vers" != "n/a" ]; then
|
||||
tmp=$(git config --get filter.cleanpo.clean)
|
||||
if [ "$tmp" != \
|
||||
"awk '/^\"POT-Creation-Date:/&&!s{s=1;next};!/^#: /{print}'" ]
|
||||
then
|
||||
info "*** Adding GIT filter.cleanpo.clean configuration."
|
||||
git config --add filter.cleanpo.clean \
|
||||
"awk '/^\"POT-Creation-Date:/&&!s{s=1;next};!/^#: /{print}'"
|
||||
fi
|
||||
fi
|
||||
if [ -f build-aux/git-hooks/commit-msg -a ! -f .git/hooks/commit-msg ] ; then
|
||||
[ -z "${SILENT}" ] && cat <<EOF
|
||||
*** Activating commit log message check hook. ***
|
||||
EOF
|
||||
$CP build-aux/git-hooks/commit-msg .git/hooks/commit-msg
|
||||
chmod +x .git/hooks/commit-msg
|
||||
fi
|
||||
fi
|
||||
|
||||
aclocal_flags="-I m4"
|
||||
if [ -n "${extra_aclocal_flags}" ]; then
|
||||
aclocal_flags="${aclocal_flags} ${extra_aclocal_flags}"
|
||||
fi
|
||||
if [ -n "${ACLOCAL_FLAGS}" ]; then
|
||||
aclocal_flags="${aclocal_flags} ${ACLOCAL_FLAGS}"
|
||||
fi
|
||||
info "Running $ACLOCAL ${aclocal_flags} ..."
|
||||
$ACLOCAL ${aclocal_flags}
|
||||
info "Running autoheader..."
|
||||
$AUTOHEADER
|
||||
info "Running automake --gnu ..."
|
||||
$AUTOMAKE --gnu;
|
||||
info "Running autoconf${FORCE} ..."
|
||||
$AUTOCONF${FORCE}
|
||||
|
||||
info "You may now run:${am_lf} ${final_info}"
|
||||
@@ -0,0 +1,169 @@
|
||||
2011-12-01 Werner Koch <wk@g10code.com>
|
||||
|
||||
NB: ChangeLog files are no longer manually maintained. Starting
|
||||
on December 1st, 2011 we put change information only in the GIT
|
||||
commit log, and generate a top-level ChangeLog file from logs at
|
||||
"make dist". See doc/HACKING for details.
|
||||
|
||||
2003-12-08 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* autogen.sh, config.sub, install-sh, mkinstalldirs, config.guess,
|
||||
* missing: Removed
|
||||
|
||||
2003-10-31 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* autogen.sh: Allow to override the tool name. Do not run
|
||||
libtoolize. Update required version numbers.
|
||||
|
||||
2003-07-30 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* config.guess, config.sub: Updated from ftp.gnu.org/gnu/config/
|
||||
|
||||
2003-07-07 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* autogen.sh: Undo last change.
|
||||
* autogen.sh: Remove -a argument for automake.
|
||||
|
||||
2003-03-06 Moritz Schulte <mo@g10code.com>
|
||||
|
||||
* autogen.sh (run): New function.
|
||||
Let automake run with -a for adding missing files automatically
|
||||
|
||||
2002-11-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* config.sub, config.guess: Updated from ftp.gnu.org/gnu/config
|
||||
to version 2002-11-08.
|
||||
|
||||
2002-05-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* autogen.sh: Require version 2.53 of autoconf
|
||||
|
||||
2001-12-18 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* distfiles: Remove files which are automatically added by automake.
|
||||
|
||||
2001-08-06 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* autogen.sh: Added --build-w32 option.
|
||||
|
||||
2001-05-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* db2html.in: Removed.
|
||||
* db2any: New. Taken from GPH
|
||||
|
||||
Mon Jul 17 16:35:47 CEST 2000 Werner Koch <wk@>
|
||||
|
||||
* config.gues, config.sub: Support for s390-ibm-linux-gnu; thanks
|
||||
to Holger Smolinski. Add support for QNX; by Sam Roberts.
|
||||
|
||||
Tue Oct 26 14:10:21 CEST 1999 Werner Koch <wk@gnupg.de>
|
||||
|
||||
* commit: Remove leading and trailing empty lines when copying
|
||||
Changes to Changelog
|
||||
|
||||
Wed Sep 15 16:22:17 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* gnupg.spec: Add Portuguese description
|
||||
|
||||
Thu Sep 2 16:40:55 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* mkdiff: changed format of diff file name and made script more
|
||||
general.
|
||||
|
||||
Wed Aug 4 10:34:18 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* config.guess: Updated from gnu/common and applied my emx patch again.
|
||||
* config.sub: Updated from gnu/common.
|
||||
|
||||
Wed Jul 14 19:42:08 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* ltmain.sh, ltconfig.sh : Updated to libtool 1.3.3
|
||||
|
||||
Mon Jul 12 14:55:34 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* autogen.sh: Run libtoolize
|
||||
|
||||
Sat May 22 22:47:26 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* autogen.sh: Fixed the error message for a missing libtool.
|
||||
|
||||
Sat May 8 19:28:08 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* mkinstalldirs, install-sh: New from GNU repository
|
||||
* config.sub, config.guess: Merged with rep version.
|
||||
|
||||
Sun Mar 14 19:34:36 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* autogen.sh: Add a check for libtool because some autoconf macros
|
||||
are needed.
|
||||
|
||||
Mon Feb 22 20:04:00 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* autogen.sh: Enhanced the version testing code (Philippe Laliberte)
|
||||
|
||||
* mkwebpage: Edits the buglist.
|
||||
|
||||
Sat Feb 13 12:04:43 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* autogen.sh: Now uses gettextize
|
||||
|
||||
Wed Feb 10 17:15:39 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* config.sub, config.guess: Support i386-emx-os2
|
||||
|
||||
Sun Jan 17 11:04:33 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* autogen.sh: Now checks for installed gettext
|
||||
|
||||
Sat Jan 16 09:27:30 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* config.guess (m68k-atari-mint): New.
|
||||
* config.sub: Add support for atarist-MiNT
|
||||
|
||||
Wed Jan 13 12:49:36 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* gnupg.spec.in: New
|
||||
* gnupg.spec: Removed
|
||||
|
||||
Wed Dec 23 13:18:14 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* gnupg.spec: Updated version by Fabio Coatti
|
||||
|
||||
Thu Dec 17 18:31:15 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* gnupg.spec: New version by Reuben Sumner and did some more
|
||||
changes.
|
||||
|
||||
Fri Nov 27 12:39:29 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
|
||||
* commit: New
|
||||
|
||||
|
||||
Fri Nov 20 12:01:57 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* mkdiff: signs the patch file
|
||||
|
||||
Sat Oct 17 16:10:16 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* autogen.sh: New.
|
||||
|
||||
Wed Oct 14 09:55:25 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* config.guess (FreeBSD): Changes from Jun Kuriyama to support ELF
|
||||
* config.sub: (freebsd): Add to maybe_os
|
||||
|
||||
|
||||
Copyright 1998,1999,2000,2001,2002 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; as a special exception the author gives
|
||||
unlimited permission to copy and/or distribute it, with or without
|
||||
modifications, as long as this notice is preserved.
|
||||
|
||||
This file is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
Local Variables:
|
||||
buffer-read-only: t
|
||||
End:
|
||||
+347
@@ -0,0 +1,347 @@
|
||||
#! /bin/sh
|
||||
# Wrapper for compilers which do not understand '-c -o'.
|
||||
|
||||
scriptversion=2012-10-14.11; # UTC
|
||||
|
||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# This file is maintained in Automake, please report
|
||||
# bugs to <bug-automake@gnu.org> or send patches to
|
||||
# <automake-patches@gnu.org>.
|
||||
|
||||
nl='
|
||||
'
|
||||
|
||||
# We need space, tab and new line, in precisely that order. Quoting is
|
||||
# there to prevent tools from complaining about whitespace usage.
|
||||
IFS=" "" $nl"
|
||||
|
||||
file_conv=
|
||||
|
||||
# func_file_conv build_file lazy
|
||||
# Convert a $build file to $host form and store it in $file
|
||||
# Currently only supports Windows hosts. If the determined conversion
|
||||
# type is listed in (the comma separated) LAZY, no conversion will
|
||||
# take place.
|
||||
func_file_conv ()
|
||||
{
|
||||
file=$1
|
||||
case $file in
|
||||
/ | /[!/]*) # absolute file, and not a UNC file
|
||||
if test -z "$file_conv"; then
|
||||
# lazily determine how to convert abs files
|
||||
case `uname -s` in
|
||||
MINGW*)
|
||||
file_conv=mingw
|
||||
;;
|
||||
CYGWIN*)
|
||||
file_conv=cygwin
|
||||
;;
|
||||
*)
|
||||
file_conv=wine
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
case $file_conv/,$2, in
|
||||
*,$file_conv,*)
|
||||
;;
|
||||
mingw/*)
|
||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||
;;
|
||||
cygwin/*)
|
||||
file=`cygpath -m "$file" || echo "$file"`
|
||||
;;
|
||||
wine/*)
|
||||
file=`winepath -w "$file" || echo "$file"`
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# func_cl_dashL linkdir
|
||||
# Make cl look for libraries in LINKDIR
|
||||
func_cl_dashL ()
|
||||
{
|
||||
func_file_conv "$1"
|
||||
if test -z "$lib_path"; then
|
||||
lib_path=$file
|
||||
else
|
||||
lib_path="$lib_path;$file"
|
||||
fi
|
||||
linker_opts="$linker_opts -LIBPATH:$file"
|
||||
}
|
||||
|
||||
# func_cl_dashl library
|
||||
# Do a library search-path lookup for cl
|
||||
func_cl_dashl ()
|
||||
{
|
||||
lib=$1
|
||||
found=no
|
||||
save_IFS=$IFS
|
||||
IFS=';'
|
||||
for dir in $lib_path $LIB
|
||||
do
|
||||
IFS=$save_IFS
|
||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.dll.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/$lib.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/lib$lib.a"; then
|
||||
found=yes
|
||||
lib=$dir/lib$lib.a
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS=$save_IFS
|
||||
|
||||
if test "$found" != yes; then
|
||||
lib=$lib.lib
|
||||
fi
|
||||
}
|
||||
|
||||
# func_cl_wrapper cl arg...
|
||||
# Adjust compile command to suit cl
|
||||
func_cl_wrapper ()
|
||||
{
|
||||
# Assume a capable shell
|
||||
lib_path=
|
||||
shared=:
|
||||
linker_opts=
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.[oO][bB][jJ])
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fo"$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fe"$file"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
-I)
|
||||
eat=1
|
||||
func_file_conv "$2" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-I*)
|
||||
func_file_conv "${1#-I}" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-l)
|
||||
eat=1
|
||||
func_cl_dashl "$2"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-l*)
|
||||
func_cl_dashl "${1#-l}"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-L)
|
||||
eat=1
|
||||
func_cl_dashL "$2"
|
||||
;;
|
||||
-L*)
|
||||
func_cl_dashL "${1#-L}"
|
||||
;;
|
||||
-static)
|
||||
shared=false
|
||||
;;
|
||||
-Wl,*)
|
||||
arg=${1#-Wl,}
|
||||
save_ifs="$IFS"; IFS=','
|
||||
for flag in $arg; do
|
||||
IFS="$save_ifs"
|
||||
linker_opts="$linker_opts $flag"
|
||||
done
|
||||
IFS="$save_ifs"
|
||||
;;
|
||||
-Xlinker)
|
||||
eat=1
|
||||
linker_opts="$linker_opts $2"
|
||||
;;
|
||||
-*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
||||
func_file_conv "$1"
|
||||
set x "$@" -Tp"$file"
|
||||
shift
|
||||
;;
|
||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
||||
func_file_conv "$1" mingw
|
||||
set x "$@" "$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
if test -n "$linker_opts"; then
|
||||
linker_opts="-link$linker_opts"
|
||||
fi
|
||||
exec "$@" $linker_opts
|
||||
exit 1
|
||||
}
|
||||
|
||||
eat=
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Wrapper for compilers which do not understand '-c -o'.
|
||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||
arguments, and rename the output as expected.
|
||||
|
||||
If you are trying to build a whole package this is not the
|
||||
right script to run: please start by reading the file 'INSTALL'.
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "compile $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
|
||||
func_cl_wrapper "$@" # Doesn't return...
|
||||
;;
|
||||
esac
|
||||
|
||||
ofile=
|
||||
cfile=
|
||||
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
# So we strip '-o arg' only if arg is an object.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.obj)
|
||||
ofile=$2
|
||||
;;
|
||||
*)
|
||||
set x "$@" -o "$2"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*.c)
|
||||
cfile=$1
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if test -z "$ofile" || test -z "$cfile"; then
|
||||
# If no '-o' option was seen then we might have been invoked from a
|
||||
# pattern rule where we don't need one. That is ok -- this is a
|
||||
# normal compilation that the losing compiler can handle. If no
|
||||
# '.c' file was seen then we are probably linking. That is also
|
||||
# ok.
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
# Name of file we expect compiler to create.
|
||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||
|
||||
# Create the lock directory.
|
||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||
# that we are using for the .o file. Also, base the name on the expected
|
||||
# object file name, since that is what matters with a parallel build.
|
||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||
while true; do
|
||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
# FIXME: race condition here if user kills between mkdir and trap.
|
||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||
|
||||
# Run the compile.
|
||||
"$@"
|
||||
ret=$?
|
||||
|
||||
if test -f "$cofile"; then
|
||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||
elif test -f "${cofile}bj"; then
|
||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||
fi
|
||||
|
||||
rmdir "$lockdir"
|
||||
exit $ret
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
+1421
File diff suppressed because it is too large
Load Diff
+690
@@ -0,0 +1,690 @@
|
||||
#! /bin/sh
|
||||
# Output a system dependent set of variables, describing how to set the
|
||||
# run time search path of shared libraries in an executable.
|
||||
#
|
||||
# Copyright 1996-2013 Free Software Foundation, Inc.
|
||||
# Taken from GNU libtool, 2001
|
||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||
#
|
||||
# This file is free software; the Free Software Foundation gives
|
||||
# unlimited permission to copy and/or distribute it, with or without
|
||||
# modifications, as long as this notice is preserved.
|
||||
#
|
||||
# The first argument passed to this file is the canonical host specification,
|
||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
|
||||
# or
|
||||
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
||||
# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
|
||||
# should be set by the caller.
|
||||
#
|
||||
# The set of defined variables is at the end of this script.
|
||||
|
||||
# Known limitations:
|
||||
# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
|
||||
# than 256 bytes, otherwise the compiler driver will dump core. The only
|
||||
# known workaround is to choose shorter directory names for the build
|
||||
# directory and/or the installation directory.
|
||||
|
||||
# All known linkers require a '.a' archive for static linking (except MSVC,
|
||||
# which needs '.lib').
|
||||
libext=a
|
||||
shrext=.so
|
||||
|
||||
host="$1"
|
||||
host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
|
||||
host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
|
||||
host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
||||
|
||||
# Code taken from libtool.m4's _LT_CC_BASENAME.
|
||||
|
||||
for cc_temp in $CC""; do
|
||||
case $cc_temp in
|
||||
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
|
||||
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
|
||||
\-*) ;;
|
||||
*) break;;
|
||||
esac
|
||||
done
|
||||
cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
|
||||
|
||||
# Code taken from libtool.m4's _LT_COMPILER_PIC.
|
||||
|
||||
wl=
|
||||
if test "$GCC" = yes; then
|
||||
wl='-Wl,'
|
||||
else
|
||||
case "$host_os" in
|
||||
aix*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
mingw* | cygwin* | pw32* | os2* | cegcc*)
|
||||
;;
|
||||
hpux9* | hpux10* | hpux11*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
irix5* | irix6* | nonstopux*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||
case $cc_basename in
|
||||
ecc*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
icc* | ifort*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
lf95*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
nagfor*)
|
||||
wl='-Wl,-Wl,,'
|
||||
;;
|
||||
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
ccc*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
xl* | bgxl* | bgf* | mpixl*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
como)
|
||||
wl='-lopt='
|
||||
;;
|
||||
*)
|
||||
case `$CC -V 2>&1 | sed 5q` in
|
||||
*Sun\ F* | *Sun*Fortran*)
|
||||
wl=
|
||||
;;
|
||||
*Sun\ C*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
newsos6)
|
||||
;;
|
||||
*nto* | *qnx*)
|
||||
;;
|
||||
osf3* | osf4* | osf5*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
rdos*)
|
||||
;;
|
||||
solaris*)
|
||||
case $cc_basename in
|
||||
f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
|
||||
wl='-Qoption ld '
|
||||
;;
|
||||
*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
sunos4*)
|
||||
wl='-Qoption ld '
|
||||
;;
|
||||
sysv4 | sysv4.2uw2* | sysv4.3*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
sysv4*MP*)
|
||||
;;
|
||||
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
unicos*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
uts4*)
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
|
||||
|
||||
hardcode_libdir_flag_spec=
|
||||
hardcode_libdir_separator=
|
||||
hardcode_direct=no
|
||||
hardcode_minus_L=no
|
||||
|
||||
case "$host_os" in
|
||||
cygwin* | mingw* | pw32* | cegcc*)
|
||||
# FIXME: the MSVC++ port hasn't been tested in a loooong time
|
||||
# When not using gcc, we currently assume that we are using
|
||||
# Microsoft Visual C++.
|
||||
if test "$GCC" != yes; then
|
||||
with_gnu_ld=no
|
||||
fi
|
||||
;;
|
||||
interix*)
|
||||
# we just hope/assume this is gcc and not c89 (= MSVC++)
|
||||
with_gnu_ld=yes
|
||||
;;
|
||||
openbsd*)
|
||||
with_gnu_ld=no
|
||||
;;
|
||||
esac
|
||||
|
||||
ld_shlibs=yes
|
||||
if test "$with_gnu_ld" = yes; then
|
||||
# Set some defaults for GNU ld with shared library support. These
|
||||
# are reset later if shared libraries are not supported. Putting them
|
||||
# here allows them to be overridden if necessary.
|
||||
# Unlike libtool, we use -rpath here, not --rpath, since the documented
|
||||
# option of GNU ld is called -rpath, not --rpath.
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
case "$host_os" in
|
||||
aix[3-9]*)
|
||||
# On AIX/PPC, the GNU linker is very broken
|
||||
if test "$host_cpu" != ia64; then
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
amigaos*)
|
||||
case "$host_cpu" in
|
||||
powerpc)
|
||||
;;
|
||||
m68k)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
beos*)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
cygwin* | mingw* | pw32* | cegcc*)
|
||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
||||
# no search path for DLLs.
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
haiku*)
|
||||
;;
|
||||
interix[3-9]*)
|
||||
hardcode_direct=no
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
netbsd*)
|
||||
;;
|
||||
solaris*)
|
||||
if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
|
||||
ld_shlibs=no
|
||||
elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
|
||||
case `$LD -v 2>&1` in
|
||||
*\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
|
||||
ld_shlibs=no
|
||||
;;
|
||||
*)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
sunos4*)
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
*)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
if test "$ld_shlibs" = no; then
|
||||
hardcode_libdir_flag_spec=
|
||||
fi
|
||||
else
|
||||
case "$host_os" in
|
||||
aix3*)
|
||||
# Note: this linker hardcodes the directories in LIBPATH if there
|
||||
# are no directories specified by -L.
|
||||
hardcode_minus_L=yes
|
||||
if test "$GCC" = yes; then
|
||||
# Neither direct hardcoding nor static linking is supported with a
|
||||
# broken collect2.
|
||||
hardcode_direct=unsupported
|
||||
fi
|
||||
;;
|
||||
aix[4-9]*)
|
||||
if test "$host_cpu" = ia64; then
|
||||
# On IA64, the linker does run time linking by default, so we don't
|
||||
# have to do anything special.
|
||||
aix_use_runtimelinking=no
|
||||
else
|
||||
aix_use_runtimelinking=no
|
||||
# Test if we are trying to use run time linking or normal
|
||||
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
|
||||
# need to do runtime linking.
|
||||
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
|
||||
for ld_flag in $LDFLAGS; do
|
||||
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
|
||||
aix_use_runtimelinking=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
hardcode_direct=yes
|
||||
hardcode_libdir_separator=':'
|
||||
if test "$GCC" = yes; then
|
||||
case $host_os in aix4.[012]|aix4.[012].*)
|
||||
collect2name=`${CC} -print-prog-name=collect2`
|
||||
if test -f "$collect2name" && \
|
||||
strings "$collect2name" | grep resolve_lib_name >/dev/null
|
||||
then
|
||||
# We have reworked collect2
|
||||
:
|
||||
else
|
||||
# We have old collect2
|
||||
hardcode_direct=unsupported
|
||||
hardcode_minus_L=yes
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_libdir_separator=
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
# Begin _LT_AC_SYS_LIBPATH_AIX.
|
||||
echo 'int main () { return 0; }' > conftest.c
|
||||
${CC} ${LDFLAGS} conftest.c -o conftest
|
||||
aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
||||
}'`
|
||||
if test -z "$aix_libpath"; then
|
||||
aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
||||
}'`
|
||||
fi
|
||||
if test -z "$aix_libpath"; then
|
||||
aix_libpath="/usr/lib:/lib"
|
||||
fi
|
||||
rm -f conftest.c conftest
|
||||
# End _LT_AC_SYS_LIBPATH_AIX.
|
||||
if test "$aix_use_runtimelinking" = yes; then
|
||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
||||
else
|
||||
if test "$host_cpu" = ia64; then
|
||||
hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
|
||||
else
|
||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
amigaos*)
|
||||
case "$host_cpu" in
|
||||
powerpc)
|
||||
;;
|
||||
m68k)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
bsdi[45]*)
|
||||
;;
|
||||
cygwin* | mingw* | pw32* | cegcc*)
|
||||
# When not using gcc, we currently assume that we are using
|
||||
# Microsoft Visual C++.
|
||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
||||
# no search path for DLLs.
|
||||
hardcode_libdir_flag_spec=' '
|
||||
libext=lib
|
||||
;;
|
||||
darwin* | rhapsody*)
|
||||
hardcode_direct=no
|
||||
if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
|
||||
:
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
dgux*)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
;;
|
||||
freebsd2.2*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
freebsd2*)
|
||||
hardcode_direct=yes
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
freebsd* | dragonfly*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
hpux9*)
|
||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
hardcode_direct=yes
|
||||
# hardcode_minus_L: Not really in the search PATH,
|
||||
# but as the default location of the library.
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
hpux10*)
|
||||
if test "$with_gnu_ld" = no; then
|
||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
hardcode_direct=yes
|
||||
# hardcode_minus_L: Not really in the search PATH,
|
||||
# but as the default location of the library.
|
||||
hardcode_minus_L=yes
|
||||
fi
|
||||
;;
|
||||
hpux11*)
|
||||
if test "$with_gnu_ld" = no; then
|
||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
case $host_cpu in
|
||||
hppa*64*|ia64*)
|
||||
hardcode_direct=no
|
||||
;;
|
||||
*)
|
||||
hardcode_direct=yes
|
||||
# hardcode_minus_L: Not really in the search PATH,
|
||||
# but as the default location of the library.
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
irix5* | irix6* | nonstopux*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
;;
|
||||
netbsd*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
newsos6)
|
||||
hardcode_direct=yes
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
;;
|
||||
*nto* | *qnx*)
|
||||
;;
|
||||
openbsd*)
|
||||
if test -f /usr/libexec/ld.so; then
|
||||
hardcode_direct=yes
|
||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
else
|
||||
case "$host_os" in
|
||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
;;
|
||||
*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
else
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
os2*)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
osf3*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
hardcode_libdir_separator=:
|
||||
;;
|
||||
osf4* | osf5*)
|
||||
if test "$GCC" = yes; then
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
else
|
||||
# Both cc and cxx compiler support -rpath directly
|
||||
hardcode_libdir_flag_spec='-rpath $libdir'
|
||||
fi
|
||||
hardcode_libdir_separator=:
|
||||
;;
|
||||
solaris*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
;;
|
||||
sunos4*)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
hardcode_direct=yes
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
sysv4)
|
||||
case $host_vendor in
|
||||
sni)
|
||||
hardcode_direct=yes # is this really true???
|
||||
;;
|
||||
siemens)
|
||||
hardcode_direct=no
|
||||
;;
|
||||
motorola)
|
||||
hardcode_direct=no #Motorola manual says yes, but my tests say they lie
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
sysv4.3*)
|
||||
;;
|
||||
sysv4*MP*)
|
||||
if test -d /usr/nec; then
|
||||
ld_shlibs=yes
|
||||
fi
|
||||
;;
|
||||
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6*)
|
||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
|
||||
hardcode_libdir_separator=':'
|
||||
;;
|
||||
uts4*)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
;;
|
||||
*)
|
||||
ld_shlibs=no
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Check dynamic linker characteristics
|
||||
# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
|
||||
# Unlike libtool.m4, here we don't care about _all_ names of the library, but
|
||||
# only about the one the linker finds when passed -lNAME. This is the last
|
||||
# element of library_names_spec in libtool.m4, or possibly two of them if the
|
||||
# linker has special search rules.
|
||||
library_names_spec= # the last element of library_names_spec in libtool.m4
|
||||
libname_spec='lib$name'
|
||||
case "$host_os" in
|
||||
aix3*)
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
aix[4-9]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
amigaos*)
|
||||
case "$host_cpu" in
|
||||
powerpc*)
|
||||
library_names_spec='$libname$shrext' ;;
|
||||
m68k)
|
||||
library_names_spec='$libname.a' ;;
|
||||
esac
|
||||
;;
|
||||
beos*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
bsdi[45]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
cygwin* | mingw* | pw32* | cegcc*)
|
||||
shrext=.dll
|
||||
library_names_spec='$libname.dll.a $libname.lib'
|
||||
;;
|
||||
darwin* | rhapsody*)
|
||||
shrext=.dylib
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
dgux*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
freebsd* | dragonfly*)
|
||||
case "$host_os" in
|
||||
freebsd[123]*)
|
||||
library_names_spec='$libname$shrext$versuffix' ;;
|
||||
*)
|
||||
library_names_spec='$libname$shrext' ;;
|
||||
esac
|
||||
;;
|
||||
gnu*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
haiku*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
hpux9* | hpux10* | hpux11*)
|
||||
case $host_cpu in
|
||||
ia64*)
|
||||
shrext=.so
|
||||
;;
|
||||
hppa*64*)
|
||||
shrext=.sl
|
||||
;;
|
||||
*)
|
||||
shrext=.sl
|
||||
;;
|
||||
esac
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
interix[3-9]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
irix5* | irix6* | nonstopux*)
|
||||
library_names_spec='$libname$shrext'
|
||||
case "$host_os" in
|
||||
irix5* | nonstopux*)
|
||||
libsuff= shlibsuff=
|
||||
;;
|
||||
*)
|
||||
case $LD in
|
||||
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
|
||||
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
|
||||
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
|
||||
*) libsuff= shlibsuff= ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
linux*oldld* | linux*aout* | linux*coff*)
|
||||
;;
|
||||
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
knetbsd*-gnu)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
netbsd*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
newsos6)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
*nto* | *qnx*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
openbsd*)
|
||||
library_names_spec='$libname$shrext$versuffix'
|
||||
;;
|
||||
os2*)
|
||||
libname_spec='$name'
|
||||
shrext=.dll
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
osf3* | osf4* | osf5*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
rdos*)
|
||||
;;
|
||||
solaris*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sunos4*)
|
||||
library_names_spec='$libname$shrext$versuffix'
|
||||
;;
|
||||
sysv4 | sysv4.3*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sysv4*MP*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
tpf*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
uts4*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
esac
|
||||
|
||||
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
|
||||
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
|
||||
escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
|
||||
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
|
||||
|
||||
# How to pass a linker flag through the compiler.
|
||||
wl="$escaped_wl"
|
||||
|
||||
# Static library suffix (normally "a").
|
||||
libext="$libext"
|
||||
|
||||
# Shared library suffix (normally "so").
|
||||
shlibext="$shlibext"
|
||||
|
||||
# Format of library name prefix.
|
||||
libname_spec="$escaped_libname_spec"
|
||||
|
||||
# Library names that the linker finds when passed -lNAME.
|
||||
library_names_spec="$escaped_library_names_spec"
|
||||
|
||||
# Flag to hardcode \$libdir into a binary during linking.
|
||||
# This must work even if \$libdir does not exist.
|
||||
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
|
||||
|
||||
# Whether we need a single -rpath flag with a separated argument.
|
||||
hardcode_libdir_separator="$hardcode_libdir_separator"
|
||||
|
||||
# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
|
||||
# resulting binary.
|
||||
hardcode_direct="$hardcode_direct"
|
||||
|
||||
# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
|
||||
# resulting binary.
|
||||
hardcode_minus_L="$hardcode_minus_L"
|
||||
|
||||
EOF
|
||||
+1807
File diff suppressed because it is too large
Load Diff
+791
@@ -0,0 +1,791 @@
|
||||
#! /bin/sh
|
||||
# depcomp - compile a program generating dependencies as side-effects
|
||||
|
||||
scriptversion=2013-05-30.07; # UTC
|
||||
|
||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||
as side-effects.
|
||||
|
||||
Environment variables:
|
||||
depmode Dependency tracking mode.
|
||||
source Source file read by 'PROGRAMS ARGS'.
|
||||
object Object file output by 'PROGRAMS ARGS'.
|
||||
DEPDIR directory where to store dependencies.
|
||||
depfile Dependency file to output.
|
||||
tmpdepfile Temporary file to use when outputting dependencies.
|
||||
libtool Whether libtool is used (yes/no).
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "depcomp $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
esac
|
||||
|
||||
# Get the directory component of the given path, and save it in the
|
||||
# global variables '$dir'. Note that this directory component will
|
||||
# be either empty or ending with a '/' character. This is deliberate.
|
||||
set_dir_from ()
|
||||
{
|
||||
case $1 in
|
||||
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
||||
*) dir=;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Get the suffix-stripped basename of the given path, and save it the
|
||||
# global variable '$base'.
|
||||
set_base_from ()
|
||||
{
|
||||
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
||||
}
|
||||
|
||||
# If no dependency file was actually created by the compiler invocation,
|
||||
# we still have to create a dummy depfile, to avoid errors with the
|
||||
# Makefile "include basename.Plo" scheme.
|
||||
make_dummy_depfile ()
|
||||
{
|
||||
echo "#dummy" > "$depfile"
|
||||
}
|
||||
|
||||
# Factor out some common post-processing of the generated depfile.
|
||||
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
||||
aix_post_process_depfile ()
|
||||
{
|
||||
# If the compiler actually managed to produce a dependency file,
|
||||
# post-process it.
|
||||
if test -f "$tmpdepfile"; then
|
||||
# Each line is of the form 'foo.o: dependency.h'.
|
||||
# Do two passes, one to just change these to
|
||||
# $object: dependency.h
|
||||
# and one to simply output
|
||||
# dependency.h:
|
||||
# which is needed to avoid the deleted-header problem.
|
||||
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
||||
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
||||
} > "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
}
|
||||
|
||||
# A tabulation character.
|
||||
tab=' '
|
||||
# A newline character.
|
||||
nl='
|
||||
'
|
||||
# Character ranges might be problematic outside the C locale.
|
||||
# These definitions help.
|
||||
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
lower=abcdefghijklmnopqrstuvwxyz
|
||||
digits=0123456789
|
||||
alpha=${upper}${lower}
|
||||
|
||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||
depfile=${depfile-`echo "$object" |
|
||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||
|
||||
rm -f "$tmpdepfile"
|
||||
|
||||
# Avoid interferences from the environment.
|
||||
gccflag= dashmflag=
|
||||
|
||||
# Some modes work just like other modes, but use different flags. We
|
||||
# parameterize here, but still list the modes in the big case below,
|
||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||
# here, because this file can only contain one case statement.
|
||||
if test "$depmode" = hp; then
|
||||
# HP compiler uses -M and no extra arg.
|
||||
gccflag=-M
|
||||
depmode=gcc
|
||||
fi
|
||||
|
||||
if test "$depmode" = dashXmstdout; then
|
||||
# This is just like dashmstdout with a different argument.
|
||||
dashmflag=-xM
|
||||
depmode=dashmstdout
|
||||
fi
|
||||
|
||||
cygpath_u="cygpath -u -f -"
|
||||
if test "$depmode" = msvcmsys; then
|
||||
# This is just like msvisualcpp but w/o cygpath translation.
|
||||
# Just convert the backslash-escaped backslashes to single forward
|
||||
# slashes to satisfy depend.m4
|
||||
cygpath_u='sed s,\\\\,/,g'
|
||||
depmode=msvisualcpp
|
||||
fi
|
||||
|
||||
if test "$depmode" = msvc7msys; then
|
||||
# This is just like msvc7 but w/o cygpath translation.
|
||||
# Just convert the backslash-escaped backslashes to single forward
|
||||
# slashes to satisfy depend.m4
|
||||
cygpath_u='sed s,\\\\,/,g'
|
||||
depmode=msvc7
|
||||
fi
|
||||
|
||||
if test "$depmode" = xlc; then
|
||||
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
||||
gccflag=-qmakedep=gcc,-MF
|
||||
depmode=gcc
|
||||
fi
|
||||
|
||||
case "$depmode" in
|
||||
gcc3)
|
||||
## gcc 3 implements dependency tracking that does exactly what
|
||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||
## the command line argument order; so add the flags where they
|
||||
## appear in depend2.am. Note that the slowdown incurred here
|
||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||
*) set fnord "$@" "$arg" ;;
|
||||
esac
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
done
|
||||
"$@"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
mv "$tmpdepfile" "$depfile"
|
||||
;;
|
||||
|
||||
gcc)
|
||||
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
||||
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
||||
## (see the conditional assignment to $gccflag above).
|
||||
## There are various ways to get dependency output from gcc. Here's
|
||||
## why we pick this rather obscure method:
|
||||
## - Don't want to use -MD because we'd like the dependencies to end
|
||||
## up in a subdir. Having to rename by hand is ugly.
|
||||
## (We might end up doing this anyway to support other compilers.)
|
||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||
## -MM, not -M (despite what the docs say). Also, it might not be
|
||||
## supported by the other compilers which use the 'gcc' depmode.
|
||||
## - Using -M directly means running the compiler twice (even worse
|
||||
## than renaming).
|
||||
if test -z "$gccflag"; then
|
||||
gccflag=-MD,
|
||||
fi
|
||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
# The second -e expression handles DOS-style file names with drive
|
||||
# letters.
|
||||
sed -e 's/^[^:]*: / /' \
|
||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||
## This next piece of magic avoids the "deleted header file" problem.
|
||||
## The problem is that when a header file which appears in a .P file
|
||||
## is deleted, the dependency causes make to die (because there is
|
||||
## typically no way to rebuild the header). We avoid this by adding
|
||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||
## this for us directly.
|
||||
## Some versions of gcc put a space before the ':'. On the theory
|
||||
## that the space means something, we add a space to the output as
|
||||
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||
## to the object. Take care to not repeat it in the output.
|
||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
hp)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
sgi)
|
||||
if test "$libtool" = yes; then
|
||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||
else
|
||||
"$@" -MDupdate "$tmpdepfile"
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
|
||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||
echo "$object : \\" > "$depfile"
|
||||
# Clip off the initial element (the dependent). Don't try to be
|
||||
# clever and replace this with sed code, as IRIX sed won't handle
|
||||
# lines with more than a fixed number of characters (4096 in
|
||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||
# the IRIX cc adds comments like '#:fec' to the end of the
|
||||
# dependency line.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
||||
| tr "$nl" ' ' >> "$depfile"
|
||||
echo >> "$depfile"
|
||||
# The second pass generates a dummy entry for each header file.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||
>> "$depfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
xlc)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
aix)
|
||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||
# in a .u file. In older versions, this file always lives in the
|
||||
# current directory. Also, the AIX compiler puts '$object:' at the
|
||||
# start of each line; $object doesn't have directory information.
|
||||
# Version 6 uses the directory in both cases.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$base.u
|
||||
tmpdepfile3=$dir.libs/$base.u
|
||||
"$@" -Wc,-M
|
||||
else
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$dir$base.u
|
||||
tmpdepfile3=$dir$base.u
|
||||
"$@" -M
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
tcc)
|
||||
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
||||
# FIXME: That version still under development at the moment of writing.
|
||||
# Make that this statement remains true also for stable, released
|
||||
# versions.
|
||||
# It will wrap lines (doesn't matter whether long or short) with a
|
||||
# trailing '\', as in:
|
||||
#
|
||||
# foo.o : \
|
||||
# foo.c \
|
||||
# foo.h \
|
||||
#
|
||||
# It will put a trailing '\' even on the last line, and will use leading
|
||||
# spaces rather than leading tabs (at least since its commit 0394caf7
|
||||
# "Emit spaces for -MD").
|
||||
"$@" -MD -MF "$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
||||
# We have to change lines of the first kind to '$object: \'.
|
||||
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
||||
# And for each line of the second kind, we have to emit a 'dep.h:'
|
||||
# dummy dependency, to avoid the deleted-header problem.
|
||||
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
## The order of this option in the case statement is important, since the
|
||||
## shell code in configure will try each of these formats in the order
|
||||
## listed in this file. A plain '-MD' option would be understood by many
|
||||
## compilers, so we must ensure this comes after the gcc and icc options.
|
||||
pgcc)
|
||||
# Portland's C compiler understands '-MD'.
|
||||
# Will always output deps to 'file.d' where file is the root name of the
|
||||
# source file under compilation, even if file resides in a subdirectory.
|
||||
# The object file name does not affect the name of the '.d' file.
|
||||
# pgcc 10.2 will output
|
||||
# foo.o: sub/foo.c sub/foo.h
|
||||
# and will wrap long lines using '\' :
|
||||
# foo.o: sub/foo.c ... \
|
||||
# sub/foo.h ... \
|
||||
# ...
|
||||
set_dir_from "$object"
|
||||
# Use the source, not the object, to determine the base name, since
|
||||
# that's sadly what pgcc will do too.
|
||||
set_base_from "$source"
|
||||
tmpdepfile=$base.d
|
||||
|
||||
# For projects that build the same source file twice into different object
|
||||
# files, the pgcc approach of using the *source* file root name can cause
|
||||
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
||||
# the same $tmpdepfile.
|
||||
lockdir=$base.d-lock
|
||||
trap "
|
||||
echo '$0: caught signal, cleaning up...' >&2
|
||||
rmdir '$lockdir'
|
||||
exit 1
|
||||
" 1 2 13 15
|
||||
numtries=100
|
||||
i=$numtries
|
||||
while test $i -gt 0; do
|
||||
# mkdir is a portable test-and-set.
|
||||
if mkdir "$lockdir" 2>/dev/null; then
|
||||
# This process acquired the lock.
|
||||
"$@" -MD
|
||||
stat=$?
|
||||
# Release the lock.
|
||||
rmdir "$lockdir"
|
||||
break
|
||||
else
|
||||
# If the lock is being held by a different process, wait
|
||||
# until the winning process is done or we timeout.
|
||||
while test -d "$lockdir" && test $i -gt 0; do
|
||||
sleep 1
|
||||
i=`expr $i - 1`
|
||||
done
|
||||
fi
|
||||
i=`expr $i - 1`
|
||||
done
|
||||
trap - 1 2 13 15
|
||||
if test $i -le 0; then
|
||||
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
||||
echo "$0: check lockdir '$lockdir'" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
# Each line is of the form `foo.o: dependent.h',
|
||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||
# Do two passes, one to just change these to
|
||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
hp2)
|
||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||
# compilers, which have integrated preprocessors. The correct option
|
||||
# to use with these is +Maked; it writes dependencies to a file named
|
||||
# 'foo.d', which lands next to the object file, wherever that
|
||||
# happens to be.
|
||||
# Much of this is similar to the tru64 case; see comments there.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir.libs/$base.d
|
||||
"$@" -Wc,+Maked
|
||||
else
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
"$@" +Maked
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
if test -f "$tmpdepfile"; then
|
||||
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||
# Add 'dependent.h:' lines.
|
||||
sed -ne '2,${
|
||||
s/^ *//
|
||||
s/ \\*$//
|
||||
s/$/:/
|
||||
p
|
||||
}' "$tmpdepfile" >> "$depfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||
;;
|
||||
|
||||
tru64)
|
||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||
# dependencies in 'foo.d' instead, so we check for that too.
|
||||
# Subdirectories are respected.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
|
||||
if test "$libtool" = yes; then
|
||||
# Libtool generates 2 separate objects for the 2 libraries. These
|
||||
# two compilations output dependencies in $dir.libs/$base.o.d and
|
||||
# in $dir$base.o.d. We have to check for both files, because
|
||||
# one of the two compilations can be disabled. We should prefer
|
||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||
# the former would cause a distcleancheck panic.
|
||||
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
||||
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
||||
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||
"$@" -Wc,-MD
|
||||
else
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
tmpdepfile3=$dir$base.d
|
||||
"$@" -MD
|
||||
fi
|
||||
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
# Same post-processing that is required for AIX mode.
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
msvc7)
|
||||
if test "$libtool" = yes; then
|
||||
showIncludes=-Wc,-showIncludes
|
||||
else
|
||||
showIncludes=-showIncludes
|
||||
fi
|
||||
"$@" $showIncludes > "$tmpdepfile"
|
||||
stat=$?
|
||||
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
# The first sed program below extracts the file names and escapes
|
||||
# backslashes for cygpath. The second sed program outputs the file
|
||||
# name when reading, but also accumulates all include files in the
|
||||
# hold buffer in order to output them again at the end. This only
|
||||
# works with sed implementations that can handle large buffers.
|
||||
sed < "$tmpdepfile" -n '
|
||||
/^Note: including file: *\(.*\)/ {
|
||||
s//\1/
|
||||
s/\\/\\\\/g
|
||||
p
|
||||
}' | $cygpath_u | sort -u | sed -n '
|
||||
s/ /\\ /g
|
||||
s/\(.*\)/'"$tab"'\1 \\/p
|
||||
s/.\(.*\) \\/\1:/
|
||||
H
|
||||
$ {
|
||||
s/.*/'"$tab"'/
|
||||
G
|
||||
p
|
||||
}' >> "$depfile"
|
||||
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvc7msys)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
#nosideeffect)
|
||||
# This comment above is used by automake to tell side-effect
|
||||
# dependency tracking mechanisms from slower ones.
|
||||
|
||||
dashmstdout)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout, regardless of -o.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
test -z "$dashmflag" && dashmflag=-M
|
||||
# Require at least two characters before searching for ':'
|
||||
# in the target name. This is to cope with DOS-style filenames:
|
||||
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
||||
"$@" $dashmflag |
|
||||
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
cat < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
dashXmstdout)
|
||||
# This case only exists to satisfy depend.m4. It is never actually
|
||||
# run, as this mode is specially recognized in the preamble.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
makedepend)
|
||||
"$@" || exit $?
|
||||
# Remove any Libtool call
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
# X makedepend
|
||||
shift
|
||||
cleared=no eat=no
|
||||
for arg
|
||||
do
|
||||
case $cleared in
|
||||
no)
|
||||
set ""; shift
|
||||
cleared=yes ;;
|
||||
esac
|
||||
if test $eat = yes; then
|
||||
eat=no
|
||||
continue
|
||||
fi
|
||||
case "$arg" in
|
||||
-D*|-I*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
# Strip any option that makedepend may not understand. Remove
|
||||
# the object too, otherwise makedepend will parse it as a source file.
|
||||
-arch)
|
||||
eat=yes ;;
|
||||
-*|$object)
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
esac
|
||||
done
|
||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
||||
touch "$tmpdepfile"
|
||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||
rm -f "$depfile"
|
||||
# makedepend may prepend the VPATH from the source file name to the object.
|
||||
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed '1,2d' "$tmpdepfile" \
|
||||
| tr ' ' "$nl" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||
;;
|
||||
|
||||
cpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
"$@" -E \
|
||||
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
| sed '$ s: \\$::' > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
cat < "$tmpdepfile" >> "$depfile"
|
||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvisualcpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case "$arg" in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||
set fnord "$@"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
"$@" -E 2>/dev/null |
|
||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||
echo "$tab" >> "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvcmsys)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
none)
|
||||
exec "$@"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown depmode $depmode" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
@@ -0,0 +1,14 @@
|
||||
# This file is expected to be used via gitlog-to-changelog's --amend=FILE
|
||||
# option. It specifies what changes to make to each given SHA1's commit
|
||||
# log and metadata, using Perl-eval'able expressions.
|
||||
|
||||
eb4937914db3fb7317502e97e4f0e40c1857f59d
|
||||
# Fix bad formatted entry dated 2013-05-20
|
||||
s/(?s)mpi_sub.*$/cipher: Fix segv in last ECC change.
|
||||
* cipher\/ecc.c (generate_key): Make sure R is initialized./
|
||||
|
||||
296f38a2bd2e25788643a42e4881faed00884a40
|
||||
# Fix bad formatted entry dated 2013-05-09
|
||||
s/(?s)Generate ECC.*$/cipher: Generate compliant ECC keys.
|
||||
* cipher\/ecc.c (generate_key): Make sure a key is compliant for
|
||||
using the compact representation./
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
2011-12-01 Werner Koch <wk@gnupg.org>
|
||||
|
||||
NB: Changes done before December 1st, 2011 are described in
|
||||
per directory files named ChangeLog-2011. See doc/HACKING for
|
||||
details.
|
||||
|
||||
-----
|
||||
Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file and/or the original GIT
|
||||
commit log messages, with or without modification, are
|
||||
permitted provided the copyright notice and this notice are
|
||||
preserved.
|
||||
+527
@@ -0,0 +1,527 @@
|
||||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2011-11-20.07; # UTC
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
# following copyright and license.
|
||||
#
|
||||
# Copyright (C) 1994 X Consortium
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to
|
||||
# deal in the Software without restriction, including without limitation the
|
||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
# sell copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name of the X Consortium shall not
|
||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||
# ings in this Software without prior written authorization from the X Consor-
|
||||
# tium.
|
||||
#
|
||||
#
|
||||
# FSF changes to this file are in the public domain.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# 'make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch.
|
||||
|
||||
nl='
|
||||
'
|
||||
IFS=" "" $nl"
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit=${DOITPROG-}
|
||||
if test -z "$doit"; then
|
||||
doit_exec=exec
|
||||
else
|
||||
doit_exec=$doit
|
||||
fi
|
||||
|
||||
# Put in absolute file names if you don't have them in your path;
|
||||
# or use environment vars.
|
||||
|
||||
chgrpprog=${CHGRPPROG-chgrp}
|
||||
chmodprog=${CHMODPROG-chmod}
|
||||
chownprog=${CHOWNPROG-chown}
|
||||
cmpprog=${CMPPROG-cmp}
|
||||
cpprog=${CPPROG-cp}
|
||||
mkdirprog=${MKDIRPROG-mkdir}
|
||||
mvprog=${MVPROG-mv}
|
||||
rmprog=${RMPROG-rm}
|
||||
stripprog=${STRIPPROG-strip}
|
||||
|
||||
posix_glob='?'
|
||||
initialize_posix_glob='
|
||||
test "$posix_glob" != "?" || {
|
||||
if (set -f) 2>/dev/null; then
|
||||
posix_glob=
|
||||
else
|
||||
posix_glob=:
|
||||
fi
|
||||
}
|
||||
'
|
||||
|
||||
posix_mkdir=
|
||||
|
||||
# Desired mode of installed file.
|
||||
mode=0755
|
||||
|
||||
chgrpcmd=
|
||||
chmodcmd=$chmodprog
|
||||
chowncmd=
|
||||
mvcmd=$mvprog
|
||||
rmcmd="$rmprog -f"
|
||||
stripcmd=
|
||||
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dst_arg=
|
||||
|
||||
copy_on_change=false
|
||||
no_target_directory=
|
||||
|
||||
usage="\
|
||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE.
|
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
-c (ignored)
|
||||
-C install only if different (preserve the last data modification time)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-s $stripprog installed files.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||
RMPROG STRIPPROG
|
||||
"
|
||||
|
||||
while test $# -ne 0; do
|
||||
case $1 in
|
||||
-c) ;;
|
||||
|
||||
-C) copy_on_change=true;;
|
||||
|
||||
-d) dir_arg=true;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift;;
|
||||
|
||||
--help) echo "$usage"; exit $?;;
|
||||
|
||||
-m) mode=$2
|
||||
case $mode in
|
||||
*' '* | *' '* | *'
|
||||
'* | *'*'* | *'?'* | *'['*)
|
||||
echo "$0: invalid mode: $mode" >&2
|
||||
exit 1;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift;;
|
||||
|
||||
-s) stripcmd=$stripprog;;
|
||||
|
||||
-t) dst_arg=$2
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-T) no_target_directory=true;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;;
|
||||
|
||||
--) shift
|
||||
break;;
|
||||
|
||||
-*) echo "$0: invalid option: $1" >&2
|
||||
exit 1;;
|
||||
|
||||
*) break;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||
# When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||
for arg
|
||||
do
|
||||
if test -n "$dst_arg"; then
|
||||
# $@ is not empty: it contains at least $arg.
|
||||
set fnord "$@" "$dst_arg"
|
||||
shift # fnord
|
||||
fi
|
||||
shift # arg
|
||||
dst_arg=$arg
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
if test $# -eq 0; then
|
||||
if test -z "$dir_arg"; then
|
||||
echo "$0: no input file specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
# It's OK to call 'install-sh -d' without argument.
|
||||
# This can happen when creating conditional directories.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if test -z "$dir_arg"; then
|
||||
do_exit='(exit $ret); exit $ret'
|
||||
trap "ret=129; $do_exit" 1
|
||||
trap "ret=130; $do_exit" 2
|
||||
trap "ret=141; $do_exit" 13
|
||||
trap "ret=143; $do_exit" 15
|
||||
|
||||
# Set umask so as not to create temps with too-generous modes.
|
||||
# However, 'strip' requires both read and write access to temps.
|
||||
case $mode in
|
||||
# Optimize common cases.
|
||||
*644) cp_umask=133;;
|
||||
*755) cp_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw='% 200'
|
||||
fi
|
||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||
*)
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw=,u+rw
|
||||
fi
|
||||
cp_umask=$mode$u_plus_rw;;
|
||||
esac
|
||||
fi
|
||||
|
||||
for src
|
||||
do
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $src in
|
||||
-* | [=\(\)!]) src=./$src;;
|
||||
esac
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
dst=$src
|
||||
dstdir=$dst
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
if test ! -f "$src" && test ! -d "$src"; then
|
||||
echo "$0: $src does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$dst_arg"; then
|
||||
echo "$0: no destination specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
dst=$dst_arg
|
||||
|
||||
# If destination is a directory, append the input filename; won't work
|
||||
# if double slashes aren't ignored.
|
||||
if test -d "$dst"; then
|
||||
if test -n "$no_target_directory"; then
|
||||
echo "$0: $dst_arg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dstdir=$dst
|
||||
dst=$dstdir/`basename "$src"`
|
||||
dstdir_status=0
|
||||
else
|
||||
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||
dstdir=`
|
||||
(dirname "$dst") 2>/dev/null ||
|
||||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||
X"$dst" : 'X\(//\)[^/]' \| \
|
||||
X"$dst" : 'X\(//\)$' \| \
|
||||
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||
echo X"$dst" |
|
||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)[^/].*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\).*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
s/.*/./; q'
|
||||
`
|
||||
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
obsolete_mkdir_used=false
|
||||
|
||||
if test $dstdir_status != 0; then
|
||||
case $posix_mkdir in
|
||||
'')
|
||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||
umask=`umask`
|
||||
case $stripcmd.$umask in
|
||||
# Optimize common cases.
|
||||
*[2367][2367]) mkdir_umask=$umask;;
|
||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
mkdir_umask=`expr $umask + 22 \
|
||||
- $umask % 100 % 40 + $umask % 20 \
|
||||
- $umask % 10 % 4 + $umask % 2
|
||||
`;;
|
||||
*) mkdir_umask=$umask,go-w;;
|
||||
esac
|
||||
|
||||
# With -d, create the new directory with the user-specified mode.
|
||||
# Otherwise, rely on $mkdir_umask.
|
||||
if test -n "$dir_arg"; then
|
||||
mkdir_mode=-m$mode
|
||||
else
|
||||
mkdir_mode=
|
||||
fi
|
||||
|
||||
posix_mkdir=false
|
||||
case $umask in
|
||||
*[123567][0-7][0-7])
|
||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||
;;
|
||||
*)
|
||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||
|
||||
if (umask $mkdir_umask &&
|
||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||
then
|
||||
if test -z "$dir_arg" || {
|
||||
# Check for POSIX incompatibilities with -m.
|
||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||
# other-writable bit of parent directory when it shouldn't.
|
||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||
case $ls_ld_tmpdir in
|
||||
d????-?r-*) different_mode=700;;
|
||||
d????-?--*) different_mode=755;;
|
||||
*) false;;
|
||||
esac &&
|
||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||
}
|
||||
}
|
||||
then posix_mkdir=:
|
||||
fi
|
||||
rmdir "$tmpdir/d" "$tmpdir"
|
||||
else
|
||||
# Remove any dirs left behind by ancient mkdir implementations.
|
||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||
fi
|
||||
trap '' 0;;
|
||||
esac;;
|
||||
esac
|
||||
|
||||
if
|
||||
$posix_mkdir && (
|
||||
umask $mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||
)
|
||||
then :
|
||||
else
|
||||
|
||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||
# or it failed possibly due to a race condition. Create the
|
||||
# directory the slow way, step by step, checking for races as we go.
|
||||
|
||||
case $dstdir in
|
||||
/*) prefix='/';;
|
||||
[-=\(\)!]*) prefix='./';;
|
||||
*) prefix='';;
|
||||
esac
|
||||
|
||||
eval "$initialize_posix_glob"
|
||||
|
||||
oIFS=$IFS
|
||||
IFS=/
|
||||
$posix_glob set -f
|
||||
set fnord $dstdir
|
||||
shift
|
||||
$posix_glob set +f
|
||||
IFS=$oIFS
|
||||
|
||||
prefixes=
|
||||
|
||||
for d
|
||||
do
|
||||
test X"$d" = X && continue
|
||||
|
||||
prefix=$prefix$d
|
||||
if test -d "$prefix"; then
|
||||
prefixes=
|
||||
else
|
||||
if $posix_mkdir; then
|
||||
(umask=$mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||
# Don't fail if two instances are running concurrently.
|
||||
test -d "$prefix" || exit 1
|
||||
else
|
||||
case $prefix in
|
||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||
*) qprefix=$prefix;;
|
||||
esac
|
||||
prefixes="$prefixes '$qprefix'"
|
||||
fi
|
||||
fi
|
||||
prefix=$prefix/
|
||||
done
|
||||
|
||||
if test -n "$prefixes"; then
|
||||
# Don't fail if two instances are running concurrently.
|
||||
(umask $mkdir_umask &&
|
||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||
test -d "$dstdir" || exit 1
|
||||
obsolete_mkdir_used=true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||
else
|
||||
|
||||
# Make a couple of temp file names in the proper directory.
|
||||
dsttmp=$dstdir/_inst.$$_
|
||||
rmtmp=$dstdir/_rm.$$_
|
||||
|
||||
# Trap to clean up those temp files at exit.
|
||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||
|
||||
# Copy the file name to the temp name.
|
||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits.
|
||||
#
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||
#
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||
|
||||
# If -C, don't bother to copy if it wouldn't change the file.
|
||||
if $copy_on_change &&
|
||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||
|
||||
eval "$initialize_posix_glob" &&
|
||||
$posix_glob set -f &&
|
||||
set X $old && old=:$2:$4:$5:$6 &&
|
||||
set X $new && new=:$2:$4:$5:$6 &&
|
||||
$posix_glob set +f &&
|
||||
|
||||
test "$old" = "$new" &&
|
||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||
then
|
||||
rm -f "$dsttmp"
|
||||
else
|
||||
# Rename the file to the real destination.
|
||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||
|
||||
# The rename failed, perhaps because mv can't rename something else
|
||||
# to itself, or perhaps because mv is so ancient that it does not
|
||||
# support -f.
|
||||
{
|
||||
# Now remove or move aside any old file at destination location.
|
||||
# We try this two ways since rm can't unlink itself on some
|
||||
# systems and the destination file might be busy for other
|
||||
# reasons. In this case, the final cleanup might fail but the new
|
||||
# file should still install successfully.
|
||||
{
|
||||
test ! -f "$dst" ||
|
||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||
} ||
|
||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||
(exit 1); exit 1
|
||||
}
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dst"
|
||||
}
|
||||
fi || exit 1
|
||||
|
||||
trap '' 0
|
||||
fi
|
||||
done
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
File diff suppressed because it is too large
Load Diff
+224
@@ -0,0 +1,224 @@
|
||||
#!/bin/sh
|
||||
# Get modification time of a file or directory and pretty-print it.
|
||||
|
||||
scriptversion=2010-08-21.06; # UTC
|
||||
|
||||
# Copyright (C) 1995-2013 Free Software Foundation, Inc.
|
||||
# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# This file is maintained in Automake, please report
|
||||
# bugs to <bug-automake@gnu.org> or send patches to
|
||||
# <automake-patches@gnu.org>.
|
||||
|
||||
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
|
||||
emulate sh
|
||||
NULLCMD=:
|
||||
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
|
||||
# is contrary to our usage. Disable this feature.
|
||||
alias -g '${1+"$@"}'='"$@"'
|
||||
setopt NO_GLOB_SUBST
|
||||
fi
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No file. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: mdate-sh [--help] [--version] FILE
|
||||
|
||||
Pretty-print the modification day of FILE, in the format:
|
||||
1 January 1970
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "mdate-sh $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
esac
|
||||
|
||||
error ()
|
||||
{
|
||||
echo "$0: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
# Prevent date giving response in another language.
|
||||
LANG=C
|
||||
export LANG
|
||||
LC_ALL=C
|
||||
export LC_ALL
|
||||
LC_TIME=C
|
||||
export LC_TIME
|
||||
|
||||
# GNU ls changes its time format in response to the TIME_STYLE
|
||||
# variable. Since we cannot assume 'unset' works, revert this
|
||||
# variable to its documented default.
|
||||
if test "${TIME_STYLE+set}" = set; then
|
||||
TIME_STYLE=posix-long-iso
|
||||
export TIME_STYLE
|
||||
fi
|
||||
|
||||
save_arg1=$1
|
||||
|
||||
# Find out how to get the extended ls output of a file or directory.
|
||||
if ls -L /dev/null 1>/dev/null 2>&1; then
|
||||
ls_command='ls -L -l -d'
|
||||
else
|
||||
ls_command='ls -l -d'
|
||||
fi
|
||||
# Avoid user/group names that might have spaces, when possible.
|
||||
if ls -n /dev/null 1>/dev/null 2>&1; then
|
||||
ls_command="$ls_command -n"
|
||||
fi
|
||||
|
||||
# A 'ls -l' line looks as follows on OS/2.
|
||||
# drwxrwx--- 0 Aug 11 2001 foo
|
||||
# This differs from Unix, which adds ownership information.
|
||||
# drwxrwx--- 2 root root 4096 Aug 11 2001 foo
|
||||
#
|
||||
# To find the date, we split the line on spaces and iterate on words
|
||||
# until we find a month. This cannot work with files whose owner is a
|
||||
# user named "Jan", or "Feb", etc. However, it's unlikely that '/'
|
||||
# will be owned by a user whose name is a month. So we first look at
|
||||
# the extended ls output of the root directory to decide how many
|
||||
# words should be skipped to get the date.
|
||||
|
||||
# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
|
||||
set x`$ls_command /`
|
||||
|
||||
# Find which argument is the month.
|
||||
month=
|
||||
command=
|
||||
until test $month
|
||||
do
|
||||
test $# -gt 0 || error "failed parsing '$ls_command /' output"
|
||||
shift
|
||||
# Add another shift to the command.
|
||||
command="$command shift;"
|
||||
case $1 in
|
||||
Jan) month=January; nummonth=1;;
|
||||
Feb) month=February; nummonth=2;;
|
||||
Mar) month=March; nummonth=3;;
|
||||
Apr) month=April; nummonth=4;;
|
||||
May) month=May; nummonth=5;;
|
||||
Jun) month=June; nummonth=6;;
|
||||
Jul) month=July; nummonth=7;;
|
||||
Aug) month=August; nummonth=8;;
|
||||
Sep) month=September; nummonth=9;;
|
||||
Oct) month=October; nummonth=10;;
|
||||
Nov) month=November; nummonth=11;;
|
||||
Dec) month=December; nummonth=12;;
|
||||
esac
|
||||
done
|
||||
|
||||
test -n "$month" || error "failed parsing '$ls_command /' output"
|
||||
|
||||
# Get the extended ls output of the file or directory.
|
||||
set dummy x`eval "$ls_command \"\\\$save_arg1\""`
|
||||
|
||||
# Remove all preceding arguments
|
||||
eval $command
|
||||
|
||||
# Because of the dummy argument above, month is in $2.
|
||||
#
|
||||
# On a POSIX system, we should have
|
||||
#
|
||||
# $# = 5
|
||||
# $1 = file size
|
||||
# $2 = month
|
||||
# $3 = day
|
||||
# $4 = year or time
|
||||
# $5 = filename
|
||||
#
|
||||
# On Darwin 7.7.0 and 7.6.0, we have
|
||||
#
|
||||
# $# = 4
|
||||
# $1 = day
|
||||
# $2 = month
|
||||
# $3 = year or time
|
||||
# $4 = filename
|
||||
|
||||
# Get the month.
|
||||
case $2 in
|
||||
Jan) month=January; nummonth=1;;
|
||||
Feb) month=February; nummonth=2;;
|
||||
Mar) month=March; nummonth=3;;
|
||||
Apr) month=April; nummonth=4;;
|
||||
May) month=May; nummonth=5;;
|
||||
Jun) month=June; nummonth=6;;
|
||||
Jul) month=July; nummonth=7;;
|
||||
Aug) month=August; nummonth=8;;
|
||||
Sep) month=September; nummonth=9;;
|
||||
Oct) month=October; nummonth=10;;
|
||||
Nov) month=November; nummonth=11;;
|
||||
Dec) month=December; nummonth=12;;
|
||||
esac
|
||||
|
||||
case $3 in
|
||||
???*) day=$1;;
|
||||
*) day=$3; shift;;
|
||||
esac
|
||||
|
||||
# Here we have to deal with the problem that the ls output gives either
|
||||
# the time of day or the year.
|
||||
case $3 in
|
||||
*:*) set `date`; eval year=\$$#
|
||||
case $2 in
|
||||
Jan) nummonthtod=1;;
|
||||
Feb) nummonthtod=2;;
|
||||
Mar) nummonthtod=3;;
|
||||
Apr) nummonthtod=4;;
|
||||
May) nummonthtod=5;;
|
||||
Jun) nummonthtod=6;;
|
||||
Jul) nummonthtod=7;;
|
||||
Aug) nummonthtod=8;;
|
||||
Sep) nummonthtod=9;;
|
||||
Oct) nummonthtod=10;;
|
||||
Nov) nummonthtod=11;;
|
||||
Dec) nummonthtod=12;;
|
||||
esac
|
||||
# For the first six month of the year the time notation can also
|
||||
# be used for files modified in the last year.
|
||||
if (expr $nummonth \> $nummonthtod) > /dev/null;
|
||||
then
|
||||
year=`expr $year - 1`
|
||||
fi;;
|
||||
*) year=$3;;
|
||||
esac
|
||||
|
||||
# The result.
|
||||
echo $day $month $year
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
+215
@@ -0,0 +1,215 @@
|
||||
#! /bin/sh
|
||||
# Common wrapper for a few potentially missing GNU programs.
|
||||
|
||||
scriptversion=2013-10-28.13; # UTC
|
||||
|
||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
||||
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo 1>&2 "Try '$0 --help' for more information"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case $1 in
|
||||
|
||||
--is-lightweight)
|
||||
# Used by our autoconf macros to check whether the available missing
|
||||
# script is modern enough.
|
||||
exit 0
|
||||
;;
|
||||
|
||||
--run)
|
||||
# Back-compat with the calling convention used by older automake.
|
||||
shift
|
||||
;;
|
||||
|
||||
-h|--h|--he|--hel|--help)
|
||||
echo "\
|
||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||
|
||||
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
|
||||
to PROGRAM being missing or too old.
|
||||
|
||||
Options:
|
||||
-h, --help display this help and exit
|
||||
-v, --version output version information and exit
|
||||
|
||||
Supported PROGRAM values:
|
||||
aclocal autoconf autoheader autom4te automake makeinfo
|
||||
bison yacc flex lex help2man
|
||||
|
||||
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
||||
'g' are ignored when checking the name.
|
||||
|
||||
Send bug reports to <bug-automake@gnu.org>."
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||
echo "missing $scriptversion (GNU Automake)"
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-*)
|
||||
echo 1>&2 "$0: unknown '$1' option"
|
||||
echo 1>&2 "Try '$0 --help' for more information"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# Run the given program, remember its exit status.
|
||||
"$@"; st=$?
|
||||
|
||||
# If it succeeded, we are done.
|
||||
test $st -eq 0 && exit 0
|
||||
|
||||
# Also exit now if we it failed (or wasn't found), and '--version' was
|
||||
# passed; such an option is passed most likely to detect whether the
|
||||
# program is present and works.
|
||||
case $2 in --version|--help) exit $st;; esac
|
||||
|
||||
# Exit code 63 means version mismatch. This often happens when the user
|
||||
# tries to use an ancient version of a tool on a file that requires a
|
||||
# minimum version.
|
||||
if test $st -eq 63; then
|
||||
msg="probably too old"
|
||||
elif test $st -eq 127; then
|
||||
# Program was missing.
|
||||
msg="missing on your system"
|
||||
else
|
||||
# Program was found and executed, but failed. Give up.
|
||||
exit $st
|
||||
fi
|
||||
|
||||
perl_URL=http://www.perl.org/
|
||||
flex_URL=http://flex.sourceforge.net/
|
||||
gnu_software_URL=http://www.gnu.org/software
|
||||
|
||||
program_details ()
|
||||
{
|
||||
case $1 in
|
||||
aclocal|automake)
|
||||
echo "The '$1' program is part of the GNU Automake package:"
|
||||
echo "<$gnu_software_URL/automake>"
|
||||
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
|
||||
echo "<$gnu_software_URL/autoconf>"
|
||||
echo "<$gnu_software_URL/m4/>"
|
||||
echo "<$perl_URL>"
|
||||
;;
|
||||
autoconf|autom4te|autoheader)
|
||||
echo "The '$1' program is part of the GNU Autoconf package:"
|
||||
echo "<$gnu_software_URL/autoconf/>"
|
||||
echo "It also requires GNU m4 and Perl in order to run:"
|
||||
echo "<$gnu_software_URL/m4/>"
|
||||
echo "<$perl_URL>"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
give_advice ()
|
||||
{
|
||||
# Normalize program name to check for.
|
||||
normalized_program=`echo "$1" | sed '
|
||||
s/^gnu-//; t
|
||||
s/^gnu//; t
|
||||
s/^g//; t'`
|
||||
|
||||
printf '%s\n' "'$1' is $msg."
|
||||
|
||||
configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
|
||||
case $normalized_program in
|
||||
autoconf*)
|
||||
echo "You should only need it if you modified 'configure.ac',"
|
||||
echo "or m4 files included by it."
|
||||
program_details 'autoconf'
|
||||
;;
|
||||
autoheader*)
|
||||
echo "You should only need it if you modified 'acconfig.h' or"
|
||||
echo "$configure_deps."
|
||||
program_details 'autoheader'
|
||||
;;
|
||||
automake*)
|
||||
echo "You should only need it if you modified 'Makefile.am' or"
|
||||
echo "$configure_deps."
|
||||
program_details 'automake'
|
||||
;;
|
||||
aclocal*)
|
||||
echo "You should only need it if you modified 'acinclude.m4' or"
|
||||
echo "$configure_deps."
|
||||
program_details 'aclocal'
|
||||
;;
|
||||
autom4te*)
|
||||
echo "You might have modified some maintainer files that require"
|
||||
echo "the 'autom4te' program to be rebuilt."
|
||||
program_details 'autom4te'
|
||||
;;
|
||||
bison*|yacc*)
|
||||
echo "You should only need it if you modified a '.y' file."
|
||||
echo "You may want to install the GNU Bison package:"
|
||||
echo "<$gnu_software_URL/bison/>"
|
||||
;;
|
||||
lex*|flex*)
|
||||
echo "You should only need it if you modified a '.l' file."
|
||||
echo "You may want to install the Fast Lexical Analyzer package:"
|
||||
echo "<$flex_URL>"
|
||||
;;
|
||||
help2man*)
|
||||
echo "You should only need it if you modified a dependency" \
|
||||
"of a man page."
|
||||
echo "You may want to install the GNU Help2man package:"
|
||||
echo "<$gnu_software_URL/help2man/>"
|
||||
;;
|
||||
makeinfo*)
|
||||
echo "You should only need it if you modified a '.texi' file, or"
|
||||
echo "any other file indirectly affecting the aspect of the manual."
|
||||
echo "You might want to install the Texinfo package:"
|
||||
echo "<$gnu_software_URL/texinfo/>"
|
||||
echo "The spurious makeinfo call might also be the consequence of"
|
||||
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
|
||||
echo "want to install GNU make:"
|
||||
echo "<$gnu_software_URL/make/>"
|
||||
;;
|
||||
*)
|
||||
echo "You might have modified some files without having the proper"
|
||||
echo "tools for further handling them. Check the 'README' file, it"
|
||||
echo "often tells you about the needed prerequisites for installing"
|
||||
echo "this package. You may also peek at any GNU archive site, in"
|
||||
echo "case some other package contains this missing '$1' program."
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
give_advice "$1" | sed -e '1s/^/WARNING: /' \
|
||||
-e '2,$s/^/ /' >&2
|
||||
|
||||
# Propagate the correct exit status (expected to be 127 for a program
|
||||
# not found, 63 for a program that failed due to version mismatch).
|
||||
exit $st
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,104 @@
|
||||
# Makefile for cipher modules
|
||||
# Copyright (C) 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2009 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Process this file with automake to produce Makefile.in
|
||||
|
||||
EXTRA_DIST = Manifest
|
||||
|
||||
# Need to include ../src in addition to top_srcdir because gcrypt.h is
|
||||
# a built header.
|
||||
AM_CPPFLAGS = -I../src -I$(top_srcdir)/src
|
||||
AM_CFLAGS = $(GPG_ERROR_CFLAGS)
|
||||
|
||||
AM_CCASFLAGS = $(NOEXECSTACK_FLAGS)
|
||||
|
||||
|
||||
noinst_LTLIBRARIES = libcipher.la
|
||||
|
||||
GCRYPT_MODULES = @GCRYPT_CIPHERS@ @GCRYPT_PUBKEY_CIPHERS@ \
|
||||
@GCRYPT_DIGESTS@ @GCRYPT_KDFS@
|
||||
|
||||
libcipher_la_DEPENDENCIES = $(GCRYPT_MODULES)
|
||||
libcipher_la_LIBADD = $(GCRYPT_MODULES)
|
||||
|
||||
libcipher_la_SOURCES = \
|
||||
cipher.c cipher-internal.h \
|
||||
cipher-cbc.c cipher-cfb.c cipher-ofb.c cipher-ctr.c cipher-aeswrap.c \
|
||||
cipher-ccm.c cipher-cmac.c cipher-gcm.c \
|
||||
cipher-selftest.c cipher-selftest.h \
|
||||
pubkey.c pubkey-internal.h pubkey-util.c \
|
||||
md.c \
|
||||
mac.c mac-internal.h \
|
||||
mac-hmac.c mac-cmac.c mac-gmac.c \
|
||||
kdf.c kdf-internal.h \
|
||||
hmac-tests.c \
|
||||
bithelp.h \
|
||||
bufhelp.h \
|
||||
primegen.c \
|
||||
hash-common.c hash-common.h \
|
||||
dsa-common.c rsa-common.c \
|
||||
rmd.h
|
||||
|
||||
EXTRA_libcipher_la_SOURCES = \
|
||||
arcfour.c \
|
||||
blowfish.c blowfish-amd64.S blowfish-arm.S \
|
||||
cast5.c cast5-amd64.S cast5-arm.S \
|
||||
crc.c \
|
||||
des.c \
|
||||
dsa.c \
|
||||
elgamal.c \
|
||||
ecc.c ecc-curves.c ecc-misc.c ecc-common.h \
|
||||
ecc-ecdsa.c ecc-eddsa.c ecc-gost.c \
|
||||
idea.c \
|
||||
gost28147.c gost.h \
|
||||
gostr3411-94.c \
|
||||
md4.c \
|
||||
md5.c \
|
||||
rijndael.c rijndael-tables.h rijndael-amd64.S rijndael-arm.S \
|
||||
rmd160.c \
|
||||
rsa.c \
|
||||
salsa20.c salsa20-amd64.S salsa20-armv7-neon.S \
|
||||
scrypt.c \
|
||||
seed.c \
|
||||
serpent.c serpent-sse2-amd64.S serpent-avx2-amd64.S serpent-armv7-neon.S \
|
||||
sha1.c sha1-ssse3-amd64.S \
|
||||
sha256.c sha256-ssse3-amd64.S \
|
||||
sha512.c sha512-ssse3-amd64.S sha512-avx-amd64.S sha512-avx2-bmi2-amd64.S \
|
||||
sha512-armv7-neon.S \
|
||||
stribog.c \
|
||||
tiger.c \
|
||||
whirlpool.c \
|
||||
twofish.c twofish-amd64.S twofish-arm.S \
|
||||
rfc2268.c \
|
||||
camellia.c camellia.h camellia-glue.c camellia-aesni-avx-amd64.S \
|
||||
camellia-aesni-avx2-amd64.S camellia-arm.S
|
||||
|
||||
if ENABLE_O_FLAG_MUNGING
|
||||
o_flag_munging = sed -e 's/-O\([2-9s][2-9s]*\)/-O1/' -e 's/-Ofast/-O1/g'
|
||||
else
|
||||
o_flag_munging = cat
|
||||
endif
|
||||
|
||||
|
||||
# We need to lower the optimization for this module.
|
||||
tiger.o: $(srcdir)/tiger.c
|
||||
`echo $(COMPILE) -c $(srcdir)/tiger.c | $(o_flag_munging) `
|
||||
|
||||
tiger.lo: $(srcdir)/tiger.c
|
||||
`echo $(LTCOMPILE) -c $(srcdir)/tiger.c | $(o_flag_munging) `
|
||||
@@ -0,0 +1,830 @@
|
||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
# Makefile for cipher modules
|
||||
# Copyright (C) 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2009 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Process this file with automake to produce Makefile.in
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
subdir = cipher
|
||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||
$(top_srcdir)/build-aux/depcomp
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/gpg-error.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lock.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/onceonly.m4 \
|
||||
$(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sys_socket_h.m4 \
|
||||
$(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
||||
am__DEPENDENCIES_1 =
|
||||
am_libcipher_la_OBJECTS = cipher.lo cipher-cbc.lo cipher-cfb.lo \
|
||||
cipher-ofb.lo cipher-ctr.lo cipher-aeswrap.lo cipher-ccm.lo \
|
||||
cipher-cmac.lo cipher-gcm.lo cipher-selftest.lo pubkey.lo \
|
||||
pubkey-util.lo md.lo mac.lo mac-hmac.lo mac-cmac.lo \
|
||||
mac-gmac.lo kdf.lo hmac-tests.lo primegen.lo hash-common.lo \
|
||||
dsa-common.lo rsa-common.lo
|
||||
libcipher_la_OBJECTS = $(am_libcipher_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
am__v_lt_1 =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
|
||||
depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__mv = mv -f
|
||||
CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)
|
||||
LTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \
|
||||
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||
$(AM_CCASFLAGS) $(CCASFLAGS)
|
||||
AM_V_CPPAS = $(am__v_CPPAS_@AM_V@)
|
||||
am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@)
|
||||
am__v_CPPAS_0 = @echo " CPPAS " $@;
|
||||
am__v_CPPAS_1 =
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
|
||||
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||
$(AM_CFLAGS) $(CFLAGS)
|
||||
AM_V_CC = $(am__v_CC_@AM_V@)
|
||||
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
||||
am__v_CC_0 = @echo " CC " $@;
|
||||
am__v_CC_1 =
|
||||
CCLD = $(CC)
|
||||
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
am__v_CCLD_1 =
|
||||
SOURCES = $(libcipher_la_SOURCES) $(EXTRA_libcipher_la_SOURCES)
|
||||
DIST_SOURCES = $(libcipher_la_SOURCES) $(EXTRA_libcipher_la_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
BUILD_FILEVERSION = @BUILD_FILEVERSION@
|
||||
BUILD_REVISION = @BUILD_REVISION@
|
||||
BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
|
||||
CC = @CC@
|
||||
CCAS = @CCAS@
|
||||
CCASDEPMODE = @CCASDEPMODE@
|
||||
CCASFLAGS = @CCASFLAGS@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CC_FOR_BUILD = @CC_FOR_BUILD@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DL_LIBS = @DL_LIBS@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
FALLBACK_SOCKLEN_T = @FALLBACK_SOCKLEN_T@
|
||||
FGREP = @FGREP@
|
||||
GCRYPT_CIPHERS = @GCRYPT_CIPHERS@
|
||||
GCRYPT_DIGESTS = @GCRYPT_DIGESTS@
|
||||
GCRYPT_HWF_MODULES = @GCRYPT_HWF_MODULES@
|
||||
GCRYPT_KDFS = @GCRYPT_KDFS@
|
||||
GCRYPT_PUBKEY_CIPHERS = @GCRYPT_PUBKEY_CIPHERS@
|
||||
GCRYPT_RANDOM = @GCRYPT_RANDOM@
|
||||
GPG_ERROR_CFLAGS = @GPG_ERROR_CFLAGS@
|
||||
GPG_ERROR_CONFIG = @GPG_ERROR_CONFIG@
|
||||
GPG_ERROR_LIBS = @GPG_ERROR_LIBS@
|
||||
GREP = @GREP@
|
||||
INSERT_SYS_SELECT_H = @INSERT_SYS_SELECT_H@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBGCRYPT_CIPHERS = @LIBGCRYPT_CIPHERS@
|
||||
LIBGCRYPT_CONFIG_API_VERSION = @LIBGCRYPT_CONFIG_API_VERSION@
|
||||
LIBGCRYPT_CONFIG_CFLAGS = @LIBGCRYPT_CONFIG_CFLAGS@
|
||||
LIBGCRYPT_CONFIG_HOST = @LIBGCRYPT_CONFIG_HOST@
|
||||
LIBGCRYPT_CONFIG_LIBS = @LIBGCRYPT_CONFIG_LIBS@
|
||||
LIBGCRYPT_DIGESTS = @LIBGCRYPT_DIGESTS@
|
||||
LIBGCRYPT_LT_AGE = @LIBGCRYPT_LT_AGE@
|
||||
LIBGCRYPT_LT_CURRENT = @LIBGCRYPT_LT_CURRENT@
|
||||
LIBGCRYPT_LT_REVISION = @LIBGCRYPT_LT_REVISION@
|
||||
LIBGCRYPT_PUBKEY_CIPHERS = @LIBGCRYPT_PUBKEY_CIPHERS@
|
||||
LIBGCRYPT_THREAD_MODULES = @LIBGCRYPT_THREAD_MODULES@
|
||||
LIBMULTITHREAD = @LIBMULTITHREAD@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTHREAD = @LIBTHREAD@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LTLIBTHREAD = @LTLIBTHREAD@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MPI_SFLAGS = @MPI_SFLAGS@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PTH_CFLAGS = @PTH_CFLAGS@
|
||||
PTH_CONFIG = @PTH_CONFIG@
|
||||
PTH_LIBS = @PTH_LIBS@
|
||||
RANLIB = @RANLIB@
|
||||
RC = @RC@
|
||||
RUN_LARGE_DATA_TESTS = @RUN_LARGE_DATA_TESTS@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
SYS_SOCKET_H = @SYS_SOCKET_H@
|
||||
VERSION = @VERSION@
|
||||
VERSION_NUMBER = @VERSION_NUMBER@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
emacs_local_vars_begin = @emacs_local_vars_begin@
|
||||
emacs_local_vars_end = @emacs_local_vars_end@
|
||||
emacs_local_vars_read_only = @emacs_local_vars_read_only@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
EXTRA_DIST = Manifest
|
||||
|
||||
# Need to include ../src in addition to top_srcdir because gcrypt.h is
|
||||
# a built header.
|
||||
AM_CPPFLAGS = -I../src -I$(top_srcdir)/src
|
||||
AM_CFLAGS = $(GPG_ERROR_CFLAGS)
|
||||
AM_CCASFLAGS = $(NOEXECSTACK_FLAGS)
|
||||
noinst_LTLIBRARIES = libcipher.la
|
||||
GCRYPT_MODULES = @GCRYPT_CIPHERS@ @GCRYPT_PUBKEY_CIPHERS@ \
|
||||
@GCRYPT_DIGESTS@ @GCRYPT_KDFS@
|
||||
|
||||
libcipher_la_DEPENDENCIES = $(GCRYPT_MODULES)
|
||||
libcipher_la_LIBADD = $(GCRYPT_MODULES)
|
||||
libcipher_la_SOURCES = \
|
||||
cipher.c cipher-internal.h \
|
||||
cipher-cbc.c cipher-cfb.c cipher-ofb.c cipher-ctr.c cipher-aeswrap.c \
|
||||
cipher-ccm.c cipher-cmac.c cipher-gcm.c \
|
||||
cipher-selftest.c cipher-selftest.h \
|
||||
pubkey.c pubkey-internal.h pubkey-util.c \
|
||||
md.c \
|
||||
mac.c mac-internal.h \
|
||||
mac-hmac.c mac-cmac.c mac-gmac.c \
|
||||
kdf.c kdf-internal.h \
|
||||
hmac-tests.c \
|
||||
bithelp.h \
|
||||
bufhelp.h \
|
||||
primegen.c \
|
||||
hash-common.c hash-common.h \
|
||||
dsa-common.c rsa-common.c \
|
||||
rmd.h
|
||||
|
||||
EXTRA_libcipher_la_SOURCES = \
|
||||
arcfour.c \
|
||||
blowfish.c blowfish-amd64.S blowfish-arm.S \
|
||||
cast5.c cast5-amd64.S cast5-arm.S \
|
||||
crc.c \
|
||||
des.c \
|
||||
dsa.c \
|
||||
elgamal.c \
|
||||
ecc.c ecc-curves.c ecc-misc.c ecc-common.h \
|
||||
ecc-ecdsa.c ecc-eddsa.c ecc-gost.c \
|
||||
idea.c \
|
||||
gost28147.c gost.h \
|
||||
gostr3411-94.c \
|
||||
md4.c \
|
||||
md5.c \
|
||||
rijndael.c rijndael-tables.h rijndael-amd64.S rijndael-arm.S \
|
||||
rmd160.c \
|
||||
rsa.c \
|
||||
salsa20.c salsa20-amd64.S salsa20-armv7-neon.S \
|
||||
scrypt.c \
|
||||
seed.c \
|
||||
serpent.c serpent-sse2-amd64.S serpent-avx2-amd64.S serpent-armv7-neon.S \
|
||||
sha1.c sha1-ssse3-amd64.S \
|
||||
sha256.c sha256-ssse3-amd64.S \
|
||||
sha512.c sha512-ssse3-amd64.S sha512-avx-amd64.S sha512-avx2-bmi2-amd64.S \
|
||||
sha512-armv7-neon.S \
|
||||
stribog.c \
|
||||
tiger.c \
|
||||
whirlpool.c \
|
||||
twofish.c twofish-amd64.S twofish-arm.S \
|
||||
rfc2268.c \
|
||||
camellia.c camellia.h camellia-glue.c camellia-aesni-avx-amd64.S \
|
||||
camellia-aesni-avx2-amd64.S camellia-arm.S
|
||||
|
||||
@ENABLE_O_FLAG_MUNGING_FALSE@o_flag_munging = cat
|
||||
@ENABLE_O_FLAG_MUNGING_TRUE@o_flag_munging = sed -e 's/-O\([2-9s][2-9s]*\)/-O1/' -e 's/-Ofast/-O1/g'
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .S .c .lo .o .obj
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cipher/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu cipher/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
clean-noinstLTLIBRARIES:
|
||||
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
||||
@list='$(noinst_LTLIBRARIES)'; \
|
||||
locs=`for p in $$list; do echo $$p; done | \
|
||||
sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||
sort -u`; \
|
||||
test -z "$$locs" || { \
|
||||
echo rm -f $${locs}; \
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
libcipher.la: $(libcipher_la_OBJECTS) $(libcipher_la_DEPENDENCIES) $(EXTRA_libcipher_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(LINK) $(libcipher_la_OBJECTS) $(libcipher_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arcfour.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blowfish-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blowfish-arm.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blowfish.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camellia-aesni-avx-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camellia-aesni-avx2-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camellia-arm.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camellia-glue.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camellia.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cast5-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cast5-arm.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cast5.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher-aeswrap.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher-cbc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher-ccm.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher-cfb.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher-cmac.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher-ctr.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher-gcm.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher-ofb.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher-selftest.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/des.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsa-common.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsa.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecc-curves.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecc-ecdsa.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecc-eddsa.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecc-gost.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecc-misc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elgamal.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gost28147.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gostr3411-94.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash-common.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hmac-tests.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idea.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdf.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mac-cmac.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mac-gmac.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mac-hmac.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mac.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md4.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/primegen.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubkey-util.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubkey.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rfc2268.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rijndael-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rijndael-arm.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rijndael.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmd160.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsa-common.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsa.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/salsa20-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/salsa20-armv7-neon.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/salsa20.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrypt.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/seed.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serpent-armv7-neon.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serpent-avx2-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serpent-sse2-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serpent.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1-ssse3-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha256-ssse3-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha256.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha512-armv7-neon.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha512-avx-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha512-avx2-bmi2-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha512-ssse3-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha512.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stribog.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiger.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/twofish-amd64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/twofish-arm.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/twofish.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/whirlpool.Plo@am__quote@
|
||||
|
||||
.S.o:
|
||||
@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $<
|
||||
|
||||
.S.obj:
|
||||
@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
|
||||
.S.lo:
|
||||
@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(LTCPPASCOMPILE) -c -o $@ $<
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
||||
|
||||
.c.obj:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-am
|
||||
TAGS: tags
|
||||
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
if test $$# -gt 0; then \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
"$$@" $$unique; \
|
||||
else \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: ctags-am
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscopelist: cscopelist-am
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(LTLIBRARIES)
|
||||
installdirs:
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am:
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am:
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
|
||||
clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
|
||||
ctags-am distclean distclean-compile distclean-generic \
|
||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||
html-am info info-am install install-am install-data \
|
||||
install-data-am install-dvi install-dvi-am install-exec \
|
||||
install-exec-am install-html install-html-am install-info \
|
||||
install-info-am install-man install-pdf install-pdf-am \
|
||||
install-ps install-ps-am install-strip installcheck \
|
||||
installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||
tags tags-am uninstall uninstall-am
|
||||
|
||||
|
||||
# We need to lower the optimization for this module.
|
||||
tiger.o: $(srcdir)/tiger.c
|
||||
`echo $(COMPILE) -c $(srcdir)/tiger.c | $(o_flag_munging) `
|
||||
|
||||
tiger.lo: $(srcdir)/tiger.c
|
||||
`echo $(LTCOMPILE) -c $(srcdir)/tiger.c | $(o_flag_munging) `
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
@@ -0,0 +1,73 @@
|
||||
# Manifest - checksums of the cipher directory
|
||||
# Copyright 2003 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser general Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
# Checksums for all source files in this directory. Format is
|
||||
# filename, blanks, base-64 part of an OpenPGP detached signature
|
||||
# without the header lines. Blank lines and lines beginning with a
|
||||
# hash mark are ignored. A tool to process this file is available by
|
||||
# cvs -d :pserver:anoncvs@cvs.gnupg.org:/cvs/wk co misc-scripts/manifest-tool
|
||||
#
|
||||
# The special entry "$names$" holds a signature over all sorted
|
||||
# filenames excluding itself.
|
||||
|
||||
|
||||
# Algorithm API
|
||||
cipher.c iQCVAwUAQDzrVjEAnp832S/7AQIPDgP+OVJ/YNWY5m7c09EBbPAzL/WsGoj6wrBNMmkRlMOqTHeh+OOtjuFHt1f9uhfM2Nzl7sJ5+h4ryZKLEZmQPRMTZTnAqkvGdsrJWJnigUA9QwYdV0ONqC9C63gpuG465gO9TZVOqlQu/FTxSRuTQYUulkaBNG71n8nZEOusBVwV2YA==58xH
|
||||
pubkey.c iQCVAwUAP9XQ3jEAnp832S/7AQJ5UgQAyHfEBvPVJ8wTRg8c7ixS2GiVmIgwIo5tvQaiQJTPWASevvYrB+2Z2qa9cATyu50ACjLzbaquGBgPzjJV3dU/qttT1gCqRuN/LCNvXFe5qnIZezejc3RAadFNTw/pOTHq0wxD1Keg66ruei9R36Nba59pEQIWIBXTfubRft2hMYk==E09t
|
||||
ac.c iQCVAwUAQDzsOzEAnp832S/7AQJCBQP/WI6EV/dsR4rmha6RVhvkjZo17kQ8z6pIl5J3cXOvqEkIFeD2HYu3HHrWST5l7yXlffhpDkVHkfMih4ruK76q6Fm0dxZ98pO4C/dVtgimlvvcy/wOQjpzsE0fYAe1BYdg81LJ09X33vW5x6C29lunfKROO2tPlV5i8ffeoFvmMF8==j26g
|
||||
md.c iQCVAwUAP+NFGjEAnp832S/7AQJs8wP/Qdk0EAKsyr3O1/pmOSN8AG4rPKbd6KDTzvoBPAN4upFwKYY4hWwvy12Q3YU9DmECrzZkRCXHR7mljVQKs6B7CRZJKjFKmOELpcJDtKvu40vTs1bOH4k9iJYZpGgRA83nkQ+ELAcphAbCA+KIpVr2K4mCJAB0FhpC2uOQ50JHAko==BeF6
|
||||
primegen.c iQCVAwUAQDzsoDEAnp832S/7AQKYRwP/TqAQBm1rHTnF0HYE05PqXfWlOqa6EosqVpaOcs/OIW6PaqX0xH1UlrukK7jNOjK3xC4o1qNQ1UKzz2dvQaq1bMvNNizeavxAh10SJZc0hIc/ofc83IbjLh8SZVWQ67JxjsUd3DOXmSmhPZ+Pqd7cUIiw8fDoF+I9EZqy3COu1wY==1ebT
|
||||
|
||||
# Algorithm implementations
|
||||
arcfour.c iQCVAwUAP9XR/TEAnp832S/7AQJcRwP6AlvYEx++fpT4mIYo0xRDqKEQeqMQvbaRhIg2eV74JxItpHa3q5YsYIl+n1yUz5g35JRWWXSWmAZBwO5wLKsHii4kRUhgrKWnSoQZoPpl49L5+N3R58ON3S0ru5lsBiEJEze3xplf2vqwrH9v1QHVD+gU7UTlfNqrIJoOUXN+1O4==Tq+x
|
||||
blowfish.c iQCVAwUAP9XTETEAnp832S/7AQJaEgQAgiqqfuO+zQtscgTB0rvOzVymIKjRKjYhFuLjVuc79G4z1RCAffvIn/YM2d7kt+Z/QF7zjcTAOgETCQL1XokpX2zz9HPAMi2tlDY5zsDufTNqj0n4WBL9nM7w6XAvsiwP1B3bqCTv9SjJV4KbxJ58vw1yQE+sqW74R/QIHFvC7mU==wZnX
|
||||
cast5.c iQCVAwUAP9XT6DEAnp832S/7AQJ3xgP/ehLjEN3GELGudbqeo91Xd+PqitHrkuBbtRIYX7Udd/fyXLN+h8rMJVyIQX2m+mpxbBxudVU3x8/DNT8B0ZHAwK6qqJmEBLLhEYPgIuF76i9LMrP1KqUPhAwRZ2OppjIIugBQ+rP74aD4eLyd/aKQHNuXML8QGWR6KwQShohXM5I==/BRh
|
||||
crc.c iQCVAwUAP7ouejEAnp832S/7AQIgwQQApg5Nm63tH5DQkbN+zPzMO9Ygoj3ukxfFTyTBPYSXYKMiTjEbESegaU40uN8jnz2vprcIQWcgZfzO4+opEJMcI35aPwzEk0vKOp0S/PrBLUY2rJfnDVkX5XgJFZa2Q7LLe826UEBzTVYW924utiCCe8oOaOEWVNpg1mqdknu3M9o==kz5D
|
||||
des.c iQCVAwUAQCN2oDEAnp832S/7AQL/jwP6Auoq6nZCDBjpgc9tDzuIRwa9DqyuM3gX94uvgEpUwdHszb2bG43dz03kVmcYxtj1MzXbyCeCZOwox0b2SKmLgxIbrNP6yGbzVdTj6592gDYuf/ZXmc1ZNJ1DDldcPQ0n9fXUipUPwyPaNWo3mSZaNcMKSWWzdK0J6ciG6nk7SWI==9k/t
|
||||
dsa.c iQCVAwUAP9XZHDEAnp832S/7AQLBRgP/XrBzTEYx5ccMj1MMb6sg37liEHdIyyy49zjvt6jUqxj4RuwVEN8S6v3u4q/QyJkHAi1E0EkREgENlyHW6PKWhYbcrd0vPIAN15yjnl2yqtrCrJImexUCoqJJewK0E4JOicGbabTil8MZjk+mbhEPnjJBqOkyP1w0i31pEDgE/8M==pC8s
|
||||
elgamal.c iQCVAwUAP9XbYzEAnp832S/7AQLXagQA3HrvspZfbTGgmUH0IqLQTJ0exUPxJv5DET2TvoIy62trDmMN6lTAj5P+a7jQ8udcu0w+mR2vXUHcxUpNA2PxLaMwGzNSY4zRDNe9r3SFTDrFm6m4y9Ko2e8XtEA+WF6P/XLpck4Jn7vMEDmVGPwkNd22kXFFE8dBGwG6i5Hk1Mk==oBUs
|
||||
md4.c iQCVAwUAP9h50DEAnp832S/7AQJhHgQAzNA/B6MWFDlCtPkIVaW8RpP1Eg0ZNMsy0s7SJkopOCBlu6CwXUOKe+8ppcSxhjYKh4i4uQr/QtfipYlBjzKJGnrafoF/NugXNCOHSTGT11TvK7mCiBuUMVgvZGAlOJImk6eTTfUjRrMfaXM/SWl8bdJ4ZpzdjEyVh89r7I5JrGk==x2UD
|
||||
md5.c iQCVAwUAP9h7LzEAnp832S/7AQJUGQP/c0cbf6WZXCzmjufHxiE9FAQBzTsA0WtaNqdFcHl7fhmikGtknlaED8n5a7eYd/C481UQW6Wgq/oZdsvgoPWPhG3fOCy2CFP9cZVXITuMSf0ucyZTFUJNO15fnZ+nDfsUv+JPdv1aSeRinAUtfAcSKfkSyR9BCPZvkx+tgU6cphU==Zv+h
|
||||
rijndael.c iQCVAwUAP9h9cTEAnp832S/7AQKF1AP+P2L/tPqDJRDg+/fwbOk8Ts0MNxnvvYEm3gE73TKuLt1S+B2+jkrZcKNvM5VGPnVMJbnS0lmIK04nmedHCOftGTOwhGulZAHHIaKGystT3Jql4iPws/JMgAjE7Fyxh5WZMtB9yEljKBpJ5XNqhrMvvxcHpnyP3+YzIXNwzk34V+c==dJ5k
|
||||
rmd160.c iQCVAwUAP9h+bTEAnp832S/7AQK1OgP+PNKF6Nzi6X93easVlksdLqKEsArCAw2QjGWDGyxTnbiJM55qAl9JxR1mn3V+oOL7izLLwTt6EYK9evhzfcxY5N5Mni85RAcsLPsuAfQDEzjI6GUWHtQUKPbM+BaorzfhQjYFSZyvum/dZYJ/WfiwwwhqqIKyVU2ZFSqA38YGC/c==9jdA
|
||||
rsa.c iQCVAwUAP9iHIzEAnp832S/7AQKAYwQAuWtnMte54QHN+Hij9t4sGuypXogajOb1vQQwGgS0fKsaBZsuSP2amze4o5diIvsQTsFQ4CzjvqoCVuBDoHM3xkSD8wGDizgvtCamAxkdbF7wmzldKFn8SpJqlVwWQMP6kk1IjXHEuYb4IDWGTbVMhfEu+eOlU8+PSK4IhZqNvt4==/3hp
|
||||
serpent.c iQCVAwUAP9h/VzEAnp832S/7AQLyCwP/d1zbmb7l/PriZNa9/Z7mo01XFe5MnAqCfIwhl9GjeaMszcoS37jECNq5nLvrTTFIIJpm3rvBePwiCG4Wwx1I18HCxaP198pcSaR+BLOJ3Aj52EZPrxtqlDKuFr38ZOP5giyUqUYVYGVdrz4kRMNWAZQK53GeJnGhXCnhxojLEgA==ck46
|
||||
sha1.c iQCVAwUAP9iATTEAnp832S/7AQKcSwQAwAs/HnNqho3lU1ZUgCPNt5P2/Brm6W21+wWWGKJkSrra/c4NYVKJGDDwlsFE0b9ln1uZt7bHReFkKXK3JnrKTmNVcx/Cy64iCMRNMhaM72Mqy7wWx5yHBAmMBxzFGnNQKbmeY52zeGih5HsNLSibc2pPuOViWo2JPJ5Ci/wIwl8==/wtO
|
||||
sha256.c iQCVAwUAP9iAtzEAnp832S/7AQJD2QP/UqvL0hhjG1wEFbGrdkV9tba1sMDXdnnK6X7HdLuRpVAgNiQiFf8JDmntd/dZ2Q71p4Uae2ctqve4WoEijPUZPjACnpuZfx0SEQL0lQBkwxzJp7lz9ujVtwQ2cM/aYexJkXcWgGcloJNLM3JbWPGIJnuYbr/IwJ6RQF9vgj0357o==UWO1
|
||||
sha512.c iQCVAwUAP9iBTDEAnp832S/7AQIPBAQA28CJSUQLiW0s2x9u8/OH2eKnxPjA4sZmb50WP7920Lem66P31C3BrOqwfBot4RLhjL+zh/+Uc4s3HPwApZuj9E4BxNMlqLv+Tqk++DAbdaOeYT4jeUt+mlhQQ6mH/RDsy32rZsNsGQ2bUGxazZmfG++PL3JyhawqCy00SUDr/o0==H+0X
|
||||
tiger.c iQCVAwUAP9iCfjEAnp832S/7AQKufwP/fryv3MqSOYY+90325DH7X3/CtekxeooN0scGsHX0fxBakWSMecTNrj33KPddLS46gU/S89zIc2N/Bw/7EVIAXVFA3/3Ip+OrFOuIMO4Py1sCdB8o2Y+5ygv8iXLcsXIq1O0av79i9g774V3uaXa2qN9ZnXe0AEhcy8FHJ2i/wro==5XVB
|
||||
twofish.c iQCVAwUAP9iD6TEAnp832S/7AQKUnQP/Rq8FaYeHTG7HbZuqAs9pbPitzjDbkdZddmInWR7NmevBkKvhsJALjVooc0KGQfo2lAAmy3Xi/4QQN8VPn51DVjDIgf7x+DQh/9TFJHMccxI9asUgi4+TNnmMqLU1k3N8S2PjyZ1sjeC8B79fKPpwCzj72WkqPkzZw3l2jArr+dU==NdJT
|
||||
rfc2268.c iQCVAwUAQCN+3jEAnp832S/7AQLv1gQA1hJh29hAjKi4uLSGxXvJ6cyYmPdmevdKrbLnuHZWtHe4xvCgy/nTdEojEpxgLp/hL/ogasuWRC1W16Wiz9ryxf7YR0uhZWayO/bQNagpfU5MIkJTLuKqqgpwYumCSQfOugXVAqcgEzj+13eeyJaFVrzwrNa67sh84nmbjOjNjvE==0zBq
|
||||
|
||||
# Random number related
|
||||
random.c iQCVAwUAP7nsITEAnp832S/7AQK4SAQAtvfUgrtGOQ2PlxGMla0qJLPHjJacMwgq0ecusiI79elPdDsFfCCk6dK1Ug2kFbNm22nCGHNcUquqbX7noi7ZVQnmPBQXzyLNZd7GmrawRZfdlRerTUDBpSnR8V8ui/5+YYp627E7kKGC0hPSgqXFql6oBMIfno0LZwFJTjIevRY==L419
|
||||
random.h iQCVAwUAP7ovKDEAnp832S/7AQJ3bQQAjnPebnyTC7sphAv2I7uIz+yPgw1ZfbVhLv+OiWDlO9ish+fRyyMpy+HELBOgZjJdgRegqhlZC6qyns5arM/VglYi+PzvdLO3hIqHE/YFfpIFPz8wBrcmlqrYyd3CsGqcYsfjocXNttCBLeSWmoJ09ltKQH8yzJf3oAgN6X1yuc4==eNoU
|
||||
rand-internal.h iQCVAwUAP7ouvDEAnp832S/7AQLYnAQAhdI7ERoJVCkV8GiV7MjaUxv1WIL7iZ+jIOvVhv4fNyhCGCGoEtTjkyput/lj7Nsh3FXEqRhypGGrCLf47x/gua5n+BwffogxVyUDqiOyyGhNTPpe3fQcNBvbPCtco8yMK4GJO5G3BqzlPyN+BMeogLymyV6Sm1mvh5LZDyAFbfQ==tZSE
|
||||
rndlinux.c iQCVAwUAP9iPYTEAnp832S/7AQL6/AP/ZDrbOkVuB9qJ7sKeX1MImZEsz3mi0xPovJzaBtBU7a0idcUKrWYOvQFWRlLUeq0iCT6+h2l5bniP7q7hepzlKa+VPY9VWaQthqeJm2l5LN6QQ5PyMfBq04QuBncw9BJnCGmEyTLt3RxIXBAPdxmiVxtcRIFUqCBtQvoUXGLvemw==t37k
|
||||
rndegd.c iQCVAwUAP9iPRDEAnp832S/7AQImBQP/WHKg+hKXcm1pQvilzML0jZpwK5PAMM4uBnnPJNIXWOYBO6I/Xg9d/tPLg8NlmmtyQCo2Eu0ybDSt+8mu+dWveAys+0LTi0MIqeP9BMzCKz8dnWH6+S8huLXwTF3m0IrqM0JLb6b71GK9SOq6sWQ22yW5vf61hXP8kH9dhIaoMZs==FaHV
|
||||
rndunix.c iQCVAwUAP9iQlzEAnp832S/7AQL/KgQA29GnvcD4Xb5qjDMBgW9THEE4+4lfex/6k+Fh0IT61OLJsWVLJ7bJpRntburw4uQm4Tf7CO8vaiDFDYhKKrzXeOF1fmdpcL8hA+fNp9I/MUOc4e9kN9+YJ9wikVa0SZj1OBfhzgcFLd1xOtulkr3ii52HLF9vhrxzkgVwvD10Bi8==2cML
|
||||
rndw32.c iQCVAwUAP9iRKDEAnp832S/7AQIuaAQA3AJr3WqnxNDsWCIdvehf8Suotthj+laX8nJsvDfFhXPKcXDpsg0wTTXSnnKgyED53+uYiMDnVRsxeWAyhKwvx1MjjlaSMMjzbH6isWTH8FaWpLgrxEkXoPeNqYf5FXpdUkcUxGX2RkQeuX/cIfiHLNE9CV0usaF2jysjBX2iERY==EEnO
|
||||
|
||||
# Helper
|
||||
bithelp.h iQCVAwUAP7ouPTEAnp832S/7AQKXggQAqjcgvihIF3WclOgw1JV2rbARw4ISIDRMFqdaNCqBRx6BwEz3UGsEIlz6+iR1sS/reqN61WvtjLb+D0+tujAkGrgQJhFLG85WtG2tB5UVoI3am1fpkwiRm+bR4rv0rGk0BYk81bC7+l4KrK9o5lVp4lCsrorlUKsd48lNmBHyAXM==mDDN
|
||||
rmd.h iQCVAwUAP7oumjEAnp832S/7AQJiJQP/V4bJwjZaYndJzV+KRnIDbl1koHuw+ZK5heMYVu8Qk4ylqv//BGyeRa3jZCcfPHI35q6HilCs2VBm8hiBMjHSqY/VPn2ZQ0yg/lt6qEvl7YjsLmyMICvjG+ncszHoq9pRvnF3vTnM18sPIioXLk8fskuM0XOCNBs0ARBAQjY9UGI==olUN
|
||||
|
||||
# Configuration
|
||||
Makefile.am iQCVAwUAQCN33TEAnp832S/7AQKFJAQAz7BDkC814q+QiuE/jnutJHR5qlgbrm3ikGbQwdRzYUscst4bCCWy3uKL/sIPGLg+JQXtF5FnsQy3s4D9BOYhp72cA9ktYK65hhi4pNm/JQ0lXkZMNfk8Go5lNzKezlWwHvkMwRXR0Fep0wPdyeaKW5BfaW2ABvgep6Bp+hHEbyg==zSyi
|
||||
$names$ iQCVAwUAQCN3EDEAnp832S/7AQJXLAP8DvHTpm5DkTF35EmzeKpi9ie59AZcZanD19ir/e/7+PaQxr2riuLHDGwFKTju+dcvvBsqrygXOC378GXVWzIF2OZwS4EdDcJ+pgojo9UpsqpKsJHouY4Ugx5cQialxba462kUn8hcihSBnMyc4LzbJ5WQ4puQuqy544d2x94+2ms==G4Ls
|
||||
@@ -0,0 +1,185 @@
|
||||
/* arcfour.c - The arcfour stream cipher
|
||||
* Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* For a description of the algorithm, see:
|
||||
* Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996.
|
||||
* ISBN 0-471-11709-9. Pages 397 ff.
|
||||
*/
|
||||
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "types.h"
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
|
||||
static const char *selftest(void);
|
||||
|
||||
typedef struct {
|
||||
byte sbox[256];
|
||||
int idx_i, idx_j;
|
||||
} ARCFOUR_context;
|
||||
|
||||
static void
|
||||
do_encrypt_stream( ARCFOUR_context *ctx,
|
||||
byte *outbuf, const byte *inbuf, size_t length )
|
||||
{
|
||||
#ifndef __i386__
|
||||
register unsigned int i = ctx->idx_i;
|
||||
register byte j = ctx->idx_j;
|
||||
register byte *sbox = ctx->sbox;
|
||||
register byte t, u;
|
||||
|
||||
while ( length-- )
|
||||
{
|
||||
i++;
|
||||
t = sbox[(byte)i];
|
||||
j += t;
|
||||
u = sbox[j];
|
||||
sbox[(byte)i] = u;
|
||||
u += t;
|
||||
sbox[j] = t;
|
||||
*outbuf++ = sbox[u] ^ *inbuf++;
|
||||
}
|
||||
|
||||
ctx->idx_i = (byte)i;
|
||||
ctx->idx_j = (byte)j;
|
||||
#else /*__i386__*/
|
||||
/* Old implementation of arcfour is faster on i386 than the version above.
|
||||
* This is because version above increases register pressure which on i386
|
||||
* would push some of the variables to memory/stack. Therefore keep this
|
||||
* version for i386 to avoid regressing performance. */
|
||||
register int i = ctx->idx_i;
|
||||
register int j = ctx->idx_j;
|
||||
register byte *sbox = ctx->sbox;
|
||||
register int t;
|
||||
|
||||
while ( length-- )
|
||||
{
|
||||
i++;
|
||||
i = i & 255; /* The and-op seems to be faster than the mod-op. */
|
||||
j += sbox[i];
|
||||
j &= 255;
|
||||
t = sbox[i]; sbox[i] = sbox[j]; sbox[j] = t;
|
||||
*outbuf++ = *inbuf++ ^ sbox[(sbox[i] + sbox[j]) & 255];
|
||||
}
|
||||
|
||||
ctx->idx_i = i;
|
||||
ctx->idx_j = j;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
encrypt_stream (void *context,
|
||||
byte *outbuf, const byte *inbuf, size_t length)
|
||||
{
|
||||
ARCFOUR_context *ctx = (ARCFOUR_context *) context;
|
||||
do_encrypt_stream (ctx, outbuf, inbuf, length );
|
||||
_gcry_burn_stack (64);
|
||||
}
|
||||
|
||||
|
||||
static gcry_err_code_t
|
||||
do_arcfour_setkey (void *context, const byte *key, unsigned int keylen)
|
||||
{
|
||||
static int initialized;
|
||||
static const char* selftest_failed;
|
||||
int i, j;
|
||||
byte karr[256];
|
||||
ARCFOUR_context *ctx = (ARCFOUR_context *) context;
|
||||
|
||||
if (!initialized )
|
||||
{
|
||||
initialized = 1;
|
||||
selftest_failed = selftest();
|
||||
if( selftest_failed )
|
||||
log_error ("ARCFOUR selftest failed (%s)\n", selftest_failed );
|
||||
}
|
||||
if( selftest_failed )
|
||||
return GPG_ERR_SELFTEST_FAILED;
|
||||
|
||||
if( keylen < 40/8 ) /* we want at least 40 bits */
|
||||
return GPG_ERR_INV_KEYLEN;
|
||||
|
||||
ctx->idx_i = ctx->idx_j = 0;
|
||||
for (i=0; i < 256; i++ )
|
||||
ctx->sbox[i] = i;
|
||||
for (i=j=0; i < 256; i++,j++ )
|
||||
{
|
||||
if (j >= keylen)
|
||||
j = 0;
|
||||
karr[i] = key[j];
|
||||
}
|
||||
for (i=j=0; i < 256; i++ )
|
||||
{
|
||||
int t;
|
||||
j = (j + ctx->sbox[i] + karr[i]) & 255;
|
||||
t = ctx->sbox[i];
|
||||
ctx->sbox[i] = ctx->sbox[j];
|
||||
ctx->sbox[j] = t;
|
||||
}
|
||||
wipememory( karr, sizeof(karr) );
|
||||
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
|
||||
static gcry_err_code_t
|
||||
arcfour_setkey ( void *context, const byte *key, unsigned int keylen )
|
||||
{
|
||||
ARCFOUR_context *ctx = (ARCFOUR_context *) context;
|
||||
gcry_err_code_t rc = do_arcfour_setkey (ctx, key, keylen );
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
static const char*
|
||||
selftest(void)
|
||||
{
|
||||
ARCFOUR_context ctx;
|
||||
byte scratch[16];
|
||||
|
||||
/* Test vector from Cryptlib labeled there: "from the
|
||||
State/Commerce Department". */
|
||||
static const byte key_1[] =
|
||||
{ 0x61, 0x8A, 0x63, 0xD2, 0xFB };
|
||||
static const byte plaintext_1[] =
|
||||
{ 0xDC, 0xEE, 0x4C, 0xF9, 0x2C };
|
||||
static const byte ciphertext_1[] =
|
||||
{ 0xF1, 0x38, 0x29, 0xC9, 0xDE };
|
||||
|
||||
arcfour_setkey( &ctx, key_1, sizeof(key_1));
|
||||
encrypt_stream( &ctx, scratch, plaintext_1, sizeof(plaintext_1));
|
||||
if ( memcmp (scratch, ciphertext_1, sizeof (ciphertext_1)))
|
||||
return "Arcfour encryption test 1 failed.";
|
||||
arcfour_setkey( &ctx, key_1, sizeof(key_1));
|
||||
encrypt_stream(&ctx, scratch, scratch, sizeof(plaintext_1)); /* decrypt */
|
||||
if ( memcmp (scratch, plaintext_1, sizeof (plaintext_1)))
|
||||
return "Arcfour decryption test 1 failed.";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
gcry_cipher_spec_t _gcry_cipher_spec_arcfour =
|
||||
{
|
||||
GCRY_CIPHER_ARCFOUR, {0, 0},
|
||||
"ARCFOUR", NULL, NULL, 1, 128, sizeof (ARCFOUR_context),
|
||||
arcfour_setkey, NULL, NULL, encrypt_stream, encrypt_stream,
|
||||
};
|
||||
@@ -0,0 +1,80 @@
|
||||
/* bithelp.h - Some bit manipulation helpers
|
||||
* Copyright (C) 1999, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifndef G10_BITHELP_H
|
||||
#define G10_BITHELP_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
|
||||
/****************
|
||||
* Rotate the 32 bit unsigned integer X by N bits left/right
|
||||
*/
|
||||
static inline u32 rol(u32 x, int n)
|
||||
{
|
||||
return ( (x << (n&(32-1))) | (x >> ((32-n)&(32-1))) );
|
||||
}
|
||||
|
||||
static inline u32 ror(u32 x, int n)
|
||||
{
|
||||
return ( (x >> (n&(32-1))) | (x << ((32-n)&(32-1))) );
|
||||
}
|
||||
|
||||
/* Byte swap for 32-bit and 64-bit integers. If available, use compiler
|
||||
provided helpers. */
|
||||
#ifdef HAVE_BUILTIN_BSWAP32
|
||||
# define _gcry_bswap32 __builtin_bswap32
|
||||
#else
|
||||
static inline u32
|
||||
_gcry_bswap32(u32 x)
|
||||
{
|
||||
return ((rol(x, 8) & 0x00ff00ffL) | (ror(x, 8) & 0xff00ff00L));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_U64_TYPEDEF
|
||||
# ifdef HAVE_BUILTIN_BSWAP64
|
||||
# define _gcry_bswap64 __builtin_bswap64
|
||||
# else
|
||||
static inline u64
|
||||
_gcry_bswap64(u64 x)
|
||||
{
|
||||
return ((u64)_gcry_bswap32(x) << 32) | (_gcry_bswap32(x >> 32));
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Endian dependent byte swap operations. */
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# define le_bswap32(x) _gcry_bswap32(x)
|
||||
# define be_bswap32(x) ((u32)(x))
|
||||
# ifdef HAVE_U64_TYPEDEF
|
||||
# define le_bswap64(x) _gcry_bswap64(x)
|
||||
# define be_bswap64(x) ((u64)(x))
|
||||
# endif
|
||||
#else
|
||||
# define le_bswap32(x) ((u32)(x))
|
||||
# define be_bswap32(x) _gcry_bswap32(x)
|
||||
# ifdef HAVE_U64_TYPEDEF
|
||||
# define le_bswap64(x) ((u64)(x))
|
||||
# define be_bswap64(x) _gcry_bswap64(x)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /*G10_BITHELP_H*/
|
||||
@@ -0,0 +1,533 @@
|
||||
/* blowfish-amd64.S - AMD64 assembly implementation of Blowfish cipher
|
||||
*
|
||||
* Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef __x86_64
|
||||
#include <config.h>
|
||||
#if defined(USE_BLOWFISH) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS)
|
||||
|
||||
.text
|
||||
|
||||
/* structure of BLOWFISH_context: */
|
||||
#define s0 0
|
||||
#define s1 ((s0) + 256 * 4)
|
||||
#define s2 ((s1) + 256 * 4)
|
||||
#define s3 ((s2) + 256 * 4)
|
||||
#define p ((s3) + 256 * 4)
|
||||
|
||||
/* register macros */
|
||||
#define CTX %rdi
|
||||
#define RIO %rsi
|
||||
|
||||
#define RX0 %rax
|
||||
#define RX1 %rbx
|
||||
#define RX2 %rcx
|
||||
#define RX3 %rdx
|
||||
|
||||
#define RX0d %eax
|
||||
#define RX1d %ebx
|
||||
#define RX2d %ecx
|
||||
#define RX3d %edx
|
||||
|
||||
#define RX0bl %al
|
||||
#define RX1bl %bl
|
||||
#define RX2bl %cl
|
||||
#define RX3bl %dl
|
||||
|
||||
#define RX0bh %ah
|
||||
#define RX1bh %bh
|
||||
#define RX2bh %ch
|
||||
#define RX3bh %dh
|
||||
|
||||
#define RT0 %rbp
|
||||
#define RT1 %rsi
|
||||
#define RT2 %r8
|
||||
#define RT3 %r9
|
||||
|
||||
#define RT0d %ebp
|
||||
#define RT1d %esi
|
||||
#define RT2d %r8d
|
||||
#define RT3d %r9d
|
||||
|
||||
#define RKEY %r10
|
||||
|
||||
/***********************************************************************
|
||||
* 1-way blowfish
|
||||
***********************************************************************/
|
||||
#define F() \
|
||||
movzbl RX0bh, RT1d; \
|
||||
movzbl RX0bl, RT3d; \
|
||||
rorq $16, RX0; \
|
||||
movzbl RX0bh, RT0d; \
|
||||
movzbl RX0bl, RT2d; \
|
||||
rorq $16, RX0; \
|
||||
movl s0(CTX,RT0,4), RT0d; \
|
||||
addl s1(CTX,RT2,4), RT0d; \
|
||||
xorl s2(CTX,RT1,4), RT0d; \
|
||||
addl s3(CTX,RT3,4), RT0d; \
|
||||
xorq RT0, RX0;
|
||||
|
||||
#define load_roundkey_enc(n) \
|
||||
movq p+4*(n)(CTX), RX3;
|
||||
|
||||
#define add_roundkey_enc() \
|
||||
xorq RX3, RX0;
|
||||
|
||||
#define round_enc(n) \
|
||||
add_roundkey_enc(); \
|
||||
load_roundkey_enc(n); \
|
||||
\
|
||||
F(); \
|
||||
F();
|
||||
|
||||
#define load_roundkey_dec(n) \
|
||||
movq p+4*(n-1)(CTX), RX3; \
|
||||
rorq $32, RX3;
|
||||
|
||||
#define add_roundkey_dec() \
|
||||
xorq RX3, RX0;
|
||||
|
||||
#define round_dec(n) \
|
||||
add_roundkey_dec(); \
|
||||
load_roundkey_dec(n); \
|
||||
\
|
||||
F(); \
|
||||
F();
|
||||
|
||||
#define read_block() \
|
||||
movq (RIO), RX0; \
|
||||
rorq $32, RX0; \
|
||||
bswapq RX0;
|
||||
|
||||
#define write_block() \
|
||||
bswapq RX0; \
|
||||
movq RX0, (RIO);
|
||||
|
||||
.align 8
|
||||
.type __blowfish_enc_blk1,@function;
|
||||
|
||||
__blowfish_enc_blk1:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* RX0: input plaintext block
|
||||
* output:
|
||||
* RX0: output plaintext block
|
||||
*/
|
||||
movq %rbp, %r11;
|
||||
|
||||
load_roundkey_enc(0);
|
||||
round_enc(2);
|
||||
round_enc(4);
|
||||
round_enc(6);
|
||||
round_enc(8);
|
||||
round_enc(10);
|
||||
round_enc(12);
|
||||
round_enc(14);
|
||||
round_enc(16);
|
||||
add_roundkey_enc();
|
||||
|
||||
movq %r11, %rbp;
|
||||
|
||||
ret;
|
||||
.size __blowfish_enc_blk1,.-__blowfish_enc_blk1;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_blowfish_amd64_do_encrypt
|
||||
.type _gcry_blowfish_amd64_do_encrypt,@function;
|
||||
|
||||
_gcry_blowfish_amd64_do_encrypt:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: u32 *ret_xl
|
||||
* %rdx: u32 *ret_xr
|
||||
*/
|
||||
movl (%rdx), RX0d;
|
||||
shlq $32, RX0;
|
||||
movl (%rsi), RT3d;
|
||||
movq %rdx, %r10;
|
||||
orq RT3, RX0;
|
||||
movq %rsi, RX2;
|
||||
|
||||
call __blowfish_enc_blk1;
|
||||
|
||||
movl RX0d, (%r10);
|
||||
shrq $32, RX0;
|
||||
movl RX0d, (RX2);
|
||||
|
||||
ret;
|
||||
.size _gcry_blowfish_amd64_do_encrypt,.-_gcry_blowfish_amd64_do_encrypt;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_blowfish_amd64_encrypt_block
|
||||
.type _gcry_blowfish_amd64_encrypt_block,@function;
|
||||
|
||||
_gcry_blowfish_amd64_encrypt_block:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst
|
||||
* %rdx: src
|
||||
*/
|
||||
|
||||
movq %rsi, %r10;
|
||||
|
||||
movq %rdx, RIO;
|
||||
read_block();
|
||||
|
||||
call __blowfish_enc_blk1;
|
||||
|
||||
movq %r10, RIO;
|
||||
write_block();
|
||||
|
||||
ret;
|
||||
.size _gcry_blowfish_amd64_encrypt_block,.-_gcry_blowfish_amd64_encrypt_block;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_blowfish_amd64_decrypt_block
|
||||
.type _gcry_blowfish_amd64_decrypt_block,@function;
|
||||
|
||||
_gcry_blowfish_amd64_decrypt_block:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst
|
||||
* %rdx: src
|
||||
*/
|
||||
movq %rbp, %r11;
|
||||
|
||||
movq %rsi, %r10;
|
||||
movq %rdx, RIO;
|
||||
|
||||
read_block();
|
||||
|
||||
load_roundkey_dec(17);
|
||||
round_dec(15);
|
||||
round_dec(13);
|
||||
round_dec(11);
|
||||
round_dec(9);
|
||||
round_dec(7);
|
||||
round_dec(5);
|
||||
round_dec(3);
|
||||
round_dec(1);
|
||||
add_roundkey_dec();
|
||||
|
||||
movq %r10, RIO;
|
||||
write_block();
|
||||
|
||||
movq %r11, %rbp;
|
||||
|
||||
ret;
|
||||
.size _gcry_blowfish_amd64_decrypt_block,.-_gcry_blowfish_amd64_decrypt_block;
|
||||
|
||||
/**********************************************************************
|
||||
4-way blowfish, four blocks parallel
|
||||
**********************************************************************/
|
||||
#define F4(x) \
|
||||
movzbl x ## bh, RT1d; \
|
||||
movzbl x ## bl, RT3d; \
|
||||
rorq $16, x; \
|
||||
movzbl x ## bh, RT0d; \
|
||||
movzbl x ## bl, RT2d; \
|
||||
rorq $16, x; \
|
||||
movl s0(CTX,RT0,4), RT0d; \
|
||||
addl s1(CTX,RT2,4), RT0d; \
|
||||
xorl s2(CTX,RT1,4), RT0d; \
|
||||
addl s3(CTX,RT3,4), RT0d; \
|
||||
xorq RT0, x;
|
||||
|
||||
#define add_preloaded_roundkey4() \
|
||||
xorq RKEY, RX0; \
|
||||
xorq RKEY, RX1; \
|
||||
xorq RKEY, RX2; \
|
||||
xorq RKEY, RX3;
|
||||
|
||||
#define preload_roundkey_enc(n) \
|
||||
movq p+4*(n)(CTX), RKEY;
|
||||
|
||||
#define add_roundkey_enc4(n) \
|
||||
add_preloaded_roundkey4(); \
|
||||
preload_roundkey_enc(n + 2);
|
||||
|
||||
#define round_enc4(n) \
|
||||
add_roundkey_enc4(n); \
|
||||
\
|
||||
F4(RX0); \
|
||||
F4(RX1); \
|
||||
F4(RX2); \
|
||||
F4(RX3); \
|
||||
\
|
||||
F4(RX0); \
|
||||
F4(RX1); \
|
||||
F4(RX2); \
|
||||
F4(RX3);
|
||||
|
||||
#define preload_roundkey_dec(n) \
|
||||
movq p+4*((n)-1)(CTX), RKEY; \
|
||||
rorq $32, RKEY;
|
||||
|
||||
#define add_roundkey_dec4(n) \
|
||||
add_preloaded_roundkey4(); \
|
||||
preload_roundkey_dec(n - 2);
|
||||
|
||||
#define round_dec4(n) \
|
||||
add_roundkey_dec4(n); \
|
||||
\
|
||||
F4(RX0); \
|
||||
F4(RX1); \
|
||||
F4(RX2); \
|
||||
F4(RX3); \
|
||||
\
|
||||
F4(RX0); \
|
||||
F4(RX1); \
|
||||
F4(RX2); \
|
||||
F4(RX3);
|
||||
|
||||
#define inbswap_block4() \
|
||||
rorq $32, RX0; \
|
||||
bswapq RX0; \
|
||||
rorq $32, RX1; \
|
||||
bswapq RX1; \
|
||||
rorq $32, RX2; \
|
||||
bswapq RX2; \
|
||||
rorq $32, RX3; \
|
||||
bswapq RX3;
|
||||
|
||||
#define inctrswap_block4() \
|
||||
rorq $32, RX0; \
|
||||
rorq $32, RX1; \
|
||||
rorq $32, RX2; \
|
||||
rorq $32, RX3;
|
||||
|
||||
#define outbswap_block4() \
|
||||
bswapq RX0; \
|
||||
bswapq RX1; \
|
||||
bswapq RX2; \
|
||||
bswapq RX3;
|
||||
|
||||
.align 8
|
||||
.type __blowfish_enc_blk4,@function;
|
||||
|
||||
__blowfish_enc_blk4:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* RX0,RX1,RX2,RX3: four input inbswapped plaintext blocks
|
||||
* output:
|
||||
* RX0,RX1,RX2,RX3: four output ciphertext blocks
|
||||
*/
|
||||
preload_roundkey_enc(0);
|
||||
|
||||
round_enc4(0);
|
||||
round_enc4(2);
|
||||
round_enc4(4);
|
||||
round_enc4(6);
|
||||
round_enc4(8);
|
||||
round_enc4(10);
|
||||
round_enc4(12);
|
||||
round_enc4(14);
|
||||
add_preloaded_roundkey4();
|
||||
|
||||
outbswap_block4();
|
||||
|
||||
ret;
|
||||
.size __blowfish_enc_blk4,.-__blowfish_enc_blk4;
|
||||
|
||||
.align 8
|
||||
.type __blowfish_dec_blk4,@function;
|
||||
|
||||
__blowfish_dec_blk4:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* RX0,RX1,RX2,RX3: four input ciphertext blocks
|
||||
* output:
|
||||
* RX0,RX1,RX2,RX3: four output plaintext blocks
|
||||
*/
|
||||
preload_roundkey_dec(17);
|
||||
|
||||
inbswap_block4();
|
||||
|
||||
round_dec4(17);
|
||||
round_dec4(15);
|
||||
round_dec4(13);
|
||||
round_dec4(11);
|
||||
round_dec4(9);
|
||||
round_dec4(7);
|
||||
round_dec4(5);
|
||||
round_dec4(3);
|
||||
add_preloaded_roundkey4();
|
||||
|
||||
outbswap_block4();
|
||||
|
||||
ret;
|
||||
.size __blowfish_dec_blk4,.-__blowfish_dec_blk4;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_blowfish_amd64_ctr_enc
|
||||
.type _gcry_blowfish_amd64_ctr_enc,@function;
|
||||
_gcry_blowfish_amd64_ctr_enc:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst (4 blocks)
|
||||
* %rdx: src (4 blocks)
|
||||
* %rcx: iv (big endian, 64bit)
|
||||
*/
|
||||
pushq %rbp;
|
||||
pushq %rbx;
|
||||
pushq %r12;
|
||||
pushq %r13;
|
||||
|
||||
/* %r11-%r13 are not used by __blowfish_enc_blk4 */
|
||||
movq %rcx, %r13; /*iv*/
|
||||
movq %rdx, %r12; /*src*/
|
||||
movq %rsi, %r11; /*dst*/
|
||||
|
||||
/* load IV and byteswap */
|
||||
movq (%r13), RT0;
|
||||
bswapq RT0;
|
||||
movq RT0, RX0;
|
||||
|
||||
/* construct IVs */
|
||||
leaq 1(RT0), RX1;
|
||||
leaq 2(RT0), RX2;
|
||||
leaq 3(RT0), RX3;
|
||||
leaq 4(RT0), RT0;
|
||||
bswapq RT0;
|
||||
|
||||
inctrswap_block4();
|
||||
|
||||
/* store new IV */
|
||||
movq RT0, (%r13);
|
||||
|
||||
call __blowfish_enc_blk4;
|
||||
|
||||
/* XOR key-stream with plaintext */
|
||||
xorq 0 * 8(%r12), RX0;
|
||||
xorq 1 * 8(%r12), RX1;
|
||||
xorq 2 * 8(%r12), RX2;
|
||||
xorq 3 * 8(%r12), RX3;
|
||||
movq RX0, 0 * 8(%r11);
|
||||
movq RX1, 1 * 8(%r11);
|
||||
movq RX2, 2 * 8(%r11);
|
||||
movq RX3, 3 * 8(%r11);
|
||||
|
||||
popq %r13;
|
||||
popq %r12;
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
|
||||
ret;
|
||||
.size _gcry_blowfish_amd64_ctr_enc,.-_gcry_blowfish_amd64_ctr_enc;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_blowfish_amd64_cbc_dec
|
||||
.type _gcry_blowfish_amd64_cbc_dec,@function;
|
||||
_gcry_blowfish_amd64_cbc_dec:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst (4 blocks)
|
||||
* %rdx: src (4 blocks)
|
||||
* %rcx: iv (64bit)
|
||||
*/
|
||||
pushq %rbp;
|
||||
pushq %rbx;
|
||||
pushq %r12;
|
||||
pushq %r13;
|
||||
|
||||
/* %r11-%r13 are not used by __blowfish_dec_blk4 */
|
||||
movq %rsi, %r11; /*dst*/
|
||||
movq %rdx, %r12; /*src*/
|
||||
movq %rcx, %r13; /*iv*/
|
||||
|
||||
/* load input */
|
||||
movq 0 * 8(%r12), RX0;
|
||||
movq 1 * 8(%r12), RX1;
|
||||
movq 2 * 8(%r12), RX2;
|
||||
movq 3 * 8(%r12), RX3;
|
||||
|
||||
call __blowfish_dec_blk4;
|
||||
|
||||
movq 3 * 8(%r12), RT0;
|
||||
xorq (%r13), RX0;
|
||||
xorq 0 * 8(%r12), RX1;
|
||||
xorq 1 * 8(%r12), RX2;
|
||||
xorq 2 * 8(%r12), RX3;
|
||||
movq RT0, (%r13); /* store new IV */
|
||||
|
||||
movq RX0, 0 * 8(%r11);
|
||||
movq RX1, 1 * 8(%r11);
|
||||
movq RX2, 2 * 8(%r11);
|
||||
movq RX3, 3 * 8(%r11);
|
||||
|
||||
popq %r13;
|
||||
popq %r12;
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
|
||||
ret;
|
||||
.size _gcry_blowfish_amd64_cbc_dec,.-_gcry_blowfish_amd64_cbc_dec;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_blowfish_amd64_cfb_dec
|
||||
.type _gcry_blowfish_amd64_cfb_dec,@function;
|
||||
_gcry_blowfish_amd64_cfb_dec:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst (4 blocks)
|
||||
* %rdx: src (4 blocks)
|
||||
* %rcx: iv (64bit)
|
||||
*/
|
||||
pushq %rbp;
|
||||
pushq %rbx;
|
||||
pushq %r12;
|
||||
pushq %r13;
|
||||
|
||||
/* %r11-%r13 are not used by __blowfish_enc_blk4 */
|
||||
movq %rcx, %r13; /*iv*/
|
||||
movq %rdx, %r12; /*src*/
|
||||
movq %rsi, %r11; /*dst*/
|
||||
|
||||
/* Load input */
|
||||
movq (%r13), RX0;
|
||||
movq 0 * 8(%r12), RX1;
|
||||
movq 1 * 8(%r12), RX2;
|
||||
movq 2 * 8(%r12), RX3;
|
||||
|
||||
inbswap_block4();
|
||||
|
||||
/* Update IV */
|
||||
movq 3 * 8(%r12), RT0;
|
||||
movq RT0, (%r13);
|
||||
|
||||
call __blowfish_enc_blk4;
|
||||
|
||||
xorq 0 * 8(%r12), RX0;
|
||||
xorq 1 * 8(%r12), RX1;
|
||||
xorq 2 * 8(%r12), RX2;
|
||||
xorq 3 * 8(%r12), RX3;
|
||||
movq RX0, 0 * 8(%r11);
|
||||
movq RX1, 1 * 8(%r11);
|
||||
movq RX2, 2 * 8(%r11);
|
||||
movq RX3, 3 * 8(%r11);
|
||||
|
||||
popq %r13;
|
||||
popq %r12;
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
ret;
|
||||
.size _gcry_blowfish_amd64_cfb_dec,.-_gcry_blowfish_amd64_cfb_dec;
|
||||
|
||||
#endif /*defined(USE_BLOWFISH)*/
|
||||
#endif /*__x86_64*/
|
||||
@@ -0,0 +1,743 @@
|
||||
/* blowfish-arm.S - ARM assembly implementation of Blowfish cipher
|
||||
*
|
||||
* Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if defined(__ARMEL__)
|
||||
#ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS
|
||||
|
||||
.text
|
||||
|
||||
.syntax unified
|
||||
.arm
|
||||
|
||||
/* structure of crypto context */
|
||||
#define s0 0
|
||||
#define s1 (s0 + (1 * 256) * 4)
|
||||
#define s2 (s0 + (2 * 256) * 4)
|
||||
#define s3 (s0 + (3 * 256) * 4)
|
||||
#define p (s3 + (1 * 256) * 4)
|
||||
|
||||
/* register macros */
|
||||
#define CTXs0 %r0
|
||||
#define CTXs1 %r9
|
||||
#define CTXs2 %r8
|
||||
#define CTXs3 %r10
|
||||
#define RMASK %lr
|
||||
#define RKEYL %r2
|
||||
#define RKEYR %ip
|
||||
|
||||
#define RL0 %r3
|
||||
#define RR0 %r4
|
||||
|
||||
#define RL1 %r9
|
||||
#define RR1 %r10
|
||||
|
||||
#define RT0 %r11
|
||||
#define RT1 %r7
|
||||
#define RT2 %r5
|
||||
#define RT3 %r6
|
||||
|
||||
/* helper macros */
|
||||
#define ldr_unaligned_le(rout, rsrc, offs, rtmp) \
|
||||
ldrb rout, [rsrc, #((offs) + 0)]; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 1)]; \
|
||||
orr rout, rout, rtmp, lsl #8; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 2)]; \
|
||||
orr rout, rout, rtmp, lsl #16; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 3)]; \
|
||||
orr rout, rout, rtmp, lsl #24;
|
||||
|
||||
#define str_unaligned_le(rin, rdst, offs, rtmp0, rtmp1) \
|
||||
mov rtmp0, rin, lsr #8; \
|
||||
strb rin, [rdst, #((offs) + 0)]; \
|
||||
mov rtmp1, rin, lsr #16; \
|
||||
strb rtmp0, [rdst, #((offs) + 1)]; \
|
||||
mov rtmp0, rin, lsr #24; \
|
||||
strb rtmp1, [rdst, #((offs) + 2)]; \
|
||||
strb rtmp0, [rdst, #((offs) + 3)];
|
||||
|
||||
#define ldr_unaligned_be(rout, rsrc, offs, rtmp) \
|
||||
ldrb rout, [rsrc, #((offs) + 3)]; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 2)]; \
|
||||
orr rout, rout, rtmp, lsl #8; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 1)]; \
|
||||
orr rout, rout, rtmp, lsl #16; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 0)]; \
|
||||
orr rout, rout, rtmp, lsl #24;
|
||||
|
||||
#define str_unaligned_be(rin, rdst, offs, rtmp0, rtmp1) \
|
||||
mov rtmp0, rin, lsr #8; \
|
||||
strb rin, [rdst, #((offs) + 3)]; \
|
||||
mov rtmp1, rin, lsr #16; \
|
||||
strb rtmp0, [rdst, #((offs) + 2)]; \
|
||||
mov rtmp0, rin, lsr #24; \
|
||||
strb rtmp1, [rdst, #((offs) + 1)]; \
|
||||
strb rtmp0, [rdst, #((offs) + 0)];
|
||||
|
||||
#ifdef __ARMEL__
|
||||
#define ldr_unaligned_host ldr_unaligned_le
|
||||
#define str_unaligned_host str_unaligned_le
|
||||
|
||||
/* bswap on little-endian */
|
||||
#ifdef HAVE_ARM_ARCH_V6
|
||||
#define host_to_be(reg, rtmp) \
|
||||
rev reg, reg;
|
||||
#define be_to_host(reg, rtmp) \
|
||||
rev reg, reg;
|
||||
#else
|
||||
#define host_to_be(reg, rtmp) \
|
||||
eor rtmp, reg, reg, ror #16; \
|
||||
mov rtmp, rtmp, lsr #8; \
|
||||
bic rtmp, rtmp, #65280; \
|
||||
eor reg, rtmp, reg, ror #8;
|
||||
#define be_to_host(reg, rtmp) \
|
||||
eor rtmp, reg, reg, ror #16; \
|
||||
mov rtmp, rtmp, lsr #8; \
|
||||
bic rtmp, rtmp, #65280; \
|
||||
eor reg, rtmp, reg, ror #8;
|
||||
#endif
|
||||
#else
|
||||
#define ldr_unaligned_host ldr_unaligned_be
|
||||
#define str_unaligned_host str_unaligned_be
|
||||
|
||||
/* nop on big-endian */
|
||||
#define host_to_be(reg, rtmp) /*_*/
|
||||
#define be_to_host(reg, rtmp) /*_*/
|
||||
#endif
|
||||
|
||||
#define host_to_host(x, y) /*_*/
|
||||
|
||||
/***********************************************************************
|
||||
* 1-way blowfish
|
||||
***********************************************************************/
|
||||
#define F(l, r) \
|
||||
and RT0, RMASK, l, lsr#(24 - 2); \
|
||||
and RT1, RMASK, l, lsr#(16 - 2); \
|
||||
ldr RT0, [CTXs0, RT0]; \
|
||||
and RT2, RMASK, l, lsr#(8 - 2); \
|
||||
ldr RT1, [CTXs1, RT1]; \
|
||||
and RT3, RMASK, l, lsl#2; \
|
||||
ldr RT2, [CTXs2, RT2]; \
|
||||
add RT0, RT1; \
|
||||
ldr RT3, [CTXs3, RT3]; \
|
||||
eor RT0, RT2; \
|
||||
add RT0, RT3; \
|
||||
eor r, RT0;
|
||||
|
||||
#define load_roundkey_enc(n) \
|
||||
ldr RKEYL, [CTXs2, #((p - s2) + (4 * (n) + 0))]; \
|
||||
ldr RKEYR, [CTXs2, #((p - s2) + (4 * (n) + 4))];
|
||||
|
||||
#define add_roundkey_enc() \
|
||||
eor RL0, RKEYL; \
|
||||
eor RR0, RKEYR;
|
||||
|
||||
#define round_enc(n) \
|
||||
add_roundkey_enc(); \
|
||||
load_roundkey_enc(n); \
|
||||
\
|
||||
F(RL0, RR0); \
|
||||
F(RR0, RL0);
|
||||
|
||||
#define load_roundkey_dec(n) \
|
||||
ldr RKEYL, [CTXs2, #((p - s2) + (4 * ((n) - 1) + 4))]; \
|
||||
ldr RKEYR, [CTXs2, #((p - s2) + (4 * ((n) - 1) + 0))];
|
||||
|
||||
#define add_roundkey_dec() \
|
||||
eor RL0, RKEYL; \
|
||||
eor RR0, RKEYR;
|
||||
|
||||
#define round_dec(n) \
|
||||
add_roundkey_dec(); \
|
||||
load_roundkey_dec(n); \
|
||||
\
|
||||
F(RL0, RR0); \
|
||||
F(RR0, RL0);
|
||||
|
||||
#define read_block_aligned(rin, offs, l0, r0, convert, rtmp) \
|
||||
ldr l0, [rin, #((offs) + 0)]; \
|
||||
ldr r0, [rin, #((offs) + 4)]; \
|
||||
convert(l0, rtmp); \
|
||||
convert(r0, rtmp);
|
||||
|
||||
#define write_block_aligned(rout, offs, l0, r0, convert, rtmp) \
|
||||
convert(l0, rtmp); \
|
||||
convert(r0, rtmp); \
|
||||
str l0, [rout, #((offs) + 0)]; \
|
||||
str r0, [rout, #((offs) + 4)];
|
||||
|
||||
#ifdef __ARM_FEATURE_UNALIGNED
|
||||
/* unaligned word reads allowed */
|
||||
#define read_block(rin, offs, l0, r0, rtmp0) \
|
||||
read_block_aligned(rin, offs, l0, r0, host_to_be, rtmp0)
|
||||
|
||||
#define write_block(rout, offs, r0, l0, rtmp0, rtmp1) \
|
||||
write_block_aligned(rout, offs, r0, l0, be_to_host, rtmp0)
|
||||
|
||||
#define read_block_host(rin, offs, l0, r0, rtmp0) \
|
||||
read_block_aligned(rin, offs, l0, r0, host_to_host, rtmp0)
|
||||
|
||||
#define write_block_host(rout, offs, r0, l0, rtmp0, rtmp1) \
|
||||
write_block_aligned(rout, offs, r0, l0, host_to_host, rtmp0)
|
||||
#else
|
||||
/* need to handle unaligned reads by byte reads */
|
||||
#define read_block(rin, offs, l0, r0, rtmp0) \
|
||||
tst rin, #3; \
|
||||
beq 1f; \
|
||||
ldr_unaligned_be(l0, rin, (offs) + 0, rtmp0); \
|
||||
ldr_unaligned_be(r0, rin, (offs) + 4, rtmp0); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
read_block_aligned(rin, offs, l0, r0, host_to_be, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define write_block(rout, offs, l0, r0, rtmp0, rtmp1) \
|
||||
tst rout, #3; \
|
||||
beq 1f; \
|
||||
str_unaligned_be(l0, rout, (offs) + 0, rtmp0, rtmp1); \
|
||||
str_unaligned_be(r0, rout, (offs) + 4, rtmp0, rtmp1); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
write_block_aligned(rout, offs, l0, r0, be_to_host, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define read_block_host(rin, offs, l0, r0, rtmp0) \
|
||||
tst rin, #3; \
|
||||
beq 1f; \
|
||||
ldr_unaligned_host(l0, rin, (offs) + 0, rtmp0); \
|
||||
ldr_unaligned_host(r0, rin, (offs) + 4, rtmp0); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
read_block_aligned(rin, offs, l0, r0, host_to_host, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define write_block_host(rout, offs, l0, r0, rtmp0, rtmp1) \
|
||||
tst rout, #3; \
|
||||
beq 1f; \
|
||||
str_unaligned_host(l0, rout, (offs) + 0, rtmp0, rtmp1); \
|
||||
str_unaligned_host(r0, rout, (offs) + 4, rtmp0, rtmp1); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
write_block_aligned(rout, offs, l0, r0, host_to_host); \
|
||||
2:;
|
||||
#endif
|
||||
|
||||
.align 3
|
||||
.type __blowfish_enc_blk1,%function;
|
||||
|
||||
__blowfish_enc_blk1:
|
||||
/* input:
|
||||
* preloaded: CTX
|
||||
* [RL0, RR0]: src
|
||||
* output:
|
||||
* [RR0, RL0]: dst
|
||||
*/
|
||||
push {%lr};
|
||||
|
||||
add CTXs1, CTXs0, #(s1 - s0);
|
||||
add CTXs2, CTXs0, #(s2 - s0);
|
||||
mov RMASK, #(0xff << 2); /* byte mask */
|
||||
add CTXs3, CTXs1, #(s3 - s1);
|
||||
|
||||
load_roundkey_enc(0);
|
||||
round_enc(2);
|
||||
round_enc(4);
|
||||
round_enc(6);
|
||||
round_enc(8);
|
||||
round_enc(10);
|
||||
round_enc(12);
|
||||
round_enc(14);
|
||||
round_enc(16);
|
||||
add_roundkey_enc();
|
||||
|
||||
pop {%pc};
|
||||
.size __blowfish_enc_blk1,.-__blowfish_enc_blk1;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_blowfish_arm_do_encrypt
|
||||
.type _gcry_blowfish_arm_do_encrypt,%function;
|
||||
|
||||
_gcry_blowfish_arm_do_encrypt:
|
||||
/* input:
|
||||
* %r0: ctx, CTX
|
||||
* %r1: u32 *ret_xl
|
||||
* %r2: u32 *ret_xr
|
||||
*/
|
||||
push {%r2, %r4-%r11, %ip, %lr};
|
||||
|
||||
ldr RL0, [%r1];
|
||||
ldr RR0, [%r2];
|
||||
|
||||
bl __blowfish_enc_blk1;
|
||||
|
||||
pop {%r2};
|
||||
str RR0, [%r1];
|
||||
str RL0, [%r2];
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.size _gcry_blowfish_arm_do_encrypt,.-_gcry_blowfish_arm_do_encrypt;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_blowfish_arm_encrypt_block
|
||||
.type _gcry_blowfish_arm_encrypt_block,%function;
|
||||
|
||||
_gcry_blowfish_arm_encrypt_block:
|
||||
/* input:
|
||||
* %r0: ctx, CTX
|
||||
* %r1: dst
|
||||
* %r2: src
|
||||
*/
|
||||
push {%r4-%r11, %ip, %lr};
|
||||
|
||||
read_block(%r2, 0, RL0, RR0, RT0);
|
||||
|
||||
bl __blowfish_enc_blk1;
|
||||
|
||||
write_block(%r1, 0, RR0, RL0, RT0, RT1);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.size _gcry_blowfish_arm_encrypt_block,.-_gcry_blowfish_arm_encrypt_block;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_blowfish_arm_decrypt_block
|
||||
.type _gcry_blowfish_arm_decrypt_block,%function;
|
||||
|
||||
_gcry_blowfish_arm_decrypt_block:
|
||||
/* input:
|
||||
* %r0: ctx, CTX
|
||||
* %r1: dst
|
||||
* %r2: src
|
||||
*/
|
||||
push {%r4-%r11, %ip, %lr};
|
||||
|
||||
add CTXs1, CTXs0, #(s1 - s0);
|
||||
add CTXs2, CTXs0, #(s2 - s0);
|
||||
mov RMASK, #(0xff << 2); /* byte mask */
|
||||
add CTXs3, CTXs1, #(s3 - s1);
|
||||
|
||||
read_block(%r2, 0, RL0, RR0, RT0);
|
||||
|
||||
load_roundkey_dec(17);
|
||||
round_dec(15);
|
||||
round_dec(13);
|
||||
round_dec(11);
|
||||
round_dec(9);
|
||||
round_dec(7);
|
||||
round_dec(5);
|
||||
round_dec(3);
|
||||
round_dec(1);
|
||||
add_roundkey_dec();
|
||||
|
||||
write_block(%r1, 0, RR0, RL0, RT0, RT1);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.size _gcry_blowfish_arm_decrypt_block,.-_gcry_blowfish_arm_decrypt_block;
|
||||
|
||||
/***********************************************************************
|
||||
* 2-way blowfish
|
||||
***********************************************************************/
|
||||
#define F2(n, l0, r0, l1, r1, set_nextk, dec) \
|
||||
\
|
||||
and RT0, RMASK, l0, lsr#(24 - 2); \
|
||||
and RT1, RMASK, l0, lsr#(16 - 2); \
|
||||
and RT2, RMASK, l0, lsr#(8 - 2); \
|
||||
add RT1, #(s1 - s0); \
|
||||
\
|
||||
ldr RT0, [CTXs0, RT0]; \
|
||||
and RT3, RMASK, l0, lsl#2; \
|
||||
ldr RT1, [CTXs0, RT1]; \
|
||||
add RT3, #(s3 - s2); \
|
||||
ldr RT2, [CTXs2, RT2]; \
|
||||
add RT0, RT1; \
|
||||
ldr RT3, [CTXs2, RT3]; \
|
||||
\
|
||||
and RT1, RMASK, l1, lsr#(24 - 2); \
|
||||
eor RT0, RT2; \
|
||||
and RT2, RMASK, l1, lsr#(16 - 2); \
|
||||
add RT0, RT3; \
|
||||
add RT2, #(s1 - s0); \
|
||||
and RT3, RMASK, l1, lsr#(8 - 2); \
|
||||
eor r0, RT0; \
|
||||
\
|
||||
ldr RT1, [CTXs0, RT1]; \
|
||||
and RT0, RMASK, l1, lsl#2; \
|
||||
ldr RT2, [CTXs0, RT2]; \
|
||||
add RT0, #(s3 - s2); \
|
||||
ldr RT3, [CTXs2, RT3]; \
|
||||
add RT1, RT2; \
|
||||
ldr RT0, [CTXs2, RT0]; \
|
||||
\
|
||||
and RT2, RMASK, r0, lsr#(24 - 2); \
|
||||
eor RT1, RT3; \
|
||||
and RT3, RMASK, r0, lsr#(16 - 2); \
|
||||
add RT1, RT0; \
|
||||
add RT3, #(s1 - s0); \
|
||||
and RT0, RMASK, r0, lsr#(8 - 2); \
|
||||
eor r1, RT1; \
|
||||
\
|
||||
ldr RT2, [CTXs0, RT2]; \
|
||||
and RT1, RMASK, r0, lsl#2; \
|
||||
ldr RT3, [CTXs0, RT3]; \
|
||||
add RT1, #(s3 - s2); \
|
||||
ldr RT0, [CTXs2, RT0]; \
|
||||
add RT2, RT3; \
|
||||
ldr RT1, [CTXs2, RT1]; \
|
||||
\
|
||||
and RT3, RMASK, r1, lsr#(24 - 2); \
|
||||
eor RT2, RT0; \
|
||||
and RT0, RMASK, r1, lsr#(16 - 2); \
|
||||
add RT2, RT1; \
|
||||
add RT0, #(s1 - s0); \
|
||||
and RT1, RMASK, r1, lsr#(8 - 2); \
|
||||
eor l0, RT2; \
|
||||
\
|
||||
ldr RT3, [CTXs0, RT3]; \
|
||||
and RT2, RMASK, r1, lsl#2; \
|
||||
ldr RT0, [CTXs0, RT0]; \
|
||||
add RT2, #(s3 - s2); \
|
||||
ldr RT1, [CTXs2, RT1]; \
|
||||
eor l1, RKEYL; \
|
||||
ldr RT2, [CTXs2, RT2]; \
|
||||
\
|
||||
eor r0, RKEYR; \
|
||||
add RT3, RT0; \
|
||||
eor r1, RKEYR; \
|
||||
eor RT3, RT1; \
|
||||
eor l0, RKEYL; \
|
||||
add RT3, RT2; \
|
||||
set_nextk(RKEYL, (p - s2) + (4 * (n) + ((dec) * 4))); \
|
||||
eor l1, RT3; \
|
||||
set_nextk(RKEYR, (p - s2) + (4 * (n) + (!(dec) * 4)));
|
||||
|
||||
#define load_n_add_roundkey_enc2(n) \
|
||||
load_roundkey_enc(n); \
|
||||
eor RL0, RKEYL; \
|
||||
eor RR0, RKEYR; \
|
||||
eor RL1, RKEYL; \
|
||||
eor RR1, RKEYR; \
|
||||
load_roundkey_enc((n) + 2);
|
||||
|
||||
#define next_key(reg, offs) \
|
||||
ldr reg, [CTXs2, #(offs)];
|
||||
|
||||
#define dummy(x, y) /* do nothing */
|
||||
|
||||
#define round_enc2(n, load_next_key) \
|
||||
F2((n) + 2, RL0, RR0, RL1, RR1, load_next_key, 0);
|
||||
|
||||
#define load_n_add_roundkey_dec2(n) \
|
||||
load_roundkey_dec(n); \
|
||||
eor RL0, RKEYL; \
|
||||
eor RR0, RKEYR; \
|
||||
eor RL1, RKEYL; \
|
||||
eor RR1, RKEYR; \
|
||||
load_roundkey_dec((n) - 2);
|
||||
|
||||
#define round_dec2(n, load_next_key) \
|
||||
F2((n) - 3, RL0, RR0, RL1, RR1, load_next_key, 1);
|
||||
|
||||
#define read_block2_aligned(rin, l0, r0, l1, r1, convert, rtmp) \
|
||||
ldr l0, [rin, #(0)]; \
|
||||
ldr r0, [rin, #(4)]; \
|
||||
convert(l0, rtmp); \
|
||||
ldr l1, [rin, #(8)]; \
|
||||
convert(r0, rtmp); \
|
||||
ldr r1, [rin, #(12)]; \
|
||||
convert(l1, rtmp); \
|
||||
convert(r1, rtmp);
|
||||
|
||||
#define write_block2_aligned(rout, l0, r0, l1, r1, convert, rtmp) \
|
||||
convert(l0, rtmp); \
|
||||
convert(r0, rtmp); \
|
||||
convert(l1, rtmp); \
|
||||
str l0, [rout, #(0)]; \
|
||||
convert(r1, rtmp); \
|
||||
str r0, [rout, #(4)]; \
|
||||
str l1, [rout, #(8)]; \
|
||||
str r1, [rout, #(12)];
|
||||
|
||||
#ifdef __ARM_FEATURE_UNALIGNED
|
||||
/* unaligned word reads allowed */
|
||||
#define read_block2(rin, l0, r0, l1, r1, rtmp0) \
|
||||
read_block2_aligned(rin, l0, r0, l1, r1, host_to_be, rtmp0)
|
||||
|
||||
#define write_block2(rout, l0, r0, l1, r1, rtmp0, rtmp1) \
|
||||
write_block2_aligned(rout, l0, r0, l1, r1, be_to_host, rtmp0)
|
||||
|
||||
#define read_block2_host(rin, l0, r0, l1, r1, rtmp0) \
|
||||
read_block2_aligned(rin, l0, r0, l1, r1, host_to_host, rtmp0)
|
||||
|
||||
#define write_block2_host(rout, l0, r0, l1, r1, rtmp0, rtmp1) \
|
||||
write_block2_aligned(rout, l0, r0, l1, r1, host_to_host, rtmp0)
|
||||
#else
|
||||
/* need to handle unaligned reads by byte reads */
|
||||
#define read_block2(rin, l0, r0, l1, r1, rtmp0) \
|
||||
tst rin, #3; \
|
||||
beq 1f; \
|
||||
ldr_unaligned_be(l0, rin, 0, rtmp0); \
|
||||
ldr_unaligned_be(r0, rin, 4, rtmp0); \
|
||||
ldr_unaligned_be(l1, rin, 8, rtmp0); \
|
||||
ldr_unaligned_be(r1, rin, 12, rtmp0); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
read_block2_aligned(rin, l0, r0, l1, r1, host_to_be, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define write_block2(rout, l0, r0, l1, r1, rtmp0, rtmp1) \
|
||||
tst rout, #3; \
|
||||
beq 1f; \
|
||||
str_unaligned_be(l0, rout, 0, rtmp0, rtmp1); \
|
||||
str_unaligned_be(r0, rout, 4, rtmp0, rtmp1); \
|
||||
str_unaligned_be(l1, rout, 8, rtmp0, rtmp1); \
|
||||
str_unaligned_be(r1, rout, 12, rtmp0, rtmp1); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
write_block2_aligned(rout, l0, r0, l1, r1, be_to_host, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define read_block2_host(rin, l0, r0, l1, r1, rtmp0) \
|
||||
tst rin, #3; \
|
||||
beq 1f; \
|
||||
ldr_unaligned_host(l0, rin, 0, rtmp0); \
|
||||
ldr_unaligned_host(r0, rin, 4, rtmp0); \
|
||||
ldr_unaligned_host(l1, rin, 8, rtmp0); \
|
||||
ldr_unaligned_host(r1, rin, 12, rtmp0); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
read_block2_aligned(rin, l0, r0, l1, r1, host_to_host, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define write_block2_host(rout, l0, r0, l1, r1, rtmp0, rtmp1) \
|
||||
tst rout, #3; \
|
||||
beq 1f; \
|
||||
str_unaligned_host(l0, rout, 0, rtmp0, rtmp1); \
|
||||
str_unaligned_host(r0, rout, 4, rtmp0, rtmp1); \
|
||||
str_unaligned_host(l1, rout, 8, rtmp0, rtmp1); \
|
||||
str_unaligned_host(r1, rout, 12, rtmp0, rtmp1); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
write_block2_aligned(rout, l0, r0, l1, r1, host_to_host, rtmp0); \
|
||||
2:;
|
||||
#endif
|
||||
|
||||
.align 3
|
||||
.type _gcry_blowfish_arm_enc_blk2,%function;
|
||||
|
||||
_gcry_blowfish_arm_enc_blk2:
|
||||
/* input:
|
||||
* preloaded: CTX
|
||||
* [RL0, RR0], [RL1, RR1]: src
|
||||
* output:
|
||||
* [RR0, RL0], [RR1, RL1]: dst
|
||||
*/
|
||||
push {RT0,%lr};
|
||||
|
||||
add CTXs2, CTXs0, #(s2 - s0);
|
||||
mov RMASK, #(0xff << 2); /* byte mask */
|
||||
|
||||
load_n_add_roundkey_enc2(0);
|
||||
round_enc2(2, next_key);
|
||||
round_enc2(4, next_key);
|
||||
round_enc2(6, next_key);
|
||||
round_enc2(8, next_key);
|
||||
round_enc2(10, next_key);
|
||||
round_enc2(12, next_key);
|
||||
round_enc2(14, next_key);
|
||||
round_enc2(16, dummy);
|
||||
|
||||
host_to_be(RR0, RT0);
|
||||
host_to_be(RL0, RT0);
|
||||
host_to_be(RR1, RT0);
|
||||
host_to_be(RL1, RT0);
|
||||
|
||||
pop {RT0,%pc};
|
||||
.size _gcry_blowfish_arm_enc_blk2,.-_gcry_blowfish_arm_enc_blk2;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_blowfish_arm_cfb_dec;
|
||||
.type _gcry_blowfish_arm_cfb_dec,%function;
|
||||
|
||||
_gcry_blowfish_arm_cfb_dec:
|
||||
/* input:
|
||||
* %r0: CTX
|
||||
* %r1: dst (2 blocks)
|
||||
* %r2: src (2 blocks)
|
||||
* %r3: iv (64bit)
|
||||
*/
|
||||
push {%r2, %r4-%r11, %ip, %lr};
|
||||
|
||||
mov %lr, %r3;
|
||||
|
||||
/* Load input (iv/%r3 is aligned, src/%r2 might not be) */
|
||||
ldm %r3, {RL0, RR0};
|
||||
host_to_be(RL0, RT0);
|
||||
host_to_be(RR0, RT0);
|
||||
read_block(%r2, 0, RL1, RR1, RT0);
|
||||
|
||||
/* Update IV, load src[1] and save to iv[0] */
|
||||
read_block_host(%r2, 8, %r5, %r6, RT0);
|
||||
stm %lr, {%r5, %r6};
|
||||
|
||||
bl _gcry_blowfish_arm_enc_blk2;
|
||||
/* result in RR0:RL0, RR1:RL1 = %r4:%r3, %r10:%r9 */
|
||||
|
||||
/* %r1: dst, %r0: %src */
|
||||
pop {%r0};
|
||||
|
||||
/* dst = src ^ result */
|
||||
read_block2_host(%r0, %r5, %r6, %r7, %r8, %lr);
|
||||
eor %r5, %r4;
|
||||
eor %r6, %r3;
|
||||
eor %r7, %r10;
|
||||
eor %r8, %r9;
|
||||
write_block2_host(%r1, %r5, %r6, %r7, %r8, %r9, %r10);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
.size _gcry_blowfish_arm_cfb_dec,.-_gcry_blowfish_arm_cfb_dec;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_blowfish_arm_ctr_enc;
|
||||
.type _gcry_blowfish_arm_ctr_enc,%function;
|
||||
|
||||
_gcry_blowfish_arm_ctr_enc:
|
||||
/* input:
|
||||
* %r0: CTX
|
||||
* %r1: dst (2 blocks)
|
||||
* %r2: src (2 blocks)
|
||||
* %r3: iv (64bit, big-endian)
|
||||
*/
|
||||
push {%r2, %r4-%r11, %ip, %lr};
|
||||
|
||||
mov %lr, %r3;
|
||||
|
||||
/* Load IV (big => host endian) */
|
||||
read_block_aligned(%lr, 0, RL0, RR0, be_to_host, RT0);
|
||||
|
||||
/* Construct IVs */
|
||||
adds RR1, RR0, #1; /* +1 */
|
||||
adc RL1, RL0, #0;
|
||||
adds %r6, RR1, #1; /* +2 */
|
||||
adc %r5, RL1, #0;
|
||||
|
||||
/* Store new IV (host => big-endian) */
|
||||
write_block_aligned(%lr, 0, %r5, %r6, host_to_be, RT0);
|
||||
|
||||
bl _gcry_blowfish_arm_enc_blk2;
|
||||
/* result in RR0:RL0, RR1:RL1 = %r4:%r3, %r10:%r9 */
|
||||
|
||||
/* %r1: dst, %r0: %src */
|
||||
pop {%r0};
|
||||
|
||||
/* XOR key-stream with plaintext */
|
||||
read_block2_host(%r0, %r5, %r6, %r7, %r8, %lr);
|
||||
eor %r5, %r4;
|
||||
eor %r6, %r3;
|
||||
eor %r7, %r10;
|
||||
eor %r8, %r9;
|
||||
write_block2_host(%r1, %r5, %r6, %r7, %r8, %r9, %r10);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
.size _gcry_blowfish_arm_ctr_enc,.-_gcry_blowfish_arm_ctr_enc;
|
||||
|
||||
.align 3
|
||||
.type _gcry_blowfish_arm_dec_blk2,%function;
|
||||
|
||||
_gcry_blowfish_arm_dec_blk2:
|
||||
/* input:
|
||||
* preloaded: CTX
|
||||
* [RL0, RR0], [RL1, RR1]: src
|
||||
* output:
|
||||
* [RR0, RL0], [RR1, RL1]: dst
|
||||
*/
|
||||
add CTXs2, CTXs0, #(s2 - s0);
|
||||
mov RMASK, #(0xff << 2); /* byte mask */
|
||||
|
||||
load_n_add_roundkey_dec2(17);
|
||||
round_dec2(15, next_key);
|
||||
round_dec2(13, next_key);
|
||||
round_dec2(11, next_key);
|
||||
round_dec2(9, next_key);
|
||||
round_dec2(7, next_key);
|
||||
round_dec2(5, next_key);
|
||||
round_dec2(3, next_key);
|
||||
round_dec2(1, dummy);
|
||||
|
||||
host_to_be(RR0, RT0);
|
||||
host_to_be(RL0, RT0);
|
||||
host_to_be(RR1, RT0);
|
||||
host_to_be(RL1, RT0);
|
||||
|
||||
b .Ldec_cbc_tail;
|
||||
.ltorg
|
||||
.size _gcry_blowfish_arm_dec_blk2,.-_gcry_blowfish_arm_dec_blk2;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_blowfish_arm_cbc_dec;
|
||||
.type _gcry_blowfish_arm_cbc_dec,%function;
|
||||
|
||||
_gcry_blowfish_arm_cbc_dec:
|
||||
/* input:
|
||||
* %r0: CTX
|
||||
* %r1: dst (2 blocks)
|
||||
* %r2: src (2 blocks)
|
||||
* %r3: iv (64bit)
|
||||
*/
|
||||
push {%r2-%r11, %ip, %lr};
|
||||
|
||||
read_block2(%r2, RL0, RR0, RL1, RR1, RT0);
|
||||
|
||||
/* dec_blk2 is only used by cbc_dec, jump directly in/out instead
|
||||
* of function call. */
|
||||
b _gcry_blowfish_arm_dec_blk2;
|
||||
.Ldec_cbc_tail:
|
||||
/* result in RR0:RL0, RR1:RL1 = %r4:%r3, %r10:%r9 */
|
||||
|
||||
/* %r0: %src, %r1: dst, %r2: iv */
|
||||
pop {%r0, %r2};
|
||||
|
||||
/* load IV+1 (src[0]) to %r7:%r8. Might be unaligned. */
|
||||
read_block_host(%r0, 0, %r7, %r8, %r5);
|
||||
/* load IV (iv[0]) to %r5:%r6. 'iv' is aligned. */
|
||||
ldm %r2, {%r5, %r6};
|
||||
|
||||
/* out[1] ^= IV+1 */
|
||||
eor %r10, %r7;
|
||||
eor %r9, %r8;
|
||||
/* out[0] ^= IV */
|
||||
eor %r4, %r5;
|
||||
eor %r3, %r6;
|
||||
|
||||
/* load IV+2 (src[1]) to %r7:%r8. Might be unaligned. */
|
||||
read_block_host(%r0, 8, %r7, %r8, %r5);
|
||||
/* store IV+2 to iv[0] (aligned). */
|
||||
stm %r2, {%r7, %r8};
|
||||
|
||||
/* store result to dst[0-3]. Might be unaligned. */
|
||||
write_block2_host(%r1, %r4, %r3, %r10, %r9, %r5, %r6);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
.size _gcry_blowfish_arm_cbc_dec,.-_gcry_blowfish_arm_cbc_dec;
|
||||
|
||||
#endif /*HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS*/
|
||||
#endif /*__ARM_ARCH >= 6*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,378 @@
|
||||
/* bufhelp.h - Some buffer manipulation helpers
|
||||
* Copyright © 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifndef G10_BUFHELP_H
|
||||
#define G10_BUFHELP_H
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
# include <stdint.h> /* uintptr_t */
|
||||
#elif defined(HAVE_INTTYPES_H)
|
||||
# include <inttypes.h>
|
||||
#else
|
||||
/* In this case, uintptr_t is provided by config.h. */
|
||||
#endif
|
||||
|
||||
#include "bithelp.h"
|
||||
|
||||
|
||||
#if defined(__i386__) || defined(__x86_64__) || \
|
||||
defined(__powerpc__) || defined(__powerpc64__) || \
|
||||
(defined(__arm__) && defined(__ARM_FEATURE_UNALIGNED)) || \
|
||||
defined(__aarch64__)
|
||||
/* These architectures are able of unaligned memory accesses and can
|
||||
handle those fast.
|
||||
*/
|
||||
# define BUFHELP_FAST_UNALIGNED_ACCESS 1
|
||||
#endif
|
||||
|
||||
|
||||
/* Optimized function for small buffer copying */
|
||||
static inline void
|
||||
buf_cpy(void *_dst, const void *_src, size_t len)
|
||||
{
|
||||
#if __GNUC__ >= 4 && (defined(__x86_64__) || defined(__i386__))
|
||||
/* For AMD64 and i386, memcpy is faster. */
|
||||
memcpy(_dst, _src, len);
|
||||
#else
|
||||
byte *dst = _dst;
|
||||
const byte *src = _src;
|
||||
uintptr_t *ldst;
|
||||
const uintptr_t *lsrc;
|
||||
#ifndef BUFHELP_FAST_UNALIGNED_ACCESS
|
||||
const unsigned int longmask = sizeof(uintptr_t) - 1;
|
||||
|
||||
/* Skip fast processing if buffers are unaligned. */
|
||||
if (((uintptr_t)dst | (uintptr_t)src) & longmask)
|
||||
goto do_bytes;
|
||||
#endif
|
||||
|
||||
ldst = (uintptr_t *)(void *)dst;
|
||||
lsrc = (const uintptr_t *)(const void *)src;
|
||||
|
||||
for (; len >= sizeof(uintptr_t); len -= sizeof(uintptr_t))
|
||||
*ldst++ = *lsrc++;
|
||||
|
||||
dst = (byte *)ldst;
|
||||
src = (const byte *)lsrc;
|
||||
|
||||
#ifndef BUFHELP_FAST_UNALIGNED_ACCESS
|
||||
do_bytes:
|
||||
#endif
|
||||
/* Handle tail. */
|
||||
for (; len; len--)
|
||||
*dst++ = *src++;
|
||||
#endif /*__GNUC__ >= 4 && (__x86_64__ || __i386__)*/
|
||||
}
|
||||
|
||||
|
||||
/* Optimized function for buffer xoring */
|
||||
static inline void
|
||||
buf_xor(void *_dst, const void *_src1, const void *_src2, size_t len)
|
||||
{
|
||||
byte *dst = _dst;
|
||||
const byte *src1 = _src1;
|
||||
const byte *src2 = _src2;
|
||||
uintptr_t *ldst;
|
||||
const uintptr_t *lsrc1, *lsrc2;
|
||||
#ifndef BUFHELP_FAST_UNALIGNED_ACCESS
|
||||
const unsigned int longmask = sizeof(uintptr_t) - 1;
|
||||
|
||||
/* Skip fast processing if buffers are unaligned. */
|
||||
if (((uintptr_t)dst | (uintptr_t)src1 | (uintptr_t)src2) & longmask)
|
||||
goto do_bytes;
|
||||
#endif
|
||||
|
||||
ldst = (uintptr_t *)(void *)dst;
|
||||
lsrc1 = (const uintptr_t *)(const void *)src1;
|
||||
lsrc2 = (const uintptr_t *)(const void *)src2;
|
||||
|
||||
for (; len >= sizeof(uintptr_t); len -= sizeof(uintptr_t))
|
||||
*ldst++ = *lsrc1++ ^ *lsrc2++;
|
||||
|
||||
dst = (byte *)ldst;
|
||||
src1 = (const byte *)lsrc1;
|
||||
src2 = (const byte *)lsrc2;
|
||||
|
||||
#ifndef BUFHELP_FAST_UNALIGNED_ACCESS
|
||||
do_bytes:
|
||||
#endif
|
||||
/* Handle tail. */
|
||||
for (; len; len--)
|
||||
*dst++ = *src1++ ^ *src2++;
|
||||
}
|
||||
|
||||
|
||||
/* Optimized function for buffer xoring with two destination buffers. Used
|
||||
mainly by CFB mode encryption. */
|
||||
static inline void
|
||||
buf_xor_2dst(void *_dst1, void *_dst2, const void *_src, size_t len)
|
||||
{
|
||||
byte *dst1 = _dst1;
|
||||
byte *dst2 = _dst2;
|
||||
const byte *src = _src;
|
||||
uintptr_t *ldst1, *ldst2;
|
||||
const uintptr_t *lsrc;
|
||||
#ifndef BUFHELP_FAST_UNALIGNED_ACCESS
|
||||
const unsigned int longmask = sizeof(uintptr_t) - 1;
|
||||
|
||||
/* Skip fast processing if buffers are unaligned. */
|
||||
if (((uintptr_t)src | (uintptr_t)dst1 | (uintptr_t)dst2) & longmask)
|
||||
goto do_bytes;
|
||||
#endif
|
||||
|
||||
ldst1 = (uintptr_t *)(void *)dst1;
|
||||
ldst2 = (uintptr_t *)(void *)dst2;
|
||||
lsrc = (const uintptr_t *)(const void *)src;
|
||||
|
||||
for (; len >= sizeof(uintptr_t); len -= sizeof(uintptr_t))
|
||||
*ldst1++ = (*ldst2++ ^= *lsrc++);
|
||||
|
||||
dst1 = (byte *)ldst1;
|
||||
dst2 = (byte *)ldst2;
|
||||
src = (const byte *)lsrc;
|
||||
|
||||
#ifndef BUFHELP_FAST_UNALIGNED_ACCESS
|
||||
do_bytes:
|
||||
#endif
|
||||
/* Handle tail. */
|
||||
for (; len; len--)
|
||||
*dst1++ = (*dst2++ ^= *src++);
|
||||
}
|
||||
|
||||
|
||||
/* Optimized function for combined buffer xoring and copying. Used by mainly
|
||||
CBC mode decryption. */
|
||||
static inline void
|
||||
buf_xor_n_copy_2(void *_dst_xor, const void *_src_xor, void *_srcdst_cpy,
|
||||
const void *_src_cpy, size_t len)
|
||||
{
|
||||
byte *dst_xor = _dst_xor;
|
||||
byte *srcdst_cpy = _srcdst_cpy;
|
||||
const byte *src_xor = _src_xor;
|
||||
const byte *src_cpy = _src_cpy;
|
||||
byte temp;
|
||||
uintptr_t *ldst_xor, *lsrcdst_cpy;
|
||||
const uintptr_t *lsrc_cpy, *lsrc_xor;
|
||||
uintptr_t ltemp;
|
||||
#ifndef BUFHELP_FAST_UNALIGNED_ACCESS
|
||||
const unsigned int longmask = sizeof(uintptr_t) - 1;
|
||||
|
||||
/* Skip fast processing if buffers are unaligned. */
|
||||
if (((uintptr_t)src_cpy | (uintptr_t)src_xor | (uintptr_t)dst_xor |
|
||||
(uintptr_t)srcdst_cpy) & longmask)
|
||||
goto do_bytes;
|
||||
#endif
|
||||
|
||||
ldst_xor = (uintptr_t *)(void *)dst_xor;
|
||||
lsrc_xor = (const uintptr_t *)(void *)src_xor;
|
||||
lsrcdst_cpy = (uintptr_t *)(void *)srcdst_cpy;
|
||||
lsrc_cpy = (const uintptr_t *)(const void *)src_cpy;
|
||||
|
||||
for (; len >= sizeof(uintptr_t); len -= sizeof(uintptr_t))
|
||||
{
|
||||
ltemp = *lsrc_cpy++;
|
||||
*ldst_xor++ = *lsrcdst_cpy ^ *lsrc_xor++;
|
||||
*lsrcdst_cpy++ = ltemp;
|
||||
}
|
||||
|
||||
dst_xor = (byte *)ldst_xor;
|
||||
src_xor = (const byte *)lsrc_xor;
|
||||
srcdst_cpy = (byte *)lsrcdst_cpy;
|
||||
src_cpy = (const byte *)lsrc_cpy;
|
||||
|
||||
#ifndef BUFHELP_FAST_UNALIGNED_ACCESS
|
||||
do_bytes:
|
||||
#endif
|
||||
/* Handle tail. */
|
||||
for (; len; len--)
|
||||
{
|
||||
temp = *src_cpy++;
|
||||
*dst_xor++ = *srcdst_cpy ^ *src_xor++;
|
||||
*srcdst_cpy++ = temp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Optimized function for combined buffer xoring and copying. Used by mainly
|
||||
CFB mode decryption. */
|
||||
static inline void
|
||||
buf_xor_n_copy(void *_dst_xor, void *_srcdst_cpy, const void *_src, size_t len)
|
||||
{
|
||||
buf_xor_n_copy_2(_dst_xor, _src, _srcdst_cpy, _src, len);
|
||||
}
|
||||
|
||||
|
||||
/* Constant-time compare of two buffers. Returns 1 if buffers are equal,
|
||||
and 0 if buffers differ. */
|
||||
static inline int
|
||||
buf_eq_const(const void *_a, const void *_b, size_t len)
|
||||
{
|
||||
const byte *a = _a;
|
||||
const byte *b = _b;
|
||||
size_t diff, i;
|
||||
|
||||
/* Constant-time compare. */
|
||||
for (i = 0, diff = 0; i < len; i++)
|
||||
diff -= !!(a[i] - b[i]);
|
||||
|
||||
return !diff;
|
||||
}
|
||||
|
||||
|
||||
#ifndef BUFHELP_FAST_UNALIGNED_ACCESS
|
||||
|
||||
/* Functions for loading and storing unaligned u32 values of different
|
||||
endianness. */
|
||||
static inline u32 buf_get_be32(const void *_buf)
|
||||
{
|
||||
const byte *in = _buf;
|
||||
return ((u32)in[0] << 24) | ((u32)in[1] << 16) | \
|
||||
((u32)in[2] << 8) | (u32)in[3];
|
||||
}
|
||||
|
||||
static inline u32 buf_get_le32(const void *_buf)
|
||||
{
|
||||
const byte *in = _buf;
|
||||
return ((u32)in[3] << 24) | ((u32)in[2] << 16) | \
|
||||
((u32)in[1] << 8) | (u32)in[0];
|
||||
}
|
||||
|
||||
static inline void buf_put_be32(void *_buf, u32 val)
|
||||
{
|
||||
byte *out = _buf;
|
||||
out[0] = val >> 24;
|
||||
out[1] = val >> 16;
|
||||
out[2] = val >> 8;
|
||||
out[3] = val;
|
||||
}
|
||||
|
||||
static inline void buf_put_le32(void *_buf, u32 val)
|
||||
{
|
||||
byte *out = _buf;
|
||||
out[3] = val >> 24;
|
||||
out[2] = val >> 16;
|
||||
out[1] = val >> 8;
|
||||
out[0] = val;
|
||||
}
|
||||
|
||||
#ifdef HAVE_U64_TYPEDEF
|
||||
/* Functions for loading and storing unaligned u64 values of different
|
||||
endianness. */
|
||||
static inline u64 buf_get_be64(const void *_buf)
|
||||
{
|
||||
const byte *in = _buf;
|
||||
return ((u64)in[0] << 56) | ((u64)in[1] << 48) | \
|
||||
((u64)in[2] << 40) | ((u64)in[3] << 32) | \
|
||||
((u64)in[4] << 24) | ((u64)in[5] << 16) | \
|
||||
((u64)in[6] << 8) | (u64)in[7];
|
||||
}
|
||||
|
||||
static inline u64 buf_get_le64(const void *_buf)
|
||||
{
|
||||
const byte *in = _buf;
|
||||
return ((u64)in[7] << 56) | ((u64)in[6] << 48) | \
|
||||
((u64)in[5] << 40) | ((u64)in[4] << 32) | \
|
||||
((u64)in[3] << 24) | ((u64)in[2] << 16) | \
|
||||
((u64)in[1] << 8) | (u64)in[0];
|
||||
}
|
||||
|
||||
static inline void buf_put_be64(void *_buf, u64 val)
|
||||
{
|
||||
byte *out = _buf;
|
||||
out[0] = val >> 56;
|
||||
out[1] = val >> 48;
|
||||
out[2] = val >> 40;
|
||||
out[3] = val >> 32;
|
||||
out[4] = val >> 24;
|
||||
out[5] = val >> 16;
|
||||
out[6] = val >> 8;
|
||||
out[7] = val;
|
||||
}
|
||||
|
||||
static inline void buf_put_le64(void *_buf, u64 val)
|
||||
{
|
||||
byte *out = _buf;
|
||||
out[7] = val >> 56;
|
||||
out[6] = val >> 48;
|
||||
out[5] = val >> 40;
|
||||
out[4] = val >> 32;
|
||||
out[3] = val >> 24;
|
||||
out[2] = val >> 16;
|
||||
out[1] = val >> 8;
|
||||
out[0] = val;
|
||||
}
|
||||
#endif /*HAVE_U64_TYPEDEF*/
|
||||
|
||||
#else /*BUFHELP_FAST_UNALIGNED_ACCESS*/
|
||||
|
||||
/* Functions for loading and storing unaligned u32 values of different
|
||||
endianness. */
|
||||
static inline u32 buf_get_be32(const void *_buf)
|
||||
{
|
||||
return be_bswap32(*(const u32 *)_buf);
|
||||
}
|
||||
|
||||
static inline u32 buf_get_le32(const void *_buf)
|
||||
{
|
||||
return le_bswap32(*(const u32 *)_buf);
|
||||
}
|
||||
|
||||
static inline void buf_put_be32(void *_buf, u32 val)
|
||||
{
|
||||
u32 *out = _buf;
|
||||
*out = be_bswap32(val);
|
||||
}
|
||||
|
||||
static inline void buf_put_le32(void *_buf, u32 val)
|
||||
{
|
||||
u32 *out = _buf;
|
||||
*out = le_bswap32(val);
|
||||
}
|
||||
|
||||
#ifdef HAVE_U64_TYPEDEF
|
||||
/* Functions for loading and storing unaligned u64 values of different
|
||||
endianness. */
|
||||
static inline u64 buf_get_be64(const void *_buf)
|
||||
{
|
||||
return be_bswap64(*(const u64 *)_buf);
|
||||
}
|
||||
|
||||
static inline u64 buf_get_le64(const void *_buf)
|
||||
{
|
||||
return le_bswap64(*(const u64 *)_buf);
|
||||
}
|
||||
|
||||
static inline void buf_put_be64(void *_buf, u64 val)
|
||||
{
|
||||
u64 *out = _buf;
|
||||
*out = be_bswap64(val);
|
||||
}
|
||||
|
||||
static inline void buf_put_le64(void *_buf, u64 val)
|
||||
{
|
||||
u64 *out = _buf;
|
||||
*out = le_bswap64(val);
|
||||
}
|
||||
#endif /*HAVE_U64_TYPEDEF*/
|
||||
|
||||
#endif /*BUFHELP_FAST_UNALIGNED_ACCESS*/
|
||||
|
||||
#endif /*G10_BITHELP_H*/
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,626 @@
|
||||
/* camellia-arm.S - ARM assembly implementation of Camellia cipher
|
||||
*
|
||||
* Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if defined(__ARMEL__)
|
||||
#ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS
|
||||
|
||||
.text
|
||||
|
||||
.syntax unified
|
||||
.arm
|
||||
|
||||
#ifdef __PIC__
|
||||
# define GET_DATA_POINTER(reg, name, rtmp) \
|
||||
ldr reg, 1f; \
|
||||
ldr rtmp, 2f; \
|
||||
b 3f; \
|
||||
1: .word _GLOBAL_OFFSET_TABLE_-(3f+8); \
|
||||
2: .word name(GOT); \
|
||||
3: add reg, pc, reg; \
|
||||
ldr reg, [reg, rtmp];
|
||||
#else
|
||||
# define GET_DATA_POINTER(reg, name, rtmp) ldr reg, =name
|
||||
#endif
|
||||
|
||||
/* struct camellia_ctx: */
|
||||
#define key_table 0
|
||||
|
||||
/* register macros */
|
||||
#define CTX %r0
|
||||
#define RTAB1 %ip
|
||||
#define RTAB3 %r1
|
||||
#define RMASK %lr
|
||||
|
||||
#define IL %r2
|
||||
#define IR %r3
|
||||
|
||||
#define XL %r4
|
||||
#define XR %r5
|
||||
#define YL %r6
|
||||
#define YR %r7
|
||||
|
||||
#define RT0 %r8
|
||||
#define RT1 %r9
|
||||
#define RT2 %r10
|
||||
#define RT3 %r11
|
||||
|
||||
/* helper macros */
|
||||
#define ldr_unaligned_be(rout, rsrc, offs, rtmp) \
|
||||
ldrb rout, [rsrc, #((offs) + 3)]; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 2)]; \
|
||||
orr rout, rout, rtmp, lsl #8; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 1)]; \
|
||||
orr rout, rout, rtmp, lsl #16; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 0)]; \
|
||||
orr rout, rout, rtmp, lsl #24;
|
||||
|
||||
#define str_unaligned_be(rin, rdst, offs, rtmp0, rtmp1) \
|
||||
mov rtmp0, rin, lsr #8; \
|
||||
strb rin, [rdst, #((offs) + 3)]; \
|
||||
mov rtmp1, rin, lsr #16; \
|
||||
strb rtmp0, [rdst, #((offs) + 2)]; \
|
||||
mov rtmp0, rin, lsr #24; \
|
||||
strb rtmp1, [rdst, #((offs) + 1)]; \
|
||||
strb rtmp0, [rdst, #((offs) + 0)];
|
||||
|
||||
#ifdef __ARMEL__
|
||||
#ifdef HAVE_ARM_ARCH_V6
|
||||
#define host_to_be(reg, rtmp) \
|
||||
rev reg, reg;
|
||||
#define be_to_host(reg, rtmp) \
|
||||
rev reg, reg;
|
||||
#else
|
||||
#define host_to_be(reg, rtmp) \
|
||||
eor rtmp, reg, reg, ror #16; \
|
||||
mov rtmp, rtmp, lsr #8; \
|
||||
bic rtmp, rtmp, #65280; \
|
||||
eor reg, rtmp, reg, ror #8;
|
||||
#define be_to_host(reg, rtmp) \
|
||||
eor rtmp, reg, reg, ror #16; \
|
||||
mov rtmp, rtmp, lsr #8; \
|
||||
bic rtmp, rtmp, #65280; \
|
||||
eor reg, rtmp, reg, ror #8;
|
||||
#endif
|
||||
#else
|
||||
/* nop on big-endian */
|
||||
#define host_to_be(reg, rtmp) /*_*/
|
||||
#define be_to_host(reg, rtmp) /*_*/
|
||||
#endif
|
||||
|
||||
#define ldr_input_aligned_be(rin, a, b, c, d, rtmp) \
|
||||
ldr a, [rin, #0]; \
|
||||
ldr b, [rin, #4]; \
|
||||
be_to_host(a, rtmp); \
|
||||
ldr c, [rin, #8]; \
|
||||
be_to_host(b, rtmp); \
|
||||
ldr d, [rin, #12]; \
|
||||
be_to_host(c, rtmp); \
|
||||
be_to_host(d, rtmp);
|
||||
|
||||
#define str_output_aligned_be(rout, a, b, c, d, rtmp) \
|
||||
be_to_host(a, rtmp); \
|
||||
be_to_host(b, rtmp); \
|
||||
str a, [rout, #0]; \
|
||||
be_to_host(c, rtmp); \
|
||||
str b, [rout, #4]; \
|
||||
be_to_host(d, rtmp); \
|
||||
str c, [rout, #8]; \
|
||||
str d, [rout, #12];
|
||||
|
||||
#ifdef __ARM_FEATURE_UNALIGNED
|
||||
/* unaligned word reads/writes allowed */
|
||||
#define ldr_input_be(rin, ra, rb, rc, rd, rtmp) \
|
||||
ldr_input_aligned_be(rin, ra, rb, rc, rd, rtmp)
|
||||
|
||||
#define str_output_be(rout, ra, rb, rc, rd, rtmp0, rtmp1) \
|
||||
str_output_aligned_be(rout, ra, rb, rc, rd, rtmp0)
|
||||
#else
|
||||
/* need to handle unaligned reads/writes by byte reads */
|
||||
#define ldr_input_be(rin, ra, rb, rc, rd, rtmp0) \
|
||||
tst rin, #3; \
|
||||
beq 1f; \
|
||||
ldr_unaligned_be(ra, rin, 0, rtmp0); \
|
||||
ldr_unaligned_be(rb, rin, 4, rtmp0); \
|
||||
ldr_unaligned_be(rc, rin, 8, rtmp0); \
|
||||
ldr_unaligned_be(rd, rin, 12, rtmp0); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
ldr_input_aligned_be(rin, ra, rb, rc, rd, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define str_output_be(rout, ra, rb, rc, rd, rtmp0, rtmp1) \
|
||||
tst rout, #3; \
|
||||
beq 1f; \
|
||||
str_unaligned_be(ra, rout, 0, rtmp0, rtmp1); \
|
||||
str_unaligned_be(rb, rout, 4, rtmp0, rtmp1); \
|
||||
str_unaligned_be(rc, rout, 8, rtmp0, rtmp1); \
|
||||
str_unaligned_be(rd, rout, 12, rtmp0, rtmp1); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
str_output_aligned_be(rout, ra, rb, rc, rd, rtmp0); \
|
||||
2:;
|
||||
#endif
|
||||
|
||||
/**********************************************************************
|
||||
1-way camellia
|
||||
**********************************************************************/
|
||||
#define roundsm(xl, xr, kl, kr, yl, yr) \
|
||||
ldr RT2, [CTX, #(key_table + ((kl) * 4))]; \
|
||||
and IR, RMASK, xr, lsl#(4); /*sp1110*/ \
|
||||
ldr RT3, [CTX, #(key_table + ((kr) * 4))]; \
|
||||
and IL, RMASK, xl, lsr#(24 - 4); /*sp1110*/ \
|
||||
and RT0, RMASK, xr, lsr#(16 - 4); /*sp3033*/ \
|
||||
ldr IR, [RTAB1, IR]; \
|
||||
and RT1, RMASK, xl, lsr#(8 - 4); /*sp3033*/ \
|
||||
eor yl, RT2; \
|
||||
ldr IL, [RTAB1, IL]; \
|
||||
eor yr, RT3; \
|
||||
\
|
||||
ldr RT0, [RTAB3, RT0]; \
|
||||
add RTAB1, #4; \
|
||||
ldr RT1, [RTAB3, RT1]; \
|
||||
add RTAB3, #4; \
|
||||
\
|
||||
and RT2, RMASK, xr, lsr#(24 - 4); /*sp0222*/ \
|
||||
and RT3, RMASK, xl, lsr#(16 - 4); /*sp0222*/ \
|
||||
\
|
||||
eor IR, RT0; \
|
||||
eor IL, RT1; \
|
||||
\
|
||||
ldr RT2, [RTAB1, RT2]; \
|
||||
and RT0, RMASK, xr, lsr#(8 - 4); /*sp4404*/ \
|
||||
ldr RT3, [RTAB1, RT3]; \
|
||||
and RT1, RMASK, xl, lsl#(4); /*sp4404*/ \
|
||||
\
|
||||
ldr RT0, [RTAB3, RT0]; \
|
||||
sub RTAB1, #4; \
|
||||
ldr RT1, [RTAB3, RT1]; \
|
||||
sub RTAB3, #4; \
|
||||
\
|
||||
eor IR, RT2; \
|
||||
eor IL, RT3; \
|
||||
eor IR, RT0; \
|
||||
eor IL, RT1; \
|
||||
\
|
||||
eor IR, IL; \
|
||||
eor yr, yr, IL, ror#8; \
|
||||
eor yl, IR; \
|
||||
eor yr, IR;
|
||||
|
||||
#define enc_rounds(n) \
|
||||
roundsm(XL, XR, ((n) + 2) * 2 + 0, ((n) + 2) * 2 + 1, YL, YR); \
|
||||
roundsm(YL, YR, ((n) + 3) * 2 + 0, ((n) + 3) * 2 + 1, XL, XR); \
|
||||
roundsm(XL, XR, ((n) + 4) * 2 + 0, ((n) + 4) * 2 + 1, YL, YR); \
|
||||
roundsm(YL, YR, ((n) + 5) * 2 + 0, ((n) + 5) * 2 + 1, XL, XR); \
|
||||
roundsm(XL, XR, ((n) + 6) * 2 + 0, ((n) + 6) * 2 + 1, YL, YR); \
|
||||
roundsm(YL, YR, ((n) + 7) * 2 + 0, ((n) + 7) * 2 + 1, XL, XR);
|
||||
|
||||
#define dec_rounds(n) \
|
||||
roundsm(XL, XR, ((n) + 7) * 2 + 0, ((n) + 7) * 2 + 1, YL, YR); \
|
||||
roundsm(YL, YR, ((n) + 6) * 2 + 0, ((n) + 6) * 2 + 1, XL, XR); \
|
||||
roundsm(XL, XR, ((n) + 5) * 2 + 0, ((n) + 5) * 2 + 1, YL, YR); \
|
||||
roundsm(YL, YR, ((n) + 4) * 2 + 0, ((n) + 4) * 2 + 1, XL, XR); \
|
||||
roundsm(XL, XR, ((n) + 3) * 2 + 0, ((n) + 3) * 2 + 1, YL, YR); \
|
||||
roundsm(YL, YR, ((n) + 2) * 2 + 0, ((n) + 2) * 2 + 1, XL, XR);
|
||||
|
||||
/* perform FL and FL⁻¹ */
|
||||
#define fls(ll, lr, rl, rr, kll, klr, krl, krr) \
|
||||
ldr RT0, [CTX, #(key_table + ((kll) * 4))]; \
|
||||
ldr RT2, [CTX, #(key_table + ((krr) * 4))]; \
|
||||
and RT0, ll; \
|
||||
ldr RT3, [CTX, #(key_table + ((krl) * 4))]; \
|
||||
orr RT2, rr; \
|
||||
ldr RT1, [CTX, #(key_table + ((klr) * 4))]; \
|
||||
eor rl, RT2; \
|
||||
eor lr, lr, RT0, ror#31; \
|
||||
and RT3, rl; \
|
||||
orr RT1, lr; \
|
||||
eor ll, RT1; \
|
||||
eor rr, rr, RT3, ror#31;
|
||||
|
||||
#define enc_fls(n) \
|
||||
fls(XL, XR, YL, YR, \
|
||||
(n) * 2 + 0, (n) * 2 + 1, \
|
||||
(n) * 2 + 2, (n) * 2 + 3);
|
||||
|
||||
#define dec_fls(n) \
|
||||
fls(XL, XR, YL, YR, \
|
||||
(n) * 2 + 2, (n) * 2 + 3, \
|
||||
(n) * 2 + 0, (n) * 2 + 1);
|
||||
|
||||
#define inpack(n) \
|
||||
ldr_input_be(%r2, XL, XR, YL, YR, RT0); \
|
||||
ldr RT0, [CTX, #(key_table + ((n) * 8) + 0)]; \
|
||||
ldr RT1, [CTX, #(key_table + ((n) * 8) + 4)]; \
|
||||
eor XL, RT0; \
|
||||
eor XR, RT1;
|
||||
|
||||
#define outunpack(n) \
|
||||
ldr RT0, [CTX, #(key_table + ((n) * 8) + 0)]; \
|
||||
ldr RT1, [CTX, #(key_table + ((n) * 8) + 4)]; \
|
||||
eor YL, RT0; \
|
||||
eor YR, RT1; \
|
||||
str_output_be(%r1, YL, YR, XL, XR, RT0, RT1);
|
||||
|
||||
.align 3
|
||||
.globl _gcry_camellia_arm_encrypt_block
|
||||
.type _gcry_camellia_arm_encrypt_block,%function;
|
||||
|
||||
_gcry_camellia_arm_encrypt_block:
|
||||
/* input:
|
||||
* %r0: keytable
|
||||
* %r1: dst
|
||||
* %r2: src
|
||||
* %r3: keybitlen
|
||||
*/
|
||||
push {%r1, %r4-%r11, %ip, %lr};
|
||||
|
||||
GET_DATA_POINTER(RTAB1, .Lcamellia_sp1110, RTAB3);
|
||||
mov RMASK, #0xff;
|
||||
add RTAB3, RTAB1, #(2 * 4);
|
||||
push {%r3};
|
||||
mov RMASK, RMASK, lsl#4 /* byte mask */
|
||||
|
||||
inpack(0);
|
||||
|
||||
enc_rounds(0);
|
||||
enc_fls(8);
|
||||
enc_rounds(8);
|
||||
enc_fls(16);
|
||||
enc_rounds(16);
|
||||
|
||||
pop {RT0};
|
||||
cmp RT0, #(16 * 8);
|
||||
bne .Lenc_256;
|
||||
|
||||
pop {%r1};
|
||||
outunpack(24);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
|
||||
.Lenc_256:
|
||||
enc_fls(24);
|
||||
enc_rounds(24);
|
||||
|
||||
pop {%r1};
|
||||
outunpack(32);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
.size _gcry_camellia_arm_encrypt_block,.-_gcry_camellia_arm_encrypt_block;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_camellia_arm_decrypt_block
|
||||
.type _gcry_camellia_arm_decrypt_block,%function;
|
||||
|
||||
_gcry_camellia_arm_decrypt_block:
|
||||
/* input:
|
||||
* %r0: keytable
|
||||
* %r1: dst
|
||||
* %r2: src
|
||||
* %r3: keybitlen
|
||||
*/
|
||||
push {%r1, %r4-%r11, %ip, %lr};
|
||||
|
||||
GET_DATA_POINTER(RTAB1, .Lcamellia_sp1110, RTAB3);
|
||||
mov RMASK, #0xff;
|
||||
add RTAB3, RTAB1, #(2 * 4);
|
||||
mov RMASK, RMASK, lsl#4 /* byte mask */
|
||||
|
||||
cmp %r3, #(16 * 8);
|
||||
bne .Ldec_256;
|
||||
|
||||
inpack(24);
|
||||
|
||||
.Ldec_128:
|
||||
dec_rounds(16);
|
||||
dec_fls(16);
|
||||
dec_rounds(8);
|
||||
dec_fls(8);
|
||||
dec_rounds(0);
|
||||
|
||||
pop {%r1};
|
||||
outunpack(0);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
|
||||
.Ldec_256:
|
||||
inpack(32);
|
||||
dec_rounds(24);
|
||||
dec_fls(24);
|
||||
|
||||
b .Ldec_128;
|
||||
.ltorg
|
||||
.size _gcry_camellia_arm_decrypt_block,.-_gcry_camellia_arm_decrypt_block;
|
||||
|
||||
.data
|
||||
|
||||
/* Encryption/Decryption tables */
|
||||
.align 5
|
||||
.Lcamellia_sp1110:
|
||||
.long 0x70707000
|
||||
.Lcamellia_sp0222:
|
||||
.long 0x00e0e0e0
|
||||
.Lcamellia_sp3033:
|
||||
.long 0x38003838
|
||||
.Lcamellia_sp4404:
|
||||
.long 0x70700070
|
||||
.long 0x82828200, 0x00050505, 0x41004141, 0x2c2c002c
|
||||
.long 0x2c2c2c00, 0x00585858, 0x16001616, 0xb3b300b3
|
||||
.long 0xececec00, 0x00d9d9d9, 0x76007676, 0xc0c000c0
|
||||
.long 0xb3b3b300, 0x00676767, 0xd900d9d9, 0xe4e400e4
|
||||
.long 0x27272700, 0x004e4e4e, 0x93009393, 0x57570057
|
||||
.long 0xc0c0c000, 0x00818181, 0x60006060, 0xeaea00ea
|
||||
.long 0xe5e5e500, 0x00cbcbcb, 0xf200f2f2, 0xaeae00ae
|
||||
.long 0xe4e4e400, 0x00c9c9c9, 0x72007272, 0x23230023
|
||||
.long 0x85858500, 0x000b0b0b, 0xc200c2c2, 0x6b6b006b
|
||||
.long 0x57575700, 0x00aeaeae, 0xab00abab, 0x45450045
|
||||
.long 0x35353500, 0x006a6a6a, 0x9a009a9a, 0xa5a500a5
|
||||
.long 0xeaeaea00, 0x00d5d5d5, 0x75007575, 0xeded00ed
|
||||
.long 0x0c0c0c00, 0x00181818, 0x06000606, 0x4f4f004f
|
||||
.long 0xaeaeae00, 0x005d5d5d, 0x57005757, 0x1d1d001d
|
||||
.long 0x41414100, 0x00828282, 0xa000a0a0, 0x92920092
|
||||
.long 0x23232300, 0x00464646, 0x91009191, 0x86860086
|
||||
.long 0xefefef00, 0x00dfdfdf, 0xf700f7f7, 0xafaf00af
|
||||
.long 0x6b6b6b00, 0x00d6d6d6, 0xb500b5b5, 0x7c7c007c
|
||||
.long 0x93939300, 0x00272727, 0xc900c9c9, 0x1f1f001f
|
||||
.long 0x45454500, 0x008a8a8a, 0xa200a2a2, 0x3e3e003e
|
||||
.long 0x19191900, 0x00323232, 0x8c008c8c, 0xdcdc00dc
|
||||
.long 0xa5a5a500, 0x004b4b4b, 0xd200d2d2, 0x5e5e005e
|
||||
.long 0x21212100, 0x00424242, 0x90009090, 0x0b0b000b
|
||||
.long 0xededed00, 0x00dbdbdb, 0xf600f6f6, 0xa6a600a6
|
||||
.long 0x0e0e0e00, 0x001c1c1c, 0x07000707, 0x39390039
|
||||
.long 0x4f4f4f00, 0x009e9e9e, 0xa700a7a7, 0xd5d500d5
|
||||
.long 0x4e4e4e00, 0x009c9c9c, 0x27002727, 0x5d5d005d
|
||||
.long 0x1d1d1d00, 0x003a3a3a, 0x8e008e8e, 0xd9d900d9
|
||||
.long 0x65656500, 0x00cacaca, 0xb200b2b2, 0x5a5a005a
|
||||
.long 0x92929200, 0x00252525, 0x49004949, 0x51510051
|
||||
.long 0xbdbdbd00, 0x007b7b7b, 0xde00dede, 0x6c6c006c
|
||||
.long 0x86868600, 0x000d0d0d, 0x43004343, 0x8b8b008b
|
||||
.long 0xb8b8b800, 0x00717171, 0x5c005c5c, 0x9a9a009a
|
||||
.long 0xafafaf00, 0x005f5f5f, 0xd700d7d7, 0xfbfb00fb
|
||||
.long 0x8f8f8f00, 0x001f1f1f, 0xc700c7c7, 0xb0b000b0
|
||||
.long 0x7c7c7c00, 0x00f8f8f8, 0x3e003e3e, 0x74740074
|
||||
.long 0xebebeb00, 0x00d7d7d7, 0xf500f5f5, 0x2b2b002b
|
||||
.long 0x1f1f1f00, 0x003e3e3e, 0x8f008f8f, 0xf0f000f0
|
||||
.long 0xcecece00, 0x009d9d9d, 0x67006767, 0x84840084
|
||||
.long 0x3e3e3e00, 0x007c7c7c, 0x1f001f1f, 0xdfdf00df
|
||||
.long 0x30303000, 0x00606060, 0x18001818, 0xcbcb00cb
|
||||
.long 0xdcdcdc00, 0x00b9b9b9, 0x6e006e6e, 0x34340034
|
||||
.long 0x5f5f5f00, 0x00bebebe, 0xaf00afaf, 0x76760076
|
||||
.long 0x5e5e5e00, 0x00bcbcbc, 0x2f002f2f, 0x6d6d006d
|
||||
.long 0xc5c5c500, 0x008b8b8b, 0xe200e2e2, 0xa9a900a9
|
||||
.long 0x0b0b0b00, 0x00161616, 0x85008585, 0xd1d100d1
|
||||
.long 0x1a1a1a00, 0x00343434, 0x0d000d0d, 0x04040004
|
||||
.long 0xa6a6a600, 0x004d4d4d, 0x53005353, 0x14140014
|
||||
.long 0xe1e1e100, 0x00c3c3c3, 0xf000f0f0, 0x3a3a003a
|
||||
.long 0x39393900, 0x00727272, 0x9c009c9c, 0xdede00de
|
||||
.long 0xcacaca00, 0x00959595, 0x65006565, 0x11110011
|
||||
.long 0xd5d5d500, 0x00ababab, 0xea00eaea, 0x32320032
|
||||
.long 0x47474700, 0x008e8e8e, 0xa300a3a3, 0x9c9c009c
|
||||
.long 0x5d5d5d00, 0x00bababa, 0xae00aeae, 0x53530053
|
||||
.long 0x3d3d3d00, 0x007a7a7a, 0x9e009e9e, 0xf2f200f2
|
||||
.long 0xd9d9d900, 0x00b3b3b3, 0xec00ecec, 0xfefe00fe
|
||||
.long 0x01010100, 0x00020202, 0x80008080, 0xcfcf00cf
|
||||
.long 0x5a5a5a00, 0x00b4b4b4, 0x2d002d2d, 0xc3c300c3
|
||||
.long 0xd6d6d600, 0x00adadad, 0x6b006b6b, 0x7a7a007a
|
||||
.long 0x51515100, 0x00a2a2a2, 0xa800a8a8, 0x24240024
|
||||
.long 0x56565600, 0x00acacac, 0x2b002b2b, 0xe8e800e8
|
||||
.long 0x6c6c6c00, 0x00d8d8d8, 0x36003636, 0x60600060
|
||||
.long 0x4d4d4d00, 0x009a9a9a, 0xa600a6a6, 0x69690069
|
||||
.long 0x8b8b8b00, 0x00171717, 0xc500c5c5, 0xaaaa00aa
|
||||
.long 0x0d0d0d00, 0x001a1a1a, 0x86008686, 0xa0a000a0
|
||||
.long 0x9a9a9a00, 0x00353535, 0x4d004d4d, 0xa1a100a1
|
||||
.long 0x66666600, 0x00cccccc, 0x33003333, 0x62620062
|
||||
.long 0xfbfbfb00, 0x00f7f7f7, 0xfd00fdfd, 0x54540054
|
||||
.long 0xcccccc00, 0x00999999, 0x66006666, 0x1e1e001e
|
||||
.long 0xb0b0b000, 0x00616161, 0x58005858, 0xe0e000e0
|
||||
.long 0x2d2d2d00, 0x005a5a5a, 0x96009696, 0x64640064
|
||||
.long 0x74747400, 0x00e8e8e8, 0x3a003a3a, 0x10100010
|
||||
.long 0x12121200, 0x00242424, 0x09000909, 0x00000000
|
||||
.long 0x2b2b2b00, 0x00565656, 0x95009595, 0xa3a300a3
|
||||
.long 0x20202000, 0x00404040, 0x10001010, 0x75750075
|
||||
.long 0xf0f0f000, 0x00e1e1e1, 0x78007878, 0x8a8a008a
|
||||
.long 0xb1b1b100, 0x00636363, 0xd800d8d8, 0xe6e600e6
|
||||
.long 0x84848400, 0x00090909, 0x42004242, 0x09090009
|
||||
.long 0x99999900, 0x00333333, 0xcc00cccc, 0xdddd00dd
|
||||
.long 0xdfdfdf00, 0x00bfbfbf, 0xef00efef, 0x87870087
|
||||
.long 0x4c4c4c00, 0x00989898, 0x26002626, 0x83830083
|
||||
.long 0xcbcbcb00, 0x00979797, 0xe500e5e5, 0xcdcd00cd
|
||||
.long 0xc2c2c200, 0x00858585, 0x61006161, 0x90900090
|
||||
.long 0x34343400, 0x00686868, 0x1a001a1a, 0x73730073
|
||||
.long 0x7e7e7e00, 0x00fcfcfc, 0x3f003f3f, 0xf6f600f6
|
||||
.long 0x76767600, 0x00ececec, 0x3b003b3b, 0x9d9d009d
|
||||
.long 0x05050500, 0x000a0a0a, 0x82008282, 0xbfbf00bf
|
||||
.long 0x6d6d6d00, 0x00dadada, 0xb600b6b6, 0x52520052
|
||||
.long 0xb7b7b700, 0x006f6f6f, 0xdb00dbdb, 0xd8d800d8
|
||||
.long 0xa9a9a900, 0x00535353, 0xd400d4d4, 0xc8c800c8
|
||||
.long 0x31313100, 0x00626262, 0x98009898, 0xc6c600c6
|
||||
.long 0xd1d1d100, 0x00a3a3a3, 0xe800e8e8, 0x81810081
|
||||
.long 0x17171700, 0x002e2e2e, 0x8b008b8b, 0x6f6f006f
|
||||
.long 0x04040400, 0x00080808, 0x02000202, 0x13130013
|
||||
.long 0xd7d7d700, 0x00afafaf, 0xeb00ebeb, 0x63630063
|
||||
.long 0x14141400, 0x00282828, 0x0a000a0a, 0xe9e900e9
|
||||
.long 0x58585800, 0x00b0b0b0, 0x2c002c2c, 0xa7a700a7
|
||||
.long 0x3a3a3a00, 0x00747474, 0x1d001d1d, 0x9f9f009f
|
||||
.long 0x61616100, 0x00c2c2c2, 0xb000b0b0, 0xbcbc00bc
|
||||
.long 0xdedede00, 0x00bdbdbd, 0x6f006f6f, 0x29290029
|
||||
.long 0x1b1b1b00, 0x00363636, 0x8d008d8d, 0xf9f900f9
|
||||
.long 0x11111100, 0x00222222, 0x88008888, 0x2f2f002f
|
||||
.long 0x1c1c1c00, 0x00383838, 0x0e000e0e, 0xb4b400b4
|
||||
.long 0x32323200, 0x00646464, 0x19001919, 0x78780078
|
||||
.long 0x0f0f0f00, 0x001e1e1e, 0x87008787, 0x06060006
|
||||
.long 0x9c9c9c00, 0x00393939, 0x4e004e4e, 0xe7e700e7
|
||||
.long 0x16161600, 0x002c2c2c, 0x0b000b0b, 0x71710071
|
||||
.long 0x53535300, 0x00a6a6a6, 0xa900a9a9, 0xd4d400d4
|
||||
.long 0x18181800, 0x00303030, 0x0c000c0c, 0xabab00ab
|
||||
.long 0xf2f2f200, 0x00e5e5e5, 0x79007979, 0x88880088
|
||||
.long 0x22222200, 0x00444444, 0x11001111, 0x8d8d008d
|
||||
.long 0xfefefe00, 0x00fdfdfd, 0x7f007f7f, 0x72720072
|
||||
.long 0x44444400, 0x00888888, 0x22002222, 0xb9b900b9
|
||||
.long 0xcfcfcf00, 0x009f9f9f, 0xe700e7e7, 0xf8f800f8
|
||||
.long 0xb2b2b200, 0x00656565, 0x59005959, 0xacac00ac
|
||||
.long 0xc3c3c300, 0x00878787, 0xe100e1e1, 0x36360036
|
||||
.long 0xb5b5b500, 0x006b6b6b, 0xda00dada, 0x2a2a002a
|
||||
.long 0x7a7a7a00, 0x00f4f4f4, 0x3d003d3d, 0x3c3c003c
|
||||
.long 0x91919100, 0x00232323, 0xc800c8c8, 0xf1f100f1
|
||||
.long 0x24242400, 0x00484848, 0x12001212, 0x40400040
|
||||
.long 0x08080800, 0x00101010, 0x04000404, 0xd3d300d3
|
||||
.long 0xe8e8e800, 0x00d1d1d1, 0x74007474, 0xbbbb00bb
|
||||
.long 0xa8a8a800, 0x00515151, 0x54005454, 0x43430043
|
||||
.long 0x60606000, 0x00c0c0c0, 0x30003030, 0x15150015
|
||||
.long 0xfcfcfc00, 0x00f9f9f9, 0x7e007e7e, 0xadad00ad
|
||||
.long 0x69696900, 0x00d2d2d2, 0xb400b4b4, 0x77770077
|
||||
.long 0x50505000, 0x00a0a0a0, 0x28002828, 0x80800080
|
||||
.long 0xaaaaaa00, 0x00555555, 0x55005555, 0x82820082
|
||||
.long 0xd0d0d000, 0x00a1a1a1, 0x68006868, 0xecec00ec
|
||||
.long 0xa0a0a000, 0x00414141, 0x50005050, 0x27270027
|
||||
.long 0x7d7d7d00, 0x00fafafa, 0xbe00bebe, 0xe5e500e5
|
||||
.long 0xa1a1a100, 0x00434343, 0xd000d0d0, 0x85850085
|
||||
.long 0x89898900, 0x00131313, 0xc400c4c4, 0x35350035
|
||||
.long 0x62626200, 0x00c4c4c4, 0x31003131, 0x0c0c000c
|
||||
.long 0x97979700, 0x002f2f2f, 0xcb00cbcb, 0x41410041
|
||||
.long 0x54545400, 0x00a8a8a8, 0x2a002a2a, 0xefef00ef
|
||||
.long 0x5b5b5b00, 0x00b6b6b6, 0xad00adad, 0x93930093
|
||||
.long 0x1e1e1e00, 0x003c3c3c, 0x0f000f0f, 0x19190019
|
||||
.long 0x95959500, 0x002b2b2b, 0xca00caca, 0x21210021
|
||||
.long 0xe0e0e000, 0x00c1c1c1, 0x70007070, 0x0e0e000e
|
||||
.long 0xffffff00, 0x00ffffff, 0xff00ffff, 0x4e4e004e
|
||||
.long 0x64646400, 0x00c8c8c8, 0x32003232, 0x65650065
|
||||
.long 0xd2d2d200, 0x00a5a5a5, 0x69006969, 0xbdbd00bd
|
||||
.long 0x10101000, 0x00202020, 0x08000808, 0xb8b800b8
|
||||
.long 0xc4c4c400, 0x00898989, 0x62006262, 0x8f8f008f
|
||||
.long 0x00000000, 0x00000000, 0x00000000, 0xebeb00eb
|
||||
.long 0x48484800, 0x00909090, 0x24002424, 0xcece00ce
|
||||
.long 0xa3a3a300, 0x00474747, 0xd100d1d1, 0x30300030
|
||||
.long 0xf7f7f700, 0x00efefef, 0xfb00fbfb, 0x5f5f005f
|
||||
.long 0x75757500, 0x00eaeaea, 0xba00baba, 0xc5c500c5
|
||||
.long 0xdbdbdb00, 0x00b7b7b7, 0xed00eded, 0x1a1a001a
|
||||
.long 0x8a8a8a00, 0x00151515, 0x45004545, 0xe1e100e1
|
||||
.long 0x03030300, 0x00060606, 0x81008181, 0xcaca00ca
|
||||
.long 0xe6e6e600, 0x00cdcdcd, 0x73007373, 0x47470047
|
||||
.long 0xdadada00, 0x00b5b5b5, 0x6d006d6d, 0x3d3d003d
|
||||
.long 0x09090900, 0x00121212, 0x84008484, 0x01010001
|
||||
.long 0x3f3f3f00, 0x007e7e7e, 0x9f009f9f, 0xd6d600d6
|
||||
.long 0xdddddd00, 0x00bbbbbb, 0xee00eeee, 0x56560056
|
||||
.long 0x94949400, 0x00292929, 0x4a004a4a, 0x4d4d004d
|
||||
.long 0x87878700, 0x000f0f0f, 0xc300c3c3, 0x0d0d000d
|
||||
.long 0x5c5c5c00, 0x00b8b8b8, 0x2e002e2e, 0x66660066
|
||||
.long 0x83838300, 0x00070707, 0xc100c1c1, 0xcccc00cc
|
||||
.long 0x02020200, 0x00040404, 0x01000101, 0x2d2d002d
|
||||
.long 0xcdcdcd00, 0x009b9b9b, 0xe600e6e6, 0x12120012
|
||||
.long 0x4a4a4a00, 0x00949494, 0x25002525, 0x20200020
|
||||
.long 0x90909000, 0x00212121, 0x48004848, 0xb1b100b1
|
||||
.long 0x33333300, 0x00666666, 0x99009999, 0x99990099
|
||||
.long 0x73737300, 0x00e6e6e6, 0xb900b9b9, 0x4c4c004c
|
||||
.long 0x67676700, 0x00cecece, 0xb300b3b3, 0xc2c200c2
|
||||
.long 0xf6f6f600, 0x00ededed, 0x7b007b7b, 0x7e7e007e
|
||||
.long 0xf3f3f300, 0x00e7e7e7, 0xf900f9f9, 0x05050005
|
||||
.long 0x9d9d9d00, 0x003b3b3b, 0xce00cece, 0xb7b700b7
|
||||
.long 0x7f7f7f00, 0x00fefefe, 0xbf00bfbf, 0x31310031
|
||||
.long 0xbfbfbf00, 0x007f7f7f, 0xdf00dfdf, 0x17170017
|
||||
.long 0xe2e2e200, 0x00c5c5c5, 0x71007171, 0xd7d700d7
|
||||
.long 0x52525200, 0x00a4a4a4, 0x29002929, 0x58580058
|
||||
.long 0x9b9b9b00, 0x00373737, 0xcd00cdcd, 0x61610061
|
||||
.long 0xd8d8d800, 0x00b1b1b1, 0x6c006c6c, 0x1b1b001b
|
||||
.long 0x26262600, 0x004c4c4c, 0x13001313, 0x1c1c001c
|
||||
.long 0xc8c8c800, 0x00919191, 0x64006464, 0x0f0f000f
|
||||
.long 0x37373700, 0x006e6e6e, 0x9b009b9b, 0x16160016
|
||||
.long 0xc6c6c600, 0x008d8d8d, 0x63006363, 0x18180018
|
||||
.long 0x3b3b3b00, 0x00767676, 0x9d009d9d, 0x22220022
|
||||
.long 0x81818100, 0x00030303, 0xc000c0c0, 0x44440044
|
||||
.long 0x96969600, 0x002d2d2d, 0x4b004b4b, 0xb2b200b2
|
||||
.long 0x6f6f6f00, 0x00dedede, 0xb700b7b7, 0xb5b500b5
|
||||
.long 0x4b4b4b00, 0x00969696, 0xa500a5a5, 0x91910091
|
||||
.long 0x13131300, 0x00262626, 0x89008989, 0x08080008
|
||||
.long 0xbebebe00, 0x007d7d7d, 0x5f005f5f, 0xa8a800a8
|
||||
.long 0x63636300, 0x00c6c6c6, 0xb100b1b1, 0xfcfc00fc
|
||||
.long 0x2e2e2e00, 0x005c5c5c, 0x17001717, 0x50500050
|
||||
.long 0xe9e9e900, 0x00d3d3d3, 0xf400f4f4, 0xd0d000d0
|
||||
.long 0x79797900, 0x00f2f2f2, 0xbc00bcbc, 0x7d7d007d
|
||||
.long 0xa7a7a700, 0x004f4f4f, 0xd300d3d3, 0x89890089
|
||||
.long 0x8c8c8c00, 0x00191919, 0x46004646, 0x97970097
|
||||
.long 0x9f9f9f00, 0x003f3f3f, 0xcf00cfcf, 0x5b5b005b
|
||||
.long 0x6e6e6e00, 0x00dcdcdc, 0x37003737, 0x95950095
|
||||
.long 0xbcbcbc00, 0x00797979, 0x5e005e5e, 0xffff00ff
|
||||
.long 0x8e8e8e00, 0x001d1d1d, 0x47004747, 0xd2d200d2
|
||||
.long 0x29292900, 0x00525252, 0x94009494, 0xc4c400c4
|
||||
.long 0xf5f5f500, 0x00ebebeb, 0xfa00fafa, 0x48480048
|
||||
.long 0xf9f9f900, 0x00f3f3f3, 0xfc00fcfc, 0xf7f700f7
|
||||
.long 0xb6b6b600, 0x006d6d6d, 0x5b005b5b, 0xdbdb00db
|
||||
.long 0x2f2f2f00, 0x005e5e5e, 0x97009797, 0x03030003
|
||||
.long 0xfdfdfd00, 0x00fbfbfb, 0xfe00fefe, 0xdada00da
|
||||
.long 0xb4b4b400, 0x00696969, 0x5a005a5a, 0x3f3f003f
|
||||
.long 0x59595900, 0x00b2b2b2, 0xac00acac, 0x94940094
|
||||
.long 0x78787800, 0x00f0f0f0, 0x3c003c3c, 0x5c5c005c
|
||||
.long 0x98989800, 0x00313131, 0x4c004c4c, 0x02020002
|
||||
.long 0x06060600, 0x000c0c0c, 0x03000303, 0x4a4a004a
|
||||
.long 0x6a6a6a00, 0x00d4d4d4, 0x35003535, 0x33330033
|
||||
.long 0xe7e7e700, 0x00cfcfcf, 0xf300f3f3, 0x67670067
|
||||
.long 0x46464600, 0x008c8c8c, 0x23002323, 0xf3f300f3
|
||||
.long 0x71717100, 0x00e2e2e2, 0xb800b8b8, 0x7f7f007f
|
||||
.long 0xbababa00, 0x00757575, 0x5d005d5d, 0xe2e200e2
|
||||
.long 0xd4d4d400, 0x00a9a9a9, 0x6a006a6a, 0x9b9b009b
|
||||
.long 0x25252500, 0x004a4a4a, 0x92009292, 0x26260026
|
||||
.long 0xababab00, 0x00575757, 0xd500d5d5, 0x37370037
|
||||
.long 0x42424200, 0x00848484, 0x21002121, 0x3b3b003b
|
||||
.long 0x88888800, 0x00111111, 0x44004444, 0x96960096
|
||||
.long 0xa2a2a200, 0x00454545, 0x51005151, 0x4b4b004b
|
||||
.long 0x8d8d8d00, 0x001b1b1b, 0xc600c6c6, 0xbebe00be
|
||||
.long 0xfafafa00, 0x00f5f5f5, 0x7d007d7d, 0x2e2e002e
|
||||
.long 0x72727200, 0x00e4e4e4, 0x39003939, 0x79790079
|
||||
.long 0x07070700, 0x000e0e0e, 0x83008383, 0x8c8c008c
|
||||
.long 0xb9b9b900, 0x00737373, 0xdc00dcdc, 0x6e6e006e
|
||||
.long 0x55555500, 0x00aaaaaa, 0xaa00aaaa, 0x8e8e008e
|
||||
.long 0xf8f8f800, 0x00f1f1f1, 0x7c007c7c, 0xf5f500f5
|
||||
.long 0xeeeeee00, 0x00dddddd, 0x77007777, 0xb6b600b6
|
||||
.long 0xacacac00, 0x00595959, 0x56005656, 0xfdfd00fd
|
||||
.long 0x0a0a0a00, 0x00141414, 0x05000505, 0x59590059
|
||||
.long 0x36363600, 0x006c6c6c, 0x1b001b1b, 0x98980098
|
||||
.long 0x49494900, 0x00929292, 0xa400a4a4, 0x6a6a006a
|
||||
.long 0x2a2a2a00, 0x00545454, 0x15001515, 0x46460046
|
||||
.long 0x68686800, 0x00d0d0d0, 0x34003434, 0xbaba00ba
|
||||
.long 0x3c3c3c00, 0x00787878, 0x1e001e1e, 0x25250025
|
||||
.long 0x38383800, 0x00707070, 0x1c001c1c, 0x42420042
|
||||
.long 0xf1f1f100, 0x00e3e3e3, 0xf800f8f8, 0xa2a200a2
|
||||
.long 0xa4a4a400, 0x00494949, 0x52005252, 0xfafa00fa
|
||||
.long 0x40404000, 0x00808080, 0x20002020, 0x07070007
|
||||
.long 0x28282800, 0x00505050, 0x14001414, 0x55550055
|
||||
.long 0xd3d3d300, 0x00a7a7a7, 0xe900e9e9, 0xeeee00ee
|
||||
.long 0x7b7b7b00, 0x00f6f6f6, 0xbd00bdbd, 0x0a0a000a
|
||||
.long 0xbbbbbb00, 0x00777777, 0xdd00dddd, 0x49490049
|
||||
.long 0xc9c9c900, 0x00939393, 0xe400e4e4, 0x68680068
|
||||
.long 0x43434300, 0x00868686, 0xa100a1a1, 0x38380038
|
||||
.long 0xc1c1c100, 0x00838383, 0xe000e0e0, 0xa4a400a4
|
||||
.long 0x15151500, 0x002a2a2a, 0x8a008a8a, 0x28280028
|
||||
.long 0xe3e3e300, 0x00c7c7c7, 0xf100f1f1, 0x7b7b007b
|
||||
.long 0xadadad00, 0x005b5b5b, 0xd600d6d6, 0xc9c900c9
|
||||
.long 0xf4f4f400, 0x00e9e9e9, 0x7a007a7a, 0xc1c100c1
|
||||
.long 0x77777700, 0x00eeeeee, 0xbb00bbbb, 0xe3e300e3
|
||||
.long 0xc7c7c700, 0x008f8f8f, 0xe300e3e3, 0xf4f400f4
|
||||
.long 0x80808000, 0x00010101, 0x40004040, 0xc7c700c7
|
||||
.long 0x9e9e9e00, 0x003d3d3d, 0x4f004f4f, 0x9e9e009e
|
||||
|
||||
#endif /*HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS*/
|
||||
#endif /*__ARM_ARCH >= 6*/
|
||||
@@ -0,0 +1,714 @@
|
||||
/* camellia-glue.c - Glue for the Camellia cipher
|
||||
* Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*/
|
||||
|
||||
/* I put all the libgcrypt-specific stuff in this file to keep the
|
||||
camellia.c/camellia.h files exactly as provided by NTT. If they
|
||||
update their code, this should make it easier to bring the changes
|
||||
in. - dshaw
|
||||
|
||||
There is one small change which needs to be done: Include the
|
||||
following code at the top of camellia.h: */
|
||||
#if 0
|
||||
|
||||
/* To use Camellia with libraries it is often useful to keep the name
|
||||
* space of the library clean. The following macro is thus useful:
|
||||
*
|
||||
* #define CAMELLIA_EXT_SYM_PREFIX foo_
|
||||
*
|
||||
* This prefixes all external symbols with "foo_".
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#ifdef CAMELLIA_EXT_SYM_PREFIX
|
||||
#define CAMELLIA_PREFIX1(x,y) x ## y
|
||||
#define CAMELLIA_PREFIX2(x,y) CAMELLIA_PREFIX1(x,y)
|
||||
#define CAMELLIA_PREFIX(x) CAMELLIA_PREFIX2(CAMELLIA_EXT_SYM_PREFIX,x)
|
||||
#define Camellia_Ekeygen CAMELLIA_PREFIX(Camellia_Ekeygen)
|
||||
#define Camellia_EncryptBlock CAMELLIA_PREFIX(Camellia_EncryptBlock)
|
||||
#define Camellia_DecryptBlock CAMELLIA_PREFIX(Camellia_DecryptBlock)
|
||||
#define camellia_decrypt128 CAMELLIA_PREFIX(camellia_decrypt128)
|
||||
#define camellia_decrypt256 CAMELLIA_PREFIX(camellia_decrypt256)
|
||||
#define camellia_encrypt128 CAMELLIA_PREFIX(camellia_encrypt128)
|
||||
#define camellia_encrypt256 CAMELLIA_PREFIX(camellia_encrypt256)
|
||||
#define camellia_setup128 CAMELLIA_PREFIX(camellia_setup128)
|
||||
#define camellia_setup192 CAMELLIA_PREFIX(camellia_setup192)
|
||||
#define camellia_setup256 CAMELLIA_PREFIX(camellia_setup256)
|
||||
#endif /*CAMELLIA_EXT_SYM_PREFIX*/
|
||||
|
||||
#endif /* Code sample. */
|
||||
|
||||
|
||||
#include <config.h>
|
||||
#include "types.h"
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
#include "camellia.h"
|
||||
#include "bufhelp.h"
|
||||
#include "cipher-selftest.h"
|
||||
|
||||
/* Helper macro to force alignment to 16 bytes. */
|
||||
#ifdef HAVE_GCC_ATTRIBUTE_ALIGNED
|
||||
# define ATTR_ALIGNED_16 __attribute__ ((aligned (16)))
|
||||
#else
|
||||
# define ATTR_ALIGNED_16
|
||||
#endif
|
||||
|
||||
/* USE_AESNI inidicates whether to compile with Intel AES-NI/AVX code. */
|
||||
#undef USE_AESNI_AVX
|
||||
#if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX_SUPPORT)
|
||||
# if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS)
|
||||
# define USE_AESNI_AVX 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* USE_AESNI_AVX2 inidicates whether to compile with Intel AES-NI/AVX2 code. */
|
||||
#undef USE_AESNI_AVX2
|
||||
#if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX2_SUPPORT)
|
||||
# if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS)
|
||||
# define USE_AESNI_AVX2 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
KEY_TABLE_TYPE keytable;
|
||||
int keybitlength;
|
||||
#ifdef USE_AESNI_AVX
|
||||
unsigned int use_aesni_avx:1; /* AES-NI/AVX implementation shall be used. */
|
||||
#endif /*USE_AESNI_AVX*/
|
||||
#ifdef USE_AESNI_AVX2
|
||||
unsigned int use_aesni_avx2:1;/* AES-NI/AVX2 implementation shall be used. */
|
||||
#endif /*USE_AESNI_AVX2*/
|
||||
} CAMELLIA_context;
|
||||
|
||||
#ifdef USE_AESNI_AVX
|
||||
/* Assembler implementations of Camellia using AES-NI and AVX. Process data
|
||||
in 16 block same time.
|
||||
*/
|
||||
extern void _gcry_camellia_aesni_avx_ctr_enc(CAMELLIA_context *ctx,
|
||||
unsigned char *out,
|
||||
const unsigned char *in,
|
||||
unsigned char *ctr);
|
||||
|
||||
extern void _gcry_camellia_aesni_avx_cbc_dec(CAMELLIA_context *ctx,
|
||||
unsigned char *out,
|
||||
const unsigned char *in,
|
||||
unsigned char *iv);
|
||||
|
||||
extern void _gcry_camellia_aesni_avx_cfb_dec(CAMELLIA_context *ctx,
|
||||
unsigned char *out,
|
||||
const unsigned char *in,
|
||||
unsigned char *iv);
|
||||
|
||||
extern void _gcry_camellia_aesni_avx_keygen(CAMELLIA_context *ctx,
|
||||
const unsigned char *key,
|
||||
unsigned int keylen);
|
||||
#endif
|
||||
|
||||
#ifdef USE_AESNI_AVX2
|
||||
/* Assembler implementations of Camellia using AES-NI and AVX2. Process data
|
||||
in 32 block same time.
|
||||
*/
|
||||
extern void _gcry_camellia_aesni_avx2_ctr_enc(CAMELLIA_context *ctx,
|
||||
unsigned char *out,
|
||||
const unsigned char *in,
|
||||
unsigned char *ctr);
|
||||
|
||||
extern void _gcry_camellia_aesni_avx2_cbc_dec(CAMELLIA_context *ctx,
|
||||
unsigned char *out,
|
||||
const unsigned char *in,
|
||||
unsigned char *iv);
|
||||
|
||||
extern void _gcry_camellia_aesni_avx2_cfb_dec(CAMELLIA_context *ctx,
|
||||
unsigned char *out,
|
||||
const unsigned char *in,
|
||||
unsigned char *iv);
|
||||
#endif
|
||||
|
||||
static const char *selftest(void);
|
||||
|
||||
static gcry_err_code_t
|
||||
camellia_setkey(void *c, const byte *key, unsigned keylen)
|
||||
{
|
||||
CAMELLIA_context *ctx=c;
|
||||
static int initialized=0;
|
||||
static const char *selftest_failed=NULL;
|
||||
#if defined(USE_AESNI_AVX) || defined(USE_AESNI_AVX2)
|
||||
unsigned int hwf = _gcry_get_hw_features ();
|
||||
#endif
|
||||
|
||||
if(keylen!=16 && keylen!=24 && keylen!=32)
|
||||
return GPG_ERR_INV_KEYLEN;
|
||||
|
||||
if(!initialized)
|
||||
{
|
||||
initialized=1;
|
||||
selftest_failed=selftest();
|
||||
if(selftest_failed)
|
||||
log_error("%s\n",selftest_failed);
|
||||
}
|
||||
|
||||
if(selftest_failed)
|
||||
return GPG_ERR_SELFTEST_FAILED;
|
||||
|
||||
#ifdef USE_AESNI_AVX
|
||||
ctx->use_aesni_avx = (hwf & HWF_INTEL_AESNI) && (hwf & HWF_INTEL_AVX);
|
||||
#endif
|
||||
#ifdef USE_AESNI_AVX2
|
||||
ctx->use_aesni_avx2 = (hwf & HWF_INTEL_AESNI) && (hwf & HWF_INTEL_AVX2);
|
||||
#endif
|
||||
|
||||
ctx->keybitlength=keylen*8;
|
||||
|
||||
if (0)
|
||||
{ }
|
||||
#ifdef USE_AESNI_AVX
|
||||
else if (ctx->use_aesni_avx)
|
||||
_gcry_camellia_aesni_avx_keygen(ctx, key, keylen);
|
||||
else
|
||||
#endif
|
||||
{
|
||||
Camellia_Ekeygen(ctx->keybitlength,key,ctx->keytable);
|
||||
_gcry_burn_stack
|
||||
((19+34+34)*sizeof(u32)+2*sizeof(void*) /* camellia_setup256 */
|
||||
+(4+32)*sizeof(u32)+2*sizeof(void*) /* camellia_setup192 */
|
||||
+0+sizeof(int)+2*sizeof(void*) /* Camellia_Ekeygen */
|
||||
+3*2*sizeof(void*) /* Function calls. */
|
||||
);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef USE_ARM_ASM
|
||||
|
||||
/* Assembly implementations of Camellia. */
|
||||
extern void _gcry_camellia_arm_encrypt_block(const KEY_TABLE_TYPE keyTable,
|
||||
byte *outbuf, const byte *inbuf,
|
||||
const int keybits);
|
||||
|
||||
extern void _gcry_camellia_arm_decrypt_block(const KEY_TABLE_TYPE keyTable,
|
||||
byte *outbuf, const byte *inbuf,
|
||||
const int keybits);
|
||||
|
||||
static void Camellia_EncryptBlock(const int keyBitLength,
|
||||
const unsigned char *plaintext,
|
||||
const KEY_TABLE_TYPE keyTable,
|
||||
unsigned char *cipherText)
|
||||
{
|
||||
_gcry_camellia_arm_encrypt_block(keyTable, cipherText, plaintext,
|
||||
keyBitLength);
|
||||
}
|
||||
|
||||
static void Camellia_DecryptBlock(const int keyBitLength,
|
||||
const unsigned char *cipherText,
|
||||
const KEY_TABLE_TYPE keyTable,
|
||||
unsigned char *plaintext)
|
||||
{
|
||||
_gcry_camellia_arm_decrypt_block(keyTable, plaintext, cipherText,
|
||||
keyBitLength);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
camellia_encrypt(void *c, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAMELLIA_context *ctx = c;
|
||||
Camellia_EncryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf);
|
||||
#define CAMELLIA_encrypt_stack_burn_size (15*4)
|
||||
return /*burn_stack*/ (CAMELLIA_encrypt_stack_burn_size);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
camellia_decrypt(void *c, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAMELLIA_context *ctx=c;
|
||||
Camellia_DecryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf);
|
||||
#define CAMELLIA_decrypt_stack_burn_size (15*4)
|
||||
return /*burn_stack*/ (CAMELLIA_decrypt_stack_burn_size);
|
||||
}
|
||||
|
||||
#else /*USE_ARM_ASM*/
|
||||
|
||||
static unsigned int
|
||||
camellia_encrypt(void *c, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAMELLIA_context *ctx=c;
|
||||
|
||||
Camellia_EncryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf);
|
||||
|
||||
#define CAMELLIA_encrypt_stack_burn_size \
|
||||
(sizeof(int)+2*sizeof(unsigned char *)+sizeof(void*/*KEY_TABLE_TYPE*/) \
|
||||
+4*sizeof(u32)+4*sizeof(u32) \
|
||||
+2*sizeof(u32*)+4*sizeof(u32) \
|
||||
+2*2*sizeof(void*) /* Function calls. */ \
|
||||
)
|
||||
|
||||
return /*burn_stack*/ (CAMELLIA_encrypt_stack_burn_size);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
camellia_decrypt(void *c, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAMELLIA_context *ctx=c;
|
||||
|
||||
Camellia_DecryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf);
|
||||
|
||||
#define CAMELLIA_decrypt_stack_burn_size \
|
||||
(sizeof(int)+2*sizeof(unsigned char *)+sizeof(void*/*KEY_TABLE_TYPE*/) \
|
||||
+4*sizeof(u32)+4*sizeof(u32) \
|
||||
+2*sizeof(u32*)+4*sizeof(u32) \
|
||||
+2*2*sizeof(void*) /* Function calls. */ \
|
||||
)
|
||||
|
||||
return /*burn_stack*/ (CAMELLIA_decrypt_stack_burn_size);
|
||||
}
|
||||
|
||||
#endif /*!USE_ARM_ASM*/
|
||||
|
||||
/* Bulk encryption of complete blocks in CTR mode. This function is only
|
||||
intended for the bulk encryption feature of cipher.c. CTR is expected to be
|
||||
of size CAMELLIA_BLOCK_SIZE. */
|
||||
void
|
||||
_gcry_camellia_ctr_enc(void *context, unsigned char *ctr,
|
||||
void *outbuf_arg, const void *inbuf_arg,
|
||||
size_t nblocks)
|
||||
{
|
||||
CAMELLIA_context *ctx = context;
|
||||
unsigned char *outbuf = outbuf_arg;
|
||||
const unsigned char *inbuf = inbuf_arg;
|
||||
unsigned char tmpbuf[CAMELLIA_BLOCK_SIZE];
|
||||
int burn_stack_depth = CAMELLIA_encrypt_stack_burn_size;
|
||||
int i;
|
||||
|
||||
#ifdef USE_AESNI_AVX2
|
||||
if (ctx->use_aesni_avx2)
|
||||
{
|
||||
int did_use_aesni_avx2 = 0;
|
||||
|
||||
/* Process data in 32 block chunks. */
|
||||
while (nblocks >= 32)
|
||||
{
|
||||
_gcry_camellia_aesni_avx2_ctr_enc(ctx, outbuf, inbuf, ctr);
|
||||
|
||||
nblocks -= 32;
|
||||
outbuf += 32 * CAMELLIA_BLOCK_SIZE;
|
||||
inbuf += 32 * CAMELLIA_BLOCK_SIZE;
|
||||
did_use_aesni_avx2 = 1;
|
||||
}
|
||||
|
||||
if (did_use_aesni_avx2)
|
||||
{
|
||||
int avx2_burn_stack_depth = 32 * CAMELLIA_BLOCK_SIZE + 16 +
|
||||
2 * sizeof(void *);
|
||||
|
||||
if (burn_stack_depth < avx2_burn_stack_depth)
|
||||
burn_stack_depth = avx2_burn_stack_depth;
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
/* TODO: use caching instead? */
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_AESNI_AVX
|
||||
if (ctx->use_aesni_avx)
|
||||
{
|
||||
int did_use_aesni_avx = 0;
|
||||
|
||||
/* Process data in 16 block chunks. */
|
||||
while (nblocks >= 16)
|
||||
{
|
||||
_gcry_camellia_aesni_avx_ctr_enc(ctx, outbuf, inbuf, ctr);
|
||||
|
||||
nblocks -= 16;
|
||||
outbuf += 16 * CAMELLIA_BLOCK_SIZE;
|
||||
inbuf += 16 * CAMELLIA_BLOCK_SIZE;
|
||||
did_use_aesni_avx = 1;
|
||||
}
|
||||
|
||||
if (did_use_aesni_avx)
|
||||
{
|
||||
if (burn_stack_depth < 16 * CAMELLIA_BLOCK_SIZE + 2 * sizeof(void *))
|
||||
burn_stack_depth = 16 * CAMELLIA_BLOCK_SIZE + 2 * sizeof(void *);
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
/* TODO: use caching instead? */
|
||||
}
|
||||
#endif
|
||||
|
||||
for ( ;nblocks; nblocks-- )
|
||||
{
|
||||
/* Encrypt the counter. */
|
||||
Camellia_EncryptBlock(ctx->keybitlength, ctr, ctx->keytable, tmpbuf);
|
||||
/* XOR the input with the encrypted counter and store in output. */
|
||||
buf_xor(outbuf, tmpbuf, inbuf, CAMELLIA_BLOCK_SIZE);
|
||||
outbuf += CAMELLIA_BLOCK_SIZE;
|
||||
inbuf += CAMELLIA_BLOCK_SIZE;
|
||||
/* Increment the counter. */
|
||||
for (i = CAMELLIA_BLOCK_SIZE; i > 0; i--)
|
||||
{
|
||||
ctr[i-1]++;
|
||||
if (ctr[i-1])
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
wipememory(tmpbuf, sizeof(tmpbuf));
|
||||
_gcry_burn_stack(burn_stack_depth);
|
||||
}
|
||||
|
||||
/* Bulk decryption of complete blocks in CBC mode. This function is only
|
||||
intended for the bulk encryption feature of cipher.c. */
|
||||
void
|
||||
_gcry_camellia_cbc_dec(void *context, unsigned char *iv,
|
||||
void *outbuf_arg, const void *inbuf_arg,
|
||||
size_t nblocks)
|
||||
{
|
||||
CAMELLIA_context *ctx = context;
|
||||
unsigned char *outbuf = outbuf_arg;
|
||||
const unsigned char *inbuf = inbuf_arg;
|
||||
unsigned char savebuf[CAMELLIA_BLOCK_SIZE];
|
||||
int burn_stack_depth = CAMELLIA_decrypt_stack_burn_size;
|
||||
|
||||
#ifdef USE_AESNI_AVX2
|
||||
if (ctx->use_aesni_avx2)
|
||||
{
|
||||
int did_use_aesni_avx2 = 0;
|
||||
|
||||
/* Process data in 32 block chunks. */
|
||||
while (nblocks >= 32)
|
||||
{
|
||||
_gcry_camellia_aesni_avx2_cbc_dec(ctx, outbuf, inbuf, iv);
|
||||
|
||||
nblocks -= 32;
|
||||
outbuf += 32 * CAMELLIA_BLOCK_SIZE;
|
||||
inbuf += 32 * CAMELLIA_BLOCK_SIZE;
|
||||
did_use_aesni_avx2 = 1;
|
||||
}
|
||||
|
||||
if (did_use_aesni_avx2)
|
||||
{
|
||||
int avx2_burn_stack_depth = 32 * CAMELLIA_BLOCK_SIZE + 16 +
|
||||
2 * sizeof(void *);
|
||||
|
||||
if (burn_stack_depth < avx2_burn_stack_depth)
|
||||
burn_stack_depth = avx2_burn_stack_depth;
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_AESNI_AVX
|
||||
if (ctx->use_aesni_avx)
|
||||
{
|
||||
int did_use_aesni_avx = 0;
|
||||
|
||||
/* Process data in 16 block chunks. */
|
||||
while (nblocks >= 16)
|
||||
{
|
||||
_gcry_camellia_aesni_avx_cbc_dec(ctx, outbuf, inbuf, iv);
|
||||
|
||||
nblocks -= 16;
|
||||
outbuf += 16 * CAMELLIA_BLOCK_SIZE;
|
||||
inbuf += 16 * CAMELLIA_BLOCK_SIZE;
|
||||
did_use_aesni_avx = 1;
|
||||
}
|
||||
|
||||
if (did_use_aesni_avx)
|
||||
{
|
||||
if (burn_stack_depth < 16 * CAMELLIA_BLOCK_SIZE + 2 * sizeof(void *))
|
||||
burn_stack_depth = 16 * CAMELLIA_BLOCK_SIZE + 2 * sizeof(void *);
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
}
|
||||
#endif
|
||||
|
||||
for ( ;nblocks; nblocks-- )
|
||||
{
|
||||
/* INBUF is needed later and it may be identical to OUTBUF, so store
|
||||
the intermediate result to SAVEBUF. */
|
||||
Camellia_DecryptBlock(ctx->keybitlength, inbuf, ctx->keytable, savebuf);
|
||||
|
||||
buf_xor_n_copy_2(outbuf, savebuf, iv, inbuf, CAMELLIA_BLOCK_SIZE);
|
||||
inbuf += CAMELLIA_BLOCK_SIZE;
|
||||
outbuf += CAMELLIA_BLOCK_SIZE;
|
||||
}
|
||||
|
||||
wipememory(savebuf, sizeof(savebuf));
|
||||
_gcry_burn_stack(burn_stack_depth);
|
||||
}
|
||||
|
||||
/* Bulk decryption of complete blocks in CFB mode. This function is only
|
||||
intended for the bulk encryption feature of cipher.c. */
|
||||
void
|
||||
_gcry_camellia_cfb_dec(void *context, unsigned char *iv,
|
||||
void *outbuf_arg, const void *inbuf_arg,
|
||||
size_t nblocks)
|
||||
{
|
||||
CAMELLIA_context *ctx = context;
|
||||
unsigned char *outbuf = outbuf_arg;
|
||||
const unsigned char *inbuf = inbuf_arg;
|
||||
int burn_stack_depth = CAMELLIA_decrypt_stack_burn_size;
|
||||
|
||||
#ifdef USE_AESNI_AVX2
|
||||
if (ctx->use_aesni_avx2)
|
||||
{
|
||||
int did_use_aesni_avx2 = 0;
|
||||
|
||||
/* Process data in 32 block chunks. */
|
||||
while (nblocks >= 32)
|
||||
{
|
||||
_gcry_camellia_aesni_avx2_cfb_dec(ctx, outbuf, inbuf, iv);
|
||||
|
||||
nblocks -= 32;
|
||||
outbuf += 32 * CAMELLIA_BLOCK_SIZE;
|
||||
inbuf += 32 * CAMELLIA_BLOCK_SIZE;
|
||||
did_use_aesni_avx2 = 1;
|
||||
}
|
||||
|
||||
if (did_use_aesni_avx2)
|
||||
{
|
||||
int avx2_burn_stack_depth = 32 * CAMELLIA_BLOCK_SIZE + 16 +
|
||||
2 * sizeof(void *);
|
||||
|
||||
if (burn_stack_depth < avx2_burn_stack_depth)
|
||||
burn_stack_depth = avx2_burn_stack_depth;
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_AESNI_AVX
|
||||
if (ctx->use_aesni_avx)
|
||||
{
|
||||
int did_use_aesni_avx = 0;
|
||||
|
||||
/* Process data in 16 block chunks. */
|
||||
while (nblocks >= 16)
|
||||
{
|
||||
_gcry_camellia_aesni_avx_cfb_dec(ctx, outbuf, inbuf, iv);
|
||||
|
||||
nblocks -= 16;
|
||||
outbuf += 16 * CAMELLIA_BLOCK_SIZE;
|
||||
inbuf += 16 * CAMELLIA_BLOCK_SIZE;
|
||||
did_use_aesni_avx = 1;
|
||||
}
|
||||
|
||||
if (did_use_aesni_avx)
|
||||
{
|
||||
if (burn_stack_depth < 16 * CAMELLIA_BLOCK_SIZE + 2 * sizeof(void *))
|
||||
burn_stack_depth = 16 * CAMELLIA_BLOCK_SIZE + 2 * sizeof(void *);
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
}
|
||||
#endif
|
||||
|
||||
for ( ;nblocks; nblocks-- )
|
||||
{
|
||||
Camellia_EncryptBlock(ctx->keybitlength, iv, ctx->keytable, iv);
|
||||
buf_xor_n_copy(outbuf, iv, inbuf, CAMELLIA_BLOCK_SIZE);
|
||||
outbuf += CAMELLIA_BLOCK_SIZE;
|
||||
inbuf += CAMELLIA_BLOCK_SIZE;
|
||||
}
|
||||
|
||||
_gcry_burn_stack(burn_stack_depth);
|
||||
}
|
||||
|
||||
/* Run the self-tests for CAMELLIA-CTR-128, tests IV increment of bulk CTR
|
||||
encryption. Returns NULL on success. */
|
||||
static const char*
|
||||
selftest_ctr_128 (void)
|
||||
{
|
||||
const int nblocks = 32+16+1;
|
||||
const int blocksize = CAMELLIA_BLOCK_SIZE;
|
||||
const int context_size = sizeof(CAMELLIA_context);
|
||||
|
||||
return _gcry_selftest_helper_ctr("CAMELLIA", &camellia_setkey,
|
||||
&camellia_encrypt, &_gcry_camellia_ctr_enc, nblocks, blocksize,
|
||||
context_size);
|
||||
}
|
||||
|
||||
/* Run the self-tests for CAMELLIA-CBC-128, tests bulk CBC decryption.
|
||||
Returns NULL on success. */
|
||||
static const char*
|
||||
selftest_cbc_128 (void)
|
||||
{
|
||||
const int nblocks = 32+16+2;
|
||||
const int blocksize = CAMELLIA_BLOCK_SIZE;
|
||||
const int context_size = sizeof(CAMELLIA_context);
|
||||
|
||||
return _gcry_selftest_helper_cbc("CAMELLIA", &camellia_setkey,
|
||||
&camellia_encrypt, &_gcry_camellia_cbc_dec, nblocks, blocksize,
|
||||
context_size);
|
||||
}
|
||||
|
||||
/* Run the self-tests for CAMELLIA-CFB-128, tests bulk CFB decryption.
|
||||
Returns NULL on success. */
|
||||
static const char*
|
||||
selftest_cfb_128 (void)
|
||||
{
|
||||
const int nblocks = 32+16+2;
|
||||
const int blocksize = CAMELLIA_BLOCK_SIZE;
|
||||
const int context_size = sizeof(CAMELLIA_context);
|
||||
|
||||
return _gcry_selftest_helper_cfb("CAMELLIA", &camellia_setkey,
|
||||
&camellia_encrypt, &_gcry_camellia_cfb_dec, nblocks, blocksize,
|
||||
context_size);
|
||||
}
|
||||
|
||||
static const char *
|
||||
selftest(void)
|
||||
{
|
||||
CAMELLIA_context ctx;
|
||||
byte scratch[16];
|
||||
const char *r;
|
||||
|
||||
/* These test vectors are from RFC-3713 */
|
||||
static const byte plaintext[]=
|
||||
{
|
||||
0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
|
||||
0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10
|
||||
};
|
||||
static const byte key_128[]=
|
||||
{
|
||||
0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
|
||||
0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10
|
||||
};
|
||||
static const byte ciphertext_128[]=
|
||||
{
|
||||
0x67,0x67,0x31,0x38,0x54,0x96,0x69,0x73,
|
||||
0x08,0x57,0x06,0x56,0x48,0xea,0xbe,0x43
|
||||
};
|
||||
static const byte key_192[]=
|
||||
{
|
||||
0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc,0xba,0x98,
|
||||
0x76,0x54,0x32,0x10,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77
|
||||
};
|
||||
static const byte ciphertext_192[]=
|
||||
{
|
||||
0xb4,0x99,0x34,0x01,0xb3,0xe9,0x96,0xf8,
|
||||
0x4e,0xe5,0xce,0xe7,0xd7,0x9b,0x09,0xb9
|
||||
};
|
||||
static const byte key_256[]=
|
||||
{
|
||||
0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc,0xba,
|
||||
0x98,0x76,0x54,0x32,0x10,0x00,0x11,0x22,0x33,0x44,0x55,
|
||||
0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff
|
||||
};
|
||||
static const byte ciphertext_256[]=
|
||||
{
|
||||
0x9a,0xcc,0x23,0x7d,0xff,0x16,0xd7,0x6c,
|
||||
0x20,0xef,0x7c,0x91,0x9e,0x3a,0x75,0x09
|
||||
};
|
||||
|
||||
camellia_setkey(&ctx,key_128,sizeof(key_128));
|
||||
camellia_encrypt(&ctx,scratch,plaintext);
|
||||
if(memcmp(scratch,ciphertext_128,sizeof(ciphertext_128))!=0)
|
||||
return "CAMELLIA-128 test encryption failed.";
|
||||
camellia_decrypt(&ctx,scratch,scratch);
|
||||
if(memcmp(scratch,plaintext,sizeof(plaintext))!=0)
|
||||
return "CAMELLIA-128 test decryption failed.";
|
||||
|
||||
camellia_setkey(&ctx,key_192,sizeof(key_192));
|
||||
camellia_encrypt(&ctx,scratch,plaintext);
|
||||
if(memcmp(scratch,ciphertext_192,sizeof(ciphertext_192))!=0)
|
||||
return "CAMELLIA-192 test encryption failed.";
|
||||
camellia_decrypt(&ctx,scratch,scratch);
|
||||
if(memcmp(scratch,plaintext,sizeof(plaintext))!=0)
|
||||
return "CAMELLIA-192 test decryption failed.";
|
||||
|
||||
camellia_setkey(&ctx,key_256,sizeof(key_256));
|
||||
camellia_encrypt(&ctx,scratch,plaintext);
|
||||
if(memcmp(scratch,ciphertext_256,sizeof(ciphertext_256))!=0)
|
||||
return "CAMELLIA-256 test encryption failed.";
|
||||
camellia_decrypt(&ctx,scratch,scratch);
|
||||
if(memcmp(scratch,plaintext,sizeof(plaintext))!=0)
|
||||
return "CAMELLIA-256 test decryption failed.";
|
||||
|
||||
if ( (r = selftest_ctr_128 ()) )
|
||||
return r;
|
||||
|
||||
if ( (r = selftest_cbc_128 ()) )
|
||||
return r;
|
||||
|
||||
if ( (r = selftest_cfb_128 ()) )
|
||||
return r;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* These oids are from
|
||||
<http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications_oid.html>,
|
||||
retrieved May 1, 2007. */
|
||||
|
||||
static gcry_cipher_oid_spec_t camellia128_oids[] =
|
||||
{
|
||||
{"1.2.392.200011.61.1.1.1.2", GCRY_CIPHER_MODE_CBC},
|
||||
{"0.3.4401.5.3.1.9.1", GCRY_CIPHER_MODE_ECB},
|
||||
{"0.3.4401.5.3.1.9.3", GCRY_CIPHER_MODE_OFB},
|
||||
{"0.3.4401.5.3.1.9.4", GCRY_CIPHER_MODE_CFB},
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
static gcry_cipher_oid_spec_t camellia192_oids[] =
|
||||
{
|
||||
{"1.2.392.200011.61.1.1.1.3", GCRY_CIPHER_MODE_CBC},
|
||||
{"0.3.4401.5.3.1.9.21", GCRY_CIPHER_MODE_ECB},
|
||||
{"0.3.4401.5.3.1.9.23", GCRY_CIPHER_MODE_OFB},
|
||||
{"0.3.4401.5.3.1.9.24", GCRY_CIPHER_MODE_CFB},
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
static gcry_cipher_oid_spec_t camellia256_oids[] =
|
||||
{
|
||||
{"1.2.392.200011.61.1.1.1.4", GCRY_CIPHER_MODE_CBC},
|
||||
{"0.3.4401.5.3.1.9.41", GCRY_CIPHER_MODE_ECB},
|
||||
{"0.3.4401.5.3.1.9.43", GCRY_CIPHER_MODE_OFB},
|
||||
{"0.3.4401.5.3.1.9.44", GCRY_CIPHER_MODE_CFB},
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
gcry_cipher_spec_t _gcry_cipher_spec_camellia128 =
|
||||
{
|
||||
GCRY_CIPHER_CAMELLIA128, {0, 0},
|
||||
"CAMELLIA128",NULL,camellia128_oids,CAMELLIA_BLOCK_SIZE,128,
|
||||
sizeof(CAMELLIA_context),camellia_setkey,camellia_encrypt,camellia_decrypt
|
||||
};
|
||||
|
||||
gcry_cipher_spec_t _gcry_cipher_spec_camellia192 =
|
||||
{
|
||||
GCRY_CIPHER_CAMELLIA192, {0, 0},
|
||||
"CAMELLIA192",NULL,camellia192_oids,CAMELLIA_BLOCK_SIZE,192,
|
||||
sizeof(CAMELLIA_context),camellia_setkey,camellia_encrypt,camellia_decrypt
|
||||
};
|
||||
|
||||
gcry_cipher_spec_t _gcry_cipher_spec_camellia256 =
|
||||
{
|
||||
GCRY_CIPHER_CAMELLIA256, {0, 0},
|
||||
"CAMELLIA256",NULL,camellia256_oids,CAMELLIA_BLOCK_SIZE,256,
|
||||
sizeof(CAMELLIA_context),camellia_setkey,camellia_encrypt,camellia_decrypt
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,90 @@
|
||||
/* camellia.h ver 1.2.0
|
||||
*
|
||||
* Copyright (C) 2006,2007
|
||||
* NTT (Nippon Telegraph and Telephone Corporation).
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef HEADER_CAMELLIA_H
|
||||
#define HEADER_CAMELLIA_H
|
||||
|
||||
/* To use Camellia with libraries it is often useful to keep the name
|
||||
* space of the library clean. The following macro is thus useful:
|
||||
*
|
||||
* #define CAMELLIA_EXT_SYM_PREFIX foo_
|
||||
*
|
||||
* This prefixes all external symbols with "foo_".
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
/* USE_ARM_ASM indicates whether to use ARM assembly code. */
|
||||
# undef USE_ARM_ASM
|
||||
# if defined(__ARMEL__)
|
||||
# ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS
|
||||
# define USE_ARM_ASM 1
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#ifdef CAMELLIA_EXT_SYM_PREFIX
|
||||
#define CAMELLIA_PREFIX1(x,y) x ## y
|
||||
#define CAMELLIA_PREFIX2(x,y) CAMELLIA_PREFIX1(x,y)
|
||||
#define CAMELLIA_PREFIX(x) CAMELLIA_PREFIX2(CAMELLIA_EXT_SYM_PREFIX,x)
|
||||
#define Camellia_Ekeygen CAMELLIA_PREFIX(Camellia_Ekeygen)
|
||||
#define Camellia_EncryptBlock CAMELLIA_PREFIX(Camellia_EncryptBlock)
|
||||
#define Camellia_DecryptBlock CAMELLIA_PREFIX(Camellia_DecryptBlock)
|
||||
#define camellia_decrypt128 CAMELLIA_PREFIX(camellia_decrypt128)
|
||||
#define camellia_decrypt256 CAMELLIA_PREFIX(camellia_decrypt256)
|
||||
#define camellia_encrypt128 CAMELLIA_PREFIX(camellia_encrypt128)
|
||||
#define camellia_encrypt256 CAMELLIA_PREFIX(camellia_encrypt256)
|
||||
#define camellia_setup128 CAMELLIA_PREFIX(camellia_setup128)
|
||||
#define camellia_setup192 CAMELLIA_PREFIX(camellia_setup192)
|
||||
#define camellia_setup256 CAMELLIA_PREFIX(camellia_setup256)
|
||||
#endif /*CAMELLIA_EXT_SYM_PREFIX*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CAMELLIA_BLOCK_SIZE 16
|
||||
#define CAMELLIA_TABLE_BYTE_LEN 272
|
||||
#define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4)
|
||||
|
||||
typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN];
|
||||
|
||||
|
||||
void Camellia_Ekeygen(const int keyBitLength,
|
||||
const unsigned char *rawKey,
|
||||
KEY_TABLE_TYPE keyTable);
|
||||
|
||||
#ifndef USE_ARM_ASM
|
||||
void Camellia_EncryptBlock(const int keyBitLength,
|
||||
const unsigned char *plaintext,
|
||||
const KEY_TABLE_TYPE keyTable,
|
||||
unsigned char *cipherText);
|
||||
|
||||
void Camellia_DecryptBlock(const int keyBitLength,
|
||||
const unsigned char *cipherText,
|
||||
const KEY_TABLE_TYPE keyTable,
|
||||
unsigned char *plaintext);
|
||||
#endif /*!USE_ARMV6_ASM*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* HEADER_CAMELLIA_H */
|
||||
@@ -0,0 +1,587 @@
|
||||
/* cast5-amd64.S - AMD64 assembly implementation of CAST5 cipher
|
||||
*
|
||||
* Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef __x86_64
|
||||
#include <config.h>
|
||||
#if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && defined(USE_CAST5)
|
||||
|
||||
#ifdef __PIC__
|
||||
# define RIP %rip
|
||||
# define GET_EXTERN_POINTER(name, reg) movq name@GOTPCREL(%rip), reg
|
||||
#else
|
||||
# define RIP
|
||||
# define GET_EXTERN_POINTER(name, reg) leaq name, reg
|
||||
#endif
|
||||
|
||||
.text
|
||||
|
||||
.extern _gcry_cast5_s1to4;
|
||||
|
||||
#define s1 0
|
||||
#define s2 (s1 + (4 * 256))
|
||||
#define s3 (s2 + (4 * 256))
|
||||
#define s4 (s3 + (4 * 256))
|
||||
|
||||
/* structure of CAST5_context: */
|
||||
#define Km 0
|
||||
#define Kr (Km + (16 * 4))
|
||||
|
||||
/* register macros */
|
||||
#define CTX %rdi
|
||||
#define RIO %rsi
|
||||
#define RTAB %r8
|
||||
|
||||
#define RLR0 %r9
|
||||
#define RLR1 %r10
|
||||
#define RLR2 %r11
|
||||
#define RLR3 %r12
|
||||
|
||||
#define RLR0d %r9d
|
||||
#define RLR1d %r10d
|
||||
#define RLR2d %r11d
|
||||
#define RLR3d %r12d
|
||||
|
||||
#define RX0 %rax
|
||||
#define RX1 %rbx
|
||||
#define RX2 %rdx
|
||||
|
||||
#define RX0d %eax
|
||||
#define RX1d %ebx
|
||||
#define RX2d %edx
|
||||
|
||||
#define RX0bl %al
|
||||
#define RX1bl %bl
|
||||
#define RX2bl %dl
|
||||
|
||||
#define RX0bh %ah
|
||||
#define RX1bh %bh
|
||||
#define RX2bh %dh
|
||||
|
||||
#define RKR %rcx
|
||||
#define RKRd %ecx
|
||||
#define RKRbl %cl
|
||||
|
||||
#define RT0 %rbp
|
||||
#define RT1 %rsi
|
||||
|
||||
#define RT0d %ebp
|
||||
#define RT1d %esi
|
||||
|
||||
#define RKM0d %r13d
|
||||
#define RKM1d %r14d
|
||||
|
||||
/***********************************************************************
|
||||
* 1-way cast5
|
||||
***********************************************************************/
|
||||
#define dummy(x)
|
||||
|
||||
#define shr_kr(none) \
|
||||
shrq $8, RKR;
|
||||
|
||||
#define F(km, load_next_kr, op0, op1, op2, op3) \
|
||||
op0 ## l RLR0d, km ## d; \
|
||||
roll RKRbl, km ## d; \
|
||||
rorq $32, RLR0; \
|
||||
movzbl km ## bh, RT0d; \
|
||||
movzbl km ## bl, RT1d; \
|
||||
roll $16, km ## d; \
|
||||
movl s1(RTAB,RT0,4), RT0d; \
|
||||
op1 ## l s2(RTAB,RT1,4), RT0d; \
|
||||
load_next_kr(kr_next); \
|
||||
movzbl km ## bh, RT1d; \
|
||||
movzbl km ## bl, km ## d; \
|
||||
op2 ## l s3(RTAB,RT1,4), RT0d; \
|
||||
op3 ## l s4(RTAB,km,4), RT0d; \
|
||||
xorq RT0, RLR0;
|
||||
|
||||
#define F1(km, load_next_kr) \
|
||||
F(##km, load_next_kr, add, xor, sub, add)
|
||||
#define F2(km, load_next_kr) \
|
||||
F(##km, load_next_kr, xor, sub, add, xor)
|
||||
#define F3(km, load_next_kr) \
|
||||
F(##km, load_next_kr, sub, add, xor, sub)
|
||||
|
||||
#define get_round_km(n, km) \
|
||||
movl Km+4*(n)(CTX), km;
|
||||
|
||||
#define get_round_kr_enc(n) \
|
||||
movq $0x1010101010101010, RKR; \
|
||||
\
|
||||
/* merge rorl rk and rorl $16 */ \
|
||||
xorq Kr+(n)(CTX), RKR;
|
||||
|
||||
#define get_round_kr_dec(n) \
|
||||
movq $0x1010101010101010, RKR; \
|
||||
\
|
||||
/* merge rorl rk and rorl $16 */ \
|
||||
xorq Kr+(n - 7)(CTX), RKR; \
|
||||
bswapq RKR;
|
||||
|
||||
#define round_enc(n, FA, FB, fn1, fn2) \
|
||||
get_round_km(n + 1, RX2d); \
|
||||
FA(RX0, fn1); \
|
||||
get_round_km(n + 2, RX0d); \
|
||||
FB(RX2, fn2);
|
||||
|
||||
#define round_enc_last(n, FXA, FXB) \
|
||||
get_round_km(n + 1, RX2d); \
|
||||
\
|
||||
FXA(RX0, shr_kr); \
|
||||
FXB(RX2, dummy);
|
||||
|
||||
#define round_enc_1(n, FA, FB) \
|
||||
round_enc(n, FA, FB, shr_kr, shr_kr)
|
||||
|
||||
#define round_enc_2(n, FA, FB) \
|
||||
round_enc(n, FA, FB, shr_kr, dummy)
|
||||
|
||||
#define round_dec(n, FA, FB, fn1, fn2) \
|
||||
get_round_km(n - 1, RX2d); \
|
||||
FA(RX0, fn1); \
|
||||
get_round_km(n - 2, RX0d); \
|
||||
FB(RX2, fn2);
|
||||
|
||||
#define round_dec_last(n, FXA, FXB) \
|
||||
get_round_km(n - 1, RX2d); \
|
||||
FXA(RX0, shr_kr); \
|
||||
FXB(RX2, dummy);
|
||||
|
||||
#define round_dec_1(n, FA, FB) \
|
||||
round_dec(n, FA, FB, shr_kr, shr_kr)
|
||||
|
||||
#define round_dec_2(n, FA, FB) \
|
||||
round_dec(n, FA, FB, shr_kr, dummy)
|
||||
|
||||
#define read_block() \
|
||||
movq (RIO), RLR0; \
|
||||
bswapq RLR0;
|
||||
|
||||
#define write_block() \
|
||||
bswapq RLR0; \
|
||||
rorq $32, RLR0; \
|
||||
movq RLR0, (RIO);
|
||||
|
||||
.align 8
|
||||
.globl _gcry_cast5_amd64_encrypt_block
|
||||
.type _gcry_cast5_amd64_encrypt_block,@function;
|
||||
|
||||
_gcry_cast5_amd64_encrypt_block:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst
|
||||
* %rdx: src
|
||||
*/
|
||||
pushq %rbp;
|
||||
pushq %rbx;
|
||||
|
||||
movq %rsi, %r10;
|
||||
|
||||
GET_EXTERN_POINTER(_gcry_cast5_s1to4, RTAB);
|
||||
|
||||
movq %rdx, RIO;
|
||||
read_block();
|
||||
|
||||
get_round_km(0, RX0d);
|
||||
get_round_kr_enc(0);
|
||||
round_enc_1(0, F1, F2);
|
||||
round_enc_1(2, F3, F1);
|
||||
round_enc_1(4, F2, F3);
|
||||
round_enc_2(6, F1, F2);
|
||||
get_round_kr_enc(8);
|
||||
round_enc_1(8, F3, F1);
|
||||
round_enc_1(10, F2, F3);
|
||||
round_enc_1(12, F1, F2);
|
||||
round_enc_last(14, F3, F1);
|
||||
|
||||
movq %r10, RIO;
|
||||
write_block();
|
||||
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
ret;
|
||||
.size _gcry_cast5_amd64_encrypt_block,.-_gcry_cast5_amd64_encrypt_block;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_cast5_amd64_decrypt_block
|
||||
.type _gcry_cast5_amd64_decrypt_block,@function;
|
||||
|
||||
_gcry_cast5_amd64_decrypt_block:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst
|
||||
* %rdx: src
|
||||
*/
|
||||
pushq %rbp;
|
||||
pushq %rbx;
|
||||
|
||||
movq %rsi, %r10;
|
||||
|
||||
GET_EXTERN_POINTER(_gcry_cast5_s1to4, RTAB);
|
||||
|
||||
movq %rdx, RIO;
|
||||
read_block();
|
||||
|
||||
get_round_km(15, RX0d);
|
||||
get_round_kr_dec(15);
|
||||
round_dec_1(15, F1, F3);
|
||||
round_dec_1(13, F2, F1);
|
||||
round_dec_1(11, F3, F2);
|
||||
round_dec_2(9, F1, F3);
|
||||
get_round_kr_dec(7);
|
||||
round_dec_1(7, F2, F1);
|
||||
round_dec_1(5, F3, F2);
|
||||
round_dec_1(3, F1, F3);
|
||||
round_dec_last(1, F2, F1);
|
||||
|
||||
movq %r10, RIO;
|
||||
write_block();
|
||||
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
ret;
|
||||
.size _gcry_cast5_amd64_decrypt_block,.-_gcry_cast5_amd64_decrypt_block;
|
||||
|
||||
/**********************************************************************
|
||||
4-way cast5, four blocks parallel
|
||||
**********************************************************************/
|
||||
#define F_tail(rlr, rx, op1, op2, op3) \
|
||||
movzbl rx ## bh, RT0d; \
|
||||
movzbl rx ## bl, RT1d; \
|
||||
roll $16, rx ## d; \
|
||||
movl s1(RTAB,RT0,4), RT0d; \
|
||||
op1 ## l s2(RTAB,RT1,4), RT0d; \
|
||||
movzbl rx ## bh, RT1d; \
|
||||
movzbl rx ## bl, rx ## d; \
|
||||
op2 ## l s3(RTAB,RT1,4), RT0d; \
|
||||
op3 ## l s4(RTAB,rx,4), RT0d; \
|
||||
xorq RT0, rlr;
|
||||
|
||||
#define F4(km, load_next_kr, op0, op1, op2, op3) \
|
||||
movl km, RX0d; \
|
||||
op0 ## l RLR0d, RX0d; \
|
||||
roll RKRbl, RX0d; \
|
||||
rorq $32, RLR0; \
|
||||
\
|
||||
movl km, RX1d; \
|
||||
op0 ## l RLR1d, RX1d; \
|
||||
roll RKRbl, RX1d; \
|
||||
rorq $32, RLR1; \
|
||||
\
|
||||
movl km, RX2d; \
|
||||
op0 ## l RLR2d, RX2d; \
|
||||
roll RKRbl, RX2d; \
|
||||
rorq $32, RLR2; \
|
||||
\
|
||||
F_tail(RLR0, RX0, op1, op2, op3); \
|
||||
F_tail(RLR1, RX1, op1, op2, op3); \
|
||||
F_tail(RLR2, RX2, op1, op2, op3); \
|
||||
\
|
||||
movl km, RX0d; \
|
||||
op0 ## l RLR3d, RX0d; \
|
||||
roll RKRbl, RX0d; \
|
||||
load_next_kr(); \
|
||||
rorq $32, RLR3; \
|
||||
\
|
||||
F_tail(RLR3, RX0, op1, op2, op3);
|
||||
|
||||
#define F4_1(km, load_next_kr) \
|
||||
F4(km, load_next_kr, add, xor, sub, add)
|
||||
#define F4_2(km, load_next_kr) \
|
||||
F4(km, load_next_kr, xor, sub, add, xor)
|
||||
#define F4_3(km, load_next_kr) \
|
||||
F4(km, load_next_kr, sub, add, xor, sub)
|
||||
|
||||
#define round_enc4(n, FA, FB, fn1, fn2) \
|
||||
get_round_km(n + 1, RKM1d); \
|
||||
FA(RKM0d, fn1); \
|
||||
get_round_km(n + 2, RKM0d); \
|
||||
FB(RKM1d, fn2);
|
||||
|
||||
#define round_enc_last4(n, FXA, FXB) \
|
||||
get_round_km(n + 1, RKM1d); \
|
||||
FXA(RKM0d, shr_kr); \
|
||||
FXB(RKM1d, dummy);
|
||||
|
||||
#define round_enc4_1(n, FA, FB) \
|
||||
round_enc4(n, FA, FB, shr_kr, shr_kr);
|
||||
|
||||
#define round_enc4_2(n, FA, FB) \
|
||||
round_enc4(n, FA, FB, shr_kr, dummy);
|
||||
|
||||
#define round_dec4(n, FA, FB, fn1, fn2) \
|
||||
get_round_km(n - 1, RKM1d); \
|
||||
FA(RKM0d, fn1); \
|
||||
get_round_km(n - 2, RKM0d); \
|
||||
FB(RKM1d, fn2);
|
||||
|
||||
#define round_dec_last4(n, FXA, FXB) \
|
||||
get_round_km(n - 1, RKM1d); \
|
||||
FXA(RKM0d, shr_kr); \
|
||||
FXB(RKM1d, dummy);
|
||||
|
||||
#define round_dec4_1(n, FA, FB) \
|
||||
round_dec4(n, FA, FB, shr_kr, shr_kr);
|
||||
|
||||
#define round_dec4_2(n, FA, FB) \
|
||||
round_dec4(n, FA, FB, shr_kr, dummy);
|
||||
|
||||
#define inbswap_block4(a, b, c, d) \
|
||||
bswapq a; \
|
||||
bswapq b; \
|
||||
bswapq c; \
|
||||
bswapq d;
|
||||
|
||||
#define outbswap_block4(a, b, c, d) \
|
||||
bswapq a; \
|
||||
bswapq b; \
|
||||
bswapq c; \
|
||||
bswapq d; \
|
||||
rorq $32, a; \
|
||||
rorq $32, b; \
|
||||
rorq $32, c; \
|
||||
rorq $32, d;
|
||||
|
||||
.align 8
|
||||
.type __cast5_enc_blk4,@function;
|
||||
|
||||
__cast5_enc_blk4:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* RLR0,RLR1,RLR2,RLR3: four input plaintext blocks
|
||||
* output:
|
||||
* RLR0,RLR1,RLR2,RLR3: four output ciphertext blocks
|
||||
*/
|
||||
GET_EXTERN_POINTER(_gcry_cast5_s1to4, RTAB);
|
||||
|
||||
get_round_km(0, RKM0d);
|
||||
get_round_kr_enc(0);
|
||||
round_enc4_1(0, F4_1, F4_2);
|
||||
round_enc4_1(2, F4_3, F4_1);
|
||||
round_enc4_1(4, F4_2, F4_3);
|
||||
round_enc4_2(6, F4_1, F4_2);
|
||||
get_round_kr_enc(8);
|
||||
round_enc4_1(8, F4_3, F4_1);
|
||||
round_enc4_1(10, F4_2, F4_3);
|
||||
round_enc4_1(12, F4_1, F4_2);
|
||||
round_enc_last4(14, F4_3, F4_1);
|
||||
|
||||
outbswap_block4(RLR0, RLR1, RLR2, RLR3);
|
||||
ret;
|
||||
.size __cast5_enc_blk4,.-__cast5_enc_blk4;
|
||||
|
||||
.align 8
|
||||
.type __cast5_dec_blk4,@function;
|
||||
|
||||
__cast5_dec_blk4:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* RLR0,RLR1,RLR2,RLR3: four input ciphertext blocks
|
||||
* output:
|
||||
* RLR0,RLR1,RLR2,RLR3: four output plaintext blocks
|
||||
*/
|
||||
GET_EXTERN_POINTER(_gcry_cast5_s1to4, RTAB);
|
||||
|
||||
inbswap_block4(RLR0, RLR1, RLR2, RLR3);
|
||||
|
||||
get_round_km(15, RKM0d);
|
||||
get_round_kr_dec(15);
|
||||
round_dec4_1(15, F4_1, F4_3);
|
||||
round_dec4_1(13, F4_2, F4_1);
|
||||
round_dec4_1(11, F4_3, F4_2);
|
||||
round_dec4_2(9, F4_1, F4_3);
|
||||
get_round_kr_dec(7);
|
||||
round_dec4_1(7, F4_2, F4_1);
|
||||
round_dec4_1(5, F4_3, F4_2);
|
||||
round_dec4_1(3, F4_1, F4_3);
|
||||
round_dec_last4(1, F4_2, F4_1);
|
||||
|
||||
outbswap_block4(RLR0, RLR1, RLR2, RLR3);
|
||||
ret;
|
||||
.size __cast5_dec_blk4,.-__cast5_dec_blk4;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_cast5_amd64_ctr_enc
|
||||
.type _gcry_cast5_amd64_ctr_enc,@function;
|
||||
_gcry_cast5_amd64_ctr_enc:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst (8 blocks)
|
||||
* %rdx: src (8 blocks)
|
||||
* %rcx: iv (big endian, 64bit)
|
||||
*/
|
||||
|
||||
pushq %rbp;
|
||||
pushq %rbx;
|
||||
pushq %r12;
|
||||
pushq %r13;
|
||||
pushq %r14;
|
||||
|
||||
pushq %rsi;
|
||||
pushq %rdx;
|
||||
|
||||
/* load IV and byteswap */
|
||||
movq (%rcx), RX0;
|
||||
bswapq RX0;
|
||||
movq RX0, RLR0;
|
||||
|
||||
/* construct IVs */
|
||||
leaq 1(RX0), RLR1;
|
||||
leaq 2(RX0), RLR2;
|
||||
leaq 3(RX0), RLR3;
|
||||
leaq 4(RX0), RX0;
|
||||
bswapq RX0;
|
||||
|
||||
/* store new IV */
|
||||
movq RX0, (%rcx);
|
||||
|
||||
call __cast5_enc_blk4;
|
||||
|
||||
popq %r14; /*src*/
|
||||
popq %r13; /*dst*/
|
||||
|
||||
/* XOR key-stream with plaintext */
|
||||
xorq 0 * 8(%r14), RLR0;
|
||||
xorq 1 * 8(%r14), RLR1;
|
||||
xorq 2 * 8(%r14), RLR2;
|
||||
xorq 3 * 8(%r14), RLR3;
|
||||
movq RLR0, 0 * 8(%r13);
|
||||
movq RLR1, 1 * 8(%r13);
|
||||
movq RLR2, 2 * 8(%r13);
|
||||
movq RLR3, 3 * 8(%r13);
|
||||
|
||||
popq %r14;
|
||||
popq %r13;
|
||||
popq %r12;
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
ret
|
||||
.size _gcry_cast5_amd64_ctr_enc,.-_gcry_cast5_amd64_ctr_enc;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_cast5_amd64_cbc_dec
|
||||
.type _gcry_cast5_amd64_cbc_dec,@function;
|
||||
_gcry_cast5_amd64_cbc_dec:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst (8 blocks)
|
||||
* %rdx: src (8 blocks)
|
||||
* %rcx: iv (64bit)
|
||||
*/
|
||||
|
||||
pushq %rbp;
|
||||
pushq %rbx;
|
||||
pushq %r12;
|
||||
pushq %r13;
|
||||
pushq %r14;
|
||||
|
||||
pushq %rcx;
|
||||
pushq %rsi;
|
||||
pushq %rdx;
|
||||
|
||||
/* load input */
|
||||
movq 0 * 8(%rdx), RLR0;
|
||||
movq 1 * 8(%rdx), RLR1;
|
||||
movq 2 * 8(%rdx), RLR2;
|
||||
movq 3 * 8(%rdx), RLR3;
|
||||
|
||||
call __cast5_dec_blk4;
|
||||
|
||||
popq RX0; /*src*/
|
||||
popq RX1; /*dst*/
|
||||
popq RX2; /*iv*/
|
||||
|
||||
movq 3 * 8(RX0), %r14;
|
||||
xorq (RX2), RLR0;
|
||||
xorq 0 * 8(RX0), RLR1;
|
||||
xorq 1 * 8(RX0), RLR2;
|
||||
xorq 2 * 8(RX0), RLR3;
|
||||
movq %r14, (RX2); /* store new IV */
|
||||
|
||||
movq RLR0, 0 * 8(RX1);
|
||||
movq RLR1, 1 * 8(RX1);
|
||||
movq RLR2, 2 * 8(RX1);
|
||||
movq RLR3, 3 * 8(RX1);
|
||||
|
||||
popq %r14;
|
||||
popq %r13;
|
||||
popq %r12;
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
ret;
|
||||
|
||||
.size _gcry_cast5_amd64_cbc_dec,.-_gcry_cast5_amd64_cbc_dec;
|
||||
|
||||
.align 8
|
||||
.globl _gcry_cast5_amd64_cfb_dec
|
||||
.type _gcry_cast5_amd64_cfb_dec,@function;
|
||||
_gcry_cast5_amd64_cfb_dec:
|
||||
/* input:
|
||||
* %rdi: ctx, CTX
|
||||
* %rsi: dst (8 blocks)
|
||||
* %rdx: src (8 blocks)
|
||||
* %rcx: iv (64bit)
|
||||
*/
|
||||
|
||||
pushq %rbp;
|
||||
pushq %rbx;
|
||||
pushq %r12;
|
||||
pushq %r13;
|
||||
pushq %r14;
|
||||
|
||||
pushq %rsi;
|
||||
pushq %rdx;
|
||||
|
||||
/* Load input */
|
||||
movq (%rcx), RLR0;
|
||||
movq 0 * 8(%rdx), RLR1;
|
||||
movq 1 * 8(%rdx), RLR2;
|
||||
movq 2 * 8(%rdx), RLR3;
|
||||
|
||||
inbswap_block4(RLR0, RLR1, RLR2, RLR3);
|
||||
|
||||
/* Update IV */
|
||||
movq 3 * 8(%rdx), %rdx;
|
||||
movq %rdx, (%rcx);
|
||||
|
||||
call __cast5_enc_blk4;
|
||||
|
||||
popq %rdx; /*src*/
|
||||
popq %rcx; /*dst*/
|
||||
|
||||
xorq 0 * 8(%rdx), RLR0;
|
||||
xorq 1 * 8(%rdx), RLR1;
|
||||
xorq 2 * 8(%rdx), RLR2;
|
||||
xorq 3 * 8(%rdx), RLR3;
|
||||
movq RLR0, 0 * 8(%rcx);
|
||||
movq RLR1, 1 * 8(%rcx);
|
||||
movq RLR2, 2 * 8(%rcx);
|
||||
movq RLR3, 3 * 8(%rcx);
|
||||
|
||||
popq %r14;
|
||||
popq %r13;
|
||||
popq %r12;
|
||||
popq %rbx;
|
||||
popq %rbp;
|
||||
ret;
|
||||
|
||||
.size _gcry_cast5_amd64_cfb_dec,.-_gcry_cast5_amd64_cfb_dec;
|
||||
|
||||
#endif /*defined(USE_CAST5)*/
|
||||
#endif /*__x86_64*/
|
||||
@@ -0,0 +1,728 @@
|
||||
/* cast5-arm.S - ARM assembly implementation of CAST5 cipher
|
||||
*
|
||||
* Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if defined(__ARMEL__)
|
||||
#ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS
|
||||
|
||||
.text
|
||||
|
||||
.syntax unified
|
||||
.arm
|
||||
|
||||
.extern _gcry_cast5_s1to4;
|
||||
|
||||
#ifdef __PIC__
|
||||
# define GET_DATA_POINTER(reg, name, rtmp) \
|
||||
ldr reg, 1f; \
|
||||
ldr rtmp, 2f; \
|
||||
b 3f; \
|
||||
1: .word _GLOBAL_OFFSET_TABLE_-(3f+8); \
|
||||
2: .word name(GOT); \
|
||||
3: add reg, pc, reg; \
|
||||
ldr reg, [reg, rtmp];
|
||||
#else
|
||||
# define GET_DATA_POINTER(reg, name, rtmp) ldr reg, =name
|
||||
#endif
|
||||
|
||||
/* structure of crypto context */
|
||||
#define Km 0
|
||||
#define Kr (Km + (16 * 4))
|
||||
#define Kr_arm_enc (Kr + (16))
|
||||
#define Kr_arm_dec (Kr_arm_enc + (16))
|
||||
|
||||
/* register macros */
|
||||
#define CTX %r0
|
||||
#define Rs1 %r7
|
||||
#define Rs2 %r8
|
||||
#define Rs3 %r9
|
||||
#define Rs4 %r10
|
||||
#define RMASK %r11
|
||||
#define RKM %r1
|
||||
#define RKR %r2
|
||||
|
||||
#define RL0 %r3
|
||||
#define RR0 %r4
|
||||
|
||||
#define RL1 %r9
|
||||
#define RR1 %r10
|
||||
|
||||
#define RT0 %lr
|
||||
#define RT1 %ip
|
||||
#define RT2 %r5
|
||||
#define RT3 %r6
|
||||
|
||||
/* helper macros */
|
||||
#define ldr_unaligned_le(rout, rsrc, offs, rtmp) \
|
||||
ldrb rout, [rsrc, #((offs) + 0)]; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 1)]; \
|
||||
orr rout, rout, rtmp, lsl #8; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 2)]; \
|
||||
orr rout, rout, rtmp, lsl #16; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 3)]; \
|
||||
orr rout, rout, rtmp, lsl #24;
|
||||
|
||||
#define str_unaligned_le(rin, rdst, offs, rtmp0, rtmp1) \
|
||||
mov rtmp0, rin, lsr #8; \
|
||||
strb rin, [rdst, #((offs) + 0)]; \
|
||||
mov rtmp1, rin, lsr #16; \
|
||||
strb rtmp0, [rdst, #((offs) + 1)]; \
|
||||
mov rtmp0, rin, lsr #24; \
|
||||
strb rtmp1, [rdst, #((offs) + 2)]; \
|
||||
strb rtmp0, [rdst, #((offs) + 3)];
|
||||
|
||||
#define ldr_unaligned_be(rout, rsrc, offs, rtmp) \
|
||||
ldrb rout, [rsrc, #((offs) + 3)]; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 2)]; \
|
||||
orr rout, rout, rtmp, lsl #8; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 1)]; \
|
||||
orr rout, rout, rtmp, lsl #16; \
|
||||
ldrb rtmp, [rsrc, #((offs) + 0)]; \
|
||||
orr rout, rout, rtmp, lsl #24;
|
||||
|
||||
#define str_unaligned_be(rin, rdst, offs, rtmp0, rtmp1) \
|
||||
mov rtmp0, rin, lsr #8; \
|
||||
strb rin, [rdst, #((offs) + 3)]; \
|
||||
mov rtmp1, rin, lsr #16; \
|
||||
strb rtmp0, [rdst, #((offs) + 2)]; \
|
||||
mov rtmp0, rin, lsr #24; \
|
||||
strb rtmp1, [rdst, #((offs) + 1)]; \
|
||||
strb rtmp0, [rdst, #((offs) + 0)];
|
||||
|
||||
#ifdef __ARMEL__
|
||||
#define ldr_unaligned_host ldr_unaligned_le
|
||||
#define str_unaligned_host str_unaligned_le
|
||||
|
||||
/* bswap on little-endian */
|
||||
#ifdef HAVE_ARM_ARCH_V6
|
||||
#define host_to_be(reg, rtmp) \
|
||||
rev reg, reg;
|
||||
#define be_to_host(reg, rtmp) \
|
||||
rev reg, reg;
|
||||
#else
|
||||
#define host_to_be(reg, rtmp) \
|
||||
eor rtmp, reg, reg, ror #16; \
|
||||
mov rtmp, rtmp, lsr #8; \
|
||||
bic rtmp, rtmp, #65280; \
|
||||
eor reg, rtmp, reg, ror #8;
|
||||
#define be_to_host(reg, rtmp) \
|
||||
eor rtmp, reg, reg, ror #16; \
|
||||
mov rtmp, rtmp, lsr #8; \
|
||||
bic rtmp, rtmp, #65280; \
|
||||
eor reg, rtmp, reg, ror #8;
|
||||
#endif
|
||||
#else
|
||||
#define ldr_unaligned_host ldr_unaligned_be
|
||||
#define str_unaligned_host str_unaligned_be
|
||||
|
||||
/* nop on big-endian */
|
||||
#define host_to_be(reg, rtmp) /*_*/
|
||||
#define be_to_host(reg, rtmp) /*_*/
|
||||
#endif
|
||||
|
||||
#define host_to_host(x, y) /*_*/
|
||||
|
||||
/**********************************************************************
|
||||
1-way cast5
|
||||
**********************************************************************/
|
||||
|
||||
#define dummy(n) /*_*/
|
||||
|
||||
#define load_kr(n) \
|
||||
ldr RKR, [CTX, #(Kr_arm_enc + (n))]; /* Kr[n] */
|
||||
|
||||
#define load_dec_kr(n) \
|
||||
ldr RKR, [CTX, #(Kr_arm_dec + (n) - 3)]; /* Kr[n] */
|
||||
|
||||
#define load_km(n) \
|
||||
ldr RKM, [CTX, #(Km + (n) * 4)]; /* Km[n] */
|
||||
|
||||
#define shift_kr(dummy) \
|
||||
mov RKR, RKR, lsr #8;
|
||||
|
||||
#define F(n, rl, rr, op1, op2, op3, op4, dec, loadkm, shiftkr, loadkr) \
|
||||
op1 RKM, rr; \
|
||||
mov RKM, RKM, ror RKR; \
|
||||
\
|
||||
and RT0, RMASK, RKM, ror #(24); \
|
||||
and RT1, RMASK, RKM, lsr #(16); \
|
||||
and RT2, RMASK, RKM, lsr #(8); \
|
||||
ldr RT0, [Rs1, RT0]; \
|
||||
and RT3, RMASK, RKM; \
|
||||
ldr RT1, [Rs2, RT1]; \
|
||||
shiftkr(RKR); \
|
||||
\
|
||||
ldr RT2, [Rs3, RT2]; \
|
||||
\
|
||||
op2 RT0, RT1; \
|
||||
ldr RT3, [Rs4, RT3]; \
|
||||
op3 RT0, RT2; \
|
||||
loadkm((n) + (1 - ((dec) * 2))); \
|
||||
op4 RT0, RT3; \
|
||||
loadkr((n) + (1 - ((dec) * 2))); \
|
||||
eor rl, RT0;
|
||||
|
||||
#define F1(n, rl, rr, dec, loadkm, shiftkr, loadkr) \
|
||||
F(n, rl, rr, add, eor, sub, add, dec, loadkm, shiftkr, loadkr)
|
||||
#define F2(n, rl, rr, dec, loadkm, shiftkr, loadkr) \
|
||||
F(n, rl, rr, eor, sub, add, eor, dec, loadkm, shiftkr, loadkr)
|
||||
#define F3(n, rl, rr, dec, loadkm, shiftkr, loadkr) \
|
||||
F(n, rl, rr, sub, add, eor, sub, dec, loadkm, shiftkr, loadkr)
|
||||
|
||||
#define enc_round(n, Fx, rl, rr, loadkm, shiftkr, loadkr) \
|
||||
Fx(n, rl, rr, 0, loadkm, shiftkr, loadkr)
|
||||
|
||||
#define dec_round(n, Fx, rl, rr, loadkm, shiftkr, loadkr) \
|
||||
Fx(n, rl, rr, 1, loadkm, shiftkr, loadkr)
|
||||
|
||||
#define read_block_aligned(rin, offs, l0, r0, convert, rtmp) \
|
||||
ldr l0, [rin, #((offs) + 0)]; \
|
||||
ldr r0, [rin, #((offs) + 4)]; \
|
||||
convert(l0, rtmp); \
|
||||
convert(r0, rtmp);
|
||||
|
||||
#define write_block_aligned(rout, offs, l0, r0, convert, rtmp) \
|
||||
convert(l0, rtmp); \
|
||||
convert(r0, rtmp); \
|
||||
str l0, [rout, #((offs) + 0)]; \
|
||||
str r0, [rout, #((offs) + 4)];
|
||||
|
||||
#ifdef __ARM_FEATURE_UNALIGNED
|
||||
/* unaligned word reads allowed */
|
||||
#define read_block(rin, offs, l0, r0, rtmp0) \
|
||||
read_block_aligned(rin, offs, l0, r0, host_to_be, rtmp0)
|
||||
|
||||
#define write_block(rout, offs, r0, l0, rtmp0, rtmp1) \
|
||||
write_block_aligned(rout, offs, r0, l0, be_to_host, rtmp0)
|
||||
|
||||
#define read_block_host(rin, offs, l0, r0, rtmp0) \
|
||||
read_block_aligned(rin, offs, l0, r0, host_to_host, rtmp0)
|
||||
|
||||
#define write_block_host(rout, offs, r0, l0, rtmp0, rtmp1) \
|
||||
write_block_aligned(rout, offs, r0, l0, host_to_host, rtmp0)
|
||||
#else
|
||||
/* need to handle unaligned reads by byte reads */
|
||||
#define read_block(rin, offs, l0, r0, rtmp0) \
|
||||
tst rin, #3; \
|
||||
beq 1f; \
|
||||
ldr_unaligned_be(l0, rin, (offs) + 0, rtmp0); \
|
||||
ldr_unaligned_be(r0, rin, (offs) + 4, rtmp0); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
read_block_aligned(rin, offs, l0, r0, host_to_be, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define write_block(rout, offs, l0, r0, rtmp0, rtmp1) \
|
||||
tst rout, #3; \
|
||||
beq 1f; \
|
||||
str_unaligned_be(l0, rout, (offs) + 0, rtmp0, rtmp1); \
|
||||
str_unaligned_be(r0, rout, (offs) + 4, rtmp0, rtmp1); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
write_block_aligned(rout, offs, l0, r0, be_to_host, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define read_block_host(rin, offs, l0, r0, rtmp0) \
|
||||
tst rin, #3; \
|
||||
beq 1f; \
|
||||
ldr_unaligned_host(l0, rin, (offs) + 0, rtmp0); \
|
||||
ldr_unaligned_host(r0, rin, (offs) + 4, rtmp0); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
read_block_aligned(rin, offs, l0, r0, host_to_host, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define write_block_host(rout, offs, l0, r0, rtmp0, rtmp1) \
|
||||
tst rout, #3; \
|
||||
beq 1f; \
|
||||
str_unaligned_host(l0, rout, (offs) + 0, rtmp0, rtmp1); \
|
||||
str_unaligned_host(r0, rout, (offs) + 4, rtmp0, rtmp1); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
write_block_aligned(rout, offs, l0, r0, host_to_host, rtmp0); \
|
||||
2:;
|
||||
#endif
|
||||
|
||||
.align 3
|
||||
.globl _gcry_cast5_arm_encrypt_block
|
||||
.type _gcry_cast5_arm_encrypt_block,%function;
|
||||
|
||||
_gcry_cast5_arm_encrypt_block:
|
||||
/* input:
|
||||
* %r0: CTX
|
||||
* %r1: dst
|
||||
* %r2: src
|
||||
*/
|
||||
push {%r1, %r4-%r11, %ip, %lr};
|
||||
|
||||
GET_DATA_POINTER(Rs1, _gcry_cast5_s1to4, Rs2);
|
||||
mov RMASK, #(0xff << 2);
|
||||
add Rs2, Rs1, #(0x100*4);
|
||||
add Rs3, Rs1, #(0x100*4*2);
|
||||
add Rs4, Rs1, #(0x100*4*3);
|
||||
|
||||
read_block(%r2, 0, RL0, RR0, RT0);
|
||||
|
||||
load_km(0);
|
||||
load_kr(0);
|
||||
enc_round(0, F1, RL0, RR0, load_km, shift_kr, dummy);
|
||||
enc_round(1, F2, RR0, RL0, load_km, shift_kr, dummy);
|
||||
enc_round(2, F3, RL0, RR0, load_km, shift_kr, dummy);
|
||||
enc_round(3, F1, RR0, RL0, load_km, dummy, load_kr);
|
||||
enc_round(4, F2, RL0, RR0, load_km, shift_kr, dummy);
|
||||
enc_round(5, F3, RR0, RL0, load_km, shift_kr, dummy);
|
||||
enc_round(6, F1, RL0, RR0, load_km, shift_kr, dummy);
|
||||
enc_round(7, F2, RR0, RL0, load_km, dummy, load_kr);
|
||||
enc_round(8, F3, RL0, RR0, load_km, shift_kr, dummy);
|
||||
enc_round(9, F1, RR0, RL0, load_km, shift_kr, dummy);
|
||||
enc_round(10, F2, RL0, RR0, load_km, shift_kr, dummy);
|
||||
enc_round(11, F3, RR0, RL0, load_km, dummy, load_kr);
|
||||
enc_round(12, F1, RL0, RR0, load_km, shift_kr, dummy);
|
||||
enc_round(13, F2, RR0, RL0, load_km, shift_kr, dummy);
|
||||
enc_round(14, F3, RL0, RR0, load_km, shift_kr, dummy);
|
||||
enc_round(15, F1, RR0, RL0, dummy, dummy, dummy);
|
||||
|
||||
ldr %r1, [%sp], #4;
|
||||
write_block(%r1, 0, RR0, RL0, RT0, RT1);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
.size _gcry_cast5_arm_encrypt_block,.-_gcry_cast5_arm_encrypt_block;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_cast5_arm_decrypt_block
|
||||
.type _gcry_cast5_arm_decrypt_block,%function;
|
||||
|
||||
_gcry_cast5_arm_decrypt_block:
|
||||
/* input:
|
||||
* %r0: CTX
|
||||
* %r1: dst
|
||||
* %r2: src
|
||||
*/
|
||||
push {%r1, %r4-%r11, %ip, %lr};
|
||||
|
||||
GET_DATA_POINTER(Rs1, _gcry_cast5_s1to4, Rs2);
|
||||
mov RMASK, #(0xff << 2);
|
||||
add Rs2, Rs1, #(0x100 * 4);
|
||||
add Rs3, Rs1, #(0x100 * 4 * 2);
|
||||
add Rs4, Rs1, #(0x100 * 4 * 3);
|
||||
|
||||
read_block(%r2, 0, RL0, RR0, RT0);
|
||||
|
||||
load_km(15);
|
||||
load_dec_kr(15);
|
||||
dec_round(15, F1, RL0, RR0, load_km, shift_kr, dummy);
|
||||
dec_round(14, F3, RR0, RL0, load_km, shift_kr, dummy);
|
||||
dec_round(13, F2, RL0, RR0, load_km, shift_kr, dummy);
|
||||
dec_round(12, F1, RR0, RL0, load_km, dummy, load_dec_kr);
|
||||
dec_round(11, F3, RL0, RR0, load_km, shift_kr, dummy);
|
||||
dec_round(10, F2, RR0, RL0, load_km, shift_kr, dummy);
|
||||
dec_round(9, F1, RL0, RR0, load_km, shift_kr, dummy);
|
||||
dec_round(8, F3, RR0, RL0, load_km, dummy, load_dec_kr);
|
||||
dec_round(7, F2, RL0, RR0, load_km, shift_kr, dummy);
|
||||
dec_round(6, F1, RR0, RL0, load_km, shift_kr, dummy);
|
||||
dec_round(5, F3, RL0, RR0, load_km, shift_kr, dummy);
|
||||
dec_round(4, F2, RR0, RL0, load_km, dummy, load_dec_kr);
|
||||
dec_round(3, F1, RL0, RR0, load_km, shift_kr, dummy);
|
||||
dec_round(2, F3, RR0, RL0, load_km, shift_kr, dummy);
|
||||
dec_round(1, F2, RL0, RR0, load_km, shift_kr, dummy);
|
||||
dec_round(0, F1, RR0, RL0, dummy, dummy, dummy);
|
||||
|
||||
ldr %r1, [%sp], #4;
|
||||
write_block(%r1, 0, RR0, RL0, RT0, RT1);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
.size _gcry_cast5_arm_decrypt_block,.-_gcry_cast5_arm_decrypt_block;
|
||||
|
||||
/**********************************************************************
|
||||
2-way cast5
|
||||
**********************************************************************/
|
||||
|
||||
#define F_2w(n, rl0, rr0, rl1, rr1, op1, op2, op3, op4, dec, loadkm, shiftkr, \
|
||||
loadkr) \
|
||||
op1 RT3, RKM, rr0; \
|
||||
op1 RKM, RKM, rr1; \
|
||||
mov RT3, RT3, ror RKR; \
|
||||
mov RKM, RKM, ror RKR; \
|
||||
\
|
||||
and RT0, RMASK, RT3, ror #(24); \
|
||||
and RT1, RMASK, RT3, lsr #(16); \
|
||||
and RT2, RMASK, RT3, lsr #(8); \
|
||||
and RT3, RMASK, RT3; \
|
||||
\
|
||||
ldr RT0, [Rs1, RT0]; \
|
||||
add RT2, #(0x100 * 4); \
|
||||
ldr RT1, [Rs2, RT1]; \
|
||||
add RT3, #(0x100 * 4 * 2); \
|
||||
\
|
||||
ldr RT2, [Rs2, RT2]; \
|
||||
\
|
||||
op2 RT0, RT1; \
|
||||
ldr RT3, [Rs2, RT3]; \
|
||||
and RT1, RMASK, RKM, ror #(24); \
|
||||
op3 RT0, RT2; \
|
||||
and RT2, RMASK, RKM, lsr #(16); \
|
||||
op4 RT0, RT3; \
|
||||
and RT3, RMASK, RKM, lsr #(8); \
|
||||
eor rl0, RT0; \
|
||||
add RT3, #(0x100 * 4); \
|
||||
ldr RT1, [Rs1, RT1]; \
|
||||
and RT0, RMASK, RKM; \
|
||||
ldr RT2, [Rs2, RT2]; \
|
||||
add RT0, #(0x100 * 4 * 2); \
|
||||
\
|
||||
ldr RT3, [Rs2, RT3]; \
|
||||
\
|
||||
op2 RT1, RT2; \
|
||||
ldr RT0, [Rs2, RT0]; \
|
||||
op3 RT1, RT3; \
|
||||
loadkm((n) + (1 - ((dec) * 2))); \
|
||||
op4 RT1, RT0; \
|
||||
loadkr((n) + (1 - ((dec) * 2))); \
|
||||
shiftkr(RKR); \
|
||||
eor rl1, RT1;
|
||||
|
||||
#define F1_2w(n, rl0, rr0, rl1, rr1, dec, loadkm, shiftkr, loadkr) \
|
||||
F_2w(n, rl0, rr0, rl1, rr1, add, eor, sub, add, dec, \
|
||||
loadkm, shiftkr, loadkr)
|
||||
#define F2_2w(n, rl0, rr0, rl1, rr1, dec, loadkm, shiftkr, loadkr) \
|
||||
F_2w(n, rl0, rr0, rl1, rr1, eor, sub, add, eor, dec, \
|
||||
loadkm, shiftkr, loadkr)
|
||||
#define F3_2w(n, rl0, rr0, rl1, rr1, dec, loadkm, shiftkr, loadkr) \
|
||||
F_2w(n, rl0, rr0, rl1, rr1, sub, add, eor, sub, dec, \
|
||||
loadkm, shiftkr, loadkr)
|
||||
|
||||
#define enc_round2(n, Fx, rl, rr, loadkm, shiftkr, loadkr) \
|
||||
Fx##_2w(n, rl##0, rr##0, rl##1, rr##1, 0, loadkm, shiftkr, loadkr)
|
||||
|
||||
#define dec_round2(n, Fx, rl, rr, loadkm, shiftkr, loadkr) \
|
||||
Fx##_2w(n, rl##0, rr##0, rl##1, rr##1, 1, loadkm, shiftkr, loadkr)
|
||||
|
||||
#define read_block2_aligned(rin, l0, r0, l1, r1, convert, rtmp) \
|
||||
ldr l0, [rin, #(0)]; \
|
||||
ldr r0, [rin, #(4)]; \
|
||||
convert(l0, rtmp); \
|
||||
ldr l1, [rin, #(8)]; \
|
||||
convert(r0, rtmp); \
|
||||
ldr r1, [rin, #(12)]; \
|
||||
convert(l1, rtmp); \
|
||||
convert(r1, rtmp);
|
||||
|
||||
#define write_block2_aligned(rout, l0, r0, l1, r1, convert, rtmp) \
|
||||
convert(l0, rtmp); \
|
||||
convert(r0, rtmp); \
|
||||
convert(l1, rtmp); \
|
||||
str l0, [rout, #(0)]; \
|
||||
convert(r1, rtmp); \
|
||||
str r0, [rout, #(4)]; \
|
||||
str l1, [rout, #(8)]; \
|
||||
str r1, [rout, #(12)];
|
||||
|
||||
#ifdef __ARM_FEATURE_UNALIGNED
|
||||
/* unaligned word reads allowed */
|
||||
#define read_block2(rin, l0, r0, l1, r1, rtmp0) \
|
||||
read_block2_aligned(rin, l0, r0, l1, r1, host_to_be, rtmp0)
|
||||
|
||||
#define write_block2(rout, l0, r0, l1, r1, rtmp0, rtmp1) \
|
||||
write_block2_aligned(rout, l0, r0, l1, r1, be_to_host, rtmp0)
|
||||
|
||||
#define read_block2_host(rin, l0, r0, l1, r1, rtmp0) \
|
||||
read_block2_aligned(rin, l0, r0, l1, r1, host_to_host, rtmp0)
|
||||
|
||||
#define write_block2_host(rout, l0, r0, l1, r1, rtmp0, rtmp1) \
|
||||
write_block2_aligned(rout, l0, r0, l1, r1, host_to_host, rtmp0)
|
||||
#else
|
||||
/* need to handle unaligned reads by byte reads */
|
||||
#define read_block2(rin, l0, r0, l1, r1, rtmp0) \
|
||||
tst rin, #3; \
|
||||
beq 1f; \
|
||||
ldr_unaligned_be(l0, rin, 0, rtmp0); \
|
||||
ldr_unaligned_be(r0, rin, 4, rtmp0); \
|
||||
ldr_unaligned_be(l1, rin, 8, rtmp0); \
|
||||
ldr_unaligned_be(r1, rin, 12, rtmp0); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
read_block2_aligned(rin, l0, r0, l1, r1, host_to_be, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define write_block2(rout, l0, r0, l1, r1, rtmp0, rtmp1) \
|
||||
tst rout, #3; \
|
||||
beq 1f; \
|
||||
str_unaligned_be(l0, rout, 0, rtmp0, rtmp1); \
|
||||
str_unaligned_be(r0, rout, 4, rtmp0, rtmp1); \
|
||||
str_unaligned_be(l1, rout, 8, rtmp0, rtmp1); \
|
||||
str_unaligned_be(r1, rout, 12, rtmp0, rtmp1); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
write_block2_aligned(rout, l0, r0, l1, r1, be_to_host, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define read_block2_host(rin, l0, r0, l1, r1, rtmp0) \
|
||||
tst rin, #3; \
|
||||
beq 1f; \
|
||||
ldr_unaligned_host(l0, rin, 0, rtmp0); \
|
||||
ldr_unaligned_host(r0, rin, 4, rtmp0); \
|
||||
ldr_unaligned_host(l1, rin, 8, rtmp0); \
|
||||
ldr_unaligned_host(r1, rin, 12, rtmp0); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
read_block2_aligned(rin, l0, r0, l1, r1, host_to_host, rtmp0); \
|
||||
2:;
|
||||
|
||||
#define write_block2_host(rout, l0, r0, l1, r1, rtmp0, rtmp1) \
|
||||
tst rout, #3; \
|
||||
beq 1f; \
|
||||
str_unaligned_host(l0, rout, 0, rtmp0, rtmp1); \
|
||||
str_unaligned_host(r0, rout, 4, rtmp0, rtmp1); \
|
||||
str_unaligned_host(l1, rout, 8, rtmp0, rtmp1); \
|
||||
str_unaligned_host(r1, rout, 12, rtmp0, rtmp1); \
|
||||
b 2f; \
|
||||
1:;\
|
||||
write_block2_aligned(rout, l0, r0, l1, r1, host_to_host, rtmp0); \
|
||||
2:;
|
||||
#endif
|
||||
|
||||
.align 3
|
||||
.type _gcry_cast5_arm_enc_blk2,%function;
|
||||
|
||||
_gcry_cast5_arm_enc_blk2:
|
||||
/* input:
|
||||
* preloaded: CTX
|
||||
* [RL0, RR0], [RL1, RR1]: src
|
||||
* output:
|
||||
* [RR0, RL0], [RR1, RL1]: dst
|
||||
*/
|
||||
push {%lr};
|
||||
|
||||
GET_DATA_POINTER(Rs1, _gcry_cast5_s1to4, Rs2);
|
||||
mov RMASK, #(0xff << 2);
|
||||
add Rs2, Rs1, #(0x100 * 4);
|
||||
|
||||
load_km(0);
|
||||
load_kr(0);
|
||||
enc_round2(0, F1, RL, RR, load_km, shift_kr, dummy);
|
||||
enc_round2(1, F2, RR, RL, load_km, shift_kr, dummy);
|
||||
enc_round2(2, F3, RL, RR, load_km, shift_kr, dummy);
|
||||
enc_round2(3, F1, RR, RL, load_km, dummy, load_kr);
|
||||
enc_round2(4, F2, RL, RR, load_km, shift_kr, dummy);
|
||||
enc_round2(5, F3, RR, RL, load_km, shift_kr, dummy);
|
||||
enc_round2(6, F1, RL, RR, load_km, shift_kr, dummy);
|
||||
enc_round2(7, F2, RR, RL, load_km, dummy, load_kr);
|
||||
enc_round2(8, F3, RL, RR, load_km, shift_kr, dummy);
|
||||
enc_round2(9, F1, RR, RL, load_km, shift_kr, dummy);
|
||||
enc_round2(10, F2, RL, RR, load_km, shift_kr, dummy);
|
||||
enc_round2(11, F3, RR, RL, load_km, dummy, load_kr);
|
||||
enc_round2(12, F1, RL, RR, load_km, shift_kr, dummy);
|
||||
enc_round2(13, F2, RR, RL, load_km, shift_kr, dummy);
|
||||
enc_round2(14, F3, RL, RR, load_km, shift_kr, dummy);
|
||||
enc_round2(15, F1, RR, RL, dummy, dummy, dummy);
|
||||
|
||||
host_to_be(RR0, RT0);
|
||||
host_to_be(RL0, RT0);
|
||||
host_to_be(RR1, RT0);
|
||||
host_to_be(RL1, RT0);
|
||||
|
||||
pop {%pc};
|
||||
.ltorg
|
||||
.size _gcry_cast5_arm_enc_blk2,.-_gcry_cast5_arm_enc_blk2;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_cast5_arm_cfb_dec;
|
||||
.type _gcry_cast5_arm_cfb_dec,%function;
|
||||
|
||||
_gcry_cast5_arm_cfb_dec:
|
||||
/* input:
|
||||
* %r0: CTX
|
||||
* %r1: dst (2 blocks)
|
||||
* %r2: src (2 blocks)
|
||||
* %r3: iv (64bit)
|
||||
*/
|
||||
push {%r1, %r2, %r4-%r11, %ip, %lr};
|
||||
|
||||
mov %lr, %r3;
|
||||
|
||||
/* Load input (iv/%r3 is aligned, src/%r2 might not be) */
|
||||
ldm %r3, {RL0, RR0};
|
||||
host_to_be(RL0, RT1);
|
||||
host_to_be(RR0, RT1);
|
||||
read_block(%r2, 0, RL1, RR1, %ip);
|
||||
|
||||
/* Update IV, load src[1] and save to iv[0] */
|
||||
read_block_host(%r2, 8, %r5, %r6, %r7);
|
||||
stm %lr, {%r5, %r6};
|
||||
|
||||
bl _gcry_cast5_arm_enc_blk2;
|
||||
/* result in RR0:RL0, RR1:RL1 = %r4:%r3, %r10:%r9 */
|
||||
|
||||
/* %r0: dst, %r1: %src */
|
||||
pop {%r0, %r1};
|
||||
|
||||
/* dst = src ^ result */
|
||||
read_block2_host(%r1, %r5, %r6, %r7, %r8, %lr);
|
||||
eor %r5, %r4;
|
||||
eor %r6, %r3;
|
||||
eor %r7, %r10;
|
||||
eor %r8, %r9;
|
||||
write_block2_host(%r0, %r5, %r6, %r7, %r8, %r1, %r2);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
.size _gcry_cast5_arm_cfb_dec,.-_gcry_cast5_arm_cfb_dec;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_cast5_arm_ctr_enc;
|
||||
.type _gcry_cast5_arm_ctr_enc,%function;
|
||||
|
||||
_gcry_cast5_arm_ctr_enc:
|
||||
/* input:
|
||||
* %r0: CTX
|
||||
* %r1: dst (2 blocks)
|
||||
* %r2: src (2 blocks)
|
||||
* %r3: iv (64bit, big-endian)
|
||||
*/
|
||||
push {%r1, %r2, %r4-%r11, %ip, %lr};
|
||||
|
||||
mov %lr, %r3;
|
||||
|
||||
/* Load IV (big => host endian) */
|
||||
read_block_aligned(%lr, 0, RL0, RR0, be_to_host, RT1);
|
||||
|
||||
/* Construct IVs */
|
||||
adds RR1, RR0, #1; /* +1 */
|
||||
adc RL1, RL0, #0;
|
||||
adds %r6, RR1, #1; /* +2 */
|
||||
adc %r5, RL1, #0;
|
||||
|
||||
/* Store new IV (host => big-endian) */
|
||||
write_block_aligned(%lr, 0, %r5, %r6, host_to_be, RT1);
|
||||
|
||||
bl _gcry_cast5_arm_enc_blk2;
|
||||
/* result in RR0:RL0, RR1:RL1 = %r4:%r3, %r10:%r9 */
|
||||
|
||||
/* %r0: dst, %r1: %src */
|
||||
pop {%r0, %r1};
|
||||
|
||||
/* XOR key-stream with plaintext */
|
||||
read_block2_host(%r1, %r5, %r6, %r7, %r8, %lr);
|
||||
eor %r5, %r4;
|
||||
eor %r6, %r3;
|
||||
eor %r7, %r10;
|
||||
eor %r8, %r9;
|
||||
write_block2_host(%r0, %r5, %r6, %r7, %r8, %r1, %r2);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
.size _gcry_cast5_arm_ctr_enc,.-_gcry_cast5_arm_ctr_enc;
|
||||
|
||||
.align 3
|
||||
.type _gcry_cast5_arm_dec_blk2,%function;
|
||||
|
||||
_gcry_cast5_arm_dec_blk2:
|
||||
/* input:
|
||||
* preloaded: CTX
|
||||
* [RL0, RR0], [RL1, RR1]: src
|
||||
* output:
|
||||
* [RR0, RL0], [RR1, RL1]: dst
|
||||
*/
|
||||
|
||||
GET_DATA_POINTER(Rs1, _gcry_cast5_s1to4, Rs2);
|
||||
mov RMASK, #(0xff << 2);
|
||||
add Rs2, Rs1, #(0x100 * 4);
|
||||
|
||||
load_km(15);
|
||||
load_dec_kr(15);
|
||||
dec_round2(15, F1, RL, RR, load_km, shift_kr, dummy);
|
||||
dec_round2(14, F3, RR, RL, load_km, shift_kr, dummy);
|
||||
dec_round2(13, F2, RL, RR, load_km, shift_kr, dummy);
|
||||
dec_round2(12, F1, RR, RL, load_km, dummy, load_dec_kr);
|
||||
dec_round2(11, F3, RL, RR, load_km, shift_kr, dummy);
|
||||
dec_round2(10, F2, RR, RL, load_km, shift_kr, dummy);
|
||||
dec_round2(9, F1, RL, RR, load_km, shift_kr, dummy);
|
||||
dec_round2(8, F3, RR, RL, load_km, dummy, load_dec_kr);
|
||||
dec_round2(7, F2, RL, RR, load_km, shift_kr, dummy);
|
||||
dec_round2(6, F1, RR, RL, load_km, shift_kr, dummy);
|
||||
dec_round2(5, F3, RL, RR, load_km, shift_kr, dummy);
|
||||
dec_round2(4, F2, RR, RL, load_km, dummy, load_dec_kr);
|
||||
dec_round2(3, F1, RL, RR, load_km, shift_kr, dummy);
|
||||
dec_round2(2, F3, RR, RL, load_km, shift_kr, dummy);
|
||||
dec_round2(1, F2, RL, RR, load_km, shift_kr, dummy);
|
||||
dec_round2(0, F1, RR, RL, dummy, dummy, dummy);
|
||||
|
||||
host_to_be(RR0, RT0);
|
||||
host_to_be(RL0, RT0);
|
||||
host_to_be(RR1, RT0);
|
||||
host_to_be(RL1, RT0);
|
||||
|
||||
b .Ldec_cbc_tail;
|
||||
.ltorg
|
||||
.size _gcry_cast5_arm_dec_blk2,.-_gcry_cast5_arm_dec_blk2;
|
||||
|
||||
.align 3
|
||||
.globl _gcry_cast5_arm_cbc_dec;
|
||||
.type _gcry_cast5_arm_cbc_dec,%function;
|
||||
|
||||
_gcry_cast5_arm_cbc_dec:
|
||||
/* input:
|
||||
* %r0: CTX
|
||||
* %r1: dst (2 blocks)
|
||||
* %r2: src (2 blocks)
|
||||
* %r3: iv (64bit)
|
||||
*/
|
||||
push {%r1-%r11, %ip, %lr};
|
||||
|
||||
read_block2(%r2, RL0, RR0, RL1, RR1, RT0);
|
||||
|
||||
/* dec_blk2 is only used by cbc_dec, jump directly in/out instead
|
||||
* of function call. */
|
||||
b _gcry_cast5_arm_dec_blk2;
|
||||
.Ldec_cbc_tail:
|
||||
/* result in RR0:RL0, RR1:RL1 = %r4:%r3, %r10:%r9 */
|
||||
|
||||
/* %r0: dst, %r1: %src, %r2: iv */
|
||||
pop {%r0-%r2};
|
||||
|
||||
/* load IV+1 (src[0]) to %r7:%r8. Might be unaligned. */
|
||||
read_block_host(%r1, 0, %r7, %r8, %r5);
|
||||
/* load IV (iv[0]) to %r5:%r6. 'iv' is aligned. */
|
||||
ldm %r2, {%r5, %r6};
|
||||
|
||||
/* out[1] ^= IV+1 */
|
||||
eor %r10, %r7;
|
||||
eor %r9, %r8;
|
||||
/* out[0] ^= IV */
|
||||
eor %r4, %r5;
|
||||
eor %r3, %r6;
|
||||
|
||||
/* load IV+2 (src[1]) to %r7:%r8. Might be unaligned. */
|
||||
read_block_host(%r1, 8, %r7, %r8, %r5);
|
||||
/* store IV+2 to iv[0] (aligned). */
|
||||
stm %r2, {%r7, %r8};
|
||||
|
||||
/* store result to dst[0-3]. Might be unaligned. */
|
||||
write_block2_host(%r0, %r4, %r3, %r10, %r9, %r5, %r6);
|
||||
|
||||
pop {%r4-%r11, %ip, %pc};
|
||||
.ltorg
|
||||
.size _gcry_cast5_arm_cbc_dec,.-_gcry_cast5_arm_cbc_dec;
|
||||
|
||||
#endif /*HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS*/
|
||||
#endif /*__ARM_ARCH >= 6*/
|
||||
@@ -0,0 +1,988 @@
|
||||
/* cast5.c - CAST5 cipher (RFC2144)
|
||||
* Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
/* Test vectors:
|
||||
*
|
||||
* 128-bit key = 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9A
|
||||
* plaintext = 01 23 45 67 89 AB CD EF
|
||||
* ciphertext = 23 8B 4F E5 84 7E 44 B2
|
||||
*
|
||||
* 80-bit key = 01 23 45 67 12 34 56 78 23 45
|
||||
* = 01 23 45 67 12 34 56 78 23 45 00 00 00 00 00 00
|
||||
* plaintext = 01 23 45 67 89 AB CD EF
|
||||
* ciphertext = EB 6A 71 1A 2C 02 27 1B
|
||||
*
|
||||
* 40-bit key = 01 23 45 67 12
|
||||
* = 01 23 45 67 12 00 00 00 00 00 00 00 00 00 00 00
|
||||
* plaintext = 01 23 45 67 89 AB CD EF
|
||||
* ciphertext = 7A C8 16 D1 6E 9B 30 2E
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "g10lib.h"
|
||||
#include "types.h"
|
||||
#include "cipher.h"
|
||||
#include "bithelp.h"
|
||||
#include "bufhelp.h"
|
||||
#include "cipher-selftest.h"
|
||||
|
||||
/* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */
|
||||
#undef USE_AMD64_ASM
|
||||
#if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS)
|
||||
# define USE_AMD64_ASM 1
|
||||
#endif
|
||||
|
||||
/* USE_ARM_ASM indicates whether to use ARM assembly code. */
|
||||
#undef USE_ARM_ASM
|
||||
#if defined(__ARMEL__)
|
||||
# ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS
|
||||
# define USE_ARM_ASM 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#define CAST5_BLOCKSIZE 8
|
||||
|
||||
typedef struct {
|
||||
u32 Km[16];
|
||||
byte Kr[16];
|
||||
#ifdef USE_ARM_ASM
|
||||
u32 Kr_arm_enc[16 / sizeof(u32)];
|
||||
u32 Kr_arm_dec[16 / sizeof(u32)];
|
||||
#endif
|
||||
} CAST5_context;
|
||||
|
||||
static gcry_err_code_t cast_setkey (void *c, const byte *key, unsigned keylen);
|
||||
static unsigned int encrypt_block (void *c, byte *outbuf, const byte *inbuf);
|
||||
static unsigned int decrypt_block (void *c, byte *outbuf, const byte *inbuf);
|
||||
|
||||
|
||||
|
||||
#define s1 _gcry_cast5_s1to4[0]
|
||||
#define s2 _gcry_cast5_s1to4[1]
|
||||
#define s3 _gcry_cast5_s1to4[2]
|
||||
#define s4 _gcry_cast5_s1to4[3]
|
||||
|
||||
const u32 _gcry_cast5_s1to4[4][256] = { {
|
||||
0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949,
|
||||
0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e,
|
||||
0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d,
|
||||
0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0,
|
||||
0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7,
|
||||
0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935,
|
||||
0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d,
|
||||
0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50,
|
||||
0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe,
|
||||
0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3,
|
||||
0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167,
|
||||
0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291,
|
||||
0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779,
|
||||
0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2,
|
||||
0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511,
|
||||
0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d,
|
||||
0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5,
|
||||
0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324,
|
||||
0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c,
|
||||
0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc,
|
||||
0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d,
|
||||
0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96,
|
||||
0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a,
|
||||
0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d,
|
||||
0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd,
|
||||
0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6,
|
||||
0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9,
|
||||
0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872,
|
||||
0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c,
|
||||
0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e,
|
||||
0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9,
|
||||
0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf
|
||||
}, {
|
||||
0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651,
|
||||
0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3,
|
||||
0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb,
|
||||
0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806,
|
||||
0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b,
|
||||
0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359,
|
||||
0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b,
|
||||
0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c,
|
||||
0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34,
|
||||
0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb,
|
||||
0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd,
|
||||
0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860,
|
||||
0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b,
|
||||
0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304,
|
||||
0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b,
|
||||
0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf,
|
||||
0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c,
|
||||
0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13,
|
||||
0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f,
|
||||
0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6,
|
||||
0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6,
|
||||
0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58,
|
||||
0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906,
|
||||
0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d,
|
||||
0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6,
|
||||
0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4,
|
||||
0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6,
|
||||
0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f,
|
||||
0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249,
|
||||
0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa,
|
||||
0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9,
|
||||
0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1
|
||||
}, {
|
||||
0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90,
|
||||
0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5,
|
||||
0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e,
|
||||
0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240,
|
||||
0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5,
|
||||
0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,
|
||||
0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71,
|
||||
0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04,
|
||||
0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82,
|
||||
0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15,
|
||||
0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2,
|
||||
0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176,
|
||||
0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148,
|
||||
0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc,
|
||||
0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341,
|
||||
0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e,
|
||||
0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51,
|
||||
0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f,
|
||||
0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a,
|
||||
0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b,
|
||||
0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,
|
||||
0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5,
|
||||
0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45,
|
||||
0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536,
|
||||
0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc,
|
||||
0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0,
|
||||
0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69,
|
||||
0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2,
|
||||
0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49,
|
||||
0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d,
|
||||
0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a,
|
||||
0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783
|
||||
}, {
|
||||
0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1,
|
||||
0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf,
|
||||
0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15,
|
||||
0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121,
|
||||
0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25,
|
||||
0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,
|
||||
0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb,
|
||||
0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5,
|
||||
0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d,
|
||||
0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6,
|
||||
0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23,
|
||||
0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003,
|
||||
0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6,
|
||||
0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119,
|
||||
0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,
|
||||
0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a,
|
||||
0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79,
|
||||
0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df,
|
||||
0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26,
|
||||
0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab,
|
||||
0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7,
|
||||
0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417,
|
||||
0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2,
|
||||
0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2,
|
||||
0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a,
|
||||
0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919,
|
||||
0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef,
|
||||
0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876,
|
||||
0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab,
|
||||
0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04,
|
||||
0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282,
|
||||
0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2
|
||||
} };
|
||||
static const u32 s5[256] = {
|
||||
0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f,
|
||||
0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a,
|
||||
0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff,
|
||||
0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02,
|
||||
0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a,
|
||||
0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7,
|
||||
0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9,
|
||||
0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981,
|
||||
0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774,
|
||||
0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655,
|
||||
0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2,
|
||||
0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910,
|
||||
0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1,
|
||||
0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da,
|
||||
0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049,
|
||||
0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f,
|
||||
0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba,
|
||||
0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
|
||||
0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3,
|
||||
0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840,
|
||||
0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4,
|
||||
0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2,
|
||||
0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7,
|
||||
0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5,
|
||||
0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e,
|
||||
0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e,
|
||||
0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801,
|
||||
0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad,
|
||||
0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,
|
||||
0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20,
|
||||
0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8,
|
||||
0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4
|
||||
};
|
||||
static const u32 s6[256] = {
|
||||
0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac,
|
||||
0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138,
|
||||
0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367,
|
||||
0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98,
|
||||
0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072,
|
||||
0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
|
||||
0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd,
|
||||
0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8,
|
||||
0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9,
|
||||
0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54,
|
||||
0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387,
|
||||
0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc,
|
||||
0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf,
|
||||
0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf,
|
||||
0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f,
|
||||
0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289,
|
||||
0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950,
|
||||
0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
|
||||
0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b,
|
||||
0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be,
|
||||
0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
|
||||
0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976,
|
||||
0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0,
|
||||
0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891,
|
||||
0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da,
|
||||
0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc,
|
||||
0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084,
|
||||
0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25,
|
||||
0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121,
|
||||
0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
|
||||
0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd,
|
||||
0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f
|
||||
};
|
||||
static const u32 s7[256] = {
|
||||
0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f,
|
||||
0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de,
|
||||
0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
|
||||
0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19,
|
||||
0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2,
|
||||
0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516,
|
||||
0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,
|
||||
0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816,
|
||||
0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756,
|
||||
0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a,
|
||||
0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264,
|
||||
0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688,
|
||||
0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28,
|
||||
0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3,
|
||||
0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7,
|
||||
0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,
|
||||
0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,
|
||||
0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a,
|
||||
0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566,
|
||||
0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,
|
||||
0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962,
|
||||
0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e,
|
||||
0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c,
|
||||
0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
|
||||
0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285,
|
||||
0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301,
|
||||
0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be,
|
||||
0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767,
|
||||
0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647,
|
||||
0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914,
|
||||
0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c,
|
||||
0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3
|
||||
};
|
||||
static const u32 s8[256] = {
|
||||
0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5,
|
||||
0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc,
|
||||
0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd,
|
||||
0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d,
|
||||
0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2,
|
||||
0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862,
|
||||
0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc,
|
||||
0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c,
|
||||
0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e,
|
||||
0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039,
|
||||
0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8,
|
||||
0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42,
|
||||
0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5,
|
||||
0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472,
|
||||
0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225,
|
||||
0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c,
|
||||
0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb,
|
||||
0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054,
|
||||
0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70,
|
||||
0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc,
|
||||
0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
|
||||
0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3,
|
||||
0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4,
|
||||
0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101,
|
||||
0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f,
|
||||
0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e,
|
||||
0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
|
||||
0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c,
|
||||
0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384,
|
||||
0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c,
|
||||
0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82,
|
||||
0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e
|
||||
};
|
||||
|
||||
|
||||
#ifdef USE_AMD64_ASM
|
||||
|
||||
/* Assembly implementations of CAST5. */
|
||||
extern void _gcry_cast5_amd64_encrypt_block(CAST5_context *c, byte *outbuf,
|
||||
const byte *inbuf);
|
||||
|
||||
extern void _gcry_cast5_amd64_decrypt_block(CAST5_context *c, byte *outbuf,
|
||||
const byte *inbuf);
|
||||
|
||||
/* These assembly implementations process four blocks in parallel. */
|
||||
extern void _gcry_cast5_amd64_ctr_enc(CAST5_context *ctx, byte *out,
|
||||
const byte *in, byte *ctr);
|
||||
|
||||
extern void _gcry_cast5_amd64_cbc_dec(CAST5_context *ctx, byte *out,
|
||||
const byte *in, byte *iv);
|
||||
|
||||
extern void _gcry_cast5_amd64_cfb_dec(CAST5_context *ctx, byte *out,
|
||||
const byte *in, byte *iv);
|
||||
|
||||
static void
|
||||
do_encrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
_gcry_cast5_amd64_encrypt_block (context, outbuf, inbuf);
|
||||
}
|
||||
|
||||
static void
|
||||
do_decrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
_gcry_cast5_amd64_decrypt_block (context, outbuf, inbuf);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
encrypt_block (void *context , byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAST5_context *c = (CAST5_context *) context;
|
||||
do_encrypt_block (c, outbuf, inbuf);
|
||||
return /*burn_stack*/ (2*8);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
decrypt_block (void *context, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAST5_context *c = (CAST5_context *) context;
|
||||
_gcry_cast5_amd64_decrypt_block (c, outbuf, inbuf);
|
||||
return /*burn_stack*/ (2*8);
|
||||
}
|
||||
|
||||
#elif defined(USE_ARM_ASM)
|
||||
|
||||
/* ARM assembly implementations of CAST5. */
|
||||
extern void _gcry_cast5_arm_encrypt_block(CAST5_context *c, byte *outbuf,
|
||||
const byte *inbuf);
|
||||
|
||||
extern void _gcry_cast5_arm_decrypt_block(CAST5_context *c, byte *outbuf,
|
||||
const byte *inbuf);
|
||||
|
||||
/* These assembly implementations process two blocks in parallel. */
|
||||
extern void _gcry_cast5_arm_ctr_enc(CAST5_context *ctx, byte *out,
|
||||
const byte *in, byte *ctr);
|
||||
|
||||
extern void _gcry_cast5_arm_cbc_dec(CAST5_context *ctx, byte *out,
|
||||
const byte *in, byte *iv);
|
||||
|
||||
extern void _gcry_cast5_arm_cfb_dec(CAST5_context *ctx, byte *out,
|
||||
const byte *in, byte *iv);
|
||||
|
||||
static void
|
||||
do_encrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
_gcry_cast5_arm_encrypt_block (context, outbuf, inbuf);
|
||||
}
|
||||
|
||||
static void
|
||||
do_decrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
_gcry_cast5_arm_decrypt_block (context, outbuf, inbuf);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
encrypt_block (void *context , byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAST5_context *c = (CAST5_context *) context;
|
||||
do_encrypt_block (c, outbuf, inbuf);
|
||||
return /*burn_stack*/ (10*4);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
decrypt_block (void *context, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAST5_context *c = (CAST5_context *) context;
|
||||
do_decrypt_block (c, outbuf, inbuf);
|
||||
return /*burn_stack*/ (10*4);
|
||||
}
|
||||
|
||||
#else /*USE_ARM_ASM*/
|
||||
|
||||
#define F1(D,m,r) ( (I = ((m) + (D))), (I=rol(I,(r))), \
|
||||
(((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]) )
|
||||
#define F2(D,m,r) ( (I = ((m) ^ (D))), (I=rol(I,(r))), \
|
||||
(((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]) )
|
||||
#define F3(D,m,r) ( (I = ((m) - (D))), (I=rol(I,(r))), \
|
||||
(((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]) )
|
||||
|
||||
static void
|
||||
do_encrypt_block( CAST5_context *c, byte *outbuf, const byte *inbuf )
|
||||
{
|
||||
u32 l, r, t;
|
||||
u32 I; /* used by the Fx macros */
|
||||
u32 *Km;
|
||||
byte *Kr;
|
||||
|
||||
Km = c->Km;
|
||||
Kr = c->Kr;
|
||||
|
||||
/* (L0,R0) <-- (m1...m64). (Split the plaintext into left and
|
||||
* right 32-bit halves L0 = m1...m32 and R0 = m33...m64.)
|
||||
*/
|
||||
l = buf_get_be32(inbuf + 0);
|
||||
r = buf_get_be32(inbuf + 4);
|
||||
|
||||
/* (16 rounds) for i from 1 to 16, compute Li and Ri as follows:
|
||||
* Li = Ri-1;
|
||||
* Ri = Li-1 ^ f(Ri-1,Kmi,Kri), where f is defined in Section 2.2
|
||||
* Rounds 1, 4, 7, 10, 13, and 16 use f function Type 1.
|
||||
* Rounds 2, 5, 8, 11, and 14 use f function Type 2.
|
||||
* Rounds 3, 6, 9, 12, and 15 use f function Type 3.
|
||||
*/
|
||||
|
||||
t = l; l = r; r = t ^ F1(r, Km[ 0], Kr[ 0]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[ 1], Kr[ 1]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[ 2], Kr[ 2]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[ 3], Kr[ 3]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[ 4], Kr[ 4]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[ 5], Kr[ 5]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[ 6], Kr[ 6]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[ 7], Kr[ 7]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[ 8], Kr[ 8]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[ 9], Kr[ 9]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
|
||||
|
||||
/* c1...c64 <-- (R16,L16). (Exchange final blocks L16, R16 and
|
||||
* concatenate to form the ciphertext.) */
|
||||
buf_put_be32(outbuf + 0, r);
|
||||
buf_put_be32(outbuf + 4, l);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
encrypt_block (void *context , byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAST5_context *c = (CAST5_context *) context;
|
||||
do_encrypt_block (c, outbuf, inbuf);
|
||||
return /*burn_stack*/ (20+4*sizeof(void*));
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
do_decrypt_block (CAST5_context *c, byte *outbuf, const byte *inbuf )
|
||||
{
|
||||
u32 l, r, t;
|
||||
u32 I;
|
||||
u32 *Km;
|
||||
byte *Kr;
|
||||
|
||||
Km = c->Km;
|
||||
Kr = c->Kr;
|
||||
|
||||
l = buf_get_be32(inbuf + 0);
|
||||
r = buf_get_be32(inbuf + 4);
|
||||
|
||||
t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[ 9], Kr[ 9]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[ 8], Kr[ 8]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[ 7], Kr[ 7]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[ 6], Kr[ 6]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[ 5], Kr[ 5]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[ 4], Kr[ 4]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[ 3], Kr[ 3]);
|
||||
t = l; l = r; r = t ^ F3(r, Km[ 2], Kr[ 2]);
|
||||
t = l; l = r; r = t ^ F2(r, Km[ 1], Kr[ 1]);
|
||||
t = l; l = r; r = t ^ F1(r, Km[ 0], Kr[ 0]);
|
||||
|
||||
buf_put_be32(outbuf + 0, r);
|
||||
buf_put_be32(outbuf + 4, l);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
decrypt_block (void *context, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
CAST5_context *c = (CAST5_context *) context;
|
||||
do_decrypt_block (c, outbuf, inbuf);
|
||||
return /*burn_stack*/ (20+4*sizeof(void*));
|
||||
}
|
||||
|
||||
#endif /*!USE_ARM_ASM*/
|
||||
|
||||
|
||||
/* Bulk encryption of complete blocks in CTR mode. This function is only
|
||||
intended for the bulk encryption feature of cipher.c. CTR is expected to be
|
||||
of size CAST5_BLOCKSIZE. */
|
||||
void
|
||||
_gcry_cast5_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg,
|
||||
const void *inbuf_arg, size_t nblocks)
|
||||
{
|
||||
CAST5_context *ctx = context;
|
||||
unsigned char *outbuf = outbuf_arg;
|
||||
const unsigned char *inbuf = inbuf_arg;
|
||||
unsigned char tmpbuf[CAST5_BLOCKSIZE];
|
||||
int burn_stack_depth = (20 + 4 * sizeof(void*)) + 2 * CAST5_BLOCKSIZE;
|
||||
|
||||
int i;
|
||||
|
||||
#ifdef USE_AMD64_ASM
|
||||
{
|
||||
if (nblocks >= 4)
|
||||
burn_stack_depth += 8 * sizeof(void*);
|
||||
|
||||
/* Process data in 4 block chunks. */
|
||||
while (nblocks >= 4)
|
||||
{
|
||||
_gcry_cast5_amd64_ctr_enc(ctx, outbuf, inbuf, ctr);
|
||||
|
||||
nblocks -= 4;
|
||||
outbuf += 4 * CAST5_BLOCKSIZE;
|
||||
inbuf += 4 * CAST5_BLOCKSIZE;
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
/* TODO: use caching instead? */
|
||||
}
|
||||
#elif defined(USE_ARM_ASM)
|
||||
{
|
||||
/* Process data in 2 block chunks. */
|
||||
while (nblocks >= 2)
|
||||
{
|
||||
_gcry_cast5_arm_ctr_enc(ctx, outbuf, inbuf, ctr);
|
||||
|
||||
nblocks -= 2;
|
||||
outbuf += 2 * CAST5_BLOCKSIZE;
|
||||
inbuf += 2 * CAST5_BLOCKSIZE;
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
/* TODO: use caching instead? */
|
||||
}
|
||||
#endif
|
||||
|
||||
for ( ;nblocks; nblocks-- )
|
||||
{
|
||||
/* Encrypt the counter. */
|
||||
do_encrypt_block(ctx, tmpbuf, ctr);
|
||||
/* XOR the input with the encrypted counter and store in output. */
|
||||
buf_xor(outbuf, tmpbuf, inbuf, CAST5_BLOCKSIZE);
|
||||
outbuf += CAST5_BLOCKSIZE;
|
||||
inbuf += CAST5_BLOCKSIZE;
|
||||
/* Increment the counter. */
|
||||
for (i = CAST5_BLOCKSIZE; i > 0; i--)
|
||||
{
|
||||
ctr[i-1]++;
|
||||
if (ctr[i-1])
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
wipememory(tmpbuf, sizeof(tmpbuf));
|
||||
_gcry_burn_stack(burn_stack_depth);
|
||||
}
|
||||
|
||||
|
||||
/* Bulk decryption of complete blocks in CBC mode. This function is only
|
||||
intended for the bulk encryption feature of cipher.c. */
|
||||
void
|
||||
_gcry_cast5_cbc_dec(void *context, unsigned char *iv, void *outbuf_arg,
|
||||
const void *inbuf_arg, size_t nblocks)
|
||||
{
|
||||
CAST5_context *ctx = context;
|
||||
unsigned char *outbuf = outbuf_arg;
|
||||
const unsigned char *inbuf = inbuf_arg;
|
||||
unsigned char savebuf[CAST5_BLOCKSIZE];
|
||||
int burn_stack_depth = (20 + 4 * sizeof(void*)) + 2 * CAST5_BLOCKSIZE;
|
||||
|
||||
#ifdef USE_AMD64_ASM
|
||||
{
|
||||
if (nblocks >= 4)
|
||||
burn_stack_depth += 8 * sizeof(void*);
|
||||
|
||||
/* Process data in 4 block chunks. */
|
||||
while (nblocks >= 4)
|
||||
{
|
||||
_gcry_cast5_amd64_cbc_dec(ctx, outbuf, inbuf, iv);
|
||||
|
||||
nblocks -= 4;
|
||||
outbuf += 4 * CAST5_BLOCKSIZE;
|
||||
inbuf += 4 * CAST5_BLOCKSIZE;
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
}
|
||||
#elif defined(USE_ARM_ASM)
|
||||
{
|
||||
/* Process data in 2 block chunks. */
|
||||
while (nblocks >= 2)
|
||||
{
|
||||
_gcry_cast5_arm_cbc_dec(ctx, outbuf, inbuf, iv);
|
||||
|
||||
nblocks -= 2;
|
||||
outbuf += 2 * CAST5_BLOCKSIZE;
|
||||
inbuf += 2 * CAST5_BLOCKSIZE;
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
}
|
||||
#endif
|
||||
|
||||
for ( ;nblocks; nblocks-- )
|
||||
{
|
||||
/* INBUF is needed later and it may be identical to OUTBUF, so store
|
||||
the intermediate result to SAVEBUF. */
|
||||
do_decrypt_block (ctx, savebuf, inbuf);
|
||||
|
||||
buf_xor_n_copy_2(outbuf, savebuf, iv, inbuf, CAST5_BLOCKSIZE);
|
||||
inbuf += CAST5_BLOCKSIZE;
|
||||
outbuf += CAST5_BLOCKSIZE;
|
||||
}
|
||||
|
||||
wipememory(savebuf, sizeof(savebuf));
|
||||
_gcry_burn_stack(burn_stack_depth);
|
||||
}
|
||||
|
||||
/* Bulk decryption of complete blocks in CFB mode. This function is only
|
||||
intended for the bulk encryption feature of cipher.c. */
|
||||
void
|
||||
_gcry_cast5_cfb_dec(void *context, unsigned char *iv, void *outbuf_arg,
|
||||
const void *inbuf_arg, size_t nblocks)
|
||||
{
|
||||
CAST5_context *ctx = context;
|
||||
unsigned char *outbuf = outbuf_arg;
|
||||
const unsigned char *inbuf = inbuf_arg;
|
||||
int burn_stack_depth = (20 + 4 * sizeof(void*)) + 2 * CAST5_BLOCKSIZE;
|
||||
|
||||
#ifdef USE_AMD64_ASM
|
||||
{
|
||||
if (nblocks >= 4)
|
||||
burn_stack_depth += 8 * sizeof(void*);
|
||||
|
||||
/* Process data in 4 block chunks. */
|
||||
while (nblocks >= 4)
|
||||
{
|
||||
_gcry_cast5_amd64_cfb_dec(ctx, outbuf, inbuf, iv);
|
||||
|
||||
nblocks -= 4;
|
||||
outbuf += 4 * CAST5_BLOCKSIZE;
|
||||
inbuf += 4 * CAST5_BLOCKSIZE;
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
}
|
||||
#elif defined(USE_ARM_ASM)
|
||||
{
|
||||
/* Process data in 2 block chunks. */
|
||||
while (nblocks >= 2)
|
||||
{
|
||||
_gcry_cast5_arm_cfb_dec(ctx, outbuf, inbuf, iv);
|
||||
|
||||
nblocks -= 2;
|
||||
outbuf += 2 * CAST5_BLOCKSIZE;
|
||||
inbuf += 2 * CAST5_BLOCKSIZE;
|
||||
}
|
||||
|
||||
/* Use generic code to handle smaller chunks... */
|
||||
}
|
||||
#endif
|
||||
|
||||
for ( ;nblocks; nblocks-- )
|
||||
{
|
||||
do_encrypt_block(ctx, iv, iv);
|
||||
buf_xor_n_copy(outbuf, iv, inbuf, CAST5_BLOCKSIZE);
|
||||
outbuf += CAST5_BLOCKSIZE;
|
||||
inbuf += CAST5_BLOCKSIZE;
|
||||
}
|
||||
|
||||
_gcry_burn_stack(burn_stack_depth);
|
||||
}
|
||||
|
||||
|
||||
/* Run the self-tests for CAST5-CTR, tests IV increment of bulk CTR
|
||||
encryption. Returns NULL on success. */
|
||||
static const char *
|
||||
selftest_ctr (void)
|
||||
{
|
||||
const int nblocks = 4+1;
|
||||
const int blocksize = CAST5_BLOCKSIZE;
|
||||
const int context_size = sizeof(CAST5_context);
|
||||
|
||||
return _gcry_selftest_helper_ctr("CAST5", &cast_setkey,
|
||||
&encrypt_block, &_gcry_cast5_ctr_enc, nblocks, blocksize,
|
||||
context_size);
|
||||
}
|
||||
|
||||
|
||||
/* Run the self-tests for CAST5-CBC, tests bulk CBC decryption.
|
||||
Returns NULL on success. */
|
||||
static const char *
|
||||
selftest_cbc (void)
|
||||
{
|
||||
const int nblocks = 4+2;
|
||||
const int blocksize = CAST5_BLOCKSIZE;
|
||||
const int context_size = sizeof(CAST5_context);
|
||||
|
||||
return _gcry_selftest_helper_cbc("CAST5", &cast_setkey,
|
||||
&encrypt_block, &_gcry_cast5_cbc_dec, nblocks, blocksize,
|
||||
context_size);
|
||||
}
|
||||
|
||||
|
||||
/* Run the self-tests for CAST5-CFB, tests bulk CBC decryption.
|
||||
Returns NULL on success. */
|
||||
static const char *
|
||||
selftest_cfb (void)
|
||||
{
|
||||
const int nblocks = 4+2;
|
||||
const int blocksize = CAST5_BLOCKSIZE;
|
||||
const int context_size = sizeof(CAST5_context);
|
||||
|
||||
return _gcry_selftest_helper_cfb("CAST5", &cast_setkey,
|
||||
&encrypt_block, &_gcry_cast5_cfb_dec, nblocks, blocksize,
|
||||
context_size);
|
||||
}
|
||||
|
||||
|
||||
static const char*
|
||||
selftest(void)
|
||||
{
|
||||
CAST5_context c;
|
||||
static const byte key[16] =
|
||||
{ 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
|
||||
0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A };
|
||||
static const byte plain[8] =
|
||||
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
|
||||
static const byte cipher[8] =
|
||||
{ 0x23, 0x8B, 0x4F, 0xE5, 0x84, 0x7E, 0x44, 0xB2 };
|
||||
byte buffer[8];
|
||||
const char *r;
|
||||
|
||||
cast_setkey( &c, key, 16 );
|
||||
encrypt_block( &c, buffer, plain );
|
||||
if( memcmp( buffer, cipher, 8 ) )
|
||||
return "1";
|
||||
decrypt_block( &c, buffer, buffer );
|
||||
if( memcmp( buffer, plain, 8 ) )
|
||||
return "2";
|
||||
|
||||
#if 0 /* full maintenance test */
|
||||
{
|
||||
int i;
|
||||
byte a0[16] = { 0x01,0x23,0x45,0x67,0x12,0x34,0x56,0x78,
|
||||
0x23,0x45,0x67,0x89,0x34,0x56,0x78,0x9A };
|
||||
byte b0[16] = { 0x01,0x23,0x45,0x67,0x12,0x34,0x56,0x78,
|
||||
0x23,0x45,0x67,0x89,0x34,0x56,0x78,0x9A };
|
||||
byte a1[16] = { 0xEE,0xA9,0xD0,0xA2,0x49,0xFD,0x3B,0xA6,
|
||||
0xB3,0x43,0x6F,0xB8,0x9D,0x6D,0xCA,0x92 };
|
||||
byte b1[16] = { 0xB2,0xC9,0x5E,0xB0,0x0C,0x31,0xAD,0x71,
|
||||
0x80,0xAC,0x05,0xB8,0xE8,0x3D,0x69,0x6E };
|
||||
|
||||
for(i=0; i < 1000000; i++ ) {
|
||||
cast_setkey( &c, b0, 16 );
|
||||
encrypt_block( &c, a0, a0 );
|
||||
encrypt_block( &c, a0+8, a0+8 );
|
||||
cast_setkey( &c, a0, 16 );
|
||||
encrypt_block( &c, b0, b0 );
|
||||
encrypt_block( &c, b0+8, b0+8 );
|
||||
}
|
||||
if( memcmp( a0, a1, 16 ) || memcmp( b0, b1, 16 ) )
|
||||
return "3";
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( (r = selftest_cbc ()) )
|
||||
return r;
|
||||
|
||||
if ( (r = selftest_cfb ()) )
|
||||
return r;
|
||||
|
||||
if ( (r = selftest_ctr ()) )
|
||||
return r;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
key_schedule( u32 *x, u32 *z, u32 *k )
|
||||
{
|
||||
|
||||
#define xi(i) ((x[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
|
||||
#define zi(i) ((z[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
|
||||
|
||||
z[0] = x[0] ^ s5[xi(13)]^s6[xi(15)]^s7[xi(12)]^s8[xi(14)]^s7[xi( 8)];
|
||||
z[1] = x[2] ^ s5[zi( 0)]^s6[zi( 2)]^s7[zi( 1)]^s8[zi( 3)]^s8[xi(10)];
|
||||
z[2] = x[3] ^ s5[zi( 7)]^s6[zi( 6)]^s7[zi( 5)]^s8[zi( 4)]^s5[xi( 9)];
|
||||
z[3] = x[1] ^ s5[zi(10)]^s6[zi( 9)]^s7[zi(11)]^s8[zi( 8)]^s6[xi(11)];
|
||||
k[0] = s5[zi( 8)]^s6[zi( 9)]^s7[zi( 7)]^s8[zi( 6)]^s5[zi( 2)];
|
||||
k[1] = s5[zi(10)]^s6[zi(11)]^s7[zi( 5)]^s8[zi( 4)]^s6[zi( 6)];
|
||||
k[2] = s5[zi(12)]^s6[zi(13)]^s7[zi( 3)]^s8[zi( 2)]^s7[zi( 9)];
|
||||
k[3] = s5[zi(14)]^s6[zi(15)]^s7[zi( 1)]^s8[zi( 0)]^s8[zi(12)];
|
||||
|
||||
x[0] = z[2] ^ s5[zi( 5)]^s6[zi( 7)]^s7[zi( 4)]^s8[zi( 6)]^s7[zi( 0)];
|
||||
x[1] = z[0] ^ s5[xi( 0)]^s6[xi( 2)]^s7[xi( 1)]^s8[xi( 3)]^s8[zi( 2)];
|
||||
x[2] = z[1] ^ s5[xi( 7)]^s6[xi( 6)]^s7[xi( 5)]^s8[xi( 4)]^s5[zi( 1)];
|
||||
x[3] = z[3] ^ s5[xi(10)]^s6[xi( 9)]^s7[xi(11)]^s8[xi( 8)]^s6[zi( 3)];
|
||||
k[4] = s5[xi( 3)]^s6[xi( 2)]^s7[xi(12)]^s8[xi(13)]^s5[xi( 8)];
|
||||
k[5] = s5[xi( 1)]^s6[xi( 0)]^s7[xi(14)]^s8[xi(15)]^s6[xi(13)];
|
||||
k[6] = s5[xi( 7)]^s6[xi( 6)]^s7[xi( 8)]^s8[xi( 9)]^s7[xi( 3)];
|
||||
k[7] = s5[xi( 5)]^s6[xi( 4)]^s7[xi(10)]^s8[xi(11)]^s8[xi( 7)];
|
||||
|
||||
z[0] = x[0] ^ s5[xi(13)]^s6[xi(15)]^s7[xi(12)]^s8[xi(14)]^s7[xi( 8)];
|
||||
z[1] = x[2] ^ s5[zi( 0)]^s6[zi( 2)]^s7[zi( 1)]^s8[zi( 3)]^s8[xi(10)];
|
||||
z[2] = x[3] ^ s5[zi( 7)]^s6[zi( 6)]^s7[zi( 5)]^s8[zi( 4)]^s5[xi( 9)];
|
||||
z[3] = x[1] ^ s5[zi(10)]^s6[zi( 9)]^s7[zi(11)]^s8[zi( 8)]^s6[xi(11)];
|
||||
k[8] = s5[zi( 3)]^s6[zi( 2)]^s7[zi(12)]^s8[zi(13)]^s5[zi( 9)];
|
||||
k[9] = s5[zi( 1)]^s6[zi( 0)]^s7[zi(14)]^s8[zi(15)]^s6[zi(12)];
|
||||
k[10]= s5[zi( 7)]^s6[zi( 6)]^s7[zi( 8)]^s8[zi( 9)]^s7[zi( 2)];
|
||||
k[11]= s5[zi( 5)]^s6[zi( 4)]^s7[zi(10)]^s8[zi(11)]^s8[zi( 6)];
|
||||
|
||||
x[0] = z[2] ^ s5[zi( 5)]^s6[zi( 7)]^s7[zi( 4)]^s8[zi( 6)]^s7[zi( 0)];
|
||||
x[1] = z[0] ^ s5[xi( 0)]^s6[xi( 2)]^s7[xi( 1)]^s8[xi( 3)]^s8[zi( 2)];
|
||||
x[2] = z[1] ^ s5[xi( 7)]^s6[xi( 6)]^s7[xi( 5)]^s8[xi( 4)]^s5[zi( 1)];
|
||||
x[3] = z[3] ^ s5[xi(10)]^s6[xi( 9)]^s7[xi(11)]^s8[xi( 8)]^s6[zi( 3)];
|
||||
k[12]= s5[xi( 8)]^s6[xi( 9)]^s7[xi( 7)]^s8[xi( 6)]^s5[xi( 3)];
|
||||
k[13]= s5[xi(10)]^s6[xi(11)]^s7[xi( 5)]^s8[xi( 4)]^s6[xi( 7)];
|
||||
k[14]= s5[xi(12)]^s6[xi(13)]^s7[xi( 3)]^s8[xi( 2)]^s7[xi( 8)];
|
||||
k[15]= s5[xi(14)]^s6[xi(15)]^s7[xi( 1)]^s8[xi( 0)]^s8[xi(13)];
|
||||
|
||||
#undef xi
|
||||
#undef zi
|
||||
}
|
||||
|
||||
|
||||
static gcry_err_code_t
|
||||
do_cast_setkey( CAST5_context *c, const byte *key, unsigned keylen )
|
||||
{
|
||||
static int initialized;
|
||||
static const char* selftest_failed;
|
||||
int i;
|
||||
u32 x[4];
|
||||
u32 z[4];
|
||||
u32 k[16];
|
||||
|
||||
if( !initialized )
|
||||
{
|
||||
initialized = 1;
|
||||
selftest_failed = selftest();
|
||||
if( selftest_failed )
|
||||
log_error ("CAST5 selftest failed (%s).\n", selftest_failed );
|
||||
}
|
||||
if( selftest_failed )
|
||||
return GPG_ERR_SELFTEST_FAILED;
|
||||
|
||||
if( keylen != 16 )
|
||||
return GPG_ERR_INV_KEYLEN;
|
||||
|
||||
x[0] = buf_get_be32(key + 0);
|
||||
x[1] = buf_get_be32(key + 4);
|
||||
x[2] = buf_get_be32(key + 8);
|
||||
x[3] = buf_get_be32(key + 12);
|
||||
|
||||
key_schedule( x, z, k );
|
||||
for(i=0; i < 16; i++ )
|
||||
c->Km[i] = k[i];
|
||||
key_schedule( x, z, k );
|
||||
for(i=0; i < 16; i++ )
|
||||
c->Kr[i] = k[i] & 0x1f;
|
||||
|
||||
#ifdef USE_ARM_ASM
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
byte Kr_arm[4];
|
||||
|
||||
/* Convert rotate left to rotate right and add shift left
|
||||
* by 2. */
|
||||
Kr_arm[0] = ((32 - c->Kr[4 * i + 0]) - 2) & 0x1f;
|
||||
Kr_arm[1] = ((32 - c->Kr[4 * i + 1]) - 2) & 0x1f;
|
||||
Kr_arm[2] = ((32 - c->Kr[4 * i + 2]) - 2) & 0x1f;
|
||||
Kr_arm[3] = ((32 - c->Kr[4 * i + 3]) - 2) & 0x1f;
|
||||
|
||||
/* Endian friendly store. */
|
||||
c->Kr_arm_enc[i] = Kr_arm[0] |
|
||||
(Kr_arm[1] << 8) |
|
||||
(Kr_arm[2] << 16) |
|
||||
(Kr_arm[3] << 24);
|
||||
c->Kr_arm_dec[i] = Kr_arm[3] |
|
||||
(Kr_arm[2] << 8) |
|
||||
(Kr_arm[1] << 16) |
|
||||
(Kr_arm[0] << 24);
|
||||
|
||||
wipememory(Kr_arm, sizeof(Kr_arm));
|
||||
}
|
||||
#endif
|
||||
|
||||
wipememory(x, sizeof x);
|
||||
wipememory(z, sizeof z);
|
||||
wipememory(k, sizeof k);
|
||||
|
||||
#undef xi
|
||||
#undef zi
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
|
||||
static gcry_err_code_t
|
||||
cast_setkey (void *context, const byte *key, unsigned keylen )
|
||||
{
|
||||
CAST5_context *c = (CAST5_context *) context;
|
||||
gcry_err_code_t rc = do_cast_setkey (c, key, keylen);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
gcry_cipher_spec_t _gcry_cipher_spec_cast5 =
|
||||
{
|
||||
GCRY_CIPHER_CAST5, {0, 0},
|
||||
"CAST5", NULL, NULL, CAST5_BLOCKSIZE, 128, sizeof (CAST5_context),
|
||||
cast_setkey, encrypt_block, decrypt_block
|
||||
};
|
||||
@@ -0,0 +1,210 @@
|
||||
/* cipher-aeswrap.c - Generic AESWRAP mode implementation
|
||||
* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
#include "ath.h"
|
||||
#include "bufhelp.h"
|
||||
#include "./cipher-internal.h"
|
||||
|
||||
|
||||
/* Perform the AES-Wrap algorithm as specified by RFC3394. We
|
||||
implement this as a mode usable with any cipher algorithm of
|
||||
blocksize 128. */
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_aeswrap_encrypt (gcry_cipher_hd_t c,
|
||||
byte *outbuf, size_t outbuflen,
|
||||
const byte *inbuf, size_t inbuflen )
|
||||
{
|
||||
int j, x;
|
||||
size_t n, i;
|
||||
unsigned char *r, *a, *b;
|
||||
unsigned char t[8];
|
||||
unsigned int burn, nburn;
|
||||
|
||||
#if MAX_BLOCKSIZE < 8
|
||||
#error Invalid block size
|
||||
#endif
|
||||
/* We require a cipher with a 128 bit block length. */
|
||||
if (c->spec->blocksize != 16)
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
|
||||
/* The output buffer must be able to hold the input data plus one
|
||||
additional block. */
|
||||
if (outbuflen < inbuflen + 8)
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
/* Input data must be multiple of 64 bits. */
|
||||
if (inbuflen % 8)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
n = inbuflen / 8;
|
||||
|
||||
/* We need at least two 64 bit blocks. */
|
||||
if (n < 2)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
burn = 0;
|
||||
|
||||
r = outbuf;
|
||||
a = outbuf; /* We store A directly in OUTBUF. */
|
||||
b = c->u_ctr.ctr; /* B is also used to concatenate stuff. */
|
||||
|
||||
/* If an IV has been set we use that IV as the Alternative Initial
|
||||
Value; if it has not been set we use the standard value. */
|
||||
if (c->marks.iv)
|
||||
memcpy (a, c->u_iv.iv, 8);
|
||||
else
|
||||
memset (a, 0xa6, 8);
|
||||
|
||||
/* Copy the inbuf to the outbuf. */
|
||||
memmove (r+8, inbuf, inbuflen);
|
||||
|
||||
memset (t, 0, sizeof t); /* t := 0. */
|
||||
|
||||
for (j = 0; j <= 5; j++)
|
||||
{
|
||||
for (i = 1; i <= n; i++)
|
||||
{
|
||||
/* B := AES_k( A | R[i] ) */
|
||||
memcpy (b, a, 8);
|
||||
memcpy (b+8, r+i*8, 8);
|
||||
nburn = c->spec->encrypt (&c->context.c, b, b);
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
/* t := t + 1 */
|
||||
for (x = 7; x >= 0; x--)
|
||||
{
|
||||
t[x]++;
|
||||
if (t[x])
|
||||
break;
|
||||
}
|
||||
/* A := MSB_64(B) ^ t */
|
||||
buf_xor(a, b, t, 8);
|
||||
/* R[i] := LSB_64(B) */
|
||||
memcpy (r+i*8, b+8, 8);
|
||||
}
|
||||
}
|
||||
|
||||
if (burn > 0)
|
||||
_gcry_burn_stack (burn + 4 * sizeof(void *));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Perform the AES-Unwrap algorithm as specified by RFC3394. We
|
||||
implement this as a mode usable with any cipher algorithm of
|
||||
blocksize 128. */
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_aeswrap_decrypt (gcry_cipher_hd_t c,
|
||||
byte *outbuf, size_t outbuflen,
|
||||
const byte *inbuf, size_t inbuflen)
|
||||
{
|
||||
int j, x;
|
||||
size_t n, i;
|
||||
unsigned char *r, *a, *b;
|
||||
unsigned char t[8];
|
||||
unsigned int burn, nburn;
|
||||
|
||||
#if MAX_BLOCKSIZE < 8
|
||||
#error Invalid block size
|
||||
#endif
|
||||
/* We require a cipher with a 128 bit block length. */
|
||||
if (c->spec->blocksize != 16)
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
|
||||
/* The output buffer must be able to hold the input data minus one
|
||||
additional block. Fixme: The caller has more restrictive checks
|
||||
- we may want to fix them for this mode. */
|
||||
if (outbuflen + 8 < inbuflen)
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
/* Input data must be multiple of 64 bits. */
|
||||
if (inbuflen % 8)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
n = inbuflen / 8;
|
||||
|
||||
/* We need at least three 64 bit blocks. */
|
||||
if (n < 3)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
burn = 0;
|
||||
|
||||
r = outbuf;
|
||||
a = c->lastiv; /* We use c->LASTIV as buffer for A. */
|
||||
b = c->u_ctr.ctr; /* B is also used to concatenate stuff. */
|
||||
|
||||
/* Copy the inbuf to the outbuf and save A. */
|
||||
memcpy (a, inbuf, 8);
|
||||
memmove (r, inbuf+8, inbuflen-8);
|
||||
n--; /* Reduce to actual number of data blocks. */
|
||||
|
||||
/* t := 6 * n */
|
||||
i = n * 6; /* The range is valid because: n = inbuflen / 8 - 1. */
|
||||
for (x=0; x < 8 && x < sizeof (i); x++)
|
||||
t[7-x] = i >> (8*x);
|
||||
for (; x < 8; x++)
|
||||
t[7-x] = 0;
|
||||
|
||||
for (j = 5; j >= 0; j--)
|
||||
{
|
||||
for (i = n; i >= 1; i--)
|
||||
{
|
||||
/* B := AES_k^1( (A ^ t)| R[i] ) */
|
||||
buf_xor(b, a, t, 8);
|
||||
memcpy (b+8, r+(i-1)*8, 8);
|
||||
nburn = c->spec->decrypt (&c->context.c, b, b);
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
/* t := t - 1 */
|
||||
for (x = 7; x >= 0; x--)
|
||||
{
|
||||
t[x]--;
|
||||
if (t[x] != 0xff)
|
||||
break;
|
||||
}
|
||||
/* A := MSB_64(B) */
|
||||
memcpy (a, b, 8);
|
||||
/* R[i] := LSB_64(B) */
|
||||
memcpy (r+(i-1)*8, b+8, 8);
|
||||
}
|
||||
}
|
||||
|
||||
/* If an IV has been set we compare against this Alternative Initial
|
||||
Value; if it has not been set we compare against the standard IV. */
|
||||
if (c->marks.iv)
|
||||
j = memcmp (a, c->u_iv.iv, 8);
|
||||
else
|
||||
{
|
||||
for (j=0, x=0; x < 8; x++)
|
||||
if (a[x] != 0xa6)
|
||||
{
|
||||
j=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (burn > 0)
|
||||
_gcry_burn_stack (burn + 4 * sizeof(void *));
|
||||
|
||||
return j? GPG_ERR_CHECKSUM : 0;
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
/* cipher-cbc.c - Generic CBC mode implementation
|
||||
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
|
||||
* 2005, 2007, 2008, 2009, 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
#include "ath.h"
|
||||
#include "./cipher-internal.h"
|
||||
#include "bufhelp.h"
|
||||
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_cbc_encrypt (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen)
|
||||
{
|
||||
size_t n;
|
||||
unsigned char *ivp;
|
||||
int i;
|
||||
size_t blocksize = c->spec->blocksize;
|
||||
gcry_cipher_encrypt_t enc_fn = c->spec->encrypt;
|
||||
size_t nblocks = inbuflen / blocksize;
|
||||
unsigned int burn, nburn;
|
||||
|
||||
if (outbuflen < ((c->flags & GCRY_CIPHER_CBC_MAC)? blocksize : inbuflen))
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
|
||||
if ((inbuflen % blocksize)
|
||||
&& !(inbuflen > blocksize
|
||||
&& (c->flags & GCRY_CIPHER_CBC_CTS)))
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
|
||||
burn = 0;
|
||||
|
||||
if ((c->flags & GCRY_CIPHER_CBC_CTS) && inbuflen > blocksize)
|
||||
{
|
||||
if ((inbuflen % blocksize) == 0)
|
||||
nblocks--;
|
||||
}
|
||||
|
||||
if (c->bulk.cbc_enc)
|
||||
{
|
||||
c->bulk.cbc_enc (&c->context.c, c->u_iv.iv, outbuf, inbuf, nblocks,
|
||||
(c->flags & GCRY_CIPHER_CBC_MAC));
|
||||
inbuf += nblocks * blocksize;
|
||||
if (!(c->flags & GCRY_CIPHER_CBC_MAC))
|
||||
outbuf += nblocks * blocksize;
|
||||
}
|
||||
else
|
||||
{
|
||||
ivp = c->u_iv.iv;
|
||||
|
||||
for (n=0; n < nblocks; n++ )
|
||||
{
|
||||
buf_xor (outbuf, inbuf, ivp, blocksize);
|
||||
nburn = enc_fn ( &c->context.c, outbuf, outbuf );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
ivp = outbuf;
|
||||
inbuf += blocksize;
|
||||
if (!(c->flags & GCRY_CIPHER_CBC_MAC))
|
||||
outbuf += blocksize;
|
||||
}
|
||||
|
||||
if (ivp != c->u_iv.iv)
|
||||
buf_cpy (c->u_iv.iv, ivp, blocksize );
|
||||
}
|
||||
|
||||
if ((c->flags & GCRY_CIPHER_CBC_CTS) && inbuflen > blocksize)
|
||||
{
|
||||
/* We have to be careful here, since outbuf might be equal to
|
||||
inbuf. */
|
||||
size_t restbytes;
|
||||
unsigned char b;
|
||||
|
||||
if ((inbuflen % blocksize) == 0)
|
||||
restbytes = blocksize;
|
||||
else
|
||||
restbytes = inbuflen % blocksize;
|
||||
|
||||
outbuf -= blocksize;
|
||||
for (ivp = c->u_iv.iv, i = 0; i < restbytes; i++)
|
||||
{
|
||||
b = inbuf[i];
|
||||
outbuf[blocksize + i] = outbuf[i];
|
||||
outbuf[i] = b ^ *ivp++;
|
||||
}
|
||||
for (; i < blocksize; i++)
|
||||
outbuf[i] = 0 ^ *ivp++;
|
||||
|
||||
nburn = enc_fn (&c->context.c, outbuf, outbuf);
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
buf_cpy (c->u_iv.iv, outbuf, blocksize);
|
||||
}
|
||||
|
||||
if (burn > 0)
|
||||
_gcry_burn_stack (burn + 4 * sizeof(void *));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_cbc_decrypt (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen)
|
||||
{
|
||||
size_t n;
|
||||
int i;
|
||||
size_t blocksize = c->spec->blocksize;
|
||||
gcry_cipher_decrypt_t dec_fn = c->spec->decrypt;
|
||||
size_t nblocks = inbuflen / blocksize;
|
||||
unsigned int burn, nburn;
|
||||
|
||||
if (outbuflen < inbuflen)
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
|
||||
if ((inbuflen % blocksize)
|
||||
&& !(inbuflen > blocksize
|
||||
&& (c->flags & GCRY_CIPHER_CBC_CTS)))
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
|
||||
burn = 0;
|
||||
|
||||
if ((c->flags & GCRY_CIPHER_CBC_CTS) && inbuflen > blocksize)
|
||||
{
|
||||
nblocks--;
|
||||
if ((inbuflen % blocksize) == 0)
|
||||
nblocks--;
|
||||
buf_cpy (c->lastiv, c->u_iv.iv, blocksize);
|
||||
}
|
||||
|
||||
if (c->bulk.cbc_dec)
|
||||
{
|
||||
c->bulk.cbc_dec (&c->context.c, c->u_iv.iv, outbuf, inbuf, nblocks);
|
||||
inbuf += nblocks * blocksize;
|
||||
outbuf += nblocks * blocksize;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (n=0; n < nblocks; n++ )
|
||||
{
|
||||
/* Because outbuf and inbuf might be the same, we must not overwrite
|
||||
the original ciphertext block. We use LASTIV as intermediate
|
||||
storage here because it is not used otherwise. */
|
||||
nburn = dec_fn ( &c->context.c, c->lastiv, inbuf );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
buf_xor_n_copy_2(outbuf, c->lastiv, c->u_iv.iv, inbuf, blocksize);
|
||||
inbuf += blocksize;
|
||||
outbuf += blocksize;
|
||||
}
|
||||
}
|
||||
|
||||
if ((c->flags & GCRY_CIPHER_CBC_CTS) && inbuflen > blocksize)
|
||||
{
|
||||
size_t restbytes;
|
||||
|
||||
if ((inbuflen % blocksize) == 0)
|
||||
restbytes = blocksize;
|
||||
else
|
||||
restbytes = inbuflen % blocksize;
|
||||
|
||||
buf_cpy (c->lastiv, c->u_iv.iv, blocksize ); /* Save Cn-2. */
|
||||
buf_cpy (c->u_iv.iv, inbuf + blocksize, restbytes ); /* Save Cn. */
|
||||
|
||||
nburn = dec_fn ( &c->context.c, outbuf, inbuf );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
buf_xor(outbuf, outbuf, c->u_iv.iv, restbytes);
|
||||
|
||||
buf_cpy (outbuf + blocksize, outbuf, restbytes);
|
||||
for(i=restbytes; i < blocksize; i++)
|
||||
c->u_iv.iv[i] = outbuf[i];
|
||||
nburn = dec_fn (&c->context.c, outbuf, c->u_iv.iv);
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
buf_xor(outbuf, outbuf, c->lastiv, blocksize);
|
||||
/* c->lastiv is now really lastlastiv, does this matter? */
|
||||
}
|
||||
|
||||
if (burn > 0)
|
||||
_gcry_burn_stack (burn + 4 * sizeof(void *));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,442 @@
|
||||
/* cipher-ccm.c - CTR mode with CBC-MAC mode implementation
|
||||
* Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
#include "ath.h"
|
||||
#include "bufhelp.h"
|
||||
#include "./cipher-internal.h"
|
||||
|
||||
/* We need a 64 bit type for this code. */
|
||||
#ifdef HAVE_U64_TYPEDEF
|
||||
|
||||
|
||||
#define set_burn(burn, nburn) do { \
|
||||
unsigned int __nburn = (nburn); \
|
||||
(burn) = (burn) > __nburn ? (burn) : __nburn; } while (0)
|
||||
|
||||
|
||||
static unsigned int
|
||||
do_cbc_mac (gcry_cipher_hd_t c, const unsigned char *inbuf, size_t inlen,
|
||||
int do_padding)
|
||||
{
|
||||
const unsigned int blocksize = 16;
|
||||
gcry_cipher_encrypt_t enc_fn = c->spec->encrypt;
|
||||
unsigned char tmp[blocksize];
|
||||
unsigned int burn = 0;
|
||||
unsigned int unused = c->u_mode.ccm.mac_unused;
|
||||
size_t nblocks;
|
||||
|
||||
if (inlen == 0 && (unused == 0 || !do_padding))
|
||||
return 0;
|
||||
|
||||
do
|
||||
{
|
||||
if (inlen + unused < blocksize || unused > 0)
|
||||
{
|
||||
for (; inlen && unused < blocksize; inlen--)
|
||||
c->u_mode.ccm.macbuf[unused++] = *inbuf++;
|
||||
}
|
||||
if (!inlen)
|
||||
{
|
||||
if (!do_padding)
|
||||
break;
|
||||
|
||||
while (unused < blocksize)
|
||||
c->u_mode.ccm.macbuf[unused++] = 0;
|
||||
}
|
||||
|
||||
if (unused > 0)
|
||||
{
|
||||
/* Process one block from macbuf. */
|
||||
buf_xor(c->u_iv.iv, c->u_iv.iv, c->u_mode.ccm.macbuf, blocksize);
|
||||
set_burn (burn, enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv ));
|
||||
|
||||
unused = 0;
|
||||
}
|
||||
|
||||
if (c->bulk.cbc_enc)
|
||||
{
|
||||
nblocks = inlen / blocksize;
|
||||
c->bulk.cbc_enc (&c->context.c, c->u_iv.iv, tmp, inbuf, nblocks, 1);
|
||||
inbuf += nblocks * blocksize;
|
||||
inlen -= nblocks * blocksize;
|
||||
|
||||
wipememory (tmp, sizeof(tmp));
|
||||
}
|
||||
else
|
||||
{
|
||||
while (inlen >= blocksize)
|
||||
{
|
||||
buf_xor(c->u_iv.iv, c->u_iv.iv, inbuf, blocksize);
|
||||
|
||||
set_burn (burn, enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv ));
|
||||
|
||||
inlen -= blocksize;
|
||||
inbuf += blocksize;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (inlen > 0);
|
||||
|
||||
c->u_mode.ccm.mac_unused = unused;
|
||||
|
||||
if (burn)
|
||||
burn += 4 * sizeof(void *);
|
||||
|
||||
return burn;
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_set_nonce (gcry_cipher_hd_t c, const unsigned char *nonce,
|
||||
size_t noncelen)
|
||||
{
|
||||
size_t L = 15 - noncelen;
|
||||
size_t L_;
|
||||
|
||||
L_ = L - 1;
|
||||
|
||||
if (!nonce)
|
||||
return GPG_ERR_INV_ARG;
|
||||
/* Length field must be 2, 3, ..., or 8. */
|
||||
if (L < 2 || L > 8)
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
|
||||
/* Reset state */
|
||||
memset (&c->u_mode, 0, sizeof(c->u_mode));
|
||||
memset (&c->marks, 0, sizeof(c->marks));
|
||||
memset (&c->u_iv, 0, sizeof(c->u_iv));
|
||||
memset (&c->u_ctr, 0, sizeof(c->u_ctr));
|
||||
memset (c->lastiv, 0, sizeof(c->lastiv));
|
||||
c->unused = 0;
|
||||
|
||||
/* Setup CTR */
|
||||
c->u_ctr.ctr[0] = L_;
|
||||
memcpy (&c->u_ctr.ctr[1], nonce, noncelen);
|
||||
memset (&c->u_ctr.ctr[1 + noncelen], 0, L);
|
||||
|
||||
/* Setup IV */
|
||||
c->u_iv.iv[0] = L_;
|
||||
memcpy (&c->u_iv.iv[1], nonce, noncelen);
|
||||
/* Add (8 * M_ + 64 * flags) to iv[0] and set iv[noncelen + 1 ... 15] later
|
||||
in set_aad. */
|
||||
memset (&c->u_iv.iv[1 + noncelen], 0, L);
|
||||
|
||||
c->u_mode.ccm.nonce = 1;
|
||||
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_set_lengths (gcry_cipher_hd_t c, u64 encryptlen, u64 aadlen,
|
||||
u64 taglen)
|
||||
{
|
||||
unsigned int burn = 0;
|
||||
unsigned char b0[16];
|
||||
size_t noncelen = 15 - (c->u_iv.iv[0] + 1);
|
||||
u64 M = taglen;
|
||||
u64 M_;
|
||||
int i;
|
||||
|
||||
M_ = (M - 2) / 2;
|
||||
|
||||
/* Authentication field must be 4, 6, 8, 10, 12, 14 or 16. */
|
||||
if ((M_ * 2 + 2) != M || M < 4 || M > 16)
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
if (!c->u_mode.ccm.nonce || c->marks.tag)
|
||||
return GPG_ERR_INV_STATE;
|
||||
if (c->u_mode.ccm.lengths)
|
||||
return GPG_ERR_INV_STATE;
|
||||
|
||||
c->u_mode.ccm.authlen = taglen;
|
||||
c->u_mode.ccm.encryptlen = encryptlen;
|
||||
c->u_mode.ccm.aadlen = aadlen;
|
||||
|
||||
/* Complete IV setup. */
|
||||
c->u_iv.iv[0] += (aadlen > 0) * 64 + M_ * 8;
|
||||
for (i = 16 - 1; i >= 1 + noncelen; i--)
|
||||
{
|
||||
c->u_iv.iv[i] = encryptlen & 0xff;
|
||||
encryptlen >>= 8;
|
||||
}
|
||||
|
||||
memcpy (b0, c->u_iv.iv, 16);
|
||||
memset (c->u_iv.iv, 0, 16);
|
||||
|
||||
set_burn (burn, do_cbc_mac (c, b0, 16, 0));
|
||||
|
||||
if (aadlen == 0)
|
||||
{
|
||||
/* Do nothing. */
|
||||
}
|
||||
else if (aadlen > 0 && aadlen <= (unsigned int)0xfeff)
|
||||
{
|
||||
b0[0] = (aadlen >> 8) & 0xff;
|
||||
b0[1] = aadlen & 0xff;
|
||||
set_burn (burn, do_cbc_mac (c, b0, 2, 0));
|
||||
}
|
||||
else if (aadlen > 0xfeff && aadlen <= (unsigned int)0xffffffff)
|
||||
{
|
||||
b0[0] = 0xff;
|
||||
b0[1] = 0xfe;
|
||||
buf_put_be32(&b0[2], aadlen);
|
||||
set_burn (burn, do_cbc_mac (c, b0, 6, 0));
|
||||
}
|
||||
else if (aadlen > (unsigned int)0xffffffff)
|
||||
{
|
||||
b0[0] = 0xff;
|
||||
b0[1] = 0xff;
|
||||
buf_put_be64(&b0[2], aadlen);
|
||||
set_burn (burn, do_cbc_mac (c, b0, 10, 0));
|
||||
}
|
||||
|
||||
/* Generate S_0 and increase counter. */
|
||||
set_burn (burn, c->spec->encrypt ( &c->context.c, c->u_mode.ccm.s0,
|
||||
c->u_ctr.ctr ));
|
||||
c->u_ctr.ctr[15]++;
|
||||
|
||||
if (burn)
|
||||
_gcry_burn_stack (burn + sizeof(void *) * 5);
|
||||
|
||||
c->u_mode.ccm.lengths = 1;
|
||||
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_authenticate (gcry_cipher_hd_t c, const unsigned char *abuf,
|
||||
size_t abuflen)
|
||||
{
|
||||
unsigned int burn;
|
||||
|
||||
if (abuflen > 0 && !abuf)
|
||||
return GPG_ERR_INV_ARG;
|
||||
if (!c->u_mode.ccm.nonce || !c->u_mode.ccm.lengths || c->marks.tag)
|
||||
return GPG_ERR_INV_STATE;
|
||||
if (abuflen > c->u_mode.ccm.aadlen)
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
|
||||
c->u_mode.ccm.aadlen -= abuflen;
|
||||
burn = do_cbc_mac (c, abuf, abuflen, c->u_mode.ccm.aadlen == 0);
|
||||
|
||||
if (burn)
|
||||
_gcry_burn_stack (burn + sizeof(void *) * 5);
|
||||
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_tag (gcry_cipher_hd_t c, unsigned char *outbuf,
|
||||
size_t outbuflen, int check)
|
||||
{
|
||||
unsigned int burn;
|
||||
|
||||
if (!outbuf || outbuflen == 0)
|
||||
return GPG_ERR_INV_ARG;
|
||||
/* Tag length must be same as initial authlen. */
|
||||
if (c->u_mode.ccm.authlen != outbuflen)
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
if (!c->u_mode.ccm.nonce || !c->u_mode.ccm.lengths || c->u_mode.ccm.aadlen > 0)
|
||||
return GPG_ERR_INV_STATE;
|
||||
/* Initial encrypt length must match with length of actual data processed. */
|
||||
if (c->u_mode.ccm.encryptlen > 0)
|
||||
return GPG_ERR_UNFINISHED;
|
||||
|
||||
if (!c->marks.tag)
|
||||
{
|
||||
burn = do_cbc_mac (c, NULL, 0, 1); /* Perform final padding. */
|
||||
|
||||
/* Add S_0 */
|
||||
buf_xor (c->u_iv.iv, c->u_iv.iv, c->u_mode.ccm.s0, 16);
|
||||
|
||||
wipememory (c->u_ctr.ctr, 16);
|
||||
wipememory (c->u_mode.ccm.s0, 16);
|
||||
wipememory (c->u_mode.ccm.macbuf, 16);
|
||||
|
||||
if (burn)
|
||||
_gcry_burn_stack (burn + sizeof(void *) * 5);
|
||||
|
||||
c->marks.tag = 1;
|
||||
}
|
||||
|
||||
if (!check)
|
||||
{
|
||||
memcpy (outbuf, c->u_iv.iv, outbuflen);
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
return buf_eq_const(outbuf, c->u_iv.iv, outbuflen) ?
|
||||
GPG_ERR_NO_ERROR : GPG_ERR_CHECKSUM;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_get_tag (gcry_cipher_hd_t c, unsigned char *outtag,
|
||||
size_t taglen)
|
||||
{
|
||||
return _gcry_cipher_ccm_tag (c, outtag, taglen, 0);
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_check_tag (gcry_cipher_hd_t c, const unsigned char *intag,
|
||||
size_t taglen)
|
||||
{
|
||||
return _gcry_cipher_ccm_tag (c, (unsigned char *)intag, taglen, 1);
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_encrypt (gcry_cipher_hd_t c, unsigned char *outbuf,
|
||||
size_t outbuflen, const unsigned char *inbuf,
|
||||
size_t inbuflen)
|
||||
{
|
||||
unsigned int burn;
|
||||
|
||||
if (outbuflen < inbuflen)
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
if (!c->u_mode.ccm.nonce || c->marks.tag || !c->u_mode.ccm.lengths ||
|
||||
c->u_mode.ccm.aadlen > 0)
|
||||
return GPG_ERR_INV_STATE;
|
||||
if (inbuflen > c->u_mode.ccm.encryptlen)
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
|
||||
c->u_mode.ccm.encryptlen -= inbuflen;
|
||||
burn = do_cbc_mac (c, inbuf, inbuflen, 0);
|
||||
if (burn)
|
||||
_gcry_burn_stack (burn + sizeof(void *) * 5);
|
||||
|
||||
return _gcry_cipher_ctr_encrypt (c, outbuf, outbuflen, inbuf, inbuflen);
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_decrypt (gcry_cipher_hd_t c, unsigned char *outbuf,
|
||||
size_t outbuflen, const unsigned char *inbuf,
|
||||
size_t inbuflen)
|
||||
{
|
||||
gcry_err_code_t err;
|
||||
unsigned int burn;
|
||||
|
||||
if (outbuflen < inbuflen)
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
if (!c->u_mode.ccm.nonce || c->marks.tag || !c->u_mode.ccm.lengths ||
|
||||
c->u_mode.ccm.aadlen > 0)
|
||||
return GPG_ERR_INV_STATE;
|
||||
if (inbuflen > c->u_mode.ccm.encryptlen)
|
||||
return GPG_ERR_INV_LENGTH;
|
||||
|
||||
err = _gcry_cipher_ctr_encrypt (c, outbuf, outbuflen, inbuf, inbuflen);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
c->u_mode.ccm.encryptlen -= inbuflen;
|
||||
burn = do_cbc_mac (c, outbuf, inbuflen, 0);
|
||||
if (burn)
|
||||
_gcry_burn_stack (burn + sizeof(void *) * 5);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Provide dummy functions so that we avoid adding too much #ifdefs in
|
||||
* cipher.c.
|
||||
*/
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_encrypt(gcry_cipher_hd_t c, unsigned char *outbuf,
|
||||
size_t outbuflen, const unsigned char *inbuf,
|
||||
size_t inbuflen)
|
||||
{
|
||||
(void)c;
|
||||
(void)outbuf;
|
||||
(void)outbuflen;
|
||||
(void)inbuf;
|
||||
(void)inbuflen;
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_decrypt(gcry_cipher_hd_t c, unsigned char *outbuf,
|
||||
size_t outbuflen, const unsigned char *inbuf,
|
||||
size_t inbuflen)
|
||||
{
|
||||
(void)c;
|
||||
(void)outbuf;
|
||||
(void)outbuflen;
|
||||
(void)inbuf;
|
||||
(void)inbuflen;
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_set_nonce(gcry_cipher_hd_t c, const unsigned char *nonce,
|
||||
size_t noncelen)
|
||||
{
|
||||
(void)c;
|
||||
(void)nonce;
|
||||
(void)noncelen;
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_authenticate(gcry_cipher_hd_t c, const unsigned char *abuf,
|
||||
size_t abuflen)
|
||||
{
|
||||
(void)c;
|
||||
(void)abuf;
|
||||
(void)abuflen;
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_get_tag(gcry_cipher_hd_t c, unsigned char *outtag,
|
||||
size_t taglen)
|
||||
{
|
||||
(void)c;
|
||||
(void)outtag;
|
||||
(void)taglen;
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ccm_check_tag(gcry_cipher_hd_t c, const unsigned char *intag,
|
||||
size_t taglen)
|
||||
{
|
||||
(void)c;
|
||||
(void)intag;
|
||||
(void)taglen;
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
#endif /*HAVE_U64_TYPEDEF*/
|
||||
@@ -0,0 +1,226 @@
|
||||
/* cipher-cfb.c - Generic CFB mode implementation
|
||||
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
|
||||
* 2005, 2007, 2008, 2009, 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
#include "ath.h"
|
||||
#include "bufhelp.h"
|
||||
#include "./cipher-internal.h"
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_cfb_encrypt (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen)
|
||||
{
|
||||
unsigned char *ivp;
|
||||
gcry_cipher_encrypt_t enc_fn = c->spec->encrypt;
|
||||
size_t blocksize = c->spec->blocksize;
|
||||
size_t blocksize_x_2 = blocksize + blocksize;
|
||||
unsigned int burn, nburn;
|
||||
|
||||
if (outbuflen < inbuflen)
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
|
||||
if ( inbuflen <= c->unused )
|
||||
{
|
||||
/* Short enough to be encoded by the remaining XOR mask. */
|
||||
/* XOR the input with the IV and store input into IV. */
|
||||
ivp = c->u_iv.iv + blocksize - c->unused;
|
||||
buf_xor_2dst(outbuf, ivp, inbuf, inbuflen);
|
||||
c->unused -= inbuflen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
burn = 0;
|
||||
|
||||
if ( c->unused )
|
||||
{
|
||||
/* XOR the input with the IV and store input into IV */
|
||||
inbuflen -= c->unused;
|
||||
ivp = c->u_iv.iv + blocksize - c->unused;
|
||||
buf_xor_2dst(outbuf, ivp, inbuf, c->unused);
|
||||
outbuf += c->unused;
|
||||
inbuf += c->unused;
|
||||
c->unused = 0;
|
||||
}
|
||||
|
||||
/* Now we can process complete blocks. We use a loop as long as we
|
||||
have at least 2 blocks and use conditions for the rest. This
|
||||
also allows to use a bulk encryption function if available. */
|
||||
if (inbuflen >= blocksize_x_2 && c->bulk.cfb_enc)
|
||||
{
|
||||
size_t nblocks = inbuflen / blocksize;
|
||||
c->bulk.cfb_enc (&c->context.c, c->u_iv.iv, outbuf, inbuf, nblocks);
|
||||
outbuf += nblocks * blocksize;
|
||||
inbuf += nblocks * blocksize;
|
||||
inbuflen -= nblocks * blocksize;
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( inbuflen >= blocksize_x_2 )
|
||||
{
|
||||
/* Encrypt the IV. */
|
||||
nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
/* XOR the input with the IV and store input into IV. */
|
||||
buf_xor_2dst(outbuf, c->u_iv.iv, inbuf, blocksize);
|
||||
outbuf += blocksize;
|
||||
inbuf += blocksize;
|
||||
inbuflen -= blocksize;
|
||||
}
|
||||
}
|
||||
|
||||
if ( inbuflen >= blocksize )
|
||||
{
|
||||
/* Save the current IV and then encrypt the IV. */
|
||||
buf_cpy( c->lastiv, c->u_iv.iv, blocksize );
|
||||
nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
/* XOR the input with the IV and store input into IV */
|
||||
buf_xor_2dst(outbuf, c->u_iv.iv, inbuf, blocksize);
|
||||
outbuf += blocksize;
|
||||
inbuf += blocksize;
|
||||
inbuflen -= blocksize;
|
||||
}
|
||||
if ( inbuflen )
|
||||
{
|
||||
/* Save the current IV and then encrypt the IV. */
|
||||
buf_cpy( c->lastiv, c->u_iv.iv, blocksize );
|
||||
nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
c->unused = blocksize;
|
||||
/* Apply the XOR. */
|
||||
c->unused -= inbuflen;
|
||||
buf_xor_2dst(outbuf, c->u_iv.iv, inbuf, inbuflen);
|
||||
outbuf += inbuflen;
|
||||
inbuf += inbuflen;
|
||||
inbuflen = 0;
|
||||
}
|
||||
|
||||
if (burn > 0)
|
||||
_gcry_burn_stack (burn + 4 * sizeof(void *));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_cfb_decrypt (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen)
|
||||
{
|
||||
unsigned char *ivp;
|
||||
gcry_cipher_encrypt_t enc_fn = c->spec->encrypt;
|
||||
size_t blocksize = c->spec->blocksize;
|
||||
size_t blocksize_x_2 = blocksize + blocksize;
|
||||
unsigned int burn, nburn;
|
||||
|
||||
if (outbuflen < inbuflen)
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
|
||||
if (inbuflen <= c->unused)
|
||||
{
|
||||
/* Short enough to be encoded by the remaining XOR mask. */
|
||||
/* XOR the input with the IV and store input into IV. */
|
||||
ivp = c->u_iv.iv + blocksize - c->unused;
|
||||
buf_xor_n_copy(outbuf, ivp, inbuf, inbuflen);
|
||||
c->unused -= inbuflen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
burn = 0;
|
||||
|
||||
if (c->unused)
|
||||
{
|
||||
/* XOR the input with the IV and store input into IV. */
|
||||
inbuflen -= c->unused;
|
||||
ivp = c->u_iv.iv + blocksize - c->unused;
|
||||
buf_xor_n_copy(outbuf, ivp, inbuf, c->unused);
|
||||
outbuf += c->unused;
|
||||
inbuf += c->unused;
|
||||
c->unused = 0;
|
||||
}
|
||||
|
||||
/* Now we can process complete blocks. We use a loop as long as we
|
||||
have at least 2 blocks and use conditions for the rest. This
|
||||
also allows to use a bulk encryption function if available. */
|
||||
if (inbuflen >= blocksize_x_2 && c->bulk.cfb_dec)
|
||||
{
|
||||
size_t nblocks = inbuflen / blocksize;
|
||||
c->bulk.cfb_dec (&c->context.c, c->u_iv.iv, outbuf, inbuf, nblocks);
|
||||
outbuf += nblocks * blocksize;
|
||||
inbuf += nblocks * blocksize;
|
||||
inbuflen -= nblocks * blocksize;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (inbuflen >= blocksize_x_2 )
|
||||
{
|
||||
/* Encrypt the IV. */
|
||||
nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
/* XOR the input with the IV and store input into IV. */
|
||||
buf_xor_n_copy(outbuf, c->u_iv.iv, inbuf, blocksize);
|
||||
outbuf += blocksize;
|
||||
inbuf += blocksize;
|
||||
inbuflen -= blocksize;
|
||||
}
|
||||
}
|
||||
|
||||
if (inbuflen >= blocksize )
|
||||
{
|
||||
/* Save the current IV and then encrypt the IV. */
|
||||
buf_cpy ( c->lastiv, c->u_iv.iv, blocksize);
|
||||
nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
/* XOR the input with the IV and store input into IV */
|
||||
buf_xor_n_copy(outbuf, c->u_iv.iv, inbuf, blocksize);
|
||||
outbuf += blocksize;
|
||||
inbuf += blocksize;
|
||||
inbuflen -= blocksize;
|
||||
}
|
||||
|
||||
if (inbuflen)
|
||||
{
|
||||
/* Save the current IV and then encrypt the IV. */
|
||||
buf_cpy ( c->lastiv, c->u_iv.iv, blocksize );
|
||||
nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
c->unused = blocksize;
|
||||
/* Apply the XOR. */
|
||||
c->unused -= inbuflen;
|
||||
buf_xor_n_copy(outbuf, c->u_iv.iv, inbuf, inbuflen);
|
||||
outbuf += inbuflen;
|
||||
inbuf += inbuflen;
|
||||
inbuflen = 0;
|
||||
}
|
||||
|
||||
if (burn > 0)
|
||||
_gcry_burn_stack (burn + 4 * sizeof(void *));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,238 @@
|
||||
/* cmac.c - CMAC, Cipher-based MAC.
|
||||
* Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
#include "cipher-internal.h"
|
||||
#include "bufhelp.h"
|
||||
|
||||
|
||||
#define set_burn(burn, nburn) do { \
|
||||
unsigned int __nburn = (nburn); \
|
||||
(burn) = (burn) > __nburn ? (burn) : __nburn; } while (0)
|
||||
|
||||
|
||||
static void
|
||||
cmac_write (gcry_cipher_hd_t c, const byte * inbuf, size_t inlen)
|
||||
{
|
||||
gcry_cipher_encrypt_t enc_fn = c->spec->encrypt;
|
||||
const unsigned int blocksize = c->spec->blocksize;
|
||||
byte outbuf[MAX_BLOCKSIZE];
|
||||
unsigned int burn = 0;
|
||||
unsigned int nblocks;
|
||||
|
||||
if (!inlen || !inbuf)
|
||||
return;
|
||||
|
||||
/* Last block is needed for cmac_final. */
|
||||
if (c->unused + inlen <= blocksize)
|
||||
{
|
||||
for (; inlen && c->unused < blocksize; inlen--)
|
||||
c->lastiv[c->unused++] = *inbuf++;
|
||||
return;
|
||||
}
|
||||
|
||||
if (c->unused)
|
||||
{
|
||||
for (; inlen && c->unused < blocksize; inlen--)
|
||||
c->lastiv[c->unused++] = *inbuf++;
|
||||
|
||||
buf_xor (c->u_iv.iv, c->u_iv.iv, c->lastiv, blocksize);
|
||||
set_burn (burn, enc_fn (&c->context.c, c->u_iv.iv, c->u_iv.iv));
|
||||
|
||||
c->unused = 0;
|
||||
}
|
||||
|
||||
if (c->bulk.cbc_enc && inlen > blocksize)
|
||||
{
|
||||
nblocks = inlen / blocksize;
|
||||
nblocks -= (nblocks * blocksize == inlen);
|
||||
|
||||
c->bulk.cbc_enc (&c->context.c, c->u_iv.iv, outbuf, inbuf, nblocks, 1);
|
||||
inbuf += nblocks * blocksize;
|
||||
inlen -= nblocks * blocksize;
|
||||
|
||||
wipememory (outbuf, sizeof (outbuf));
|
||||
}
|
||||
else
|
||||
while (inlen > blocksize)
|
||||
{
|
||||
buf_xor (c->u_iv.iv, c->u_iv.iv, inbuf, blocksize);
|
||||
set_burn (burn, enc_fn (&c->context.c, c->u_iv.iv, c->u_iv.iv));
|
||||
inlen -= blocksize;
|
||||
inbuf += blocksize;
|
||||
}
|
||||
|
||||
/* Make sure that last block is passed to cmac_final. */
|
||||
if (inlen == 0)
|
||||
BUG ();
|
||||
|
||||
for (; inlen && c->unused < blocksize; inlen--)
|
||||
c->lastiv[c->unused++] = *inbuf++;
|
||||
|
||||
if (burn)
|
||||
_gcry_burn_stack (burn + 4 * sizeof (void *));
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cmac_generate_subkeys (gcry_cipher_hd_t c)
|
||||
{
|
||||
const unsigned int blocksize = c->spec->blocksize;
|
||||
byte rb, carry, t, bi;
|
||||
unsigned int burn;
|
||||
int i, j;
|
||||
union
|
||||
{
|
||||
size_t _aligned;
|
||||
byte buf[MAX_BLOCKSIZE];
|
||||
} u;
|
||||
|
||||
if (MAX_BLOCKSIZE < blocksize)
|
||||
BUG ();
|
||||
|
||||
/* encrypt zero block */
|
||||
memset (u.buf, 0, blocksize);
|
||||
burn = c->spec->encrypt (&c->context.c, u.buf, u.buf);
|
||||
|
||||
/* Currently supported blocksizes are 16 and 8. */
|
||||
rb = blocksize == 16 ? 0x87 : 0x1B /*blocksize == 8 */ ;
|
||||
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
/* Generate subkeys K1 and K2 */
|
||||
carry = 0;
|
||||
for (i = blocksize - 1; i >= 0; i--)
|
||||
{
|
||||
bi = u.buf[i];
|
||||
t = carry | (bi << 1);
|
||||
carry = bi >> 7;
|
||||
u.buf[i] = t & 0xff;
|
||||
c->u_mode.cmac.subkeys[j][i] = u.buf[i];
|
||||
}
|
||||
u.buf[blocksize - 1] ^= carry ? rb : 0;
|
||||
c->u_mode.cmac.subkeys[j][blocksize - 1] = u.buf[blocksize - 1];
|
||||
}
|
||||
|
||||
wipememory (&u, sizeof (u));
|
||||
if (burn)
|
||||
_gcry_burn_stack (burn + 4 * sizeof (void *));
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cmac_final (gcry_cipher_hd_t c)
|
||||
{
|
||||
const unsigned int blocksize = c->spec->blocksize;
|
||||
unsigned int count = c->unused;
|
||||
unsigned int burn;
|
||||
byte *subkey;
|
||||
|
||||
if (count == blocksize)
|
||||
subkey = c->u_mode.cmac.subkeys[0]; /* K1 */
|
||||
else
|
||||
{
|
||||
subkey = c->u_mode.cmac.subkeys[1]; /* K2 */
|
||||
c->lastiv[count++] = 0x80;
|
||||
while (count < blocksize)
|
||||
c->lastiv[count++] = 0;
|
||||
}
|
||||
|
||||
buf_xor (c->lastiv, c->lastiv, subkey, blocksize);
|
||||
|
||||
buf_xor (c->u_iv.iv, c->u_iv.iv, c->lastiv, blocksize);
|
||||
burn = c->spec->encrypt (&c->context.c, c->u_iv.iv, c->u_iv.iv);
|
||||
if (burn)
|
||||
_gcry_burn_stack (burn + 4 * sizeof (void *));
|
||||
|
||||
c->unused = 0;
|
||||
}
|
||||
|
||||
|
||||
static gcry_err_code_t
|
||||
cmac_tag (gcry_cipher_hd_t c, unsigned char *tag, size_t taglen, int check)
|
||||
{
|
||||
if (!tag || taglen == 0 || taglen > c->spec->blocksize)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
if (!c->u_mode.cmac.tag)
|
||||
{
|
||||
cmac_final (c);
|
||||
c->u_mode.cmac.tag = 1;
|
||||
}
|
||||
|
||||
if (!check)
|
||||
{
|
||||
memcpy (tag, c->u_iv.iv, taglen);
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
return buf_eq_const (tag, c->u_iv.iv, taglen) ?
|
||||
GPG_ERR_NO_ERROR : GPG_ERR_CHECKSUM;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_cmac_authenticate (gcry_cipher_hd_t c,
|
||||
const unsigned char *abuf, size_t abuflen)
|
||||
{
|
||||
if (abuflen > 0 && !abuf)
|
||||
return GPG_ERR_INV_ARG;
|
||||
if (c->u_mode.cmac.tag)
|
||||
return GPG_ERR_INV_STATE;
|
||||
/* To support new blocksize, update cmac_generate_subkeys() then add new
|
||||
blocksize here. */
|
||||
if (c->spec->blocksize != 16 && c->spec->blocksize != 8)
|
||||
return GPG_ERR_INV_CIPHER_MODE;
|
||||
|
||||
cmac_write (c, abuf, abuflen);
|
||||
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_cmac_get_tag (gcry_cipher_hd_t c,
|
||||
unsigned char *outtag, size_t taglen)
|
||||
{
|
||||
return cmac_tag (c, outtag, taglen, 0);
|
||||
}
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_cmac_check_tag (gcry_cipher_hd_t c,
|
||||
const unsigned char *intag, size_t taglen)
|
||||
{
|
||||
return cmac_tag (c, (unsigned char *) intag, taglen, 1);
|
||||
}
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_cmac_set_subkeys (gcry_cipher_hd_t c)
|
||||
{
|
||||
cmac_generate_subkeys (c);
|
||||
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
/* cipher-ctr.c - Generic CTR mode implementation
|
||||
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
|
||||
* 2005, 2007, 2008, 2009, 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
#include "ath.h"
|
||||
#include "bufhelp.h"
|
||||
#include "./cipher-internal.h"
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ctr_encrypt (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen)
|
||||
{
|
||||
size_t n;
|
||||
int i;
|
||||
gcry_cipher_encrypt_t enc_fn = c->spec->encrypt;
|
||||
unsigned int blocksize = c->spec->blocksize;
|
||||
size_t nblocks;
|
||||
unsigned int burn, nburn;
|
||||
|
||||
if (outbuflen < inbuflen)
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
|
||||
burn = 0;
|
||||
|
||||
/* First process a left over encrypted counter. */
|
||||
if (c->unused)
|
||||
{
|
||||
gcry_assert (c->unused < blocksize);
|
||||
i = blocksize - c->unused;
|
||||
n = c->unused > inbuflen ? inbuflen : c->unused;
|
||||
buf_xor(outbuf, inbuf, &c->lastiv[i], n);
|
||||
c->unused -= n;
|
||||
inbuf += n;
|
||||
outbuf += n;
|
||||
inbuflen -= n;
|
||||
}
|
||||
|
||||
/* Use a bulk method if available. */
|
||||
nblocks = inbuflen / blocksize;
|
||||
if (nblocks && c->bulk.ctr_enc)
|
||||
{
|
||||
c->bulk.ctr_enc (&c->context.c, c->u_ctr.ctr, outbuf, inbuf, nblocks);
|
||||
inbuf += nblocks * blocksize;
|
||||
outbuf += nblocks * blocksize;
|
||||
inbuflen -= nblocks * blocksize;
|
||||
}
|
||||
|
||||
/* If we don't have a bulk method use the standard method. We also
|
||||
use this method for the a remaining partial block. */
|
||||
if (inbuflen)
|
||||
{
|
||||
unsigned char tmp[MAX_BLOCKSIZE];
|
||||
|
||||
do {
|
||||
nburn = enc_fn (&c->context.c, tmp, c->u_ctr.ctr);
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
|
||||
for (i = blocksize; i > 0; i--)
|
||||
{
|
||||
c->u_ctr.ctr[i-1]++;
|
||||
if (c->u_ctr.ctr[i-1] != 0)
|
||||
break;
|
||||
}
|
||||
|
||||
n = blocksize < inbuflen ? blocksize : inbuflen;
|
||||
buf_xor(outbuf, inbuf, tmp, n);
|
||||
|
||||
inbuflen -= n;
|
||||
outbuf += n;
|
||||
inbuf += n;
|
||||
} while (inbuflen);
|
||||
|
||||
/* Save the unused bytes of the counter. */
|
||||
c->unused = blocksize - n;
|
||||
if (c->unused)
|
||||
buf_cpy (c->lastiv+n, tmp+n, c->unused);
|
||||
|
||||
wipememory (tmp, sizeof tmp);
|
||||
}
|
||||
|
||||
if (burn > 0)
|
||||
_gcry_burn_stack (burn + 4 * sizeof(void *));
|
||||
|
||||
return 0;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,322 @@
|
||||
/* cipher-internal.h - Internal defs for cipher.c
|
||||
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef G10_CIPHER_INTERNAL_H
|
||||
#define G10_CIPHER_INTERNAL_H
|
||||
|
||||
/* The maximum supported size of a block in bytes. */
|
||||
#define MAX_BLOCKSIZE 16
|
||||
|
||||
/* Magic values for the context structure. */
|
||||
#define CTX_MAGIC_NORMAL 0x24091964
|
||||
#define CTX_MAGIC_SECURE 0x46919042
|
||||
|
||||
/* Try to use 16 byte aligned cipher context for better performance.
|
||||
We use the aligned attribute, thus it is only possible to implement
|
||||
this with gcc. */
|
||||
#undef NEED_16BYTE_ALIGNED_CONTEXT
|
||||
#ifdef HAVE_GCC_ATTRIBUTE_ALIGNED
|
||||
# define NEED_16BYTE_ALIGNED_CONTEXT 1
|
||||
#endif
|
||||
|
||||
/* Undef this symbol to trade GCM speed for 256 bytes of memory per context */
|
||||
#define GCM_USE_TABLES 1
|
||||
|
||||
|
||||
/* GCM_USE_INTEL_PCLMUL inidicates whether to compile GCM with Intel PCLMUL
|
||||
code. */
|
||||
#undef GCM_USE_INTEL_PCLMUL
|
||||
#if defined(ENABLE_PCLMUL_SUPPORT) && defined(GCM_USE_TABLES)
|
||||
# if ((defined(__i386__) && SIZEOF_UNSIGNED_LONG == 4) || defined(__x86_64__))
|
||||
# if __GNUC__ >= 4
|
||||
# define GCM_USE_INTEL_PCLMUL 1
|
||||
# endif
|
||||
# endif
|
||||
#endif /* GCM_USE_INTEL_PCLMUL */
|
||||
|
||||
|
||||
/* A VIA processor with the Padlock engine as well as the Intel AES_NI
|
||||
instructions require an alignment of most data on a 16 byte
|
||||
boundary. Because we trick out the compiler while allocating the
|
||||
context, the align attribute as used in rijndael.c does not work on
|
||||
its own. Thus we need to make sure that the entire context
|
||||
structure is a aligned on that boundary. We achieve this by
|
||||
defining a new type and use that instead of our usual alignment
|
||||
type. */
|
||||
typedef union
|
||||
{
|
||||
PROPERLY_ALIGNED_TYPE foo;
|
||||
#ifdef NEED_16BYTE_ALIGNED_CONTEXT
|
||||
char bar[16] __attribute__ ((aligned (16)));
|
||||
#endif
|
||||
char c[1];
|
||||
} cipher_context_alignment_t;
|
||||
|
||||
|
||||
/* The handle structure. */
|
||||
struct gcry_cipher_handle
|
||||
{
|
||||
int magic;
|
||||
size_t actual_handle_size; /* Allocated size of this handle. */
|
||||
size_t handle_offset; /* Offset to the malloced block. */
|
||||
gcry_cipher_spec_t *spec;
|
||||
|
||||
/* The algorithm id. This is a hack required because the module
|
||||
interface does not easily allow to retrieve this value. */
|
||||
int algo;
|
||||
|
||||
/* A structure with function pointers for bulk operations. Due to
|
||||
limitations of the module system (we don't want to change the
|
||||
API) we need to keep these function pointers here. The cipher
|
||||
open function intializes them and the actual encryption routines
|
||||
use them if they are not NULL. */
|
||||
struct {
|
||||
void (*cfb_enc)(void *context, unsigned char *iv,
|
||||
void *outbuf_arg, const void *inbuf_arg,
|
||||
size_t nblocks);
|
||||
void (*cfb_dec)(void *context, unsigned char *iv,
|
||||
void *outbuf_arg, const void *inbuf_arg,
|
||||
size_t nblocks);
|
||||
void (*cbc_enc)(void *context, unsigned char *iv,
|
||||
void *outbuf_arg, const void *inbuf_arg,
|
||||
size_t nblocks, int cbc_mac);
|
||||
void (*cbc_dec)(void *context, unsigned char *iv,
|
||||
void *outbuf_arg, const void *inbuf_arg,
|
||||
size_t nblocks);
|
||||
void (*ctr_enc)(void *context, unsigned char *iv,
|
||||
void *outbuf_arg, const void *inbuf_arg,
|
||||
size_t nblocks);
|
||||
} bulk;
|
||||
|
||||
|
||||
int mode;
|
||||
unsigned int flags;
|
||||
|
||||
struct {
|
||||
unsigned int key:1; /* Set to 1 if a key has been set. */
|
||||
unsigned int iv:1; /* Set to 1 if a IV has been set. */
|
||||
unsigned int tag:1; /* Set to 1 if a tag is finalized. */
|
||||
} marks;
|
||||
|
||||
/* The initialization vector. For best performance we make sure
|
||||
that it is properly aligned. In particular some implementations
|
||||
of bulk operations expect an 16 byte aligned IV. IV is also used
|
||||
to store CBC-MAC in CCM mode; counter IV is stored in U_CTR. */
|
||||
union {
|
||||
cipher_context_alignment_t iv_align;
|
||||
unsigned char iv[MAX_BLOCKSIZE];
|
||||
} u_iv;
|
||||
|
||||
/* The counter for CTR mode. This field is also used by AESWRAP and
|
||||
thus we can't use the U_IV union. */
|
||||
union {
|
||||
cipher_context_alignment_t iv_align;
|
||||
unsigned char ctr[MAX_BLOCKSIZE];
|
||||
} u_ctr;
|
||||
|
||||
/* Space to save an IV or CTR for chaining operations. */
|
||||
unsigned char lastiv[MAX_BLOCKSIZE];
|
||||
int unused; /* Number of unused bytes in LASTIV. */
|
||||
|
||||
union {
|
||||
#ifdef HAVE_U64_TYPEDEF
|
||||
/* Mode specific storage for CCM mode. */
|
||||
struct {
|
||||
u64 encryptlen;
|
||||
u64 aadlen;
|
||||
unsigned int authlen;
|
||||
|
||||
/* Space to save partial input lengths for MAC. */
|
||||
unsigned char macbuf[GCRY_CCM_BLOCK_LEN];
|
||||
int mac_unused; /* Number of unprocessed bytes in MACBUF. */
|
||||
|
||||
unsigned char s0[GCRY_CCM_BLOCK_LEN];
|
||||
|
||||
unsigned int nonce:1;/* Set to 1 if nonce has been set. */
|
||||
unsigned int lengths:1; /* Set to 1 if CCM length parameters has been
|
||||
processed. */
|
||||
} ccm;
|
||||
#endif
|
||||
|
||||
/* Mode specific storage for CMAC mode. */
|
||||
struct {
|
||||
unsigned int tag:1; /* Set to 1 if tag has been finalized. */
|
||||
|
||||
/* Subkeys for tag creation, not cleared by gcry_cipher_reset. */
|
||||
unsigned char subkeys[2][MAX_BLOCKSIZE];
|
||||
} cmac;
|
||||
|
||||
/* Mode specific storage for GCM mode. */
|
||||
struct {
|
||||
/* The interim tag for GCM mode. */
|
||||
union {
|
||||
cipher_context_alignment_t iv_align;
|
||||
unsigned char tag[MAX_BLOCKSIZE];
|
||||
} u_tag;
|
||||
|
||||
/* Space to save partial input lengths for MAC. */
|
||||
unsigned char macbuf[GCRY_CCM_BLOCK_LEN];
|
||||
int mac_unused; /* Number of unprocessed bytes in MACBUF. */
|
||||
|
||||
/* byte counters for GCM */
|
||||
u32 aadlen[2];
|
||||
u32 datalen[2];
|
||||
|
||||
/* encrypted tag counter */
|
||||
unsigned char tagiv[MAX_BLOCKSIZE];
|
||||
|
||||
unsigned int ghash_data_finalized:1;
|
||||
unsigned int ghash_aad_finalized:1;
|
||||
|
||||
unsigned int datalen_over_limits:1;
|
||||
unsigned int disallow_encryption_because_of_setiv_in_fips_mode:1;
|
||||
|
||||
/* --- Following members are not cleared in gcry_cipher_reset --- */
|
||||
|
||||
/* GHASH multiplier from key. */
|
||||
union {
|
||||
cipher_context_alignment_t iv_align;
|
||||
unsigned char key[MAX_BLOCKSIZE];
|
||||
} u_ghash_key;
|
||||
|
||||
#ifdef GCM_USE_INTEL_PCLMUL
|
||||
/* Use Intel PCLMUL instructions for accelerated GHASH. */
|
||||
unsigned int use_intel_pclmul:1;
|
||||
#endif
|
||||
|
||||
/* Pre-calculated table for GCM. */
|
||||
#ifdef GCM_USE_TABLES
|
||||
#if defined(HAVE_U64_TYPEDEF) && (SIZEOF_UNSIGNED_LONG == 8 \
|
||||
|| defined(__x86_64__))
|
||||
#define GCM_TABLES_USE_U64 1
|
||||
u64 gcm_table[2 * 16];
|
||||
#else
|
||||
#undef GCM_TABLES_USE_U64
|
||||
u32 gcm_table[4 * 16];
|
||||
#endif
|
||||
#endif
|
||||
} gcm;
|
||||
} u_mode;
|
||||
|
||||
/* What follows are two contexts of the cipher in use. The first
|
||||
one needs to be aligned well enough for the cipher operation
|
||||
whereas the second one is a copy created by cipher_setkey and
|
||||
used by cipher_reset. That second copy has no need for proper
|
||||
aligment because it is only accessed by memcpy. */
|
||||
cipher_context_alignment_t context;
|
||||
};
|
||||
|
||||
|
||||
/*-- cipher-cbc.c --*/
|
||||
gcry_err_code_t _gcry_cipher_cbc_encrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
gcry_err_code_t _gcry_cipher_cbc_decrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
|
||||
/*-- cipher-cfb.c --*/
|
||||
gcry_err_code_t _gcry_cipher_cfb_encrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
gcry_err_code_t _gcry_cipher_cfb_decrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
|
||||
|
||||
/*-- cipher-ofb.c --*/
|
||||
gcry_err_code_t _gcry_cipher_ofb_encrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
|
||||
/*-- cipher-ctr.c --*/
|
||||
gcry_err_code_t _gcry_cipher_ctr_encrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
|
||||
|
||||
/*-- cipher-aeswrap.c --*/
|
||||
gcry_err_code_t _gcry_cipher_aeswrap_encrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
byte *outbuf, size_t outbuflen,
|
||||
const byte *inbuf, size_t inbuflen);
|
||||
gcry_err_code_t _gcry_cipher_aeswrap_decrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
byte *outbuf, size_t outbuflen,
|
||||
const byte *inbuf, size_t inbuflen);
|
||||
|
||||
|
||||
/*-- cipher-ccm.c --*/
|
||||
gcry_err_code_t _gcry_cipher_ccm_encrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
gcry_err_code_t _gcry_cipher_ccm_decrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
gcry_err_code_t _gcry_cipher_ccm_set_nonce
|
||||
/* */ (gcry_cipher_hd_t c, const unsigned char *nonce,
|
||||
size_t noncelen);
|
||||
gcry_err_code_t _gcry_cipher_ccm_authenticate
|
||||
/* */ (gcry_cipher_hd_t c, const unsigned char *abuf, size_t abuflen);
|
||||
#ifdef HAVE_U64_TYPEDEF
|
||||
gcry_err_code_t _gcry_cipher_ccm_set_lengths
|
||||
/* */ (gcry_cipher_hd_t c, u64 encryptedlen, u64 aadlen, u64 taglen);
|
||||
#endif
|
||||
gcry_err_code_t _gcry_cipher_ccm_get_tag
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outtag, size_t taglen);
|
||||
gcry_err_code_t _gcry_cipher_ccm_check_tag
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
const unsigned char *intag, size_t taglen);
|
||||
|
||||
|
||||
/*-- cipher-gcm.c --*/
|
||||
gcry_err_code_t _gcry_cipher_gcm_encrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
gcry_err_code_t _gcry_cipher_gcm_decrypt
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen);
|
||||
gcry_err_code_t _gcry_cipher_gcm_setiv
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
const unsigned char *iv, size_t ivlen);
|
||||
gcry_err_code_t _gcry_cipher_gcm_authenticate
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
const unsigned char *aadbuf, size_t aadbuflen);
|
||||
gcry_err_code_t _gcry_cipher_gcm_get_tag
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
unsigned char *outtag, size_t taglen);
|
||||
gcry_err_code_t _gcry_cipher_gcm_check_tag
|
||||
/* */ (gcry_cipher_hd_t c,
|
||||
const unsigned char *intag, size_t taglen);
|
||||
void _gcry_cipher_gcm_setkey
|
||||
/* */ (gcry_cipher_hd_t c);
|
||||
|
||||
|
||||
#endif /*G10_CIPHER_INTERNAL_H*/
|
||||
@@ -0,0 +1,96 @@
|
||||
/* cipher-ofb.c - Generic OFB mode implementation
|
||||
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
|
||||
* 2005, 2007, 2008, 2009, 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
#include "ath.h"
|
||||
#include "bufhelp.h"
|
||||
#include "./cipher-internal.h"
|
||||
|
||||
|
||||
gcry_err_code_t
|
||||
_gcry_cipher_ofb_encrypt (gcry_cipher_hd_t c,
|
||||
unsigned char *outbuf, size_t outbuflen,
|
||||
const unsigned char *inbuf, size_t inbuflen)
|
||||
{
|
||||
unsigned char *ivp;
|
||||
gcry_cipher_encrypt_t enc_fn = c->spec->encrypt;
|
||||
size_t blocksize = c->spec->blocksize;
|
||||
unsigned int burn, nburn;
|
||||
|
||||
if (outbuflen < inbuflen)
|
||||
return GPG_ERR_BUFFER_TOO_SHORT;
|
||||
|
||||
if ( inbuflen <= c->unused )
|
||||
{
|
||||
/* Short enough to be encoded by the remaining XOR mask. */
|
||||
/* XOR the input with the IV */
|
||||
ivp = c->u_iv.iv + blocksize - c->unused;
|
||||
buf_xor(outbuf, ivp, inbuf, inbuflen);
|
||||
c->unused -= inbuflen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
burn = 0;
|
||||
|
||||
if( c->unused )
|
||||
{
|
||||
inbuflen -= c->unused;
|
||||
ivp = c->u_iv.iv + blocksize - c->unused;
|
||||
buf_xor(outbuf, ivp, inbuf, c->unused);
|
||||
outbuf += c->unused;
|
||||
inbuf += c->unused;
|
||||
c->unused = 0;
|
||||
}
|
||||
|
||||
/* Now we can process complete blocks. */
|
||||
while ( inbuflen >= blocksize )
|
||||
{
|
||||
/* Encrypt the IV (and save the current one). */
|
||||
nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
buf_xor(outbuf, c->u_iv.iv, inbuf, blocksize);
|
||||
outbuf += blocksize;
|
||||
inbuf += blocksize;
|
||||
inbuflen -= blocksize;
|
||||
}
|
||||
if ( inbuflen )
|
||||
{ /* process the remaining bytes */
|
||||
nburn = enc_fn ( &c->context.c, c->u_iv.iv, c->u_iv.iv );
|
||||
burn = nburn > burn ? nburn : burn;
|
||||
c->unused = blocksize;
|
||||
c->unused -= inbuflen;
|
||||
buf_xor(outbuf, c->u_iv.iv, inbuf, inbuflen);
|
||||
outbuf += inbuflen;
|
||||
inbuf += inbuflen;
|
||||
inbuflen = 0;
|
||||
}
|
||||
|
||||
if (burn > 0)
|
||||
_gcry_burn_stack (burn + 4 * sizeof(void *));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,470 @@
|
||||
/* cipher-selftest.c - Helper functions for bulk encryption selftests.
|
||||
* Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#ifdef HAVE_SYSLOG
|
||||
# include <syslog.h>
|
||||
#endif /*HAVE_SYSLOG*/
|
||||
|
||||
#include "types.h"
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
#include "bufhelp.h"
|
||||
#include "cipher-selftest.h"
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
# include <stdint.h> /* uintptr_t */
|
||||
#elif defined(HAVE_INTTYPES_H)
|
||||
# include <inttypes.h>
|
||||
#else
|
||||
/* In this case, uintptr_t is provided by config.h. */
|
||||
#endif
|
||||
|
||||
/* Helper macro to force alignment to 16 bytes. */
|
||||
#ifdef HAVE_GCC_ATTRIBUTE_ALIGNED
|
||||
# define ATTR_ALIGNED_16 __attribute__ ((aligned (16)))
|
||||
#else
|
||||
# define ATTR_ALIGNED_16
|
||||
#endif
|
||||
|
||||
|
||||
/* Run the self-tests for <block cipher>-CBC-<block size>, tests bulk CBC
|
||||
decryption. Returns NULL on success. */
|
||||
const char *
|
||||
_gcry_selftest_helper_cbc (const char *cipher, gcry_cipher_setkey_t setkey_func,
|
||||
gcry_cipher_encrypt_t encrypt_one,
|
||||
gcry_cipher_bulk_cbc_dec_t bulk_cbc_dec,
|
||||
const int nblocks, const int blocksize,
|
||||
const int context_size)
|
||||
{
|
||||
int i, offs;
|
||||
unsigned char *ctx, *plaintext, *plaintext2, *ciphertext, *iv, *iv2, *mem;
|
||||
unsigned int ctx_aligned_size, memsize;
|
||||
|
||||
static const unsigned char key[16] ATTR_ALIGNED_16 = {
|
||||
0x66,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F,
|
||||
0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x22
|
||||
};
|
||||
|
||||
/* Allocate buffers, align first two elements to 16 bytes and latter to
|
||||
block size. */
|
||||
ctx_aligned_size = context_size + 15;
|
||||
ctx_aligned_size -= ctx_aligned_size & 0xf;
|
||||
|
||||
memsize = ctx_aligned_size + (blocksize * 2) + (blocksize * nblocks * 3) + 16;
|
||||
|
||||
mem = xtrycalloc (1, memsize);
|
||||
if (!mem)
|
||||
return "failed to allocate memory";
|
||||
|
||||
offs = (16 - ((uintptr_t)mem & 15)) & 15;
|
||||
ctx = (void*)(mem + offs);
|
||||
iv = ctx + ctx_aligned_size;
|
||||
iv2 = iv + blocksize;
|
||||
plaintext = iv2 + blocksize;
|
||||
plaintext2 = plaintext + nblocks * blocksize;
|
||||
ciphertext = plaintext2 + nblocks * blocksize;
|
||||
|
||||
/* Initialize ctx */
|
||||
setkey_func (ctx, key, sizeof(key));
|
||||
|
||||
/* Test single block code path */
|
||||
memset (iv, 0x4e, blocksize);
|
||||
memset (iv2, 0x4e, blocksize);
|
||||
for (i = 0; i < blocksize; i++)
|
||||
plaintext[i] = i;
|
||||
|
||||
/* CBC manually. */
|
||||
buf_xor (ciphertext, iv, plaintext, blocksize);
|
||||
encrypt_one (ctx, ciphertext, ciphertext);
|
||||
memcpy (iv, ciphertext, blocksize);
|
||||
|
||||
/* CBC decrypt. */
|
||||
bulk_cbc_dec (ctx, iv2, plaintext2, ciphertext, 1);
|
||||
if (memcmp (plaintext2, plaintext, blocksize))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CBC-%d test failed (plaintext mismatch)", cipher,
|
||||
blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CBC failed - see syslog for details";
|
||||
}
|
||||
|
||||
if (memcmp (iv2, iv, blocksize))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CBC-%d test failed (IV mismatch)", cipher, blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CBC failed - see syslog for details";
|
||||
}
|
||||
|
||||
/* Test parallelized code paths */
|
||||
memset (iv, 0x5f, blocksize);
|
||||
memset (iv2, 0x5f, blocksize);
|
||||
|
||||
for (i = 0; i < nblocks * blocksize; i++)
|
||||
plaintext[i] = i;
|
||||
|
||||
/* Create CBC ciphertext manually. */
|
||||
for (i = 0; i < nblocks * blocksize; i+=blocksize)
|
||||
{
|
||||
buf_xor (&ciphertext[i], iv, &plaintext[i], blocksize);
|
||||
encrypt_one (ctx, &ciphertext[i], &ciphertext[i]);
|
||||
memcpy (iv, &ciphertext[i], blocksize);
|
||||
}
|
||||
|
||||
/* Decrypt using bulk CBC and compare result. */
|
||||
bulk_cbc_dec (ctx, iv2, plaintext2, ciphertext, nblocks);
|
||||
|
||||
if (memcmp (plaintext2, plaintext, nblocks * blocksize))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CBC-%d test failed (plaintext mismatch, parallel path)",
|
||||
cipher, blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CBC failed - see syslog for details";
|
||||
}
|
||||
if (memcmp (iv2, iv, blocksize))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CBC-%d test failed (IV mismatch, parallel path)",
|
||||
cipher, blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CBC failed - see syslog for details";
|
||||
}
|
||||
|
||||
xfree (mem);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Run the self-tests for <block cipher>-CFB-<block size>, tests bulk CFB
|
||||
decryption. Returns NULL on success. */
|
||||
const char *
|
||||
_gcry_selftest_helper_cfb (const char *cipher, gcry_cipher_setkey_t setkey_func,
|
||||
gcry_cipher_encrypt_t encrypt_one,
|
||||
gcry_cipher_bulk_cfb_dec_t bulk_cfb_dec,
|
||||
const int nblocks, const int blocksize,
|
||||
const int context_size)
|
||||
{
|
||||
int i, offs;
|
||||
unsigned char *ctx, *plaintext, *plaintext2, *ciphertext, *iv, *iv2, *mem;
|
||||
unsigned int ctx_aligned_size, memsize;
|
||||
|
||||
static const unsigned char key[16] ATTR_ALIGNED_16 = {
|
||||
0x11,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F,
|
||||
0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x33
|
||||
};
|
||||
|
||||
/* Allocate buffers, align first two elements to 16 bytes and latter to
|
||||
block size. */
|
||||
ctx_aligned_size = context_size + 15;
|
||||
ctx_aligned_size -= ctx_aligned_size & 0xf;
|
||||
|
||||
memsize = ctx_aligned_size + (blocksize * 2) + (blocksize * nblocks * 3) + 16;
|
||||
|
||||
mem = xtrycalloc (1, memsize);
|
||||
if (!mem)
|
||||
return "failed to allocate memory";
|
||||
|
||||
offs = (16 - ((uintptr_t)mem & 15)) & 15;
|
||||
ctx = (void*)(mem + offs);
|
||||
iv = ctx + ctx_aligned_size;
|
||||
iv2 = iv + blocksize;
|
||||
plaintext = iv2 + blocksize;
|
||||
plaintext2 = plaintext + nblocks * blocksize;
|
||||
ciphertext = plaintext2 + nblocks * blocksize;
|
||||
|
||||
/* Initialize ctx */
|
||||
setkey_func (ctx, key, sizeof(key));
|
||||
|
||||
/* Test single block code path */
|
||||
memset(iv, 0xd3, blocksize);
|
||||
memset(iv2, 0xd3, blocksize);
|
||||
for (i = 0; i < blocksize; i++)
|
||||
plaintext[i] = i;
|
||||
|
||||
/* CFB manually. */
|
||||
encrypt_one (ctx, ciphertext, iv);
|
||||
buf_xor_2dst (iv, ciphertext, plaintext, blocksize);
|
||||
|
||||
/* CFB decrypt. */
|
||||
bulk_cfb_dec (ctx, iv2, plaintext2, ciphertext, 1);
|
||||
if (memcmp(plaintext2, plaintext, blocksize))
|
||||
{
|
||||
xfree(mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CFB-%d test failed (plaintext mismatch)", cipher,
|
||||
blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CFB failed - see syslog for details";
|
||||
}
|
||||
|
||||
if (memcmp(iv2, iv, blocksize))
|
||||
{
|
||||
xfree(mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CFB-%d test failed (IV mismatch)", cipher, blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CFB failed - see syslog for details";
|
||||
}
|
||||
|
||||
/* Test parallelized code paths */
|
||||
memset(iv, 0xe6, blocksize);
|
||||
memset(iv2, 0xe6, blocksize);
|
||||
|
||||
for (i = 0; i < nblocks * blocksize; i++)
|
||||
plaintext[i] = i;
|
||||
|
||||
/* Create CFB ciphertext manually. */
|
||||
for (i = 0; i < nblocks * blocksize; i+=blocksize)
|
||||
{
|
||||
encrypt_one (ctx, &ciphertext[i], iv);
|
||||
buf_xor_2dst (iv, &ciphertext[i], &plaintext[i], blocksize);
|
||||
}
|
||||
|
||||
/* Decrypt using bulk CBC and compare result. */
|
||||
bulk_cfb_dec (ctx, iv2, plaintext2, ciphertext, nblocks);
|
||||
|
||||
if (memcmp(plaintext2, plaintext, nblocks * blocksize))
|
||||
{
|
||||
xfree(mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CFB-%d test failed (plaintext mismatch, parallel path)",
|
||||
cipher, blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CFB failed - see syslog for details";
|
||||
}
|
||||
if (memcmp(iv2, iv, blocksize))
|
||||
{
|
||||
xfree(mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CFB-%d test failed (IV mismatch, parallel path)", cipher,
|
||||
blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CFB failed - see syslog for details";
|
||||
}
|
||||
|
||||
xfree(mem);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Run the self-tests for <block cipher>-CTR-<block size>, tests IV increment
|
||||
of bulk CTR encryption. Returns NULL on success. */
|
||||
const char *
|
||||
_gcry_selftest_helper_ctr (const char *cipher, gcry_cipher_setkey_t setkey_func,
|
||||
gcry_cipher_encrypt_t encrypt_one,
|
||||
gcry_cipher_bulk_ctr_enc_t bulk_ctr_enc,
|
||||
const int nblocks, const int blocksize,
|
||||
const int context_size)
|
||||
{
|
||||
int i, j, offs, diff;
|
||||
unsigned char *ctx, *plaintext, *plaintext2, *ciphertext, *ciphertext2,
|
||||
*iv, *iv2, *mem;
|
||||
unsigned int ctx_aligned_size, memsize;
|
||||
|
||||
static const unsigned char key[16] ATTR_ALIGNED_16 = {
|
||||
0x06,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F,
|
||||
0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x21
|
||||
};
|
||||
|
||||
/* Allocate buffers, align first two elements to 16 bytes and latter to
|
||||
block size. */
|
||||
ctx_aligned_size = context_size + 15;
|
||||
ctx_aligned_size -= ctx_aligned_size & 0xf;
|
||||
|
||||
memsize = ctx_aligned_size + (blocksize * 2) + (blocksize * nblocks * 4) + 16;
|
||||
|
||||
mem = xtrycalloc (1, memsize);
|
||||
if (!mem)
|
||||
return "failed to allocate memory";
|
||||
|
||||
offs = (16 - ((uintptr_t)mem & 15)) & 15;
|
||||
ctx = (void*)(mem + offs);
|
||||
iv = ctx + ctx_aligned_size;
|
||||
iv2 = iv + blocksize;
|
||||
plaintext = iv2 + blocksize;
|
||||
plaintext2 = plaintext + nblocks * blocksize;
|
||||
ciphertext = plaintext2 + nblocks * blocksize;
|
||||
ciphertext2 = ciphertext + nblocks * blocksize;
|
||||
|
||||
/* Initialize ctx */
|
||||
setkey_func (ctx, key, sizeof(key));
|
||||
|
||||
/* Test single block code path */
|
||||
memset (iv, 0xff, blocksize);
|
||||
for (i = 0; i < blocksize; i++)
|
||||
plaintext[i] = i;
|
||||
|
||||
/* CTR manually. */
|
||||
encrypt_one (ctx, ciphertext, iv);
|
||||
for (i = 0; i < blocksize; i++)
|
||||
ciphertext[i] ^= plaintext[i];
|
||||
for (i = blocksize; i > 0; i--)
|
||||
{
|
||||
iv[i-1]++;
|
||||
if (iv[i-1])
|
||||
break;
|
||||
}
|
||||
|
||||
memset (iv2, 0xff, blocksize);
|
||||
bulk_ctr_enc (ctx, iv2, plaintext2, ciphertext, 1);
|
||||
|
||||
if (memcmp (plaintext2, plaintext, blocksize))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CTR-%d test failed (plaintext mismatch)", cipher,
|
||||
blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CTR failed - see syslog for details";
|
||||
}
|
||||
|
||||
if (memcmp (iv2, iv, blocksize))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CTR-%d test failed (IV mismatch)", cipher,
|
||||
blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CTR failed - see syslog for details";
|
||||
}
|
||||
|
||||
/* Test bulk encryption with typical IV. */
|
||||
memset(iv, 0x57, blocksize-4);
|
||||
iv[blocksize-1] = 1;
|
||||
iv[blocksize-2] = 0;
|
||||
iv[blocksize-3] = 0;
|
||||
iv[blocksize-4] = 0;
|
||||
memset(iv2, 0x57, blocksize-4);
|
||||
iv2[blocksize-1] = 1;
|
||||
iv2[blocksize-2] = 0;
|
||||
iv2[blocksize-3] = 0;
|
||||
iv2[blocksize-4] = 0;
|
||||
|
||||
for (i = 0; i < blocksize * nblocks; i++)
|
||||
plaintext2[i] = plaintext[i] = i;
|
||||
|
||||
/* Create CTR ciphertext manually. */
|
||||
for (i = 0; i < blocksize * nblocks; i+=blocksize)
|
||||
{
|
||||
encrypt_one (ctx, &ciphertext[i], iv);
|
||||
for (j = 0; j < blocksize; j++)
|
||||
ciphertext[i+j] ^= plaintext[i+j];
|
||||
for (j = blocksize; j > 0; j--)
|
||||
{
|
||||
iv[j-1]++;
|
||||
if (iv[j-1])
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bulk_ctr_enc (ctx, iv2, ciphertext2, plaintext2, nblocks);
|
||||
|
||||
if (memcmp (ciphertext2, ciphertext, blocksize * nblocks))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CTR-%d test failed (ciphertext mismatch, bulk)", cipher,
|
||||
blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CTR failed - see syslog for details";
|
||||
}
|
||||
if (memcmp(iv2, iv, blocksize))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CTR-%d test failed (IV mismatch, bulk)", cipher,
|
||||
blocksize * 8);
|
||||
#endif
|
||||
return "selftest for CTR failed - see syslog for details";
|
||||
}
|
||||
|
||||
/* Test parallelized code paths (check counter overflow handling) */
|
||||
for (diff = 0; diff < nblocks; diff++) {
|
||||
memset(iv, 0xff, blocksize);
|
||||
iv[blocksize-1] -= diff;
|
||||
iv[0] = iv[1] = 0;
|
||||
iv[2] = 0x07;
|
||||
|
||||
for (i = 0; i < blocksize * nblocks; i++)
|
||||
plaintext[i] = i;
|
||||
|
||||
/* Create CTR ciphertext manually. */
|
||||
for (i = 0; i < blocksize * nblocks; i+=blocksize)
|
||||
{
|
||||
encrypt_one (ctx, &ciphertext[i], iv);
|
||||
for (j = 0; j < blocksize; j++)
|
||||
ciphertext[i+j] ^= plaintext[i+j];
|
||||
for (j = blocksize; j > 0; j--)
|
||||
{
|
||||
iv[j-1]++;
|
||||
if (iv[j-1])
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Decrypt using bulk CTR and compare result. */
|
||||
memset(iv2, 0xff, blocksize);
|
||||
iv2[blocksize-1] -= diff;
|
||||
iv2[0] = iv2[1] = 0;
|
||||
iv2[2] = 0x07;
|
||||
|
||||
bulk_ctr_enc (ctx, iv2, plaintext2, ciphertext, nblocks);
|
||||
|
||||
if (memcmp (plaintext2, plaintext, blocksize * nblocks))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CTR-%d test failed (plaintext mismatch, diff: %d)", cipher,
|
||||
blocksize * 8, diff);
|
||||
#endif
|
||||
return "selftest for CTR failed - see syslog for details";
|
||||
}
|
||||
if (memcmp(iv2, iv, blocksize))
|
||||
{
|
||||
xfree (mem);
|
||||
#ifdef HAVE_SYSLOG
|
||||
syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: "
|
||||
"%s-CTR-%d test failed (IV mismatch, diff: %d)", cipher,
|
||||
blocksize * 8, diff);
|
||||
#endif
|
||||
return "selftest for CTR failed - see syslog for details";
|
||||
}
|
||||
}
|
||||
|
||||
xfree (mem);
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/* cipher-selftest.h - Helper functions for bulk encryption selftests.
|
||||
* Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser general Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef G10_SELFTEST_HELP_H
|
||||
#define G10_SELFTEST_HELP_H
|
||||
|
||||
#include <config.h>
|
||||
#include "types.h"
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
|
||||
typedef void (*gcry_cipher_bulk_cbc_dec_t)(void *context, unsigned char *iv,
|
||||
void *outbuf_arg,
|
||||
const void *inbuf_arg,
|
||||
size_t nblocks);
|
||||
|
||||
typedef void (*gcry_cipher_bulk_cfb_dec_t)(void *context, unsigned char *iv,
|
||||
void *outbuf_arg,
|
||||
const void *inbuf_arg,
|
||||
size_t nblocks);
|
||||
|
||||
typedef void (*gcry_cipher_bulk_ctr_enc_t)(void *context, unsigned char *iv,
|
||||
void *outbuf_arg,
|
||||
const void *inbuf_arg,
|
||||
size_t nblocks);
|
||||
|
||||
/* Helper function for bulk CBC decryption selftest */
|
||||
const char *
|
||||
_gcry_selftest_helper_cbc (const char *cipher, gcry_cipher_setkey_t setkey,
|
||||
gcry_cipher_encrypt_t encrypt_one,
|
||||
gcry_cipher_bulk_cbc_dec_t bulk_cbc_dec,
|
||||
const int nblocks, const int blocksize,
|
||||
const int context_size);
|
||||
|
||||
/* Helper function for bulk CFB decryption selftest */
|
||||
const char *
|
||||
_gcry_selftest_helper_cfb (const char *cipher, gcry_cipher_setkey_t setkey,
|
||||
gcry_cipher_encrypt_t encrypt_one,
|
||||
gcry_cipher_bulk_cfb_dec_t bulk_cfb_dec,
|
||||
const int nblocks, const int blocksize,
|
||||
const int context_size);
|
||||
|
||||
/* Helper function for bulk CTR encryption selftest */
|
||||
const char *
|
||||
_gcry_selftest_helper_ctr (const char *cipher, gcry_cipher_setkey_t setkey,
|
||||
gcry_cipher_encrypt_t encrypt_one,
|
||||
gcry_cipher_bulk_ctr_enc_t bulk_ctr_enc,
|
||||
const int nblocks, const int blocksize,
|
||||
const int context_size);
|
||||
|
||||
#endif /*G10_SELFTEST_HELP_H*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,311 @@
|
||||
/* crc.c - Cyclic redundancy checks.
|
||||
* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
|
||||
#include "bithelp.h"
|
||||
|
||||
/* Table of CRCs of all 8-bit messages. Generated by running code
|
||||
from RFC 1952 modified to print out the table. */
|
||||
static u32 crc32_table[256] = {
|
||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
|
||||
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
|
||||
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
|
||||
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
|
||||
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
|
||||
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
|
||||
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
|
||||
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
|
||||
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
||||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
|
||||
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
|
||||
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
|
||||
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
||||
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
|
||||
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
|
||||
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
|
||||
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
|
||||
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
|
||||
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
||||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
|
||||
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
|
||||
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
|
||||
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
|
||||
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
|
||||
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
|
||||
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
|
||||
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
||||
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
|
||||
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
||||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
|
||||
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
|
||||
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
|
||||
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
|
||||
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
|
||||
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
|
||||
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
|
||||
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
|
||||
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
|
||||
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
||||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
|
||||
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||
};
|
||||
|
||||
/*
|
||||
* The following function was extracted from RFC 1952 by Simon
|
||||
* Josefsson, for the Shishi project, and modified to be compatible
|
||||
* with the modified CRC-32 used by RFC 1510, and subsequently
|
||||
* modified for GNU Libgcrypt to allow it to be used for calculating
|
||||
* both unmodified CRC-32 and modified CRC-32 values. Original
|
||||
* copyright and notice from the document follows:
|
||||
*
|
||||
* Copyright (c) 1996 L. Peter Deutsch
|
||||
*
|
||||
* Permission is granted to copy and distribute this document for
|
||||
* any purpose and without charge, including translations into
|
||||
* other languages and incorporation into compilations, provided
|
||||
* that the copyright notice and this notice are preserved, and
|
||||
* that any substantive changes or deletions from the original are
|
||||
* clearly marked.
|
||||
*
|
||||
* The copyright on RFCs, and consequently the function below, are
|
||||
* supposedly also retroactively claimed by the Internet Society
|
||||
* (according to rfc-editor@rfc-editor.org), with the following
|
||||
* copyright notice:
|
||||
*
|
||||
* Copyright (C) The Internet Society. All Rights Reserved.
|
||||
*
|
||||
* This document and translations of it may be copied and furnished
|
||||
* to others, and derivative works that comment on or otherwise
|
||||
* explain it or assist in its implementation may be prepared,
|
||||
* copied, published and distributed, in whole or in part, without
|
||||
* restriction of any kind, provided that the above copyright
|
||||
* notice and this paragraph are included on all such copies and
|
||||
* derivative works. However, this document itself may not be
|
||||
* modified in any way, such as by removing the copyright notice or
|
||||
* references to the Internet Society or other Internet
|
||||
* organizations, except as needed for the purpose of developing
|
||||
* Internet standards in which case the procedures for copyrights
|
||||
* defined in the Internet Standards process must be followed, or
|
||||
* as required to translate it into languages other than English.
|
||||
*
|
||||
* The limited permissions granted above are perpetual and will not be
|
||||
* revoked by the Internet Society or its successors or assigns.
|
||||
*
|
||||
* This document and the information contained herein is provided
|
||||
* on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET
|
||||
* ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE
|
||||
* OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
|
||||
* PARTICULAR PURPOSE.
|
||||
*
|
||||
*/
|
||||
static u32
|
||||
update_crc32 (u32 crc, const void *buf_arg, size_t len)
|
||||
{
|
||||
const char *buf = buf_arg;
|
||||
size_t n;
|
||||
|
||||
for (n = 0; n < len; n++)
|
||||
crc = crc32_table[(crc ^ buf[n]) & 0xff] ^ (crc >> 8);
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 CRC;
|
||||
byte buf[4];
|
||||
}
|
||||
CRC_CONTEXT;
|
||||
|
||||
/* CRC32 */
|
||||
|
||||
static void
|
||||
crc32_init (void *context, unsigned int flags)
|
||||
{
|
||||
CRC_CONTEXT *ctx = (CRC_CONTEXT *) context;
|
||||
|
||||
(void)flags;
|
||||
|
||||
ctx->CRC = 0 ^ 0xffffffffL;
|
||||
}
|
||||
|
||||
static void
|
||||
crc32_write (void *context, const void *inbuf, size_t inlen)
|
||||
{
|
||||
CRC_CONTEXT *ctx = (CRC_CONTEXT *) context;
|
||||
if (!inbuf)
|
||||
return;
|
||||
ctx->CRC = update_crc32 (ctx->CRC, inbuf, inlen);
|
||||
}
|
||||
|
||||
static byte *
|
||||
crc32_read (void *context)
|
||||
{
|
||||
CRC_CONTEXT *ctx = (CRC_CONTEXT *) context;
|
||||
return ctx->buf;
|
||||
}
|
||||
|
||||
static void
|
||||
crc32_final (void *context)
|
||||
{
|
||||
CRC_CONTEXT *ctx = (CRC_CONTEXT *) context;
|
||||
ctx->CRC ^= 0xffffffffL;
|
||||
ctx->buf[0] = (ctx->CRC >> 24) & 0xFF;
|
||||
ctx->buf[1] = (ctx->CRC >> 16) & 0xFF;
|
||||
ctx->buf[2] = (ctx->CRC >> 8) & 0xFF;
|
||||
ctx->buf[3] = (ctx->CRC ) & 0xFF;
|
||||
}
|
||||
|
||||
/* CRC32 a'la RFC 1510 */
|
||||
static void
|
||||
crc32rfc1510_init (void *context, unsigned int flags)
|
||||
{
|
||||
CRC_CONTEXT *ctx = (CRC_CONTEXT *) context;
|
||||
|
||||
(void)flags;
|
||||
|
||||
ctx->CRC = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
crc32rfc1510_final (void *context)
|
||||
{
|
||||
CRC_CONTEXT *ctx = (CRC_CONTEXT *) context;
|
||||
ctx->buf[0] = (ctx->CRC >> 24) & 0xFF;
|
||||
ctx->buf[1] = (ctx->CRC >> 16) & 0xFF;
|
||||
ctx->buf[2] = (ctx->CRC >> 8) & 0xFF;
|
||||
ctx->buf[3] = (ctx->CRC ) & 0xFF;
|
||||
}
|
||||
|
||||
/* CRC24 a'la RFC 2440 */
|
||||
/*
|
||||
* The following CRC 24 routines are adapted from RFC 2440, which has
|
||||
* the following copyright notice:
|
||||
*
|
||||
* Copyright (C) The Internet Society (1998). All Rights Reserved.
|
||||
*
|
||||
* This document and translations of it may be copied and furnished
|
||||
* to others, and derivative works that comment on or otherwise
|
||||
* explain it or assist in its implementation may be prepared,
|
||||
* copied, published and distributed, in whole or in part, without
|
||||
* restriction of any kind, provided that the above copyright notice
|
||||
* and this paragraph are included on all such copies and derivative
|
||||
* works. However, this document itself may not be modified in any
|
||||
* way, such as by removing the copyright notice or references to
|
||||
* the Internet Society or other Internet organizations, except as
|
||||
* needed for the purpose of developing Internet standards in which
|
||||
* case the procedures for copyrights defined in the Internet
|
||||
* Standards process must be followed, or as required to translate
|
||||
* it into languages other than English.
|
||||
*
|
||||
* The limited permissions granted above are perpetual and will not be
|
||||
* revoked by the Internet Society or its successors or assigns.
|
||||
*
|
||||
* This document and the information contained herein is provided on
|
||||
* an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET
|
||||
* ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE
|
||||
* OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
||||
* PURPOSE.
|
||||
*/
|
||||
|
||||
#define CRC24_INIT 0xb704ceL
|
||||
#define CRC24_POLY 0x1864cfbL
|
||||
|
||||
static void
|
||||
crc24rfc2440_init (void *context, unsigned int flags)
|
||||
{
|
||||
CRC_CONTEXT *ctx = (CRC_CONTEXT *) context;
|
||||
|
||||
(void)flags;
|
||||
|
||||
ctx->CRC = CRC24_INIT;
|
||||
}
|
||||
|
||||
static void
|
||||
crc24rfc2440_write (void *context, const void *inbuf_arg, size_t inlen)
|
||||
{
|
||||
const unsigned char *inbuf = inbuf_arg;
|
||||
int i;
|
||||
CRC_CONTEXT *ctx = (CRC_CONTEXT *) context;
|
||||
|
||||
if (!inbuf)
|
||||
return;
|
||||
|
||||
while (inlen--) {
|
||||
ctx->CRC ^= (*inbuf++) << 16;
|
||||
for (i = 0; i < 8; i++) {
|
||||
ctx->CRC <<= 1;
|
||||
if (ctx->CRC & 0x1000000)
|
||||
ctx->CRC ^= CRC24_POLY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
crc24rfc2440_final (void *context)
|
||||
{
|
||||
CRC_CONTEXT *ctx = (CRC_CONTEXT *) context;
|
||||
ctx->buf[0] = (ctx->CRC >> 16) & 0xFF;
|
||||
ctx->buf[1] = (ctx->CRC >> 8) & 0xFF;
|
||||
ctx->buf[2] = (ctx->CRC ) & 0xFF;
|
||||
}
|
||||
|
||||
/* We allow the CRC algorithms even in FIPS mode because they are
|
||||
actually no cryptographic primitives. */
|
||||
|
||||
gcry_md_spec_t _gcry_digest_spec_crc32 =
|
||||
{
|
||||
GCRY_MD_CRC32, {0, 1},
|
||||
"CRC32", NULL, 0, NULL, 4,
|
||||
crc32_init, crc32_write, crc32_final, crc32_read,
|
||||
sizeof (CRC_CONTEXT)
|
||||
};
|
||||
|
||||
gcry_md_spec_t _gcry_digest_spec_crc32_rfc1510 =
|
||||
{
|
||||
GCRY_MD_CRC32_RFC1510, {0, 1},
|
||||
"CRC32RFC1510", NULL, 0, NULL, 4,
|
||||
crc32rfc1510_init, crc32_write,
|
||||
crc32rfc1510_final, crc32_read,
|
||||
sizeof (CRC_CONTEXT)
|
||||
};
|
||||
|
||||
gcry_md_spec_t _gcry_digest_spec_crc24_rfc2440 =
|
||||
{
|
||||
GCRY_MD_CRC24_RFC2440, {0, 1},
|
||||
"CRC24RFC2440", NULL, 0, NULL, 3,
|
||||
crc24rfc2440_init, crc24rfc2440_write,
|
||||
crc24rfc2440_final, crc32_read,
|
||||
sizeof (CRC_CONTEXT)
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,394 @@
|
||||
/* dsa-common.c - Common code for DSA
|
||||
* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2013 g10 Code GmbH
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "mpi.h"
|
||||
#include "cipher.h"
|
||||
#include "pubkey-internal.h"
|
||||
|
||||
|
||||
/*
|
||||
* Generate a random secret exponent K less than Q.
|
||||
* Note that ECDSA uses this code also to generate D.
|
||||
*/
|
||||
gcry_mpi_t
|
||||
_gcry_dsa_gen_k (gcry_mpi_t q, int security_level)
|
||||
{
|
||||
gcry_mpi_t k = mpi_alloc_secure (mpi_get_nlimbs (q));
|
||||
unsigned int nbits = mpi_get_nbits (q);
|
||||
unsigned int nbytes = (nbits+7)/8;
|
||||
char *rndbuf = NULL;
|
||||
|
||||
/* To learn why we don't use mpi_mod to get the requested bit size,
|
||||
read the paper: "The Insecurity of the Digital Signature
|
||||
Algorithm with Partially Known Nonces" by Nguyen and Shparlinski.
|
||||
Journal of Cryptology, New York. Vol 15, nr 3 (2003) */
|
||||
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("choosing a random k of %u bits at seclevel %d\n",
|
||||
nbits, security_level);
|
||||
for (;;)
|
||||
{
|
||||
if ( !rndbuf || nbits < 32 )
|
||||
{
|
||||
xfree (rndbuf);
|
||||
rndbuf = _gcry_random_bytes_secure (nbytes, security_level);
|
||||
}
|
||||
else
|
||||
{ /* Change only some of the higher bits. We could improve
|
||||
this by directly requesting more memory at the first call
|
||||
to get_random_bytes() and use these extra bytes here.
|
||||
However the required management code is more complex and
|
||||
thus we better use this simple method. */
|
||||
char *pp = _gcry_random_bytes_secure (4, security_level);
|
||||
memcpy (rndbuf, pp, 4);
|
||||
xfree (pp);
|
||||
}
|
||||
_gcry_mpi_set_buffer (k, rndbuf, nbytes, 0);
|
||||
|
||||
/* Make sure we have the requested number of bits. This code
|
||||
looks a bit funny but it is easy to understand if you
|
||||
consider that mpi_set_highbit clears all higher bits. We
|
||||
don't have a clear_highbit, thus we first set the high bit
|
||||
and then clear it again. */
|
||||
if (mpi_test_bit (k, nbits-1))
|
||||
mpi_set_highbit (k, nbits-1);
|
||||
else
|
||||
{
|
||||
mpi_set_highbit (k, nbits-1);
|
||||
mpi_clear_bit (k, nbits-1);
|
||||
}
|
||||
|
||||
if (!(mpi_cmp (k, q) < 0)) /* check: k < q */
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("\tk too large - again\n");
|
||||
continue; /* no */
|
||||
}
|
||||
if (!(mpi_cmp_ui (k, 0) > 0)) /* check: k > 0 */
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("\tk is zero - again\n");
|
||||
continue; /* no */
|
||||
}
|
||||
break; /* okay */
|
||||
}
|
||||
xfree (rndbuf);
|
||||
|
||||
return k;
|
||||
}
|
||||
|
||||
|
||||
/* Turn VALUE into an octet string and store it in an allocated buffer
|
||||
at R_FRAME. If the resulting octet string is shorter than NBYTES
|
||||
the result will be left padded with zeroes. If VALUE does not fit
|
||||
into NBYTES an error code is returned. */
|
||||
static gpg_err_code_t
|
||||
int2octets (unsigned char **r_frame, gcry_mpi_t value, size_t nbytes)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
size_t nframe, noff, n;
|
||||
unsigned char *frame;
|
||||
|
||||
rc = _gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &nframe, value);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (nframe > nbytes)
|
||||
return GPG_ERR_TOO_LARGE; /* Value too long to fit into NBYTES. */
|
||||
|
||||
noff = (nframe < nbytes)? nbytes - nframe : 0;
|
||||
n = nframe + noff;
|
||||
frame = mpi_is_secure (value)? xtrymalloc_secure (n) : xtrymalloc (n);
|
||||
if (!frame)
|
||||
return gpg_err_code_from_syserror ();
|
||||
if (noff)
|
||||
memset (frame, 0, noff);
|
||||
nframe += noff;
|
||||
rc = _gcry_mpi_print (GCRYMPI_FMT_USG, frame+noff, nframe-noff, NULL, value);
|
||||
if (rc)
|
||||
{
|
||||
xfree (frame);
|
||||
return rc;
|
||||
}
|
||||
|
||||
*r_frame = frame;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Connert the bit string BITS of length NBITS into an octet string
|
||||
with a length of (QBITS+7)/8 bytes. On success store the result at
|
||||
R_FRAME. */
|
||||
static gpg_err_code_t
|
||||
bits2octets (unsigned char **r_frame,
|
||||
const void *bits, unsigned int nbits,
|
||||
gcry_mpi_t q, unsigned int qbits)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
gcry_mpi_t z1;
|
||||
|
||||
/* z1 = bits2int (b) */
|
||||
rc = _gcry_mpi_scan (&z1, GCRYMPI_FMT_USG, bits, (nbits+7)/8, NULL);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (nbits > qbits)
|
||||
mpi_rshift (z1, z1, nbits - qbits);
|
||||
|
||||
/* z2 - z1 mod q */
|
||||
if (mpi_cmp (z1, q) >= 0)
|
||||
mpi_sub (z1, z1, q);
|
||||
|
||||
/* Convert to an octet string. */
|
||||
rc = int2octets (r_frame, z1, (qbits+7)/8);
|
||||
|
||||
mpi_free (z1);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Generate a deterministic secret exponent K less than DSA_Q. H1 is
|
||||
* the to be signed digest with a length of HLEN bytes. HALGO is the
|
||||
* algorithm used to create the hash. On success the value for K is
|
||||
* stored at R_K.
|
||||
*/
|
||||
gpg_err_code_t
|
||||
_gcry_dsa_gen_rfc6979_k (gcry_mpi_t *r_k,
|
||||
gcry_mpi_t dsa_q, gcry_mpi_t dsa_x,
|
||||
const unsigned char *h1, unsigned int hlen,
|
||||
int halgo, unsigned int extraloops)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
unsigned char *V = NULL;
|
||||
unsigned char *K = NULL;
|
||||
unsigned char *x_buf = NULL;
|
||||
unsigned char *h1_buf = NULL;
|
||||
gcry_md_hd_t hd = NULL;
|
||||
unsigned char *t = NULL;
|
||||
gcry_mpi_t k = NULL;
|
||||
unsigned int tbits, qbits;
|
||||
int i;
|
||||
|
||||
qbits = mpi_get_nbits (dsa_q);
|
||||
|
||||
if (!qbits || !h1 || !hlen)
|
||||
return GPG_ERR_EINVAL;
|
||||
|
||||
if (_gcry_md_get_algo_dlen (halgo) != hlen)
|
||||
return GPG_ERR_DIGEST_ALGO;
|
||||
|
||||
/* Step b: V = 0x01 0x01 0x01 ... 0x01 */
|
||||
V = xtrymalloc (hlen);
|
||||
if (!V)
|
||||
{
|
||||
rc = gpg_err_code_from_syserror ();
|
||||
goto leave;
|
||||
}
|
||||
for (i=0; i < hlen; i++)
|
||||
V[i] = 1;
|
||||
|
||||
/* Step c: K = 0x00 0x00 0x00 ... 0x00 */
|
||||
K = xtrycalloc (1, hlen);
|
||||
if (!K)
|
||||
{
|
||||
rc = gpg_err_code_from_syserror ();
|
||||
goto leave;
|
||||
}
|
||||
|
||||
rc = int2octets (&x_buf, dsa_x, (qbits+7)/8);
|
||||
if (rc)
|
||||
goto leave;
|
||||
|
||||
rc = bits2octets (&h1_buf, h1, hlen*8, dsa_q, qbits);
|
||||
if (rc)
|
||||
goto leave;
|
||||
|
||||
/* Create a handle to compute the HMACs. */
|
||||
rc = _gcry_md_open (&hd, halgo, (GCRY_MD_FLAG_SECURE | GCRY_MD_FLAG_HMAC));
|
||||
if (rc)
|
||||
goto leave;
|
||||
|
||||
/* Step d: K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) */
|
||||
rc = _gcry_md_setkey (hd, K, hlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_md_write (hd, V, hlen);
|
||||
_gcry_md_write (hd, "", 1);
|
||||
_gcry_md_write (hd, x_buf, (qbits+7)/8);
|
||||
_gcry_md_write (hd, h1_buf, (qbits+7)/8);
|
||||
memcpy (K, _gcry_md_read (hd, 0), hlen);
|
||||
|
||||
/* Step e: V = HMAC_K(V) */
|
||||
rc = _gcry_md_setkey (hd, K, hlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_md_write (hd, V, hlen);
|
||||
memcpy (V, _gcry_md_read (hd, 0), hlen);
|
||||
|
||||
/* Step f: K = HMAC_K(V || 0x01 || int2octets(x) || bits2octets(h1) */
|
||||
rc = _gcry_md_setkey (hd, K, hlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_md_write (hd, V, hlen);
|
||||
_gcry_md_write (hd, "\x01", 1);
|
||||
_gcry_md_write (hd, x_buf, (qbits+7)/8);
|
||||
_gcry_md_write (hd, h1_buf, (qbits+7)/8);
|
||||
memcpy (K, _gcry_md_read (hd, 0), hlen);
|
||||
|
||||
/* Step g: V = HMAC_K(V) */
|
||||
rc = _gcry_md_setkey (hd, K, hlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_md_write (hd, V, hlen);
|
||||
memcpy (V, _gcry_md_read (hd, 0), hlen);
|
||||
|
||||
/* Step h. */
|
||||
t = xtrymalloc ((qbits+7)/8+hlen);
|
||||
if (!t)
|
||||
{
|
||||
rc = gpg_err_code_from_syserror ();
|
||||
goto leave;
|
||||
}
|
||||
|
||||
again:
|
||||
for (tbits = 0; tbits < qbits;)
|
||||
{
|
||||
/* V = HMAC_K(V) */
|
||||
rc = _gcry_md_setkey (hd, K, hlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_md_write (hd, V, hlen);
|
||||
memcpy (V, _gcry_md_read (hd, 0), hlen);
|
||||
|
||||
/* T = T || V */
|
||||
memcpy (t+(tbits+7)/8, V, hlen);
|
||||
tbits += 8*hlen;
|
||||
}
|
||||
|
||||
/* k = bits2int (T) */
|
||||
mpi_free (k);
|
||||
k = NULL;
|
||||
rc = _gcry_mpi_scan (&k, GCRYMPI_FMT_USG, t, (tbits+7)/8, NULL);
|
||||
if (rc)
|
||||
goto leave;
|
||||
if (tbits > qbits)
|
||||
mpi_rshift (k, k, tbits - qbits);
|
||||
|
||||
/* Check: k < q and k > 1 */
|
||||
if (!(mpi_cmp (k, dsa_q) < 0 && mpi_cmp_ui (k, 0) > 0))
|
||||
{
|
||||
/* K = HMAC_K(V || 0x00) */
|
||||
rc = _gcry_md_setkey (hd, K, hlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_md_write (hd, V, hlen);
|
||||
_gcry_md_write (hd, "", 1);
|
||||
memcpy (K, _gcry_md_read (hd, 0), hlen);
|
||||
|
||||
/* V = HMAC_K(V) */
|
||||
rc = _gcry_md_setkey (hd, K, hlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_md_write (hd, V, hlen);
|
||||
memcpy (V, _gcry_md_read (hd, 0), hlen);
|
||||
|
||||
goto again;
|
||||
}
|
||||
|
||||
/* The caller may have requested that we introduce some extra loops.
|
||||
This is for example useful if the caller wants another value for
|
||||
K because the last returned one yielded an R of 0. Becuase this
|
||||
is very unlikely we implement it in a straightforward way. */
|
||||
if (extraloops)
|
||||
{
|
||||
extraloops--;
|
||||
|
||||
/* K = HMAC_K(V || 0x00) */
|
||||
rc = _gcry_md_setkey (hd, K, hlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_md_write (hd, V, hlen);
|
||||
_gcry_md_write (hd, "", 1);
|
||||
memcpy (K, _gcry_md_read (hd, 0), hlen);
|
||||
|
||||
/* V = HMAC_K(V) */
|
||||
rc = _gcry_md_setkey (hd, K, hlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_md_write (hd, V, hlen);
|
||||
memcpy (V, _gcry_md_read (hd, 0), hlen);
|
||||
|
||||
goto again;
|
||||
}
|
||||
|
||||
/* log_mpidump (" k", k); */
|
||||
|
||||
leave:
|
||||
xfree (t);
|
||||
_gcry_md_close (hd);
|
||||
xfree (h1_buf);
|
||||
xfree (x_buf);
|
||||
xfree (K);
|
||||
xfree (V);
|
||||
|
||||
if (rc)
|
||||
mpi_free (k);
|
||||
else
|
||||
*r_k = k;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Truncate opaque hash value to qbits for DSA.
|
||||
* Non-opaque input is not truncated, in hope that user
|
||||
* knows what is passed. It is not possible to correctly
|
||||
* trucate non-opaque inputs.
|
||||
*/
|
||||
gpg_err_code_t
|
||||
_gcry_dsa_normalize_hash (gcry_mpi_t input,
|
||||
gcry_mpi_t *out,
|
||||
unsigned int qbits)
|
||||
{
|
||||
gpg_err_code_t rc = 0;
|
||||
const void *abuf;
|
||||
unsigned int abits;
|
||||
gcry_mpi_t hash;
|
||||
|
||||
if (mpi_is_opaque (input))
|
||||
{
|
||||
abuf = mpi_get_opaque (input, &abits);
|
||||
rc = _gcry_mpi_scan (&hash, GCRYMPI_FMT_USG, abuf, (abits+7)/8, NULL);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (abits > qbits)
|
||||
mpi_rshift (hash, hash, abits - qbits);
|
||||
}
|
||||
else
|
||||
hash = input;
|
||||
|
||||
*out = hash;
|
||||
|
||||
return rc;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,142 @@
|
||||
/* ecc-common.h - Declarations of common ECC code
|
||||
* Copyright (C) 2013 g10 Code GmbH
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GCRY_ECC_COMMON_H
|
||||
#define GCRY_ECC_COMMON_H
|
||||
|
||||
|
||||
/* Definition of a curve. */
|
||||
typedef struct
|
||||
{
|
||||
enum gcry_mpi_ec_models model;/* The model descrinbing this curve. */
|
||||
enum ecc_dialects dialect; /* The dialect used with the curve. */
|
||||
gcry_mpi_t p; /* Prime specifying the field GF(p). */
|
||||
gcry_mpi_t a; /* First coefficient of the Weierstrass equation. */
|
||||
gcry_mpi_t b; /* Second coefficient of the Weierstrass equation.
|
||||
or d as used by Twisted Edwards curves. */
|
||||
mpi_point_struct G; /* Base point (generator). */
|
||||
gcry_mpi_t n; /* Order of G. */
|
||||
const char *name; /* Name of the curve or NULL. */
|
||||
} elliptic_curve_t;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
elliptic_curve_t E;
|
||||
mpi_point_struct Q; /* Q = [d]G */
|
||||
} ECC_public_key;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
elliptic_curve_t E;
|
||||
mpi_point_struct Q;
|
||||
gcry_mpi_t d;
|
||||
} ECC_secret_key;
|
||||
|
||||
|
||||
|
||||
/* Set the value from S into D. */
|
||||
static inline void
|
||||
point_set (mpi_point_t d, mpi_point_t s)
|
||||
{
|
||||
mpi_set (d->x, s->x);
|
||||
mpi_set (d->y, s->y);
|
||||
mpi_set (d->z, s->z);
|
||||
}
|
||||
|
||||
#define point_init(a) _gcry_mpi_point_init ((a))
|
||||
#define point_free(a) _gcry_mpi_point_free_parts ((a))
|
||||
|
||||
|
||||
/*-- ecc-curves.c --*/
|
||||
gpg_err_code_t _gcry_ecc_fill_in_curve (unsigned int nbits,
|
||||
const char *name,
|
||||
elliptic_curve_t *curve,
|
||||
unsigned int *r_nbits);
|
||||
gpg_err_code_t _gcry_ecc_update_curve_param (const char *name,
|
||||
enum gcry_mpi_ec_models *model,
|
||||
enum ecc_dialects *dialect,
|
||||
gcry_mpi_t *p, gcry_mpi_t *a,
|
||||
gcry_mpi_t *b, gcry_mpi_t *g,
|
||||
gcry_mpi_t *n);
|
||||
|
||||
const char *_gcry_ecc_get_curve (gcry_sexp_t keyparms,
|
||||
int iterator,
|
||||
unsigned int *r_nbits);
|
||||
gcry_sexp_t _gcry_ecc_get_param_sexp (const char *name);
|
||||
|
||||
/*-- ecc-misc.c --*/
|
||||
void _gcry_ecc_curve_free (elliptic_curve_t *E);
|
||||
elliptic_curve_t _gcry_ecc_curve_copy (elliptic_curve_t E);
|
||||
const char *_gcry_ecc_model2str (enum gcry_mpi_ec_models model);
|
||||
const char *_gcry_ecc_dialect2str (enum ecc_dialects dialect);
|
||||
gcry_mpi_t _gcry_ecc_ec2os (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t p);
|
||||
gcry_err_code_t _gcry_ecc_os2ec (mpi_point_t result, gcry_mpi_t value);
|
||||
|
||||
mpi_point_t _gcry_ecc_compute_public (mpi_point_t Q, mpi_ec_t ec,
|
||||
mpi_point_t G, gcry_mpi_t d);
|
||||
|
||||
/*-- ecc.c --*/
|
||||
|
||||
/*-- ecc-ecdsa.c --*/
|
||||
gpg_err_code_t _gcry_ecc_ecdsa_sign (gcry_mpi_t input, ECC_secret_key *skey,
|
||||
gcry_mpi_t r, gcry_mpi_t s,
|
||||
int flags, int hashalgo);
|
||||
gpg_err_code_t _gcry_ecc_ecdsa_verify (gcry_mpi_t input, ECC_public_key *pkey,
|
||||
gcry_mpi_t r, gcry_mpi_t s);
|
||||
|
||||
/*-- ecc-eddsa.c --*/
|
||||
gpg_err_code_t _gcry_ecc_eddsa_recover_x (gcry_mpi_t x, gcry_mpi_t y, int sign,
|
||||
mpi_ec_t ec);
|
||||
gpg_err_code_t _gcry_ecc_eddsa_encodepoint (mpi_point_t point, mpi_ec_t ctx,
|
||||
gcry_mpi_t x, gcry_mpi_t y,
|
||||
int with_prefix,
|
||||
unsigned char **r_buffer,
|
||||
unsigned int *r_buflen);
|
||||
gpg_err_code_t _gcry_ecc_eddsa_ensure_compact (gcry_mpi_t value,
|
||||
unsigned int nbits);
|
||||
gpg_err_code_t _gcry_ecc_eddsa_decodepoint (gcry_mpi_t pk, mpi_ec_t ctx,
|
||||
mpi_point_t result,
|
||||
unsigned char **r_encpk,
|
||||
unsigned int *r_encpklen);
|
||||
gpg_err_code_t _gcry_ecc_eddsa_compute_h_d (unsigned char **r_digest,
|
||||
gcry_mpi_t d, mpi_ec_t ec);
|
||||
|
||||
gpg_err_code_t _gcry_ecc_eddsa_genkey (ECC_secret_key *sk,
|
||||
elliptic_curve_t *E,
|
||||
mpi_ec_t ctx,
|
||||
gcry_random_level_t random_level);
|
||||
gpg_err_code_t _gcry_ecc_eddsa_sign (gcry_mpi_t input,
|
||||
ECC_secret_key *sk,
|
||||
gcry_mpi_t r_r, gcry_mpi_t s,
|
||||
int hashalgo, gcry_mpi_t pk);
|
||||
gpg_err_code_t _gcry_ecc_eddsa_verify (gcry_mpi_t input,
|
||||
ECC_public_key *pk,
|
||||
gcry_mpi_t r, gcry_mpi_t s,
|
||||
int hashalgo, gcry_mpi_t pkmpi);
|
||||
|
||||
/*-- ecc-gost.c --*/
|
||||
gpg_err_code_t _gcry_ecc_gost_sign (gcry_mpi_t input, ECC_secret_key *skey,
|
||||
gcry_mpi_t r, gcry_mpi_t s);
|
||||
gpg_err_code_t _gcry_ecc_gost_verify (gcry_mpi_t input, ECC_public_key *pkey,
|
||||
gcry_mpi_t r, gcry_mpi_t s);
|
||||
|
||||
|
||||
#endif /*GCRY_ECC_COMMON_H*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,234 @@
|
||||
/* ecc-ecdsa.c - Elliptic Curve ECDSA signatures
|
||||
* Copyright (C) 2007, 2008, 2010, 2011 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2013 g10 Code GmbH
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "mpi.h"
|
||||
#include "cipher.h"
|
||||
#include "context.h"
|
||||
#include "ec-context.h"
|
||||
#include "pubkey-internal.h"
|
||||
#include "ecc-common.h"
|
||||
|
||||
|
||||
/* Compute an ECDSA signature.
|
||||
* Return the signature struct (r,s) from the message hash. The caller
|
||||
* must have allocated R and S.
|
||||
*/
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_ecdsa_sign (gcry_mpi_t input, ECC_secret_key *skey,
|
||||
gcry_mpi_t r, gcry_mpi_t s,
|
||||
int flags, int hashalgo)
|
||||
{
|
||||
gpg_err_code_t rc = 0;
|
||||
int extraloops = 0;
|
||||
gcry_mpi_t k, dr, sum, k_1, x;
|
||||
mpi_point_struct I;
|
||||
gcry_mpi_t hash;
|
||||
const void *abuf;
|
||||
unsigned int abits, qbits;
|
||||
mpi_ec_t ctx;
|
||||
|
||||
if (DBG_CIPHER)
|
||||
log_mpidump ("ecdsa sign hash ", input );
|
||||
|
||||
qbits = mpi_get_nbits (skey->E.n);
|
||||
|
||||
/* Convert the INPUT into an MPI if needed. */
|
||||
rc = _gcry_dsa_normalize_hash (input, &hash, qbits);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
k = NULL;
|
||||
dr = mpi_alloc (0);
|
||||
sum = mpi_alloc (0);
|
||||
k_1 = mpi_alloc (0);
|
||||
x = mpi_alloc (0);
|
||||
point_init (&I);
|
||||
|
||||
ctx = _gcry_mpi_ec_p_internal_new (skey->E.model, skey->E.dialect, 0,
|
||||
skey->E.p, skey->E.a, skey->E.b);
|
||||
|
||||
/* Two loops to avoid R or S are zero. This is more of a joke than
|
||||
a real demand because the probability of them being zero is less
|
||||
than any hardware failure. Some specs however require it. */
|
||||
do
|
||||
{
|
||||
do
|
||||
{
|
||||
mpi_free (k);
|
||||
k = NULL;
|
||||
if ((flags & PUBKEY_FLAG_RFC6979) && hashalgo)
|
||||
{
|
||||
/* Use Pornin's method for deterministic DSA. If this
|
||||
flag is set, it is expected that HASH is an opaque
|
||||
MPI with the to be signed hash. That hash is also
|
||||
used as h1 from 3.2.a. */
|
||||
if (!mpi_is_opaque (input))
|
||||
{
|
||||
rc = GPG_ERR_CONFLICT;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
abuf = mpi_get_opaque (input, &abits);
|
||||
rc = _gcry_dsa_gen_rfc6979_k (&k, skey->E.n, skey->d,
|
||||
abuf, (abits+7)/8,
|
||||
hashalgo, extraloops);
|
||||
if (rc)
|
||||
goto leave;
|
||||
extraloops++;
|
||||
}
|
||||
else
|
||||
k = _gcry_dsa_gen_k (skey->E.n, GCRY_STRONG_RANDOM);
|
||||
|
||||
_gcry_mpi_ec_mul_point (&I, k, &skey->E.G, ctx);
|
||||
if (_gcry_mpi_ec_get_affine (x, NULL, &I, ctx))
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("ecc sign: Failed to get affine coordinates\n");
|
||||
rc = GPG_ERR_BAD_SIGNATURE;
|
||||
goto leave;
|
||||
}
|
||||
mpi_mod (r, x, skey->E.n); /* r = x mod n */
|
||||
}
|
||||
while (!mpi_cmp_ui (r, 0));
|
||||
|
||||
mpi_mulm (dr, skey->d, r, skey->E.n); /* dr = d*r mod n */
|
||||
mpi_addm (sum, hash, dr, skey->E.n); /* sum = hash + (d*r) mod n */
|
||||
mpi_invm (k_1, k, skey->E.n); /* k_1 = k^(-1) mod n */
|
||||
mpi_mulm (s, k_1, sum, skey->E.n); /* s = k^(-1)*(hash+(d*r)) mod n */
|
||||
}
|
||||
while (!mpi_cmp_ui (s, 0));
|
||||
|
||||
if (DBG_CIPHER)
|
||||
{
|
||||
log_mpidump ("ecdsa sign result r ", r);
|
||||
log_mpidump ("ecdsa sign result s ", s);
|
||||
}
|
||||
|
||||
leave:
|
||||
_gcry_mpi_ec_free (ctx);
|
||||
point_free (&I);
|
||||
mpi_free (x);
|
||||
mpi_free (k_1);
|
||||
mpi_free (sum);
|
||||
mpi_free (dr);
|
||||
mpi_free (k);
|
||||
|
||||
if (hash != input)
|
||||
mpi_free (hash);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Verify an ECDSA signature.
|
||||
* Check if R and S verifies INPUT.
|
||||
*/
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_ecdsa_verify (gcry_mpi_t input, ECC_public_key *pkey,
|
||||
gcry_mpi_t r, gcry_mpi_t s)
|
||||
{
|
||||
gpg_err_code_t err = 0;
|
||||
gcry_mpi_t hash, h, h1, h2, x;
|
||||
mpi_point_struct Q, Q1, Q2;
|
||||
mpi_ec_t ctx;
|
||||
unsigned int nbits;
|
||||
|
||||
if( !(mpi_cmp_ui (r, 0) > 0 && mpi_cmp (r, pkey->E.n) < 0) )
|
||||
return GPG_ERR_BAD_SIGNATURE; /* Assertion 0 < r < n failed. */
|
||||
if( !(mpi_cmp_ui (s, 0) > 0 && mpi_cmp (s, pkey->E.n) < 0) )
|
||||
return GPG_ERR_BAD_SIGNATURE; /* Assertion 0 < s < n failed. */
|
||||
|
||||
nbits = mpi_get_nbits (pkey->E.n);
|
||||
err = _gcry_dsa_normalize_hash (input, &hash, nbits);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
h = mpi_alloc (0);
|
||||
h1 = mpi_alloc (0);
|
||||
h2 = mpi_alloc (0);
|
||||
x = mpi_alloc (0);
|
||||
point_init (&Q);
|
||||
point_init (&Q1);
|
||||
point_init (&Q2);
|
||||
|
||||
ctx = _gcry_mpi_ec_p_internal_new (pkey->E.model, pkey->E.dialect, 0,
|
||||
pkey->E.p, pkey->E.a, pkey->E.b);
|
||||
|
||||
/* h = s^(-1) (mod n) */
|
||||
mpi_invm (h, s, pkey->E.n);
|
||||
/* h1 = hash * s^(-1) (mod n) */
|
||||
mpi_mulm (h1, hash, h, pkey->E.n);
|
||||
/* Q1 = [ hash * s^(-1) ]G */
|
||||
_gcry_mpi_ec_mul_point (&Q1, h1, &pkey->E.G, ctx);
|
||||
/* h2 = r * s^(-1) (mod n) */
|
||||
mpi_mulm (h2, r, h, pkey->E.n);
|
||||
/* Q2 = [ r * s^(-1) ]Q */
|
||||
_gcry_mpi_ec_mul_point (&Q2, h2, &pkey->Q, ctx);
|
||||
/* Q = ([hash * s^(-1)]G) + ([r * s^(-1)]Q) */
|
||||
_gcry_mpi_ec_add_points (&Q, &Q1, &Q2, ctx);
|
||||
|
||||
if (!mpi_cmp_ui (Q.z, 0))
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("ecc verify: Rejected\n");
|
||||
err = GPG_ERR_BAD_SIGNATURE;
|
||||
goto leave;
|
||||
}
|
||||
if (_gcry_mpi_ec_get_affine (x, NULL, &Q, ctx))
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("ecc verify: Failed to get affine coordinates\n");
|
||||
err = GPG_ERR_BAD_SIGNATURE;
|
||||
goto leave;
|
||||
}
|
||||
mpi_mod (x, x, pkey->E.n); /* x = x mod E_n */
|
||||
if (mpi_cmp (x, r)) /* x != r */
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
{
|
||||
log_mpidump (" x", x);
|
||||
log_mpidump (" r", r);
|
||||
log_mpidump (" s", s);
|
||||
}
|
||||
err = GPG_ERR_BAD_SIGNATURE;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
leave:
|
||||
_gcry_mpi_ec_free (ctx);
|
||||
point_free (&Q2);
|
||||
point_free (&Q1);
|
||||
point_free (&Q);
|
||||
mpi_free (x);
|
||||
mpi_free (h2);
|
||||
mpi_free (h1);
|
||||
mpi_free (h);
|
||||
if (hash != input)
|
||||
mpi_free (hash);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -0,0 +1,840 @@
|
||||
/* ecc-eddsa.c - Elliptic Curve EdDSA signatures
|
||||
* Copyright (C) 2013, 2014 g10 Code GmbH
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "mpi.h"
|
||||
#include "cipher.h"
|
||||
#include "context.h"
|
||||
#include "ec-context.h"
|
||||
#include "ecc-common.h"
|
||||
|
||||
|
||||
|
||||
static void
|
||||
reverse_buffer (unsigned char *buffer, unsigned int length)
|
||||
{
|
||||
unsigned int tmp, i;
|
||||
|
||||
for (i=0; i < length/2; i++)
|
||||
{
|
||||
tmp = buffer[i];
|
||||
buffer[i] = buffer[length-1-i];
|
||||
buffer[length-1-i] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Helper to scan a hex string. */
|
||||
static gcry_mpi_t
|
||||
scanval (const char *string)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
gcry_mpi_t val;
|
||||
|
||||
rc = _gcry_mpi_scan (&val, GCRYMPI_FMT_HEX, string, 0, NULL);
|
||||
if (rc)
|
||||
log_fatal ("scanning ECC parameter failed: %s\n", gpg_strerror (rc));
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Encode MPI using the EdDSA scheme. MINLEN specifies the required
|
||||
length of the buffer in bytes. On success 0 is returned an a
|
||||
malloced buffer with the encoded point is stored at R_BUFFER; the
|
||||
length of this buffer is stored at R_BUFLEN. */
|
||||
static gpg_err_code_t
|
||||
eddsa_encodempi (gcry_mpi_t mpi, unsigned int minlen,
|
||||
unsigned char **r_buffer, unsigned int *r_buflen)
|
||||
{
|
||||
unsigned char *rawmpi;
|
||||
unsigned int rawmpilen;
|
||||
|
||||
rawmpi = _gcry_mpi_get_buffer (mpi, minlen, &rawmpilen, NULL);
|
||||
if (!rawmpi)
|
||||
return gpg_err_code_from_syserror ();
|
||||
|
||||
*r_buffer = rawmpi;
|
||||
*r_buflen = rawmpilen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Encode (X,Y) using the EdDSA scheme. MINLEN is the required length
|
||||
in bytes for the result. If WITH_PREFIX is set the returned buffer
|
||||
is prefixed with a 0x40 byte. On success 0 is returned and a
|
||||
malloced buffer with the encoded point is stored at R_BUFFER; the
|
||||
length of this buffer is stored at R_BUFLEN. */
|
||||
static gpg_err_code_t
|
||||
eddsa_encode_x_y (gcry_mpi_t x, gcry_mpi_t y, unsigned int minlen,
|
||||
int with_prefix,
|
||||
unsigned char **r_buffer, unsigned int *r_buflen)
|
||||
{
|
||||
unsigned char *rawmpi;
|
||||
unsigned int rawmpilen;
|
||||
int off = with_prefix? 1:0;
|
||||
|
||||
rawmpi = _gcry_mpi_get_buffer_extra (y, minlen, off?-1:0, &rawmpilen, NULL);
|
||||
if (!rawmpi)
|
||||
return gpg_err_code_from_syserror ();
|
||||
if (mpi_test_bit (x, 0) && rawmpilen)
|
||||
rawmpi[off + rawmpilen - 1] |= 0x80; /* Set sign bit. */
|
||||
if (off)
|
||||
rawmpi[0] = 0x40;
|
||||
|
||||
*r_buffer = rawmpi;
|
||||
*r_buflen = rawmpilen + off;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Encode POINT using the EdDSA scheme. X and Y are either scratch
|
||||
variables supplied by the caller or NULL. CTX is the usual
|
||||
context. If WITH_PREFIX is set the returned buffer is prefixed
|
||||
with a 0x40 byte. On success 0 is returned and a malloced buffer
|
||||
with the encoded point is stored at R_BUFFER; the length of this
|
||||
buffer is stored at R_BUFLEN. */
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_eddsa_encodepoint (mpi_point_t point, mpi_ec_t ec,
|
||||
gcry_mpi_t x_in, gcry_mpi_t y_in,
|
||||
int with_prefix,
|
||||
unsigned char **r_buffer, unsigned int *r_buflen)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
gcry_mpi_t x, y;
|
||||
|
||||
x = x_in? x_in : mpi_new (0);
|
||||
y = y_in? y_in : mpi_new (0);
|
||||
|
||||
if (_gcry_mpi_ec_get_affine (x, y, point, ec))
|
||||
{
|
||||
log_error ("eddsa_encodepoint: Failed to get affine coordinates\n");
|
||||
rc = GPG_ERR_INTERNAL;
|
||||
}
|
||||
else
|
||||
rc = eddsa_encode_x_y (x, y, ec->nbits/8, with_prefix, r_buffer, r_buflen);
|
||||
|
||||
if (!x_in)
|
||||
mpi_free (x);
|
||||
if (!y_in)
|
||||
mpi_free (y);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Make sure that the opaque MPI VALUE is in compact EdDSA format.
|
||||
This function updates MPI if needed. */
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_eddsa_ensure_compact (gcry_mpi_t value, unsigned int nbits)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
const unsigned char *buf;
|
||||
unsigned int rawmpilen;
|
||||
gcry_mpi_t x, y;
|
||||
unsigned char *enc;
|
||||
unsigned int enclen;
|
||||
|
||||
if (!mpi_is_opaque (value))
|
||||
return GPG_ERR_INV_OBJ;
|
||||
buf = mpi_get_opaque (value, &rawmpilen);
|
||||
if (!buf)
|
||||
return GPG_ERR_INV_OBJ;
|
||||
rawmpilen = (rawmpilen + 7)/8;
|
||||
|
||||
if (rawmpilen > 1 && (rawmpilen%2))
|
||||
{
|
||||
if (buf[0] == 0x04)
|
||||
{
|
||||
/* Buffer is in SEC1 uncompressed format. Extract y and
|
||||
compress. */
|
||||
rc = _gcry_mpi_scan (&x, GCRYMPI_FMT_STD,
|
||||
buf+1, (rawmpilen-1)/2, NULL);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = _gcry_mpi_scan (&y, GCRYMPI_FMT_STD,
|
||||
buf+1+(rawmpilen-1)/2, (rawmpilen-1)/2, NULL);
|
||||
if (rc)
|
||||
{
|
||||
mpi_free (x);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = eddsa_encode_x_y (x, y, nbits/8, 0, &enc, &enclen);
|
||||
mpi_free (x);
|
||||
mpi_free (y);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
mpi_set_opaque (value, enc, 8*enclen);
|
||||
}
|
||||
else if (buf[0] == 0x40)
|
||||
{
|
||||
/* Buffer is compressed but with our SEC1 alike compression
|
||||
indicator. Remove that byte. FIXME: We should write and
|
||||
use a function to manipulate an opaque MPI in place. */
|
||||
if (!_gcry_mpi_set_opaque_copy (value, buf + 1, (rawmpilen - 1)*8))
|
||||
return gpg_err_code_from_syserror ();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Recover X from Y and SIGN (which actually is a parity bit). */
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_eddsa_recover_x (gcry_mpi_t x, gcry_mpi_t y, int sign, mpi_ec_t ec)
|
||||
{
|
||||
gpg_err_code_t rc = 0;
|
||||
gcry_mpi_t u, v, v3, t;
|
||||
static gcry_mpi_t p58, seven;
|
||||
|
||||
if (ec->dialect != ECC_DIALECT_ED25519)
|
||||
return GPG_ERR_NOT_IMPLEMENTED;
|
||||
|
||||
if (!p58)
|
||||
p58 = scanval ("0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD");
|
||||
if (!seven)
|
||||
seven = mpi_set_ui (NULL, 7);
|
||||
|
||||
u = mpi_new (0);
|
||||
v = mpi_new (0);
|
||||
v3 = mpi_new (0);
|
||||
t = mpi_new (0);
|
||||
|
||||
/* Compute u and v */
|
||||
/* u = y^2 */
|
||||
mpi_mulm (u, y, y, ec->p);
|
||||
/* v = b*y^2 */
|
||||
mpi_mulm (v, ec->b, u, ec->p);
|
||||
/* u = y^2-1 */
|
||||
mpi_sub_ui (u, u, 1);
|
||||
/* v = b*y^2+1 */
|
||||
mpi_add_ui (v, v, 1);
|
||||
|
||||
/* Compute sqrt(u/v) */
|
||||
/* v3 = v^3 */
|
||||
mpi_powm (v3, v, mpi_const (MPI_C_THREE), ec->p);
|
||||
/* t = v3 * v3 * u * v = u * v^7 */
|
||||
mpi_powm (t, v, seven, ec->p);
|
||||
mpi_mulm (t, t, u, ec->p);
|
||||
/* t = t^((p-5)/8) = (u * v^7)^((p-5)/8) */
|
||||
mpi_powm (t, t, p58, ec->p);
|
||||
/* x = t * u * v^3 = (u * v^3) * (u * v^7)^((p-5)/8) */
|
||||
mpi_mulm (t, t, u, ec->p);
|
||||
mpi_mulm (x, t, v3, ec->p);
|
||||
|
||||
/* Adjust if needed. */
|
||||
/* t = v * x^2 */
|
||||
mpi_mulm (t, x, x, ec->p);
|
||||
mpi_mulm (t, t, v, ec->p);
|
||||
/* -t == u ? x = x * sqrt(-1) */
|
||||
mpi_neg (t, t);
|
||||
if (!mpi_cmp (t, u))
|
||||
{
|
||||
static gcry_mpi_t m1; /* Fixme: this is not thread-safe. */
|
||||
if (!m1)
|
||||
m1 = scanval ("2B8324804FC1DF0B2B4D00993DFBD7A7"
|
||||
"2F431806AD2FE478C4EE1B274A0EA0B0");
|
||||
mpi_mulm (x, x, m1, ec->p);
|
||||
/* t = v * x^2 */
|
||||
mpi_mulm (t, x, x, ec->p);
|
||||
mpi_mulm (t, t, v, ec->p);
|
||||
/* -t == u ? x = x * sqrt(-1) */
|
||||
mpi_neg (t, t);
|
||||
if (!mpi_cmp (t, u))
|
||||
rc = GPG_ERR_INV_OBJ;
|
||||
}
|
||||
|
||||
/* Choose the desired square root according to parity */
|
||||
if (mpi_test_bit (x, 0) != !!sign)
|
||||
mpi_sub (x, ec->p, x);
|
||||
|
||||
mpi_free (t);
|
||||
mpi_free (v3);
|
||||
mpi_free (v);
|
||||
mpi_free (u);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Decode the EdDSA style encoded PK and set it into RESULT. CTX is
|
||||
the usual curve context. If R_ENCPK is not NULL, the encoded PK is
|
||||
stored at that address; this is a new copy to be released by the
|
||||
caller. In contrast to the supplied PK, this is not an MPI and
|
||||
thus guaranteed to be properly padded. R_ENCPKLEN receives the
|
||||
length of that encoded key. */
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_eddsa_decodepoint (gcry_mpi_t pk, mpi_ec_t ctx, mpi_point_t result,
|
||||
unsigned char **r_encpk, unsigned int *r_encpklen)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
unsigned char *rawmpi;
|
||||
unsigned int rawmpilen;
|
||||
int sign;
|
||||
|
||||
if (mpi_is_opaque (pk))
|
||||
{
|
||||
const unsigned char *buf;
|
||||
|
||||
buf = mpi_get_opaque (pk, &rawmpilen);
|
||||
if (!buf)
|
||||
return GPG_ERR_INV_OBJ;
|
||||
rawmpilen = (rawmpilen + 7)/8;
|
||||
|
||||
/* Handle compression prefixes. The size of the buffer will be
|
||||
odd in this case. */
|
||||
if (rawmpilen > 1 && (rawmpilen%2))
|
||||
{
|
||||
/* First check whether the public key has been given in
|
||||
standard uncompressed format (SEC1). No need to recover
|
||||
x in this case. */
|
||||
if (buf[0] == 0x04)
|
||||
{
|
||||
gcry_mpi_t x, y;
|
||||
|
||||
rc = _gcry_mpi_scan (&x, GCRYMPI_FMT_STD,
|
||||
buf+1, (rawmpilen-1)/2, NULL);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = _gcry_mpi_scan (&y, GCRYMPI_FMT_STD,
|
||||
buf+1+(rawmpilen-1)/2, (rawmpilen-1)/2,NULL);
|
||||
if (rc)
|
||||
{
|
||||
mpi_free (x);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (r_encpk)
|
||||
{
|
||||
rc = eddsa_encode_x_y (x, y, ctx->nbits/8, 0,
|
||||
r_encpk, r_encpklen);
|
||||
if (rc)
|
||||
{
|
||||
mpi_free (x);
|
||||
mpi_free (y);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
mpi_snatch (result->x, x);
|
||||
mpi_snatch (result->y, y);
|
||||
mpi_set_ui (result->z, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check whether the public key has been prefixed with a 0x40
|
||||
byte to explicitly indicate compressed format using a SEC1
|
||||
alike prefix byte. This is a Libgcrypt extension. */
|
||||
if (buf[0] == 0x40)
|
||||
{
|
||||
rawmpilen--;
|
||||
buf++;
|
||||
}
|
||||
}
|
||||
|
||||
/* EdDSA compressed point. */
|
||||
rawmpi = xtrymalloc (rawmpilen? rawmpilen:1);
|
||||
if (!rawmpi)
|
||||
return gpg_err_code_from_syserror ();
|
||||
memcpy (rawmpi, buf, rawmpilen);
|
||||
reverse_buffer (rawmpi, rawmpilen);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Note: Without using an opaque MPI it is not reliable possible
|
||||
to find out whether the public key has been given in
|
||||
uncompressed format. Thus we expect native EdDSA format. */
|
||||
rawmpi = _gcry_mpi_get_buffer (pk, ctx->nbits/8, &rawmpilen, NULL);
|
||||
if (!rawmpi)
|
||||
return gpg_err_code_from_syserror ();
|
||||
}
|
||||
|
||||
if (rawmpilen)
|
||||
{
|
||||
sign = !!(rawmpi[0] & 0x80);
|
||||
rawmpi[0] &= 0x7f;
|
||||
}
|
||||
else
|
||||
sign = 0;
|
||||
_gcry_mpi_set_buffer (result->y, rawmpi, rawmpilen, 0);
|
||||
if (r_encpk)
|
||||
{
|
||||
/* Revert to little endian. */
|
||||
if (sign && rawmpilen)
|
||||
rawmpi[0] |= 0x80;
|
||||
reverse_buffer (rawmpi, rawmpilen);
|
||||
*r_encpk = rawmpi;
|
||||
if (r_encpklen)
|
||||
*r_encpklen = rawmpilen;
|
||||
}
|
||||
else
|
||||
xfree (rawmpi);
|
||||
|
||||
rc = _gcry_ecc_eddsa_recover_x (result->x, result->y, sign, ctx);
|
||||
mpi_set_ui (result->z, 1);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Compute the A value as used by EdDSA. The caller needs to provide
|
||||
the context EC and the actual secret D as an MPI. The function
|
||||
returns a newly allocated 64 byte buffer at r_digest; the first 32
|
||||
bytes represent the A value. NULL is returned on error and NULL
|
||||
stored at R_DIGEST. */
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_eddsa_compute_h_d (unsigned char **r_digest,
|
||||
gcry_mpi_t d, mpi_ec_t ec)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
unsigned char *rawmpi = NULL;
|
||||
unsigned int rawmpilen;
|
||||
unsigned char *digest;
|
||||
gcry_buffer_t hvec[2];
|
||||
int hashalgo, b;
|
||||
|
||||
*r_digest = NULL;
|
||||
|
||||
hashalgo = GCRY_MD_SHA512;
|
||||
if (hashalgo != GCRY_MD_SHA512)
|
||||
return GPG_ERR_DIGEST_ALGO;
|
||||
|
||||
b = (ec->nbits+7)/8;
|
||||
if (b != 256/8)
|
||||
return GPG_ERR_INTERNAL; /* We only support 256 bit. */
|
||||
|
||||
/* Note that we clear DIGEST so we can use it as input to left pad
|
||||
the key with zeroes for hashing. */
|
||||
digest = xtrycalloc_secure (2, b);
|
||||
if (!digest)
|
||||
return gpg_err_code_from_syserror ();
|
||||
|
||||
memset (hvec, 0, sizeof hvec);
|
||||
|
||||
rawmpi = _gcry_mpi_get_buffer (d, 0, &rawmpilen, NULL);
|
||||
if (!rawmpi)
|
||||
{
|
||||
xfree (digest);
|
||||
return gpg_err_code_from_syserror ();
|
||||
}
|
||||
|
||||
hvec[0].data = digest;
|
||||
hvec[0].off = 0;
|
||||
hvec[0].len = b > rawmpilen? b - rawmpilen : 0;
|
||||
hvec[1].data = rawmpi;
|
||||
hvec[1].off = 0;
|
||||
hvec[1].len = rawmpilen;
|
||||
rc = _gcry_md_hash_buffers (hashalgo, 0, digest, hvec, 2);
|
||||
xfree (rawmpi);
|
||||
if (rc)
|
||||
{
|
||||
xfree (digest);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Compute the A value. */
|
||||
reverse_buffer (digest, 32); /* Only the first half of the hash. */
|
||||
digest[0] = (digest[0] & 0x7f) | 0x40;
|
||||
digest[31] &= 0xf8;
|
||||
|
||||
*r_digest = digest;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Ed25519 version of the key generation. */
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_eddsa_genkey (ECC_secret_key *sk, elliptic_curve_t *E, mpi_ec_t ctx,
|
||||
gcry_random_level_t random_level)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
int b = 256/8; /* The only size we currently support. */
|
||||
gcry_mpi_t a, x, y;
|
||||
mpi_point_struct Q;
|
||||
char *dbuf;
|
||||
size_t dlen;
|
||||
gcry_buffer_t hvec[1];
|
||||
unsigned char *hash_d = NULL;
|
||||
|
||||
point_init (&Q);
|
||||
memset (hvec, 0, sizeof hvec);
|
||||
|
||||
a = mpi_snew (0);
|
||||
x = mpi_new (0);
|
||||
y = mpi_new (0);
|
||||
|
||||
/* Generate a secret. */
|
||||
hash_d = xtrymalloc_secure (2*b);
|
||||
if (!hash_d)
|
||||
{
|
||||
rc = gpg_error_from_syserror ();
|
||||
goto leave;
|
||||
}
|
||||
dlen = b;
|
||||
dbuf = _gcry_random_bytes_secure (dlen, random_level);
|
||||
|
||||
/* Compute the A value. */
|
||||
hvec[0].data = dbuf;
|
||||
hvec[0].len = dlen;
|
||||
rc = _gcry_md_hash_buffers (GCRY_MD_SHA512, 0, hash_d, hvec, 1);
|
||||
if (rc)
|
||||
goto leave;
|
||||
sk->d = _gcry_mpi_set_opaque (NULL, dbuf, dlen*8);
|
||||
dbuf = NULL;
|
||||
reverse_buffer (hash_d, 32); /* Only the first half of the hash. */
|
||||
hash_d[0] = (hash_d[0] & 0x7f) | 0x40;
|
||||
hash_d[31] &= 0xf8;
|
||||
_gcry_mpi_set_buffer (a, hash_d, 32, 0);
|
||||
xfree (hash_d); hash_d = NULL;
|
||||
/* log_printmpi ("ecgen a", a); */
|
||||
|
||||
/* Compute Q. */
|
||||
_gcry_mpi_ec_mul_point (&Q, a, &E->G, ctx);
|
||||
if (DBG_CIPHER)
|
||||
log_printpnt ("ecgen pk", &Q, ctx);
|
||||
|
||||
/* Copy the stuff to the key structures. */
|
||||
sk->E.model = E->model;
|
||||
sk->E.dialect = E->dialect;
|
||||
sk->E.p = mpi_copy (E->p);
|
||||
sk->E.a = mpi_copy (E->a);
|
||||
sk->E.b = mpi_copy (E->b);
|
||||
point_init (&sk->E.G);
|
||||
point_set (&sk->E.G, &E->G);
|
||||
sk->E.n = mpi_copy (E->n);
|
||||
point_init (&sk->Q);
|
||||
point_set (&sk->Q, &Q);
|
||||
|
||||
leave:
|
||||
point_free (&Q);
|
||||
_gcry_mpi_release (a);
|
||||
_gcry_mpi_release (x);
|
||||
_gcry_mpi_release (y);
|
||||
xfree (hash_d);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Compute an EdDSA signature. See:
|
||||
* [ed25519] 23pp. (PDF) Daniel J. Bernstein, Niels Duif, Tanja
|
||||
* Lange, Peter Schwabe, Bo-Yin Yang. High-speed high-security
|
||||
* signatures. Journal of Cryptographic Engineering 2 (2012), 77-89.
|
||||
* Document ID: a1a62a2f76d23f65d622484ddd09caf8.
|
||||
* URL: http://cr.yp.to/papers.html#ed25519. Date: 2011.09.26.
|
||||
*
|
||||
* Despite that this function requires the specification of a hash
|
||||
* algorithm, we only support what has been specified by the paper.
|
||||
* This may change in the future. Note that we don't check the used
|
||||
* curve; the user is responsible to use Ed25519.
|
||||
*
|
||||
* Return the signature struct (r,s) from the message hash. The caller
|
||||
* must have allocated R_R and S.
|
||||
*/
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_eddsa_sign (gcry_mpi_t input, ECC_secret_key *skey,
|
||||
gcry_mpi_t r_r, gcry_mpi_t s, int hashalgo, gcry_mpi_t pk)
|
||||
{
|
||||
int rc;
|
||||
mpi_ec_t ctx = NULL;
|
||||
int b;
|
||||
unsigned int tmp;
|
||||
unsigned char *digest;
|
||||
gcry_buffer_t hvec[3];
|
||||
const void *mbuf;
|
||||
size_t mlen;
|
||||
unsigned char *rawmpi = NULL;
|
||||
unsigned int rawmpilen;
|
||||
unsigned char *encpk = NULL; /* Encoded public key. */
|
||||
unsigned int encpklen;
|
||||
mpi_point_struct I; /* Intermediate value. */
|
||||
mpi_point_struct Q; /* Public key. */
|
||||
gcry_mpi_t a, x, y, r;
|
||||
|
||||
memset (hvec, 0, sizeof hvec);
|
||||
|
||||
if (!mpi_is_opaque (input))
|
||||
return GPG_ERR_INV_DATA;
|
||||
|
||||
/* Initialize some helpers. */
|
||||
point_init (&I);
|
||||
point_init (&Q);
|
||||
a = mpi_snew (0);
|
||||
x = mpi_new (0);
|
||||
y = mpi_new (0);
|
||||
r = mpi_new (0);
|
||||
ctx = _gcry_mpi_ec_p_internal_new (skey->E.model, skey->E.dialect, 0,
|
||||
skey->E.p, skey->E.a, skey->E.b);
|
||||
b = (ctx->nbits+7)/8;
|
||||
if (b != 256/8)
|
||||
return GPG_ERR_INTERNAL; /* We only support 256 bit. */
|
||||
|
||||
rc = _gcry_ecc_eddsa_compute_h_d (&digest, skey->d, ctx);
|
||||
if (rc)
|
||||
goto leave;
|
||||
_gcry_mpi_set_buffer (a, digest, 32, 0);
|
||||
|
||||
/* Compute the public key if it has not been supplied as optional
|
||||
parameter. */
|
||||
if (pk)
|
||||
{
|
||||
rc = _gcry_ecc_eddsa_decodepoint (pk, ctx, &Q, &encpk, &encpklen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
if (DBG_CIPHER)
|
||||
log_printhex ("* e_pk", encpk, encpklen);
|
||||
if (!_gcry_mpi_ec_curve_point (&Q, ctx))
|
||||
{
|
||||
rc = GPG_ERR_BROKEN_PUBKEY;
|
||||
goto leave;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_gcry_mpi_ec_mul_point (&Q, a, &skey->E.G, ctx);
|
||||
rc = _gcry_ecc_eddsa_encodepoint (&Q, ctx, x, y, 0, &encpk, &encpklen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" e_pk", encpk, encpklen);
|
||||
}
|
||||
|
||||
/* Compute R. */
|
||||
mbuf = mpi_get_opaque (input, &tmp);
|
||||
mlen = (tmp +7)/8;
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" m", mbuf, mlen);
|
||||
|
||||
hvec[0].data = digest;
|
||||
hvec[0].off = 32;
|
||||
hvec[0].len = 32;
|
||||
hvec[1].data = (char*)mbuf;
|
||||
hvec[1].len = mlen;
|
||||
rc = _gcry_md_hash_buffers (hashalgo, 0, digest, hvec, 2);
|
||||
if (rc)
|
||||
goto leave;
|
||||
reverse_buffer (digest, 64);
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" r", digest, 64);
|
||||
_gcry_mpi_set_buffer (r, digest, 64, 0);
|
||||
_gcry_mpi_ec_mul_point (&I, r, &skey->E.G, ctx);
|
||||
if (DBG_CIPHER)
|
||||
log_printpnt (" r", &I, ctx);
|
||||
|
||||
/* Convert R into affine coordinates and apply encoding. */
|
||||
rc = _gcry_ecc_eddsa_encodepoint (&I, ctx, x, y, 0, &rawmpi, &rawmpilen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" e_r", rawmpi, rawmpilen);
|
||||
|
||||
/* S = r + a * H(encodepoint(R) + encodepoint(pk) + m) mod n */
|
||||
hvec[0].data = rawmpi; /* (this is R) */
|
||||
hvec[0].off = 0;
|
||||
hvec[0].len = rawmpilen;
|
||||
hvec[1].data = encpk;
|
||||
hvec[1].off = 0;
|
||||
hvec[1].len = encpklen;
|
||||
hvec[2].data = (char*)mbuf;
|
||||
hvec[2].off = 0;
|
||||
hvec[2].len = mlen;
|
||||
rc = _gcry_md_hash_buffers (hashalgo, 0, digest, hvec, 3);
|
||||
if (rc)
|
||||
goto leave;
|
||||
|
||||
/* No more need for RAWMPI thus we now transfer it to R_R. */
|
||||
mpi_set_opaque (r_r, rawmpi, rawmpilen*8);
|
||||
rawmpi = NULL;
|
||||
|
||||
reverse_buffer (digest, 64);
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" H(R+)", digest, 64);
|
||||
_gcry_mpi_set_buffer (s, digest, 64, 0);
|
||||
mpi_mulm (s, s, a, skey->E.n);
|
||||
mpi_addm (s, s, r, skey->E.n);
|
||||
rc = eddsa_encodempi (s, b, &rawmpi, &rawmpilen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" e_s", rawmpi, rawmpilen);
|
||||
mpi_set_opaque (s, rawmpi, rawmpilen*8);
|
||||
rawmpi = NULL;
|
||||
|
||||
rc = 0;
|
||||
|
||||
leave:
|
||||
_gcry_mpi_release (a);
|
||||
_gcry_mpi_release (x);
|
||||
_gcry_mpi_release (y);
|
||||
_gcry_mpi_release (r);
|
||||
xfree (digest);
|
||||
_gcry_mpi_ec_free (ctx);
|
||||
point_free (&I);
|
||||
point_free (&Q);
|
||||
xfree (encpk);
|
||||
xfree (rawmpi);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Verify an EdDSA signature. See sign_eddsa for the reference.
|
||||
* Check if R_IN and S_IN verifies INPUT. PKEY has the curve
|
||||
* parameters and PK is the EdDSA style encoded public key.
|
||||
*/
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_eddsa_verify (gcry_mpi_t input, ECC_public_key *pkey,
|
||||
gcry_mpi_t r_in, gcry_mpi_t s_in, int hashalgo,
|
||||
gcry_mpi_t pk)
|
||||
{
|
||||
int rc;
|
||||
mpi_ec_t ctx = NULL;
|
||||
int b;
|
||||
unsigned int tmp;
|
||||
mpi_point_struct Q; /* Public key. */
|
||||
unsigned char *encpk = NULL; /* Encoded public key. */
|
||||
unsigned int encpklen;
|
||||
const void *mbuf, *rbuf;
|
||||
unsigned char *tbuf = NULL;
|
||||
size_t mlen, rlen;
|
||||
unsigned int tlen;
|
||||
unsigned char digest[64];
|
||||
gcry_buffer_t hvec[3];
|
||||
gcry_mpi_t h, s;
|
||||
mpi_point_struct Ia, Ib;
|
||||
|
||||
if (!mpi_is_opaque (input) || !mpi_is_opaque (r_in) || !mpi_is_opaque (s_in))
|
||||
return GPG_ERR_INV_DATA;
|
||||
if (hashalgo != GCRY_MD_SHA512)
|
||||
return GPG_ERR_DIGEST_ALGO;
|
||||
|
||||
point_init (&Q);
|
||||
point_init (&Ia);
|
||||
point_init (&Ib);
|
||||
h = mpi_new (0);
|
||||
s = mpi_new (0);
|
||||
|
||||
ctx = _gcry_mpi_ec_p_internal_new (pkey->E.model, pkey->E.dialect, 0,
|
||||
pkey->E.p, pkey->E.a, pkey->E.b);
|
||||
b = ctx->nbits/8;
|
||||
if (b != 256/8)
|
||||
return GPG_ERR_INTERNAL; /* We only support 256 bit. */
|
||||
|
||||
/* Decode and check the public key. */
|
||||
rc = _gcry_ecc_eddsa_decodepoint (pk, ctx, &Q, &encpk, &encpklen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
if (!_gcry_mpi_ec_curve_point (&Q, ctx))
|
||||
{
|
||||
rc = GPG_ERR_BROKEN_PUBKEY;
|
||||
goto leave;
|
||||
}
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" e_pk", encpk, encpklen);
|
||||
if (encpklen != b)
|
||||
{
|
||||
rc = GPG_ERR_INV_LENGTH;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* Convert the other input parameters. */
|
||||
mbuf = mpi_get_opaque (input, &tmp);
|
||||
mlen = (tmp +7)/8;
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" m", mbuf, mlen);
|
||||
rbuf = mpi_get_opaque (r_in, &tmp);
|
||||
rlen = (tmp +7)/8;
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" r", rbuf, rlen);
|
||||
if (rlen != b)
|
||||
{
|
||||
rc = GPG_ERR_INV_LENGTH;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* h = H(encodepoint(R) + encodepoint(pk) + m) */
|
||||
hvec[0].data = (char*)rbuf;
|
||||
hvec[0].off = 0;
|
||||
hvec[0].len = rlen;
|
||||
hvec[1].data = encpk;
|
||||
hvec[1].off = 0;
|
||||
hvec[1].len = encpklen;
|
||||
hvec[2].data = (char*)mbuf;
|
||||
hvec[2].off = 0;
|
||||
hvec[2].len = mlen;
|
||||
rc = _gcry_md_hash_buffers (hashalgo, 0, digest, hvec, 3);
|
||||
if (rc)
|
||||
goto leave;
|
||||
reverse_buffer (digest, 64);
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" H(R+)", digest, 64);
|
||||
_gcry_mpi_set_buffer (h, digest, 64, 0);
|
||||
|
||||
/* According to the paper the best way for verification is:
|
||||
encodepoint(sG - h·Q) = encodepoint(r)
|
||||
because we don't need to decode R. */
|
||||
{
|
||||
void *sbuf;
|
||||
unsigned int slen;
|
||||
|
||||
sbuf = _gcry_mpi_get_opaque_copy (s_in, &tmp);
|
||||
slen = (tmp +7)/8;
|
||||
reverse_buffer (sbuf, slen);
|
||||
if (DBG_CIPHER)
|
||||
log_printhex (" s", sbuf, slen);
|
||||
_gcry_mpi_set_buffer (s, sbuf, slen, 0);
|
||||
xfree (sbuf);
|
||||
if (slen != b)
|
||||
{
|
||||
rc = GPG_ERR_INV_LENGTH;
|
||||
goto leave;
|
||||
}
|
||||
}
|
||||
|
||||
_gcry_mpi_ec_mul_point (&Ia, s, &pkey->E.G, ctx);
|
||||
_gcry_mpi_ec_mul_point (&Ib, h, &Q, ctx);
|
||||
_gcry_mpi_neg (Ib.x, Ib.x);
|
||||
_gcry_mpi_ec_add_points (&Ia, &Ia, &Ib, ctx);
|
||||
rc = _gcry_ecc_eddsa_encodepoint (&Ia, ctx, s, h, 0, &tbuf, &tlen);
|
||||
if (rc)
|
||||
goto leave;
|
||||
if (tlen != rlen || memcmp (tbuf, rbuf, tlen))
|
||||
{
|
||||
rc = GPG_ERR_BAD_SIGNATURE;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
rc = 0;
|
||||
|
||||
leave:
|
||||
xfree (encpk);
|
||||
xfree (tbuf);
|
||||
_gcry_mpi_ec_free (ctx);
|
||||
_gcry_mpi_release (s);
|
||||
_gcry_mpi_release (h);
|
||||
point_free (&Ia);
|
||||
point_free (&Ib);
|
||||
point_free (&Q);
|
||||
return rc;
|
||||
}
|
||||
@@ -0,0 +1,233 @@
|
||||
/* ecc-gots.c - Elliptic Curve GOST signatures
|
||||
* Copyright (C) 2007, 2008, 2010, 2011 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2013 Dmitry Eremin-Solenikov
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "mpi.h"
|
||||
#include "cipher.h"
|
||||
#include "context.h"
|
||||
#include "ec-context.h"
|
||||
#include "ecc-common.h"
|
||||
#include "pubkey-internal.h"
|
||||
|
||||
|
||||
/* Compute an GOST R 34.10-01/-12 signature.
|
||||
* Return the signature struct (r,s) from the message hash. The caller
|
||||
* must have allocated R and S.
|
||||
*/
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_gost_sign (gcry_mpi_t input, ECC_secret_key *skey,
|
||||
gcry_mpi_t r, gcry_mpi_t s)
|
||||
{
|
||||
gpg_err_code_t rc = 0;
|
||||
gcry_mpi_t k, dr, sum, ke, x, e;
|
||||
mpi_point_struct I;
|
||||
gcry_mpi_t hash;
|
||||
const void *abuf;
|
||||
unsigned int abits, qbits;
|
||||
mpi_ec_t ctx;
|
||||
|
||||
if (DBG_CIPHER)
|
||||
log_mpidump ("gost sign hash ", input );
|
||||
|
||||
qbits = mpi_get_nbits (skey->E.n);
|
||||
|
||||
/* Convert the INPUT into an MPI if needed. */
|
||||
if (mpi_is_opaque (input))
|
||||
{
|
||||
abuf = mpi_get_opaque (input, &abits);
|
||||
rc = _gcry_mpi_scan (&hash, GCRYMPI_FMT_USG, abuf, (abits+7)/8, NULL);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (abits > qbits)
|
||||
mpi_rshift (hash, hash, abits - qbits);
|
||||
}
|
||||
else
|
||||
hash = input;
|
||||
|
||||
|
||||
k = NULL;
|
||||
dr = mpi_alloc (0);
|
||||
sum = mpi_alloc (0);
|
||||
ke = mpi_alloc (0);
|
||||
e = mpi_alloc (0);
|
||||
x = mpi_alloc (0);
|
||||
point_init (&I);
|
||||
|
||||
ctx = _gcry_mpi_ec_p_internal_new (skey->E.model, skey->E.dialect, 0,
|
||||
skey->E.p, skey->E.a, skey->E.b);
|
||||
|
||||
mpi_mod (e, input, skey->E.n); /* e = hash mod n */
|
||||
|
||||
if (!mpi_cmp_ui (e, 0))
|
||||
mpi_set_ui (e, 1);
|
||||
|
||||
/* Two loops to avoid R or S are zero. This is more of a joke than
|
||||
a real demand because the probability of them being zero is less
|
||||
than any hardware failure. Some specs however require it. */
|
||||
do
|
||||
{
|
||||
do
|
||||
{
|
||||
mpi_free (k);
|
||||
k = _gcry_dsa_gen_k (skey->E.n, GCRY_STRONG_RANDOM);
|
||||
|
||||
_gcry_mpi_ec_mul_point (&I, k, &skey->E.G, ctx);
|
||||
if (_gcry_mpi_ec_get_affine (x, NULL, &I, ctx))
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("ecc sign: Failed to get affine coordinates\n");
|
||||
rc = GPG_ERR_BAD_SIGNATURE;
|
||||
goto leave;
|
||||
}
|
||||
mpi_mod (r, x, skey->E.n); /* r = x mod n */
|
||||
}
|
||||
while (!mpi_cmp_ui (r, 0));
|
||||
mpi_mulm (dr, skey->d, r, skey->E.n); /* dr = d*r mod n */
|
||||
mpi_mulm (ke, k, e, skey->E.n); /* ke = k*e mod n */
|
||||
mpi_addm (s, ke, dr, skey->E.n); /* sum = (k*e+ d*r) mod n */
|
||||
}
|
||||
while (!mpi_cmp_ui (s, 0));
|
||||
|
||||
if (DBG_CIPHER)
|
||||
{
|
||||
log_mpidump ("gost sign result r ", r);
|
||||
log_mpidump ("gost sign result s ", s);
|
||||
}
|
||||
|
||||
leave:
|
||||
_gcry_mpi_ec_free (ctx);
|
||||
point_free (&I);
|
||||
mpi_free (x);
|
||||
mpi_free (e);
|
||||
mpi_free (ke);
|
||||
mpi_free (sum);
|
||||
mpi_free (dr);
|
||||
mpi_free (k);
|
||||
|
||||
if (hash != input)
|
||||
mpi_free (hash);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Verify a GOST R 34.10-01/-12 signature.
|
||||
* Check if R and S verifies INPUT.
|
||||
*/
|
||||
gpg_err_code_t
|
||||
_gcry_ecc_gost_verify (gcry_mpi_t input, ECC_public_key *pkey,
|
||||
gcry_mpi_t r, gcry_mpi_t s)
|
||||
{
|
||||
gpg_err_code_t err = 0;
|
||||
gcry_mpi_t e, x, z1, z2, v, rv, zero;
|
||||
mpi_point_struct Q, Q1, Q2;
|
||||
mpi_ec_t ctx;
|
||||
|
||||
if( !(mpi_cmp_ui (r, 0) > 0 && mpi_cmp (r, pkey->E.n) < 0) )
|
||||
return GPG_ERR_BAD_SIGNATURE; /* Assertion 0 < r < n failed. */
|
||||
if( !(mpi_cmp_ui (s, 0) > 0 && mpi_cmp (s, pkey->E.n) < 0) )
|
||||
return GPG_ERR_BAD_SIGNATURE; /* Assertion 0 < s < n failed. */
|
||||
|
||||
x = mpi_alloc (0);
|
||||
e = mpi_alloc (0);
|
||||
z1 = mpi_alloc (0);
|
||||
z2 = mpi_alloc (0);
|
||||
v = mpi_alloc (0);
|
||||
rv = mpi_alloc (0);
|
||||
zero = mpi_alloc (0);
|
||||
|
||||
point_init (&Q);
|
||||
point_init (&Q1);
|
||||
point_init (&Q2);
|
||||
|
||||
ctx = _gcry_mpi_ec_p_internal_new (pkey->E.model, pkey->E.dialect, 0,
|
||||
pkey->E.p, pkey->E.a, pkey->E.b);
|
||||
|
||||
mpi_mod (e, input, pkey->E.n); /* e = hash mod n */
|
||||
if (!mpi_cmp_ui (e, 0))
|
||||
mpi_set_ui (e, 1);
|
||||
mpi_invm (v, e, pkey->E.n); /* v = e^(-1) (mod n) */
|
||||
mpi_mulm (z1, s, v, pkey->E.n); /* z1 = s*v (mod n) */
|
||||
mpi_mulm (rv, r, v, pkey->E.n); /* rv = s*v (mod n) */
|
||||
mpi_subm (z2, zero, rv, pkey->E.n); /* z2 = -r*v (mod n) */
|
||||
|
||||
_gcry_mpi_ec_mul_point (&Q1, z1, &pkey->E.G, ctx);
|
||||
/* log_mpidump ("Q1.x", Q1.x); */
|
||||
/* log_mpidump ("Q1.y", Q1.y); */
|
||||
/* log_mpidump ("Q1.z", Q1.z); */
|
||||
_gcry_mpi_ec_mul_point (&Q2, z2, &pkey->Q, ctx);
|
||||
/* log_mpidump ("Q2.x", Q2.x); */
|
||||
/* log_mpidump ("Q2.y", Q2.y); */
|
||||
/* log_mpidump ("Q2.z", Q2.z); */
|
||||
_gcry_mpi_ec_add_points (&Q, &Q1, &Q2, ctx);
|
||||
/* log_mpidump (" Q.x", Q.x); */
|
||||
/* log_mpidump (" Q.y", Q.y); */
|
||||
/* log_mpidump (" Q.z", Q.z); */
|
||||
|
||||
if (!mpi_cmp_ui (Q.z, 0))
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("ecc verify: Rejected\n");
|
||||
err = GPG_ERR_BAD_SIGNATURE;
|
||||
goto leave;
|
||||
}
|
||||
if (_gcry_mpi_ec_get_affine (x, NULL, &Q, ctx))
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("ecc verify: Failed to get affine coordinates\n");
|
||||
err = GPG_ERR_BAD_SIGNATURE;
|
||||
goto leave;
|
||||
}
|
||||
mpi_mod (x, x, pkey->E.n); /* x = x mod E_n */
|
||||
if (mpi_cmp (x, r)) /* x != r */
|
||||
{
|
||||
if (DBG_CIPHER)
|
||||
{
|
||||
log_mpidump (" x", x);
|
||||
log_mpidump (" r", r);
|
||||
log_mpidump (" s", s);
|
||||
log_debug ("ecc verify: Not verified\n");
|
||||
}
|
||||
err = GPG_ERR_BAD_SIGNATURE;
|
||||
goto leave;
|
||||
}
|
||||
if (DBG_CIPHER)
|
||||
log_debug ("ecc verify: Accepted\n");
|
||||
|
||||
leave:
|
||||
_gcry_mpi_ec_free (ctx);
|
||||
point_free (&Q2);
|
||||
point_free (&Q1);
|
||||
point_free (&Q);
|
||||
mpi_free (zero);
|
||||
mpi_free (rv);
|
||||
mpi_free (v);
|
||||
mpi_free (z2);
|
||||
mpi_free (z1);
|
||||
mpi_free (x);
|
||||
mpi_free (e);
|
||||
return err;
|
||||
}
|
||||
@@ -0,0 +1,287 @@
|
||||
/* ecc-misc.c - Elliptic Curve miscellaneous functions
|
||||
* Copyright (C) 2007, 2008, 2010, 2011 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2013 g10 Code GmbH
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "mpi.h"
|
||||
#include "cipher.h"
|
||||
#include "context.h"
|
||||
#include "ec-context.h"
|
||||
#include "ecc-common.h"
|
||||
|
||||
|
||||
/*
|
||||
* Release a curve object.
|
||||
*/
|
||||
void
|
||||
_gcry_ecc_curve_free (elliptic_curve_t *E)
|
||||
{
|
||||
mpi_free (E->p); E->p = NULL;
|
||||
mpi_free (E->a); E->a = NULL;
|
||||
mpi_free (E->b); E->b = NULL;
|
||||
_gcry_mpi_point_free_parts (&E->G);
|
||||
mpi_free (E->n); E->n = NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return a copy of a curve object.
|
||||
*/
|
||||
elliptic_curve_t
|
||||
_gcry_ecc_curve_copy (elliptic_curve_t E)
|
||||
{
|
||||
elliptic_curve_t R;
|
||||
|
||||
R.model = E.model;
|
||||
R.dialect = E.dialect;
|
||||
R.name = E.name;
|
||||
R.p = mpi_copy (E.p);
|
||||
R.a = mpi_copy (E.a);
|
||||
R.b = mpi_copy (E.b);
|
||||
_gcry_mpi_point_init (&R.G);
|
||||
point_set (&R.G, &E.G);
|
||||
R.n = mpi_copy (E.n);
|
||||
|
||||
return R;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return a description of the curve model.
|
||||
*/
|
||||
const char *
|
||||
_gcry_ecc_model2str (enum gcry_mpi_ec_models model)
|
||||
{
|
||||
const char *str = "?";
|
||||
switch (model)
|
||||
{
|
||||
case MPI_EC_WEIERSTRASS: str = "Weierstrass"; break;
|
||||
case MPI_EC_MONTGOMERY: str = "Montgomery"; break;
|
||||
case MPI_EC_TWISTEDEDWARDS: str = "Twisted Edwards"; break;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return a description of the curve dialect.
|
||||
*/
|
||||
const char *
|
||||
_gcry_ecc_dialect2str (enum ecc_dialects dialect)
|
||||
{
|
||||
const char *str = "?";
|
||||
switch (dialect)
|
||||
{
|
||||
case ECC_DIALECT_STANDARD: str = "Standard"; break;
|
||||
case ECC_DIALECT_ED25519: str = "Ed25519"; break;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
gcry_mpi_t
|
||||
_gcry_ecc_ec2os (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t p)
|
||||
{
|
||||
gpg_err_code_t rc;
|
||||
int pbytes = (mpi_get_nbits (p)+7)/8;
|
||||
size_t n;
|
||||
unsigned char *buf, *ptr;
|
||||
gcry_mpi_t result;
|
||||
|
||||
buf = xmalloc ( 1 + 2*pbytes );
|
||||
*buf = 04; /* Uncompressed point. */
|
||||
ptr = buf+1;
|
||||
rc = _gcry_mpi_print (GCRYMPI_FMT_USG, ptr, pbytes, &n, x);
|
||||
if (rc)
|
||||
log_fatal ("mpi_print failed: %s\n", gpg_strerror (rc));
|
||||
if (n < pbytes)
|
||||
{
|
||||
memmove (ptr+(pbytes-n), ptr, n);
|
||||
memset (ptr, 0, (pbytes-n));
|
||||
}
|
||||
ptr += pbytes;
|
||||
rc = _gcry_mpi_print (GCRYMPI_FMT_USG, ptr, pbytes, &n, y);
|
||||
if (rc)
|
||||
log_fatal ("mpi_print failed: %s\n", gpg_strerror (rc));
|
||||
if (n < pbytes)
|
||||
{
|
||||
memmove (ptr+(pbytes-n), ptr, n);
|
||||
memset (ptr, 0, (pbytes-n));
|
||||
}
|
||||
|
||||
rc = _gcry_mpi_scan (&result, GCRYMPI_FMT_USG, buf, 1+2*pbytes, NULL);
|
||||
if (rc)
|
||||
log_fatal ("mpi_scan failed: %s\n", gpg_strerror (rc));
|
||||
xfree (buf);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Convert POINT into affine coordinates using the context CTX and
|
||||
return a newly allocated MPI. If the conversion is not possible
|
||||
NULL is returned. This function won't print an error message. */
|
||||
gcry_mpi_t
|
||||
_gcry_mpi_ec_ec2os (gcry_mpi_point_t point, mpi_ec_t ectx)
|
||||
{
|
||||
gcry_mpi_t g_x, g_y, result;
|
||||
|
||||
g_x = mpi_new (0);
|
||||
g_y = mpi_new (0);
|
||||
if (_gcry_mpi_ec_get_affine (g_x, g_y, point, ectx))
|
||||
result = NULL;
|
||||
else
|
||||
result = _gcry_ecc_ec2os (g_x, g_y, ectx->p);
|
||||
mpi_free (g_x);
|
||||
mpi_free (g_y);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* RESULT must have been initialized and is set on success to the
|
||||
point given by VALUE. */
|
||||
gcry_err_code_t
|
||||
_gcry_ecc_os2ec (mpi_point_t result, gcry_mpi_t value)
|
||||
{
|
||||
gcry_err_code_t rc;
|
||||
size_t n;
|
||||
const unsigned char *buf;
|
||||
unsigned char *buf_memory;
|
||||
gcry_mpi_t x, y;
|
||||
|
||||
if (mpi_is_opaque (value))
|
||||
{
|
||||
unsigned int nbits;
|
||||
|
||||
buf = mpi_get_opaque (value, &nbits);
|
||||
if (!buf)
|
||||
return GPG_ERR_INV_OBJ;
|
||||
n = (nbits + 7)/8;
|
||||
buf_memory = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
n = (mpi_get_nbits (value)+7)/8;
|
||||
buf_memory = xmalloc (n);
|
||||
rc = _gcry_mpi_print (GCRYMPI_FMT_USG, buf_memory, n, &n, value);
|
||||
if (rc)
|
||||
{
|
||||
xfree (buf_memory);
|
||||
return rc;
|
||||
}
|
||||
buf = buf_memory;
|
||||
}
|
||||
|
||||
if (n < 1)
|
||||
{
|
||||
xfree (buf_memory);
|
||||
return GPG_ERR_INV_OBJ;
|
||||
}
|
||||
if (*buf != 4)
|
||||
{
|
||||
xfree (buf_memory);
|
||||
return GPG_ERR_NOT_IMPLEMENTED; /* No support for point compression. */
|
||||
}
|
||||
if ( ((n-1)%2) )
|
||||
{
|
||||
xfree (buf_memory);
|
||||
return GPG_ERR_INV_OBJ;
|
||||
}
|
||||
n = (n-1)/2;
|
||||
rc = _gcry_mpi_scan (&x, GCRYMPI_FMT_USG, buf+1, n, NULL);
|
||||
if (rc)
|
||||
{
|
||||
xfree (buf_memory);
|
||||
return rc;
|
||||
}
|
||||
rc = _gcry_mpi_scan (&y, GCRYMPI_FMT_USG, buf+1+n, n, NULL);
|
||||
xfree (buf_memory);
|
||||
if (rc)
|
||||
{
|
||||
mpi_free (x);
|
||||
return rc;
|
||||
}
|
||||
|
||||
mpi_set (result->x, x);
|
||||
mpi_set (result->y, y);
|
||||
mpi_set_ui (result->z, 1);
|
||||
|
||||
mpi_free (x);
|
||||
mpi_free (y);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Compute the public key from the the context EC. Obviously a
|
||||
requirement is that the secret key is available in EC. On success
|
||||
Q is returned; on error NULL. If Q is NULL a newly allocated point
|
||||
is returned. If G or D are given they override the values taken
|
||||
from EC. */
|
||||
mpi_point_t
|
||||
_gcry_ecc_compute_public (mpi_point_t Q, mpi_ec_t ec,
|
||||
mpi_point_t G, gcry_mpi_t d)
|
||||
{
|
||||
if (!G)
|
||||
G = ec->G;
|
||||
if (!d)
|
||||
d = ec->d;
|
||||
|
||||
if (!d || !G || !ec->p || !ec->a)
|
||||
return NULL;
|
||||
if (ec->model == MPI_EC_TWISTEDEDWARDS && !ec->b)
|
||||
return NULL;
|
||||
|
||||
if (ec->dialect == ECC_DIALECT_ED25519
|
||||
&& (ec->flags & PUBKEY_FLAG_EDDSA))
|
||||
{
|
||||
gcry_mpi_t a;
|
||||
unsigned char *digest;
|
||||
|
||||
if (_gcry_ecc_eddsa_compute_h_d (&digest, d, ec))
|
||||
return NULL;
|
||||
|
||||
a = mpi_snew (0);
|
||||
_gcry_mpi_set_buffer (a, digest, 32, 0);
|
||||
xfree (digest);
|
||||
|
||||
/* And finally the public key. */
|
||||
if (!Q)
|
||||
Q = mpi_point_new (0);
|
||||
if (Q)
|
||||
_gcry_mpi_ec_mul_point (Q, a, G, ec);
|
||||
mpi_free (a);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!Q)
|
||||
Q = mpi_point_new (0);
|
||||
if (Q)
|
||||
_gcry_mpi_ec_mul_point (Q, d, G, ec);
|
||||
}
|
||||
|
||||
return Q;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,31 @@
|
||||
/* gost.h - GOST 28147-89 implementation
|
||||
* Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _GCRY_GOST_H
|
||||
#define _GCRY_GOST_H
|
||||
|
||||
typedef struct {
|
||||
u32 key[8];
|
||||
} GOST28147_context;
|
||||
|
||||
/* This is a simple interface that will be used by GOST R 34.11-94 */
|
||||
extern unsigned int _gcry_gost_enc_one (GOST28147_context *c, const byte *key,
|
||||
byte *out, byte *in);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,452 @@
|
||||
/* gost28147.c - GOST 28147-89 implementation for Libgcrypt
|
||||
* Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* GOST 28147-89 defines several modes of encryption:
|
||||
* - ECB which should be used only for key transfer
|
||||
* - CFB mode
|
||||
* - OFB-like mode with additional transformation on keystream
|
||||
* RFC 5830 names this 'counter encryption' mode
|
||||
* Original GOST text uses the term 'gammirovanie'
|
||||
* - MAC mode
|
||||
*
|
||||
* This implementation handles ECB and CFB modes via usual libgcrypt handling.
|
||||
* OFB-like and MAC modes are unsupported.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "types.h"
|
||||
#include "g10lib.h"
|
||||
#include "cipher.h"
|
||||
|
||||
|
||||
/* This is an s-box from RFC4357, named GostR3411-94-TestParamSet
|
||||
* For now it is the only s-box supported, as libgcrypt lacks mechanism
|
||||
* for passing parameters to cipher in a usefull way.
|
||||
* S-boxes was modified from 4->4 to 8->8 bits unit with precalculated
|
||||
* shift and rotation by optimisation reasons.
|
||||
*/
|
||||
static const u32 test_sbox[4][256] = {
|
||||
/* 0 */
|
||||
{ 0x00072000, 0x00075000, 0x00074800, 0x00071000,
|
||||
0x00076800, 0x00074000, 0x00070000, 0x00077000,
|
||||
0x00073000, 0x00075800, 0x00070800, 0x00076000,
|
||||
0x00073800, 0x00077800, 0x00072800, 0x00071800,
|
||||
0x0005a000, 0x0005d000, 0x0005c800, 0x00059000,
|
||||
0x0005e800, 0x0005c000, 0x00058000, 0x0005f000,
|
||||
0x0005b000, 0x0005d800, 0x00058800, 0x0005e000,
|
||||
0x0005b800, 0X0005F800, 0x0005a800, 0x00059800,
|
||||
0x00022000, 0x00025000, 0x00024800, 0x00021000,
|
||||
0x00026800, 0x00024000, 0x00020000, 0x00027000,
|
||||
0X00023000, 0x00025800, 0x00020800, 0x00026000,
|
||||
0x00023800, 0x00027800, 0x00022800, 0x00021800,
|
||||
0x00062000, 0x00065000, 0x00064800, 0x00061000,
|
||||
0x00066800, 0x00064000, 0x00060000, 0x00067000,
|
||||
0x00063000, 0x00065800, 0x00060800, 0x00066000,
|
||||
0x00063800, 0x00067800, 0x00062800, 0x00061800,
|
||||
0x00032000, 0x00035000, 0x00034800, 0x00031000,
|
||||
0x00036800, 0x00034000, 0x00030000, 0x00037000,
|
||||
0x00033000, 0x00035800, 0x00030800, 0x00036000,
|
||||
0x00033800, 0x00037800, 0x00032800, 0x00031800,
|
||||
0x0006a000, 0x0006d000, 0x0006c800, 0x00069000,
|
||||
0x0006e800, 0x0006c000, 0x00068000, 0x0006f000,
|
||||
0x0006b000, 0x0006d800, 0x00068800, 0x0006e000,
|
||||
0x0006b800, 0x0006f800, 0x0006a800, 0x00069800,
|
||||
0x0007a000, 0x0007d000, 0x0007c800, 0x00079000,
|
||||
0x0007e800, 0x0007c000, 0x00078000, 0x0007f000,
|
||||
0x0007b000, 0x0007d800, 0x00078800, 0x0007e000,
|
||||
0x0007b800, 0x0007f800, 0x0007a800, 0x00079800,
|
||||
0x00052000, 0x00055000, 0x00054800, 0x00051000,
|
||||
0x00056800, 0x00054000, 0x00050000, 0x00057000,
|
||||
0x00053000, 0x00055800, 0x00050800, 0x00056000,
|
||||
0x00053800, 0x00057800, 0x00052800, 0x00051800,
|
||||
0x00012000, 0x00015000, 0x00014800, 0x00011000,
|
||||
0x00016800, 0x00014000, 0x00010000, 0x00017000,
|
||||
0x00013000, 0x00015800, 0x00010800, 0x00016000,
|
||||
0x00013800, 0x00017800, 0x00012800, 0x00011800,
|
||||
0x0001a000, 0x0001d000, 0x0001c800, 0x00019000,
|
||||
0x0001e800, 0x0001c000, 0x00018000, 0x0001f000,
|
||||
0x0001b000, 0x0001d800, 0x00018800, 0x0001e000,
|
||||
0x0001b800, 0x0001f800, 0x0001a800, 0x00019800,
|
||||
0x00042000, 0x00045000, 0x00044800, 0x00041000,
|
||||
0x00046800, 0x00044000, 0x00040000, 0x00047000,
|
||||
0x00043000, 0x00045800, 0x00040800, 0x00046000,
|
||||
0x00043800, 0x00047800, 0x00042800, 0x00041800,
|
||||
0x0000a000, 0x0000d000, 0x0000c800, 0x00009000,
|
||||
0x0000e800, 0x0000c000, 0x00008000, 0x0000f000,
|
||||
0x0000b000, 0x0000d800, 0x00008800, 0x0000e000,
|
||||
0x0000b800, 0x0000f800, 0x0000a800, 0x00009800,
|
||||
0x00002000, 0x00005000, 0x00004800, 0x00001000,
|
||||
0x00006800, 0x00004000, 0x00000000, 0x00007000,
|
||||
0x00003000, 0x00005800, 0x00000800, 0x00006000,
|
||||
0x00003800, 0x00007800, 0x00002800, 0x00001800,
|
||||
0x0003a000, 0x0003d000, 0x0003c800, 0x00039000,
|
||||
0x0003e800, 0x0003c000, 0x00038000, 0x0003f000,
|
||||
0x0003b000, 0x0003d800, 0x00038800, 0x0003e000,
|
||||
0x0003b800, 0x0003f800, 0x0003a800, 0x00039800,
|
||||
0x0002a000, 0x0002d000, 0x0002c800, 0x00029000,
|
||||
0x0002e800, 0x0002c000, 0x00028000, 0x0002f000,
|
||||
0x0002b000, 0x0002d800, 0x00028800, 0x0002e000,
|
||||
0x0002b800, 0x0002f800, 0x0002a800, 0x00029800,
|
||||
0x0004a000, 0x0004d000, 0x0004c800, 0x00049000,
|
||||
0x0004e800, 0x0004c000, 0x00048000, 0x0004f000,
|
||||
0x0004b000, 0x0004d800, 0x00048800, 0x0004e000,
|
||||
0x0004b800, 0x0004f800, 0x0004a800, 0x00049800 },
|
||||
/* 1 */
|
||||
{ 0x03a80000, 0x03c00000, 0x03880000, 0x03e80000,
|
||||
0x03d00000, 0x03980000, 0x03a00000, 0x03900000,
|
||||
0x03f00000, 0x03f80000, 0x03e00000, 0x03b80000,
|
||||
0x03b00000, 0x03800000, 0x03c80000, 0x03d80000,
|
||||
0x06a80000, 0x06c00000, 0x06880000, 0x06e80000,
|
||||
0x06d00000, 0x06980000, 0x06a00000, 0x06900000,
|
||||
0x06f00000, 0x06f80000, 0x06e00000, 0x06b80000,
|
||||
0x06b00000, 0x06800000, 0x06c80000, 0x06d80000,
|
||||
0x05280000, 0x05400000, 0x05080000, 0x05680000,
|
||||
0x05500000, 0x05180000, 0x05200000, 0x05100000,
|
||||
0x05700000, 0x05780000, 0x05600000, 0x05380000,
|
||||
0x05300000, 0x05000000, 0x05480000, 0x05580000,
|
||||
0x00a80000, 0x00c00000, 0x00880000, 0x00e80000,
|
||||
0x00d00000, 0x00980000, 0x00a00000, 0x00900000,
|
||||
0x00f00000, 0x00f80000, 0x00e00000, 0x00b80000,
|
||||
0x00b00000, 0x00800000, 0x00c80000, 0x00d80000,
|
||||
0x00280000, 0x00400000, 0x00080000, 0x00680000,
|
||||
0x00500000, 0x00180000, 0x00200000, 0x00100000,
|
||||
0x00700000, 0x00780000, 0x00600000, 0x00380000,
|
||||
0x00300000, 0x00000000, 0x00480000, 0x00580000,
|
||||
0x04280000, 0x04400000, 0x04080000, 0x04680000,
|
||||
0x04500000, 0x04180000, 0x04200000, 0x04100000,
|
||||
0x04700000, 0x04780000, 0x04600000, 0x04380000,
|
||||
0x04300000, 0x04000000, 0x04480000, 0x04580000,
|
||||
0x04a80000, 0x04c00000, 0x04880000, 0x04e80000,
|
||||
0x04d00000, 0x04980000, 0x04a00000, 0x04900000,
|
||||
0x04f00000, 0x04f80000, 0x04e00000, 0x04b80000,
|
||||
0x04b00000, 0x04800000, 0x04c80000, 0x04d80000,
|
||||
0x07a80000, 0x07c00000, 0x07880000, 0x07e80000,
|
||||
0x07d00000, 0x07980000, 0x07a00000, 0x07900000,
|
||||
0x07f00000, 0x07f80000, 0x07e00000, 0x07b80000,
|
||||
0x07b00000, 0x07800000, 0x07c80000, 0x07d80000,
|
||||
0x07280000, 0x07400000, 0x07080000, 0x07680000,
|
||||
0x07500000, 0x07180000, 0x07200000, 0x07100000,
|
||||
0x07700000, 0x07780000, 0x07600000, 0x07380000,
|
||||
0x07300000, 0x07000000, 0x07480000, 0x07580000,
|
||||
0x02280000, 0x02400000, 0x02080000, 0x02680000,
|
||||
0x02500000, 0x02180000, 0x02200000, 0x02100000,
|
||||
0x02700000, 0x02780000, 0x02600000, 0x02380000,
|
||||
0x02300000, 0x02000000, 0x02480000, 0x02580000,
|
||||
0x03280000, 0x03400000, 0x03080000, 0x03680000,
|
||||
0x03500000, 0x03180000, 0x03200000, 0x03100000,
|
||||
0x03700000, 0x03780000, 0x03600000, 0x03380000,
|
||||
0x03300000, 0x03000000, 0x03480000, 0x03580000,
|
||||
0x06280000, 0x06400000, 0x06080000, 0x06680000,
|
||||
0x06500000, 0x06180000, 0x06200000, 0x06100000,
|
||||
0x06700000, 0x06780000, 0x06600000, 0x06380000,
|
||||
0x06300000, 0x06000000, 0x06480000, 0x06580000,
|
||||
0x05a80000, 0x05c00000, 0x05880000, 0x05e80000,
|
||||
0x05d00000, 0x05980000, 0x05a00000, 0x05900000,
|
||||
0x05f00000, 0x05f80000, 0x05e00000, 0x05b80000,
|
||||
0x05b00000, 0x05800000, 0x05c80000, 0x05d80000,
|
||||
0x01280000, 0x01400000, 0x01080000, 0x01680000,
|
||||
0x01500000, 0x01180000, 0x01200000, 0x01100000,
|
||||
0x01700000, 0x01780000, 0x01600000, 0x01380000,
|
||||
0x01300000, 0x01000000, 0x01480000, 0x01580000,
|
||||
0x02a80000, 0x02c00000, 0x02880000, 0x02e80000,
|
||||
0x02d00000, 0x02980000, 0x02a00000, 0x02900000,
|
||||
0x02f00000, 0x02f80000, 0x02e00000, 0x02b80000,
|
||||
0x02b00000, 0x02800000, 0x02c80000, 0x02d80000,
|
||||
0x01a80000, 0x01c00000, 0x01880000, 0x01e80000,
|
||||
0x01d00000, 0x01980000, 0x01a00000, 0x01900000,
|
||||
0x01f00000, 0x01f80000, 0x01e00000, 0x01b80000,
|
||||
0x01b00000, 0x01800000, 0x01c80000, 0x01d80000 },
|
||||
/* 2 */
|
||||
{ 0x30000002, 0x60000002, 0x38000002, 0x08000002,
|
||||
0x28000002, 0x78000002, 0x68000002, 0x40000002,
|
||||
0x20000002, 0x50000002, 0x48000002, 0x70000002,
|
||||
0x00000002, 0x18000002, 0x58000002, 0x10000002,
|
||||
0xb0000005, 0xe0000005, 0xb8000005, 0x88000005,
|
||||
0xa8000005, 0xf8000005, 0xe8000005, 0xc0000005,
|
||||
0xa0000005, 0xd0000005, 0xc8000005, 0xf0000005,
|
||||
0x80000005, 0x98000005, 0xd8000005, 0x90000005,
|
||||
0x30000005, 0x60000005, 0x38000005, 0x08000005,
|
||||
0x28000005, 0x78000005, 0x68000005, 0x40000005,
|
||||
0x20000005, 0x50000005, 0x48000005, 0x70000005,
|
||||
0x00000005, 0x18000005, 0x58000005, 0x10000005,
|
||||
0x30000000, 0x60000000, 0x38000000, 0x08000000,
|
||||
0x28000000, 0x78000000, 0x68000000, 0x40000000,
|
||||
0x20000000, 0x50000000, 0x48000000, 0x70000000,
|
||||
0x00000000, 0x18000000, 0x58000000, 0x10000000,
|
||||
0xb0000003, 0xe0000003, 0xb8000003, 0x88000003,
|
||||
0xa8000003, 0xf8000003, 0xe8000003, 0xc0000003,
|
||||
0xa0000003, 0xd0000003, 0xc8000003, 0xf0000003,
|
||||
0x80000003, 0x98000003, 0xd8000003, 0x90000003,
|
||||
0x30000001, 0x60000001, 0x38000001, 0x08000001,
|
||||
0x28000001, 0x78000001, 0x68000001, 0x40000001,
|
||||
0x20000001, 0x50000001, 0x48000001, 0x70000001,
|
||||
0x00000001, 0x18000001, 0x58000001, 0x10000001,
|
||||
0xb0000000, 0xe0000000, 0xb8000000, 0x88000000,
|
||||
0xa8000000, 0xf8000000, 0xe8000000, 0xc0000000,
|
||||
0xa0000000, 0xd0000000, 0xc8000000, 0xf0000000,
|
||||
0x80000000, 0x98000000, 0xd8000000, 0x90000000,
|
||||
0xb0000006, 0xe0000006, 0xb8000006, 0x88000006,
|
||||
0xa8000006, 0xf8000006, 0xe8000006, 0xc0000006,
|
||||
0xa0000006, 0xd0000006, 0xc8000006, 0xf0000006,
|
||||
0x80000006, 0x98000006, 0xd8000006, 0x90000006,
|
||||
0xb0000001, 0xe0000001, 0xb8000001, 0x88000001,
|
||||
0xa8000001, 0xf8000001, 0xe8000001, 0xc0000001,
|
||||
0xa0000001, 0xd0000001, 0xc8000001, 0xf0000001,
|
||||
0x80000001, 0x98000001, 0xd8000001, 0x90000001,
|
||||
0x30000003, 0x60000003, 0x38000003, 0x08000003,
|
||||
0x28000003, 0x78000003, 0x68000003, 0x40000003,
|
||||
0x20000003, 0x50000003, 0x48000003, 0x70000003,
|
||||
0x00000003, 0x18000003, 0x58000003, 0x10000003,
|
||||
0x30000004, 0x60000004, 0x38000004, 0x08000004,
|
||||
0x28000004, 0x78000004, 0x68000004, 0x40000004,
|
||||
0x20000004, 0x50000004, 0x48000004, 0x70000004,
|
||||
0x00000004, 0x18000004, 0x58000004, 0x10000004,
|
||||
0xb0000002, 0xe0000002, 0xb8000002, 0x88000002,
|
||||
0xa8000002, 0xf8000002, 0xe8000002, 0xc0000002,
|
||||
0xa0000002, 0xd0000002, 0xc8000002, 0xf0000002,
|
||||
0x80000002, 0x98000002, 0xd8000002, 0x90000002,
|
||||
0xb0000004, 0xe0000004, 0xb8000004, 0x88000004,
|
||||
0xa8000004, 0xf8000004, 0xe8000004, 0xc0000004,
|
||||
0xa0000004, 0xd0000004, 0xc8000004, 0xf0000004,
|
||||
0x80000004, 0x98000004, 0xd8000004, 0x90000004,
|
||||
0x30000006, 0x60000006, 0x38000006, 0x08000006,
|
||||
0x28000006, 0x78000006, 0x68000006, 0x40000006,
|
||||
0x20000006, 0x50000006, 0x48000006, 0x70000006,
|
||||
0x00000006, 0x18000006, 0x58000006, 0x10000006,
|
||||
0xb0000007, 0xe0000007, 0xb8000007, 0x88000007,
|
||||
0xa8000007, 0xf8000007, 0xe8000007, 0xc0000007,
|
||||
0xa0000007, 0xd0000007, 0xc8000007, 0xf0000007,
|
||||
0x80000007, 0x98000007, 0xd8000007, 0x90000007,
|
||||
0x30000007, 0x60000007, 0x38000007, 0x08000007,
|
||||
0x28000007, 0x78000007, 0x68000007, 0x40000007,
|
||||
0x20000007, 0x50000007, 0x48000007, 0x70000007,
|
||||
0x00000007, 0x18000007, 0x58000007, 0x10000007 },
|
||||
/* 3 */
|
||||
{ 0x000000e8, 0x000000d8, 0x000000a0, 0x00000088,
|
||||
0x00000098, 0x000000f8, 0x000000a8, 0x000000c8,
|
||||
0x00000080, 0x000000d0, 0x000000f0, 0x000000b8,
|
||||
0x000000b0, 0x000000c0, 0x00000090, 0x000000e0,
|
||||
0x000007e8, 0x000007d8, 0x000007a0, 0x00000788,
|
||||
0x00000798, 0x000007f8, 0x000007a8, 0x000007c8,
|
||||
0x00000780, 0x000007d0, 0x000007f0, 0x000007b8,
|
||||
0x000007b0, 0x000007c0, 0x00000790, 0x000007e0,
|
||||
0x000006e8, 0x000006d8, 0x000006a0, 0x00000688,
|
||||
0x00000698, 0x000006f8, 0x000006a8, 0x000006c8,
|
||||
0x00000680, 0x000006d0, 0x000006f0, 0x000006b8,
|
||||
0x000006b0, 0x000006c0, 0x00000690, 0x000006e0,
|
||||
0x00000068, 0x00000058, 0x00000020, 0x00000008,
|
||||
0x00000018, 0x00000078, 0x00000028, 0x00000048,
|
||||
0x00000000, 0x00000050, 0x00000070, 0x00000038,
|
||||
0x00000030, 0x00000040, 0x00000010, 0x00000060,
|
||||
0x000002e8, 0x000002d8, 0x000002a0, 0x00000288,
|
||||
0x00000298, 0x000002f8, 0x000002a8, 0x000002c8,
|
||||
0x00000280, 0x000002d0, 0x000002f0, 0x000002b8,
|
||||
0x000002b0, 0x000002c0, 0x00000290, 0x000002e0,
|
||||
0x000003e8, 0x000003d8, 0x000003a0, 0x00000388,
|
||||
0x00000398, 0x000003f8, 0x000003a8, 0x000003c8,
|
||||
0x00000380, 0x000003d0, 0x000003f0, 0x000003b8,
|
||||
0x000003b0, 0x000003c0, 0x00000390, 0x000003e0,
|
||||
0x00000568, 0x00000558, 0x00000520, 0x00000508,
|
||||
0x00000518, 0x00000578, 0x00000528, 0x00000548,
|
||||
0x00000500, 0x00000550, 0x00000570, 0x00000538,
|
||||
0x00000530, 0x00000540, 0x00000510, 0x00000560,
|
||||
0x00000268, 0x00000258, 0x00000220, 0x00000208,
|
||||
0x00000218, 0x00000278, 0x00000228, 0x00000248,
|
||||
0x00000200, 0x00000250, 0x00000270, 0x00000238,
|
||||
0x00000230, 0x00000240, 0x00000210, 0x00000260,
|
||||
0x000004e8, 0x000004d8, 0x000004a0, 0x00000488,
|
||||
0x00000498, 0x000004f8, 0x000004a8, 0x000004c8,
|
||||
0x00000480, 0x000004d0, 0x000004f0, 0x000004b8,
|
||||
0x000004b0, 0x000004c0, 0x00000490, 0x000004e0,
|
||||
0x00000168, 0x00000158, 0x00000120, 0x00000108,
|
||||
0x00000118, 0x00000178, 0x00000128, 0x00000148,
|
||||
0x00000100, 0x00000150, 0x00000170, 0x00000138,
|
||||
0x00000130, 0x00000140, 0x00000110, 0x00000160,
|
||||
0x000001e8, 0x000001d8, 0x000001a0, 0x00000188,
|
||||
0x00000198, 0x000001f8, 0x000001a8, 0x000001c8,
|
||||
0x00000180, 0x000001d0, 0x000001f0, 0x000001b8,
|
||||
0x000001b0, 0x000001c0, 0x00000190, 0x000001e0,
|
||||
0x00000768, 0x00000758, 0x00000720, 0x00000708,
|
||||
0x00000718, 0x00000778, 0x00000728, 0x00000748,
|
||||
0x00000700, 0x00000750, 0x00000770, 0x00000738,
|
||||
0x00000730, 0x00000740, 0x00000710, 0x00000760,
|
||||
0x00000368, 0x00000358, 0x00000320, 0x00000308,
|
||||
0x00000318, 0x00000378, 0x00000328, 0x00000348,
|
||||
0x00000300, 0x00000350, 0x00000370, 0x00000338,
|
||||
0x00000330, 0x00000340, 0x00000310, 0x00000360,
|
||||
0x000005e8, 0x000005d8, 0x000005a0, 0x00000588,
|
||||
0x00000598, 0x000005f8, 0x000005a8, 0x000005c8,
|
||||
0x00000580, 0x000005d0, 0x000005f0, 0x000005b8,
|
||||
0x000005b0, 0x000005c0, 0x00000590, 0x000005e0,
|
||||
0x00000468, 0x00000458, 0x00000420, 0x00000408,
|
||||
0x00000418, 0x00000478, 0x00000428, 0x00000448,
|
||||
0x00000400, 0x00000450, 0x00000470, 0x00000438,
|
||||
0x00000430, 0x00000440, 0x00000410, 0x00000460,
|
||||
0x00000668, 0x00000658, 0x00000620, 0x00000608,
|
||||
0x00000618, 0x00000678, 0x00000628, 0x00000648,
|
||||
0x00000600, 0x00000650, 0x00000670, 0x00000638,
|
||||
0x00000630, 0x00000640, 0x00000610, 0x00000660 }
|
||||
};
|
||||
|
||||
#include "gost.h"
|
||||
|
||||
static gcry_err_code_t
|
||||
gost_setkey (void *c, const byte *key, unsigned keylen)
|
||||
{
|
||||
int i;
|
||||
GOST28147_context *ctx = c;
|
||||
|
||||
if (keylen != 256 / 8)
|
||||
return GPG_ERR_INV_KEYLEN;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
ctx->key[i] = (key[4 * i + 3] << 24) |
|
||||
(key[4 * i + 2] << 16) |
|
||||
(key[4 * i + 1] << 8) |
|
||||
(key[4 * i + 0] << 0);
|
||||
}
|
||||
return GPG_ERR_NO_ERROR;
|
||||
}
|
||||
|
||||
static u32
|
||||
gost_val (GOST28147_context *ctx, u32 cm1, int subkey)
|
||||
{
|
||||
cm1 += ctx->key[subkey];
|
||||
cm1 = test_sbox[0][ (cm1 >> 0) & 0xff] |
|
||||
test_sbox[1][ (cm1 >> 8) & 0xff] |
|
||||
test_sbox[2][ (cm1 >> 16) & 0xff] |
|
||||
test_sbox[3][ (cm1 >> 24) & 0xff];
|
||||
return cm1;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
gost_encrypt_block (void *c, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
GOST28147_context *ctx = c;
|
||||
u32 n1, n2;
|
||||
|
||||
n1 = (inbuf[0] << 0) |
|
||||
(inbuf[1] << 8) |
|
||||
(inbuf[2] << 16) |
|
||||
(inbuf[3] << 24);
|
||||
n2 = (inbuf[4] << 0) |
|
||||
(inbuf[5] << 8) |
|
||||
(inbuf[6] << 16) |
|
||||
(inbuf[7] << 24);
|
||||
|
||||
n2 ^= gost_val (ctx, n1, 0); n1 ^= gost_val (ctx, n2, 1);
|
||||
n2 ^= gost_val (ctx, n1, 2); n1 ^= gost_val (ctx, n2, 3);
|
||||
n2 ^= gost_val (ctx, n1, 4); n1 ^= gost_val (ctx, n2, 5);
|
||||
n2 ^= gost_val (ctx, n1, 6); n1 ^= gost_val (ctx, n2, 7);
|
||||
|
||||
n2 ^= gost_val (ctx, n1, 0); n1 ^= gost_val (ctx, n2, 1);
|
||||
n2 ^= gost_val (ctx, n1, 2); n1 ^= gost_val (ctx, n2, 3);
|
||||
n2 ^= gost_val (ctx, n1, 4); n1 ^= gost_val (ctx, n2, 5);
|
||||
n2 ^= gost_val (ctx, n1, 6); n1 ^= gost_val (ctx, n2, 7);
|
||||
|
||||
n2 ^= gost_val (ctx, n1, 0); n1 ^= gost_val (ctx, n2, 1);
|
||||
n2 ^= gost_val (ctx, n1, 2); n1 ^= gost_val (ctx, n2, 3);
|
||||
n2 ^= gost_val (ctx, n1, 4); n1 ^= gost_val (ctx, n2, 5);
|
||||
n2 ^= gost_val (ctx, n1, 6); n1 ^= gost_val (ctx, n2, 7);
|
||||
|
||||
n2 ^= gost_val (ctx, n1, 7); n1 ^= gost_val (ctx, n2, 6);
|
||||
n2 ^= gost_val (ctx, n1, 5); n1 ^= gost_val (ctx, n2, 4);
|
||||
n2 ^= gost_val (ctx, n1, 3); n1 ^= gost_val (ctx, n2, 2);
|
||||
n2 ^= gost_val (ctx, n1, 1); n1 ^= gost_val (ctx, n2, 0);
|
||||
|
||||
outbuf[0 + 0] = (n2 >> (0 * 8)) & 0xff;
|
||||
outbuf[1 + 0] = (n2 >> (1 * 8)) & 0xff;
|
||||
outbuf[2 + 0] = (n2 >> (2 * 8)) & 0xff;
|
||||
outbuf[3 + 0] = (n2 >> (3 * 8)) & 0xff;
|
||||
outbuf[0 + 4] = (n1 >> (0 * 8)) & 0xff;
|
||||
outbuf[1 + 4] = (n1 >> (1 * 8)) & 0xff;
|
||||
outbuf[2 + 4] = (n1 >> (2 * 8)) & 0xff;
|
||||
outbuf[3 + 4] = (n1 >> (3 * 8)) & 0xff;
|
||||
|
||||
return /* burn_stack */ 4*sizeof(void*) /* func call */ +
|
||||
3*sizeof(void*) /* stack */ +
|
||||
4*sizeof(void*) /* gost_val call */;
|
||||
}
|
||||
|
||||
unsigned int _gcry_gost_enc_one (GOST28147_context *c, const byte *key,
|
||||
byte *out, byte *in)
|
||||
{
|
||||
gost_setkey (c, key, 32);
|
||||
return gost_encrypt_block (c, out, in) + 5 * sizeof(void *);
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
gost_decrypt_block (void *c, byte *outbuf, const byte *inbuf)
|
||||
{
|
||||
GOST28147_context *ctx = c;
|
||||
u32 n1, n2;
|
||||
|
||||
n1 = (inbuf[0] << 0) |
|
||||
(inbuf[1] << 8) |
|
||||
(inbuf[2] << 16) |
|
||||
(inbuf[3] << 24);
|
||||
n2 = (inbuf[4] << 0) |
|
||||
(inbuf[5] << 8) |
|
||||
(inbuf[6] << 16) |
|
||||
(inbuf[7] << 24);
|
||||
|
||||
n2 ^= gost_val (ctx, n1, 0); n1 ^= gost_val (ctx, n2, 1);
|
||||
n2 ^= gost_val (ctx, n1, 2); n1 ^= gost_val (ctx, n2, 3);
|
||||
n2 ^= gost_val (ctx, n1, 4); n1 ^= gost_val (ctx, n2, 5);
|
||||
n2 ^= gost_val (ctx, n1, 6); n1 ^= gost_val (ctx, n2, 7);
|
||||
|
||||
n2 ^= gost_val (ctx, n1, 7); n1 ^= gost_val (ctx, n2, 6);
|
||||
n2 ^= gost_val (ctx, n1, 5); n1 ^= gost_val (ctx, n2, 4);
|
||||
n2 ^= gost_val (ctx, n1, 3); n1 ^= gost_val (ctx, n2, 2);
|
||||
n2 ^= gost_val (ctx, n1, 1); n1 ^= gost_val (ctx, n2, 0);
|
||||
|
||||
n2 ^= gost_val (ctx, n1, 7); n1 ^= gost_val (ctx, n2, 6);
|
||||
n2 ^= gost_val (ctx, n1, 5); n1 ^= gost_val (ctx, n2, 4);
|
||||
n2 ^= gost_val (ctx, n1, 3); n1 ^= gost_val (ctx, n2, 2);
|
||||
n2 ^= gost_val (ctx, n1, 1); n1 ^= gost_val (ctx, n2, 0);
|
||||
|
||||
n2 ^= gost_val (ctx, n1, 7); n1 ^= gost_val (ctx, n2, 6);
|
||||
n2 ^= gost_val (ctx, n1, 5); n1 ^= gost_val (ctx, n2, 4);
|
||||
n2 ^= gost_val (ctx, n1, 3); n1 ^= gost_val (ctx, n2, 2);
|
||||
n2 ^= gost_val (ctx, n1, 1); n1 ^= gost_val (ctx, n2, 0);
|
||||
|
||||
outbuf[0 + 0] = (n2 >> (0 * 8)) & 0xff;
|
||||
outbuf[1 + 0] = (n2 >> (1 * 8)) & 0xff;
|
||||
outbuf[2 + 0] = (n2 >> (2 * 8)) & 0xff;
|
||||
outbuf[3 + 0] = (n2 >> (3 * 8)) & 0xff;
|
||||
outbuf[0 + 4] = (n1 >> (0 * 8)) & 0xff;
|
||||
outbuf[1 + 4] = (n1 >> (1 * 8)) & 0xff;
|
||||
outbuf[2 + 4] = (n1 >> (2 * 8)) & 0xff;
|
||||
outbuf[3 + 4] = (n1 >> (3 * 8)) & 0xff;
|
||||
|
||||
return /* burn_stack */ 4*sizeof(void*) /* func call */ +
|
||||
3*sizeof(void*) /* stack */ +
|
||||
4*sizeof(void*) /* gost_val call */;
|
||||
}
|
||||
|
||||
gcry_cipher_spec_t _gcry_cipher_spec_gost28147 =
|
||||
{
|
||||
GCRY_CIPHER_GOST28147, {0, 0},
|
||||
"GOST28147", NULL, NULL, 8, 256,
|
||||
sizeof (GOST28147_context),
|
||||
gost_setkey,
|
||||
gost_encrypt_block,
|
||||
gost_decrypt_block,
|
||||
};
|
||||
@@ -0,0 +1,286 @@
|
||||
/* gostr3411-94.c - GOST R 34.11-94 hash function
|
||||
* Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "bithelp.h"
|
||||
#include "cipher.h"
|
||||
#include "hash-common.h"
|
||||
|
||||
#include "gost.h"
|
||||
|
||||
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
||||
|
||||
typedef struct {
|
||||
gcry_md_block_ctx_t bctx;
|
||||
GOST28147_context hd;
|
||||
byte h[32];
|
||||
byte sigma[32];
|
||||
u32 len;
|
||||
} GOSTR3411_CONTEXT;
|
||||
|
||||
static unsigned int
|
||||
transform (void *c, const unsigned char *data);
|
||||
|
||||
static void
|
||||
gost3411_init (void *context, unsigned int flags)
|
||||
{
|
||||
GOSTR3411_CONTEXT *hd = context;
|
||||
|
||||
(void)flags;
|
||||
|
||||
memset (&hd->hd, 0, sizeof(hd->hd));
|
||||
memset (hd->h, 0, 32);
|
||||
memset (hd->sigma, 0, 32);
|
||||
|
||||
hd->bctx.nblocks = 0;
|
||||
hd->bctx.count = 0;
|
||||
hd->bctx.blocksize = 32;
|
||||
hd->bctx.bwrite = transform;
|
||||
}
|
||||
|
||||
static void
|
||||
do_p (unsigned char *p, unsigned char *u, unsigned char *v)
|
||||
{
|
||||
int i, k;
|
||||
for (k = 0; k < 8; k++)
|
||||
{
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
p[i + 4 * k] = u[8 * i + k] ^ v[8 * i + k];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
do_a (unsigned char *u)
|
||||
{
|
||||
unsigned char temp[8];
|
||||
int i;
|
||||
memcpy (temp, u, 8);
|
||||
memmove (u, u+8, 24);
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
u[24 + i] = u[i] ^ temp[i];
|
||||
}
|
||||
}
|
||||
/* apply do_a twice: 1 2 3 4 -> 3 4 1^2 2^3 */
|
||||
static void
|
||||
do_a2 (unsigned char *u)
|
||||
{
|
||||
unsigned char temp[16];
|
||||
int i;
|
||||
memcpy (temp, u, 16);
|
||||
memcpy (u, u + 16, 16);
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
u[16 + i] = temp[i] ^ temp[8 + i];
|
||||
u[24 + i] = u[i] ^ temp[8 + i];
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
do_apply_c2 (unsigned char *u)
|
||||
{
|
||||
u[ 1] ^= 0xff;
|
||||
u[ 3] ^= 0xff;
|
||||
u[ 5] ^= 0xff;
|
||||
u[ 7] ^= 0xff;
|
||||
|
||||
u[ 8] ^= 0xff;
|
||||
u[10] ^= 0xff;
|
||||
u[12] ^= 0xff;
|
||||
u[14] ^= 0xff;
|
||||
|
||||
u[17] ^= 0xff;
|
||||
u[18] ^= 0xff;
|
||||
u[20] ^= 0xff;
|
||||
u[23] ^= 0xff;
|
||||
|
||||
u[24] ^= 0xff;
|
||||
u[28] ^= 0xff;
|
||||
u[29] ^= 0xff;
|
||||
u[31] ^= 0xff;
|
||||
}
|
||||
|
||||
#define do_phi_step(e, i) \
|
||||
e[(0 + 2*i) % 32] ^= e[(2 + 2*i) % 32] ^ e[(4 + 2*i) % 32] ^ e[(6 + 2*i) % 32] ^ e[(24 + 2*i) % 32] ^ e[(30 + 2*i) % 32]; \
|
||||
e[(1 + 2*i) % 32] ^= e[(3 + 2*i) % 32] ^ e[(5 + 2*i) % 32] ^ e[(7 + 2*i) % 32] ^ e[(25 + 2*i) % 32] ^ e[(31 + 2*i) % 32];
|
||||
|
||||
static void
|
||||
do_phi_submix (unsigned char *e, unsigned char *x, int round)
|
||||
{
|
||||
int i;
|
||||
round *= 2;
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
e[(i + round) % 32] ^= x[i];
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
do_add (unsigned char *s, unsigned char *a)
|
||||
{
|
||||
unsigned temp = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
temp = s[i] + a[i] + (temp >> 8);
|
||||
s[i] = temp & 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
do_hash_step (GOST28147_context *hd, unsigned char *h, unsigned char *m)
|
||||
{
|
||||
unsigned char u[32], v[32], s[32];
|
||||
unsigned char k[32];
|
||||
unsigned int burn;
|
||||
int i;
|
||||
|
||||
memcpy (u, h, 32);
|
||||
memcpy (v, m, 32);
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
do_p (k, u, v);
|
||||
|
||||
burn = _gcry_gost_enc_one (hd, k, s + i*8, h + i*8);
|
||||
|
||||
do_a (u);
|
||||
if (i == 1)
|
||||
do_apply_c2 (u);
|
||||
do_a2 (v);
|
||||
}
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
do_phi_step (s, 0);
|
||||
do_phi_step (s, 1);
|
||||
do_phi_step (s, 2);
|
||||
do_phi_step (s, 3);
|
||||
do_phi_step (s, 4);
|
||||
do_phi_step (s, 5);
|
||||
do_phi_step (s, 6);
|
||||
do_phi_step (s, 7);
|
||||
do_phi_step (s, 8);
|
||||
do_phi_step (s, 9);
|
||||
/* That is in total 12 + 1 + 61 = 74 = 16 * 4 + 10 rounds */
|
||||
if (i == 4)
|
||||
break;
|
||||
do_phi_step (s, 10);
|
||||
do_phi_step (s, 11);
|
||||
if (i == 0)
|
||||
do_phi_submix(s, m, 12);
|
||||
do_phi_step (s, 12);
|
||||
if (i == 0)
|
||||
do_phi_submix(s, h, 13);
|
||||
do_phi_step (s, 13);
|
||||
do_phi_step (s, 14);
|
||||
do_phi_step (s, 15);
|
||||
}
|
||||
|
||||
memcpy (h, s+20, 12);
|
||||
memcpy (h+12, s, 20);
|
||||
|
||||
return /* burn_stack */ 4 * sizeof(void*) /* func call (ret addr + args) */ +
|
||||
4 * 32 + 2 * sizeof(int) /* stack */ +
|
||||
max(burn /* _gcry_gost_enc_one */,
|
||||
sizeof(void*) * 2 /* do_a2 call */ +
|
||||
16 + sizeof(int) /* do_a2 stack */ );
|
||||
}
|
||||
|
||||
|
||||
static unsigned int
|
||||
transform (void *ctx, const unsigned char *data)
|
||||
{
|
||||
GOSTR3411_CONTEXT *hd = ctx;
|
||||
byte m[32];
|
||||
unsigned int burn;
|
||||
|
||||
memcpy (m, data, 32);
|
||||
burn = do_hash_step (&hd->hd, hd->h, m);
|
||||
do_add (hd->sigma, m);
|
||||
|
||||
return /* burn_stack */ burn + 3 * sizeof(void*) + 32 + 2 * sizeof(void*);
|
||||
}
|
||||
|
||||
/*
|
||||
The routine finally terminates the computation and returns the
|
||||
digest. The handle is prepared for a new cycle, but adding bytes
|
||||
to the handle will the destroy the returned buffer. Returns: 32
|
||||
bytes with the message the digest. */
|
||||
static void
|
||||
gost3411_final (void *context)
|
||||
{
|
||||
GOSTR3411_CONTEXT *hd = context;
|
||||
size_t padlen = 0;
|
||||
byte l[32];
|
||||
int i;
|
||||
u32 nblocks;
|
||||
|
||||
if (hd->bctx.count > 0)
|
||||
{
|
||||
padlen = 32 - hd->bctx.count;
|
||||
memset (hd->bctx.buf + hd->bctx.count, 0, padlen);
|
||||
hd->bctx.count += padlen;
|
||||
_gcry_md_block_write (hd, NULL, 0); /* flush */;
|
||||
}
|
||||
|
||||
if (hd->bctx.count != 0)
|
||||
return; /* Something went wrong */
|
||||
|
||||
memset (l, 0, 32);
|
||||
|
||||
nblocks = hd->bctx.nblocks;
|
||||
if (padlen)
|
||||
{
|
||||
nblocks --;
|
||||
l[0] = 256 - padlen * 8;
|
||||
}
|
||||
|
||||
for (i = 1; i < 32 && nblocks != 0; i++)
|
||||
{
|
||||
l[i] = nblocks % 256;
|
||||
nblocks /= 256;
|
||||
}
|
||||
|
||||
do_hash_step (&hd->hd, hd->h, l);
|
||||
do_hash_step (&hd->hd, hd->h, hd->sigma);
|
||||
}
|
||||
|
||||
static byte *
|
||||
gost3411_read (void *context)
|
||||
{
|
||||
GOSTR3411_CONTEXT *hd = context;
|
||||
|
||||
return hd->h;
|
||||
}
|
||||
gcry_md_spec_t _gcry_digest_spec_gost3411_94 =
|
||||
{
|
||||
GCRY_MD_GOSTR3411_94, {0, 0},
|
||||
"GOSTR3411_94", NULL, 0, NULL, 32,
|
||||
gost3411_init, _gcry_md_block_write, gost3411_final, gost3411_read,
|
||||
sizeof (GOSTR3411_CONTEXT)
|
||||
};
|
||||
@@ -0,0 +1,145 @@
|
||||
/* hash-common.c - Common code for hash algorithms
|
||||
* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#ifdef HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
|
||||
#include "g10lib.h"
|
||||
#include "hash-common.h"
|
||||
|
||||
|
||||
/* Run a selftest for hash algorithm ALGO. If the resulting digest
|
||||
matches EXPECT/EXPECTLEN and everything else is fine as well,
|
||||
return NULL. If an error occurs, return a static text string
|
||||
describing the error.
|
||||
|
||||
DATAMODE controls what will be hashed according to this table:
|
||||
|
||||
0 - Hash the supplied DATA of DATALEN.
|
||||
1 - Hash one million times a 'a'. DATA and DATALEN are ignored.
|
||||
|
||||
*/
|
||||
const char *
|
||||
_gcry_hash_selftest_check_one (int algo,
|
||||
int datamode, const void *data, size_t datalen,
|
||||
const void *expect, size_t expectlen)
|
||||
{
|
||||
const char *result = NULL;
|
||||
gcry_error_t err = 0;
|
||||
gcry_md_hd_t hd;
|
||||
unsigned char *digest;
|
||||
|
||||
if (_gcry_md_get_algo_dlen (algo) != expectlen)
|
||||
return "digest size does not match expected size";
|
||||
|
||||
err = _gcry_md_open (&hd, algo, 0);
|
||||
if (err)
|
||||
return "gcry_md_open failed";
|
||||
|
||||
switch (datamode)
|
||||
{
|
||||
case 0:
|
||||
_gcry_md_write (hd, data, datalen);
|
||||
break;
|
||||
|
||||
case 1: /* Hash one million times an "a". */
|
||||
{
|
||||
char aaa[1000];
|
||||
int i;
|
||||
|
||||
/* Write in odd size chunks so that we test the buffering. */
|
||||
memset (aaa, 'a', 1000);
|
||||
for (i = 0; i < 1000; i++)
|
||||
_gcry_md_write (hd, aaa, 1000);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
result = "invalid DATAMODE";
|
||||
}
|
||||
|
||||
if (!result)
|
||||
{
|
||||
digest = _gcry_md_read (hd, algo);
|
||||
|
||||
if ( memcmp (digest, expect, expectlen) )
|
||||
result = "digest mismatch";
|
||||
}
|
||||
|
||||
_gcry_md_close (hd);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Common function to write a chunk of data to the transform function
|
||||
of a hash algorithm. Note that the use of the term "block" does
|
||||
not imply a fixed size block. */
|
||||
void
|
||||
_gcry_md_block_write (void *context, const void *inbuf_arg, size_t inlen)
|
||||
{
|
||||
const unsigned char *inbuf = inbuf_arg;
|
||||
gcry_md_block_ctx_t *hd = context;
|
||||
unsigned int stack_burn = 0;
|
||||
|
||||
if (sizeof(hd->buf) < hd->blocksize)
|
||||
BUG();
|
||||
|
||||
if (hd->buf == NULL || hd->bwrite == NULL)
|
||||
return;
|
||||
|
||||
if (hd->count == hd->blocksize) /* Flush the buffer. */
|
||||
{
|
||||
stack_burn = hd->bwrite (hd, hd->buf);
|
||||
_gcry_burn_stack (stack_burn);
|
||||
stack_burn = 0;
|
||||
hd->count = 0;
|
||||
if (!++hd->nblocks)
|
||||
hd->nblocks_high++;
|
||||
}
|
||||
if (!inbuf)
|
||||
return;
|
||||
|
||||
if (hd->count)
|
||||
{
|
||||
for (; inlen && hd->count < hd->blocksize; inlen--)
|
||||
hd->buf[hd->count++] = *inbuf++;
|
||||
_gcry_md_block_write (hd, NULL, 0);
|
||||
if (!inlen)
|
||||
return;
|
||||
}
|
||||
|
||||
while (inlen >= hd->blocksize)
|
||||
{
|
||||
stack_burn = hd->bwrite (hd, inbuf);
|
||||
hd->count = 0;
|
||||
if (!++hd->nblocks)
|
||||
hd->nblocks_high++;
|
||||
inlen -= hd->blocksize;
|
||||
inbuf += hd->blocksize;
|
||||
}
|
||||
_gcry_burn_stack (stack_burn);
|
||||
for (; inlen && hd->count < hd->blocksize; inlen--)
|
||||
hd->buf[hd->count++] = *inbuf++;
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
/* hash-common.h - Declarations of common code for hash algorithms.
|
||||
* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GCRY_HASH_COMMON_H
|
||||
#define GCRY_HASH_COMMON_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
|
||||
const char * _gcry_hash_selftest_check_one
|
||||
/**/ (int algo,
|
||||
int datamode, const void *data, size_t datalen,
|
||||
const void *expect, size_t expectlen);
|
||||
|
||||
/* Type for the md_write helper function. */
|
||||
typedef unsigned int (*_gcry_md_block_write_t) (void *c,
|
||||
const unsigned char *buf);
|
||||
|
||||
#if defined(HAVE_U64_TYPEDEF) && (defined(USE_SHA512) || defined(USE_WHIRLPOOL))
|
||||
/* SHA-512 needs u64 and larger buffer. Whirlpool needs u64. */
|
||||
# define MD_BLOCK_MAX_BLOCKSIZE 128
|
||||
# define MD_NBLOCKS_TYPE u64
|
||||
#else
|
||||
# define MD_BLOCK_MAX_BLOCKSIZE 64
|
||||
# define MD_NBLOCKS_TYPE u32
|
||||
#endif
|
||||
|
||||
typedef struct gcry_md_block_ctx
|
||||
{
|
||||
byte buf[MD_BLOCK_MAX_BLOCKSIZE];
|
||||
MD_NBLOCKS_TYPE nblocks;
|
||||
MD_NBLOCKS_TYPE nblocks_high;
|
||||
int count;
|
||||
size_t blocksize;
|
||||
_gcry_md_block_write_t bwrite;
|
||||
} gcry_md_block_ctx_t;
|
||||
|
||||
|
||||
void
|
||||
_gcry_md_block_write( void *context, const void *inbuf_arg, size_t inlen);
|
||||
|
||||
#endif /*GCRY_HASH_COMMON_H*/
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user