1 /* 2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include "internal/cryptlib.h" 12 #include <openssl/buffer.h> 13 #include <openssl/asn1.h> 14 15 #ifndef NO_OLD_ASN1 16 17 # ifndef OPENSSL_NO_STDIO 18 int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x) 19 { 20 BIO *b; 21 int ret; 22 23 if ((b = BIO_new(BIO_s_file())) == NULL) { 24 ASN1err(ASN1_F_ASN1_I2D_FP, ERR_R_BUF_LIB); 25 return 0; 26 } 27 BIO_set_fp(b, out, BIO_NOCLOSE); 28 ret = ASN1_i2d_bio(i2d, b, x); 29 BIO_free(b); 30 return ret; 31 } 32 # endif 33 34 int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x) 35 { 36 char *b; 37 unsigned char *p; 38 int i, j = 0, n, ret = 1; 39 40 n = i2d(x, NULL); 41 if (n <= 0) 42 return 0; 43 44 b = OPENSSL_malloc(n); 45 if (b == NULL) { 46 ASN1err(ASN1_F_ASN1_I2D_BIO, ERR_R_MALLOC_FAILURE); 47 return 0; 48 } 49 50 p = (unsigned char *)b; 51 i2d(x, &p); 52 53 for (;;) { 54 i = BIO_write(out, &(b[j]), n); 55 if (i == n) 56 break; 57 if (i <= 0) { 58 ret = 0; 59 break; 60 } 61 j += i; 62 n -= i; 63 } 64 OPENSSL_free(b); 65 return ret; 66 } 67 68 #endif 69 70 #ifndef OPENSSL_NO_STDIO 71 int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x) 72 { 73 BIO *b; 74 int ret; 75 76 if ((b = BIO_new(BIO_s_file())) == NULL) { 77 ASN1err(ASN1_F_ASN1_ITEM_I2D_FP, ERR_R_BUF_LIB); 78 return 0; 79 } 80 BIO_set_fp(b, out, BIO_NOCLOSE); 81 ret = ASN1_item_i2d_bio(it, b, x); 82 BIO_free(b); 83 return ret; 84 } 85 #endif 86 87 int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x) 88 { 89 unsigned char *b = NULL; 90 int i, j = 0, n, ret = 1; 91 92 n = ASN1_item_i2d(x, &b, it); 93 if (b == NULL) { 94 ASN1err(ASN1_F_ASN1_ITEM_I2D_BIO, ERR_R_MALLOC_FAILURE); 95 return 0; 96 } 97 98 for (;;) { 99 i = BIO_write(out, &(b[j]), n); 100 if (i == n) 101 break; 102 if (i <= 0) { 103 ret = 0; 104 break; 105 } 106 j += i; 107 n -= i; 108 } 109 OPENSSL_free(b); 110 return ret; 111 } 112