LCOV - code coverage report
Current view: top level - asn1 - bio_ndef.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 65 71 91.5 %
Date: 2014-08-02 Functions: 5 5 100.0 %
Branches: 13 30 43.3 %

           Branch data     Line data    Source code
       1                 :            : /* bio_ndef.c */
       2                 :            : /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
       3                 :            :  * project.
       4                 :            :  */
       5                 :            : /* ====================================================================
       6                 :            :  * Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
       7                 :            :  *
       8                 :            :  * Redistribution and use in source and binary forms, with or without
       9                 :            :  * modification, are permitted provided that the following conditions
      10                 :            :  * are met:
      11                 :            :  *
      12                 :            :  * 1. Redistributions of source code must retain the above copyright
      13                 :            :  *    notice, this list of conditions and the following disclaimer. 
      14                 :            :  *
      15                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      16                 :            :  *    notice, this list of conditions and the following disclaimer in
      17                 :            :  *    the documentation and/or other materials provided with the
      18                 :            :  *    distribution.
      19                 :            :  *
      20                 :            :  * 3. All advertising materials mentioning features or use of this
      21                 :            :  *    software must display the following acknowledgment:
      22                 :            :  *    "This product includes software developed by the OpenSSL Project
      23                 :            :  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
      24                 :            :  *
      25                 :            :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      26                 :            :  *    endorse or promote products derived from this software without
      27                 :            :  *    prior written permission. For written permission, please contact
      28                 :            :  *    licensing@OpenSSL.org.
      29                 :            :  *
      30                 :            :  * 5. Products derived from this software may not be called "OpenSSL"
      31                 :            :  *    nor may "OpenSSL" appear in their names without prior written
      32                 :            :  *    permission of the OpenSSL Project.
      33                 :            :  *
      34                 :            :  * 6. Redistributions of any form whatsoever must retain the following
      35                 :            :  *    acknowledgment:
      36                 :            :  *    "This product includes software developed by the OpenSSL Project
      37                 :            :  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
      38                 :            :  *
      39                 :            :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      40                 :            :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      41                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      42                 :            :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      43                 :            :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      44                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      45                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      46                 :            :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      47                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      48                 :            :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      49                 :            :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      50                 :            :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      51                 :            :  * ====================================================================
      52                 :            :  *
      53                 :            :  */
      54                 :            : 
      55                 :            : #include <openssl/asn1.h>
      56                 :            : #include <openssl/asn1t.h>
      57                 :            : #include <openssl/bio.h>
      58                 :            : #include <openssl/err.h>
      59                 :            : 
      60                 :            : #include <stdio.h>
      61                 :            : 
      62                 :            : /* Experimental NDEF ASN1 BIO support routines */
      63                 :            : 
      64                 :            : /* The usage is quite simple, initialize an ASN1 structure,
      65                 :            :  * get a BIO from it then any data written through the BIO
      66                 :            :  * will end up translated to approptiate format on the fly.
      67                 :            :  * The data is streamed out and does *not* need to be
      68                 :            :  * all held in memory at once.
      69                 :            :  *
      70                 :            :  * When the BIO is flushed the output is finalized and any
      71                 :            :  * signatures etc written out.
      72                 :            :  *
      73                 :            :  * The BIO is a 'proper' BIO and can handle non blocking I/O
      74                 :            :  * correctly.
      75                 :            :  *
      76                 :            :  * The usage is simple. The implementation is *not*...
      77                 :            :  */
      78                 :            : 
      79                 :            : /* BIO support data stored in the ASN1 BIO ex_arg */
      80                 :            : 
      81                 :            : typedef struct ndef_aux_st
      82                 :            :         {
      83                 :            :         /* ASN1 structure this BIO refers to */
      84                 :            :         ASN1_VALUE *val;
      85                 :            :         const ASN1_ITEM *it;
      86                 :            :         /* Top of the BIO chain */
      87                 :            :         BIO *ndef_bio;
      88                 :            :         /* Output BIO */
      89                 :            :         BIO *out;
      90                 :            :         /* Boundary where content is inserted */
      91                 :            :         unsigned char **boundary;
      92                 :            :         /* DER buffer start */
      93                 :            :         unsigned char *derbuf;
      94                 :            :         } NDEF_SUPPORT;
      95                 :            : 
      96                 :            : static int ndef_prefix(BIO *b, unsigned char **pbuf, int *plen, void *parg);
      97                 :            : static int ndef_prefix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg);
      98                 :            : static int ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg);
      99                 :            : static int ndef_suffix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg);
     100                 :            : 
     101                 :         43 : BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it)
     102                 :            :         {
     103                 :         43 :         NDEF_SUPPORT *ndef_aux = NULL;
     104                 :         43 :         BIO *asn_bio = NULL;
     105                 :         43 :         const ASN1_AUX *aux = it->funcs;
     106                 :            :         ASN1_STREAM_ARG sarg;
     107                 :            : 
     108 [ +  - ][ -  + ]:         43 :         if (!aux || !aux->asn1_cb)
     109                 :            :                 {
     110                 :          0 :                 ASN1err(ASN1_F_BIO_NEW_NDEF, ASN1_R_STREAMING_NOT_SUPPORTED);
     111                 :          0 :                 return NULL;
     112                 :            :                 }
     113                 :         43 :         ndef_aux = OPENSSL_malloc(sizeof(NDEF_SUPPORT));
     114                 :         43 :         asn_bio = BIO_new(BIO_f_asn1());
     115                 :            : 
     116                 :            :         /* ASN1 bio needs to be next to output BIO */
     117                 :            : 
     118                 :         43 :         out = BIO_push(asn_bio, out);
     119                 :            : 
     120 [ +  - ][ +  - ]:         43 :         if (!ndef_aux || !asn_bio || !out)
     121                 :            :                 goto err;
     122                 :            : 
     123                 :         43 :         BIO_asn1_set_prefix(asn_bio, ndef_prefix, ndef_prefix_free);
     124                 :         43 :         BIO_asn1_set_suffix(asn_bio, ndef_suffix, ndef_suffix_free);
     125                 :            : 
     126                 :            :         /* Now let callback prepend any digest, cipher etc BIOs
     127                 :            :          * ASN1 structure needs.
     128                 :            :          */
     129                 :            : 
     130                 :         43 :         sarg.out = out;
     131                 :         43 :         sarg.ndef_bio = NULL;
     132                 :         43 :         sarg.boundary = NULL;
     133                 :            : 
     134         [ +  - ]:         43 :         if (aux->asn1_cb(ASN1_OP_STREAM_PRE, &val, it, &sarg) <= 0)
     135                 :            :                 goto err;
     136                 :            : 
     137                 :         43 :         ndef_aux->val = val;
     138                 :         43 :         ndef_aux->it = it;
     139                 :         43 :         ndef_aux->ndef_bio = sarg.ndef_bio;
     140                 :         43 :         ndef_aux->boundary = sarg.boundary;
     141                 :         43 :         ndef_aux->out = out;
     142                 :            : 
     143                 :         43 :         BIO_ctrl(asn_bio, BIO_C_SET_EX_ARG, 0, ndef_aux);
     144                 :            : 
     145                 :         43 :         return sarg.ndef_bio;
     146                 :            : 
     147                 :            :         err:
     148         [ #  # ]:          0 :         if (asn_bio)
     149                 :          0 :                 BIO_free(asn_bio);
     150         [ #  # ]:          0 :         if (ndef_aux)
     151                 :          0 :                 OPENSSL_free(ndef_aux);
     152                 :            :         return NULL;
     153                 :            :         }
     154                 :            : 
     155                 :         43 : static int ndef_prefix(BIO *b, unsigned char **pbuf, int *plen, void *parg)
     156                 :            :         {
     157                 :            :         NDEF_SUPPORT *ndef_aux;
     158                 :            :         unsigned char *p;
     159                 :            :         int derlen;
     160                 :            : 
     161         [ +  - ]:         43 :         if (!parg)
     162                 :            :                 return 0;
     163                 :            : 
     164                 :         43 :         ndef_aux = *(NDEF_SUPPORT **)parg;
     165                 :            : 
     166                 :         43 :         derlen = ASN1_item_ndef_i2d(ndef_aux->val, NULL, ndef_aux->it);
     167                 :         43 :         p = OPENSSL_malloc(derlen);
     168                 :         43 :         ndef_aux->derbuf = p;
     169                 :         43 :         *pbuf = p;
     170                 :         43 :         derlen = ASN1_item_ndef_i2d(ndef_aux->val, &p, ndef_aux->it);
     171                 :            : 
     172         [ +  - ]:         43 :         if (!*ndef_aux->boundary)
     173                 :            :                 return 0;
     174                 :            : 
     175                 :         43 :         *plen = *ndef_aux->boundary - *pbuf;
     176                 :            : 
     177                 :         43 :         return 1;
     178                 :            :         }
     179                 :            : 
     180                 :         86 : static int ndef_prefix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg)
     181                 :            :         {
     182                 :            :         NDEF_SUPPORT *ndef_aux;
     183                 :            : 
     184         [ +  - ]:         86 :         if (!parg)
     185                 :            :                 return 0;
     186                 :            : 
     187                 :         86 :         ndef_aux = *(NDEF_SUPPORT **)parg;
     188                 :            : 
     189         [ +  - ]:         86 :         if (ndef_aux->derbuf)
     190                 :         86 :                 OPENSSL_free(ndef_aux->derbuf);
     191                 :            : 
     192                 :         86 :         ndef_aux->derbuf = NULL;
     193                 :         86 :         *pbuf = NULL;
     194                 :         86 :         *plen = 0;
     195                 :         86 :         return 1;
     196                 :            :         }
     197                 :            : 
     198                 :         43 : static int ndef_suffix_free(BIO *b, unsigned char **pbuf, int *plen, void *parg)
     199                 :            :         {
     200                 :         43 :         NDEF_SUPPORT **pndef_aux = (NDEF_SUPPORT **)parg;
     201         [ +  - ]:         43 :         if (!ndef_prefix_free(b, pbuf, plen, parg))
     202                 :            :                 return 0;
     203                 :         43 :         OPENSSL_free(*pndef_aux);
     204                 :         43 :         *pndef_aux = NULL;
     205                 :         43 :         return 1;
     206                 :            :         }
     207                 :            : 
     208                 :         43 : static int ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg)
     209                 :            :         {
     210                 :            :         NDEF_SUPPORT *ndef_aux;
     211                 :            :         unsigned char *p;
     212                 :            :         int derlen;
     213                 :            :         const ASN1_AUX *aux;
     214                 :            :         ASN1_STREAM_ARG sarg;
     215                 :            : 
     216         [ +  - ]:         43 :         if (!parg)
     217                 :            :                 return 0;
     218                 :            : 
     219                 :         43 :         ndef_aux = *(NDEF_SUPPORT **)parg;
     220                 :            : 
     221                 :         43 :         aux = ndef_aux->it->funcs;
     222                 :            : 
     223                 :            :         /* Finalize structures */
     224                 :         43 :         sarg.ndef_bio = ndef_aux->ndef_bio;
     225                 :         43 :         sarg.out = ndef_aux->out;
     226                 :         43 :         sarg.boundary = ndef_aux->boundary;
     227         [ +  - ]:         43 :         if (aux->asn1_cb(ASN1_OP_STREAM_POST,
     228                 :            :                                 &ndef_aux->val, ndef_aux->it, &sarg) <= 0)
     229                 :            :                 return 0;
     230                 :            : 
     231                 :         43 :         derlen = ASN1_item_ndef_i2d(ndef_aux->val, NULL, ndef_aux->it);
     232                 :         43 :         p = OPENSSL_malloc(derlen);
     233                 :         43 :         ndef_aux->derbuf = p;
     234                 :         43 :         *pbuf = p;
     235                 :         43 :         derlen = ASN1_item_ndef_i2d(ndef_aux->val, &p, ndef_aux->it);
     236                 :            : 
     237         [ +  - ]:         43 :         if (!*ndef_aux->boundary)
     238                 :            :                 return 0;
     239                 :         43 :         *pbuf = *ndef_aux->boundary;
     240                 :         43 :         *plen = derlen - (*ndef_aux->boundary - ndef_aux->derbuf);
     241                 :            : 
     242                 :         43 :         return 1;
     243                 :            :         }

Generated by: LCOV version 1.9