LCOV - code coverage report
Current view: top level - ecdh - ech_lib.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 33 69 47.8 %
Date: 2014-08-02 Functions: 5 11 45.5 %
Branches: 9 28 32.1 %

           Branch data     Line data    Source code
       1                 :            : /* crypto/ecdh/ech_lib.c */
       2                 :            : /* ====================================================================
       3                 :            :  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
       4                 :            :  *
       5                 :            :  * The Elliptic Curve Public-Key Crypto Library (ECC Code) included
       6                 :            :  * herein is developed by SUN MICROSYSTEMS, INC., and is contributed
       7                 :            :  * to the OpenSSL project.
       8                 :            :  *
       9                 :            :  * The ECC Code is licensed pursuant to the OpenSSL open source
      10                 :            :  * license provided below.
      11                 :            :  *
      12                 :            :  * The ECDH software is originally written by Douglas Stebila of
      13                 :            :  * Sun Microsystems Laboratories.
      14                 :            :  *
      15                 :            :  */
      16                 :            : /* ====================================================================
      17                 :            :  * Copyright (c) 1998-2003 The OpenSSL Project.  All rights reserved.
      18                 :            :  *
      19                 :            :  * Redistribution and use in source and binary forms, with or without
      20                 :            :  * modification, are permitted provided that the following conditions
      21                 :            :  * are met:
      22                 :            :  *
      23                 :            :  * 1. Redistributions of source code must retain the above copyright
      24                 :            :  *    notice, this list of conditions and the following disclaimer. 
      25                 :            :  *
      26                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      27                 :            :  *    notice, this list of conditions and the following disclaimer in
      28                 :            :  *    the documentation and/or other materials provided with the
      29                 :            :  *    distribution.
      30                 :            :  *
      31                 :            :  * 3. All advertising materials mentioning features or use of this
      32                 :            :  *    software must display the following acknowledgment:
      33                 :            :  *    "This product includes software developed by the OpenSSL Project
      34                 :            :  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
      35                 :            :  *
      36                 :            :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      37                 :            :  *    endorse or promote products derived from this software without
      38                 :            :  *    prior written permission. For written permission, please contact
      39                 :            :  *    openssl-core@OpenSSL.org.
      40                 :            :  *
      41                 :            :  * 5. Products derived from this software may not be called "OpenSSL"
      42                 :            :  *    nor may "OpenSSL" appear in their names without prior written
      43                 :            :  *    permission of the OpenSSL Project.
      44                 :            :  *
      45                 :            :  * 6. Redistributions of any form whatsoever must retain the following
      46                 :            :  *    acknowledgment:
      47                 :            :  *    "This product includes software developed by the OpenSSL Project
      48                 :            :  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
      49                 :            :  *
      50                 :            :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      51                 :            :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      52                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      53                 :            :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      54                 :            :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      55                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      56                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      57                 :            :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      58                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      59                 :            :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      60                 :            :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      61                 :            :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      62                 :            :  * ====================================================================
      63                 :            :  *
      64                 :            :  * This product includes cryptographic software written by Eric Young
      65                 :            :  * (eay@cryptsoft.com).  This product includes software written by Tim
      66                 :            :  * Hudson (tjh@cryptsoft.com).
      67                 :            :  *
      68                 :            :  */
      69                 :            : 
      70                 :            : #include "ech_locl.h"
      71                 :            : #include <string.h>
      72                 :            : #ifndef OPENSSL_NO_ENGINE
      73                 :            : #include <openssl/engine.h>
      74                 :            : #endif
      75                 :            : #include <openssl/err.h>
      76                 :            : 
      77                 :            : const char ECDH_version[]="ECDH" OPENSSL_VERSION_PTEXT;
      78                 :            : 
      79                 :            : static const ECDH_METHOD *default_ECDH_method = NULL;
      80                 :            : 
      81                 :            : static void *ecdh_data_new(void);
      82                 :            : static void *ecdh_data_dup(void *);
      83                 :            : static void  ecdh_data_free(void *);
      84                 :            : 
      85                 :          0 : void ECDH_set_default_method(const ECDH_METHOD *meth)
      86                 :            :         {
      87                 :          0 :         default_ECDH_method = meth;
      88                 :          0 :         }
      89                 :            : 
      90                 :        966 : const ECDH_METHOD *ECDH_get_default_method(void)
      91                 :            :         {
      92         [ +  + ]:        966 :         if(!default_ECDH_method) 
      93                 :        359 :                 default_ECDH_method = ECDH_OpenSSL();
      94                 :        966 :         return default_ECDH_method;
      95                 :            :         }
      96                 :            : 
      97                 :          0 : int ECDH_set_method(EC_KEY *eckey, const ECDH_METHOD *meth)
      98                 :            :         {
      99                 :            :         ECDH_DATA *ecdh;
     100                 :            : 
     101                 :          0 :         ecdh = ecdh_check(eckey);
     102                 :            : 
     103         [ #  # ]:          0 :         if (ecdh == NULL)
     104                 :            :                 return 0;
     105                 :            : 
     106                 :            : #if 0
     107                 :            :         mtmp = ecdh->meth;
     108                 :            :         if (mtmp->finish)
     109                 :            :                 mtmp->finish(eckey);
     110                 :            : #endif
     111                 :            : #ifndef OPENSSL_NO_ENGINE
     112         [ #  # ]:          0 :         if (ecdh->engine)
     113                 :            :                 {
     114                 :          0 :                 ENGINE_finish(ecdh->engine);
     115                 :          0 :                 ecdh->engine = NULL;
     116                 :            :                 }
     117                 :            : #endif
     118                 :          0 :         ecdh->meth = meth;
     119                 :            : #if 0
     120                 :            :         if (meth->init) 
     121                 :            :                 meth->init(eckey);
     122                 :            : #endif
     123                 :          0 :         return 1;
     124                 :            :         }
     125                 :            : 
     126                 :        966 : static ECDH_DATA *ECDH_DATA_new_method(ENGINE *engine)
     127                 :            :         {
     128                 :            :         ECDH_DATA *ret;
     129                 :            : 
     130                 :        966 :         ret=(ECDH_DATA *)OPENSSL_malloc(sizeof(ECDH_DATA));
     131         [ -  + ]:        966 :         if (ret == NULL)
     132                 :            :                 {
     133                 :          0 :                 ECDHerr(ECDH_F_ECDH_DATA_NEW_METHOD, ERR_R_MALLOC_FAILURE);
     134                 :          0 :                 return(NULL);
     135                 :            :                 }
     136                 :            : 
     137                 :        966 :         ret->init = NULL;
     138                 :            : 
     139                 :        966 :         ret->meth = ECDH_get_default_method();
     140                 :        966 :         ret->engine = engine;
     141                 :            : #ifndef OPENSSL_NO_ENGINE
     142         [ +  - ]:        966 :         if (!ret->engine)
     143                 :        966 :                 ret->engine = ENGINE_get_default_ECDH();
     144         [ -  + ]:        966 :         if (ret->engine)
     145                 :            :                 {
     146                 :          0 :                 ret->meth = ENGINE_get_ECDH(ret->engine);
     147         [ #  # ]:          0 :                 if (!ret->meth)
     148                 :            :                         {
     149                 :          0 :                         ECDHerr(ECDH_F_ECDH_DATA_NEW_METHOD, ERR_R_ENGINE_LIB);
     150                 :          0 :                         ENGINE_finish(ret->engine);
     151                 :          0 :                         OPENSSL_free(ret);
     152                 :          0 :                         return NULL;
     153                 :            :                         }
     154                 :            :                 }
     155                 :            : #endif
     156                 :            : 
     157                 :        966 :         ret->flags = ret->meth->flags;
     158                 :        966 :         CRYPTO_new_ex_data(CRYPTO_EX_INDEX_ECDH, ret, &ret->ex_data);
     159                 :            : #if 0
     160                 :            :         if ((ret->meth->init != NULL) && !ret->meth->init(ret))
     161                 :            :                 {
     162                 :            :                 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_ECDH, ret, &ret->ex_data);
     163                 :            :                 OPENSSL_free(ret);
     164                 :            :                 ret=NULL;
     165                 :            :                 }
     166                 :            : #endif  
     167                 :        966 :         return(ret);
     168                 :            :         }
     169                 :            : 
     170                 :        966 : static void *ecdh_data_new(void)
     171                 :            :         {
     172                 :        966 :         return (void *)ECDH_DATA_new_method(NULL);
     173                 :            :         }
     174                 :            : 
     175                 :          0 : static void *ecdh_data_dup(void *data)
     176                 :            : {
     177                 :          0 :         ECDH_DATA *r = (ECDH_DATA *)data;
     178                 :            : 
     179                 :            :         /* XXX: dummy operation */
     180         [ #  # ]:          0 :         if (r == NULL)
     181                 :            :                 return NULL;
     182                 :            : 
     183                 :          0 :         return (void *)ecdh_data_new();
     184                 :            : }
     185                 :            : 
     186                 :        966 : void ecdh_data_free(void *data)
     187                 :            :         {
     188                 :        966 :         ECDH_DATA *r = (ECDH_DATA *)data;
     189                 :            : 
     190                 :            : #ifndef OPENSSL_NO_ENGINE
     191         [ -  + ]:        966 :         if (r->engine)
     192                 :          0 :                 ENGINE_finish(r->engine);
     193                 :            : #endif
     194                 :            : 
     195                 :        966 :         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_ECDH, r, &r->ex_data);
     196                 :            : 
     197                 :        966 :         OPENSSL_cleanse((void *)r, sizeof(ECDH_DATA));
     198                 :            : 
     199                 :        966 :         OPENSSL_free(r);
     200                 :        966 :         }
     201                 :            : 
     202                 :        966 : ECDH_DATA *ecdh_check(EC_KEY *key)
     203                 :            :         {
     204                 :            :         ECDH_DATA *ecdh_data;
     205                 :            :  
     206                 :        966 :         void *data = EC_KEY_get_key_method_data(key, ecdh_data_dup,
     207                 :            :                                         ecdh_data_free, ecdh_data_free);
     208         [ +  - ]:        966 :         if (data == NULL)
     209                 :            :         {
     210                 :        966 :                 ecdh_data = (ECDH_DATA *)ecdh_data_new();
     211         [ +  - ]:        966 :                 if (ecdh_data == NULL)
     212                 :            :                         return NULL;
     213                 :        966 :                 data = EC_KEY_insert_key_method_data(key, (void *)ecdh_data,
     214                 :            :                            ecdh_data_dup, ecdh_data_free, ecdh_data_free);
     215         [ -  + ]:        966 :                 if (data != NULL)
     216                 :            :                         {
     217                 :            :                         /* Another thread raced us to install the key_method
     218                 :            :                          * data and won. */
     219                 :          0 :                         ecdh_data_free(ecdh_data);
     220                 :          0 :                         ecdh_data = (ECDH_DATA *)data;
     221                 :            :                         }
     222                 :            :         }
     223                 :            :         else
     224                 :            :                 ecdh_data = (ECDH_DATA *)data;
     225                 :            :         
     226                 :            : 
     227                 :        966 :         return ecdh_data;
     228                 :            :         }
     229                 :            : 
     230                 :          0 : int ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
     231                 :            :              CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
     232                 :            :         {
     233                 :          0 :         return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_ECDH, argl, argp,
     234                 :            :                                 new_func, dup_func, free_func);
     235                 :            :         }
     236                 :            : 
     237                 :          0 : int ECDH_set_ex_data(EC_KEY *d, int idx, void *arg)
     238                 :            :         {
     239                 :            :         ECDH_DATA *ecdh;
     240                 :          0 :         ecdh = ecdh_check(d);
     241         [ #  # ]:          0 :         if (ecdh == NULL)
     242                 :            :                 return 0;
     243                 :          0 :         return(CRYPTO_set_ex_data(&ecdh->ex_data,idx,arg));
     244                 :            :         }
     245                 :            : 
     246                 :          0 : void *ECDH_get_ex_data(EC_KEY *d, int idx)
     247                 :            :         {
     248                 :            :         ECDH_DATA *ecdh;
     249                 :          0 :         ecdh = ecdh_check(d);
     250         [ #  # ]:          0 :         if (ecdh == NULL)
     251                 :            :                 return NULL;
     252                 :          0 :         return(CRYPTO_get_ex_data(&ecdh->ex_data,idx));
     253                 :            :         }

Generated by: LCOV version 1.9