1d059297112922cabb0c674840589be8db821fd9aAdam Langley/* $Id: openssl-compat.c,v 1.19 2014/07/02 05:28:07 djm Exp $ */ 2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* 4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au> 5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Permission to use, copy, modify, and distribute this software for any 7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * purpose with or without fee is hereby granted, provided that the above 8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * copyright notice and this permission notice appear in all copies. 9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER 15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */ 18bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 19d059297112922cabb0c674840589be8db821fd9aAdam Langley#define SSH_DONT_OVERLOAD_OPENSSL_FUNCS 20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "includes.h" 21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 22d059297112922cabb0c674840589be8db821fd9aAdam Langley#ifdef WITH_OPENSSL 23d059297112922cabb0c674840589be8db821fd9aAdam Langley 24bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdarg.h> 25bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <string.h> 26bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 27bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef USE_OPENSSL_ENGINE 28bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman# include <openssl/engine.h> 29bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman# include <openssl/conf.h> 30bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif 31bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 32bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "log.h" 33bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 34bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "openssl-compat.h" 35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 36d059297112922cabb0c674840589be8db821fd9aAdam Langley/* 37d059297112922cabb0c674840589be8db821fd9aAdam Langley * OpenSSL version numbers: MNNFFPPS: major minor fix patch status 38d059297112922cabb0c674840589be8db821fd9aAdam Langley * We match major, minor, fix and status (not patch) for <1.0.0. 39d059297112922cabb0c674840589be8db821fd9aAdam Langley * After that, we acceptable compatible fix versions (so we 40d059297112922cabb0c674840589be8db821fd9aAdam Langley * allow 1.0.1 to work with 1.0.0). Going backwards is only allowed 41d059297112922cabb0c674840589be8db821fd9aAdam Langley * within a patch series. 42d059297112922cabb0c674840589be8db821fd9aAdam Langley */ 43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint 45d059297112922cabb0c674840589be8db821fd9aAdam Langleyssh_compatible_openssl(long headerver, long libver) 46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 47d059297112922cabb0c674840589be8db821fd9aAdam Langley long mask, hfix, lfix; 48d059297112922cabb0c674840589be8db821fd9aAdam Langley 49d059297112922cabb0c674840589be8db821fd9aAdam Langley /* exact match is always OK */ 50d059297112922cabb0c674840589be8db821fd9aAdam Langley if (headerver == libver) 51d059297112922cabb0c674840589be8db821fd9aAdam Langley return 1; 52d059297112922cabb0c674840589be8db821fd9aAdam Langley 53d059297112922cabb0c674840589be8db821fd9aAdam Langley /* for versions < 1.0.0, major,minor,fix,status must match */ 54d059297112922cabb0c674840589be8db821fd9aAdam Langley if (headerver < 0x1000000f) { 55d059297112922cabb0c674840589be8db821fd9aAdam Langley mask = 0xfffff00fL; /* major,minor,fix,status */ 56d059297112922cabb0c674840589be8db821fd9aAdam Langley return (headerver & mask) == (libver & mask); 57d059297112922cabb0c674840589be8db821fd9aAdam Langley } 58d059297112922cabb0c674840589be8db821fd9aAdam Langley 59d059297112922cabb0c674840589be8db821fd9aAdam Langley /* 60d059297112922cabb0c674840589be8db821fd9aAdam Langley * For versions >= 1.0.0, major,minor,status must match and library 61d059297112922cabb0c674840589be8db821fd9aAdam Langley * fix version must be equal to or newer than the header. 62d059297112922cabb0c674840589be8db821fd9aAdam Langley */ 63d059297112922cabb0c674840589be8db821fd9aAdam Langley mask = 0xfff0000fL; /* major,minor,status */ 64d059297112922cabb0c674840589be8db821fd9aAdam Langley hfix = (headerver & 0x000ff000) >> 12; 65d059297112922cabb0c674840589be8db821fd9aAdam Langley lfix = (libver & 0x000ff000) >> 12; 66d059297112922cabb0c674840589be8db821fd9aAdam Langley if ( (headerver & mask) == (libver & mask) && lfix >= hfix) 67d059297112922cabb0c674840589be8db821fd9aAdam Langley return 1; 68d059297112922cabb0c674840589be8db821fd9aAdam Langley return 0; 69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 70bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 71bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef USE_OPENSSL_ENGINE 72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid 73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanssh_OpenSSL_add_all_algorithms(void) 74bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 75bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman OpenSSL_add_all_algorithms(); 76bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 77bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* Enable use of crypto hardware */ 78bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman ENGINE_load_builtin_engines(); 79bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman ENGINE_register_all_complete(); 80bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman OPENSSL_config(NULL); 81bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 82bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif 83d059297112922cabb0c674840589be8db821fd9aAdam Langley 84d059297112922cabb0c674840589be8db821fd9aAdam Langley#endif /* WITH_OPENSSL */ 85