root/trunk/src/libopensc/compression.c

Revision 3405, 4.8 KB (checked in by alonbl, 9 months ago)

Complete rewrite of OpenSC build system.

1. Build system now supports MinGW (Windows) compilation using msys and cross compilation.
2. Ability to explicitly disable and enable dependencies of the package.
3. openct, pcsc and nsplugins features are disabled by default.
4. Modified pcsc driver to use pcsc dynamically, no compile time dependency is required.
5. --enable-pcsc-lite configuration option renamed to --enable-pcsc.
6. Install opensc.conf file (as opensc.conf.new if opensc.conf exists).
7. Add--enable-doc configuration option, allow installing documentation into target.
8. Add --disable-man configuration option, allow msys mingw32 users to

build from svn without extra dependencies.

9. Add export files to each library in order to export only required symbols.

Windows native build may use these files instead of scanning objects' symbols.

10. Add opensc-tool --info to display some general information about the build.
11. Create compatibility library to be linked against library instread of recompiling the

same source files in different places.

12. Add different win32 version resource to each class of outputs.
13. Make xsl-stylesheets location selectable.
14. Some win32 fixups.
15. Some warning fixups.
16. Many other autoconf/automake cleanups.

Alon Bar-Lev

svn diff -r 3315:3399 https://www.opensc-project.org/svn/opensc/branches/alonbl/mingw

_M .
D configure.in
_M src
_M src/openssh
M src/openssh/Makefile.am
_M src/tools
M src/tools/rutoken-tool.c
M src/tools/opensc-tool.c
M src/tools/cardos-info.c
M src/tools/pkcs15-crypt.c
M src/tools/pkcs15-init.c
M src/tools/piv-tool.c
M src/tools/netkey-tool.c
M src/tools/eidenv.c
M src/tools/cryptoflex-tool.c
M src/tools/util.c
M src/tools/pkcs11-tool.c
M src/tools/pkcs15-tool.c
M src/tools/util.h
M src/tools/opensc-explorer.c
M src/tools/Makefile.am
_M src/pkcs11
M src/pkcs11/pkcs11-global.c
M src/pkcs11/framework-pkcs15.c
M src/pkcs11/mechanism.c
M src/pkcs11/pkcs11-display.c
M src/pkcs11/pkcs11-object.c
A src/pkcs11/opensc-pkcs11.exports
M src/pkcs11/sc-pkcs11.h
M src/pkcs11/pkcs11-spy.c
M src/pkcs11/openssl.c
M src/pkcs11/Makefile.am
A src/pkcs11/pkcs11-spy.exports
_M src/tests
_M src/tests/regression
M src/tests/regression/Makefile.am
M src/tests/sc-test.c
M src/tests/pintest.c
M src/tests/Makefile.am
_M src/include
_M src/include/opensc
M src/include/opensc/Makefile.am
A src/include/opensc/svnignore
M src/include/Makefile.am
_M src/signer
_M src/signer/npinclude
M src/signer/npinclude/Makefile.am
M src/signer/Makefile.am
A src/signer/signer.exports
_M src/common
A src/common/compat_dummy.c
D src/common/getopt.txt
D src/common/strlcpy.c
D src/common/LICENSE
A src/common/compat_getopt.txt
A src/common/compat_strlcpy.c
A src/common/LICENSE.compat_getopt
A src/common/compat_getopt.c
D src/common/strlcpy.h
D src/common/ChangeLog
D src/common/getpass.c
D src/common/my_getopt.c
A src/common/compat_strlcpy.h
A src/common/compat_getpass.c
A src/common/compat_getopt.h
A src/common/ChangeLog.compat_getopt
D src/common/README.strlcpy
D src/common/my_getopt.h
A src/common/compat_getpass.h
A src/common/README.compat_strlcpy
D src/common/strlcpy.3
A src/common/README.compat_getopt
D src/common/getopt.3
D src/common/README.my_getopt
A src/common/compat_strlcpy.3
A src/common/compat_getopt.3
M src/common/Makefile.am
M src/Makefile.am
_M src/pkcs15init
M src/pkcs15init/pkcs15-oberthur.c
M src/pkcs15init/profile.c
M src/pkcs15init/pkcs15-lib.c
M src/pkcs15init/pkcs15-rutoken.c
A src/pkcs15init/pkcs15init.exports
M src/pkcs15init/pkcs15-gpk.c
M src/pkcs15init/Makefile.am
_M src/scconf
M src/scconf/Makefile.am
M src/scconf/parse.c
A src/scconf/scconf.exports
_M src/libopensc
M src/libopensc/card-rutoken.c
M src/libopensc/compression.c
M src/libopensc/sc.c
M src/libopensc/card-piv.c
M src/libopensc/pkcs15-openpgp.c
M src/libopensc/pkcs15-postecert.c
M src/libopensc/pkcs15-tcos.c
M src/libopensc/opensc-config.in
M src/libopensc/reader-pcsc.c
A src/libopensc/internal-winscard.h
M src/libopensc/ctx.c
A src/libopensc/libopensc.exports
M src/libopensc/pkcs15-piv.c
M src/libopensc/pkcs15-infocamere.c
M src/libopensc/internal.h
M src/libopensc/pkcs15-actalis.c
M src/libopensc/pkcs15-starcert.c
M src/libopensc/card-oberthur.c
M src/libopensc/pkcs15-atrust-acos.c
M src/libopensc/p15card-helper.c
D src/libopensc/part10.h
M src/libopensc/ui.c
M src/libopensc/card-gpk.c
M src/libopensc/pkcs15-wrap.c
M src/libopensc/pkcs15-gemsafeGPK.c
M src/libopensc/log.c
M src/libopensc/pkcs15-esteid.c
M src/libopensc/pkcs15-prkey-rutoken.c
M src/libopensc/log.h
M src/libopensc/Makefile.am
M src/libopensc/reader-openct.c
_M aclocal
M aclocal/Makefile.am
_M win32
M win32/Makefile.am
A win32/versioninfo.rc.in
A win32/ltrc.inc
A configure.ac
_M doc
_M doc/tools
M doc/tools/pkcs15-profile.xml
D doc/changelog.sh
D doc/export-wiki.xsl
_M doc/api
_M doc/api/file
M doc/api/man.xsl
_M doc/api/asn1
_M doc/api/apps
_M doc/api/init
_M doc/api/types
_M doc/api/card
M doc/api/html.xsl
_M doc/api/misc
_M doc/api/util
M doc/Makefile.am
D doc/export-wiki.sh
AM doc/nonpersistent
A doc/nonpersistent/export-wiki.xsl
A doc/nonpersistent/Makefile.am
A doc/nonpersistent/export-wiki.sh
A doc/nonpersistent/svn2cl.xsl
D doc/generate-man.sh
D doc/svn2cl.xsl
M Makefile.am
A svnignore
_M etc
M etc/opensc.conf.in
M etc/Makefile.am
D man
_M solaris
M solaris/Makefile

