summaryrefslogtreecommitdiff
path: root/src/lib/libssl/src/crypto/pkcs12/p12_utl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/src/crypto/pkcs12/p12_utl.c')
-rw-r--r--src/lib/libssl/src/crypto/pkcs12/p12_utl.c58
1 files changed, 43 insertions, 15 deletions
diff --git a/src/lib/libssl/src/crypto/pkcs12/p12_utl.c b/src/lib/libssl/src/crypto/pkcs12/p12_utl.c
index 2adcbc95e1..243ec76be9 100644
--- a/src/lib/libssl/src/crypto/pkcs12/p12_utl.c
+++ b/src/lib/libssl/src/crypto/pkcs12/p12_utl.c
@@ -62,30 +62,34 @@
62 62
63/* Cheap and nasty Unicode stuff */ 63/* Cheap and nasty Unicode stuff */
64 64
65unsigned char *asc2uni (const char *asc, unsigned char **uni, int *unilen) 65unsigned char *asc2uni(const char *asc, int asclen, unsigned char **uni, int *unilen)
66{ 66{
67 int ulen, i; 67 int ulen, i;
68 unsigned char *unitmp; 68 unsigned char *unitmp;
69 ulen = strlen(asc)*2 + 2; 69 if (asclen == -1) asclen = strlen(asc);
70 if (!(unitmp = Malloc (ulen))) return NULL; 70 ulen = asclen*2 + 2;
71 for (i = 0; i < ulen; i+=2) { 71 if (!(unitmp = OPENSSL_malloc(ulen))) return NULL;
72 for (i = 0; i < ulen - 2; i+=2) {
72 unitmp[i] = 0; 73 unitmp[i] = 0;
73 unitmp[i + 1] = asc[i>>1]; 74 unitmp[i + 1] = asc[i>>1];
74 } 75 }
76 /* Make result double null terminated */
77 unitmp[ulen - 2] = 0;
78 unitmp[ulen - 1] = 0;
75 if (unilen) *unilen = ulen; 79 if (unilen) *unilen = ulen;
76 if (uni) *uni = unitmp; 80 if (uni) *uni = unitmp;
77 return unitmp; 81 return unitmp;
78} 82}
79 83
80char *uni2asc (unsigned char *uni, int unilen) 84char *uni2asc(unsigned char *uni, int unilen)
81{ 85{
82 int asclen, i; 86 int asclen, i;
83 char *asctmp; 87 char *asctmp;
84 asclen = unilen / 2; 88 asclen = unilen / 2;
85 /* If no terminating zero allow for one */ 89 /* If no terminating zero allow for one */
86 if (uni[unilen - 1]) asclen++; 90 if (!unilen || uni[unilen - 1]) asclen++;
87 uni++; 91 uni++;
88 if (!(asctmp = Malloc (asclen))) return NULL; 92 if (!(asctmp = OPENSSL_malloc(asclen))) return NULL;
89 for (i = 0; i < unilen; i+=2) asctmp[i>>1] = uni[i]; 93 for (i = 0; i < unilen; i+=2) asctmp[i>>1] = uni[i];
90 asctmp[asclen - 1] = 0; 94 asctmp[asclen - 1] = 0;
91 return asctmp; 95 return asctmp;
@@ -93,26 +97,50 @@ char *uni2asc (unsigned char *uni, int unilen)
93 97
94int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12) 98int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12)
95{ 99{
96 return ASN1_i2d_bio((int(*)())i2d_PKCS12, bp, (unsigned char *)p12); 100 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS12), bp, p12);
97} 101}
98 102
99#ifndef NO_FP_API 103#ifndef OPENSSL_NO_FP_API
100int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12) 104int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12)
101{ 105{
102 return ASN1_i2d_fp((int(*)())i2d_PKCS12, fp, (unsigned char *)p12); 106 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS12), fp, p12);
103} 107}
104#endif 108#endif
105 109
106PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12) 110PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12)
107{ 111{
108 return (PKCS12 *)ASN1_d2i_bio((char *(*)())PKCS12_new, 112 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS12), bp, p12);
109 (char *(*)())d2i_PKCS12, bp, (unsigned char **)p12);
110} 113}
111#ifndef NO_FP_API 114#ifndef OPENSSL_NO_FP_API
112PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12) 115PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12)
113{ 116{
114 return (PKCS12 *)ASN1_d2i_fp((char *(*)())PKCS12_new, 117 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS12), fp, p12);
115 (char *(*)())d2i_PKCS12, fp, (unsigned char **)(p12));
116} 118}
117#endif 119#endif
118 120
121PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509)
122{
123 return PKCS12_item_pack_safebag(x509, ASN1_ITEM_rptr(X509),
124 NID_x509Certificate, NID_certBag);
125}
126
127PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl)
128{
129 return PKCS12_item_pack_safebag(crl, ASN1_ITEM_rptr(X509_CRL),
130 NID_x509Crl, NID_crlBag);
131}
132
133X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag)
134{
135 if(M_PKCS12_bag_type(bag) != NID_certBag) return NULL;
136 if(M_PKCS12_cert_bag_type(bag) != NID_x509Certificate) return NULL;
137 return ASN1_item_unpack(bag->value.bag->value.octet, ASN1_ITEM_rptr(X509));
138}
139
140X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag)
141{
142 if(M_PKCS12_bag_type(bag) != NID_crlBag) return NULL;
143 if(M_PKCS12_cert_bag_type(bag) != NID_x509Crl) return NULL;
144 return ASN1_item_unpack(bag->value.bag->value.octet,
145 ASN1_ITEM_rptr(X509_CRL));
146}