use libgcrypt instead of OpenSSL

pull/40/head
Nestal Wan 2012-06-05 22:51:54 +08:00
parent 5cba612084
commit a09ba40dbc
4 changed files with 86 additions and 12 deletions

View File

@ -0,0 +1,50 @@
# - Try to find the Gcrypt library
# Once run this will define
#
# LIBGCRYPT_FOUND - set if the system has the gcrypt library
# LIBGCRYPT_CFLAGS - the required gcrypt compilation flags
# LIBGCRYPT_LIBRARIES - the linker libraries needed to use the gcrypt library
#
# Copyright (c) 2006 Brad Hards <bradh@kde.org>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
# libgcrypt is moving to pkg-config, but earlier version don't have it
#search in typical paths for libgcrypt-config
FIND_PROGRAM(LIBGCRYPTCONFIG_EXECUTABLE NAMES libgcrypt-config)
#reset variables
set(LIBGCRYPT_LIBRARIES)
set(LIBGCRYPT_CFLAGS)
# if libgcrypt-config has been found
IF(LIBGCRYPTCONFIG_EXECUTABLE)
EXEC_PROGRAM(${LIBGCRYPTCONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE LIBGCRYPT_LIBRARIES)
EXEC_PROGRAM(${LIBGCRYPTCONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE LIBGCRYPT_CFLAGS)
IF(${LIBGCRYPT_CFLAGS} MATCHES "\n")
SET(LIBGCRYPT_CFLAGS " ")
ENDIF(${LIBGCRYPT_CFLAGS} MATCHES "\n")
IF(LIBGCRYPT_LIBRARIES AND LIBGCRYPT_CFLAGS)
SET(LIBGCRYPT_FOUND TRUE)
ENDIF(LIBGCRYPT_LIBRARIES AND LIBGCRYPT_CFLAGS)
ENDIF(LIBGCRYPTCONFIG_EXECUTABLE)
if (LIBGCRYPT_FOUND)
if (NOT LibGcrypt_FIND_QUIETLY)
message(STATUS "Found libgcrypt: ${LIBGCRYPT_LIBRARIES}")
endif (NOT LibGcrypt_FIND_QUIETLY)
else (LIBGCRYPT_FOUND)
if (LibGcrypt_FIND_REQUIRED)
message(FATAL_ERROR "Could not find libgcrypt libraries")
endif (LibGcrypt_FIND_REQUIRED)
endif (LIBGCRYPT_FOUND)
MARK_AS_ADVANCED(LIBGCRYPT_CFLAGS LIBGCRYPT_LIBRARIES)

View File

@ -32,6 +32,8 @@
#include <boost/exception/all.hpp>
#include <gcrypt.h>
#include <cassert>
#include <cstdlib>
#include <iostream>
@ -40,10 +42,25 @@
const std::string client_id = "22314510474.apps.googleusercontent.com" ;
const std::string client_secret = "bl4ufi89h-9MkFlypcI7R785" ;
// libgcrypt insist this to be done in application, not library
void InitGCrypt()
{
if ( !gcry_check_version(GCRYPT_VERSION) )
throw gr::Exception() << gr::expt::ErrMsg( "libgcrypt version mismatch" ) ;
// disable secure memory
gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
// tell Libgcrypt that initialization has completed
gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
}
int main( int argc, char **argv )
{
using namespace gr ;
InitGCrypt() ;
Config config ;
std::auto_ptr<log::CompositeLog> comp_log(new log::CompositeLog) ;

View File

@ -2,7 +2,7 @@ project(libgrive)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
find_package(OpenSSL REQUIRED)
find_package(LibGcrypt REQUIRED)
find_package(JSONC REQUIRED)
find_package(CURL REQUIRED)
find_package(EXPAT REQUIRED)
@ -73,7 +73,7 @@ add_library( grive SHARED ${LIBGRIVE_SRC} ${OPT_SRC} )
target_link_libraries( grive
${CURL_LIBRARIES}
${JSONC_LIBRARY}
${OPENSSL_LIBRARIES}
${LIBGCRYPT_LIBRARIES}
${GDBM_LIBRARIES}
${Boost_LIBRARIES}
${IBERTY_LIBRARY}

View File

@ -20,12 +20,14 @@
#include "Crypt.hh"
#include "StdioFile.hh"
#include "Exception.hh"
#include <iomanip>
#include <sstream>
// dependent libraries
#include <openssl/evp.h>
#include <gcrypt.h>
#include <boost/throw_exception.hpp>
namespace gr { namespace crypt {
@ -47,23 +49,28 @@ std::string MD5( const fs::path& file )
std::string MD5( StdioFile& file )
{
char buf[read_size] ;
EVP_MD_CTX md ;
EVP_MD_CTX_init( &md );
EVP_DigestInit_ex( &md, EVP_md5(), 0 ) ;
gcry_md_hd_t hd ;
gcry_error_t err = gcry_md_open( &hd, GCRY_MD_MD5, GCRY_MD_FLAG_HMAC ) ;
if ( err != GPG_ERR_NO_ERROR )
{
BOOST_THROW_EXCEPTION( Exception() << expt::ErrMsg( gcry_strerror(err) ) ) ;
}
std::size_t count = 0 ;
while ( (count = file.Read( buf, sizeof(buf) )) > 0 )
EVP_DigestUpdate( &md, buf, count ) ;
unsigned int md5_size = EVP_MAX_MD_SIZE ;
unsigned char md5[EVP_MAX_MD_SIZE] ;
EVP_DigestFinal_ex( &md, md5, &md5_size ) ;
gcry_md_write( hd, buf, count ) ;
gcry_md_final(hd) ;
unsigned char *md5 = gcry_md_read( hd, GCRY_MD_MD5 ) ;
// format the MD5 string
std::ostringstream ss ;
for ( unsigned int i = 0 ; i < md5_size ; i++ )
for ( unsigned int i = 0 ; i < gcry_md_get_algo_dlen(GCRY_MD_MD5) ; i++ )
ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(md5[i]) ;
gcry_md_close( hd ) ;
return ss.str() ;
}