Line 
1/*
2 * compression.c: Generic wrapper for compression of data
3 *
4 * Copyright (C) 2006, Identity Alliance, Thomas Harning <thomas.harning@identityalliance.com>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20#include "internal.h"
21#ifdef ENABLE_ZLIB
22#include "compression.h"
23
24#include <zlib.h>
25#include <string.h>
26#include <stdlib.h>
27#include "errors.h"
28
29static int zerr_to_opensc(int err) {
30        switch(err) {
31        case Z_OK:
32        case Z_STREAM_END:
33                return SC_SUCCESS;
34        case Z_UNKNOWN:
35                return SC_ERROR_UNKNOWN;
36        case Z_BUF_ERROR:
37        case Z_MEM_ERROR:
38                return SC_ERROR_MEMORY_FAILURE;
39        case Z_VERSION_ERROR:
40        case Z_DATA_ERROR:
41        case Z_STREAM_ERROR:
42        /* case Z_NEED_DICT: */
43        default:
44                return SC_ERROR_INTERNAL;
45        }
46}
47static int detect_method(const u8* in, size_t inLen) {
48        if(inLen > 2 && in[0] == 0x1f && in[1] == 0x8b) { /* GZIP */
49                return COMPRESSION_GZIP;
50        } else if(inLen > 1 /*&& (in[0] & 0x10) == Z_DEFLATED*/) {
51                /* REALLY SIMPLE ZLIB TEST --
52                 * Check for the compression method to be set to 8...
53                 * many things can spoof this, but this is ok for now
54                 * */
55                return COMPRESSION_ZLIB;
56        } else {
57                return COMPRESSION_UNKNOWN;
58        }
59}
60
61static int sc_decompress_gzip(u8* out, size_t* outLen, const u8* in, size_t inLen) {
62        /* Since uncompress does not offer a way to make it uncompress gzip... manually set it up */
63        z_stream gz;
64        int err;
65        int window_size = 15 + 0x20;
66        memset(&gz, 0, sizeof(gz));
67
68        gz.next_in = (u8*)in;
69        gz.avail_in = inLen;
70        gz.next_out = out;
71        gz.avail_out = *outLen;
72
73        err = inflateInit2(&gz, window_size);
74        if(err != Z_OK) return zerr_to_opensc(err);
75        err = inflate(&gz, Z_FINISH);
76        if(err != Z_STREAM_END) {
77                inflateEnd(&gz);
78                return zerr_to_opensc(err);
79        }
80        *outLen = gz.total_out;
81
82        err = inflateEnd(&gz);
83        return zerr_to_opensc(err);     
84}
85
86int sc_decompress(u8* out, size_t* outLen, const u8* in, size_t inLen, int method) {
87        unsigned long zlib_outlen;
88        int rc;
89
90        if(method == COMPRESSION_AUTO) {
91                method = detect_method(in, inLen);
92                if(method == COMPRESSION_UNKNOWN) {
93                        return SC_ERROR_UNKNOWN_DATA_RECEIVED;
94                }
95        }
96        switch(method) {
97        case COMPRESSION_ZLIB:
98                zlib_outlen = *outLen; 
99                rc = zerr_to_opensc(uncompress(out, &zlib_outlen, in, inLen));
100                *outLen = zlib_outlen;
101                return rc;
102        case COMPRESSION_GZIP:
103                return sc_decompress_gzip(out, outLen, in, inLen);
104        default:
105                return SC_ERROR_INVALID_ARGUMENTS;
106        }
107}
108
109static int sc_decompress_zlib_alloc(u8** out, size_t* outLen, const u8* in, size_t inLen, int gzip) {
110        /* Since uncompress does not offer a way to make it uncompress gzip... manually set it up */
111        z_stream gz;
112        int err;
113        int window_size = 15;
114        const int startSize = inLen < 1024 ? 2048 : inLen * 2;
115        const int blockSize = inLen < 1024 ? 512 : inLen / 2;
116        int bufferSize = startSize;
117        if(gzip)
118                window_size += 0x20;
119        memset(&gz, 0, sizeof(gz));
120       
121        gz.next_in = (u8*)in;
122        gz.avail_in = inLen;
123
124        err = inflateInit2(&gz, window_size);
125        if(err != Z_OK) return zerr_to_opensc(err);
126
127        *outLen = 0;
128
129        while(1) {
130                /* Setup buffer... */
131                int num;
132                u8* buf = realloc(*out, bufferSize);
133                if(!buf) {
134                        if(*out)
135                                free(*out);
136                        *out = NULL;
137                        return Z_MEM_ERROR;
138                }
139                *out = buf;
140                gz.next_out = buf + *outLen;
141                gz.avail_out = bufferSize - *outLen;
142
143                err = inflate(&gz, Z_FULL_FLUSH);
144                if(err != Z_STREAM_END && err != Z_OK) {
145                        if(*out)
146                                free(*out);
147                        *out = NULL;
148                        break;
149                }
150                num = bufferSize - *outLen - gz.avail_out;
151                if(num > 0) {
152                        *outLen += num;
153                        bufferSize += num + blockSize;
154                }
155                if(err == Z_STREAM_END) {
156                        buf = realloc(buf, *outLen); /* Shrink it down, if it fails, just use old data */
157                        if(buf) {
158                                *out = buf;
159                        }
160                        break;
161                }
162        }
163        inflateEnd(&gz);
164        return zerr_to_opensc(err);
165}
166int sc_decompress_alloc(u8** out, size_t* outLen, const u8* in, size_t inLen, int method) {
167        if(method == COMPRESSION_AUTO) {
168                method = detect_method(in, inLen);
169                if(method == COMPRESSION_UNKNOWN) {
170                        return SC_ERROR_UNKNOWN_DATA_RECEIVED;
171                }
172        }
173        switch(method) {
174        case COMPRESSION_ZLIB:
175                return sc_decompress_zlib_alloc(out, outLen, in, inLen, 0);
176        case COMPRESSION_GZIP:
177                return sc_decompress_zlib_alloc(out, outLen, in, inLen, 1);
178        default:
179                return SC_ERROR_INVALID_ARGUMENTS;
180        }
181}
182#endif /* ENABLE_ZLIB */
Note: See TracBrowser for help on using the browser.