pax_global_header00006660000000000000000000000064117534275120014521gustar00rootroot0000000000000052 comment=508f2d5ab34cc83995b18814983b0fabbed43f2f xca_0.9.3/000077500000000000000000000000001175342751200123675ustar00rootroot00000000000000xca_0.9.3/.gitignore000066400000000000000000000001741175342751200143610ustar00rootroot00000000000000.depend *.o *.obj *.rej *.orig *.dll *.h.gch moc_* Local.mak local.h conftest conftest.c conftest.log xca xca.exe setup.exe xca_0.9.3/AUTHORS000066400000000000000000000005351175342751200134420ustar00rootroot00000000000000Christian Hohnstädt Programming, translation, testing Kerstin Steinhauff Arts, Graphics Ilya Kozhevnikov implementing the W32 registry stuff Wolfgang Glas Adding SPKAC support and testing Geoff Beier MAC OS X Support and testing xca_0.9.3/COPYRIGHT000066400000000000000000000032601175342751200136630ustar00rootroot00000000000000 Copyright (C) 2001 - 2012 Christian Hohnstaedt. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This program links to software with different licenses from: - http://www.openssl.org which includes cryptographic software written by Eric Young (eay@cryptsoft.com)" - http://www.trolltech.com xca_0.9.3/INSTALL000066400000000000000000000062261175342751200134260ustar00rootroot00000000000000 -------------------=[ XCA ]=--------------------- A graphical user interface to OpenSSL. Requirements: ============== for compilation, you need the following Libraries: QT >= 4.4.0 from http://www.troll.no OpenSSL >= 0.9.8 from http://www.openssl.org GNU C++ compiler >= 3.1.0 GNU make Installation: ============= Configuration: -------------- XCA comes with its own configuration tool that has no relationship with the GNU "autoconf" and "automake" tools. Just the naming and invokation looks like it. Thus the usual way to configure and build a Package is the same: $ ./configure; make; make install You can build in a different subdirectory: - cd into the build directory and - call configure by its full path. For example, if you ar in the freshly unpacked xca-0.9.1 directory: mkdir Build && cd Build && ../configure && make -j10 To clean all built files: rm -rf Build If you have a special setup, you can predefine the following variables: CC, LD, STRIP, CFLAGS, prefix. e.g.: $ CC="ccache gcc" STRIP=: CFLAGS="-Wall -g" prefix=/opt/xca ./configure to have a cached build and to not strip xca when installing it. XCA expects the translationfiles in /opt/xca/share/xca/ and installs itself to /opt/xca/bin/ The header and library files were searched in: "$QTDIR /usr /usr/X11R6 /usr/local" and all directorys supplied at the commandline of configure. The QT installation dir should not be supplied at the CMDline of configure but rather written to the $QTDIR environment variable as it is done with the most distributions. If for example your shiny recent QT is in /home/chris/aaa/src/qt4 and your new OpenSSL is installed in /usr/local/ssl invoke configure like this: ---------------------------------------------- $ export QTDIR=/home/chris/aaa/src/qt4 $ ./configure /usr/local/ssl Found: qobject.h at /home/chris/aaa/src/qt4/include Found: libqt.so at /home/chris/aaa/src/qt4/lib Found: openssl/opensslv.h at /usr/local/ssl/include Found: libcrypto.so at /usr/local/ssl/lib The Versions of the used libraries are: ..... $ --------------------------------------------- This writes all found settings, vars and headers to "Local.mak". the variables "prefix" and "docdir" may be set while invoking configure, like: $ prefix=/usr docdir=/usr/share/doc/xca ./configure If docdir is unset, $prefix/share/xca will be used. After Local.mak was created by configure it can be used and modified for your needs. Building: ----------- The Makefiles do support parallel builds (-j) targets: all, xca : builds the app install : installs the app headers : UICs the headers in ui/ needed by other files. clean : deletes all builded files distclean: deletes also Local.mak xca.exe : W32 executable (see INSTALL.w32) setup.exe: W32 installer Installing: ------------ make destdir=/my/virtual/root provides /my/virtual/root/ as root-directory for installation to be mounted by others as root or as installdir for package builders. Running/invoking: ================= a detailed manual can be found in docs/ ---------------------------------------------------------- if there are any questions regarding this software, dont hesitate to contact me: christian@hohnstaedt.de xca_0.9.3/INSTALL.mac000066400000000000000000000034631175342751200141650ustar00rootroot00000000000000 This is a short overview of how to build XCA for MAC OSX Actually, I'm doing this on 64bit Lion It probably also works on older platforms or 32bit. Please drop me a mail if you experience problems.. Only the < 200MB "Command Line Tools for Xcode" are required to build XCA, not the comlete 2GB Xcode binary. Either Install QT SDK in your home directory, say /Users/XXX/QtSDK or install the qt-mac-carbon-opensource-4.7.3.dmg Decide whether OpenSSL 1.0.x shall be used. It is needed if - you want the most recent functionality of OpenSSL - you don't have at least SnowLeopard (Mac OS 10.5 comes with OpenSSL 0.9.7, which is too old for XCA) Compile OpenSSL 1.0.1c: ---------------------- # Download the latest OpenSSL sources, unpack them and change into it curl http://openssl.org/source/openssl-1.0.1c.tar.gz >openssl-1.0.1c.tar.gz tar zxf openssl-1.0.1c.tar.gz cd openssl-1.0.1c # define the installation dir and the path to the new library # it will be installed locally in you home directory export OPENSSLINSTALLDIR=$HOME/instopenssl export DYLD_LIBRARY_PATH=$OPENSSLINSTALLDIR/lib # configure openssl ./config shared --prefix=$OPENSSLINSTALLDIR # If your installation is 64 bit: ./Configure darwin64-x86_64-cc shared --prefix=$OPENSSLINSTALLDIR # build and install OpenSSL make && make install # IMPORTANT: you need to change access type of the libs to be writable chmod 755 $OPENSSLINSTALLDIR/lib/*.dylib # If Qt was installed in your home, set QTDIR appropriately: export QTDIR=$HOME/QtSDK Compile XCA: ------------ # change into the xca-0.9.3 directory and download the documentation # (The documentation is not mandatory and XCA will build without it) cd xca-0.9.3 curl http://git.hohnstaedt.de/xca-doc.tgz > doc/xca-doc.tgz # configure XCA and build the DMG file ./configure $OPENSSLINSTALLDIR make -j5 xca.dmg xca_0.9.3/INSTALL.qmake000066400000000000000000000012041175342751200145120ustar00rootroot00000000000000 Next to the usual configuration script, there is an alternative way to build xca. At least on unix, one can use qmake to create a makefile for building. Maybe this will help ,if you have a weired setup. $ qmake -o makefile At least on debian, the qmake command is "qmake-qt4" creates the makefile. I recommend makefile to not overwrite Makefile and also assures, that it is used instead of the original Makefile. Now you need to create the file Local.h $ cat >local.h < #define PREFIX "/usr/local" > #define ETC "/etc/xca" > #define VER "0.6.2" > EOF or you call ./configure to create it for you. now just build XCA with $ make xca_0.9.3/INSTALL.w32000066400000000000000000000046211175342751200140350ustar00rootroot00000000000000 This is a short overview of how to build XCA for windows. This is for debian hosts, cross-compiling a windows binary. Needed packages: mingw cross compiler makensis cross tool # apt-get install mingw32 mingw32-binutils mingw32-runtime nsis create a new, empty directory say xca-w32 $ cd xca-w32 $ tar zxf xca-0.x.y.tar.gz Use a W32 host to execute and install the selfextracting QT4....exe copy the installed tree to ./qt/ Now you can either call xca-x.y.z/misc/build-w32.sh and wait until xca_setup.exe is built, or follow the steps below by hand: $ export INSTALL_DIR=`pwd`/install OpenSSL 0.9.8 and 1.0.0 are supported. $ cp openssl-0.9.8X.tar.gz . $ tar zxf openssl-0.9.8X.tar.gz apply openssl-cross-patch: $ cd openssl-0.9.8X $ patch -p1 < ../xca/misc/openssl-0.9.8-mingw32-cross.patch (For openssl 1.0.0, use the ../xca/misc/openssl-1.0.0-mingw32-cross.patch) compile openssl with: $ sh ms/mingw32-cross.sh unpack libtool-2.2 and cd in libtool-2.2 $ ./configure --host i586-mingw32msvc --prefix ${INSTALL_DIR} $ make && make install unpack opensc-0.11.11.tar.gz and cd into opensc-0.11.11 $ CFLAGS=-I${INSTALL_DIR}/include LDFLAGS=-L${INSTALL_DIR}/lib LIBP11_CFLAGS=${CFLAGS} OPENSSL_CFLAGS=${CFLAGS} LIBP11_LIBS="-lp11" OPENSSL_LIBS="-leay32" ./configure --host i586-mingw32msvc --prefix ${INSTALL_DIR} --enable-openssl \ --disable-zlib \ --disable-readline \ --disable-iconv \ --enable-openssl \ --disable-openct \ --enable-pcsc \ --disable-nsplugin \ --disable-man \ --disable-doc \ --with-cygwin-native \ --without-xsl-stylesheetsdir \ --without-plugindir \ --without-pinentry $ make && make install compile xca: $ cd xca-0.x.y $ ./configure.w32 Edit Local.mak if needed: if your linux-qt is the same version as the w32 one, keep USE_HOSTTOOLS at "yes" otherwise set it to "no" and say make $ make Fix the missing System.dll in /usr/share/nsis/Plugins by copying it from an NSIS windows installation. Get the mingw runtime lib: $ zcat /usr/share/doc/mingw32-runtime/mingwm10.dll.gz >mingwm10.dll get the precompiled db_dump.exe from an other XCA installation $ cp db_dump.exe xca-w32 translate the QT language files $ lrelease-qt4 ../qt/4.6.2/translations/qt_*.ts create the setup.exe $ make setup.exe xca_0.9.3/Makefile000066400000000000000000000072461175342751200140400ustar00rootroot00000000000000# # Makefile for XCA # ##################################################################### TAG=RELEASE.$(TVERSION) TARGET=xca-$(TVERSION) MAKEFLAGS += -rR export BUILD=$(shell pwd) ifneq ($(MAKECMDGOALS), distclean) ifneq ($(MAKECMDGOALS), clean) ifneq ($(MAKECMDGOALS), dist) include Local.mak endif endif endif VPATH=$(TOPDIR) SUBDIRS=lib widgets img OBJECTS=$(patsubst %, %/.build-stamp, $(SUBDIRS)) INSTDIR=misc lang doc img INSTTARGET=$(patsubst %, install.%, $(INSTDIR)) APPTARGET=$(patsubst %, app.%, $(INSTDIR)) bindir=bin DMGSTAGE=$(BUILD)/xca-$(VERSION) MACTARGET=$(DMGSTAGE)-$(DARWIN) APPDIR=$(DMGSTAGE)/xca.app/Contents ifeq ($(SUFFIX), .exe) all: setup$(SUFFIX) else ifneq ($(MACDEPLOYQT),) all: $(MACTARGET).dmg else all: xca$(SUFFIX) do.doc do.lang @echo @echo "Ok, compilation was successful." @echo "Now do as root: 'make install'" @echo endif endif ifeq ($(MAKECMDGOALS),) MAKEFLAGS += -s PRINT=echo else PRINT=: endif export PRINT ifneq ($(TOPDIR), $(BUILD)) do.ui: clean_topdir clean_topdir: $(MAKE) -C $(TOPDIR) clean endif xca$(SUFFIX): $(OBJECTS) @$(PRINT) " LINK $@" $(CC) $(CFLAGS) $(LDFLAGS) $(patsubst %,@%, $^) $(LIBS) -o $@ do.ui do.doc do.lang: do.%: mkdir -p $* $(MAKE) -C $* -f $(TOPDIR)/$*/Makefile VPATH=$(TOPDIR)/$* $* headers: do.ui %/.build-stamp: headers mkdir -p $* $(MAKE) -C $* -f $(TOPDIR)/$*/Makefile \ VPATH=$(TOPDIR)/$* $(INSTTARGET): install.%: %/.build-stamp mkdir -p $* $(MAKE) -C $* -f $(TOPDIR)/$*/Makefile \ VPATH=$(TOPDIR)/$* install $(APPTARGET): app.%: %/.build-stamp mkdir -p $* $(MAKE) -C $* -f $(TOPDIR)/$*/Makefile \ VPATH=$(TOPDIR)/$* APPDIR=$(APPDIR) app clean: find lib widgets img -name "*.o" | xargs rm -f find lib widgets img -name ".build-stamp" | xargs rm -f find lib widgets -name "moc_*.cpp" | xargs rm -f rm -f ui/ui_*.h lang/xca_*.qm doc/*.html doc/xca.1.gz img/imgres.cpp rm -f lang/*.xml rm -f *~ xca$(SUFFIX) setup_xca*.exe rm -rf xca-* distclean: clean rm -f conftest conftest.log local.h Local.mak *~ */.depend dist: test ! -z "$(TVERSION)" git archive --format=tar --prefix=$(TARGET)/ $(TAG) | \ gzip -9 > $(TARGET).tar.gz snapshot: HASH=$$(git rev-parse HEAD) && \ git archive --format=tar --prefix=xca-$${HASH}/ HEAD | \ gzip -9 > xca-$${HASH}.tar.gz install: xca$(SUFFIX) $(INSTTARGET) install -m 755 -d $(destdir)$(prefix)/$(bindir) install -m 755 xca $(destdir)$(prefix)/$(bindir) $(STRIP) $(destdir)$(prefix)/$(bindir)/xca $(MACDEPLOYQT): macdeployqt/macdeployqt: $(MAKE) -C macdeployqt setup.exe: xca$(SUFFIX) do.doc do.lang setup.exe: misc/xca.nsi $(STRIP) xca$(SUFFIX) $(MAKENSIS) -DINSTALLDIR=$(INSTALL_DIR) -DQTDIR=$(QTDIR) \ -DVERSION=$(VERSION) -DBDIR=$(BDIR) -DTOPDIR=$(TOPDIR)\ -NOCD -V2 $< $(DMGSTAGE): xca$(SUFFIX) $(MACDEPLOYQT) rm -rf $(DMGSTAGE) mkdir -p $(DMGSTAGE)/xca.app/Contents/MacOS mkdir -p $(DMGSTAGE)/xca.app/Contents/Resources mkdir -p $(DMGSTAGE)/manual ln -s /Applications $(DMGSTAGE) install -m 644 $(TOPDIR)/COPYRIGHT $(DMGSTAGE)/COPYRIGHT.txt install -m 755 xca $(DMGSTAGE)/xca.app/Contents/MacOS $(STRIP) $(DMGSTAGE)/xca.app/Contents/MacOS/xca $(MAKE) $(APPTARGET) cp -r $(DMGSTAGE)/xca.app/Contents/Resources/*.html $(DMGSTAGE)/manual ln -s xca.html $(DMGSTAGE)/manual/index.html $(MACDEPLOYQT) $(DMGSTAGE)/xca.app tar zcf $(MACTARGET).tar.gz $(DMGSTAGE) xca.dmg: $(MACTARGET).dmg xca.app: $(DMGSTAGE) $(MACTARGET).dmg: $(DMGSTAGE) hdiutil create -ov -srcfolder $< $@ trans: $(MAKE) -C lang po2ts lupdate-qt4 $(TOPDIR)/xca.pro $(MAKE) -C lang xca.pot .PHONY: $(SUBDIRS) $(INSTDIR) xca.app setup.exe doc lang macdeployqt/macdeployqt $(DMGSTAGE) do.doc do.lang headers: local.h Local.mak local.h: $(TOPDIR)/configure $(TOPDIR)/configure xca_0.9.3/Rules.mak000066400000000000000000000015351175342751200141570ustar00rootroot00000000000000include $(BUILD)/Local.mak export VERSION=$(shell cat $(TOPDIR)/VERSION ) BASENAME=$(shell basename `pwd`) CPPFLAGS += -I\$(TOPDIR) -I\$(BUILD) -I\$(BUILD)/ui all: .build-stamp .build-stamp: $(OBJS) echo $(patsubst %, $(shell pwd)/%, $(OBJS)) > $@ @$(PRINT) " DONE [$(BASENAME)]" SRCS=$(patsubst %.o, %.cpp, $(OBJS)) HEADERS=$(shell ls *.h 2>/dev/null) GCH=$(patsubst %, %.gch, $(HEADERS)) # how to create a moc_* file moc_%.cpp: %.h %.cpp @$(PRINT) " MOC [$(BASENAME)] $@" $(MOC) $< -o $@ # how to create the headerfile from the *.ui ui_%.h: %.ui @$(PRINT) " UIC [$(BASENAME)] $@" $(UIC) -o $@ $< # default compile rule %.o: %.cpp @$(PRINT) " CC [$(BASENAME)] $@" $(CC) $(CPPFLAGS) $(CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@ .depend: $(SRCS) @$(PRINT) " DEP [$(BASENAME)]" $(CC) -MM $(CPPFLAGS) $(CFLAGS) $^ > $@ .SECONDARY: xca_0.9.3/VERSION000066400000000000000000000000061175342751200134330ustar00rootroot000000000000000.9.3 xca_0.9.3/changelog000066400000000000000000000374031175342751200142500ustar00rootroot00000000000000xca 0.9.3 Sat May 12 2012 * Fix double free in a1time resulting in random crashes xca 0.9.2 Sun May 6 2012 * Support for Local timezone dates. Differentiate between invalid and undefined dates. * Fix Bug #3461403 Error when create certificate with CRL distribution point User error -> Improve user-friendlyness * Fix Bug #3485139 Exception when creating certificates in passwordless db * Avoid very long names resulting in duplicate names in the database. * Add warning colors for expired dates. xca 0.9.1 Fri Oct 21 2011 * Close bug [ 3372449 ] All numeric names cannot be used * add search functionality for PKCS#11 libraries * fix ASN.1 encoding of PKCS#10 request * Close bug [ 3318203 ] Build failure with GNU gold linker * Add x509v3 extensions to the list of selectable columns * Close bug [ 3314262 ] Incorrect "Path length" template parameter handling * Close bug [ 3314263 ] Unrevoking a certificate does not make it "Trusted" * Feature Request [3286442] Make success/import messges optional * improve Password entry * Improve SPKAC import * add french translation by Patrick Monnerat * Export requests or certificates as openssl config file * Support building with EC disabled * Close bug [3091576] Private key export is always PKCS#8 encoded * Feature Request [3058196] Autoload database * Feature Request [3058195] Export directly to the clipboard * Close bug [3062711] Additional OIDs * Close bug [3062708] Invalid user configuration file path name * Fix PKCS#11 library handling xca 0.9.0 Sun Aug 29 2010 * support loading more than one PKCS#11 library * remove the need for engine_pkcs11 now more than one PKCS#11 library can be loaded and used in parallel * Add de/selection of columns and add a lot of new possible columns All Subject entries, the subject hash and whole name, Certificate fingerprints, dates, CA info, CRL number, corresponding key of certs and requests * Improve CRL generation [3035294] CRLNumber, CRLReason * improve creating templates from cert - enhance parsing of CRL-DP, SAN, IAN and AuthInfoAcc - add support for CertificatePolicies - unknown extension are written as generic DER * improve date handling. "notBefore" is not reset to now anymore when applying a time range * Support dropping files onto the application * russian translation by Pavel Belly * support loading DER formatted PKCS#8 keys * ease commandline use * add DH param generation menu entry * improve token handling and PIN changing dialogs * improve key-value table input for "additional DN entries" * PIN and PUK changing implemented * apply partial template-contents - applying the subject only or the extensions only is possible now * add informational messageboxes - whenever an item was successfully created or imported * add support for random serial numbers * improve messages, usability and german translation * improve token support - token initializing - creating keys on a token - store existing keys on a token - delete keys and certs from a token xca 0.8.1 Tue Jan 5 2010 * fix string conversion from QString to ASN1 xca 0.8.0 Thu Dec 10 2009 * improve documentation * improve file-dialog handling * Generate Template from certificate or PKCS#10 request -> Feature request [2213094] and [1108304] * add hash algos "ripemd160" and "SHA384" * add the "no well-defined date" from RFC 5280 as checkbox * Feature request [1996192] Include "OCSPSigning" in misc/eku.txt * Support for EC keys * Update Step-by-step documentation Thanks Devin Reade * Support for Smart Cards * set proper file-extension .xdb on opening databases xca 0.7.0 Fri Sep 11 2009 * support modifying the CSR subject during signing * update key images * fix date settings in Certificate renewal dialog * fix certificate request verification * check for duplicate x509 v3 extensions Bug [ 1881482 ] and [ 1998815 ] * make sha1 the default hash to avoid problems with other software Bug [ 1751397 ] * add validation button to see all extensions before creating the cert * change the hashing for the default password. this makes it incompatible to older versions * Major changes for MAC OS X * extend template format for nconf settings * add nconf input field for arbitrary OpenSSL extensions and a "validate" button to check the settings before applying * fix xca.desktop Bug [ 1837956 ] * fix item-export error handling * add PEM paste import feature * extend PEM import to import all items from a PEM file xca 0.6.4 Mon Aug 13 2007 * Bug "tree view loose track" fixed * check for certificate errors and display them instead of crashing * move used-keys-button form options to NewX509 dialog * Set string options in options dialog * remove extension and attribute tab in details dialog if no extensions or attributes available * documentation updated * X509 request attributes (like challange password) can be set and viewed. xca 0.6.3 Thu May 17 2007 * show CRL signature algorithm information * Add options dialog to set the default hash algo, mandatory distinguished name entries and allow duplicate key use as requested by some users * make cert, crl and key details copy&paste able * fix background color of clicklabels Bug [ 1704699 ] * remove missleading tooltips Bug [ 1704700 ] * fix segfault * switch string handling to UTF8 xca 0.6.2 Mon Apr 9 2007 * break endless loop in chain building Bug [ 1696878 ] xca 0.6.1 Thu Apr 5 2007 * minor documentation updates * Fix openssl-cross patch * recognize certificates with circular references [ xca-Bugs-1693027 ] * be compatibile to QT-4.1 (thanks Tamas TEVESZ) * remove all usages of QT3 backward lib [ xca-Feature Requests-1692800 ] xca 0.6.0 Fri Mar 16 2007 * set initial sorting to ascending order * add RFC2253 representation of subject and issuer to copy & paste * fix dialog sizes for long DNs * move hash algo into signer box [ 1656260 ] * make QA serial a compile time option * fix date generation and warn if generalized time is used * autodetect and load any type of PEM files * fix version number in exported *.xca template * fix import of older XCA templates * add support for predefined templates as there was in 0.5.1 * fix cmdline import of crypto items * add undelete feature for deleted items * fix database shrinking of curent db during opening of new db xca 0.6.0-beta02 Fri Feb 2 2007 * correct and fixate the order of x509name entries * Add CRL properties dialog to select the dates and the signing algo * Add SHA256 and SHA512 * Certificate export for apache and OpenSSH+X509 * Default templates for client, server, CA removed * template duplication added * sort serial numbers numerically and not lexicographically Bug [1166075] * add build support for cygwin and mingw-cross * delete rpm/ and debian/ subdirs * Port to QT4 and openssl 0.9.8 remove the need of Berkeley DB importing of old database dump possible * finish support for Mac OS X * add X509 V3 extensions to PKCS#10 requests * add "validation" function for editable extensions below * add "edit" buttons for subject/issuer alt. name, crl dist. point and cert. auth. info access * add DB-dump function into subdirs * Support for DSA keys * Fix error in template changing * change storage-format of keys: store the public unencrypted and the private additionally encrypted. * Allow different passwords for keys xca 0.5.1 Tue Jul 13 2004 * support for different languages on WIN platform (Thanks Ilya) * better installation and deinstallation on WIN platform * documentation updated xca 0.5.0 Sun Jun 13 2004 * orthographical changes * more translations * segfault in CRL import removed * manpage and documentation updated * store "midnight" in template xca 0.4.7-RC2 Fri Apr 16 2004 * open db if explicit mentioned, otherwise do not. * Errormessage on a wrong pkcs12 password more comprehensive * postinst and postrm do update-menu * search more intensive for the CRL signer * add /etc/xca/nid.txt to OID search path * debian build enhanced, lintian satisfied, manpage added. * AuthorityInfoAccess enhanced "aia.txt" as oid list added * allow empty passwords on PKCS#12 import xca 0.4.7-RC1 Thu Feb 5 2004 * debian menu-entry added * Open and closing of different databases * Menu added * German translation * CRLs will revoke existing certs * memory leaks removed * support for other compiled in basedir on unix * Authority info access added Certificate policies still pending :-( * additional (private) oids can be registered in oids.txt * OIDs for extended key usage and Distinguished name are now read from eku.txt and dn.txt respectively. * About dialog and help window added. * Requestdetail is now tabdialog xca 0.4.6 Tue Nov 25 2003 * Country is State or Province * xca.dsp: WIN32 changes from Ilya * New configure added, Makefile.in's purged and one configuration: "Local.mak" for flags and compilers. supports parallel builds (make -j) * SmartCard Logon OID added * Fixed bugs: * [ 846052 ] Tab order in Certificate Netscape extensions is wrong * [ 845800 ] CRL Generation problem for Netscape * [ 836967 ] Unable to specify alternate database * [ 843725 ] xca dies when opened with a pem key as argument * [ 789374 ] Bad encoding in misc/xca.desktop * by Wolfgang Glas : - Support for UTF8 in x509name - Netscape SPKAC support added xca 0.4.5 Wed Aug 13 2003 * more german translations * [ 737036 ] make error texts copiable from pop-up-windows to clipboard by adding a button doing this * [ 767603 ] Key sizes Implemented by making the Key-size ComboBox editable to enter arbitrary key sizes. * [ 765774 ] change password for database xca 0.4.4 Wed Aug 6 2003 * [ 783853 ] renewal uses 'notBefore' as 'notAfter' date * [ 783830 ] GeneralizedTime-format breaks browsers xca 0.4.3 Tue Aug 5 2003 * remove Certificate creation bug (AuthKeyId) * always take the right cert for signing * critical flag in key usage and extended key usage works now * Import of Multiple items is done and works [ 739726 ] extend description of -p option [ 775529 ] Import of PKCS#7 item not shown * made the details dialogs internal name read only * some segmentation faults removed * VPN OIDs added to Ext. Keyusage xca 0.4.2 Sun Jul 20 2003 * Memory leak removed * Template import and export added * fix bug [ 773056 ] Duplicate 'All files (*.*)' selection on import menus * import of PKCS#12 keys repaired * crl icon added to W32 installation * /usr/local/include removed from CPP flags * Buttons "Export Cert" and "Change Template" reconnected. * Authority Key identifier repaired xca 0.4.1 Tue Jul 15 2003 * some compiling issues removed * Import via commandline repaired, * signing of requests without key fixed * Changes for WIN32 version from Ilya added * solved bug: [ 770120 ] Attempting to export private key results in no file exported * implemented feature request: [ 755599 ] add PFX import button to Keytab xca 0.4.0 Tue Jul 8 2003 * Solved bugs: * [ 752111 ] Cannot handle dates past 32-bit boundary (2038) * [ 744227 ] Bug in handling of 3rd. party CRLs * The following Feature requests were implemented: * [ 743152 ] Attributes in subject name * [ 755853 ] select the hash algorithm for signing. * The code was completely rewritten to remove many unpretty codefragements and get a more stable codebase * The names of certs and keys in the detailsview of Certs, CRLs and Requests are clickable. * xca desktopfile added and will be installed in applications, key.xpm will be installed as xca.xpm in pixmaps ([ 763954 ] xca.desktop file) Thanks to Enrico Scholz xca 0.3.2 Thu May 15 2003 * Optimizations, icon for WIN32 platform * MS Registry and %USERPROFILE% support * Support for PKCS#7 certs (im/export) * small UI changes xca 0.3.1 Thu Apr 24 2003 * Tool Tips added * CRL handling (import, export, details) added xca 0.3.0 Fri Apr 25 2003 * several bugfixes and memoryleaks removed * export to TinyCA and "openssl ca" added * switch between tree/plain view in certificate list * notAfter dates in certificate view can be sorted reasonably * libdb-4.1.24 and higher is supported * The certificate details dialog was redesigned to be a smaller tab-dialog * Mainwindow dialog shrinked * Item viewing and import via the commandline is possible * documentation littlebit updated * changes in configure * The wizard invokes the key generation process only if really needed xca 0.2.12 Mon Jan 6 2003 * PKCS#7 encryption and signing of files added * First attempt of documentation added * Several export targets added * Certificate renewal repaired xca 0.2.11 Wed Dec 4 2002 * Certificate export enhanced, increase signer-serial on certimport. * interpretation of serial as hex and not as dezimal. * configure continues even if qt lib is absent. * $HOME/xca is created if it does not exist. xca 0.2.10 Tue Oct 29 2002 * shows not After time and serial in listview * some segfaults removed * Certificate renewal implemented * extension-bug removed * request-kontextmenu contains signing * create request from certificate * FreeBSD paths and libs recognized by configure xca 0.2.9 Mon Oct 21 2002 * several segfaults eliminated * key-use counter corrected * initial truststate fixed * remembers Im/Export directories * import of mutiple certs/keys/requests/pkcs12 * database transactions activated * exception-handling completed xca 0.2.8 Sun Oct 13 2002 * consistency checks for Iss-alt-name and Sub-alt-name * Check for certificate dates to not exceed those of the signer * defines for libdb >4.1.x * default templates added * package-builder do build without printf-debugging * key-use counter works now well xca 0.2.7 Tue Oct 8 2002 * segfaults removed * minor wizard changes xca 0.2.6 Mon Sep 30 2002 * show common name in request list and certificate list * CRL generation added * Key-export fixed * signing-template, CRL date and CRL time interval adjustable * Fix for windows filenames xca 0.2.5 Tue Sep 24 2002 * Certificate and Template Wizard completed * CA-serial can be changed and is stored with the cert * Passwordboxes set focus right (Andrey Brindeew ) * configure enhanced with error and success messages * x509 v3 extensions completed inc. Netscape extensions * Templates implemented * Files for MS Visual C++ added (yes, it compiles on MS Windows) * Windows Installer added (Nullsoft) xca 0.2.4 Tue Sep 10 2002 * PKCS#12 import added * bugfixes fileview, requestgeneration xca 0.2.3 Wed Sep 4 2002 * icons changed * context menu on right mousebutton * trust state settings added * dialogboxes are resizeable * extended keyusage added to v3 extensions when creating new cert * all dialogs translated to english * no more images in *.ui files xca 0.2.2 Thu Jul 18 2002 * basic constraints, key usage and subject/authority key identifier * signing wizard... * Signatures can be done with requests and from scratch * Certificate for signing can be self or foreign, * password is saved as md5sum xca 0.1.12 Thu Jul 11 2002 * icons added * treeview for Certificates * private keys are triple DES encrypted in db * program asks for initial password on startup * some segfaulting bugs removed xca 0.1.11 Wed Jul 3 2002 * RSA Keys are generated and stored to or loaded from a file in either DER or PEM format. * They get stored in a local Berkeley DB. * Changing their description and viewing their contents, as well as deleting them from local DB is possible. xca_0.9.3/configure000077500000000000000000000213261175342751200143020ustar00rootroot00000000000000#!/bin/sh -e ##################################################### # this configure-script searches for the needed includes # and libraries. # # it is MUCH faster, smaller and does what I want. :-) # # If you have openssl installed in # an unusual directory like /home/me/install/ssl # just give it as argument to ./configure # it then searches for headers in /home/me/install/ssl/include # and librarys in /home/me/install/ssl/lib # # if you have a very unusual setup or you are cross-compiling # you can edit "Local.mak" to fit your needs and to reflect your setup # # The Makefiles should support parallel builds. # ####################################################### TOPDIR="`cd $(dirname $0) && pwd`" read VERSION < ${TOPDIR}/VERSION cat <reconfigure export QTDIR="$QTDIR" export CFLAGS="${CFLAGS}" export LDFLAGS="${LDFLAGS}" export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" export prefix="${prefix}" export docdir="${docdir}" export RC="stop" exec $0 $@ EOF chmod 755 reconfigure cat < \(/.*/\)[^/]*\.so.*,\1,' | grep "^/" | sort -u | \ while read lib; do echo -n "-L${lib} " done echo "$DIR" ) STDLIB="$STDLIB $EXTRALIB" fi err() { echo echo ERROR: $1 echo err_occ=Y } #adds an includedir to $CF add_include() { for _dir in $STDINC ${CF}; do if test "-I$1" = "${_dir}"; then return 0 fi done CF="${CF} -I$1" } add_lib() { if test "$3" = "a"; then SLIBS="$SLIBS -l$2" else LIBS="$LIBS -l$2" fi for _libs in ${STDLIB} ${LDIRS}; do if test "-L$1" = "${_libs}"; then return 0 fi done LDIRS="${LDIRS} -L$1" } # check for includes search_includes() { for dir in ${DIRS}; do for dbn in "" ${subdirs}; do for include in outinc include; do if test -r "${dir}/${include}${dbn}/$1"; then add_include ${dir}/${include}${dbn} test -z "${dbn}" || add_include ${dir}/${include} echo "Found: $1 at ${dir}/${include}${dbn}" return 0 fi done done done return 1 } # check for libs search_lib() { for dir in ${DIRS}; do for dbn in $@; do for suffix in so dylib obj a; do for lib in lib lib64 lib32 out; do if test -r "${dir}/${lib}/lib${dbn}.${suffix}"; then add_lib "${dir}/${lib}" "${dbn}" "${suffix}" echo "Found: lib${dbn}.${suffix} at ${dir}/${lib}" return 0 fi done done done done return 1 } check_frameworks() { for fw in $@; do for dir in $QTDIR/lib /Library/Frameworks; do if test -d $dir/${fw}.framework; then return 0 fi done done return 1 } if test "$#" = "0" && test -z "$DARWIN" && test -z "$QTDIR" && \ pkg-config QtGui openssl --libs >/dev/null; then CF="`pkg-config QtGui openssl --cflags`" LIBS="`pkg-config QtGui openssl --libs` -lltdl" else by_hand=true fi if test "$by_hand" = "true"; then ######################### QT if test -z "$DARWIN"; then subdirs="/qt /qt4" search_includes QtCore/QObject || err "The QT Library headerfiles were not found. Set QTDIR appropriately." search_lib QtCore4 QtCore || err "The QT Core library was not found." search_lib QtGui4 QtGui || err "The QT Gui library was not found." search_lib ltdl || err "Libtool ltdl not found." search_lib c_r || true else check_frameworks QtGui QtCore || err "QT Framework not found, needed on Mac OSX, please install QT" fi ###################### OpenSSL subdirs="" search_includes openssl/opensslv.h || err "The OpenSSL library headerfiles were not found." search_lib crypto || err "The OpenSSL library was not found." fi cat << EOF CFLAGS=${CFLAGS} CPPFLAGS=${CF} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} PREFIX=${prefix} docdir=${docdir} EOF export LD_LIBRARY_PATH ##### Try to compile them all together and show the versions. cat >conftest.cpp < #include #include #include #include #include #define WARN "###################### WARNING ######################" int main(){ char buf[2048] = ""; printf("\nThe Versions of the used libraries are:\n" "Header:\n" "\t%s 0x%lxL\n" "\tQT: %s\n" "Libraries:\n" "\t%s\n" "\tQT: %s\n", OPENSSL_VERSION_TEXT, OPENSSL_VERSION_NUMBER, QT_VERSION_STR, SSLeay_version(SSLEAY_VERSION), qVersion() ); if (QT_VERSION < 0x040300) { printf("You need Qt 4.3.0 or higher\n"); return 1; } if ( OPENSSL_VERSION_NUMBER < 0x00908000L ) { printf("You need OpenSSL >= 0.9.8 or higher\n"); return 1; } if (strcmp(QT_VERSION_STR, qVersion())) strcat(buf, "The versions of the QT headers and library differ\n"); if (strcmp(OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION))) strcat(buf, "The versions of the OpenSSL headers and library differ\n"); #ifdef OPENSSL_NO_EC strcat(buf, "This OpenSSL installation has no EC cryptography support\n"); #endif if (buf[0]) printf("\n\n" WARN "\n%s" WARN "\n\n", buf); return 0; } EOF echo "${CC} $LDIRS $LIBS $CF $CFLAGS ${LDFLAGS} conftest.cpp -o conftest${SUFFIX}" >conftest.log if ${CC} $LIBS $LDIRS $CF $CFLAGS ${LDFLAGS} conftest.cpp -o conftest${SUFFIX} >> conftest.log 2>&1; then if ! ./conftest${SUFFIX}; then err "Unable to execute a freshly compiled application, maybe you have to adjust your LD_LIBRARY_PATH or /etc/ld.so.conf" else rm -rf conftest.cpp conftest${SUFFIX} conftest.log conftest.dSYM fi else err "Unable to compile a minimal application look at 'conftest.log' for errors" fi if which linuxdoc 2>&1; then LINUXDOC="linuxdoc" else echo "Application 'linuxdoc' not found." if tar ztf ${TOPDIR}/doc/xca-doc.tgz xca.html >/dev/null 2>&1; then echo "But Found a valid documentation package 'doc/xca-doc.tgz'" else echo "No documentation will be generated." fi LINUXDOC=":" fi findapp() { for app in `which $@ 2>/dev/null`; do if test -x "$app"; then echo "$app" break fi done } if test -z "$QTDIR"; then MOC=`findapp moc4 moc-qt4 moc` UIC=`findapp uic4 uic-qt4 uic` RCC=`findapp rcc4 rcc-qt4 rcc` LRELEASE=`findapp lrelease4 lrelease-qt4 lrelease` else MOC=$QTDIR/bin/moc UIC=$QTDIR/bin/uic RCC=$QTDIR/bin/rcc LRELEASE=$QTDIR/bin/lrelease fi cat >Local.mak <local.h </dev/null | grep GNU; then mak="${dirs}/${make}" return fi done done } find_make echo if test ! -z "${mak}"; then echo "A usable 'make' executable was found in ${mak}" else echo "No usable 'make' executable found." fi echo if test "x${err_occ}" = "xY"; then echo echo "An error occured. Please edit 'Local.mak' manually if compiling fails." fi test -f Makefile || ln -s ${TOPDIR}/Makefile xca_0.9.3/configure.w32000077500000000000000000000035531175342751200147160ustar00rootroot00000000000000#!/bin/sh -e BDIR=`cd ..; pwd` TOPDIR="`cd $(dirname $0) && pwd`" read VERSION < ${TOPDIR}/VERSION QT=`find "$BDIR"/qt/ -name 4.* |tail -n1` LIBS="libeay32.a libltdl.a" INCS="openssl/opensslv.h ltdl.h" for l in $LIBS; do if test -f "$INSTALL_DIR/lib/$l"; then echo found "$INSTALL_DIR/lib/$l" else echo NOT found "$INSTALL_DIR/lib/$l" fi done for i in $INCS; do if test -f "$INSTALL_DIR/include/$i"; then echo found "$INSTALL_DIR/include/$i" else echo NOT found "$INSTALL_DIR/include/$i" fi done echo "QT: '$QT'" if test -z "$QT"; then cat << EOF OpenSSL or QT not found: please look at INSTALL.w32 EOF fi cat > Local.mak << EOF export TOPDIR=$TOPDIR export VERSION=$VERSION export HOST=w32 BDIR=$BDIR QTDIR=$QT INSTALL_DIR=$INSTALL_DIR MAKENSIS=makensis CROSS=i586-mingw32msvc- CONSOLE=-mwindows #CONSOLE=-mconsole CPPFLAGS=-I\$(TOPDIR) -I\$(QTDIR)/include -I\$(INSTALL_DIR)/include -I\$(BUILD) -I\$(BUILD)/ui CFLAGS=-Wall -g -O2 -mthreads -mno-cygwin \$(CONSOLE) -mnop-fun-dllimport -Wno-strict-aliasing LDFLAGS= -L\$(QTDIR)/lib -L\$(INSTALL_DIR)/lib \ -enable-stdcall-fixup -enable-auto-import \ -enable-runtime-pseudo-reloc # list of dynamic libraries LIBS=-lQtGui4 -lQtCore4 -lqtmain -lstdc++ -lws2_32 -lcrypto -lwsock32 -lgdi32 -lltdl # As long as the linux uic and moc are version compatible to the W32 ones # we use the native tools, because they are much faster than the wine's USE_HOSTTOOLS=yes ifneq (\$(USE_HOSTTOOLS), yes) MOC=wine \$(QTDIR)/bin/moc UIC=wine \$(QTDIR)/bin/uic RCC=wine \$(QTDIR)/bin/rcc LRELEASE=wine \$(QTDIR)/bin/lrelease else MOC=moc-qt4 UIC=uic-qt4 RCC=rcc LRELEASE=lrelease endif CC=\$(CROSS)gcc LD=\$(CROSS)ld STRIP=\$(CROSS)strip WINDRES=\$(CROSS)windres SUFFIX=.exe LINUXDOC=linuxdoc prefix= basedir= EOF echo "#define VER \"${VERSION}\"" >local.h test -f Makefile || ln -s ${TOPDIR}/Makefile xca_0.9.3/darwin-cross/000077500000000000000000000000001175342751200150025ustar00rootroot00000000000000xca_0.9.3/darwin-cross/build-darwin-toolchain.txt000066400000000000000000000061721175342751200221100ustar00rootroot00000000000000 This document describes how to to install a cross-compiler toolchain to build XCA -------------------------------------- export TARGET=i686-apple-darwin10 export PREFIX=/opt/mactry export SDK=${PREFIX}/SDKs/MacOSX10.6.sdk export PATH=$PATH:${PREFIX}/bin export INSTALL_DIR=`pwd`/install # Build xar from http://code.google.com/p/xar/downloads/list ########################################## tar zxf xar-1.5.2.tar.gz cd xar-1.5.2 ./configure make -j4 sudo make install # install dmg2img sudo aptitude install dmg2img hexdump pax # Download xcode_3.2.2_and_iphone_sdk_3.2_final.dmg # Go to developer.apple.com and create a free account for yourself, # download Xcode 3.x.y # # unpack Xcode SDK ################################################ dmg2img xcode_3.2.2_and_iphone_sdk_3.2_final.dmg mkdir mnt sudo modprobe hfsplus # calculate the beginning of the image (echo ibase=16; dd if=xcode_3.2.2_and_iphone_sdk_3.2_final.img bs=1024 count=1024 2>/dev/null |hexdump -C | grep "48 2b 00 04" |sed 's/ .*/-400/') | bc # in my case 36864 sudo losetup -o 36864 /dev/loop0 xcode_3.2.2_and_iphone_sdk_3.2_final.img sudo mount -t hfsplus /dev/loop0 mnt xar -xv -f mnt/Packages/MacOSX10.6.pkg Payload zcat Payload | (cd $PREFIX; cpio -id) sudo umount mnt/ sudo losetup -d /dev/loop0 rm -f $SDK/Library/Frameworks ln -s $SDK/System/Library/Frameworks $SDK/Library/ # Download qt-mac-opensource-4.6.2.dmg from Nokia # ############################################### dmg2img qt-mac-opensource-4.6.2.dmg # calculate the beginning of the image (echo ibase=16; dd if=qt-mac-opensource-4.6.2.img count=1024 count=1024 2>/dev/null |hexdump -C | grep "48 2b 00 04" |sed 's/ .*/-400/') | bc # 32768 in my case sudo losetup -o 32768 /dev/loop0 qt-mac-opensource-4.6.2.img sudo mount -t hfsplus /dev/loop0 mnt zcat mnt/packages/Qt_libraries.pkg/Contents/Archive.pax.gz | (cd $SDK/System; pax -rv ) zcat mnt/packages/Qt_headers.pkg/Contents/Archive.pax.gz | (cd $SDK/System; pax -rv ) zcat mnt/packages/Qt_plugins.pkg/Contents/Archive.pax.gz | (cd $SDK; pax -rv ) sudo umount mnt/ sudo losetup -d /dev/loop0 # # build odcctools # #################### svn co http://svn.macosforge.org/repository/odcctools/trunk odcctools # Checked out revision 159. cd odcctools ./extract.sh cd odcctools patch -p1 < ../../odcctools.diff ./configure \ --prefix=${PREFIX} \ --target=${TARGET} \ --with-sysroot=${SDK} \ --enable-as-targets="i386 x86_64" make -j3 && make install # # install the toolchain # ############## tar zxf gcc-5659.tar.gz patch -p0 +#if __WORDSIZE == 64 +typedef uint64_t natural_t; +typedef int64_t integer_t; +#else typedef uint32_t natural_t; typedef int32_t integer_t; +#endif typedef natural_t vm_offset_t; typedef natural_t vm_size_t; --- odcctools.orig/otool/print_objc.c 2010-06-15 17:48:47.000000000 +0200 +++ odcctools/otool/print_objc.c 2010-06-13 14:16:17.000000000 +0200 @@ -23,7 +23,7 @@ #include "stdio.h" #include "string.h" #include "mach-o/loader.h" -#include "objc/objc-runtime.h" +//#include "objc/objc-runtime.h" #include "stuff/allocate.h" #include "stuff/bytesex.h" #include "stuff/symbol.h" @@ -136,7 +136,7 @@ uint32_t characters; /* char * (32-bit pointer) */ uint32_t _length; }; -typedef struct objc_string_object_t NXConstantString; +//typedef struct objc_string_object_t NXConstantString; #define SIZEHASHTABLE 821 struct _hashEntry_t { @@ -491,6 +491,14 @@ enum byte_sex host_byte_sex, enum bool swapped); +#define CLS_GETINFO(cls,infomask) ((cls)->info & (infomask)) +#define CLS_SETINFO(cls,infomask) ((cls)->info |= (infomask)) + +// class is not a metaclass +#define CLS_CLASS 0x1 +// class is a metaclass +#define CLS_META 0x2 + /* * Print the objc segment. */ xca_0.9.3/doc/000077500000000000000000000000001175342751200131345ustar00rootroot00000000000000xca_0.9.3/doc/.gitignore000066400000000000000000000000261175342751200151220ustar00rootroot00000000000000*.html xca.1 xca.1.gz xca_0.9.3/doc/Makefile000066400000000000000000000013701175342751200145750ustar00rootroot00000000000000ifeq ($(TOPDIR),) TOPDIR=.. BUILD=.. endif DELFILES=xca*.html xca.1.gz doc: xca.1.gz xca.html include $(TOPDIR)/Rules.mak mandir=man xca.1.gz: xca.1 gzip -9 <$^ >$@ xca.html: xca.sgml rm -f xca*.html echo 'The documentation for XCA can be viewed online at: http://xca.sourceforge.net/.' > $@ test ! -f xca-doc.tgz || tar zxf xca-doc.tgz @$(PRINT) " DOC [$(BASENAME)] $@" $(LINUXDOC) -B html $< >/dev/null install: xca.1.gz xca.html install -m 755 -d $(destdir)$(docdir) \ $(destdir)$(prefix)/$(mandir)/man1 install -m 644 xca*.html $(destdir)$(docdir) install xca.1.gz $(destdir)$(prefix)/$(mandir)/man1 app: xca.html mkdir -p $(APPDIR)/Resources install -m 644 xca*.html $(APPDIR)/Resources xca_0.9.3/doc/xca.1000066400000000000000000000035241175342751200137750ustar00rootroot00000000000000.TH XCA 1 .SH NAME xca \- X Certificate and key management .br A GUI for handling X509 certificates, RSA/DSA/EC keys, PKCS#10 Requests and CRLs in Software and on Smartcards. .SH SYNOPSIS .B xca .RI [ -v ] .RI [ -d ] .RI [ -x ] .br .SH "DESCRIPTION" This application is intended as CA, certificate- and Key store. It uses a single file to store the items. Supported are Certificate signing requests (PKCS#10), Certificates (X509v3), RSA, DSA and EC keys and Certificate revokation lists. The signing of requests, and the creation of selfsigned certificates is supported. Both can use templates for simplicity. The PKI structures can be imported and exported in several formats like PKCS#12, PEM, DER, PKCS#8, PKCS#7. .br XCA enables users to manage smartcards via the PKCS#11 interface .SH OPTIONS A summary of options are included below. There are some deprecated legacy options: .RI [ -k ] .RI [ -r ] .RI [ -c ] .RI [ -p ] .RI [ -7 ] .RI [ -l ] .RI [ -t ] .RI [ -P ] .br Before XCA 0.9.0, the type of the items had to be given. This was removed since. Just put all keys, certs, requests and the database unsorted on the commandline. For backwards compatibility those options are ignored when found. .TP .B \-v Show version information and exit. .TP .B \-d expect the following argument to be a new database to use. .TP .B \-x Exit after processing all commandline options. Usually after importing the items from commandline the application will startup as usual. With the .I -x option given it will exit after finishing the import dialog. This is useful if xca is used as default application for viewing certificates, keys or requests. .SH SEE ALSO A more detailed HTML documentation can be found in the doc directory, in the "Help" menu of the application or on http://xca.sf.net .SH AUTHOR This manual page was written by Christian Hohnstaedt xca_0.9.3/doc/xca.sgml000066400000000000000000001470521175342751200146040ustar00rootroot00000000000000
XCA - X Certificate and key management <author>(c) by Christian Hohnstädt, <tt>christian@hohnstaedt.de</tt> <date>May 2012 - Version 0.9.3 <abstract> This application is intended for creating and managing X.509 certificates, certificate requests, RSA, DSA and EC private keys, Smartcards and CRLs. Everything that is needed for a CA is implemented. All CAs can sign sub-CAs recursively. These certificate chains are shown clearly. For an easy company-wide use there are customiseable templates that can be used for certificate or request generation. All crypto data is stored in an endian-agnostic file format portable across operating systems. </abstract> <toc> <sect>Introduction <p> This application is intended as Certificate- and key-store and as signing application issuing certificates. <p> All data structures (Keys, Certificate signing requests, Certificates and Templates) can be imported and exported in several formats like DER or PEM. Import means reading a file from the filesystem and storing the data structure into the database file, while exporting means to write the data structure from the database file to the filesystem to be e.g imported into an other application. <p> When opening a new database the first time, it needs a password to encrypt the private keys in the database. This is the default password. Every time this database is opened the application asks for the password. This input dialog may be canceled and the database is still opened successfully. However, the access to the keys is not possible without supplying the correct database password everytime a key is used. <p> When setting an empty password, XCA will never ask again for a password when opening this database. This can be useful when playing around with testcertificates or if all private keys are on tokens. <p> The database password can be changed by the Menu item <em>File->Change DataBase password</em> <p> The different cryptographic parts are divided over 5 Tabs: Keys, Requests, Certificates, Templates and Revocation lists. All items can be manipulated either by a context menu available by right-clicking on the item, or by using the buttons at the right border. Every item is identified by an internal name which is unique in one tab-view and is always shown in the first column. <sect1>File Formats <p> There are several default file-formats to exchange cryptographic data with other applications. <itemize> <item><bf>DER</bf> <bf>D</bf>istinguished <bf>E</bf>ncoding <bf>R</bf>ules is the binary ASN.1 encoding of the data. <item><bf>PEM</bf> <bf>P</bf>rivacy-<bf>E</bf>nhanced <bf>M</bf>ail is the base64 encoded version of the <bf>DER</bf> formated data with additional header and footer lines to be transported via e.g. E-mail <item><bf>PKCS#X</bf> <bf>P</bf>ublic <bf>K</bf>ey <bf>C</bf>ryptography <bf>S</bf>tandards published by <url url="http://www.rsasecurity.com" name="RSA Laboratories"> </itemize> <sect1>Further Reading <label id="otherdoc"> <p> <enum> <item><url url="http://tldp.org/HOWTO/SSL-Certificates-HOWTO/" name="SSL Certificates HOWTO"> <item><url url="http://ospkibook.sourceforge.net/" name="OS-PKI book"> </enum> <sect1>Copyright <p> <tscreen><verb> Copyright (C) 2001 - 2012 Christian Hohnstaedt. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This program links to software with different licenses from: - http://www.openssl.org which includes cryptographic software written by Eric Young (eay@cryptsoft.com)" - http://www.trolltech.com </verb></tscreen> <sect1>Credits <p> <tscreen><verb> Kerstin Steinhauff <tine (at) kerstine.de> Arts and graphics Ilya Kozhevnikov <ilya (at) ef.unn.ru> Registry stuff for WIN32 Wolfgang Glas <wolfgang.glas (at) ev-i.at> Implementation of SPKAC and UTF8 support Bugreports and feature input: Frank Werner <Frank (at) WeSoft.de> Peter Bieringer <pb (at) bieringer.de> </verb></tscreen> Thank you very much. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Misc <sect1>Updating from Older Versions (Older than 0.6.0) <p> Older versions of XCA used a Berkely database for storing the crypto items. Starting from version 0.6.0 this has changed to a simple endian independent file format for several reasons: <itemize> <item>The Berkeley db API was a moving target and every distribution had different versions installed. Handling all versions well ended up in an "#ifdef hell" where every second build failure was based on a different API in an other db version. <item>The database got corrupted if a log.0000001 file was deleted. <item>copying a database from one place to another was only possible, if the log file was also copied. This breaks the approach of having one single, simpe file containing the crypto items. </itemize> <p> Since XCA 0.6.0 is not compiled with Berkeley DB support it cannot read old file formats. The extension of files has changed from *.db to *.xdb . Importing old databases is done by the following steps: <itemize> <item>Use db_dump of your distribution to dump the database to an ASCII file. (Windows users will find a db_dump.exe in the XCA installation dir). The command is: db_dump -f xca.db.dump xca.db <item>Start XCA and open a new database (e.g. xca.xdb). XCA asks for a password for this new, empty database. <item>Point your mouse to "File->Import old db_dump" and select the file "xca.db.dump" <item>XCA now asks for the password of the ORIGINAL database, since the ASCII dump still contains the private keys encrypted with the password. <item>Enjoy XCA 0.6.0 </itemize> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect1>Download <p> The most recent stable version of XCA can be downloaded from <url url="http://sourceforge.net/projects/xca" name="XCA download"> <p> The current (unstable) HEAD of development can be downloaded and tested via <url url="http://xca.git.sourceforge.net/git/gitweb.cgi?p=xca/xca;a=snapshot;h=HEAD;sf=tgz" name="XCA devel"> Please do not hesitate to contact me for information about branches. <sect1>DH Parameters <p> Diffie Hellman parameters can be created by XCA. It does neither need nor use the parameters. Applications like OpenVPN however need them and so XCA provides this functionality for users convenience. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Command Line Options <p> Usage: <tt>xca [-d new.xdb] [-v] [-x] <files></tt> Next to the usual X command line options. There are the following <itemize> <item>-v show version information and exit <item>-d set the database filename (only needed to create a new db) <item>-x exit after processing all command line options </itemize> There are some deprecated legacy options: [ -k ] [ -r ] [ -c ] [ -p ] [ -7 ] [ -l ] [ -t ] [ -P ] Before XCA 0.9.0, the type of the items had to be given. This was removed since. Just put all keys, certs, requests and the database unsorted on the commandline. For backwards compatibility those options are ignored when found. <p> Usually after importing the items from commandline the application will startup as usual. With the -x option given it will exit after finishing the import dialog. This is useful if xca is used as default application for viewing certificates, keys or requests. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Common Actions <p> Many actions are common to all crypto parts and are mentioned here once for all. The goal of this application is to provide an easy to use signing-tool and also a common place for all selected PKI items like Requests or Certificates. <sect1>Column Handling <p> Column visibility can be changed by the context menu of the table header or the "columns" submenu of the table context menu. It shows all available columns with checkboxes to show or hide them. <p> Columns can be resized and rearranged. This configuration is stored in the database and will be reassigned next time this database is opened. <sect1>Importing items <p> The import of an item can be done by either clicking the import button on the right or via the context menu available by right clicking into the list. The import function is smart enough to probe all known formats independent of the file extension: <itemize> <item><tt>Keys:</tt> PEM private key, PEM public key, DER private key, DER public key, PKCS#8 private key. <item><tt>Requests</tt> DER request, PEM request, Netscape SPKAC request. <item><tt>Certificates</tt> DER certificate, PEM certificate (PKCS#12 and PKCS#7 certificates must be imported with an extra button, because they can contain more than one certificate and key) </itemize> After selecting the filename XCA will probe for the known formats of that item and in case of an error it prompts the <tt>last</tt> OpenSSL error message. It is possible to select more than one file by selecting them with SHIFT click. Also the <tt>Import</tt> menu may be used to load items. Next to the filetypes above, it also supports <tt>PEM</tt> import. PEM describes the encoding instead of the filetype. So a PEM file can be any type of private key, crl certificate or csr. This import facility discovers the type and loads it. <p> When importing more than one Key, CRL, Certificate or Request all items are shown in a Multi-import dialog. When importing a PKCS#7 or PKCS#12 item, the contained Keys and Certificates are shown in the Multi-import dialog. By using the Multi-import dialog the items can be examined, imported or dropped. <p> After reading the item it searches for this item in the database and if it is unique, the item is stored in the database. Otherwise it shows a message containing the internal name of this item in the database. <sect1>Details of an Item <p> The details dialog can be accessed by double clicking the item, by the context menu or by the button on the right. The names of the issuers certificate and the corresponding key are clickable and their content will be shown on "double-click" <sect1>Renaming an Item <p> An Item can be renamed via the context menu by right-clicking on the item, by pressing <F2> or by the <em>Rename</em> button on the right border. If the new name of the item already exists in the database a <tt>_01</tt> will be appended to keep the internal name unique. <sect1>Deleting Items <p> Items can be deleted by the button on the right or via the context menu. If a certificate signed by this application is going to be removed the application will warn you once more, because you can not revoke a deleted certificate. Thus only delete a certificate signed by you if you never exported it. Certificate signing requests can be deleted when they get signed, because they are not needed anymore. The request can be recovered from the resulting certificate by exporting the certificate to a request. This is however only possible if you own the private key of the certificate. Multiple items may be selected to delete them all at once. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>The Certificate Input Dialog<label id="wizard"> <p> This input dialog is the central part for collecting all data regarding Certificates, Requests and Templates. It will be invoked whenever such an item is going to be created or, in case of a Template, is altered. <sect1>Source <p> This page is not shown when creating or changing templates. <sect2>Signing Request <p> If it is desired to either enroll a certificate from a PKCS#10 request by a local CA, or to create a certificate from a request by self-signing it, the request can be selected here. In the later case the private key of the request must be available. <sect2>Signing <p> Either self-signing or the CA certificate for signing may be selected here. Additionally, the desired signing algorithm can be adjusted. The drop-down list contains all <ref id="ca_cert" name="CA certificates"> with an available private key. <sect2>Signature Algorithm <p> Usually SHA256 or higher should be used, but since older windows versions including XP can not handle them, Windows users should consider using SHA1. <sect2>Templates <p> The fields of the certificate can be preset by the values of a template by selecting it and clicking <em>Apply all</em>. Templates can be mixed by applying the subject of one template and then applying the extensions of an other by using the buttons <em>Apply subject</em> and <em>Apply extensions</em> <sect1>Personal Settings <p> <sect2>Subject <p> On this Page all personal data like country, name and email address can be filled in. The <tt>Country code</tt> field must either be empty or exactly contain two letters representing your country code; e.g. <tt>DE</tt> for Germany. If you want to create an SSL-server certificate the <tt>Common name</tt> must contain the <tt>DNS</tt> name of the server. If the <tt>internal name</tt> is empty, the common name will be used as internal name. It will also be used as default internal name, if a new key is created here. <p> Other rarely used <tt>name-entries</tt> can be selected in the dialog below. By using this table instead of the table above, the order of the entries can be adjusted. A new line can be added via the <em>Add</em> button. The current line can be deleted via the <em>Delete</em> button. Existing lines can be exchanged and reordered by moving the row-header (containing the row-number) around. All items can be added more than once, even those from above. This is not very usual but allowed. <sect2>Private Key <p> Keys can be generated here <tt>on the fly</tt> by pressing the button. The name of the new key will be preset by the common name of the certificate. The newly generated key will be stored in the database and stay there, even if the input dialog is canceled. The drop-down list of the keys only contains keys that were not used by any other certificate or request. The key-list is not available for creating or changing templates. By checking <tt>Used keys too</tt> the list contains all available keys. Use this with care. You're likely doing something wrong when using this option. <p> This tab does not appear when signing a request, because the request contains all needed data from this tab. Select "Modify subject of the request", if you want to modify it anyway. The content of the subject Tab will then be preset with the content of the request. <sect1>X509v3 Extensions <p> The next 3 tabs contain all fields for adjusting the certificate extensions. It is not in the focus of this document to explain them all in detail. The most important are the <tt>Basic Constraints</tt> and the <tt>Validity</tt> range. <p> For more information consult the documents in <ref id="otherdoc">. If you don't know what this is all about please read those documents before creating any certificates. <sect2>Basic Constraints <p> If the type is set to <tt>Certification Authority</tt>, the certificate is recognized by XCA and other instances as issuer for other certificates. Server-certificates or E-Mail certificates should set this extension to <tt>End entity</tt> (strongly recommended) or disable it completely by setting it to <tt>Not defined</tt> <sect2>Validity Range <p> The <tt>not Before</tt> field is set to the current date and time of the operating system and the <tt>not After</tt> field is set to the current date and time plus the specified time range. <p> For templates the specified times are not saved, because it does not make much sense. Rather the time range is stored and automatically applied when selecting this template. Applying the time range means to set notBefore to "now" and notAfter to "now + time range". If the <tt>midnight</tt> button is set both dates will be rounded down and up to midnight. <sect2>Advanced <p> Any extension, not covered on the other tabs can be added here as defined in OpenSSL nconf. The validity can be checked by clicking <tt>Validate</tt>. All extensions from all tabs will be shown here to see them all in their final form. Click on <tt>Edit</tt> to continue editing the extensions here. Refer to the OpenSSL X509v3 configuration for more details: <url url="http://www.openssl.org/docs/apps/x509v3_config.html"> <sect3>Certificate Policies <p> The following example of <tt>openssl.txt</tt> also works in the advanced tab to define certificate policies <tscreen><verb> certificatePolicies=ia5org,1.2.3.4,1.5.6.7.8,@polsect [polsect] policyIdentifier = 1.3.5.8 CPS.1="http://my.host.name/" CPS.2="http://my.your.name/" userNotice.1=@notice [notice] explicitText="Explicit Text Here" organization="Organisation Name" noticeNumbers=1,2,3,4 </verb></tscreen> <p> When exporting existing Certificates to templates, the extensions will be translated to OpenSSL config file format. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Smartcards (Security Tokens) <p> Since XCA 0.8.0 the use of Smartcards (Security tokens) is supported. It is based on the PKCS#11 standard. The Options dialog contains a list to add one or more PKCS#11 providers (libraries). This is not restricted to Smartcards but includes all type of security tokens like USB tokens. The default is <tt>/usr/lib/opensc-pkcs11.so</tt> and <tt>opensc-pkcs11.dll</tt> in the XCA installation path, depending on your OS. <p> Once again: This software comes with no warranty at all! If XCA transforms your security token into a fridge, don't blame me. For me everything worked fine and I tested it thoroughly. <p> On Linux the package <tt>opensc</tt> should be installed. Please read the opensc documentation for more details. Generally: if the opensc commandline-tool "pkcs11-tool -L" shows reasonable output, XCA will work. Otherwise fix the opensc setup. I had a functional setup with a "Reiner SCT" and a DELL keyboard with integrated card reader and TCOS Netkey E4 cards. I also used Aladdin Etoken very successfully (Thanks for support!). The Aladdin PKCS#11 library supports all needed features very well. <p> Before the keys of a token can be used, they must be imported into XCA. This means that XCA reads the token and shows the keys and certificates on the token. They can then be imported partially or completely via the Multi-import dialog. It is not unusal that a token contains more than one key or certificate. It is of course possible to create your own keys on the token. When selecting a token-key for signing, XCA verifies that the corresponding token is available. The following actions with smartcards are supported: <itemize> <item>Import keys and certificates from the token. (Token->Manage Security token) <item>Everything you can do with other keys can be done with tokens, too. <item>On export, only the Public key is exported. <item>Change the PIN and SO PIN of a token. <item>Create a key on the token. (Button New Key) <item>Store an existing key or certificate on the token. (Context menu of the item) <item>Delete certificates and keys from the token. (Context menu of the item) <item>Initialize cards and the user PIN via SO PIN </itemize> Existing, non-deletable, built-in certificates of Smart-cards may be ignored. A new CA certificate can be created and self-signed by the Smart-card key. It can then be used to issue end-entity certificates, containing other RSA, DSA or EC keys or sign imported certificate requests. <sect1>Key Management on the Token <p> XCA assumes for every private key on the card a corresponding public key. When managing cards, XCA only searches for public keys. There is thus no need to enter a PIN. When using the the key for signing the corresponding private key on the card is selected and a PIN must be entered. <p> Accordingly, every time a key is generated on the card, a public/private keypair is generated. Every time a key is stored on the card, XCA creates a public and a private key object. <p> Firefox always only looks for private keys on the card. If XCA does not show a key, which is however recognized by firefox a missing public-key object is the cause. <sect1>The Token Menu <p> The menu item: <tt>Token</tt> is accessible if a PKCS#11 library was loaded and initialized. <sect2>Managing Smartcards <p> Security token specific operations are collected below the menu-item <tt>Token</tt> <sect3>Manage Security Token <p> This is the Multi import dialog, which allows to view and select the items to be imported. When started it reads the content of the selected token. Additionally, it shows token information in the bottom-right corner and allows to delete and rename items directly on the token. <sect3>Initializing Tokens <p> Initializing tokens is done via the menu item <tt>Initialize token</tt>. During this process either a new SO PIN must be supplied or the old SO PIN must be given. Additionally XCA asks for the label of this token. <p> After this operation succeeded, the User PIN is uninitialized and must be initialized via <tt>Init PIN</tt> <sect3>Deleting Items from the Token <p> Just delete the item as usual. XCA will then ask whether the item shall also be removed from the token. Items on the token that were not yet imported can be deleted via the "Manage security token" menu. <sect3>Changing PINs <p> The User PIN and SO PIN can be changed via the <tt>Token</tt> menu and also via the key context-menu. In this case the correct token containing the key will be enforced. <sect2>Tested Providers <p> The following providers were used for testing: <itemize> <item>OpenSC: default provider for a lot of different cards and readers. Deleting keys or certs is currently not supported. <itemize> <item>The support of Netkey 4E cards is currently restricted. Only import and using the keys and certificates is possible. <item>Feitian PKI cards work with the following restrictions: <itemize> <item>The cards must be initialized outside XCA with <tt>pkcs15-init</tt> <item>Storing keys onto the card crashes because of <tt>assert(0)</tt> in card-entersafe.c in opensc-0.11.13 <item>Deleting items does not work, because it is not implemented in opensc-0.11.13/card-entersafe.c. </itemize> </itemize> <item>Aladdin eToken PKIclient-5.1: Works perfectly. Read public keys from the token, write private keys to the token, generate keys on the token, write certificates to the token and delete them from the token. <item>Linux only: OpenCryptoki (IBM): may be used as a pure software token, but also supports TPMs and other IBM crypto processors </itemize> <sect2>Tested compatibility with other applications <p> For interoperability tests I used the Aladdin eToken together with the Aladdin PKIclient 5.1 software and OpenSC with the Feitian PKI-card. <itemize> <item>Aladdin: /usr/lib/libeTPkcs11.so <item>Feitian: /usr/lib/opensc-pkcs11.so (default) </itemize> I initialized the token as follows: <itemize> <item>Generate CA certificate with software key <item>Generate server certificate with software key <item>Generate client certificate with a key generated on the token <item>Generate 2nd client certificate with software key <item>Copy the software-key of the 2nd client certificate onto the token <item>Copy the 2 client certificates onto the token <item>Export CA certificate as PEM (ca.crt) <item>Export server cert as PKCS12 without password (server.p12) <item>Export server cert as "PEM Cert + key" without password (server.pem) for Apache2 </itemize> <sect2>Firefox / Mozilla -> Apache <p> <itemize> <item>Enable PKCS#11 token in firefox: Edit->Preferences->Advanced: (SecurityDevices): (Load) Load PKCS#11 Device: /usr/lib/libeTPkcs11.so <item>Import CA certificate: Edit->Preferences->Advanced: (View Certificates) (Authorities): (Import) <item>Prepare apache config with: <tscreen><verb> SSLEngine on SSLCertificateFile /etc/apache2/ssl/server.pem SSLCertificateKeyFile /etc/apache2/ssl/server.pem SSLCertificateChainFile /etc/apache2/ssl/ca.crt SSLCACertificateFile /etc/apache2/ssl/ca.crt SSLVerifyClient require SSLVerifyDepth 10 </verb></tscreen> <item>Connect with firefox to the server. Firefox will prompt you to select one of the 2 client certificates. Both work. </itemize> <sect2>OpenVPN <p> The relevant server config is as follows: <tscreen><verb> pkcs12 server.p12 </verb></tscreen> <p> The client config is: <tscreen><verb> ca ca.crt pkcs11-providers /usr/lib/libeTPkcs11.so pkcs11-id 'Aladdin\x20Knowledge\x20Systems\x20Ltd\x2E/eToken/002882d2/F\xC3\xBCr\x20den\x20Firefox/D1A7BFF94B86C061' </verb></tscreen> The pkcs11-id can be obtained with the command: <tt>openvpn --show-pkcs11-ids /usr/lib/libeTPkcs11.so</tt> <sect>RSA, DSA and EC Keys <label id="keys"> <p> For creating certificates, keys are needed. All keys are stored encrypted in the database using the 3DES algorithm. The password can be changed for each certificate. The password type means: <itemize> <item>common: The database password provided during database load <item>private: The key has its own password, which is not stored by XCA. This can be set and reset via the context menu of the key <item>PIN: Security tokens are usually protected by a PIN <item>No password: Public keys don't need a password </itemize> <p> All keys carry a use counter which counts the times it is used. For new requests or certificates the list of available keys is reduced to the keys with a use counter of 0. <sect1>Generating Keys <p> The dialog asks for the internal name of the key and the keysize in bits. For EC keys, a list of curves is shown. It contains all X9.62 curves. When importing an EC key with explicit curve parameters, the corresponding curve OID is searched and set if found. Even if the drop-down list only shows the most usual key sizes, any other value may be set here by editing this box. While searching for random prime numbers a progress bar is shown in the bottom of the base application. After the key generation is done the key will be stored in the database. <p> For every connected token providing the Key-generate facility an entry in the drop-down menu of the keytypes will be shown. It contains the name of the token and the valid key-sizes. <sect1>Key Export <p> Keys can be exported by either selecting the key and pressing <em>Export</em> or by using the context-menu. This opens a Dialogbox where the following settings can be adjusted: <itemize> <item>filename <item>Output format ( DER, PEM ) <item>Public or Private Key <item>PKCS#8 format <item>Encryption of the exported file (yes/no) </itemize> The filename is the internal name plus a <tt>pem</tt>, <tt>der</tt> or <tt>pk8</tt> suffix. When changing the fileformat, the suffix of the filename changes accordingly. Only PKCS#8 or PEM files can be encrypted, because the DER format (although it could be encrypted) does not support a way to supply the encryption algorithm like e.g. <tt>DES</tt>. Of course, encryption does not make sense if the private part is not exported. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Certificate Signing Requests <label id="csr"> <p> Certificate signing requests are described in PKCS#10 standard. They are used to supply a Certification Authority with the needed information to issue a valid certificate for you, without knowing your private key. This includes your personal information, your public key and additional extensions. <p> Netscape SPKAC files can not be created or exported, but they can be imported and signed. This requests are marked in the Signature field as SPKAC and a Netscape icon is shown. <sect1>Generating a new Request <p> After clicking on the <tt>New Request</tt> button the Certificate dialog will be started to ask all needed information for generating a new Request. See: <ref id="wizard" name="The Certificate input dialog"> <p> The request generation can also be invoked by the context menu of a certificate (Export->Request). This menu point is only available if the private key of the certificate is available. In this case all needed data is copied from the certificate and the Certificate dialog is not invoked. <sect1>Request Export <p> Requests can be exported by the context-menu or by the button on the right. <itemize> <item><bf>Clipboard</bf> Stores the request in PEM format into the Clipboard and can be pasted into an other application. <item><bf>File</bf> Write the request into a file in PEM or DER format. <item><bf>Template</bf> Create a XCA template with the values of the request. <item><bf>OpenSSL config</bf> Create aand store an OpenSSL config file which can be used to generate a similar request with openssl (openssl req -new -config <file>) </itemize> <sect1>Request Details <p> All information contained in the request are shown. If the keystore contains the private key corresponding to the request the keys internal name is shown in the <tt>Key</tt> field. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Certificates <p> All certificates from the database are displayed in a tree view reflecting the chain dependencies. If there is a CA certificate and several client certificates signed by this CA, the client certificates can be shown by clicking on the plus sign of the CA certificate. <sect1>CA certificates <label id="ca_cert"> <p> XCA will recognize CA certificates if the CA flag in the <tt>Basic Constraints</tt> is set to true. If there is a corresponding private key, the <tt>CA</tt> submenu in the context-menu will be enabled. <p> For building the chains the CA flag is disregarded, because there are some CAs without this flag. Instead it consideres the issuer name and the signature to decide which certificate is the issuer. <sect1>Generating certificates <p> After clicking on the <tt>New Certificate</tt> button the Certificate input dialog will be started to ask all needed information for generating a new Certificate. See: <ref id="wizard" name="The Certificate input dialog"> Certificate creation can also be invoked by the context menu of the certificate list background or by the context menu of the request. In this case the Certificate input dialog is preset with the request to be signed. <p> If a <tt>CA certificate</tt> is selected in the certificate list, this certificate will be preselected as signer certificate. <sect1>Certificate details <p> The signer is the internal name of the issuers certificate, <em>SELF SIGNED</em> if it is self signed or <em>SIGNER UNKNOWN</em> if the issuer's certificate is not available. The validity is set to <em>valid</em> if the certificate's dates are valid or to <em>Not valid</em> if they are not, compared to the internal time and date of the OS. <p> If the certificate is revoked, the revocation date will be shown instead. <p> On the <em>Subject</em> and <em>Issuer</em> tab the distinguished name is also displayed in a format defined in RFC2253 for copy&paste. <sect1>Certificate trust <p> The certificate trust can be changed by the context menu of the certificate. It can be set to: <itemize> <item><bf>Not trusted</bf> - never trust this certificate, even if we trust the issuer. This is the default for imported self-signed certificates. <item><bf>Trust depends on issuer</bf> - only trust this certificate, if we trust the issuer. This is the default for imported and generated non-self-signed certificates. <item><bf>Always trust</bf> - always trust this certificate, even if we do not trust the issuer's certificate or if it is absent. This is the default for generated self-signed certificates. </itemize> <sect1>Certificate export <p> <itemize> <item><bf>Clipboard</bf> Copy to clipboard as PEM file <item><bf>File</bf> Export to external file. The filename can be selected in the export dialog and the Export format: <itemize> <item><bf>PEM</bf> - PEM encoded <item><bf>PEM with Certificate chain</bf> - PEM encoded certificate and all issuers up to the root certificate in one file <item><bf>PEM all trusted Certificates</bf> - List of all PEM encoded certificates that are marked als <em>Always trusted</em> (usually all self-signed certificates) in one file for e.g. apache as trusted cert store. <item><bf>PEM all Certificates</bf> - All PEM encoded certificates in one file. <item><bf>DER</bf> - DER encoded certificate. <item><bf>PKCS#7</bf> - DER encoded PKCS#7 structure containing the certificate. <item><bf>PKCS#7 with Certificate chain</bf> - DER encoded PKCS#7 structure containing the certificate and all issuers up to the root certificate. <item><bf>PKCS#7 all trusted Certificates</bf> - DER encoded PKCS#7 structure containing all certificates that are marked als <em>Always trusted</em> <item><bf>PKCS#7 all Certificates</bf> - DER encoded PKCS#7 structure containing all certificates. <item><bf>PKCS#12</bf> - PKCS#12 structure containing the certificate and the corresponding private key <item><bf>PKCS#12</bf> - PKCS#12 structure containing the certificate, the corresponding private key and the chain of all issuers certificates. <item><bf>PEM cert + key</bf> - concatenation of the private key and certificate in a format used by apache or the X509 patch for OpenSSH. <item><bf>PEM cert + PKCS8 key</bf> - concatenation of the private key in PKCS#8 format and certificate. </itemize> <item><bf>Request</bf> Create a PKCS#10 request by using the data from the certificate. <item><bf>Token</bf> Store certificate on the Security token containing the private key <item><bf>Other token</bf> Store certificate on any Security token <item><bf>Template</bf> Create a template from the content of this certificate. <item><bf>OpenSSL config</bf> Create an OpenSSL config file from the contents of this certificate, which can be used to generate a similar certificate with openssl (openssl req -new -x509 -config <file>) </itemize> <p> When exporting PKCS#12 structures you are asked later for an encryption password. <sect1>Certificate revocation <p> Certificates can only be revoked, if the private key of the issuer's certificate is available. The certificate will be marked as revoked and the revocation date will be stored with the certificate. <p> To generate a CRL, revoke the appropriate certificates and select CA->GenerateCRL in the context-menu of the signing certificate. <sect1>Certificate renewal <p> Certificates can only be renewed, if the private key of the issuer's certificate is available. Renewal is done by creating a new certificate as a copy of the original one with adjusted validity dates. <sect1>CA special functions <p> The context menu of CA certificates contains the <em>CA</em> submenu, which makes the following functions available: <itemize> <item><bf>Properties</bf> <item><bf>Generate CRL</bf> Generate the CRL by collecting all revoked certificates and their revocation date. </itemize> <sect2>CA Properties <p> <itemize> <item><bf>Serial</bf> The serial number of the next certificate signed by this issuer. <item><bf>Use random serial number</bf> Use a 64bit random serial numbers for certificates signed by this issuer. <item><bf>CRL days</bf> The days until the next CRL release. <item><bf>Signing Template</bf> The default template for signing certificates. <item><bf>Use random serial numbers</bf> generates an 8 byte unique serial number for every newly issued certificate </itemize> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Templates <p> Templates are special to XCA and not interchangeable with other applications. They store all informations to create certificates or requests. <p> To use templates, just create a new certificate or request and apply one of the templates (or parts of it) in the <tt>Source</tt> Tab. Usually you have the distinguished name parts, that never change and properties (extensions) that define the use of the certificate. You may apply the whole template or only the subject or only the extensions. <p> Next to the 3 default templates for CA, HTTPS server and client certificates, customized templates may be created. Templates are not signed, they are just a collection of common values for different certificates. Therefore XCA does not care if any duplicates exist in the list of templates. <p> An easy way to create templates is to export an existing certificate or PKCS#10 request to a template. Just select <tt>Export->Template</tt> in the context-menu of the item. The private key of the Certificate or Request is not needed. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Certificate Revocation Lists <p> All certificates are issued for a restricted timeperiod of validity. However it can happen that a certificate shoud not be used / becomes invalid before the "not after" time in the certificate is reached. In this case the issuing CA should revoke this certificate by putting it on the list of revoked certificates, signing and publishing it. <sect1>Generation of Certificate revocation lists <p> In XCA this can be done by the context-menu of the CA and the "revoke" entry in the context-menu of the issued certificate. First all invalid certificates must be marked as revoked and then a Certificate Revocation List should be created and will be stored in the database. <p> <sect>Options <p> The options dialog can be found in the file menu. All options are saved in the database and do not depend on the operating systems registry or configuration files. <p> <sect1>Mandatory subject entries <p> A list of mandatory distinguished name entries may be specified to get a warning, whenever issuing a certificate that lacks one or more listed entries. This requirement is not checked when editing templates, because templates may have empty entries that will be filled during the rollout of the certificate. <p> <sect1>String settings <p> This option applies to all strings converted to ASN1 strings. The selected string type is automatically set to the smallest possible and allowed type, covering all contained characters. <p> The list of allowed string types can be selected: <itemize> <item><bf>PKIX in RFC2459 (default)</bf>All string types are set as described in RFC2459 <item><bf>No BMP strings</bf> All strings containing non printable characters are regarded as errors. <item><bf>PKIX UTF8 only</bf> All string types are selected according to RFC2459 for entities issued after 2004, which means that almost all distinguished name entry types are set to UTF8. <item><bf>All strings</bf>All string types are allowed. </itemize> <p> <sect1>Default hash algorithm <p> Older Windows versions and OpenSSL versions can not handle SHA256 and SHA512. This option allows to set the hash algorithm to SHA1 for instance. <p> <sect1>Suppress success messages <p> After importing and generating new items a success message is shown. This switch disables the messages. <p> <sect1>Don't Colorize expired certificates <p> Since version 0.9.2 the expiration dates of certificates will be colorized. Red means expired or not yet valid. Yellow indicates certificates that only have 4/5 of their lifetime until expiration. The CRL expiration date will be marked red 2 days before expiration. <p> <sect1>PKCS#11 library path <p> Here you can select the path to the PKCS#11 library on your system. If it is empty, the default <tt>/usr/lib/opensc-pkcs11.so</tt> will be used. On Windows the opensc-pkcs11.dll in the XCA installation directory will be tried. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Object IDs <p> Private Object IDs and OID lists for the distinguished name or extended key usage can be added in files listed below. The files are: <itemize> <item><bf>oids.txt</bf> addidtional Object IDs <item><bf>eku.txt</bf> Content of <tt>ExtendedKeyUsage</tt> <item><bf>dn.txt</bf> Content of <tt>DistinguishedName</tt> <item><bf>aia.txt</bf> Content of <tt>AuthorityInformationAccess</tt> </itemize> The search path for all the files is listed below. All files except <em>oids.txt</em> are searched in the order listed below and search stops at the first file found. The <em>oids.txt</em> file is searched in reversed order and all <em>oids.txt</em> files found are loaded. <p> <bf>Unix</bf> <itemize> <item>$HOME/.xca/ <item>/etc/xca/ <item>PREFIX/share/xca/ <newline>PREFIX is usually /usr or /usr/local </itemize> <p> <bf>Windows</bf> <itemize> <item>Installation directory <newline>e.g.: C:\Programs\xca </itemize> All Object IDs that are not official, but belong to your company or organisation can be added in the file <tt>oids.txt</tt>. All possible locations for this file are searched and all <tt>oids.txt</tt> files found are loaded. This way the application-installer adds some in /usr/share/xca, the Administrator in /etc/xca and the user in $HOME/.xca. The format of this file is:<newline> <bf>OID</bf>:<bf>shortname</bf>:<bf>longname</bf><newline> Leading and trailing spaces between the colons and the text are ignored. Lines starting with a <bf>#</bf> are ignored. <p> The files containing OID lists (<tt>eku.txt, dn.txt, aia.txt</tt>) are handled in a different way, only the first one found is used. The format of this files is one entry per line. The entry can be either the numerical OID like <tt>1.3.6.1.5.5.8.2.2</tt>, the short name like <tt>iKEIntermediate</tt> or the long name <tt>IP security end entity</tt>. Lines starting with a <bf>#</bf> are ignored. If this files shall contain new inofficial OIDs, they must be also mentioned in one of the <tt>oids.txt</tt> files. <sect>Step by Step guides <p> Beginners may follow these steps to easily create their first certificates. This guide shows the minimal requirements for various tasks. For more advanced use of XCA, users are encouraged to familiarize themselves with the applicable standards. <sect1>Setting up a Root CA Certificate <p> <enum> <item>Click the <bf>Certificates</bf> tab. <item>Click the <bf>New Certificate</bf> button. <item>Make sure the <bf>Source</bf> tab is showing, clicking it if necessary. <itemize> <item>At the bottom of the panel, ensure that the <bf>"[default] CA"</bf> template is showing, and click the <bf>Apply all</bf> button. This will fill in appropriate values under the <bf>Extensions</bf>, <bf>Key Usage</bf>, and <bf>Netscape</bf> tabs. </itemize> <item>Click the <bf>Subject</bf> tab. <itemize> <item>Type in the internal name; this is for display purposes in the tool, only. <item>Fill in the required fields in the upper Distinguished Name section (Country name, State/Province, Locality, Organization, Common name, E-Mail address). The common name can be something like "ACME Certificate Authority". <item>If you want to add in any additional parts to the distinguished name, use the <bf>Add</bf> button. <item>Select the desired private key or generate a new one. </itemize> <item>Click the <bf>Extensions</bf> tab. <itemize> <item>The Time Range is probably fine (10 years). If you want to change the duration, then change it and click <bf>Apply</bf>. </itemize> <item>The CRL distribtion point will be part of the issued certificates. It should however be thought about a common URL for all of them like <tt>http://www.example.com/crl/crl.der</tt> <item>Click the <bf>OK</bf> button at the bottom. </enum> You may wish to now issue an (initially) empty CRL. Follow the instructions given for issuing CRLs below, except that you do not actually revoke any certificate. </sect1> <sect1>Creating a CA-Signed Host Certificate <p> <enum> <item>Click the <bf>Certificates</bf> tab. <item>Click the <bf>New Certificate</bf> button. <item>Make sure the <bf>Source</bf> tab is showing, clicking it if necessary. <itemize> <item>At the bottom of the panel, select the template <bf>"[default] HTTPS_server"</bf> (or another suitable template, if you have created your own) and click the <bf>Apply</bf> button. This will fill in appropriate values under the <bf>Extensions</bf>, <bf>Key Usage</bf>, and <bf>Netscape</bf> tabs. <item>In the Signing section, select the certificate that will be used to sign the new certificate. </itemize> <item>Click the <bf>Subject</bf> tab. <itemize> <item>Type in the internal name; this is for display purposes in the tool, only. For host certificates, the host FQDN (fully qualified domain name) is not a bad choice. <item>Fill in the required fields in the upper "Distinguished Name" section (Country code, State/Province, Locality, Organization, Common name, E-Mail address). For host certificates, the common name must be the FQDN to which you wish users to connect. This need not be the canonical name of the host, but can also be an alias. For example, if <tt>pluto.example.com</tt> is your web server and it has a DNS CNAME entry of <tt>www.example.com</tt>, then you probably want the Common Name value in the certificate to be <tt>www.example.com</tt>. <item>If you want to add in any additional parts to the distinguished name, use the drop-down box and <bf>Add</bf> button. <item>Select the desired private key or generate a new one. </itemize> <item>Click the <bf>Extensions</bf> tab. <itemize> <item>Change the Time Range if desired and click <bf>Apply</bf>. <item>In the event that you need to revoke any certificates in the future, you should designate a certificate revocation list location. The location must be unique for this root certificate. XCA exports CRLs in either PEM or DER format with appropriate suffixes, so this should be considered when selecting the URL. Selecting a URI something like <tt>http://www.example.com/crl/crl.der</tt> is probably suitable. On the "CRL distribution point" line, click the <bf>Edit</bf> button. Type in the desired URI, then click <bf>Add</bf>. Add in any additional desired URIs in the same fashion. Click <bf>Validate</bf> and <bf>Apply</bf>. (Alternate mechanisms such as OCSP are beyond the scope of this guide.) </itemize> <item>Click the OK button at the bottom </enum> </sect1> <sect1>Creating a Self-Signed Host Certificate <p> This procedure is almost identical to that of creating a CA-Signed certficate with the following exceptions: <enum> <item>When creating certificate, select "Create a self signed certificate" under the <bf>Source</bf> tab. <item>Self-signed certificates cannot be revoked, so the CRL URI should be blank. </enum> </sect1> <sect1>Setting Up A Template <p> If you have, or expect to have, multiple hosts under one domain and signed by the same root certificate, then setting up a template for your hosts can simplify host certificate creation and improve consistency. <p> The values of templates can be applied on the first tab of the certificate-generation dialog. It can be selected, whether the subject, the extensions or both parts of the template will be applied. This way a subject-only template may be defined and later applied together with the HTTPS_client or HTTPS_server template. <enum> <item>Click on the <bf>Templates</bf> tab. <item>Click on the <bf>New template</bf> button <item>Select an appropriate value for the Preset Template Values, then click <bf>OK</bf> <item>Under the <bf>Subject</bf> tab, specify an internal name for the template. <item>Fill in (or modify) any values that you wish to be populated when using the template. Leave the rest blank (notably the "Common Name" field). <item>When all desired fields are filled in, click the <bf>OK</bf> button at the bottom of the window. </enum> Your template is now ready for use when creating new certificates. </sect1> <sect1>Revoking a Certificate issued by a CA <p> <enum> <item>Click the <bf>Certificates</bf> tab. <item>Right-click on the certificate that you want to revoke and select <bf>Revoke</bf> <item>Right-click the CA certificate that was used to sign the certificate being revoked. Select <bf>CA</bf> --> <bf>Generate CRL</bf> <item>Click the <bf>OK</bf> button in the <bf>Create CRL</bf> dialog. <item>Click on the <bf>Revocation lists</bf> tab in the main window. <item>Right-click on the CRL you just generated and select <bf>Export</bf>. Select the desired format (probably DER) and click <bf>OK</bf> <item>Copy the exported CRL to the location published in the issued certificate's CRL Distribution Points. <item>Optionally, delete older CRLs for the same CA certificate. </enum> </sect1> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <sect>Appendix <p> Here one can find several examples for file formats: <sect1>PEM <p> <tscreen><verb> -----BEGIN CERTIFICATE----- MIIC0zCCAjygAwIBAgIQKNOqLomUfJxugwU5FHGCSjANBgkqhkiG9w0BAQQFADBf MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT LkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw HhcNOTcxMDEzMDAwMDAwWhcNMDQwMTA1MjM1OTU5WjBDMREwDwYDVQQKEwhWZXJp U2lnbjEuMCwGA1UECxMlVmVyaVNpZ24gQ2xhc3MgMiBPblNpdGUgSW5kaXZpZHVh bCBDQTCBnTANBgkqhkiG9w0BAQEFAAOBiwAwgYcCgYEA3CqZnW4z/LtBdsQ5Ho33 dueQD3RVYWFyPPg3SxsfCOkwHXDFFolgM0ZIf8bQmj12mMOhwaxS0Re5FARphlxh T7NlZYtjou4hfEGvrXJAw02Rs0m+mPtXx1ousEun7wkk84GdOMWS2kqnmFGp2DB2 LWrWry9+2xEqhftlYFpF6BsCAQOjga0wgaowDwYDVR0TBAgwBgEB/wIBADBEBgNV HSAEPTA7MDkGC2CGSAGG+EUBBwEBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3 LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC52 ZXJpc2lnbi5jb20vcGNhMi5jcmwwCwYDVR0PBAQDAgEGMBEGCWCGSAGG+EIBAQQE AwIBBjANBgkqhkiG9w0BAQQFAAOBgQCeTebTWFTbJFzaxCsD3432QbAsiAng0VcA OzlDYn1BMIRT0NsrJbeTjQ8cOmvCkgesEPYsm+SniOktibXDJT+n87Can4+0CQBx qUUsBUoG0PtMGjH4Vr/QD5sG8cMecG3FJR4CWwKitoz47h7sxM50B6RB9je1eIvS 1NMPRGO1nQ== -----END CERTIFICATE----- </verb></tscreen> <sect1>SPKAC <p> <tscreen><verb> SPKAC=MIIBPzCBqTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAw9eRsqOS9k gd5Wk5Z2OWLCB8TuYlhRKpvfdIh6dZBERIQ/7xojDhOeg235Y/iWR0Jj9pXLOz2Q dL7ppUwsGCnXXQGCdTG4OXAziBZTcLoMIxHzIvJ9pgX3APsuEWospGJzDPQv0sup GCEiQK6qzAFa5BISQpIczHufBFGtLbGesCAwEAARYFaGVsbG8wDQYJKoZIhvcNAQ EEBQADgYEAZOCMay68W5629GI/fj0R7AGJBQBCu79KtAxcnmiDhI4ELWIoB04wJg GqlcdCY6eo1CHZN9LNVltzSUghVl/zPwaBFodhI6CbSnMfk+nkPa2psXQXoQs2+1 7QPXfOlqDvqyOhwGFnPDMYSLeYVwQjh/Miov+vPV5+8Qhc2owuh9A= CN=Fred vom Jupiter O=Jupiter Gas Ltd. OU=CRM inner planets L=Jupiter </verb></tscreen> </article> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/��������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11753427512�0013143�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/.gitignore����������������������������������������������������������������������������0000664�0000000�0000000�00000000022�11753427512�0015125�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������img.rc imgres.cpp ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/Makefile������������������������������������������������������������������������������0000664�0000000�0000000�00000001377�11753427512�0014613�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ifeq ($(TOPDIR),) TOPDIR=.. BUILD=.. endif OBJS=imgres.o ifeq ($(HOST),w32) OBJS += w32res.o endif include $(TOPDIR)/Rules.mak sinclude .depend install: xca-32x32.xpm install -D -m 644 $^ $(destdir)$(prefix)/share/pixmaps/xca-32x32.xpm imgres.cpp: imgres.rcc @$(PRINT) " RCC [$(BASENAME)] $@" $(RCC) -o $@ $< imgres.rcc: bigcert.png bigcrl.png bigcsr.png bigkey.png bigtemp.png crl.png halfkey.png invalidcertkey.png invalidcert.png key.png netscape.png reqkey.png req.png revoked.png spki.png template.png validcertkey.png validcert.png scard.png w32res.o: w32res.rc key.ico xca.ico xdb.ico @$(PRINT) " WINDRES $@" $(WINDRES) $< $@ app: xca-mac-icon.icns mkdir -p $(APPDIR)/Resources install -m 644 $^ $(APPDIR)/Resources w32res.cpp: touch $@ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/bigcert.png���������������������������������������������������������������������������0000664�0000000�0000000�00000047523�11753427512�0015303�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������^���fg[���bKGD������C��� pHYs�� �� ~���tIME *_ݗ�� �IDATx}wUյw}+m^Q %DCb/F}'}PJ}z۹眽sP4&Fx;Sw}c8c8c8c8c8c8c8cyO#@�:rh1@;�=hH 뮕I\�{z8'p 'S�\0x`עOԳFDԠ޻yk�c9 &N�p~8hޤ3ҵeG i!++'Y�;Cq @/��hrDE+/=-p1.=| �$�v�R4� XG1ÿ �\N|đ}=?>�)3MΝJic�t�\ap ]p�p -|t&(R.`x�6e,OV�p:-�HDBHO�>/�l�CW\1a߅2cBÐ`0C+=R� ID C'p V`Ѹq$qE 4RBk_ `m\,`�8 =�rBk‹44J224KD �C@`0Ђi3gؼy�ʃ, yd2»,w |,6gz �nB6??o_>*( DkbЬI3IkMLp&�@`1DB!&?Ӧζ�>raf^;5p#j7H$S\_{z)ekn9� W�@[�,i]xWG7!�0y\x\r* X f 0tuumRYBt(�`f g9 adx˘4i͵&x!=GF�G6\x]?Jg+]bR_t.^ؔ�PCfelʶm#vMk5}@Pem{0pǎ Mуt2y⨼*zwI  hY2`˲扛`= &!FIz݅iSNV�gLR9$B^^>ͷwo�.QWp5ͥ#z㸑N;w`˶*99 R 0,@vv6BZjhV ` H^�+Qp;!x�Îٻ C,%ChYhf f55RZ+ƍ4$IAH &"Fkl:5q{)#"/+(b|0 !LL`�nq0 ^hip ୻=_oSuMޘ}۵ca!DC `, dYJA�X͌�4p ?.� m߿oyvҼ@$+T{9 JkffZ JAk2+u~|]}w8Q(Ah5$z��)�QP4Ë⊳OGC%%Y>"eVV[[x#)Vpyo^7?45%p qRQڴi8hkYpS)T ¶!Y7�voC$[�ർA�E!c={ǝ40o͞=;fGr#R` ֚43G ҎJ)Z11㡇 > PR`@ "0|Z3#IMBoL;.> D"a-/?~/>7hy�|>󗙡Gg}b8۰}}%&vP$XxλlU�cnʵ"}pk.��@?Ð]ssneu4p$'r"BJ֚X 1�f3v]͎XkRX}i;+yYfLk�~`0h 2�`0 5 aऱDuӋk_[~t �iuFmvVonnetY}`bPShdP�^gkɤe2UZx=7�D�TKi<@'̞4qd4Q{ƺumW�{w*d"Bh @ihJ1.5Ck@k@Q]W+Jil޼K/'5+'a\#bJf t Bx5kz^3 @>0!񩔸^)l>fg|rtҵ�&A�\r<3cPߵ7g4U{1lO}`n. I&0|>R@3> ˮ.uuvee}DZGVxCe>RO<Cʲ⼺;u`$g}Ā @ZPJy@32 x#R\[YjZAk}i]rݛy+Dp33b�.7 ΌM`Lf ,f0+f|1$R!0&3 W�\TQ)4�3㦛f}3^pa?ye -VXGu/2r%qg|Cne=7燻ZkpaA._rx3'@$۲]ʶfss `5D8+'ƍ*+k:5T*իjݻx۶)++rqq~.X>-+K�i9Yn^M-<b!(D^RJKVpi=;ف}) �VLZiҎ\t:0\ɠ<, z+/J)(LsoxiQq5< DHU "alxUTHĹ@D�15>LsId!$} oYEm+k`C&"m0RrxzG܂ϣ.|u3cg9y_84S ҬbVZkz{D푌FRBhBtnJ)4͛#2HkR`�%)DQ$H&Jk@/)4/ϧ!%)AR0&) `E/ef床�y 5{}� b:MOgjjE Μc-]Nd^C&yf𥬩#tA:Z0EjFB${%WakjLSQ@RsGغuN8G&I)YH ~EyKjoƑ޻07ZS�vݽr#a=lQP̶q4ĬɅ?v] 0R(R)#ʊ %�sڵmۊ***y4},h!L ,֤V,bS)-V\MJi.Қ\fRI) 庬u\rmJm;R۶M,B2I,F2HF45%YFFH$RR)[;]Վp*p*孳R)›o~OI7R'@EvT _4S[84B Ę@@I� 'a&~"B/)Йs&?@"G5cw�b6hӦW> xQ}n`VۻG=&hQ hev]rNKo|lEA^kPJAYYHbp>QnjA' t;j׵86\׆Xp\7fRBJC HM$5 TZ T+Rr]C)e()5RR9qr]RCvrreR;Ў+Rmۀmt!RDaY@<"M1hBcc146F'HXp[kX)\evLڰ,m#r8.R)¶GcUV]@B0� 4�M̴=!Db#%(ECb)Hu]ʆ&֘u!!c) z 뉰@'Jۊ?\>h}%7IՋ(�,bIM/w/)9!kKKڅ,[hR.;oy <�T q�99pI8$@뢊'<q]ʵ6RD2D"ˊ#e%L`Yq(EJ"e%2%i!`%SHZ)XIraY.ITJòRh.}'Jj XBSg루oDccXDS):Mj캊]Wqjv3-^_YmDvXMi:0)P!]Nf eZ!x3֚hzTFcM @{s/5*EYY)D� "}>S ygщ �~u/$`;۔'.ϼ՟ksrg$@R>C3"L2Ͷѱm M05BJa7oԔ93,.4y�) w3AȨ< 'HJJ#"BK@ =d|gv`Y)h~qX)JкYtHHZ}ʹ|ȖbY][/³|p/ͨPJl"(%0#Xgvv$F5�M@[vH>n6 ]̘_]j_⇚H`ppô/�F{5I ,?ﱋVEZIuM/2gAcWiNaMdֶ03Sv:RQU#=H ` ~du�@ FZkRqӣF9L%hAZGL䉑gv¥#ۇ8,UUb|R.Gn`HG|D!�*3  B53 RbRH23TIgp_)a)ۥ/1ƍm+8[&v^x =Km. s)Y8R]AZ�>/p0b�xEg1!Aiffmۮv캊\P_D,]kDӗ>nj1C80tL3I  I 7l)o[۰aҧ/W))}:RRu,R.lmSV`:nMs޽;<[M"]]O.ٹǘL�{i 4(&/& PW!P"�ld Ff,њL^%O>ޤ5LC  @!.jhk뜏ҝU<y\M_5N;mC8"|I#E J`}V5 C 4ҚҞFB3?^ْ(HkH~iۮR.W2}{ gG"a3~Xru.㢋&%rssuKf]ez}ٲU>}z:mڔ(o9Ziph9O>l}(2()-V,Xw\EǧC�ϻ.E1 `5PJdM>" %.f �xUT .<q{tB^CNN}ccfxN߆#Ed+3vѪ4"s )- U xڭ2Zde�3{Z@Z�F=\ŲR4xp_H'Kv | #Sڕ~IZWVF6mԁ--X׊>[8dssɔ,&�deit.~f%BJp&�eb LVic'2(ƠJQ)Mt˙"f*'^ȧafl#?&+8$G-~≹h4[8aߍK noYO<=ߊELtÐ'i@e۰q���"u[+,?df]YY#+*:�0~5`R_f+֚ok͕+ך=,�ذa|�*+R.Z*xKFZ _g~6%ċ/jj!d⌆W Ak;L8Ig#SB�r\Kf&sB0)b_!P5D(+F+m^wzvhM2!N? <ټ$㣏~O~y:m8R9�Q~9.Y^6H A )@R a ЫgY)Ě]"M J' 忤Fm>t+s~ܴiZr9{Y_|x޼g?6m3v#xٕrӦmƭ>cY)RJ/^�q{;;A̝ajW VVVKJQ]]Y55EUUܣGW';+nel۶Lj,ʐB14[{BLzfolx0_4'K@jM(�R4Jt0AJ4$D0uMrÌ /%>XJ>ِ\$CrQ B=*BsO"h/rb :`�bfxzZ” oҸq\8HMkrdHfalrgruWi xعԩ�7n3/جY3/prWnܹI `A۶ `KɤĚs? l߾hjѽ>kWx~c=aعRz9<𧬢]\Ti76FŌ?<޾J{cYvp]FRh k&LZ os[E9z o 3i`Wm3l"jHŌ/B(Is O1$Ɩt^$L)>1 \u98Ir??~@�'3p ŷTk"�YG_f$ D/GSFIǁH[@ŪRB )ԭ{IDccƌz6m7]WkήmڔrI��;vl>|fVVDG"!t*߈R�;vlJK�|Ri<p`Orr9?ӑ#S\jy3ϋ)gΝ;dҦ-׮hdhf=& fnJADBBJEE?W׹9$aiiW3%Bk)d)]EjO#@.BQ43Nf O &Àcx@ݹ]+aZ .h|-8j~!�FDzV2bAڔOP4 dY\ϖfNXګ5T*9#" /fg_}w2~H6%ㆦUTtr6onlٲ7x+JQUUѮ' [T^ԩD"ܥK;`@?Z�aϞ٦MBb*I\QQ�k߾E۶2ڶkڴ)UZƘ(((PЋ/ mm۶RBiॗ^ 66#C " )}0M?|�@33>98A"'JQء4,DZO+ ϗHfiJcR/3F3lvēt3E<k%m''cW)W2$>}kϝ `꿣GLMx|O;!үOgm*,nnԫpmO:_b;�7p㲝rn�� �IDAT8xi" 1Y543\kZ�VŝyÌg?ׯSQQ 6 vXoF?eK/LR;q\ �<ݿogٲUώWTtrIڴ)Q&B4 ݫ)/nڴ0 '|wkl4 Uk}@(0yY뷘55sϽܹۧO/gmƋ/:S{hĈaʕ|oNSNt䦕! DBϢHi`q#SϮ]gN`b5gʹJkt҄N (�g֐X20�tI{ѿ>o[Tǖ 4aH0Ij«)S6$^˲O�| z GK{v0翘-xhIЦ$|3^.  GEJ$Qx# m$%Bk 4ZE@0=ztuOo}S4!.R.]& kEN .R�u ?O3C `AvwLdzf4|5^/ZmڴS7̼Im^]z%>}8ﯗ:uVm޽ղsaCs bq>daa,K|>C<~VEE!G�X,N7n6Gjg0PVHyO#/`c7f�0%m�YD2#o*sEDʌ"!ϿRt/.xPsZR")6Z+fADLZF 0|P7s:f/f ;V ^cO xpiaC fF}C /`</$|e?yо>ӄҊI:ݺ={芫~=4mJJ`pS)jk uuج]7`K3zYYn0r:z`<ZkHIfG)<1*++evmԞ=}ʳRB)J~Wa;[SU�Z0>J&i3A MOeT$�N @j "ZJ8c'!aҐdLS ÐBJ! ÛhNu6|ؓ `,<ĜA�'?:'m,ү3Ͻmo4>/d6[݀|&KSh b4`HEy9: 05šڶ=e/3t2 [J6׉ɓLD"a>ȍ9̾-g*9UFWC+G9,?}d0Mъ@n ۶i߾bѢ/}s DQqu?z/LCFipq~855k|vמCΎMF}a"ץ@!\u5u~pX2];)IARRZ�43Znr�C^c2uU.? w@|3;3eEr twkf=Wti+aC{&"6 P'\ DzAm @@l3�6p37؁~eExB-ZZٔ^ڏ�>${*C;wȐRkIq0ru^^뢭?2O$knt ߖhoj߾GXCuX߾!!`!LZ+fB؄3ycr!+-͏޽#ECIqQܱݿi쬐zoso?fH{KqIl+D0dҒ\^m !ҕ$ӑ{<@@k{sSպ;w}Ɋ ';;3%t8yZq!^u~Oz"ɼp=�%6mJ3M3V 77{Rb-[SNt߾\޳P9df&bڛy MWJyPDdg͚ꇺ~k:*N|j!&H Aקٽ[<�3}땗_*lt&R ^efU} Qm h*=ݍw?�aĈݻEow x"ORmmСCURJlY|ׂ>/r誫UTtu"d*ykUo|Eo" Ӫ>?#%*JQ \r̨Ԑ!ȍfb2cyy9|R H)`"{ iI�1�LRPf_"@k��_B;Tn0?Ʀx쬐W]vXnGiqܼں s��13�2e8 }ֽ֚Ldf亞,ӵa$1ӟ$Iںu[ee={O><бc{4eeE8GZn1iIc= 㥥%Tt":xC74)Ho_9[ 4jU`rx55g-@yygw~Κ5k͠RNPx[\vI` mb"P Hx,ܚ&�ɑdۛC YH!DFȓ ==ڿrG-[ީo͓So7ϜuԼ*G+ M |z̔G{ I$�2/Drڶvlfu]3?E}# xS;s wAeVCkw g#g%2c~.4mڹ+V.קOO{ĉg${zC}ݻ+e^^¬F2iȑ#ٵ&fB|xsX~![_�.:;KKZ8TU޽ PR^. !Ӗ$m H�f`aI !`~ )3IIY15 ' &i4R0pRSV�G쯝;HͶ}k룹9"3,;'4(dL>R$u(Hy;oz/k ʰm@TQ�?R <ˡѣ?r^ Y7nl*HeV~@׮]܎;뫯V[l3w=tKyf0 mFe^ !BK n&�c$''`z/V޽[5)ޙX̊Yxsg< 77N[n A C4eZ' )`K)4 A]BJ HZ;i88RXꏲE(,i{ђ ˘8�?W|lظ>_ ls>sdsnuXfW]U(3klx\AuL&imNJ4yϞJ9l`z~Œ%|_<=!@vv hoܸ7;dϞd2IJd2IYY&"ifhI,Y7rT OҸnzcϞ*cʔI1/woh&jMp?oێ?' 7nL*++DM[ m{Ndk4Z^Zy[&5C o;H33+_Ps5A~3f#E>m ?%3Rѥme[;vV:f:wj%4?M%g: ='fY+ZkfWC;rǝ8s?X%+g}7[{8׭[o5Rge2!. ^#ҙ?Hǎe\wⒸaH}fy筍Bu}vz:uRf B<…}:tP>:;hQ ,yi*L@ Oh~=b8BA΄[;{Vիי?ɏ[E%IzΊԡC[խ[P:`TW Ϯg:_#ߖ擞y6+RI:8\8ʄ7x_APoG?p\?o}½7%;kFt۶yf&kJ{q]o?�|"D}M8ޖP(MMMbSN9Ѫ2bXjyYYO=|h:g쯭RJ^x,0 O򜠔 O>t53bHR vWƍ{」q͚u]wݗճgwg߾X=HAA4iBrZp"_]+Ly+p?B!f^-\3+_scRJN~)Xnݺd8�ضM7TAA2da}oV~q3I<GşaP: &X>0^'S8j9Ԉ�<P �Ln<.'bKmJ]vї76wT˳;HpdƟM�3UZ)U\$DDkC�r_h_gLݻ>R˖?#+*>8/H$vzP !u6#77G2Yn@?7zp۵kM9؍7^b˯gͺ6z$b-Y�eeUM>٭[WOzYɤEH͚d2A!nR.7^}u׶RJW5GZg_ 82c^8%:%6Mjqڅ+އ $� 6llܸ3`_?Ƒ H̋ҿ ^yYTp{S#NyΗ6uٽC`ֵSJ/W)He,C: ӥ g?"P~'}Sϰ{/`e6ߜ9o7lhqǽ955Uk|UU_&O]tvN>TM~HX4|[Jիךq"??OϛsSO=9ձc<;ǏtR)B_rI�owyߟ:=ٯ_ou]\zEΛܻF_ȴOyaW4~b~44u\L+MMubi,7 `-' %8I Rqlޑb|Odr,dH@K@$R�(T4wߥ.i_-LV?2n,=~Tg]2`]@coSG��H0( ^F/F! 2l*骘D.;+_t9րfFG;V(sߚd6yԧO5X) L<3fM$ :ڛ[nDBaGgzF<''ׯ`sM;wVu0رXp_z1wO=TRR d5M_X~Tbu޿STT�ZD-ڨǻ~?VVVz6nj/yMUO.۶{y4뮻nlqE>f .`o K6 AB ID 5kxh$жK8tR7AAv}mJ]+{PJ[]%y;t!hE`ϓ< y)6͕Kky룡Gf/-)XmN%  lM�{%xys={}.8gTfBTޮmh?Lo>CM�cѢСѫWw5nԖ-ی}⦛~ AVy9@OO쩒(,,Іa 3Sʡr׋/X7HXtݏD&L8J$Clܸ((ѿÑ-[vYYZr9bD&Y) "h"")0iKxy! ⥹X7$HmፕmʪZ_W^z?YxP`"0=314a&ӆ9>�:ԋf~;bYf3ꡍp^"9S@DBEdZ3_0mb*ci7 6҅;ny|&2VES霋wK#}UC{d�3fx˹dB+kV^xrsذvVVF,5j3| x}V+W&b齇%R D"&[l7iRxjE/!<2=4IxD.ssE}b?0aaBf~Ӿ98;{n�� "Y Eh&) 1#z`qn['re�V'Xo?eӚ ikK4I2f iaiZSWӭwxVR7gB1V԰/_e7g?bH+>{*e?>d8y> <-M Yx9)SN֯liδ^x@(EEysvg@u^fF8OwA55D}}5)E N{LC]w?8R|_12AKosU3av<2Ȥ#7kW h*0@ $J@gso[�wArU^3h! $6ZD�%Nv$8ĕr6Vlʮ8*ve81@(J bc#@XXU]v{qm#4Z0_w;Í@/]6?n&C͖w$za]PXJXkzd<ޡZ}ֻT6A4H˅'t|\. %^x`ժ_s'vڅ F?/rk<=I[VyOq_W,|<`k/ʆ "6n|X-Z4'@nGZkk˰:0ɍDfbſ<wo;ǃ �_}H8-U};?+~jԯݟ$W/VʟSb_>|J>}Q ڐľW@Կ[kEU F(X0o~[iG敁h)?4eK "_P WI@ET0api7kıJKiR'DN-j9ovt/pՕKeF`xy~w=ܟ{of̘|-!Ibl7m\y兵|L@KKβ}{ٶbg̓OXq`kkQko?"Aֽa?4 GF#`ֹ6 DTyYp{gLh -͞936+ wV&ea)|Iʌko9 C5X]-w'_ݴ#{K$nnף\O^ [[&˘l6c04A`r B#qN"|qissTCr%*50i:*pJՄ4w!uU9Io/.Yr~mѢs5-(7, I+Φ+g/_ )[W>k^,"k^oGoХhdsD.+$d*J N@cy8~s}۱ sl`*n;vwuV51R9&gÖs/ml۾ޞ;tF񙗦PM[^6}KSv˥\.EUuuʙmRR,ڳL>0#A_ܔE̗jRG'txJ ֊?Eh b'&(cc ��IDATRKbU[Iÿkqvs-v|[4C&38ґ _"+lO֧Wz`>aagť&wW8&%!SKum HzN1 s4-A DZf솗נ(t7fW6,Kܹg몫={ڴb1_-K{;RObZuHJMsEUH >\ezxޑɝ|4 p啟ȯX袋ޕ6%Z#YPк+x4P냦Y>II_d핗6%.׷lyrCGc%46rBlk+-&VaXxbZNXuEc*֩V{a%$w[j k]ٞcK̛0s̜9uӴiV7;fS҈d@'KF0*AeԴAQYV/X~|7z@}P4Qtgqdi&/UٱmW_OWX~p~C|oGKwWNabG[SlkOQW�(r{{ OA.Y oɰzު Tw~[.$g.IB\ڶp9[zɬY:}9b,ֹiF! Z3ug1"=M?""VϧE?[eբnLr}n!|~47"y)_޶o_ߓh~g >n<,nj  @6IR_VF$ݬT4BO{3d+P�GjzۅK<lz*o�w]yU`:x~_{/_d̩e2LӽP[9A+βqlyW QPsPw[7G?+Reտ.pX3Ue˖׾vW'^>ȺW O/\P L8 i-8cxT$ILnjaIFՄZ1?V~r%<(x*~V'T5pkqC {T58p"a>p:΂/YKXζ .:wU-vthߟg/0FA=Zo-05PW�ui<H H4Ԣ yu6zя=lEc#qEN7L+EllL\vSÐBLP#V>8&"G8v8I*Z S�,<v"^ƋDڧj b-&Ä!h5Z¦qB5QC_]VF* +bp9Fq7=S;Jm'&N(?7ޥB^%(cV8XX<sd�+u>T۪^ A r0nJkEUwL==6[ٷoJ'U5<Ԟu6<7x \Kѱ&tF#nv͇^2nE0$,(O `_QBwq$QD$hX_<[z?p9-Y:E8Bkc H#T\s$qdp;pna4qiY81֜;Lnkws:!:kyW4m=$L[ǿW{}Rh1<t]$'W.ETJ\7`Z_]+jV\U6+ꨌE E>:LE\}mM1<)ht]=ϋ q 0pb1 qp$ @ݕP\0amU*H1c4Z�[*܀KJZo3,6\T1>ΒJjQҙ7iA" SU $0a3\xqc8q8XQϙ:/Y A6 4SO b{ECxc<:Vne]"&*fa(a..&A2v=MlďGIqn*'Dpu㒚]v[`n v Ok-qFT Q,'H$;=03/VZZ[9A YiL"u5~18D&x_FҬc8: 끛hyxU>HOj54 IUUu_` }%jtd22zڛ!A{*nj`W_QiN Up lSay>r_Εjĕ �ֻU_ C>۩ǁg5adƛ^h[ˉEպޥf27W7p!yDz7z(XqBR$I0ޝ QF@$ly#IS48>sAy]7t\ Xqֶyt.utNp�L 6";OƋáqX�-̞sCU4,HMUV8X^:r\[;}# 4e\82& ٮ0ty9A �3DZ7Қ/$8b)3>XODi+4(^Se-Z~-IX|^dCwp4NX BcU+^)O'Oáq$ BtvYi&\pa‡ׁHDqbq_%]:I6Lf|L>Odl_,Bmxy�5Xϩ4x[vςD&oQ%P%h spuO<l^*=s`;Φ*ɵ+ d 0 ;[P$q BS a,h?%0 Yx8l*n3*Gw Z70X5{]4!Ih1e|.ipӦ4k1^WNucLU{Lz]F#"HWvlX`X|C<PUeU`XVV#VP+'LϾfI'^�vNÓ2�#$Hvggk ~->w; ֞աx+ c9%PE$6]!6I6ù>/팑ܖf<M\.窻z\Nmt!-Zolaqg`�S$Nu}cIˆ,P"rd/r?c�`Zad?chJ`$ AcUV{jXoIWaבJ@Zvï'UqԓuոcԧHpL!�T-B Z5 ! xɗsiNFLM{*+x6/n6s7#!9Mq>f [|>v0bwu۟:<y9[cQtk9ʸU'bF,v0Fjo~ځ~!Aan#Rp0:.;Ca1pcdp*`6wNvM'0S 2$'bwTNa c0JH����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/bigcrl.png����������������������������������������������������������������������������0000664�0000000�0000000�00000036624�11753427512�0015126�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������^���fg[���bKGD������ pHYs�� �� ~���tIME #m�� �IDATx}wT9);.K  *,XbĞ)jFc,L$&1Qcbł uaY{9s|?\2yyPDEQDEQDEQDE�P/:�0DB qp'�޽"#}'VX8)5̾S5^[/�zP$H.��8bȀSN{''B8�3HDp�<.yG R1�0òTѓN@HPJ*�_:(/ Ga�/}?@렃;!�a�Cu[�]};C E|`xLmU_yٓ E6)m0YC$@w杸H�k�tO]+X%0D�ˆf�."X�p"{}G7qƬSeY2 fff�$H"""x<y-\^% ]A �~u)^ [R# 2�` �7(K,;_>yđGضUhHf /I"@ b0`AĴu6:zy�~=廫 ~ٓ/\`2x�𷿿jQ- b�+< 5$�W !zK/:q!BP)@@Ȇ!Ь Zf&ff&xbl'�Rxi]8!�ۭw]G !7yߑK/8)r14I! wH)E/ZoԚ[vօ�~ �z�Yg|yvW21bk Ͱ~&3KͬYa:Zbf H"!HHIDDiΜ+}`\ěwߣصq�.p}=u7+gv^Κa?A7Wv.�al=ˆ(S7Q^a~Ƀ{R1qڱA‚f3K8O+~Kr{ M#�n:3sg*#3�5!bYBZI�$,2aN m 3]jb>+zc0{ІXa=`9�[ J`�8gn*01 Y6F}bk o~n.NLh'&f,F:~w1x3g1 �(dYBڶ,-� ` ڽ[r?O6'9a[+Ys/xz07�lۮ? a�$�LQ0nhoMH<Qt҉T8wZDB`f֚5)Zk HY)͞Gtu7a @ @+6� P4t{s)S(q2C֭M�Nv9vA楝 K2w'؊w[%m[|u�8D ղR�,9nPx̉'Ιf=8/ !1ZC[AyR)4+[Fz?�%KIA $!�P̌44ZAF3=zx[YO?K8q�lRÆм74ꇺy�,˽ߏw`e4� {ﯧzt̓>?_Ύ -- Wuf~O)󔫵OL<F5�ax˒e1oAͷ:i[^,m'JR}a<Mʐkmb<O`cy]W 4<O~zݱ_ q'F! �Hf4xYk�ab`T2h"!�1b̀`F#}:"�,=v�Wc{5w7A�J>c?`ci&n\ )HXR+tMM%K>>Yjcv˖Yt:(ɮ<e4&@$ &7yrى=ĶY;%�ݻ"=v*5 5X)hσ<R`ʷވf8PF`[]*΃JJɍBX4mf@"qY�X_5c2* 8C3CjdƋRbY* %k%9VM` �TxTJa/~6{¸a>jg P` >TD A&J Оّٕ+7ҥk ͩи=Jeʴqfn*!3h ha2BRh!u>bо{5+<|هk 8 �kV ҆ &> !fx(im�km)hlln? <rp0�Wpm:ff&t%Yhe0)P!�`Rf"kB`o"Xa+p.6<ÂH9q~saŧ|֟{ A�7C37קWyb`a#C3ҚB M &K&ZCq4RښѫVmmMg2YE7膆P6렴4ʹ2B.|3dˉW 58B,u2dZK)EOM}Yy^ۖ%t$EҶZ>1Y\t #!`c+b&/=<O!>#Gwy0%Ap \,)`7Q!Þ*".zFF3hp(Pz [ՍO:{e)) �fw{kw{90N;$�f`͟<u#BxyYSffZ)>XOa�HtbM Z+xS:tFR)5s$HXD)h4$"AIJ)AR0K, €>ac� 0f6LOP( <A HE0^F{K/>}o=@ d@֚ %`( ^5/+�[5#Fh!П�|SXʚRKU>zzvT¶!d!%f~vߛ[4 #�{/?Ͼ;'Q38q\3fSYqn7$!0RH$>HY (OeaC@ !)I!0d` R0aMD>! G^pЍY`VG@kaA@RF2x)d2Ji 9`ߩFEkKzs)ǿZzN N-� le*2ϔWq4a,dVUt5fB`/sg ")��?;kIbO,ڰ ^^zظC9.`V` z̞9x)F(s Ȩ Z) <xn9`VL0BHҀDRRB1K,ByTJYb+׵R<<<O*וr`!Nfaϳql8@6+5!fd2ɤBG4:;3hmMmmH&SH38.VZ)Şq\d2ǃ*xD/o0 sV�bA(e{IJѾB )ZyT լR4XĄ@/�/hM!0Sxk 3%̇ +,XM`\m%`"Oʞ  �ڏ1yTڅjOz*t&hT']—(LR b()0/"h%_gК@dB��>Rߔ*½_1t zf(Ngd.{|)A88Y:=|'ܗ�v%}]Ό?*M'Yui8ղxF̐�Ӛ ﳦX--9IR^+Ut+4d;.sN?pBeAJt歭>}^;9נ>+S.%:+2kmsYY`J!(q9Xk  -Zft󟢛65Oud`I+LĀZwkIjL"BA@D X udu`Wp]wz9 l3h(E;4O[ɆFjIPƼ0c"$0CJ~N)ƌ7uOAD,2WH@Y�C & y_5m`8.^_O @T / '|bҚ$8nKjՙ̪dgF;˞JC3VcFdVEE)wvԓwcV֦ՙ)G5L;zej .l₿sXtV`XNƒ%ٷwC!8 dH f,Zpia3~UB`R!kz'L*7ܵ jqR 7:%BLkzչ/#{2730iy+7� bO'�L.'.1(PR鴫3 164+-Je~35| dz%/ylj}R7\)h܂-⩧_gOTꥻUkgH%љJ 8* 2(ե1l{M- ?H8�4]A2&/i!7.MGXk�Yf5B`Xk:=d-Y*pzu\�|7b C^�pQqRD?žg?y5wÆFri*;pC{[L]:"]Z\okT5k6W8CCkf-|1t*J큧zHk[VZgQf�)lmhK/-\Dy*�$if d֌E ˲::$�3㡿?QG'Mฮ*msdr&z,Xy'KJK㺶vX;k&MkMꩅo]O4��ɸ2DIqQff 'B  D)k ao)!�5DLy.u 8 6WS ﵬ,>-mw</ �,)_8E4@ex:qt6r&xɺp--tD,sLuuf^xM+Ѝ[zL<Ss=+mW^ݶ{8~fkޚ5-�O:uR�nmۚ�wv_N3o+X<0YDCf QdlDwtt`G|rA}$v-Lq~Zz�\nm~L)zZa<ޒ�<Z4~ sf.jRXf @ -JVt<W Rk\oIX_;YpH2=]7WarԾ'H�jZے9{'$bx0yDFضM2эF#縷zF "tt$Сx_*5mڤf`?|ZL{¶mK/iiiGp'M(SN;´!C(>dTQQɴXvEy^yyN$8L ۶y ڵm~,J �8묓GqHUUUJ¥'t#DUw yvYe^F)Ӧz< ��ZxLk#:�̵,%p"L~h1�:!P&5;Z+4Q3՚V(MI�ӄ i�d1C0!GOC>- $m[8p=) tH�@,WyԼOf<R̞*d]N8Hd bA&J34hPO<ZM2J骫~Q^YYrOtZZKCoW paQZ } l-CADfq'.]!F 0})R"|Dz @ 9.̸qh4Aj">V,[4XOD?>Ƒ97tA ~ży~itϬgnLfr}wseXYf Ғ`[9bS=m&H $*n+qyuJI;zzRD\/_Aq3mkkdeQBtq~Gկ_&e~�=[wՙ@JJ}?nmk~t}Y3Iׅ8.՚"L%hf[JA%`!%p&3xXJ "K&K`[7jf6rrD�kzʕ'>�|?A0c ,�T*IY$,I$VRD%okH7 [I$bZoa}էJrW9K4fCCcñퟱŋ~{yg^,y/DD8#S7}-2Wa/Y`ax4�#I˗8BA;J$�T�g䫣;J&  )-q>ٙ7?\o=au$4`�Ȃ6ܛҴR"8͚2M3�0Ғ,ln:K7Kؤ1|sޮ  �_"�}oOSNV-Lc=�&"oSvͺ[R]ffWntΤRiOҮ~�چ-RfY#0g2yGXLi&gO:9+]wt̘ZgBUUͲEx3)xL')�y�-7n;k1cF�߿ڼyloF wذaTJQ:(WURs庰OU.|[5TK?MBR5ܐ8fJkJ !@)P*+A35""XB 5kFfzS3N��ൾU~?̙5 )%QgoZ+\|-<p:�)*Vf)0!ח5׷*W,vN35'(fsVNJ)(0hP_]Z㒒cuⱘH65S~5ƍVШ_{mIxjʔA^u2aC#0ono$-[e33 mo�mmpqdLU ŻJs訨(nT)MMM-'> 2}Wu%CwU*)4]l RNQ@/φ6҄ Y:uJW' 5~DEJ.30c`W8Q�$!+7YuleƝ�tMGWYn޽xҶ-A$-)A& -,�!8ԙw?z}&%H YG r%)}忖_;s]xR{wXgSO5ܶvGeY4G-NgiٲUviTQ-x9dЇnjk_>=֭hQ#w.WZcϚuHoQGYz"1b6lWRd2EV{=jL+'| %R3EV}`$'h?3 _>gfrMmBbp�,!YdA<DF33Yg'O :@KKm[dYRX%Z&KK]W]ڟ�~Na?ϥ'7J03ZZ;qid˩OM߾ ;��IDAT[!ۆ aΔ5NG;Ig6Yq0 Z㥗^ G"}s?]?o{sܮB5ȫ[<_>q aԨeY[pN I�xᅗOtNeƾDBdRǡaJA8K�5B k K߬4v^Nwe$Y ¬IZE$0h JNy&�l7oiWc/�wam7~_?fڜCGgZ{omh^~&Ltrof<A$% ,m[Ju&ڞUd<v P(.BON\O 4l֥vm;o�aݺֆ Ov%Y~F*h#\ծ0*Pssx7B?^ݎithlvZZZŶmGnܸyGg&&9Gsbx q=5;#eIضER ض$)DRmHXyr�@*} Ss x<>񎛿]Gl7b9f͜ˆy֮y:!θ˺ʏ{ѭr6޲֦Mرݚ\vժ5+կ,/RJ!5, hXy.K éTygi�2 w֒(Y+W_}=|wl\/׬Yk|VG <9HSΆ[^H2"~6ҺI{("P,єHa&xۡNZb=uf&V ⥞G&wǏ, _+1Z}o$z8M৾>끟'(t򤺏u3?+tO~󜣾?~_֟4 xQu<d3wt~YGGgη}v.aɒ;m)�LOvqjk{]wsb۶F/<3;3xOzCV#F wW^ccY*QxT~LM7ݒFu.�`Rl*g�vJw޹@F#7]ŧBC!f/L)4i\l/x4D B , PdBgg'2[:k!E}k %m!,KXE2_Wjo7pg]�q=c k=v@o]uv!:`Y<6BC YaE,*%8:::QE'tII [7x+|ooz㱒JSTcv �gqjw/Zf(L�TWW馦&1{ #kE�`}':xi.aY|]؋oڴ٪R_{>8YDEA(@ёϿD6Kpfifo]2 GK�TT#,K 9W9F li3k&0 �Tcƌ? {~ w߰iS㴵%JKDD|IJض%\׫hjn$� lbH0&2ϙp]ks۶6*++_WѣkK/=Q{_Gt{m[ڵt:C6mRv>}jo[b(x֬YfdwL\mh/fBO?59fhLzl[[(] .4 ڲeREP%5ÇxW䧉~WXT O,FdZid,IRDy.-֬E${23U9ٓB?{տt!տS+/=5uم'UϿ]uرWW;2_ZEA&M,+JCxGkax--IW)FU\٫B:S AH#V7|M @83x)Om۶]<?KܹǥM9!t뱍 У{4 ]S<6E<x<>ʬ'q  mvMCϣ$Jt]Ӓ%%Oet~�<9aH]IAd"fĦ.ppzeY-!-&@H6U Lfeٖi.L_۶0&O 1wW+LtrM?(ÿT? f^[,֛b�b ǢmDT^x` #̞@ڶ-N Bʤ]w]iՍprQ#<!b]:O=ם]u]GBp$�l x%LzР*8_PRc58`寞\{�F3t$ M`s0߯vHC ۖ0e4\W%lb)I pH{ &>$Qh۶H~{ Hn\<�\^y}`f햎X.uS`a)-4FV?I A:iwpC aƒs2c:L%O 7\V^^iTzw^XȒ%<T8! _uѳ3G=;y*Q^5 �a~FS( c,n#Dߕ!qӃ "bu5Zp(<. Y<>d$ @&dNf݆ȐA5 sBeQ_;lHX$8k=) <,S:cyٲbVrWl �U>�^b%z!:B 6TLp=fD"^>#Od2ER[[xN;9аMr֫Q4~lʔÇzuu#x 8k(|֟S@LR,V=%]mASͮ F渀\ )%`kf&bͬf\W0?3v%AlfzPW; 3K^{>K ;g[tvux%v!Riq앆VYi9j8Fl[5FW_s[ ��x7]n((a8T_ , 8<y' q]HR38êUkD4jtwy^r˲"(O{AdTJit�.u6Xk׮˽;ÇU%%Q^|uet&qcP#?Ŕ.26((xW`|4l*sm-ek\ڑ0;O׶m$kV3"3U�35�V@(dh�^|$.S}ZJp6MU]PȎssN?'R wvt.7z~}'RfngVJ+OC)s �;twykƆH B9'enc,Xd 45`͚V:Mc<+VPeJ3WkKBݾ}kYW9֍F#+{ɜh6O>ՙ1cZo>W^ }wd/jXJK.`̘Qn(dAk]`dY~O D>wR<9AL㧛o? i>V笙KҒ_> &d23zc Lu CN;׷=lD<nn񛃾uޱJkJM|(y zJ@JJ64p8̥)@))Z6ѧoyՕB [lDBqΓC$ =]# wy'@~{}>*o>毷/o {%HHs3bt(䔋ضD(d#-CFH $&IJ DHH.}̀3a 83_xDȁc={Bvv˧M=j5q1`Ū@Ռ'c0Lp#c ͶŐ-RŨ)F>ZiV*[jJkvDi~;4z0':t  ߅)K+I|q< $k? t`^;;&X}˻ؕK0֭> bĶ" ?W{L.D8,H$i&RNE",LtւRih#3cWy_|[?wޏnh(3?5+ R3w~ 0w3o$ [~c޻[=5kț AJ�,Y`͜HHA2p1BIb~4ou'Hz})g$į޼E�R[۷0+A;H:w澺#"D XbII e^|@4)�o-}j0_O׷uYG~x7z;n+X0E@ ffì&Sڑ35nEυnI4kPC!-H! TNMbIaJݵBը¥*'Ayxm"� `ڴ#}@`G"w�`@F+*TdH SD+LaT7WoIv R Cu7;|׎$q]̼/77gPR`Ӌh4+ 2S#%I@��H |9`oB$@BB %@3ldY5h&r=VD#^~iwп>w�< G0?vUw ȧ٣`K>̥tcB$۶m=W % ATLd:|9Dvא_:7k\uϿ )>|.;5>)7$��L 1Fab%P$גLC0Ŕͤ,Z?lyt]|O+! RʩQ HڂRt<;Sɗ #0s0j. *ؖ'O6k_�½+o:ڟ#kȯ{? )_|OxD -)Ru ϕf^\u,+--0 pEMlu��dKu<~puΗg xqvim3sqVKp`uN;R0f !x%躌emM)LOD$!`$3_3X)0q^2ڈ}p@cě$}󛗗quޅSsOuʲ�(ARJaYb'C'%|CWek;&L摞^| L̈́0we3+>f*tmlPU qY fSӻen:pViKڸ[mntW!)QDiCB)8eI8^ZB%(0Ea(E(l ˲ FâsãϾw-|wV%l US?[[LCsPX椇O@t>f >6ww,K!w{l$9d _ 0ADBguO<www/$6L�0&?h*؇�^K@GWECTۚ9;}؀hݦF3[[:ڛ[:۵TiiS(kzlr\Ey*$!Z3;*ŮڑRfX<*neUWW#vUe"GKJD(lGmێZ!B 2.Y01ӿY(T>g|3r1A|/D~8sd\B1g\PBB@{+z<Y`Ic@|&;~책Ia'q៫d�LA0sH PdֶBĤf(1U!u٬W\? `(5�Qe./sQ4&\RɖǛ/--IF"C�D9ЈX0cfc˂@.h rS 6M]!YQb{ ~>tyێ�ܠfvіMNO߉Q~;f`6>;#��Sas�CB4rȄÇ߿jim ׌-/OWT B!C y)cfC@X 58'aJ׽w ޙ=E^׈)G(c|NJ "c5o7"tv.w?}:7dO@?R, c0 "�R�"T~'c9r䠵[R(f IԴ@- $_ zRu]K, 2$EF0kfQ+MBr*q-�?�s`wDpr"Q0*$�a!:mfȑX LǭU I6daG?gcݹ`ck!0}IsQ шt &fŅ\@`flԨn~g.[ S0οE g`&P�{x`͚2ePĺMf%^eH@!DTP0. *Aڀ)E?obb@Ak :~M) rTH5C䮤Xl|uG_KFaT |;E Y0(y00\3*K%oxph$dI6%h], ͨ֗B+N2[r\ J d@Cx<JV}Ȯ1z`^ �ۓ- m}q{v<afK-[3}Lu0/ʆX Ʀ cl>{?~E"!_#ˇ>\߀mA Do;DᆪHWo$Wa<iףEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDEQDE|w7Z'U����IENDB`������������������������������������������������������������������������������������������������������������xca_0.9.3/img/bigcsr.png����������������������������������������������������������������������������0000664�0000000�0000000�00000044705�11753427512�0015134�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������^���fg[���bKGD������C��� pHYs�� �� ~���tIME + \8�� �IDATxyյ?9l 3þ ˎQIї/}Ѩ/5>M̢1F(Ƹ#DYd_mff饪=?nUw�}9PS]ܳ}9 r@9 r@W'p@ ��@n?nBs�`0Ŝe9ϟ N�OX �G8sU={TgqN;Кto]N�PT/Kl�d2+3'.4_Zᔦ EII%I� wʻ/R�8%'^7>kJߠ� @PJw0�t/JN�p �v\viO1:ae� șu>Кu[�`~=#�!lU<q':q1 Lmh�xi/ �IE+X > _$ p*=?v}'եex33Ji @ !D�)T_v0qe_�d^s fKBe ͍01�u �nPVZXr׎UgsLQm&ڑ_44(!  "B "[Ӕ)êU/p;|Ud/=oeOLf29<�bM6xG�^q z<E�bG6]>�*`M5i�3i � p $$B!4LO>=獞{ W !.7z`KO|)Dҙ@c_?^f ֬?g�@-�pրR !�}t}$sG5q>s=%%IbkXY03XkZfOX�f5(9 aYd4sO|0!F�6> } J;'Yޙ.;ZWxu_h`],{0j\DyPgꞇVȬd^�9 �$Գv֯>#5cRȑCB4K,� ҬTRZk@3H"""3$%`!$DBfsl}M5\ `ă6l܎kwO̙ubb1"Q^5MMJ@: `13K�\ /!FOpq' 7%!@!4 ,4К-Z)U P:+f @ !Dv�E.e aYB6ٖ�\u`ٽ_dq&6|i&<5MDZcc=&B &ZCelR)�2}�_/@?��FMnjַkX$pWra1:`k533CjVJj:RZJAk:D)(SКYk "l;\(}pֆF�gD>Obo\{_9O|.i\|]x8 ]v}4oߎ EAr5@wupMJ`l�y�,Kӝv䨊ffܫ4UBH/Y}b ҾJ)Z1PʀB) Z�d7 " 2JH A 3C,˒!@edI HK=y۶[|}}S77x9?]5ВOŦVx5X3Gi"֦&wBq}y̻Z~>L4V�0ܲddp𠞍AҶd*ޜ*M+R]֚X�3:XfW5C)  uAkh1L"Xq$ӊu%$),KY4#l۲=ڵsـgU[�O8/@�~ <�-ICf|/+@ƳrhJ^F؁lk+0qJ<(�O2dL&v6[ʆi| �2ؿw @ �dТKvt按 ۶':J�\]]2wg&b-f�V,A@s 4�!DQ@,� �Z%:B�1=e%;mdL*I-,K²ReYB,KJו6D/<]�fb@J�'paDXȌ"–w_MèG|ܗyJeNΙ{#^^& ?3rRAA43^.I?mkcc 76o۶ceSSs6ΖiS` /h p(\a^pO:㟝kIs~KuEcT;mե"2ub@kV H(6Ќ(7 \��㓳 ЬʛQ�G$:=j8\ׂe ض Ak6 !BpؐR DZe%D tw7x&S, I ,@ԯ7LHEXƌ�y_s<1813ya 4#yXi)`)ǘqU}󛧧zŊ\W]76ҹ\.hlܩayTR *+˹q]q]̟Ζx6+'B (De 'k*rZb`"ץч <q֐,K ;±-!m i�LZ1iI i "΃A)dwR AR*0o@m�)0k !�CJ.qGCmeY$$E&),e �羡& _K}PO?~OsۋfpNWRJkZO<;Ƀ1{wdZZ/mRΝYl lQ M#RJdJA�drhiiA:LZi2sE"d2N-\WѐIJ )IeV3M Y"� D&feĘJ1*,Cp֦sؠ#P10@$ P .M[�aߘUDQg ! -Cp8H$\&E<RZ, D$&QX )Y6I)YH?lp"/I~1Cw~ftpEyʛ0nP| YY暚 S&y M&kiV z1apճga+LЩS9UWW[Z555TUYtTATXma)]"5`3ZR ZTmPZ 4)ER Jk Ii&4T}~(|R~ Kys!%d2lhZZ|47gښEKK--i9d9r}_A}\\|yfs<# y|_ibp</@+~#"R¶m8K4:&)HŽ&L:qE׮]$gƹ'٧twb�[6�_w�o{~ۧwN>a>Q(?`FS|_U=6o$ '@CBb<oFl B�B R,@@J: c(e:c(`ls"Ȋ͚D+"BDGaU>�yr9 P<\.w5"-<P7b $ʁ(ƌ �(<.�˒p.eQi( LD,%'O&N7\4*�CԽk,daU dwa}BDe|RmzZ+?$  +CK}=rn\Wz lN<ԿmК468A V!mNŷT3vw΃%| BSGrRdrf}?2jgP~-AIJb? @HDAII D ˲u%9%yLJ")IֆhY,VLzqūgx\'}A.7v|ʐ #|iWۼN2_l(+KVF�!(s,ͤ2�LNS<ھ]{msf۲Ơܜ` \h2�)|:ʎ!t#J7@�3aοڃ'fsy8|! ZnM\gCtbץf{D, CaYJ QPZ f2LyIvgT^89�%%@F݃yʔ{i�G646?=C> LU&iѻw7SkvYU]m�"%tp] :��صˇajC'*BÍL\a04-_u?S*aɶ&QQQ7…ͯ& u&LeOx+8pX l(H!@=$`PʘfњX)b$&$ .&!0;gMX~*S`}��6㡽|o g~qsU,IBkYZ@֊'OwSr|K %%m"3gB?�xܣG7E=M|:AUM0VE-]Z_)in]n =̱=d|:|;"txcMMb�)u< pb`Pޮ,h!w8\ׁa7Ѥ5;&Iaas'<׾=x9%tT YOIUR‘4wݭmL6wDii ,,(JkVJfTTOv奥&{$^K Hk @ֈvT�(maݺu?=g^*9s^?k/׬h}3庨%jh2-:tߵk2#O{{/'O?"[QQ E跋~V"f ;bPE7Hi)۶qbfmRZ ,Q8LDR ?g4ǔE`,}׮8�v~L[Բ4H=tC{r_qa_UՉ%i#@Bh,A`Iݫ1[?\crRBXVބ�0wʽRJ>2Kڴ[b_2 ߘBEsljQ&7\.nݪU{mqفaС̪AT5( ۶a6D) Ktp]b۶ ` y!r\k0/D}2uO% +P{B%[$qu]r\eA QYσfڛ2{�(cٲ{$:w[Kuu�xbu}+oc͍R{�{-nT*헖zϟow@5-}Dss d6G><2Ln4eYpbl5 1u~</!l�Lk!D{)'p˿!׵Ôd_d�Z̓5ּhs=gR¶%c%1Hp~jRhmneLk ϟp̝R|ʵֆ7xR( Jzʕk 6[oci]6rZo-fsCI,\�Wy$})|d?sm2Qccկ.پ^lٲ]nb�<hP׬h]jmRI6Y`zȔCŀ@aX,x<X,v@Bhxm>Dr AS`VPʇR `$(Uh 32P o{F7aJ~!�Q<�O󝶶CKB Wji[,l a׶\צis8N#p\HD!ɽ/+,p+*ʴؼmiUUm[ plPg+wF_g>x?wKL&Kƍ~Ÿy0z︙Ls[nJ7,Ewu_YcÆ:yշzJ*uuU6tkW¯}nyw<ij5k6Z0N1H`DfY8ݮkE, ȓ!񆲢\|HAd>d=/Y`JC m:kAru*;昱�i~H8@OR�,Y;~T+J9la& p4asD/ioD0!H%%!E+L&KMb׮2e|g[r ڵFmV/g8&�e�u^oZ.)IT*}g„Cr�/{ꮺtV�ﺶmQC^[+++Roο&Lzꉙ>>bYf9|-G/X>F&=٩S^t]VZ~DKK.BBBJWn m,R�<]>`Bh� >� ) 0S�IĀ`!,"JY1X0ڄPZWzL L1/D@=�T5`Q=dʮ]:_O--�r$veJĪ˥۩TeIiUvJVr9sj\HAO5ɽМ裵#<x'7?6mnT׮5z䱹4 _jz:kڴò\l.t( ֖}{{RT9L1b6o.vشi$0 ֽ{WZ[vF[7յkW_[**++U6ӣIJJ {21n }F " )ض 1p,˅t@d~:f+$EIB@D#�@B9M).:O~ -&۶eI2 ?<? 0t2buq$BΚ^z8hځ)x}Cص]+seiS߲?^NuXo+\6ឧI$R543(6\ njYH&ܥZwUsԬR =L<ˉ[n]hh)�`aވCE>gqrۀL&K]֨3H!a9x߷o`ʵmY1cz駟/Y?~\.ߦ?`%bfY|}{|} =_fO$=_`b„q8<\裏;¶`0]8-xJ{-4!77b<�Q/ym ce \I! lmI˒ J,�)s=H뮻!^4}Q] |P+oy6fދeeIS"JRq8}"8na.5sSzgK.hn 7A$HJ(߇˶\ZëOu$EK6Ѯ]sh֭"2Q]ͭbC<u1~!9vQ߰S(͸?}Zf⤱C R{Kj 9f/H23pA^(fLƣM$R&ƌ 6̏q޶m>|?jH!qzV7n$g>=]]]_z+Wgqjz~A C7w`Ylہeِߏb|h)(D=N%dh̬A,EDc8S6^\[7>�^< w_r,95Eok^0f駗Ns`fljŬ3ԥb7 wm-7|rlJ+&aִ46e]^ys#KPT�� �IDATEך$\8$Bː ;\r}$g:!]R₆)0OKuqZ <wyNvUm\'wU痐kc C(hDFG/S )~h ̠*Ǒ,RM^ iIؖ ǫ۶f0e �RDW^zm T|:)Ơ�h07_dܘ!B< j: ,=Plք6y}e[2ǘ}}ߘ H)B}N1k։T*{0y -euXdQ.B vldR=ai+tM !ѳg/eY18N"t0-C*2`h/{r##=?B�ha3dL"N �l)_w CE!?deIS3˾H[@}/o3$sqgˮK.ЯV[c1D IjL8b!A33!<h)JA�ʊXDBXtQ]EVlE$� D -n-a6(N{�7 X|E֝Dnζ!֔1yχd1u\"aN*oe_Ęw`!#J+BLCЮfa$puҩ E/>+2qS/$;onǹAzvJJbm ) ,aIRS�yYSTkĬ,nPcF ms;oûP pw_6l,}}̾2"2? T!,kLhqPC"AaA(x~&eEKAk_eL<|s)buVfQ~ :TJD̲_XY�_;kn[*H A>}�.z!*V’B(S'F`_<DZe�bZK/#"L0>if[ #Fx$AeA#<�nRfS.Y~#-q?�)_hhDG+FH@R@t0¿`7" f&,7!DLf Zݮ?∑ugM̘?溆U#'}V[ZKK.[_cۖ٪e�13�e2&iM`6oSdߨȱfӭ?ܗJ3f:g{l޼Y^z?%%%)tw,[5s̙32]w>uguR[C'"z4q啗5i/A 8�Q.n�зo`ԨA{`DTTQ=8 ^@o1j|! fejԬ$0N[T8?b qƪ(ۻK?NRrlozlПp}WpJIφbˊR+Vݥ$֥kYS[Tj̈\HdΜyɓ'~713Hٮ>u͚w)ɤ/y 1{mfȼΪU,˒1R\6ɊrH$ucdi ^tvQ)ui"4_ ˼y/|uW^so7%6m]}rj1L5vl==_eћdhkˢ-t:˞qVJ|+hJi]Ĭm+$?3 @p{ C'o\0w۩k+og.x{yKyY�٬T2@e(u39R$Qũw˼]V$@ۦ-eucRQ�8cf <:>wҏ<DbɒeiSstZ,ZCu\׿>W^ktC'x` fƪUl"VT[UESBȉsb՝xI+�44J>- ~w.\loP'8ㄬEva̙ȞtXJ "XBPE% H*El9 *^^Εeo"f �/̹9oHo,X�li)/K||Jś ́LҥIneF^؈ήfnkd<( L֬Yk~t87oƍF.ƯxE9眕R4cƌVXiOvDnݺrL&CJ(--L&C%%)&"TVVhff;:'bHe˭͛X:5r+*WgK,~.tmor{I[[:ɨQüiӦJJL\Z`sl<`EYYm߈!vmsfHa߁DL"Yi E(9M@gjk+ѩS!32_Lˮ߰-ֻg1-_oRX748XuYkhhW#Fc?uv'k~GCͼlrIFąRRZymaQT^=Հ}կ~ے?ͲK]BtR-[n|w~-[ /v;d"^^`ӣGuw'[[[fe&M͟=@䔛Fx O.&֭ć./[^v2 vJԣG8߹sgLtm][6zp{;p]B뚶:l3a8Ҩc]LBJ8CBl3>ww`woi_?{Z돮'zTښ m>_ZvT( *֦6q0i>{9^q'b1J1WUuBssX`{GdGO2k|RwÉF RJ sQ7xKeY\YY9q)[{?֖K.[(QJkn(]buZd} *< ǎz٥K㎻S̙'dĂo9Wœ9ľ% 653l?RhhhӧnȁE]v�xG7O~/*+1w̪̕b |7aDkf0&x pl2V.n$3˾p' Ӟ �pؒ{ZY2t^YWZ~<錟HjN$kNf�P@ihS{#@hM;wXB̕plcӐ!QG[{Lrpo믿OxLb.BGkt:CK.:k!֬Yk1cF˖WVV[|ŊU uճg첋[V�ۓ/M;�@Ϟ;^{ӽK2,R nkK,ISG+2abi[RbȐ {$<h|Ԩ~1DJ v٧#^zض6W)%#cH �Hdͻ�+VlHx]}D'K?Ӓc2; G~E+{ >GKOo,w뿉J 6AKP444T֯Z1p"<Sn"F1p]�v7d@5t }晳ի:s<u\}K-[6Ʌ vf:!sguE:xRJ|R{ĈAssԩBϛ{Yg=\^=`d26<J$|gf�`&zݒtC o|5lݺ]._*CYED^!6K(/_aw}֬Ym)8gIJ DZh)0 :"eh+fP)8 5�P t _~ƻ/L:ίK&ct/~gLaڃa/+6j�2b5z�@IãB(X<z{e.w|kC+f@EJK:ր4XOxc+@,YRvCf$[mff:!;eDH s+.i;v:~UR neYλ_|a[YY)/_uM6G9O&~Fkw{m~Ԛ;ؽ>ƍ;>|H`v2R̥j_~b2EO_rO-)gŊ5֣Ή_.:<tӝ%7pEIѫ03y ٨u,f%[A !$A"A ͚I5 t f,Q~b `)DHol`J>RJgƍ^}cIъ k+ *૯s?=֥$ÐlT]+&�Lz F4qc9Sf JDڿ[ok{0藿ur&QREm&E()jU R.Ν;ŏ~t}-\�HtE?.;#sx׿CjŊ}ݺ=xR'lRK+]x=awŶb1 Uf^А(HHH"3aZw[~kONL �pu-G$u[7}wAwrQL,,ib̦1L?qn6>w .1׵L1ց@v`>'2$DdZ39{F.RuB<)#I@$&7yy8ͿU4F 8 ŵ ڗ\KASDY{б1/\=nH$�5M 1i! /VUuRxGlذKXƛo. aI "Qqa*iAͦHI0 uM7?= s\q{赙{?\G|�3Q&a- bMRS& kk( `[=/D1@ ڣ}^Q]<VZldN|� f2vB(4ȃp+  JɈMxS{3+,:N1eO<{gur&y/nf,Ya=]|󯸳g}gb*t>?m۶%KVU<s%ZN ((3-oɏyܟH,)D([<?w[%})ױ͋n*O�͂e,o$J@};'zsK��?#K>1A1 j z[E<q`FIhmRVX3@AcnSh )(\E1` !?c-:woٲ{ݚzܸ3}啅N]m]sbA׿>3۹s~շc'<[r}oW]b!eI$;qM'ox5•WΝ-W `��Edung+|7_{qT;NmYk =W]q} ~�dv_kԌ/ǎw2翉sgqk9@EIDȪ 5? ag^ WFd"&Le(4R+{f._% "<Uy@DƉ/�gw`ɖdL42x?|Gy6j:ٿOC0s/ [z]mK$6:w.ׇ6B&0z%-Z.뙒D8 L !D6>Z}ПPh'#È h xٔ8fՕ8at무v+z9�se)}iVʱ ʌINrT%wPeooR45w԰p]o%\uE'7wLIYǵ²pjcR A\Da2 5yV!]�c^;"8 CoTb$ھ{SƏϑtn-,!ҔNgdNF_w<f̐via#)aφw׿~]>wק/ ѡMHZFf 6 F�/p`yf �=`f;ܣ3^eif� AԉCRݻvºM;ԇmmilܼe[S=*x0&eɭ={|ԭjGyyJe\UUVUǪNT*L2ǵcm-KƄ )ag' ]E%3[lnD4ZDL`;.NGDET}*34f 0CY ڤR̲뷈nC~ڶg 2 E7Q0#!("ʕ߿M~"�rJkR*.ZZ ] �c!O&C`F�NFT17q�|`]Xz@,K;)/OrٳM$bTcmmD[, 6bô @ H;b}f)"�`2{1ƘdD ĮC9 Λ{ >(G(yh:rnڴ�K$?|^p[)ьkᔔ@IrZ[!vZd�2c *&,0j9, <9IrTq0JazE�2>�[LQ=`@ε?0dž=TTWT:D!iw,Gg�%b Q b0Z�c͓V/??( T?pBұAȀdƶ [drʧ(�a Ҳ*&bH櫨3�!PȞ#(Ө{2*j03,aljq)Ǟյ0� s槑|8 ^^JVՍ7tSsM^]$A�LIjc l"R`&fdu}_f"c474"M1XCx3f 6eC,:0QO"LT \{|Wu wfoP @ۀw%!ȲPkYpKKᔔ P*?YM8 J)x tK y3!=3SGtV(?wQ9j>an䳚�p|=@/db̩G=~ʀ=۶kf%0$5+p7Ōvg˜I  {< ?`a`�jnQDeflڴCtC{.w^d Rd�!.5))6BI<>:NL\3yAA=|QK?% 3hj=(V Bk3gAn7ۀM�s#0� gjʔI:]:;rq9QYYZ_YYˍ9 'clX!&=s i7+P590'@$ $AQI'|Aeɒux'|}k+c>ϟ~~j)>$Zp"#9r$MtBҶmm!< } 05BP,A0=f,k`Ᾰ#eX?�aQ&S\NJ5T8V<٤5rB PVY=3^|B0fX >( =jsTiIݚ~wQxɖ ˦8�� :IDATԱ--J&5J%>?\kb8{μ3~C@` E "DjH0!+o1&1.ZC(V[@t~NjsRtwgJ_L3LyG<T{~;ze$ &` ׫r1M`֭shq맏oG-iUU<>l MWt[4 ujkR�7o\Ҙ5;KnYYiDZi[u/pK^n,okiޚ# 狮A ds}How+]3X52|6tI_sǎR)~rəE}!o*cc5|I۝;KG?.whk?z9 xP;R!Z TGG^M{n3gh5ijŧ7lޥ/Iۮm*'꒴_BV|}1d;f|ŏjmפ^[~ Z@הP("T0A@X.@nZ&Y@ֺI1ζ/d.4:Lt,9*(U'(y#<!;`*UZ*|zaP- 5nϗZC@L˘ #Uss$Xo^H0P{YJEER )ٕא%3ƙ8g׈?[p\dq*pv ]Umc_k-it:$&$$2 Μ}FUgg s~179lVFFG7@r$'7mie) \KY8޶ u4{t^c%FGNE,$,svUy;Z͗8f]n<X/pPqO Crokp!blJ:S Hmf*|SpNSu[[p/�^O,+5 S=^we/Dծޅ0uc+ &*5"j&4I5vv_,xsO:e/�'dGjFsʳEtA�pϳ�^$8& ޞK(0~=S2ܬAc-'{gC@cZИ5AC`p>=/Jto�Q@fWe߯;K&18;6OyE& $1U9 �YM,7#ժɬ}O`?ZJEry‚i)OMs 1iJj+O{T |{W\rʭV֘Hث?<b$P.A8`r-|%ITv欽ZUKJ%LDX.FJRBE{\vji/O ']-^GipUm&:nF3>^e<r91lnNݹ'."*ZrJZQv1NǨa�!^SpGQ8CA_smkE1{l*'񖩴W:8f̬ik?1n1E.hp3ob:8t"(˰ט/2 3 ^hƆ;Տͥ]Q˪_%56˜'☬!M@m3W<Dj $˜xf*m�< hN+ 8UI Sުש"魅^՜,I!cl:%("fY7Jnu٫~Kn7<&X㪓 Ws}`YV7l�-R y":|�?nw4v?$?N/L [D> />f7CO�#@q1$+0Hu #Spt`Ytggj7X.Wz~|Z@D�ʸ5&zwkY+Np%_RhFUNf1[W9Ϧԍ]?7T)x;׉^5g zK|9 +<> 3.t{Hbi?s7=#Mrb q 6-,bxp,qpw~u0EjQBxxT�>a`c;РUP0l|xw@r[x5iZ ~q����IENDB`�����������������������������������������������������������xca_0.9.3/img/bigkey.png����������������������������������������������������������������������������0000664�0000000�0000000�00000010075�11753427512�0015126�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������^���fg[���bKGD������C��� pHYs�� �� ~���tIME 6/f��IDATx}L[ǿٲ?h⟡)Ҡ5i?AiR Bd[Ze/*N&mm3ԤJ [ԴaN6]Hm6>Ҽh*0o{5|$p_9sss�p8p8p8p8d �\OR?΂eN�!`=@]H@!j�ŕ$"5,EEŨw6hRw�py?,KJ8yG.Df3vҥR*ay]*,.S׿e*+K}t m 'g0J `C[A0BdqS�;˞Pk?�FO\-X Dv�X .ed?}`K w7}�ʲDO �56XQZ�\�2Q]K KN^ ۵C KV56C(\E�&yk,yqb6XB~jMdp5,t]Z8bٴ$/.Wrk:_,G2qw�LG1*!�`G[�''`bEg{qwa(**f^_"by! 0@uM[=_�܊L dC\ ` 0Csl. >qnxu7uZ (09y#sM:Ql'h*5}z>u )כ+VjYuu7 'qep.WHX Z}J1x-868nܸ>s7W|ƉDT? 4U5 :w6sP.A2 Qw2Ј�z7916z==�R/[,QyEe[ӵ&+?byE{AmH%5,.3C3?'zcSb-M BdށI9nyH/!qt%:�Ĝ>qı hvGǷhe�E RJ8Z �κh4S%ʂEJp{ qA{ZZkYO<q�m{,u~�pnFsQU^eqǬHDu0;Efڹw4�7zC1gz ~Lm{ŞbMwaaͅVXvJ]}P0chEWU(^�8UXXx3Yu?s&W}|qZ;}>(J~H3 )zʃ-\k}|og̱zJJ:kJ%{P\P3^ӯUhbYt{ j�z(Y~zl.\:gfp^Q+;CXE FE?:zޡAN|vl2N8�<:T^Q9±>:{޶wpϑWkuyE%um{06zY*4%=z{�+*sv<�xiiT G\鯇dP|Z�5igkzCIL|69[X[%ksI 㔛cǖuuxEaa䗿)=ޡAܼyC~KmL SS2-9v.c29>~D;4 gR ( Þpx� tbfP^ht1@ 8$,|-T $2v c9GXB;E@MW^Qc}nUw5Hy DFp6"Ĵwh >>Cy<$),,F 'W\ij۷ܳr`<@a,{m~8 `jjTͩ.V2W,UD1<uwAҎ4'-o�,'OCh:Y&VqiPdK:@$ #=έ vx3wmP'w]�h::tA Na[ʶ\\MOݫsAA(L,$įyy5HcM,HBR'ď w8eevu R}ԠD*iD")[;ESE:2 e6/1:zi="ɺr' e&\ ݓƍ! #@$:wHAAAAu/::G2Ӻ;55u\PJZ@>N7ڐm4FF�0?155 !~qw!d?4,v4l(`Y<5�0 eE(Ty["^A׆$ &x] į2]0dO{< �]ZI83l$KyY`ժ„o޸7o��J{7V 2\|~WSyi';Yg{_$<@K!2~s4èN@ػYWMRlw& }' uYNw�ùػ+o3ˍ0MA-O2ygg~�e60 8R8�&iuD,Ί�z.q!9L�Ų3 �'I z`(l8�jG1�3"Zl3:gcRksw�EG{u[l�Wy.-Tmcp`v+.i;3?."A*WňE]}CZqwcU*,[3?;>pEBc1"$h4Nł CO`35 ny5,%A^iWfբ.r<(qh4fELB;x7%LNEC .MNZ,.eI8<1g[YFA~o;ye-ۓ@@de+X{E(*N.p{zӥ&c;a(S4PsLQ�bWK ?Ni8Ax <.4<#<%Fr aGA EiB;\d *Vp;9AEfqUGNUnu ޮ pHYL]V"f_oO;�ZAO2ÚYv<,OB<kށIŒ>uֵJI7[´/ .v-dftUqCEA׃[@˩&1 E$S<|+<A@$~whWg=B='fC<AɊO7@ԊS-(ēh-) :IM힗Zo~7x <9K[F.1)I3(z>11>+>Ψgd6!5B]Vr50/?SSSAA'hm"KK5#Pa]e9K�֩G[]zj嗧�&+ 8FGnު|$H$ %z%K2^}L:1VDF?Xe]/$uԋ�Eyޢ@�hWկdɒK'ߟ埒Do�G.] %%@@F?|w<.��n\XOs߅?Iz >3P2I`Ie1@]DphP4_QL፞IBP,f8C\\M&KŃz0x?cYkEUY[5ݥ&i '0r"]!|8˜\H<"4u0дu"CM NOwiNN~,P.Vf2S+oCY4 BqҰTb p8p8ѝɥ|z����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/bigscard.png��������������������������������������������������������������������������0000664�0000000�0000000�00000025341�11753427512�0015434�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������^���fg[���sRGB����bKGD������ pHYs�� �� ����tIME #g�� �IDATxy]Wy>ܡnTF2eIhc<1!X<lB +/4M^x2=::~+dKm<dmIXRiVT?9nlD]*U@[Җ-miK[d7c;O+}k F[AP G[ڐɀh˹hKŴʶM mіsM5H[-miҖiK[~OA[ZEUAD"(m@r@(.>0 /|b<K`YI6z~7 ŀys/ "(BDxYp!r xGg>g5$mû( ˢS!s=ǂ (JXks)I@ok}`%@A |l`q \|ttt`K^gٲ%tVw 6 my=bsUe… \P =,Zr19G$\p8pr)`Z# jҖkq!,[0 896<ϒK(JbUe߾}8;w.@m͒|<d.v(̝;qP ps/P*N*4 hZpU9cV9p'nxY|9Zz!_d b }q4?yǿk<~7s A�DA<8 @D~: QO,o0j"kD(K̛7k~c|9$IL`QU-[18QU6l0a}x;wn滌@vg|Z~3֭wAo<K]M)*%`5s5La*|=]S;̘I'S@# 7Vf듿/s~=.p%`hlܸ%KR*?"¾}p9MHhFС=˹3gvH H )r`+}?,Jdcdc`5F###W~wW募]sAcJW'"B^h+CUOڀ1!na1a0I0Ƃ+fFb9q_(ӦZ#@�S+ب ,c:>>4Zkgrb5ZO?=TW.pt&vؿ?߄ռgco~#^K_?bx4ۼUG$ٕ-‘C5�Sca$�al "1֯A㴊XP=XIM8c 11h_̵;=#ƴʝu z^x1p�pOhV9cǎh$m@NW;୷pqG4/fB c"zIn9gj4@h$)`5j!b&0'e 1a1E L^?~~_w~+RүwZwr5>KpT+cED&4r͑;۷`c+Sۀ<ჷ]IW%A+Z<*u?0+/[ TC<E@,jG-vV &Hq.& Uai�A`$ N㦛/a?aWޖpx:Z-]F$4!YlR Tsch6֦;xM11m@NG~{77U+߇HNXVkK R*L> 1@-*o1iW5 9ʨf:q06&(.SY&; u A|{/ߞ%I@+qQPU6mIJ(xc4G`̙3}U%Tm۶ÏtT2n6ڱl7&I">#R#� JGpA51k#-ˎYta_/0s42fW 7,Z4Rշ{n u /ZJ$TGR8^IJe)# D&۷ogqڧ(wL% i ii miĈ*sYCRD 8>Po8j$cclK3JA7\ȸq_GLG%Txl8T=b/~ vbJg 'NbQU^z%-M*}t:�6'Ѫ=rk۶m}!V?r'B &XCIBwqiMgcGl >Fԣ"xQ "Fm toxDc -p1,I+!3oP*Υ9={V"NbҒM/mb'~ `f(xpl߾5kq')*KDg}M$vLH)ۓTs\|2DC] H0MZA$N ŏ:d֖GT#Gշ٠$^O˖ӈ l~i3+VdpOP\ZZi[ͪm۶vCܿINJ. 2A!(<}1}�R'Ne{r"`d4ցI>c fK%#X| B>R͡ğpZ5f%K  lٲWP,I\zX)D }<o2Fs]5OP҄# 9n�+Gg(ڡ!dZP tokjZ-"4*8M'ߧ�O 7@Ç#G]t}\QFR;QG<E H(:n*Q{ϻ޹z^=[la劕p$"g9[W;v5r'(wL='xK�woO=4k.~Rh2.*-[,'1D4ǡ&+H|jZ-qRj=?ٰ c>p^ DH U{8rl7I8`JWۘE73_g?޳ek IEsT,MkYtp%XSƛ/Nx$Ӏ1fVHAQ@OF=?J c}Zd>CKy:D�-14䷿x;VE]1gkx+HSi ï70�JTYp.fM#đ8ϡٳ0yvR6o~.b}.5286o̪VJ 5G^*;vkY ::m8@4l?apbP"NKH C#+FI$0qHO�:,: aN5J"-*( !GT�CAZN̞)T}U9?sX!UW^Ų˨j8&ncUJQ`ͪ|DDضm>}tvw8 HэyҲ= e$s0ɘd_Oΐ0x" )6d+ D֦խ. =XcSX[r qW0cTFFF㘾c'm"]w|N\ zvEZe̙)Rq ccgpcp5eFLx�q M_: e-&x`}!E|Seg15ujS ţI|C!�8^ 7 Ui�G6sC2F$Is|];5kvolÈYf0du|5uftC@??&"``dLHV'M fZ"3@I11F4 .U,#>MiM߄]\įʇСCc6\9TyG_Vk>*Za2p饗qǝwB! F8p�)9ĔYm8(ҫW3DPon(m2֑I|l./iHg 0Mj! 6j7&n{9r$I˧T*j"B  I z4 >С<ts/`xxJ8ƿV8֬Yw#Nӆq8<üf-7"OQJԐg_jǂlɂt-qp( hpRM%Uޫ8p@/c CCCL2Ð 0 S(h4tvvRVQU(hal`Vk,^$1fBlºuqL~rg. @ z[x;C%j.1% S[u!&"-x yb1]__h�4P 1`UxJ$/ݟ�lX,FJ�A088HTbdd FEAs!IPT{OXdٲe:t+W9a(7ώpY_y3.lyHCG E)Ѹ ZMKEHpR $Iꐖ#x,*֬418 hұA^OHBL@ }b#MrF#ͯTU:::& CT* am:ܪBLu:;Sg`L>cLMkozzG7 ֔Y6vC7n6 ! bb Lw`84C~ m*dv؉㛏2{F@ATP85(F\%BTlM?׫M#R?~xaH^oj P(qџFr[Vk%"ePTYyfx`-3g/h/Aj\u"g!¡;i#5 ZQDvm yif5S9ݞ䨏dɲ/P2AA,ޥ`2bP'1䴵}ͥ m322B^gԩM#&a6NZjBu"F (im\naeӦM)a s4a(cY4j|ҬC,SؘgĘ,&Aȳ2jĥZӺ V.8uG S= *HN+!6W4z3~> ;v`׮] 0k,/^ܹs7!$I1ղih-#x* ha===}p~9sĈ 45{ƧI$wY~C nF0k2ĉ¼4C|bQZK!xD N=QdQo)`r'=I`3Vcv=k׮|pp#GtR.]s:;;^}0 843R(DQDGG===<f-]([҆t`Zo QPħF#ulvl>fI5#Wc4j2BDkZHꋤyuW1HY^Oo*.0gyc:~i8@Xb>^CG9x }}}ib3y67riV=I138nVtvv#"Ԭm8Θ<%i>!H,0~,O"h5.N H!Ȃ+Dp&iv\Һ/EQXg Vz;|Fun^]x^^Dd4;`mC?奭E]w]s[kH^>bZ6}VU{HӴڴi=̛ ǙA|EJKG</ ˘c,Yk|cұyۭ Ǧ[R4D4t#TxYnʱccٺrJW7ittvSL[#Q9 y=7FSs&x~?QVypCưr;C~&% 5e�վfKemR!o>?>3mF#`Dk=>KH*JFѽzKGDzly?R'RAV xX*}T5"Q5C9$js5l{k>r̚s႕ʝDR3/ob$x,6  G̉V)n̴IBFʹL6ŨG%Ԭ{u&`Lj̙ )r006>B$QBHהsr0(bdd{rd(ER%\J=)ښ DI\H# Fjh^Ijqv"Bdž$-6<jʸl8jQtܨ ޘ+ԅy#Ӽwn4bȝu>1c,3'lI yܘfamF&!T! 6g |?AT6'k(D%ʥԳo<Ơi}VӠ|,!N(͠k &ACص7t{" bRb% D!ZecܜKƘXj~G¦YDs;yύW2<<ol3^;puY9a r1d`X`i*B F z7T;wwŋ T 0^cGI|e{vFs1j?Vc*+ 8 I~w0^i$p&0$/s,x| ͟Ç"###Xk9||NU^~Z?U)D6h$0¥+>K6H͘,K>Go'x?S&Ki@ YEcԫ֜2)/}s&**!8W#+QL4}eT "یB!$Iعs'3O>0H8p�90/1ͫ RkW3 7|i<VjfJid0˿|3D9�BP5N3xj Y"P& NM5DgRm6M"RKpbG(Ҵ?s1;4Tr'SR9MR&aCyرc V΍ �1*ATqal[-4lX(Dd8:gh` 3 n><xX<|e&GZnoHl6EѢ">IS$sr7țz<' Z3:$Ccs}< 5Ҟh!g ڜhkK"&CE^<CAIx  ��F C|R‰0T41&s!4%^!%J�ČS(�cleU*WUr*ori=ٔk<ߑ*:1yv= sQFjJö8�AF# 3g\׬P[7:q^w׈ %Tp%EY7 id> *NuRB]łw1SBH[iiA}} zgI40lv‘8U7 s<Y0 yꩧ=1s^o/ "!O#1pwtFtꬺt:_-h04 *up\E:w‡4sqj;RgKb$#Om"Uшi wZ2uTN8AέpHrHyS207of߁ؠ#M[YXkw't \M[ IoJoN|H %J1�|18+l˞޽azô+^(Xvbصk<4�1XlZ~_ᜣZ6T$Ͱn\܄jAZL+n:N0tti'f^pw/Knr` jYQJ($B!50>:UDm :Ơ1ujx2J�� UIDATؾm/f({z m̓yeOGJ"FȓOBq .wz'X°@xg8z(SL!fsL{ZBtCVa7nORAoqr-7Szv JN.TD#AzwYU .fi) ө"8UirGX j0b|J T #AE!)h J:D0j44WYn+^z /Zxz& $*?=3gΤX,4#VF r֟_5CC̷f^Vˆ ػ�UCՙ ȟ#}n I xI B6MԂ2 >LU?@Phc>A S=Kpw I"XPoQg1Zk'tEGbԧ7{ "Bg7l{h48lnx}S3Ѫ-$5HGG<補81P(yuF?<׿ :>{o^NX!lu ƧA~rN`$>T֬~G~,;sFDH A39_ofo7KHDb9kw\v** JfS>_gVFQDOO7oh/`¨bL{w>t x* W>OC/p`_DcbxNv_RS$!b΀z|3\vł4z& 1st҉eK{^=7Ɵ=o0&>Ss3 3( Mkɠh[PRPyٳg{'4\byk3A{lvw} {>KgvƜ;Ye0+J}M@fU嶄T<8:?yj{o`a*֘{cp.Bljru <w1%IZmZuw~&o$$yn$y_dϞ=xyu^YLb2=oMڀ{'vܕ&в FS'H~JoX'&-S� ']6aࠬ0my\}5;o^.z}ZuZu`Mcʔ)tvv6;7*f׮] 㽧^̳ٴBB9gi4>| ӦU:Fv#Xb.s]x}ӵl9?sz_ۄč0q\w.ioFr_%{6솗DDRڭx-I6=NčzFKbΙlbf͚MGqMs{O_q^~e7/| QTֆgq6[xɝnҨALKq#} &~'-b,t 0<\Vw 6Q0,6mdc%)QR¹'Y?1PdL lm@2mPG /4Gme9�m0ڀ堤IKF4om>mir8C]Ж<5Oc w3k6C�_.Z|9}k�,Yn.~ׄ O~\yOju>GAs]_szw}5˩㢨ć> {s^^lm@~Ft˧�C_aǸ}wGE/λr^X,\ ز'O2o uX}0,L9&Zo'ZTK~̎O34?WɎ;g\.�]Ϳ;Jkڤ ȡ:D"~[2zD Re>wwsCN9&[o=r%}nee7OdjLvlm@NCV\v3+.cG{9ػn?{�zG}=u7}|l1.6ss6< rUU^ {_Kd7M9&Zo=r`h�3f^8zdgk;)q\gKO0s|�6<Ӽ�yv1Θ{7VSAHpyXt�W鵓>wԙ,^z57r7l{f1zy/^ydjLvH>ϼ+0RMc+=�,XNV'}ė'׺nn-;Yy-\p%;: _ҕOܣIKsϝh^x^�`p`Ƭ ']DDǽgԌ--m9iCҖs7 H pL!i H`-miK[Җ-֎T����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/bigtemp.png���������������������������������������������������������������������������0000664�0000000�0000000�00000036167�11753427512�0015315�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������^���fg[���bKGD������ pHYs�� �� ~���tIME .g�� �IDATxy%U}SUަg_UA"*5h)I4*>I4ǨFCpB53 0[wOǩUN403?{ks f0`3 f0`龁VCskzoggt ~��Ez=99?n^7龁G!%Vg/;U/^3'.o}eoܴmf2=x1җ\proKL24 0dh. O-`w"<'˖ΟxxN " 67q^ LLb 3]x>`%o;!:Â@�|V("K_f2Ӏ YGws9I#eH[,鲋 iz. /VuA[l/\{aEYl{tg=ŊE6UQUUuN1FDDL %sn.nK ޣ9_ro|9##wn2pp@_ �f {:]vԁύhac  $ADQAQ#~F9?{ 8�ފwN`r|wwKk~uMmwn jDhe9Kdk]e @`zT1xUQUU!D`* Ɗ1c_޼eNOn֧gƘww/8~5f^ufɍ7?W{ߣOk@"$2<:3")dCX \x³Wu+ΙW`Aըx%RUP^ 1DUAU #bkŊ "*"^.]5EI? xp>Ί]gl6v-ݻW^wloCjD1V n#LیL~joQ/Y}в#|h1Fvty'>UkGLWl9˼wNw +*h6EFX@Q1FMz`KiWvI \CI'yƒzxܿ_ o^cuf ߶ uU;ml ٳKħ�ǝ|šU?G0!F֪IF=Y,s\Jpۆ01"97EDQDPD( DcEF�~㋀ j`rN-">d*mظF>zlz1Ng 1};[fz�nQw{ GԦ8l 6_|i/z)u$t# 6{os):5«Jгe%1bat'VĘ޼xUH"cFlwo.G{]s|>/y)fsWq~xb\2q#ikdpWN ˀ# =oEvlkgq.<%^z1JhڒK`G2\+H9sw=>'�9A(&֘ 3TZ! Qd$lNűDb!f||+W^<aÖ {Nw6oxƅ88o ^^s?Cm֭&> ˠƤ)FGP."O&F�)qxUó-meكF &Ƞޣek:^qΓe{⽖~]AU0"cH+ƀ"IbVEkD5QdLGQn}_Z6m[/ˮ$Hk>o}OX':P_aq9u E6m96KS�~dIS*_SEֽYbBLdN'q"`�XEƭ$ _-.88FNzU3 fOYb^WD=Gg>˂=8<wVDTBI28:+ }0ƍ54IGZı!뱉cKY֚EM8)R?o3޺~oEA_YSU~ N7o;x8U [l4ٱm;n=1% -[,c\k7֭mܴaæ{mi7gyTu;ppw'!4k'<wM9L g,?{19hمNI-@=9<6!dd^ɲЈ Ơu{:1Iy4W^,6:@'-qQYQŒ$$I$ 1&Zk$QDd̄ $ Rc 8~$Stb[x%T-T9w̹rIM jWügp]|ᡇRl n*a4hoƀsLdea|۶f\n[nf+۲e_n߰aɭV7oްΛ77דV3 7ܺuttlEjpBS[kMs9ێ~ցs}q顫WQd굄$&UxÒf iPCN _BJfuH:ˊ}yx"X+D)TxȰVHc1EP5Z7ZS}f(Wck̷rοDZ%O$&wUyо ^3fi;{OzCdt)ͱ1F7o&Gsk"Yƣα툃u}jHsse*mFGGhqj^z5nF؋0Eo ؜0y7#S. ;\xH`jv^>w7"8&./OU LJ%w\r{!MjF#`k#bɳU(c-6֪V;|g><ޣc Z#;7u5wpw?RK3ΫS4`l >p0zn2>j}}?Z9òj qlV3g0g}%K ʂٳe`FN%jmS$bj:sz$s^\uTy9uiFqT\YNoچfSh6ab&&<ccmFF&k1::M&&Zj5MSeOTT[6M&&ZLLhڴZ-f3œ>LA UQ eV+#M~=bZ-$I&,�;5bt%�,^<w5AH-ڣث*V < 9�6w7]> L5T[mgq\Wŭ]r%IA{b"*;4mbcX7nVsT20b6Qk#$j 9ю!\A߻GW]Tc={hRZ6ιqCE(2>Z>צ# R>ߴ:E*ލGU"K$"bHӌ, 㥢 !(^Yg=NX߽b]-?U}{ *><[8l�|@Mk2ls~?c֬!ݼ6>[ǎM0V%;!˸F你{A$"`lLG(>Jt:_(,HTXgfHӬCf4Mk%yoŹú<w--Bk`Az=!jq$!"#iZ|m1EXk}m~n࿞SL{S|88t|9^m~lOo5BDZ#}zh:tWmVle˰QsJ>Sm##X$ V�2:-L $6HYy0RaOa&ӔfU1S4]ZX<SlBIKP\:ydEQ#b:Nk+kAJABLFuK㟁CI{ Z9z*![F7^u除·$*M'&ھPXv…8ɝQGx u`!}{A}hu.;~H#WVVUUW;X|[Ъ kO])[e@%|i;Sa1@T{Q4U!˨H,Z[]׺ҳ+^|w�xa<n"H^L](?{g{q~jsuӓO>*~?2B 6!n^n/ǩj`;Y�5HGʨ!$.KSi] ;}ܝg3ұ#t"\FqLԨj(Sv+SUGTU5y E$c\Mk"p5կo]Dް[eb:xdmUs̓'C<�344ȧީOΞ=_2<4܍ceQ{LEK,v΁a3(rpjǓ*^.]PsUn j\v1{'IQ8/sRQ1Xk(Tթu$Ƙ1a)X[-~b5a:P6|Yn߾c 7~p m/)a O+&xX}q ǿnDKEX1c%"1Yҥ 1#k0b+G--*);/O Ecs|~ K_&{Xy./x:UCp DQ E_�C $5Dzߛsf3JqΫ12ij Usuz+xK]HpL9o*[9mI4gΝ9::8Qd%IS$FXVMZ�0vltwiR՟΢=d*[hX ]ѽRĨJ HzzI\+|n۴-Dqeem>U3ՠ>d(IΖ:_7R{?$[B)0~٩@g?i$^( c+z"}uWg^ qvY{g*XA5da,ȷiaO1H #"I@Ncl~"vSV)(ƀù244M<PQ~U׿&:B!݂F^1cGw"5mbVZ8뱜yq'kB-.%oTscX /RPWQ%1 T2c"8^hQ5:%| I!\1},KɲCO0E P�BWM>(V �OaWC(~<�|;c5@C}&ۨ[NhO)xg\BIQDZ1S\EdbZ[T#|H˗^$Nn-QfaX[x$I8E 9PEg1T3c8TSK2Ii Q@ c"1dsjV&uI M>~w$|w MEU0!U"/X|Κ-"]|A^gIbѴaȦcֺ{Z1]>H8 ?p PyvjD ?k&h.9tVeu)1JͽMkZeXQHpP} hWFؽwn]0#JQ S3k?/sS|ٻtFL0b?}_d\7w?a s߹ O+d.ʹJi}s߬iEDƠ΅bL^4م 鮛T/>V*'z|hy3uғ΁*sÊPW zQh.Y9W{UA*TB]r}PDكq^&1F$I,ҍjij\m%"ǑH1ƴ3⫮ڇk<M1A WW>G�mTx>h5Y;۩m7#;3 MCfo1:TVҽt Jpy/睗ʹz;בp6,j5բҦ( [6UE#-檐!1q\VVU(Jk)T}nWd8Zl+4{-2|rbmb$Z^Ho{2jsޅPkT y/h_O5~jx;?{^sdCbiϽ<[aNXk·tȸvJ;Smoާhր=YKS|sd"@Xic BKcx UP,~(U~R)+y5ARk58&b8u* q mKiUwp{!TeI(ByҶe %K.TfGSYSކ(=Z^#H5zT?|_|qsfoWE,"O?O=yd/>@~6viq$Z=7uU|>6ĥi&&Jy2nCHvP{e*)(<r&w kN$)|<]<}Aހc&K bTIR!uk !XX$=}ʧA1jG*aTQHE9k"kE.2E_o b18а_{n:-_Xbxp5:^C+"+}K:$bCrP-D5aL/1"1""u>kcº\iًܽU=N$E٘ rHn7DX5NVV$B7T|x'BUrTG+W=_ߐ\>Kj"g+ ;>dn+%@__E,҃f,?˼ŧx E'W}[ҍ@]$RcMe4bhlSElsW ŁHTʆamI'͘8'RYJ򔍻%\6nWn+I2 W.%IBj0e UGUI+\(bF%)+L EfsYs>KSbxTS'Nz/x:4-^𪗟ܐn6&"_|Ъu֏ל11gnDL`xbk0zu.W ]3Tm^A8) dvz%NkUx*2s_O{,lLNBzD DDU,@ -<=T &LއƇ %# JCO rb}Gm>2dh/3;~8Lf7oy.)#[4Tw^DZP]1"h1<PhUjՏu-5Y#,==442QjT^2Jp7qSTRI P2.Rz*)Vrcǵ+>R5*P 7K9bgJ>mqv;^zi?5K/g߽ygNḟ��IDAT~OȤT:cQ;{0 G>mY9CjJ٤Kc7=evޞ:z-o+V>wKHQxʆݪ~.+ϓG纀FJrBEvoBb<oD!I&FFUt K%<QG93Iq"򦄽F{?󷵏<[4/o'On f8f]D<ĨMeM?!t+<MZjR7K@]w(T +R4*Q#1+PaTT;{Vc&5 bq+ ѩXP7ˈzLYHG)a@S"ȳ˗gY7쮟{'|7~uYN?_3ӦfM8E%s~pc)m1;v0NV, ƳY2˵I~SG8OMPJըbeE*Ru,Kj5I>bM(~ ^yo4I4['JZ-nIj[9:e9̙SFFVf| }/.U~侕.y,|9 k(}((<]vo]>>"/84T̓G*&u: LǨ?~ u"o/S2R>n&IsU텊{�Z8 cڕDQx{"ޛJS<eu7&v^t՗콟|xcW|ll"{ࡍ'\ri]zك60PM\ĥ:|P5�\J,5I-8M-M6"=(pCu/ "�W#JgM[ zb-IZ-ԾMHuDEF4,viH1)d/E $I FtF!. EnJzY)A~vPx"9~!k&/$q]K7~V.5jcxpÒ/6YciZ>x w^5TAIu@6m1۷m5+&TUlȥRuޅ:Z "gt ?~B5юR!̚ p1dīJʝT=`!7Tn4& ﲌ0Uәw \9fͬA}\>x{[pPZE ,Y<7=4zPQȰ -?Hˬqܷk.—{xx4oXA)EUN))NuJVv>RMw';G JH"R#ƄBk[7^`2ٮѻJp{$qdž$1 QyBd^1֊FVT^sO$SÞ&�]'ڥo|ӗO~vllbW,:}k�a{ΩG܋#y(ob<EW?zߺ]Vpu/{~*JrIg0|UTi V}�#f*X*/ǘ/XPUwrSKJ"U)"C];ol2A)WA-jzR"+jkrVDߵw0>ogB)cOe+z6n<2)A�VD>ox+w&ᜒw+Z=8{>pU}v,Z4ϻJ3JpQT�H> l-x!b`l57B_ۻSB4µz ҹ_ zz!W]OB5Mv+b>z=^ 07h>Kn!ƈ Fuuɧ=I>Kpov̷_sWqk?:{cW|U#WULh/8+vk۸ռMЀ{3௃:*FXcʹ5T:ҤUHG {nUFI>W=Nth~;{w� D bH[^Bq@_,"ASB&#]nӞrO5xqڪ~ϝ=iˇ}}uϫQgDQPfs֠g f뷘Ysmk7rgtǧUl"bcŚXmHJ*_F CZU[JiR&c5}ee s>sqiZnZԓs HᙳǑ|p !E1}a{)bOOSw£4/_G7”b׽/dNy� 7 "'"ܛp^+>W{<�"G}yƳs)>WƐ.E\uӰ2r;j#]yvS$ה7j%)+$%O7I&'d =UgJ_-RC|j6km13])U:"6u,;[nv;O(Q":W ";.ZwYnj ԗv45?lʫy,z+1d4ۏ̼jmw<)S lnwm?2 -Î"]֝T ")V˜}4UT\iC'(bݍXU5'F|8Jq=0jWd)뵚̕B cRD5b5QdvDDyW1Fruˈj#}ùYR1 2W#D< "# <Sg>`!sҡts>ǫxxS p\zf4ĨE =;lǶnv?9 '>smaSn쫹guЬ~ 3#&&"O&9(sZ.KG_r|m@aKGC*sI 3)WAN7qcA#;oZץk(2#sGǨ&JȦM[5Uo)ftq+pI$M< g7AbB  2\᫗-'.{P#~k7ew<ut YO6atV+ݵdɼMn@:w,?6p}xܡF@QJjq#F1Zc1hAP ,%YJ-쓛?w>1ܵ2c-!Z!NAN)&/aګV1ɶհi/DVzu<YEH ȯVOoB`T?{ x9֮8q`�SJFGYUn?IKk}ijXC=&qȆ:Mg .y'~*Ôw `?�ȶ(2%I<1<<?|g=y>d򅵾zkxx`>[78ط^ONZhDjT tUM廭|Bh :KOcԦ)0ѺQ.ңV<>JRGsmgb�]3|ۣkn:s'~ xY\9$rZѠ68&gZ-cc.)2 A$z3L;\.wK?ƀ;T[pz09tWϨ~L ,0l8#>sg]jC+V,\3<<4<{%I$P5F:VH Hn$޽ j$o A)z4s\?2K `mX_?x?OL^Dd(\B̍9' . KS;v(d2|9".˿TnLG׫ %TCub҇y)!'K^B HEhwp>!5l/Y2qyz.oŊkjCV 5P RAKѳ~GHv#ҡRby$ bI)F!=IB+"TզJNp-—źm~)I. " @ËSWXkDK68H2kV(�OV"윣=1zQvv0k)| S_}F[9Vl0܃( aƬ2&tD#W yiG}o?gv˖Fq{A)T5H dQ-J1y_UIZW)<u| 8*MD$L(*bTTVU PU֮>/oWp}ҢW:=I "p"b!c2kc9xsއluHRTK[-;YFw<Wq<K88\e͈e�塢|\Q KɄPvU6;�ʧ !d$I"H{O=O<4Y4o3N987w9sgmՓ1PA!/BfyTU.b@Ek):7#1`"f(*#VIpp7_ _>4Q1 k ,:\$ IBm,Q"896F;7,g˲`dɲ lbm*r'<O>fYxdYˀL^kNSaE@qyY|r@~ݮ=0 JaT%IGyN!H3,!pud%s~p/F_]%JԱʪ%,Z `ݣٺmu1Y&`kXo 44mիWH1x`Cm'\]U߲;cc7uL;6-&/!FQ?} s,YBh0y3&Y٩'&Y۪b7w3'QTHTz憰7QɣwBH#IG�Xl@U m_)zkdOs' >x q뭿v; `:^ [p=翖0%mC[﫽Ӂ{ /'C})1HNmxi Pox7mbbt(>W Gl"Uy('}| E7'j18LVWE >ҼRn!);Z!{`< 4z# ًD�t4SlFTc& *B٤=>G4E,VBւ7|B<\0CDj(`EyNC)IEDA\}"" ~5-O:'_FVµu( kkq㎤hA:>ޑ >%0y-a{2؈AD롃0qq.xъq/q=xPdpA=⚜ä bkaf8p.{Ψ5cB#"d6iU0d \gM>fNx79w|pPĔq@iX$R[䞯A`H4?a/3xr0pg"6�Aǎ"Zʍt|<X}e{v~<[e&6s㸌J1gD{vU%yM@"Cp i1g. zCw"Ϊ!Z-q|^ߥW<\d% ,;?βh)CB RbtsUEDa35<7x:nHg4S\ʚM\ىGNd!vl?˞?am$ ^炴x¿Env% @a)EpV;H=gK`C^ = I1ƽsV+̽冐@6FoFsldL0hY[zphH!7hm8@dA8\࿉[<a�gmKrN/4~Ǫ#>W={aή& eTr d㤣jaê<mC6�ש=ƽx3x<Aa Y"@'8yi#&UnG4'zlmO[j )b$!Ոuz^lq!QQrpch.ϜLj<!AE"!UxY?)!}7YBIY7n_y"$3zZ?IA֍F06yJ@ύ,<}fgBsDǪ߿eeumǝW~8_լz馽srV 5h^hG1&xAvv7I^~rcBgڱKjw+kҔ"m6;W9q:neCVW1g�S$HdOՍkC�Dj47oh.EԹ@vnx1Z jfEdP{0 ?mT�<Q17{fc>"}K=Ơv|||I`LǏcZ-\^Mq34aJhX@Gq|WuSc0pbrs09lbZ-BZ-hvEG4FM ?Ɠ.=z*H뿄?[:OE"$#H>[En[=Wp05m2Ao>MM "hG QUXsar`vn[UԘ0xZsat^ S-/ܻU_ `EE:.<3d&\ 9vM57{?#? cԽ(33y\?-XJH=ɀ3Ef0g �.6{f0g^NHQif0M@ &Z f0`3hx����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/crl.png�������������������������������������������������������������������������������0000664�0000000�0000000�00000002616�11753427512�0014436�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���bKGD������ pHYs�� �� ~���tIME 3��IDATx[lTU@9νsL1R "`"`Bbb5_C D?DEb i"1<J%�&UT@NgN=gA0| 1윽>157U-޷m{uR}lN�$-+Y߶|3̛SWSqB9@ CA7|6.Z0'7#ct �o8Uظe݇^ -[(/}=p(ibĉ  U12ggy3/_#s~|jrʔdrP �(US"55Ym!+1X_ܷ߱yP ��Bd"_os;vyׂ��VkiN8R)2ȲR @B�@ L1 t\]{-s70S% dWM ŝ=t(4ұeKXDr{SYU(I VX)zYY߮0.79p�(c' (XVajk[ �۹f��*ˊ+K=N{/s�ì4CIzYqڴ>44�\UDd D͞/9}FypyӫE4ZYYI?x{j`&_nO1dDŊtj+*F"c2 _*yD 44.W$" {Cf}J/ܲ>(e*zlCOomyrmp`olj$1~=,Q<n572&鴋Xl6Bp:bttxyy)4>VԐWU꣆23jf $xded[po ��-$H 1}%2nqs$DD1az,TLҥKR<>(Q*!"rj[bv\ht$`�&&$YHr Gu#wOlVuES.55\o1j8@$ T"KjLP)p.a0B.9po�BnEp03YfPwLfh$ԘdISqE!D8̦Y5mUT>ϘRrUUA�QGD�9Vs8A(E=Fٴ'_ZW ]n[j5La.IQYU鲐xJk{o<�=ڂ%<?����IENDB`������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/done.png������������������������������������������������������������������������������0000664�0000000�0000000�00000001367�11753427512�0014605�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��������� ���sRGB����bKGD������ pHYs�� �� ����tIME 4P@��wIDAT8˥MhU;ygL&m҅)nmTQj`PTPԅ 3 TVƂ Z!5 A(ZE Q[-ԖP`aL:j43uѱdٜ{Ͻs8F.CK>@ A"3w$;(=Y!rqWd{5Z|M40]t2=Wk뗭Z<x_p]gu_ {Z>N UKZ}U!snZM]]_!R{/^Wm3;< B&6٭8L q,V>bv4…[jDn5 6Pm 7w.\[`t+b+ezui bߘfaoX1oiji-.-^]n.oTrGB)֣Oa6켞lL Fc`GloM>6|eMr "S"Y|fȈ7xsǦ ~ ڭ^/9ΥkuVe' '_xW"L۠Uw"?y~'j1glpN_6w;FJ J:EyߗsfW` K*ߴHsL����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/halfkey.png���������������������������������������������������������������������������0000664�0000000�0000000�00000003747�11753427512�0015307�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������F���sRGB����bKGD������ pHYs�� �� B(x���tIME  +_K��gIDATHǽklT{z]186�^h\Ő(rEA%1bȋZUP[%HiH C FIAIxc{eNĶL^#͙qy9YBY^^nYSQQQPPPdڞ={Çe/ KJJ~v+^MӐR&t]oH$^1cF (�+w}MӜ+Є躎(�0 }ƶVqk?f.c͛-RK@PSSs{]]/|2sM7zq\�r9,0ę3O-Zk:Tin>]wݽ̲,�jt$FCCï=ϸL&x饗=zL&,--. MBП?q5o9c.}7t:bmMvu|ӧOGBu}ݻ2e<)%mn…+4ڧjjjfx7ވWw'6`<ȍ@ h[¤ie˖Cay;w_/tZZZ.mڴɮR{类[4ip]˲^<qDjppPΜ9s9sf=&L—a>$`<gIeqť%ˊkLӳq'P(Xl/^\T^^޶diăbJKKa\t^^C۶mk:~xʕ+D+D&Z RBFb,b�.:9嬭_ L,4M !R*)�rO,]Xkk+:`|pYYT!a:em{1R Bb|9`l(W~C 'BLQۋqǘhL&eΤB2()t)TO[fz4ChJFu | PuhC(C W &>8vE3+0P)GFdԹx.4M=)0�PJRbY�`D"YVu%=P gw}tR(@ Hӄ$`FBL&kmmu颢"W6EJ9Fa}ڴiy+l*5Ry r,rfmSUU跆%N'Oܳu֤Xxܹs'LpeYH)1 Bn7@U}7m”k8{Y`�!±d˧lLiknn~vÆ O jETi~?D~a6]'yifO=Ň?y oo_}'"ٳT;C0{ud2;rȎuظmӼ^/\nFRNFQO.(r \R ݫjy}`꺮JJ!‘R===ڵ;�Bw_Yf e]CJ)N<Ʌ瘮it>8l|Pe]y8?n%ڛzfUuc]Lz(pzqʕ+h4 !>H)x["zx$h'tAߏo*.WFw$\p픮F2ǤiJH$tuuSN]kjjKKK#gϾ_N,^wY WSy~ ol <VBPRR2iܹpxfkhߵm;nWIu!.^pپākYV˘G4=kH^ .X )k j _`%ѕF����IENDB`�������������������������xca_0.9.3/img/imgres.rcc����������������������������������������������������������������������������0000664�0000000�0000000�00000001327�11753427512�0015125�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>bigcert.png</file> <file>bigcrl.png</file> <file>bigcsr.png</file> <file>bigkey.png</file> <file>bigtemp.png</file> <file>bigscard.png</file> <file>crl.png</file> <file>halfkey.png</file> <file>invalidcertkey.png</file> <file>invalidcert.png</file> <file>key.png</file> <file>key.xpm</file> <file>scard.png</file> <file>netscape.png</file> <file>reqkey.png</file> <file>req.png</file> <file>revoked.png</file> <file>spki.png</file> <file>template.png</file> <file>validcertkey.png</file> <file>validcert.png</file> <file>done.png</file> <file>warn.png</file> </qresource> </RCC> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/invalidcert.png�����������������������������������������������������������������������0000664�0000000�0000000�00000003466�11753427512�0016166�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���sRGB����bKGD������ pHYs�� �� ~���tIME "yl9��IDATHVkPT~sΞe܊$ LѠD%5TfI' :LjSM;k):xi#Nv2& Q0U#%., r=|_81&?|}y�$''q[ZZ�@=_]f%Yb1655־s�%vkjk~Woo+)Y٫�0|! )R๏{SSlZ7nd7g~8;{Pii颻iw<UJ rPy}3geE?4T~d1(&'7lh\ -L3EH'O"0�'Hس~7/{r}fNoZ>S,Wt)4|q<w_**A<5/7)MqYn�8��M|X0M~4TS f00DTd ȦG޸GCs\FHE8e+?pyv.R}Lʄ!>= i@[=vv'ʆO?GjUua\gQq[QI>U身WΡۜrg[TG[ #$,)VA4z�& 0WV"9݋0lVY¨@dL?x^).;@9zx<T WZ&\.0BE�b)KK!o>طop)(Qp� U`ق7^O ѲXJiɲ^o$(x7>{ly gmcD -009(�kz Tmlqж_NNUg7F83+VeE#< /%85?z$]smFxj"%)>ZhΏKWga �C`zs �' 1[qC2c.LZfQZ DEQ 5$i^v[$ʄ$Չ |Šu*+rTr!+2 "� \;VBrfh ?h "1FRG|p@@ r){ܓE)Tj9sK{a4T 3wEk4~Ÿ믁q+L">�ѹrc !*9Prp>078xdɒ'dN$#MV3 O 4_za:ŘuAb`nv=!foibQd=aϔlD_A/0{ݰ"O<f+fJeEa [$*��(DB"'ɳBSf}{Us e HJ/RMz(]:>STJՔnsшϞ} �xՠ;q=jZ2ӎM@@VKL\ ƨѺ_ ) #.E_kc~1X>o^ێ]p>Y,07vr]s}*@#M @H'c[ʩAXK{C0@,z<\_Wsg|;$|BfHorlފL{ue}}Nv}ZXX ;=@a  Ԏ) �g w} 1k[����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/invalidcertkey.png��������������������������������������������������������������������0000664�0000000�0000000�00000003750�11753427512�0016673�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���sRGB����bKGD������ pHYs�� �� ~���tIME #/8D��hIDATH͖kPT9.BU xx1QLlcLKaDcSm1&1SicLjH&mJ+fp$bx3VD Q.sKꘊNwy<?ɉ;|ǎsNNN�wlQdEf1߯}/�%=Z^xkRnE޼eO|,�Q�D�z�ܝ]+X]qVw5yyL~>w/䩓clHZVS[(`<ϙ9Λ ϽӉۋ+Cr=ؑwُleC^?B.^~3˦& )m-ޢciDhK�}ZD7gG+S); Ͼq i_]7a �:-`YAԞQ[β0'b@ѐy+|PkOPS)lzugφSf[n-/Z7n @[,Pnа J#+R[$B�G@{(*/gիې"RZ~"<&�l"yD#8mތ:VD�) a�|Cs<;kKr>MUJC0+'0B`Ƃ�\>p�B(óe lYy�j �MTT"f (օfpP mvb0ŋOߴiy,{�roz'[ g5@OP;íիr@B�@ˎH] -c`�xk,0LmH}cKVtu&g7a̧Ȋ O?8<VV~b@t1jzfbuk fy,(�) dp3(�$ ҳ8  Z!LyٽF%SIx>:ڨqU*rjL mm#mq)?.肕߶>(HisB(RS ^Knn$ɠTeT 1U\7wu0xSRx}¹?pآ\Yth~1s@ O<;JfG ԉ1{V"+J?H\[[ʍLBx},jpӭ%/|J"#MAIrfN̴}}>Rqm Ѻ70( "{{`WfpGZ0@x8Wr{+}LNG+Vw!P*Qr4=e˞.4+ؙMy|ZZ1wXE鄡9 f?hFsɄ I'@ N{ +$SREyՄaN#apb6p۷Q]]]{E-tfGi Am pJ6]KD= @jT̫Vjjq311MBaꨫjw:׮y'N6v @լ(2k35#F&I*csZm7l|]A7 � Oˠ;[߽Qu*tD{2L&3E^ rʻ� B|N`9ƶݯN NpHII!7n`}XriIyIJj8vv ӄpNo <%?Op,؀NAx'.eeD0/_5:55h((*RfqwN@_32=zQY0د<HH_h����IENDB`������������������������xca_0.9.3/img/key.ico�������������������������������������������������������������������������������0000664�0000000�0000000�00000041076�11753427512�0014437�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000����������������������������������������������������������������������������������������������������������������������������������������������������������������������������@@��� �(B�����(���@������� ������������������������������������������������������������������������������������������������������������������������������������������������� ��� ��������������������������� ��������������������������������������������������������������������������� ���(���0���6���:���;���:���7���2���+���#��������� ���������������������������������������������������������������������)���8���E���P���W^$$$x???FFF,,, `���R���I���=���/���!������ ����������������������������������������������������� ������*���=���N_PPPۨZZZg���D���1���������������������������������������������������������������!���7���Mbpppĺzzz(((r���@���*������ ����������������������������������������������������'���@���Xdddqqq S���0������ ��������������������������������������������������)���D���^+++n���4������ ����������������������������������������������&���DlEEE���2�������������������������������������������� ���!���?���]777~���-�������������������������������������������������7���W###\���$��� ���������������������������������������)���Luuuwww���8����������������������������������������������<aIII���(����������������������������������������)���N}}};�������������������������������������������7_MMM���#��� ������������������������������������D___mmm���.��������������������������������� ���(���OC���������������������������������������/���WFFF���������������������������������������5���\\\\��������������������������������������8QQQkkk���!��� ��������������������������������:|Flll��� �����������������������������������9j��� ������������fff��������������������������������������6����������������� ���#ZZZ���!��� ��������������������������������1G������ ���������������) PCCC|���.���������������������������������� ���*MMM���.������ ��� ���������:���[���F���)��������������������������������� ���!www���H���0���"������&���8���R>>>ppp���E���(�����������������������������������rttteeeW���G���D���J���Y///rrr���E���)����������������������������������.iiiiiiYYYAAANNNmmm锔ttt���E���)��������������������������������� ���```bbbeeesssttt���E���)������������������������������������ƚvvv���E���)�������������������������������� !xxx���E���)�����������������������������������͜yyy���E���)�������������������������������{{{���E���)�������������������������������N|||���E���)������������������������������� y���E���)����������������������������������ޗ~~~���F���)�������������������������������e{���F���)�������������������������������-x���F���)��������������������������������@@@wv���F���)�������������������������������� Uդ݆ikjs���F���)����������������������������������������Syrkd> ���2p���F���*������������������������������������������������������������������-L|n���F���*���������������������������������������������ڞ*��� ���#l���F���*��������������������������������������������������������???Vk���F���*��������������������������������������������������WWWMi���F���*����������������������������������������������vvv<f���F���)��������������������������������������������� f���D���%�������������������������������������������wݵb���;���������������������������������������������������O���)�������������������������������������������{{{���5��������������������������������������������dy}ۚ=��������������������������������������������������������heeej�������������������������������������������������wpppt������������������������������������������������� ���'pppt������������������������������������������������� ��� pppr�����������������������������������������������������nnnq�������������������������������������������������� ܧmmmp���������������������������������������������������lllqqql����������������������������������������������������vvve�����������������������������������������������������```M`{dddB��� ������������������������������������������������������� ppp)�����������������������������������������������������������Z������������������������������������������������������������������\a����������������������������������������������������������������������~~~yyyXXX ������������������?������������?���������������������������8������������|�����������?��������������������������������������?��������������������?������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/key.png�������������������������������������������������������������������������������0000664�0000000�0000000�00000002767�11753427512�0014455�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������F���sRGB����bKGD������ pHYs�� �� B(x���tIME ;6@ ��wIDATHŖhSWǿ5i4Y+? +n?2FHA7JDAG_!NJ`dXJ׈St[3F;VcڤZ4qIp<='XZVV&۷/p8t^de۶m$I*1PJA܅ H�({ݺ{,B! @p�(B  �okkkn-,,`bb b��t]i$iRn8onn~BשׁzmϞ=KUUu/\.WcMMMEss3I+)"DQj=W\\ ߟ6 MVAJ> ~`0xԨ0 spA)fC2t}cÿv@<}tɭ[jon?|ZRЦȮ]VTi niiy1FEQDaaᘦi %$~jRu7}UQ#w#NsSSS9�yΝ{iz?v=<{Νo666zFvagN T7nX.bQV~? Uvtt|R]]]+r1�0MMTl�c,@mRPBA(%C7&MӴȲeQB(RJ�iSUA�؜NgÕ+W&%I 0 R2iRl1�"HpaXA(%OT^?qvCy�0YsEQTUEK84J1 .pɊWf���Y]׹(��9t]_i<(Cס2u2 ڳ^\\�F,}z-KKKV(giK6CUg\NUUន'O �H$reMӖJn_CׂtWG9>33dO*ʙTUUջ\.bc,W4M�@"n_֫AWy= ~ut||<}srr꺻劢@ Z/5M3744EQ4c\N)5cfj7R>'pJIᄐtΤ.<xr 8;55[yթx<|ԩ$I:e˖h*5`RLLLN8իW�Ԕ7,�Ikqrr2F̈́Wnn.$IZ^_7nL/^}�)Gx oP^jkkk/// �|||<>22׿BC�s`%�l_]]]Maa&Ţ,--ţp8K83 cLԙ{T_j}A=����IENDB`���������xca_0.9.3/img/key.xpm�������������������������������������������������������������������������������0000664�0000000�0000000�00000027423�11753427512�0014471�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* XPM */ static char * key_xpm[] = { "64 64 222 2", " c None", ". c #F5F5F5", "+ c #F7F7F7", "@ c #FBFBFB", "# c #CBCBCB", "$ c #ECECEC", "% c #DADBDA", "& c #D5D6D5", "* c #F0F0F0", "= c #FAFAFA", "- c #C8C8C8", "; c #EBEBEB", "> c #F9F9F9", ", c #FDFDFD", "' c #D1D2D1", ") c #F6F6F6", "! c #FAFBFA", "~ c #C7C7C7", "{ c #E9E9E9", "] c #F4F4F4", "^ c #F8F8F8", "/ c #FCFCFC", "( c #E2E2E2", "_ c #BBBBBB", ": c #F1F1F1", "< c #F9FAF9", "[ c #F7F8F7", "} c #C5C5C5", "| c #E1E1E1", "1 c #DADADA", "2 c #DDDDDD", "3 c #D0D0D0", "4 c #CFCFCF", "5 c #F2F2F2", "6 c #F5F6F5", "7 c #C4C4C4", "8 c #F3F3F3", "9 c #DFDFDF", "0 c #DBDBDB", "a c #CCCCCC", "b c #CACACA", "c c #C2C3C2", "d c #DEDEDE", "e c #DCDCDC", "f c #C9C9C9", "g c #C1C1C1", "h c #E8E8E8", "i c #DCDDDC", "j c #D9D9D9", "k c #C0C0C0", "l c #E7E7E7", "m c #CDCDCD", "n c #EFEFEF", "o c #BFBFBF", "p c #E6E6E6", "q c #D8D8D8", "r c #EEEEEE", "s c #BEBEBE", "t c #E5E5E5", "u c #E0E0E0", "v c #E4E4E4", "w c #EAEAEA", "x c #EDEDED", "y c #D7D7D7", "z c #ECEDEC", "A c #BABABA", "B c #E3E3E3", "C c #D5D5D5", "D c #D6D6D6", "E c #AAAAAA", "F c #E4E5E4", "G c #C5C6C5", "H c #C8C9C8", "I c #E8E9E8", "J c #B9B9B9", "K c #EBECEB", "L c #EDEEED", "M c #D4D4D4", "N c #7B7B7B", "O c #D2D2D2", "P c #C2C2C2", "Q c #E6E7E6", "R c #E5E6E5", "S c #B8B9B8", "T c #EAEBEA", "U c #D2D3D2", "V c #8A8A8A", "W c #CCCDCC", "X c #D3D3D3", "Y c #E3E4E3", "Z c #B6B6B6", "` c #888888", " . c #DFE0DF", ".. c #BCBCBC", "+. c #C3C3C3", "@. c #F0F1F0", "#. c #E2E3E2", "$. c #E1E2E1", "%. c #B5B6B5", "&. c #D1D1D1", "*. c #D4D5D4", "=. c #C0C1C0", "-. c #E0E1E0", ";. c #B3B4B3", ">. c #868686", ",. c #C6C7C6", "'. c #DEDFDE", "). c #B3B3B3", "!. c #CECECE", "~. c #858585", "{. c #DDDEDD", "]. c #B2B3B2", "^. c #848484", "/. c #9B9B9B", "(. c #B0B1B0", "_. c #CACBCA", ":. c #838383", "<. c #D7D8D7", "[. c #AFB0AF", "}. c #C9CAC9", "|. c #ACAEAB", "1. c #9C9C9B", "2. c #9B9C9B", "3. c #BFC0BF", "4. c #ADAEAD", "5. c #828282", "6. c #878886", "7. c #6A6B69", "8. c #A0A09F", "9. c #D6D7D6", "0. c #AEAEAE", "a. c #8F908F", "b. c #DBDCDB", "c. c #C7C8C7", "d. c #BEBFBE", "e. c #ACACAC", "f. c #C6C6C6", "g. c #ABABAA", "h. c #888987", "i. c #9FA09E", "j. c #9C9C9C", "k. c #818181", "l. c #929391", "m. c #838382", "n. c #C4C5C4", "o. c #808080", "p. c #CACAC9", "q. c #B2B3B1", "r. c #CDCECD", "s. c #7E7E7E", "t. c #040404", "u. c #989897", "v. c #9B9C9A", "w. c #A9AAA9", "x. c #7F7F7F", "y. c #020202", "z. c #C2C2C1", "A. c #ABABAB", "B. c #7C7C7C", "C. c #797979", "D. c #787878", "E. c #B0B0B0", "F. c #8E8E8E", "G. c #979797", "H. c #BDBDBD", "I. c #767676", "J. c #606060", "K. c #626262", "L. c #656565", "M. c #737373", "N. c #747474", "O. c #959595", "P. c #696969", "Q. c #595959", "R. c #414141", "S. c #4E4E4E", "T. c #6D6D6D", "U. c #949494", "V. c #2F2F2F", "W. c #9A9A9A", "X. c #B7B7B7", "Y. c #727272", "Z. c #AFAFAF", "`. c #777777", " + c #3E3E3E", ".+ c #707070", "++ c #B4B4B4", "@+ c #4D4D4D", "#+ c #101010", "$+ c #939393", "%+ c #B8B8B8", "&+ c #5A5A5A", "*+ c #8D8D8D", "=+ c #666666", "-+ c #6C6C6C", ";+ c #515151", ">+ c #6B6B6B", ",+ c #5C5C5C", "'+ c #999999", ")+ c #464646", "!+ c #A8A8A8", "~+ c #5F5F5F", "{+ c #B5B5B5", "]+ c #7D7D7D", "^+ c #909090", "/+ c #494949", "(+ c #757575", "_+ c #9D9D9D", ":+ c #B1B1B1", "<+ c #A1A1A1", "[+ c #454545", "}+ c #8F8F8F", "|+ c #A6A6A6", "1+ c #A4A4A4", "2+ c #646464", "3+ c #A9A9A9", "4+ c #A3A3A3", "5+ c #717171", "6+ c #7A7A7A", "7+ c #505050", "8+ c #3F3F3F", "9+ c #2C2C2C", " ", " . + @ # $ . . ", " % & * . = @ - ; . > , , ", " ' ) ! > > ~ { ] ^ / , ( _ ", " : < [ [ } { ] ) = @ | 1 2 ", " $ 3 4 5 > ) 6 7 { 8 ) > = 9 0 ) 2 ", " $ a b ] > ] . c { 5 ] [ ^ 2 1 . ) d ", " e # f ] + 5 8 g h : 8 6 [ i j . . . d ", " 4 b 8 ) 5 : k l * 5 ] ) 0 j ] ] . . 9 ", " m 5 . * n o p * 5 8 . 1 q 8 ] ] . ) 9 ", " 1 8 r r s t n * : 8 j q 8 8 ] ] . . u ", " $ $ $ _ v r n * 5 j q 5 5 8 8 ] . 8 u ", " $ { w _ v x r r * y y : 5 5 8 ] ] 5 ) m ", " 0 z h h A B $ z x n C D : : 5 5 8 ] 5 ] : E ", " F G H 5 r I l J B $ K K L M D * : : : 8 8 : ] . # N ", " O P 5 n Q R S ( ; T w $ U D n * * : 5 5 : . ] m V ", " 2 W X 5 r F Y Z u w w { T ' C n n * * : 5 : ] . m ` ", " ...+.@.L #.$.%.9 { h l { &.*.r n n * : 5 : 8 ] m ` ", " =.=.: z -.u ;.9 h l p h 4 X x r r n * * * 5 8 m >. ", " ,.: K .'.).9 h Q F p !.X x x r n * * n 5 5 # ~. ", " n w {.i ].d l F B R W X $ x x r n n n : 5 # ^. ", " 1 /.h e % (.2 p Y #.Y _.O ; $ x r r * n * 5 a :. ", " a <.# t 0 j [.e t ( -.#.}.O ; ; $ x r r x * : a :. ", " |.1.2.3.r l 1 q 4.0 v | .-.H ' w ; ; x x r x n : # 5. ", " t w $ h t t t t p ( C 0 6.7.8.{ p <.9.0.0 v u d .,.&.{ w ; $ x r $ r * f :. ", " w ; | e y q q q q j j e u 2 q a.b.c.d.*.e.1 B 9 2 d f.&.{ { w ; $ x $ r * - 5. ", " $ ; 2 D D D y y y q q q q q j 1 1 j g.h.i.j.1 ( d b.2 } 3 h { { ; ; x ; x * f k. ", " n d M C C C 1 9 d l { | t v B 0 1 0 e 1 l.m.C | 9.1 b.n.3 l h { w ; $ ; x n - o. ", " d n q M M M 2 d w ( B ( { t | t v { | ( e 2 9 j e p.q.r.c 4 l l h { w ; ; x n ~ s.t. ", " $ M O X M t u ( d x u ( | p t u t l h ( { u 9 9 j u.v.w.4 p l l { w w $ x n } x.y. ", " x O O O 0 9 9 ; 2 | u { 9 B | l v ( { p l t $ ( u | z.A.q t p l h { w $ $ n } B.y. ", " $ M 3 &.C t 9 9 ( h 2 ( d w d | v t t ( { p h t n | | ( D 1 ( p h h { ; $ r } N y. ", " m 1 3 3 O M M X O y 0 l 2 | u t 2 t v p t B x t { l x | B u O 0 t h { w $ r +.C.y. ", " ( 4 4 4 4 X D q y C &.M v e | u l 9 v l v p t $ l { p { B v 1 M d h w $ n P D.y. ", " f.D !.!.4 D E.F.o.G.H.q &.M v e ( B v u p h v l l l B ; { B v p 4 q B $ n s I.y. ", " 4 m m m m 5.J.K.L.M.5.A.M &.D B d t B t ( l w p B 9 | t ; l t p D &.d r s N.y. ", " C a a 4 O.P.P.Q.R.S.T.U.P O X 9 v 9 t v p B w ( 9 u | ( p w p p B !.v _ N.y. ", " 4 # a P N.L. V.W.X X e ( v u h B p | d 9 u ( B w h p l h y X.Y.y. ", " W.b # # Z.`. +a X y t u v ( { u 2 9 u | ( t $ r l h { !..+y. ", " G.b b b ++@+ } M 2 v t | t u e d 9 u ( l ; w x h h { q #+ ", " W.f f b b X M d u v l 2 e 2 d u | B x ; $ x h { w | ", " $+- f f &.%+ s D C u | ( | 0 2 d 9 | v ; ; $ $ x h w ; w &+ ", " *+- - - - ( A | M y h | e 0 2 2 d u v ; h x $ x ; { w ; r =+ ", " ^.~ ~ ~ - a n l 1 v ; C C 9 d | 1 9 9 u 9 B h w $ { x r ; w ; $ l -+ ", " ;+b f.~ a - # 9 $ : ; 9 O X | 9 2 j d 2 9 9 t h h ; $ $ ; * w w $ x | >+ ", " a f.f.D M &.4 m 4 3 &.0 e 9 d j 2 d u 9 | l ; w { x $ r $ w $ x n !.,+ ", " b } f.b j C e j e y 9 ( d 1 q 0 d u 2 t v h w ; ; ; r r ; ; $ x : '+)+ ", " !+4 ~ - 3 1 q 2 0 9 1 B 1 y 0 d e 2 u p w p ; w $ $ x * ; $ x r p >. ", " ~+0 - f # q 1 j u 0 9 j y 0 d e 2 B v h h $ h $ x $ x ; ; x r 8 {+T. ", " M q f # X y e e u j D 0 e d 2 d p { p h w $ w x r w ; $ r * h V @+ ", " >.( C a m D j 2 e | y 2 d 0 u t t h { h ; ; x ; $ ; $ r n + !+]+ ", " 3 v O 4 3 D 1 d u 9 q 1 2 l t l l h ; w x $ w ; $ x r + ~ ^+/+ ", " (+( h y 3 O C q d u ( d v t l p { { w ; { { w ; x r + e O.`. ", " j.( w 2 X M D q 2 u t ( l p h h h { l h w ; x n > e '+` ", " {+9 { { j y q j 0 2 9 u ( B v t p h { ; $ 8 > - _+U. ", " :+0 ( 5 ; 2 1 e d 9 u ( B t p h { w : = n Z <+$+[+ ", " }+D D B ] . $ p v B B v h ; : + / 5 7 |+1+` ", " 2+H.3 !.C v : + @ / / = + r q Z A.3+4+5+ ", " .+A f f.+.P s s A {+).).E.Z.E 6+ ", " 7+5.!+.._ %+Z {+).4+5.&+ ", " 8+)+9+ ", " ", " ", " "}; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/netscape.png��������������������������������������������������������������������������0000664�0000000�0000000�00000046575�11753427512�0015474�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���k���k���p| ���bKGD������ pHYs�� �� ~���tIME  �� �IDATx\imU|kOs. 1"tAR  6Dk @%U.WOR.W`6 :adI(Btnw͚s~ȏ1UYow;7I,{z0`1�wDd{ ޻k0?}]=;O!"xA,"lqzϲ,Xkimq:f}_<wk-ttc;gwG"kNנs9}oYkq. sqq'|'`y晗}ɗ|ɛ9 7t-˂noR u;޹&Z{sE&YYaƟ{zaUZkxkuR<c>|m)%v)%|g-x/"Hm{5{kny:j8ccDžoo߹sW<mZgyGOFo' @w,t:b,L"XI7tn12z5JD:~]9C YMD5S*r)^A0mA咷믹PZ!1ނ31`kމ1byX izO4$ WWWca >z\tLZkRlN-} d1EZk,˂C=Bn{ʭR嬧JE/Z:s'*Hi8%=/tW^qƑv3VjzUJ+۹v7!tj/غ.25vZ9 u"/:Pʂ3VVYnۺ>{UjlpX,+>Ej)bѓ5Z/ʂBo3bbMvD˺Eƴ~wցCCiˢ`^̳bm&B*Hù5JR*yjt5\-"kuKcC袰 iZ]b:.NZp ^*<3M0>Y1-QN#)%GB @LICRt%OZ#؜39;Nwmpx?oPjyOB+eڵ9g7h'Dߥc! L'@* Cx 0&q33!j>hhه3XLqv2#31iR[Ϝgڱ3n:ڢns)Jj:]*RJخ76RV:C.Z@3�RH\^^:\Ѐk ]=/҈<̈L#b>|'4m Ԃ4E*F7IZll7x][G! k[Lyћ,E/@7SCN&{Bۉ˼אǺڜi%Fm.*Awu18<1Z)m JȺjmmvPi{ /n !EbRE�缞m`7z^k!aNBГ4R҉ X15S ˢ3h6ƐƁy1@^%gr)5b VpLXhҀAϧw9o0D@E1`DTa$V*ZZ]wz]+bWm^༂)/z&CJ)e+q M< g1@68{k-` g_ߥӐ [)$@ ?$}17xk4FNV >[qZ{ö*&27Z6hCdZfu9k 1"tzLLM:: )w($*CZ% ~W>*4:4}XøiՄ騟CcDhy! i,˳[pk +rbR֝6|[U\.9%t&ւǯqZXY0^jQc"5:SX+k1XrFeG_:;,Bm PnaZZyGq<NkCuqXk1+ :-@k":48L<1%4䨵2gE> RtCXj{](J Zוh684XV><L'Uzk(s^ O)],qOڍ[n,l@EwX4;TtZWfCV?^Qs B7wCx<H%4EaH"w-}K.r-,ݰe+ lE$Z簀`Qsz7h~Zѧ�qRJZ1Aknk%kmi=;ZlT uOо*@Rk"@4 k0,*@} Jp~QGV-{*4A:_ߖ`%"[~8zR�J6.RPsnG}kNj&Bx 0Mn -xzK׼MUf-~Cp7VKǹ:k4g nįYkjk"D\WHCڍ1Bכ%wֳF0FTZӓ6 5`8( uV 鍶-SPVl]*Ϛ+ŘN .Z�%SkVvEe .P;ZZnyQkefQCd8pT:~bЦۆ锦`,'(gHiD8״@oAjň0&SHgp`-2N6B?_6M@'%Kc 5#wAn+X!%Og<!X膚w<�eq<aQAW{Ct[Oi޼P f'uD3l)0r}ug^& ywxiZ[ t|孖 5=QZ#O]i~⛇a`wkx[v=[7zlI k"vY f$ ˵a)0\K:18**؍k>X#wb $d, trΌH++ki Ki3t<XqqAswD"!RD]Z-)8E'ciM;pgb <FW˓B)!`)3QK# jDWM.֘ihK&U z6qqqROȝ;|駴dFws4WjmFr^Qs2U:k )5:VhU�C;V,>ET*dʤb@ZQ,BڍhF#㑊Pwq! HCXyW9syyɲ,@74tU1iw&A>Elj8!&75gg~~'x[gg\[\yA`gqcĬ * ӃǬ x= cE/~<NjKBRJ_an Wa<WfwIk3-3<Okp=Om'$Ox[üXjwJ8oRzZIB3Lhe%uc5c2/| ov4TPWj %nKo<ß?gy3C:x<lš|ب1D3Fy֚D!Ɯ-o);_E_|ٗcJr\ydJYPf"VpׅI)1@ !F㏿BܪgU_܍ 1*ڥi}k\4 uc5bç|WrXYƪo&{>~>woB`ZUn%Ei+ԓ+~u]Pp%vK+*<Ϗ|, <]Ç=1n?z2b2g<; <siSOr%:Dng>2zh#xۂf% "si/\;yhnG=)ֱ;qwܽ}G?ż/\2IeM<SM g`'V qͯ't9pB0 >=gt+Ε{lqǝ[9 }>oay*Zk~4]uI~ռhݔ',Dž}Qr[Z/[1:*c9޿e&y:b!&߀҄V҅<N,'l J #?A=w][ww|,=9Wh(amDJ9?~9<r}кlv26JV)Y%Yo赑F_* Y<'ErK&K.[[W?zY\]<An~7_wc)+b$FdYa;ֱ5C`hXG`mgxt+ب wՅ2zA9;? DsQ:߮WS4n_xGqV譮2C.=Gy{sՉk`O;Y Q 5Vӝ~9}8~ Y1LğsO#)E_{oC`sYVjɮ w|Xg"8"unjeZx}&Y!kY8ǁdlc Go Zv 5t wwx{}No<i8Ss&_| >gg|rI>CMT2siYXZ%Kj,֍Z]WL!c}�{T~ܑKQq("HwL hJAUJoϵ\2KI@Tֱ֑nİty& aJg."S"n[Yz5T ~o c:@-zm|΋?oo#qRBx'x* Z-#i?RquxY؟ǁvʂx F,`)>홫МzY?wcM /Jxxp8yO+cuQO%Zoܪ֎10a[U:s-,%+* ;c }q/Ӎi;\ Zt`� ykx"¸RxGwu>hR2\uZ )RYN\&v;v=.xYJ!؝u6!#M.j̵uF8ry=!bcbiE<seZ2>&|ݺq!7G]6hS^ί^7n"; j13ըVL̰ٟyQaO+jr փx tx7c)3+W|k^΃ϬEwVp~N7`XR[yp=M4e!NiBO.ᳳ3p0R>cP 10{BH&JnXbVǀ ^ybգRҕ~'S"w)N4M8nJE݄ҍaqtJ}:X[YzYCBﹼ ٞ/{C<kunVoZfJ!q~WuHJ[0+#as0sffDẃ{qܻw+^,R|8rquRCYFV+ǂ1 jNB4U*Ȫ|3+,B_wVc}cB3 jXf'!k894!M| w]I^.h}||?[[9^]K8G^7,�E ƶ))ˍ]zE<ÜjVڍ(7Ux8jaF9QA[4ݎacUr2iVx#z6V �Qam)Dzm%EJ~Y8b1)qG_<x<hh0wFZ4<>b'~voN|n]}^_>Ǻȸ?#Rxpq?;~AZ_-dkrv80F~d ;l*U<!F9Z TU|`*p1)Fpi,.XaՑ8ajuK ;aC3"U<+qp5Ցs:bnsa Km AnګD)AYv,5g8'OǞ ?cQ) RGn^-MtW&;bS8ZW%VAha>5FmwÀq)ysy{fr,Z"Y1@ Q`.PM_-qmp5vg9慹Ɓza>FBJZ�l> U{/כRua$?{'޾K5^YcX!|ݏ⛿~vsB<w`,+rǁ[\xA3 q0Rj|k؍2o!Ԭ8?EL#8K cӢ؇BT KH^Be QEXg`hVk^>'`wnMe樥do! [^PXU€XVE?JeO_p] 6cZ؟eڔy^w[s~nSvZ~,sީizTjT4taS` CfA7X񢖅.BFwB ش*۽Ҝ>`S{K^ Au&hhw)!qjBs' jژHFi 7xDQVhC9~1&_Uyl{KƢܻ ?/ݯf4k|ns2~Vy%PM#:QB rjQr(Ж3cdcP1|gw</mZfd0 J.pH9#]X\!ƶuZwqEY~9q i^CGVLVФR:s5K-,e&$ <9WyzC{"\>!>7|+<Ob"Xк\a ipV3Z8Γ.Rkp!"+}B4Zb"IC D`:s^ȵ`U5gw)/aGlZMhUp.g1&ya9NHmUka;1!ToC(3wZ%XGrÛҀt0'~O9/HL4 `<d5M'>JXRVǁ۷ϱVn^Ivӓ=wj!Da;F`Z<cIm8 8< :u1M .:R2CXAVZ=UZV!  &ݎ8$KA挓лL!MΘ<g;@nOw!L0<|1oᅏ~$yWq3$8.V)YÇaؼaS{J枊jz.Ms.c}dpeɝ6WX:--]4{.BgFC7!bZLڷn$<m!X<!ZQwpk)6/C-C`\ቋkG=fo8kX:a0- ^Pn<if>^.ӴЫ6vv$KS9Rm5vEg<Ӵ`zZ!FΜlj^:3\5݄>, %w%O#Ry:wCmuP+8Xlv:!:+ujSqjBL�� �IDATSeUQ;,j1W8 ^S?IJ/||ޅ:sB4:⚯W0ʿc*4&^FɋR?qȋ,zïm:)1^"ZmP +QJ_[n6Yx K~u*k[]47lqGY[f, zeL1y8PE̜h)!(hk[D]Z6v{~>xf:;&Ds}ʏ|#3?F.b1W,GuPو\+O:J]3of),*HRcaDŽkWZ Cxi6l=ԑlaG2:gha<2$nS:f Ѝ% #> SaK8]:}:B1AQ_ Э9zbܱ;n3ngZF|k?$ݢzlv|~%_%O !홖 %jQ6Ne0He cn%Wzx)!b]WtLR{:k8CFiQq1|vKbl_eY5w1w^usZ1X) :Ba\^\n\NTm ")qQ)U"gSɘ@{?Opn֐^`\]_ ;o3bZO6N[hB =GjSl<pi�0^|hR_ZKCF=.׭;D\J4[T宅f,.rC):֪lCw{L)yB&cA5KO3 c>)9Sm.$Iem^jbY 0�bǞ) ^{ݯ0?:'Gq-V_͌wo1/3zj1"mCڍv:;m~}eqkPKǀz@8nv*՗E6*xD]T"8~mA=N!CV `?)sAl oXX9BH4> `UΥ#cb3w\̴̸*qf@ o~~ BzuNܹ}o/} \glLTuZn<t >\Nfڍ^Ҡ&1V{k.NT9a`A;jɁ\|[E>AiH⪳h%"ڶ&7ku@EQ̱c]۾k3[7|'ש⩒ sp`΅6$Zkcaϫ_՜:JsaσH>.<cU__'>z@#XWLB bpdQxwP׾>@h>sZ(b7Qru.UہG"*s,u.1ATq@w [Ӻ";X:¥v \c{#UHؘhyyô,h4-GP1Î 3 =?K?u\#1A<B Oz|׾OyѧR]b7,gD,y&1a'ױCd8?yƉ7q ZGqr#w�pgȽNSm4LN51UX\`|Vk[s&#~xI鍴9.3K9L:JcQZ+]F9G#Xr)gO8[o~ ?3o`B؝!qG/ 3|7q+lo6^5n:6psNSNɇK6&l '*86`q8q!B¸6ljv a#GckoD[�o1! *4EL0bSձ>8ZOJ# 7M]2reGh!@ũo\*LF?o%fqq k<k 1w囿\<$; ph ]*#{�o s\f4P#!t1LsfɕڄR;G^@ m-@)v 1l>>B>"S1t{XLs^t.!כzS'VDm/*݁h,m!W1"ލ1ixFryǏW~-Lұ㸙8,WV/KV~ښ2If]/s8fSAk.. ~~c.5Rc7O\,np3M71*%n:*܅n6&Lpؠ>81;HB: c)s|HXq(0S3"v:ZBM"s; 0b(n./?~o80K%LCEy>>>ƒ';ÞΔ sɜeG-QR"#w3di1a^OHix;k3š4AMo7|ZoZ_n8?UsÐݪ 1hF1t!b<1 aFsxj0Z X҃\S9fL2x~ s>#(-pGW /\q;q@GLN q8/8j}Sn!99V"#~Y򄳞Sʂ%|sĘN׸Z8m"h";X:;=wZ8\KպjMa:ΐ)CjZ/xp.)k/>ꫵ{^?8Ŗ<8?wATXKY2gXT(|ދ?Y1]Ĵ#Dۘhb{4?ŭlϪ#:*N: ޑI#*ju8<'9hj҅\[f !q>bWG4lm>]cP U B˅<i~c=t9dn:w#@OB2љ>$ySGh>سN~?Z[w賲{F1y/\^^f9>!d7YwK*{1 Բ{'AH0X{Ze?1! iS<]p=uK:UR4rLXo9:p;S)cy}lq7]%*=e8cΐKPR f$WGFrD$'(WJV.&е#;8.&w>̞hؠu|)_ů@> v`(ьXAh١]YZKkFyPynO3B 속KlbFr:djUQWGc X6awaT14 VBBLڧ{x.bg>:Ȱc˜; q:wL?oڙN.l3y!ü+1=u+|H\/tb—q}{Ln 9eZV{iB:pkĸULTGY ivQz<wۼEg-um'Bm ծR08.AsӢC:K%[} V;:r\9풬DԌB]˲+N{TʨUwU%s+0Kg:Xlo{nWWn3uސb8xd |ë WBB:L ls  wZi^@-7NIMg-i*tF cVkANb]}mp'Ǎp5k߱O'ծCoE+pWD_^ tfJP.ѭì\f(]0&] 1!XJ]֎_##0́aMgU/R.ŷ^:1i 5oy֦vBFiݱ1X66ͩlT7ͪ':%HcqbW0Fm:Ft`HO8NpZGVʌQQu -.xZ\h3#:nnuo|#_4 |DݾW xsn[G5dJ붜孂2`\u*+,+L_{U VW&ֻ"k,|T6}u+8_\Cf:m|uҩ$Y񍦾i RZE>;u}qZԱUet.8Q&4w,bȥpm3!8z[x/}KlSkBk"k(S픳s4o8.⃎M`蟸~4ua#xGY4ZVk:%M{cPuש[wE͈ZUWhٚ MӠu}mH,ű̍֠7eutƓ;):٬dz$럼Rx-6+vm@\,-^{Yl}B@d -<X+ xwggZ]w.Cf:Sc^8Rw~dFFDFDF|#t1W| "]麀&0[ӥpvƟ{կK#y40m1CVW1:[ɡ@8RU �[ylػQTgs`=,[όqcd{>!7 nO !'%[Sp1e`Ѵ5D9g�7>mNuJAOi+1|ky>6d8Ţr5q7[~k<@L7|xz[%>[.u$bc;rz)Ir/CXPۊU*!!ddhwM C̨]rƳ*@Xc4㩪 m"6YX"}MUNYsH2TC3`;<ք0lbnOm2cmcL20t8C݀V>f1?N?y1;XExZv"6}`~s[4bJ{LPXgˎos8CHEJV s%L/݅bs΅3qOgkc0)hqe;eHm1ᬣ{c, [i'DQNX|&,&!DeX1E̕?k73B?`MdOK۳zӺ}4O7TXjgcN_~%g3aiۜ` !2=]7l!bcbnqKH&9 #R$ ,O?Ųh|P܋dGnv{3myps}q]mv$%~֋e>l`cr%D*dgggxoK~)Fa娮yPzĐi3*59g[V˖_`c'4&ARNpRU-:#]%=F"=n٫ 003+~d3B0xC"6ˬUi<Or\GWy،T.cmǑs?gqʳO@ (�n/]վ9y~|o/]`kܾyvٰ1q`-ܗ^so~lNٜc9Gco)-TVwX[ |7=H\a0\6<4Rrk|W- a`q83RT^.X-[jo1)h9XrP6t1<?}lwJT|[odu~K?d ]u[TZ6%A'C"eS{5 w 1•n%J` Wzx\;ܼqrp!\au$Pܾ55'/vlco8ٟal,0FmV(axω1,6 2$9;Ƕ@,E˲]n+N^ls'<G>t?!o_gFl[C l={0kaQ4z*W3 Kj0[b٦X0:RcjƂ–Us'=?bRAȦr,Wשګ]W|&ݧi޽k׸^weViǰl^pbCJ<qRq4;)58 CS劺\;<b-MCwvʋ'=}㧏x1ϟ>f{zF1`q믽IorF>o\a L$ِ <n$KJQdK1v e#H1IRCiUR Ru >^d0DIO嘏kێl}|\74 _p}/ݗmWngf3&椚m9O=qui�2_(0T1fr7r,X <>yO>szgٜehT?0lEӮ\C[oz"Ւ/>׮ٞ !1Xr5</QLU k{LA`o較!sŏ 1[u6Y~;wiǑeh%C r<=x&Tnu2w]KoDF 8ƑN 9?i7q&X-T'<~=?<y)c\ْ̝uT%mt7 :Z_Q#+xښ͋ckO-W+_?.<)s2Pm%Qc!%j[8_f ~>;GG8X&!ww=J5c,J{Ac1@qL9kj6<'<?dhmƾ_n{ܸ{k|Uxvr ')z T˚ȣ~.C^<yv#u=T,|b=o(~CFLmnNIc Z؜w;%/w~K}z`:vS֫_/aŢ"yg@ &S>�P MʍdBjHVVK)w3aV9MΘ!8 S'T<W~?}4uܺΝ7^kpv&;s›Ϧwyv}vgnjC.G }38L>kah}Em=!ܻ}k|Sڦ"X,k~ǫnO?䳟yo}Gn·_⇤v*IO{T %" ?u_i{ԫ8h*7b9gd=`hT+KL36Dcj8FN=gwqm!w믿K7ooy}~%eX$=͹qT8'y|=kzW+]7^TM~uY°eru⣏'Yǣ'yw6'SE`tXky9}ފR!,^lc dNӺL s[חጒfegbrӅ1dDw g׿czIrGh`tYu<4Iy&0L>/2?-8*~Hp*"ln2 @L#K?ptt&Ea(r.@UFJ ^-y"Y팘�� IDATzR;5{1dsTz}cX,Vn"U 1[EkٛłU~[Ge<MSv<qv6J∥2[h`;l3sao\Phml'"e]wD#uSoEAa)g6 G1h٣=])Uep^#} o;2nsGU1~'1P}0Zv4] #'ݬ@Z\dYsGs-_+0RrH]Y{i.YzAepm'C8F ̐uR<XS{7ʓ2 ) Qbz]QkSv%2B2𹘢1ᒡrgs2Ecxqam'ӹr5`YD8詫9w]I%˕΀Y_w{joqMYò]0#E` *1-j0Śma}>.crnJ?R)uo1#Qǒű{?,MsR 1ksU*pKrEE ӂf )Ya 6*/ABBrϨ.ah Caʑ2!w i~ĭw,IL雓<c֑P wbh ,f B}L21.rDSn?+.s1XQk_Uy^) h=c\8H\nv `*)J ENRF)V&tN[Ni'Z=Hܯ9?ǒ#BRM)U(8WԖ]_ZBͿ# #hqx)o1N[B s wGA F1f,|.XGLOZ7A Mxui֏8o& 9>7朡>"mrMQ(D <u8R֭5/gbDdY,yh(yUFvԽ R&eb aƿv *ϻ`^ejIbM\ 3AriJՋ '֗pOk y:͸,?4/0EMʕwxE/ERDD-$5Y'Tc,]洁p>96dE2F[Q>>AL%_` 3c79%5]C-s(Ϝ,Y cAVʋ9.ObZ=w.`/k@MdXz4П%D/}T_ZQew0Ӏ.-3u9Q`9{kvþl'q樹D$~pa1!?5+E V3^0l.BȟX,@iVv�K_,դS**R8Cd�EOk\z9<FƑG -@I hIL5BhrNLs>~||MiH?� `t}+- ͕Ī%ASo2mqI0TP c"kC'ԍ0XBi;g.v6f Qޣ=kk8p\k(0S,Be{ɓ&cTh$O!/,\VT$Bsf=aMmYM화Mi>"k:h{X*cM1Z:g1ŚÌjD/HQuZ2T'Ƈ7y6۵U6$Mpm=hi?Gknoin׋jwis'^ 8k#D58דD&�k584k$oz,s ѡXW*^fn =^VVZԋ=7m$Oq0e "9G&<pn`/9} &{j_O&s3s`ni%RGy2W}{zwͷ& /\`zĖ ˤLyZ[JNa&\14|Ҳ ' ժ}X?O/G߫W_Zw C>RΚ~T4Ads#ƃ hfF3O.D=F3ޗe"(zzZO gKcͱA%[;:$$H,<#!gOGI A?W3V+:B 8V<CykRo24<r24E16c9Z:^st]#u] 'UTfţxyuKR*=@.\yhcrA1 QsQf\ bA'oGo'6]8Y4]Mxm`WLXse%c>F!hEo`z;yfm݉Jabyeܒr]kbR&4΅͹[8YG֕p \W=`.hq !e:6(Mp$ΙO[sB 3DtEC 5S ~?wQMTjo Xk'1׃^羉L)tS*f8y㵴\+.`v5YSsG�¡sJT|*zAW*E$I*:*rJI"'~z̠C 0^xUc3WƘ)B&9WaBȹq_Up6Q+r-I-}ڒbfJ4-H/|6fEXQe%M;-= m '":\s[+pҤ7pbʟ~M,-UsgzӧW\0iQ0dj9tN`<`9H\UU\M4y [G1NyČ]dLZ :7jYZxa%!H2xiAGSKNV,&MebjJ8{~' <JO4>+O<ڱ38-b$)ss+KWXoK?es+RCElv ;E.=uռ>uw,aJLidb\OL/C斘 8<{ Ns*{*m~rYzsLA}P_sQk9bS$_?~G}srrvD]\;\i.[ Ӟ1WMskpN,S7Ǐ.{~Z,{|][s.ы <Ԧ5O~l9_pά>����IENDB`�����������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/req.png�������������������������������������������������������������������������������0000664�0000000�0000000�00000003244�11753427512�0014443�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���bKGD������C��� pHYs�� �� ~���tIME 0�b*��1IDATx[l9gfvg^{vֱ؍ĸVUHZTCHzQժiQ<U-P5Z$@B9B0vlo|^go^Μ% Kl ~aFtOG|?%wu6qOZx]{W,{/Q}`GmtokkI!ğR=T񾻷{MדO<<rMFѶ/7lCzvczB²`>0{O|?@ XDtC'sPA_<Yss~#|nrr:ظ>Jpi\1 --?k•a LgL0M55e< J->y3 o.v&fPޑ �Ʉ�"XR9r RJHI R "Zx`pe)ڷvE63T8XtCskͩ茞L ޾7|ʉGk4~mVMNPKKYNg000BA$�izP^^СiǭB׫o?y3�[=m upW(R.%=c]oba33bllJObaaI ]59A!& .aBs+r rEKK}s.\ycK[ =n+ٕ 2q)azY[kH1@&^_)vFD~b "(%!%@ ! XEe[VQx<Blݺ�VY>.w~Ko)/Țh*R\"ƙ3q#\cp0nhL @ un=IpCd2inۄlv2r8?vV5ƪES,Z b>IU瘸9Gբшz\u kK4]PJ�tP_UcLNH$I)I)E73v+}n4uDB~VjnQ]PIGU[1 M{AR + pR)m� T/-DbZ(ѱz 8b*{|z2bρf]i>οJRSM\񞝝ձKPT|AWZʲP2ʼJ1"AHbV>L� 6|{<q/_j �iYl(3$^WRs3 n+”BqRFtp@(~]mPwjUT,ˆ24YYȃdHxLX5b>Av?c/۰~n9>mR@�1 4:;,g~ ʿo�YiM,D?Dt'U ]N#8yY`~�t`.@?Btp�m!e8S~2o=s_r@k?U+gk\p{-?/IYiG����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/reqkey.png����������������������������������������������������������������������������0000664�0000000�0000000�00000003566�11753427512�0015163�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���bKGD������ pHYs�� �� ~���tIME X��IDATxmlƯ~(}/"86I0,\-K0,ٌQ$eqtC@ Ӟ<߇ aE_w}u}ݹkZi˿޼==4NsƷ=nS8k> ߹$�e^wcnxpʆ6.8z&!ds_3{&;ή%34�|U_\='OE[C#p0I&R;vl~�`|_'RN_Q@�u+WTIB%c�8,jiY9ELiGD"I&!ij(.r?W2o֦C|.Ռ6/v>&=^U/v~θ:4`K0 m;2Nd X�H)%G@J "45b~[эht[<СʢLXKQϧFS^VTRYSa>n"nAB5;.s.]ꦮ^ 2ٳZ~O!!A4-|yuJdY.-77e_?#`%cOiՆƺҒ’w 鿝8߻*944S68Pzz>R ?M(_6nP5sra.F,]ס(\0tf.e޼`Xk18>l\Q ǣT2Jp;0Ę!"c3 �B @�D CQtض̤ӶbYlY6�/Ma暯x5L8)c(ksaېA{{~ֹs蘢i:::: MӘeώiD$A$_QGGo*H;!M#IP,q<lj7۠/#I-/+T*X<e":#dAMңz\uT|hhP-*!N>R|\dbAD��!TU9~حrR0ث9$D&3>ؙ%dk﮾teseF ъ /OE|3�1fci"T* )3$DcC �q|r2+Woh^&+KgLskY֣պ=d-N3{W5UWVt\ȓV,)8_Y?l+?W$;WX[;eYٞ1p@\ ٬Y3$cIaq)mȑ3صMe Q⚚ EFG1:>~ᰔ [T;.k)qƄ{/C@�a 5>0]S5C t͚i\ɼ^ 7o#D{---�yjąB<^)tP#R�.uD~ohT-N6zXi*z 7Qeni"ū@`d;mGcn)3.Ӵ(LO &v{68kx�d"FO|-]]NlY͗-˪dlxs4MYSXT|yz aywm߸ =Npy<2͒dr{D,]^xOg2 :tr$0tĶ1唲¶ɷl~ߛB�p׀zYX,)C#?imۧ @ 0w;E,| q76 ?PV[Wg"<K$gLտKfƞ~����IENDB`������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/revoked.png���������������������������������������������������������������������������0000664�0000000�0000000�00000012116�11753427512�0015311�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������gimp xcf file����(�������������������B��B�����������j������/��� gimp-comment�������Created with The GIMP�������������������������"��,���� �� �����������(��������� E#revoked���������������������� ���������� ��������� ���������� ���������� ����������������������������������������j����������T�������(��������h�������(�����x������ ��O����#_�� ��0� �w AG|� <"��% J� �!       ��)� �  # !   � �  +  � ���     �� ��3�/�^?����� & ��W��#��)a����8� �{#A F� B ��( I� �#    ��.� � !##"  � � .   � ���    ��$��7�!3�^B�����1$6#��\ ��$"!#��-^����;� � " -F"D� J ��,I� �$#$ ��3� �!)'% +  � �"+$4   � �(��'    ��*��"9�(9�mL�����ZR!����q����HV��L��1Q_+����r� �\!,;MMr�Y� � �Ӧ&f 1lmBȵq� �#c3C "1ZnyQIR� � ��)qPTe~#Pk`r:�� ����&gY������(���������E#rev����������������������� ���������� ���������� ���������� ���������� ����������������������������������������Y�����������������(���������������(��������������:�$�?Z=s/H_mm2��?W|3hr!ge��U0 ;l;b<��'9VA "7��aM5#iB7V-�Q����(��������� E#sealsign����������������������� ���������� ���������� ���������� ���������� ���������������������������������������������������������(���������������(��������������4I9N �!�aIo==� �LQYR� �BEID�"������(���������E#seal����������������������� ���������� ���������� ���������� ���������� ���������������������������������������������������������(���������������(�����������=_$��ò��qɣ.��(��+��,S��/o}I��SU�&�&�$�NZ�$�����9ơ\;�� x��vZ��?"�� ��-�3t]��YU�%�_�$�B]�$����(���������E#text������������������������������ ���������� ���������� ���������� ���������� ����������������������������������������F���������� a�������(�������� u�������(����� �������������M!&& N��/Fe}mdk||[~ �� �� ��SP5]<��3M\qVbl@� ���(����(���������E#band���������������������� ���������� ���������� ���������� ���������� �������������������������������������������������� �������(�������� �������(����� ������@M2�� 7�`\(��@R��JeB��CB��fL��F2��TI��L��EK��C��FV��<��:^1��,K�� ]O��2YO��G]P?��Mim_I��+MWXQ>��OhjZ2��C\VVN#��>\X1��H^b^R��#N6� �$U__Z?��� �7:I�%� ����� ���(��� &���)��� ���� ����������� ���,+�� ��!'�� ����#�� �  �#��9���� ���(��� &���)��� ���� ����������� ���,+�� ��!'�� ����#�� �  �#��9�W��#�C��1�7p��~ ����ʕ��O��d�� ��B����������_����D��"��v"��.��&,��g��>��C����q� �?��L� �<:^�#�I�����(���������E#Paper���������������������� ���������� ���������� ���������� ���������� ���������������������������������������������������������(���������������(���������E�$� �d_�� p � �A޳r� �� � ׾X~nqrt}Ǻl� �Bɷ[� �ò��HẨ�� ޯ��Щ��˹�� �� HM7bZfyH��^ŶʳG���E�"� �_Z�� n � �>Ӫl� �� �ԾX~npps|Ǻl� �?ɷ[� �±󠟞��Eܸ�� ؾٮ��y~Ψ��ȸ�� �� AuE3^XeyH��^ʳG���E�zj� �GD��SŔ� �.Q� �`¾h� �qOnXUVX_¿R� �/µE� �eɍ��4oq�� rȕ��i[_æ��kzp��vû��0W3&EBM\u7��Jkv6���D�;~� �SD��t� �Tg"� �8t� �,۟yh\cdd`s� �GH� ��� R����e��m����51F`lSIQ`y �� 8_I�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/scard.png�����������������������������������������������������������������������������0000664�0000000�0000000�00000002146�11753427512�0014750�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���sRGB����bKGD������ pHYs�� �� ����tIME $Eit��IDATH͖k]U9<a IJڦIՁPjE(QR@Pt$ŪāR@)AAv`iE IZkz&$q=g;Hh 5\6ZcϾ|o=gG(V8LwW߄rgA=sj]s%)2_2#0ME(l5bK%=^}810 ڵskMx"c@&Bk)B%T]bYZkR m44̕<Jh$R@۾j ;KG7|6 'Jhmң|yp68q!kXtF TL_KxiCHbok h<#!2xGǁv0! +Ӿ/h~OscO=H]m�sss|QN{ZceL3BHazYHPe x})%iR__O.ömQza7 >fŽ1:|G^HmI:i_׷200H05u0 }zDeD@DфO,Kn@H0 QJa&`XMí FcpU /9|Ǫ`[Ky| =Ў0PJ!`6;[[!c c +YlSSF~H͐<˲PJL?F5 qWMAIq7 2;)KM0\>?ASmE&'/ɧ_S $5!)5o\Ky)<WG) ,& K8N|. Aa׋yl'Z 3'"Kx^ðTB*Q斚M~t:NgQD Aq}C@ҝ# K@CkMIjR.Q ?Yݨڪpz����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/spki.png������������������������������������������������������������������������������0000664�0000000�0000000�00000002617�11753427512�0014625�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���bKGD������ pHYs�� �� #u���tIME .%_X ��IDATx[Egsv*5s,+t z0 +zP nH72*H.eRCTDA)z;3٣+0of~|̌pޗl`]-('RgF?n|lQ Lv8p <"3-W9 񺸚x>?LUV=" "O 6xGy+[hK}\-9[xzjt<i7mffbK^ڻVn=tk*0 fKYn[y'sZ9q$M(k\'[a;ݼv/l*6a[o]x@;(;KCYxqe45z8UKb-/'zYv%f*1I#l= غEZ$%3?0D"q)pX/uI"tj0X3/ xY!PI1$FE j * Xzp>nX IRT#rhQW^Xɋm$@ > *@$aT7wFװy\|1c#6Q8ū0A)^ «�cWY2|<$H6A:HPQFҨnhYq|nã̙] M:LP*qclھ+/{`1Q:Ai\s0s fhlFgqbqǡ%iV50(u܇;tJ2RxA|Һ^"B:v}[o0e$f0(ҸD̚'27x8]˷2H ֦(c(v*7TAiAp?zO9,ѦEv`W7=wYCݻrb}baD'_S7Ys<xm Xv1{ږ,!tK%p?[;zz/En:D;*_Pp7 MKsÙ+"0$r�#cxD8Q*ю{)z"RO$[훆3Ǝp\fwMSM Q@eԩ'd d{j rZvtf1k kOrMUW80=Ǧ\u`UO :1Ce-:5KLOǝ<fhii GFFpΝ|uJP8M t[QIw����IENDB`�����������������������������������������������������������������������������������������������������������������xca_0.9.3/img/template.png��������������������������������������������������������������������������0000664�0000000�0000000�00000003025�11753427512�0015464�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���bKGD������ pHYs�� �� ~���tIME %<��IDATxolǿ9^jKK)kJm b\Tı`cJ-Dn1"{%DßMTsE:0*Ii,Pj%9^\@/|orr=<'fho~fӍްU�P�|� C-~'ޟ9zH}gdMyho~wd3GnHhcF3? JƺM[~/Hope`HHwl۶w�*HHҖ=|};Gf߃{e<)ܕK[oZ# yO CB׳ƎDyVJdT%hm MM)ؘq\x>s]*ۉ�[?jşvH<:qHf,Q Q%SOL0=]bk-[kc,f SG INn͛Z⋇]ɢfpĩs/ʻ2熶xg'bxxDtq�s"I#J]St^nxZb]ΘHeO޽ztmM{s3M Ćtla `4` `-}�(XBxZf5V\ΣP(r8&zu_Oo'�r{oڼett,ZXKH逈ȒK� RJ)QMk-p]@JJcrTQJv o[P{N?#Q|תem7ގ @D2tQ-L {>�\p] f|�8=Ϗ�f̔ ;ڛE x*_TccpcW MM9ZцX)R:̀qAk {z((p]Xk1 2Wu6цuc}So_>A|UwFs[DqCfv,`qq\11�ATm#N"HAhbWNKp…$(E׭XHw>hms^P.ji8<o񹕷-u2< Z 'Zc`5̆KD&$$0/ݻw:V zoSՖŌq>=f]#'kQdy'I�%,\o$ST2fT@:>J3ݽoG�uui~yL�0h~g2y) ;B(Q:wg�;[:‡ʞ~їTj!^.t>Qkoy��2&T~y5p�P63܏K,B !Ks_Wh`1߳( ����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/validcert.png�������������������������������������������������������������������������0000664�0000000�0000000�00000003333�11753427512�0015630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���bKGD������C��� pHYs�� �� ~���tIME /+g��hIDATx[L\3s,ֻ@%`Lq 񥩭8uHFnJhTj꺭c5J!iXrI5Rv6I}!oB/ ,e gϙ>ԊؽÌ|~גRjKtpsgPY£O>PsR7&x�*'Voobe"Ǐ~8-|n'}5w6fEܚ>4b<c3I�o2eWXkgc=O=|6ζ7"49˳rY3gzTxT孟ikn?yC'&X`!(T2j9,5WӜ4ϓQ@TЯZFN 7$$U<<rxٽ_4R-ƽq|K|{ T典ɹBÑZW\ c�!nx<!c-ɹ;m= P\@0lxq뮀 ^?}Ҿ9WM*Wǔ+7H$JGu0JaZ%c,sNr(LoFs� %8ar�rUvZG:�X>RB~u"?Ps{3N xhcbllR&%2a6==zzPhIAHwe-loMEM$P ੯5(/جl;Vɟ}ŦG/,$qxrQRa ^o/,8LB@)|:N! <^9|O:\I7ɭX}}E+_02/Y|+(LnheK7C^RE"xwwaz]Q()$-],RJaS6%,xFRfU.{:�3 !`.+ 7,251)3lv亭8\vL� J~W={ 2-VJEu>kYߠTNM 17]J!fJrÌk3U90NۼQxNjlX)Bo?Z[lg嬒( TcVIRR$L!ZI^sbh(DHЙ  ˗i6JCn ,@no-U՝ ss J)/Dgo>X,=u)շ;KȬ9F?XUkm^,~;SZZLKpA4%$ FƉ#)N87ݦQL*'_x祗8ToP?啕jB)DўXjgXD$L3 )<\ve_߱;YtZ|yYXl^b#Vd?r�+Hr(oŊmT0;8+ݿ !e%Gm"#u,f䒔?/uErTyUvK=ujqyΓTN)d�.)Gl�$>1fJ(`gL?\.O> @OU1ABV2JwR: pEӀ-˙Wםo1����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/validcertkey.png����������������������������������������������������������������������0000664�0000000�0000000�00000003657�11753427512�0016352�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(������CO���bKGD������ pHYs�� �� ~���tIME ��<IDATx[lTm|`cdK)%@[ J6U QզТD IPQi$Pڦ)J$8\- 6bb3g<s޻m"8U^?.OZ{--Rʢ}>%SVo O֟kw^ �2TGJѓnX;u^=%'>$z1>6iXwοaz~,D7MG8 @LβvشeO޾}ӯ3lÞο`eLWz *@ fگ^] ϴZxE6W6e NBD9!�$Y)Zռʢ2=>MSr]B"\8Y&}̝;>qȉWgŨ"dbe~W]w ᘙc2.޳2BQt A)!s&8F'Doq7m' Nxe ױwCH<eO}zJʋܾ#wA_?R+fO\kmǩh08dݸ!ںDwwx(rEt28bq|S�A 2N)^ʟ";ɵ~�끀%<#(s|`8DQZ,D$<88B{zЈtM=>ZXX|#M6M�E"s8k*Yc[48s[Ls?xBcH<lc2˒v`6 B�pxv!�!wt(wl8g޽hA)-__aӲMU%ƻbg9;;([`pH͝n岜Ҫ-_,!˒FWJr+ ]O@BShq& 'pxCUmݮ_+>ir!c<¬dU''nuJ!_$;),7hGG{e'75uw,9|j[iܥBΝRY vIi-8g[`9Ik3dƦ֏֬|H6a o]9y^K??vfUD!*d%I !Sx<MF>ɲtt4A{zz[d&'H#&|IP8S׷#ccB%Wfbղ*׼Bϩ )hecyK*5LG$iyN;˦!tw�CA~r LŅ Mi ܐ.o߫;>b Y*9Ŋ$<0kq>w9oٲ[5;]B�욦u_+Y "+`bh>M+Nlzq8tx �'6D%LUaBr~h*8�.DKX\fw0Dbe7МHTxb_P$1{v4~d$!$s΂aڒtM @ qdR .!G'&RGL%) ̪᷆Xn?׸rGo5Mii4EV=)*�3c?1#خ!? PɔDM*XE!6.XX뭫[fBPUD"  #q'a}|z,o'|,r�2G9~_^YZZ~0 j4 @ߡ}`kK�+ǁ�`G )!š#wtb"j}Q'Ga$?L����IENDB`���������������������������������������������������������������������������������xca_0.9.3/img/w32res.rc�����������������������������������������������������������������������������0000664�0000000�0000000�00000000157�11753427512�0014621�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������IDI_ICON1 ICON DISCARDABLE "key.ico" IDI_ICON2 ICON DISCARDABLE "xdb.ico" IDI_ICON3 ICON DISCARDABLE "xca.ico" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/warn.png������������������������������������������������������������������������������0000664�0000000�0000000�00000002216�11753427512�0014621�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��������� ���sRGB����bKGD������ pHYs�� �� B(x���tIME'��IDAT8}MlUE3}O-h-#lQ $+b\MTBƍwq#$$&AhD 4b =sqq[@d293G(];l՞8 ZIdgwUw.o[OJUz6=Qѡ5B$oʕFd7z@m? W Ί 5KkFEeTO"'Off?\~Kp왍ko-$ET jL6 o|n=q?]z6Ǒ}G^6QVP4v,N{kgV㍭cR?5RN#192oyWJ&Sdw: 8}#FGK/w m+&kH&LF#Tv7Sl&H&d&[tY/J-.8A);W'ta@6=�pbőVkWS{|chENJ[V7QDf -pvi&a�OcSl< B!JTxIsuEX\j0֫($1H&()-S k5${TJbȝr2)KnQPj7A"Ns͗,@ET"F�tC!͹&pOEqܚ"NZsy  "RKytBTvQ_eL 1. \F}f¶2qgiˮ=wsL217 mҒv=Jkx`xD+/ؐ$pm&n9&+GuRIĢp(6Rz < tY~w�EVT޽r:*y4fiNbGXV=.8 -8ewiܥ<o}$";H y_߉ p~NqZl)V]Fs='r/sz."����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/xca-32x32.xpm�������������������������������������������������������������������������0000664�0000000�0000000�00000010031�11753427512�0015216�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* XPM */ static char * xca_32x32_xpm[] = { "32 32 118 2", " c None", ". c #FFFFFF", "+ c #D4D4D4", "@ c #F4F4F4", "# c #D1D2D1", "$ c #EDEDED", "% c #FBFBFB", "& c #D6D6D6", "* c #F5F5F5", "= c #FEFEFE", "- c #DBDBDB", "; c #C9C9C9", "> c #F6F6F6", ", c #FAFBFA", "' c #D3D3D3", ") c #FAFAFA", "! c #E2E2E2", "~ c #E3E3E3", "{ c #D0D0D0", "] c #ECECEC", "^ c #F7F7F7", "/ c #D1D1D1", "( c #F2F2F2", "_ c #F7F8F7", ": c #DEDFDE", "< c #EFEFEF", "[ c #E8E8E8", "} c #CACACA", "| c #EBEBEB", "1 c #CECECE", "2 c #F1F1F1", "3 c #DDDDDD", "4 c #EEEEEE", "5 c #E9E9E9", "6 c #CBCBCB", "7 c #F3F3F3", "8 c #E1E2E1", "9 c #EDEEED", "0 c #D8D8D8", "a c #CDCDCD", "b c #EBECEB", "c c #C7C8C7", "d c #D6D7D6", "e c #F0F0F0", "f c #909090", "g c #C7C7C7", "h c #E7E8E7", "i c #C4C4C4", "j c #EAEAEA", "k c #D4D5D4", "l c #939393", "m c #BBBCBB", "n c #E4E5E4", "o c #C2C2C2", "p c #E7E7E7", "q c #D2D2D2", "r c #929292", "s c #E0E1E0", "t c #BFC0BF", "u c #E4E4E4", "v c #CFD0CF", "w c #8F8F8F", "x c #B5B6B5", "y c #BCBDBC", "z c #E1E1E1", "A c #BDBDBD", "B c #E5E5E5", "C c #CDCECD", "D c #E6E6E6", "E c #DEDEDE", "F c #DFDFDF", "G c #E0E0E0", "H c #888988", "I c #D5D5D4", "J c #BBBBBB", "K c #CACBCA", "L c #8E8E8E", "M c #D5D5D5", "N c #DADADA", "O c #9F9F9E", "P c #9C9C9C", "Q c #A4A4A2", "R c #BEBFBE", "S c #6B6B6B", "T c #C8C8C7", "U c #696969", "V c #CFCFCF", "W c #D9D9D9", "X c #D7D7D7", "Y c #666666", "Z c #989898", "` c #6F6F6F", " . c #DCDCDC", ".. c #636363", "+. c #A7A7A7", "@. c #656565", "#. c #484848", "$. c #828282", "%. c #626262", "&. c #AEAEAE", "*. c #CCCCCC", "=. c #818181", "-. c #C8C8C8", ";. c #BABABA", ">. c #A6A6A6", ",. c #9D9D9D", "'. c #C5C5C5", "). c #9B9B9B", "!. c #525252", "~. c #767676", "{. c #9E9E9E", "]. c #A3A3A3", "^. c #C3C3C3", "/. c #919191", "(. c #B8B8B8", "_. c #ABABAB", ":. c #888888", "<. c #2A2A2A", " . + @ ", " # $ % & * = - ", " ; > , ' @ ) ! ~ ", " { ] ^ / ( _ : < [ ", " } | @ 1 2 * 3 4 @ 5 ", " ( 6 < ( - $ 7 @ 5 ", " 8 ] ; 9 < 0 ] 2 7 ( 0 ", " a [ b c ] ] d | e ( ( ( f ", " g $ h i j j k j < 2 2 ( l ", " m h n o 5 p q [ 4 < < e r ", " 1 s t p u v p $ 4 4 e w ", " x y z A B 8 C D | $ $ < w ", " $ ~ z E F G 3 H I d J u F K B j ] ] $ L ", " ~ M M N G 3 3 0 E O P ~ 3 ; u 5 | | ] l ", " - q 3 ! B ~ u ~ p ! G G Q R ~ p 5 | | S ", " 0 / z ~ G ! ! ~ ~ D D 5 G T ! D [ | | U ", " M V q W X W F z z B ~ 5 p p ~ + B 5 j Y ", " ; V / Z ` f a X F u ! p D z j u .W j .. ", " 6 +.@.#. $.+ z z B B E G u p p + %. ", " &.*.$. / F ! u .F ! 5 j 5 =. ", " &.-.6 M F u - 3 z j | j j ;. ", " +.g { e F X & ~ - E F [ j $ j | >. ", " ,.'.{ V F N M G N E E [ 5 ] $ j 4 ). ", " J -.1 W .- G X 3 3 p [ | ] $ | @ S ", " - -.X . .X 3 .D p j ] ] j $ *.!. ", " J M V W F N - B D 5 | | | ] e ~. ", " + - / 0 G ! D [ 5 [ 5 ] > {. ", " & p 3 0 3 G ~ B p ( 5 ]. ", " &.! 5 e 7 @ * ! ^.r ", " L /.(.J ;._.:.f ", " <. ", " "}; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/xca-mac-icon.icns���������������������������������������������������������������������0000664�0000000�0000000�00000147446�11753427512�0016300�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��&is32��ӝ̄ AtV �� �Rw};�l3GvV}gcfbaN.s�\S}nwaZeJ363449Ijt}�� �KVg ��̄ AvW �� �Rx~;�l4HxXhdgcaO/s�]T~pxb[gK47455:Iku�� �KXh ��̄ A}] �� �S;�n8L]lilhfS1v�cZwhamO69677=Is|�� �K\n ��s8mk�������������������������������������������������������������+�����W-�$- ��sʱq 0ʝossrqxH��������>�� ���������������������������������������������������il32�� k!%$LnxvhH& )'(M�_i��PuH�G9P]<����qQqkmrcx+\ !�0'�8��ef/txBJ`qvmT{lLxdFJCv"��fUPmayY��^TGm\}e\�KSVAnnNQ^\ciK�OlHOp��K^h8��U�'dJ��Hp~d#�� [c\Wd}y]W`�a� j"%$MoywiH& )'(M�`k��PwI�G9Q^=����qQrlotez,] !�1(�8��fh0vyBKaswnT}mMyeGKCw#��hVQoczY��_UHn^f]�LTWBnoOR_]djL�OnIPr��K_j9��U�(eJ��Irf$�� [c\Wd}y]W`�a� j"%$Ot~|mJ&)'(M� gr��P~M�F=VdA����qQzsv|k-` "�3)�;��go3}GPgx}sYrQjJOGz%��n\Vvi]"��eZMuckd�QY]FqvTWebkqQ�OuNUy��Jep<��U�*kJ�� Ozm'�� [c[Ve{\V`�a�l8mk�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������nn��������������������@n������������������1������������������� x3LOFnZuF �NyBV"��]vDekjjjjjjjjjiq9��������������s���v������������������W���������������������%e^�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������it32��&O��������������(:WeabbdbR^];(�������Shx }mQ0������ �&l x8����� � H e������jK ������jq������lH�������l~)�� ����o8�� ���k_�� ���QwYe�� ���tD�9bY�� ���.E� �\-�� �� �SR%?"cb ��� ��i Q)%p}�������� ���2 <#dS/� 6@4����������mk'yrZFs"S���oԟ����� ����#R����(Y��� ��.n7  �z9~QbunfƽY��ng��$M����Y���xk����� ��Is'7::.vCeO��hH�<+�/N(μ;��'@�Fܱ1�2D �� ��� �y�h�TrDCxSjdf1h\r'lNK`h% :"�Lyf|�����y�Z��&sM2~p9FwN?LIIKE>EHIQWQGHHLRKFIGPXKPTJTRGIHJHCPMO=6LHHILLGNIEX;$HRGOL����z�}b ���#_Yt"vxtuuvsmsvtsqtutstusrusrussutuvstswxtututuuqw|usuq~]�W=��y�$��IG.)bp  v O6_VWWXYXW�VWVUWVVWVVWVTVWVVWW>$8`N��wR���.AiQj\Q Q0̀˱q��05���oB =Y. il (Dս˷6��O3���`B�+Tj)fs^J|˹ ԽF�P1���aO @(WnNZVd7 xP1���`S vn<z(WnBJKNKJ KFXO3���]I ^w5~&zvoqlgkq rly} yP.��`A7 VS��U yBQf`b`M<M`ba b]lU�JJ��vE��\a+$"U IlճJ�G{���XF��Ym:Y+xKѹ��˸:� �Kk��/I ?0`q*a zDHјֆՊܺ9��K3���1S�W_,+:�77@yjmllmn\I]falomlpcWhom0kpw2��Km-��#]G�_v� t qlonnmorpog^gielpoqjdmpolv`����FYVShI)^t*� !\h?ABACG?-".ABACDBA@AC%���}O kw _a$zG���z�t;3g Qo(a^%v\((%+H[����Eaoy���$/����*g�id�� ��a Jjd�� ��AK[7�� �� iS?yv�� ���/ J)xJ�� ���=E�\m�� ����$dhSqB�������$t�������$9������"H�����!w4������bh������?=����� �G > ������:] > ������Hy} {S3������Eaixzzy|tbA�������� �������������(:XfbccecS_];(������ �Tkz oR1������ �&m y9����� � I f������lL ������lr������nJ�������n)�� ����p9�� ���m`�� ���RxYf�� ���uE�;dZ�� ���/F� �].�� �� �TS$?"dc ��� ��j R)%r�������� ���3 =%fT0� 6A5�����������om'zt\Gu"S���p֡����� ����$S����([��� ��/p7  �|9QbwogɿZ��oh��%M����Z����xl����� ��Ju)8:;.wCgO��iI�=+�/O(Ѿ;��(A�G߳1�2D �� ��� �y�j�UsEDzSleg2i\¥t(mOLai% :"�M{g}�����y�\��'uM2q9FxO>MJILF=FJJRXRHIIMSLGJHQYLQUKUSHJIKIDQNP>6MJIJMMHOJFY;$ISHPM����y�~c ���$`Zu#xyuvvwtptwuttuv�uvtsvttutuvuvxu%yzuvvuuvvuvwsy}vtwr_�X>��y�%��JH0*cq !x O7`WXXYZYXWWXWWXWWXWVWXY?$8aO��wS���.BjRl^RR1ʶs��16���pC >[/ kn (F׿½͸7��P4���aC�+Vk)ht_L~͹ ֿF�Q2���bP A)XoO\Wf8 wR2���aT wp=|)XpCKLMLK LFYP4���^J _y6&|xqsmims tn{ yR/��bB 7 WT��V {DRhbdbN<Mbdc d^mW�KK��xF��]c+$"V Km׳K�H|���ZG��Zo;Z+zMӼ��ͺ:� �Lm��/K ?1br+b {EIӘ׆׊޽:��L4���2T�X`,,<99B{lo�noq^J^ganqonrdWjrno0mrx2��Mo.��#^H �`y� u snqppnptrqi_hjfnrqskeorqmya����HZWSiJ)`v+� "]j@BCBDH@.#/BCBDECBABD%���|!P lx `c#|H���z�v;4i Rp(b_%x]((%+H\����Fcqz���$/����+i�je� ��c Kkf�� ���BL]8�� �� jTA{w�� ���0 K*zJ�� ���?G�]o�� ����%fiUsC�������$w�������$;������#I�����!y6�����di������@?����� �H ? ������<_ @ ������J{ }V4������Fblz||{~vdB�������� ��������������+>^nijjljXed?+������ �Zp vW4������ �)t<����� � N m������sP ������sz������uN�������t,�� ����x=�� ���ug�� ���Y_k�� ���}I�>k_�� ���2K� �c0�� �� �YY(C$ji ��� ��q X-'y�������� ���7A&kY3� 9C7��������� ��us*zbL|"Y���uߧ ����� ����%W ����*^��� ��1w;  �!9Vfzsj]��sm��&P����]���~q����� ��O|+<>>1ClR��nK�@-�2R*=��)D�J3�5G �� ��� �y�q�[zJISsjk3m`ʪx)qQOdǶƍ¯n' =$�Pk�����ya��)|R5x=KTBQNIPJAJNNW]WLMMQXPKOKU^PVZOYWLNMOMHUQTB9QNMNQQLSNI]?'MWLTQ����y�j���%f_} &}~~|v|}}{|~}|}~|{~||~||~}~|}|}~}~}~~z~}~ye�\A��y�'��OM2,ix  # U:d[\\]^]\�[\[Z\[[\[[\[Y[\[[\]B%:fR��vX���1FrWsdXX3Ҷv��69���wG B `2su +JǷտ9��W7���gG�-Zs,n{ ePպ I�X6���hUF,^vTa]k: wX6���hZ wA+^vGPQRQP K^!W7���dN e:)y{uou{ |vxX2���hF; ]Z��\ GUlegeQ?Pegf gapY�RP��J��bi.&%] Or߳N�N!���aK��_u?`.QǂƓƈ�Ƌ=� �Su��2ND4hy.i JL܂ߓ߅ߊ=��S7���4Y�]f/.?�<=Dps�rsuaMbkerusqwiZnvrs0qw}4��Su0��%dM�f �"} {uxwwuw{yxpfopluyxzrkuyxtg����N`]YqO,f}-� #cpDFGFHLD1&2FGFHIGFEFH(���}%T s fi&L���z�}@7pWw+he(b+,(.Mb ����Kix����&3����-o�ql�� ��i Osk�� ���FQb;�� �� qYE�� �� �3 P ,P�� ���B J�cu�� ����'kpZyH�������'~�������'>������%N�����$8������kp������CB����� �M D ����� �?d C ������ N Z8������Jhq}jF�������� ����t8mk��@�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� Ie ������������������������������������������������������������������������������������������������������Esץn>% �������������������������������������������������������������������������������������������������7ɨ\����������������������������������������������������������������������������������������������-,�������������������������������������������������������������������������������������������ni�����������������������������������������������������������������������������������������V=���������������������������������������������������������������������������������������E@������������������������������������������������������������������������������������F^����������������������������������������������������������������������������������E�������������������������������������������������������������������������������H5������������������������������������������������������������������������������[�����������������������������������������������������������������������������n=����������������������������������������������������������������������������(���������������������������������������������������������������������������b=�������������������������������������������������������������������� �������������������������������������������������������������=!��AMK)����������������������������������������������������P� �@����� X?���/z0��������������������s:02$� ���+m��(���,���������������4��v}�'Y�%,�YQ5�G+�^�Co����' ���������iVaʬsӷ."lM-f�Rdv-��������� ������?��*bb��[��� �� `R��</� ������.��5p���������Bp�kD���������� N�!����������"M�~���������� E����������!t*���������� Vb����������,s�#��������o������.k�r �2h��S�i��l����`�����[[6;;::::::::::::;76;:::::::::::::::::::::::::::::::7@2������4�����������������������������������������������������������lQ�;o|���������!���7A ���������������������������������������������������������������o�������������������������������������������������������������������PI����������������������������������������������������������������������"��������������������������������������������������������������������������Lt��������������������������������������������������������������������������{����������������������������������������������������������������������������n]�����������������������������������������������������������������������������f�������������������������������������������������������������������������������p[���������������������������������������������������������������������������������iy����������������������������������������������������������������������������������L �������������������������������������������������������������������������������������:��������������������������������������������������������������������������������������7<�����������������������������������������������������������������������������������������I �������������������������������������������������������������������������������������������� 4h���������������������������������������������������������������������������������������������� #|V��������������������������������������������������������������������������������������������������Bu;������������������������������������������������������������������������������������������������������� 'K^* �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ic08��-��� jP ���ftypjp2 ����jp2 ���Ojp2h���ihdr�����������colr��������"cdef����������������������jp2cOQ�2�������������������������������R� ����\� PXX`XX`XX`XXXPPXd��Kakadu-v5.2.1� ����,�qA_\(7ˁ?v7@RkU+\X9\v�sKk"F9z:(q7<q=>q^ ݥؐ^|l8AdeHk(z{Y:q"o̢?~8w ٓ;[m]r me9{<%3ԊH'(}qE聓ܸ6D6._j,jOt3/ f 0(a7K?+.]"is>>BxA ]qUhiYY+0Th.u�0Di<I2)C3:ens6?$?0A l!fn:+U(* aqhcZ ";C_GDZ.,>ʕdgAeGsB-,q)|?Pk,̃P 5ȊfA9_Ob2aV5�\[*#=ֺy)Asy1(Yy!SGU1bU:.s %w^vy>'j6[ްizm#Nz1Սs(M;&Sp ŋ&,.}Mb f+=E t/#6cD;vyYL3pJs51R!g NUVE&)Lqxs}m؄unLtjïۼ@I|` lG9MWt4?Ťv֮x|շq94BWSzcUh]FX{e,x@H"5a 6��όyoa.�o7om VhŇW{\?q˖OqȽźƹktXѯ�O蓠S &ł|JbkHQޠuqDžPцK-w]kI":ÉmY0<aO0PdyC3r|UAoLe^4ĠVWBZ[uC -jPަ_xR: }% 3 tS kkd%tSbFe;Um|Ƥ.6)푪[F#'ݗ 7S }s'Ьё0immtoa5iD  ;%TsUPj>Ae[]3&:$hv}(?9U}2| -AO5fWxm�Qňte3 Ae۸Stvm2M{zIn׏*nphb04īy^ObJˋx~X 7^wrC)@뎒5}VQV�wO=RfE| ,0ջ ;kC _bČ>La8 Z04 P@tyɚ4p魴v 1KKE@ DI/U|$.W;HF x Ѡ$JQNڤL d- "%]S.9h*9?Rp#BϛN.@|SV+uLm%_g=uvԄ`R;Lp٠ō$0V];Pod( ׼`mMn"rCw@0rj~"͇{@Ƀ={*K#=-Vi> NTP"|<{e{ yu|ä>JHƤOح$_,望 ^ Aaݑk2G$ǟr#@߷ֶ0B 52ޛ/ZUhU“$P{)(+)|b} v+4/aTӮ̮D Y;/Rx>MBB`f{z;`$k/2tKa/l4em+t7NQֲ8Ѥ%@;G�;FƧȠ^:VIwN5  ?0J)uIY~dcjɌ<<}�x^ӏ/ ^0Y@K ŒP_�TV =apKSGJœY֨<Nϣ-y/Hja6䕿:�SF A "FU0<Z6/^K_x%Ơmr; ^ sN͓ϥŨ">F;^:4)2\E-C"t[W3}יJHbAI܏q$ďpqeIq\s?ذ CBYEZ/L}]Wg>�ov2 p wk6fPao iU ŭSML4 %~pŊ͟Ѡ}dYȂ  1iEUh)@nH%^ 'EO+ v&F o ݷehF#ѯLpI\zVE0iDf@^c 2T-ŗ 0:*oރ!bt)�$_c+e)rژD>߬WDdu³x5 ޯ^` ^)$KRϸpwR~t)$ -cWw޻{=�r.@S)f$*>Cm4l#J" VOxٛ@>epeZW0apslMp`.Β2wx<!ḳrۊ vA.%CC?JK$FѐP1'xv2O]萡ۊ m66oksnj{ t<I*:=pc*U21ȐȨn[yνF&ZL^n޿8CO',95CEÏ|]^YJo�QeJ_09hwWVlwєV;X 8yQʋ^-gǵ8FqEV;I[cĊŗ^Z9|3jx9q8$^XG쫪U*`I跇#Jy{0 e<zb *R,P Ut^{=ar# :Q5ŧ_A{)\\o{ [ϱ*׽efq6#} 7_}m^ȐkPuS4dF!M$F0H^W%]"Oل}UgLE?TY2E8O^S-^%Ҟ*x(( �i �H8g:T[YJ{h|ưWMT'sG,4c eL^ 0?; P YFJ"s}t`j"6ײtH4z.V0Yc3jR2d%dB%C'1EB&W̑gB´sԜ\RWY^,bn ivr_)FeKͼ#gWe^/m"ߛzM+~x@[͸W!q+r!!"[=2-Qn֒#`>x;Վ oUȚ~zU@Zo|>)`?Ġ:v_ݫ/մu7:VLF$Cvgfq[hUi$t ZxEg,q1 JWeœ8 wTgx:, ?R~6r|3.`)m۟aZs]A6m\.C2wpۯPF1+ m` jaEz9h歹]z#uԳAĬtIXC`|J&B?/v#zkSpx$Hτ$b[ť^CC<M66 ma*rDIЪa.7ժp@!ART Ж-dz 4F }hy96&p(QXv\cU|Qh(Vܶug/'m[(*`rF$dNJeyB jI>lĞ!\eB<LzA(bg]N'qoi{ MPEw҇�E7|{Q0jon0*:yPkl2.Tž%ޠ)Uکsۑ98٧v/%Ѯ�]tqþDuB:mFa}'7XbUC!/|dB {+iqCmoxߐK 3-1ԡZ19M'*|1ٺ`Pu�Aۃ tQ.~8xVoq'JתI:{Wmt~$,4?P˔k3߿Xg`̓,w=ċw]3'D9ewOS?ّq zaZe˳'ArC{PSk>o1~!7?N9:U2yэ6hׄ́€KD0N3/gMEY;#j<S)c8(i~P�`~6$ơv :uaF/ƞlEjbz9Ѯs1HF~ܩ~iÎgZΒ-=jm�ƣ}YxLpcxE}w(q˄kiU9{Uց\< _,4y&gMn\.Z^ (7cUKϗ9}#!UVdlXV>&x}kX(r鸵T+&V#!X0iɦbqmG=1C2LOR|\yv=+,VTY,{Z'w$!*j۟--HNʏ ) '}f7[iG 8)qSaD,SXTCBZI™[6jy?z}t7M*mPgx5ePtQ$$0y,T"VuQ_+ EPi@cӮ:.[;N(#֨c-vgw&ֶ8%3evZKǸ8OM1dMi $ :|9M 2Q}|)5Gs̾ڰ$T'hLX|k@Y?M8?T?2qC̚u5/=dCTY@u[k,kW=,.�VB BJ/ڳ:qJwpہMa]y}ԑ"8W敳k¢fCPZVއGd|1"AuYxu I)em˯NJcϪ+#m$; k"ȝQrۗr+_ N@NUBH~J5mmo"JGHE><]̏zfd3IƭZQԭa+ʗ#wp_jF /_ԏgamt2doJ!{l$\@\NޮVQPݍ8C/=jk``iw+DA6)eS DeqH;7B3s}q(hƍc<dF_zւ"?ȇ}L(ʧ{tn"e$#Q *R!stJ|Gd2IArkiׇ^OSF6V-BEsҞBնsy$ h_̉e֝3IX \̉p\n`d�-P[J}/O.]bzrlow=z vmbTQ0(KhnDHv ս)N-[U}5дu`#?T AUV.ؼdW[@l7v`B֎ ‡GyEy'8saGMo4emuUdқ 7E|<[|T 5zќ8l]{`owODŅݤifTIP޺]|�A:Ɏ>Ӌ3+vQ%VYZ/7V[쁦.$l]갯CN')zXke$I8t7rDJ qs;k-ﱧG=HA3̻/r8` TI RATlo5k;j P^OKSouk#ӃruTHO>1{^g?pl%}b8 ._1MvMB Jjnx@ A"CC yRD!jURE~صo׽�:\^4YF޽B@A#RRc)j:5> IU y$xɑ{ D6ԙ;;S,l/ao}�]ɐKzSy_ZsA.lb QBKMw'[?0l&_/_�^(aG$8v'uY2YaY^9# ܲq*wv!+Tz],ʞRTݔ094K7( B̘O+^_KI b ZF`QuU33UZb{H* %C&Qe?Lѧ0v|l͒gGusKxb({5L;W�7H=NN5F`��zibThqto^ ;f���*^j}y*겺ʀGwХUGcBia*: Nj¨~PC<!V@7Q2!YÉ؞g]cXvI\48Ze:�) R'_:5* ?cߔZ-WƃrD,E}Z2+~EklQSChi?`(+rU{frD$/鄕ʬp Y# -ecO'l?ٻ;N7s(x x66YsIr/<5[W)2a+.i*5S OaܪxUuI8H 0z6u0Y@jOGJ�8z)Cx6F/ZoBUUUUj@XM~u 5 T#7)6mmmH6NI$aURq$lg^`RrI$I$I F`m8n=°ѐ2ń~Pjk@NlNǾU~RmmmiqJrH@⌐ $Mb``B,j_ !Jpkjs5T Rh8;WZpvYTac.pMKg>m7<Pj4Bc6Sð7Yލ, g#4XYzRG;?%JWR+m0{ *]}SqI*?JWy Y nWI#̺myjʿqS1)� kU6_r?3 O w�:ڧ;mM%軈HS(Qe$|.B5ױ_d0bPJ,FóvMNQfl[젠 D.13"TiWw_L$*Xi䰪hp.*¼Ѭ܅|ۛl9<[嗰} z!i2Uc Əo? XT~E>iW ԰=op\}n;f#ksSC)^P *r2!8[jA +2Vg8Z@d bb0̗LHj3G\;dJyD7 F=r19Hto`hU=&I 7׀iXBȏF+Łu_4?nESw[%�;g;Ԁzh!x< X̭zlQ0&cNBL IOyo$vBv%bG!B"ޭ9(4¤;R2"-O&fLPlvzVOVI}x7cN"@z|Ls4ArGͻb_˒һ4EX s1_b Ç`dj <pi< @܅ ۉZir"aΔ 8h:@dG`L{FQa=&҅t ):]/j[..kMd 0h+SBvHiںמgwGD<\+բ`:1/~?^R.~8Kg @V/GgqvAQ�l3! 1EKw[C.ǟxP+̓`>j>?Goph6u#Nr%jj "E ZՃ@90#}-mt"e#Ɨִl~i)NW=8Щ橲b˄;j@̏m&1oM$tBsXw's ^֜t02I<ϰ 48#ᶿI3eIKd|p# o~F[#J#r]=bdElTãM1N<3 rT{:JY*ilR:6-kZ zFR 9].BUaX2'i|-OLyI UqO8JPH$Z669GҰ"j=jʿqS1)`uq7G)ݫaK5{JN놼FՃ\~[K $J֦)β]Z~y$G|T4m0Hwc,�,VG/e$.x+I$Q _^RYJ5hYO=զ5(0޴ǝ*-)Y01ZAU`Aknw09 *`tU}*0K Y: [/r.e ~bdxk7jF I *s9ר (UЮDn_GG639ZXr|>q /#4;xY &DFJYt�[ Ux2*Uq JFX"qkzC+zT|`f!r} ^"bzJjk;|Pk/X\oGwc)G!P&KРB%=_HW.׆<%-6�E:y|$~,:og]2Q9410vQV6CH?b lQJ0-qT^m)ҎQ_3xkrvt~nN "qUS7 ϓ%\ˀ}`^j1 jB^dH8ygʉb=&:W}/sUG }F8𠿅Pn&d`(dEOvd1Kخb:wP8GpC�ڞ9�tWNY%D.WpKb>=T\-(po0Iq#26El]Y`4 /T5!ǺWX$唦$B3e@܂Z`~lzm9PMJ�Pn9bR" g[",_x%e-,)ule~hAU4%/LǧS}ghpV NFd %\L-yԻr|G$2뭮:/x|BH h-OAh(qV#2 XD.2JfSFږPߑ s󺧪G#\*= yh ?9, jVN r7;=T~@> n<r^.P'8z 0jI�v78Z ֒+ISaͭ[Y23-<.rE0fvB*.wWbGm" N?eALYZ=G *SyCr $cP|_4]C"n7ިROf3T"(y''(޸``{UDx5H6_/8,IG<w*|εLܻWeDGkf JHF7 Cr"ix49~LNƋ%!7ی& ?H2vܐ"==Ts&#eyBzo;^=yc\s]VHxC-mN({ K Ļ%i L}S#9?I6-x/|DG VKġk*86�J3I> *zPθUr!&v@]T$gMH3lB#zHTWchT:Ǐes7!ZoJW7 k&eg "}J=>2i{<n0kH! 4P aI SҫKG@s&%ŃBgCX mv _ܪ5i-_*H'GV' mLn0mA7 rd?>]t|sM%<oXpž / aϫ$)[uf2 瑄5qB_Ļ5dS!u"ޚ=YY �0tJ^ɉ~iR^lH5/즈;,?.Pt N'ߑvW3QY_F5ADo˽|8=,JvP=;\"=HҞV|m#"$BCJøv~J7 OUfl:~zסh]Nn-C<}sGkFô[>x D2ic09��/��� jP ���ftypjp2 ����jp2 ���Ojp2h���ihdr�����������colr��������"cdef����������������������jp2cOQ�2�������������������������������R� ����\� PXX`XX`XX`XXXPPXd��Kakadu-v5.2.1� ����.�{3<xN ښlq�a!*D: 8!2ɘ+]v[ġJo]rϕ֜}MV"Q &`wʖڌ2y|ep1B&^$:0jhPTy;FJ 1)ɹaQpR&YIHw,<lǓb+%M"P"jzZMdxMd5fSW?{BcCVjf S)Ke Lx'̬~8:L|O3I !!gw^zyYMGK߾&\/wu!7iya6<z>>B0€&ԀeZF yS;Wl�< äP1"�0*2ǩAI$/`8G,?0CP4M:2cJ'*M[3;1fjց:8"M(_Z;^W=CZ&+i-pg9cW ܃d3'?pƭZ.4U8 +t`T&Z!yr:arHi= ņ8<8Pd+slMMTE.{T/̔= QY*TJ4e siZ$tXMv+OByJ>OhYaw8*k.+=E r0YXf4K<\ pc2MolY!caظ7܁: kC 2&t8w:p\Fxj:.C$ | 8�כ(X{H.ǂm$6Cr-iwyNAUucύr8T&q_ b[Ͻ%?;8,:��+쬨(iȾM*s9#ǭ^d?in x]hP}qՠiOUñAMsq\A<)ꎦW$ @7@MцK-=ƼA=<u{INMz`ΞO/Xv8܅eKD8f~\e:&$3 ,AU]J߹vKh'qh^C(\JmxUk*9[1ҊONhz: ffSQoG}-{]wاd9p<4| ҏuC^<_QNO)'nvZQ ( l+>󬰿s}y/l{?$=v;zʅ}2| -@8Ĭy"K4ƧO+̈́XH?ik?v]0O[q8a$׷xL# -L?JKp6+KRM6$2#\o,/noEn @�:kBzN;/Coڷb~]'m~>18LV20B&ʈ>C4-[^V E@ DI/U|$.-FEܯ<]PQ�7@H=B1I 7 HeoR*/,up�\HjL:+uO"ZjD @2EWacJRT-'SxVX-%α {7Kٱ?ݢ}N gvI6,i42!獌DUI4I%P6^ |S*m~2/ 9�Y0U@@L�>dV $; U 5FzZzF<{e{ yu|8å>J`fGx8ڡ-*nPV< qt1 A0r5폟u+b2U )XZ3!ɘ^Xr;Eqwy=2jLQ7W5|htaJ~e/~  ]/qmkDYQԄ]Ix̨\ͺd 3}1DWU m'}rK: IK_0u;I�;Lĵ[rJyn.f'.YVlyLkOaHvg;ZmZa+:ZWΕq'@H0Rjx[WM|:aXNLLGTJpE;_-vuVnEU7#*O<<%d{jd0/RQ/iܬߴ|# Z~')q\! ؆8]n'bbýwc[#T[07 {d {/hi.5&j v7,"ђXϜ܁Sl ("ջ2I}fpBZ8U[fIn)b o`<G⇕"qoc(|fs1k !:ٲvB0+Fe id:b2/ix_c۳Rnp `B\hݵ@1Bdi uX*yiďOFQE?T'X޿LZh=3h&/i6PI.) my+ӞURV±  /(m7 @A 6 $sFv(HAx*I5~!F7_ЫcW!52lnIbP2VE ?ʺhm*jY?{D$.Jso~&7{ň KtPoڠ7q r-x=3UÉR0YØDz A:Hc?hL ;ު88KVwפ|G po4VRk;AϬǠ ID@~S'3l7ݛ:~-9! e>ks +S{Śk+KCaKb1g vlVDMa(1l!|BfP^&CN 'g}yV)-3 m`UX2QT^a GnΆZm]1ܷ=n|qY°SŸIȃ<Jpkmۧy-{{S ڋRR1ШxemS eӦA#k@-WB0r'z/ciTk?.ndHHt1Z }>l1#9D(kD #VrݧfVD%%KOyW<7 WSLk\Qс&U p/ ID}wTjӢ?hAa˝a-AkK|GhNQwh;| E9qUl/fwAY,Ѽez?WuPca+߄Ol? 9asSRZⒺɬssq}R'$;TN0o"YD?49X懗 hކRjHĮR]]u+TЇܘ;66?a]%}.ƛ~m@Xĭ$t㦿Q|6/5�C,d DXEs4r!;"^&5 ceoL} H`Btw쨾{pA`0d6yJG_hD!ƅ& FډfK1mS#N$LB7ڲc?(Sm(0n h]1wrףq,!f-#?BTA*eP';$cA#M.z4U +T (= DRO1Ie|Cx%+ar3ZGҐy W+udEE}xv,eb{d^V�780ri}]=O2F704Jv*>FqtJ7wi㜱7"_ WgHp8HqRZw&]`>"A .IñZV@$VvN]=V6ʈ{L,]hƟ||80 ;POPB97^~RE~& 0;CY+^e\m~MBMP/d9Υx@?#{PI~G_?+oN`Q"ػ{ةh_K(,PuuE%j 7˦ 5FOKEla c. } ,3+BA!Kaaa-i~Eۼs'^{3h[E Nt^'Ϸ͡{c'Zv6b5¤@1vүZBg^c/TgWYV 5+TcS3`vo:BN f %[}p!yXw*AlR [F:Y0,\A)x(7Qytyd_ނ%$ZliE<{+%Iz8UM(M/^XLkx[ʟz\#Q,Ieu#PAsʎs"\F"ݳ$DJwiˣF{C[!}0=Xܹ)_ӰllsXA$i 5򩓺E\_ɟ; ֙n�b[po[h)zv�}@N;s] h6T !\NMI<ys=bZSu^D EU?d+NtqkGڙPǽgmjo: bHBf;c"FT k!9j=H+{xFH9Wkd«&̛Rh(b%@Xllո\<!VRa 2#ɣ(wIqڝR=\IWԐvdїLfr~n?0} ڑN??R x9!.NĀCW $CyWDbilӑ (_1܊+]^$7*\J0/r[/',;ĈRHlfݏXcK ( =fYLxbf!V8-[%jymY7a+6_;JrTpp1N0gnՒ~'D (byp�1g|.Q3 >Lå&1d/Z2Viacmx:K Z\ԫqꙸv1dkg,j 26"y_Wõg{GD:ZIªX}uxZ:?יe ]ڨ9OZ0ԏUyD}9 !Nήuz3JN (#g[HՋܫR:}?/lz (=@z7~eԃeMTm;Ba)e_GKڱP kMĎQO6B|F'I2�3=S.p-' Ӟ©s l1Pn_$eWc{�pmvb,77Q|EV*Db:ڝ)dҥ++:|CZ)9m Nwc&3@:iap(=F KCx\'-C<'(I_]"jo|_8@u:mM-dOpz:�5XO}>w!PdKBQJ[bUL c,Nނa@MoEc%:Ժ1D_a%aMUUnԔ>j3"LV rcml`q SI*a]1ڧ ,zEK$-f[= E|X뿦1;$:yp K9;f~@?v5bkOxUK4~ԀdOxYk5#p2!2doJ!{l$\@\NޮVQPݍ8C/=jk``iw+DA6)eS DeqH;7B3s}q(hƍc<dF_zւ"?ȇ}L(ʧ{tn"e$#Q *R!stJ|Gd2IArkiׇ^OSF6V-BEsҞBնsy$ h_̉e֝3IX \̉p\n`d�-P[J}/O.]bzrlow=z vmbTQ0(KhnDHv ս)N-[U}5дu`#?T AUV.ؼdW[@l7v`B֎ ‡GyEy'8saGMo4emuUdқ 7E|<[|T 5zќ8l]{`owODŅݤifTIP޺]|�A:Ɏ>Ӌ3+vQ%VYZ/7V[쁦.$l]갯CN')zXke$I8t7rDJ qs;k-ﱧG=HA3̻/r8` TI RATlo5k;j P^OKSouk#ӃruTHO>1{^g?pl%}b8 ._1MvMB Jjnx@ A"CC yRD!jURE~صo׽�:\^4YF޽B@A#RRc)j:5> IU y$xɑ{ D6ԙ;;S,l/ao}�]ɐKzSy_ZsA.lb QBKMw'[?0l&_/_�^(aG$8v'uY2YaY^9# ܲq*wv!+Tz],ʞRTݔ094K7( B̘O+^_KI b ZF`QuU33UZb{H* %C&Qe?Lѧ0v|l͒gGusKxb({5L;W�7H=NN5F`��zibThqto^ ;f���*^j}y*겺ʀGwХUGcBia*: Nj¨~PC<!V@7Q2!YÉ؞g]cXvI\48Ze:�) R'_:5* ?cߔZ-WƃrD,E}Z2+~EklQSChi?`(+rU{frD$/鄕ʬp Y# -ecO'l?ٻ;N7s(x x66YsIr/<5[W)2a+.i*5S OaܪxUuI8H 0z6u0Y@jOGJ�8z)Cx6F/ZoBUUUUj@XM~u 5 T#7)6mmmH6NI$aURq$lg^`RrI$I$I F`m8n=°ѐ2ń~Pjk@NlNǾU~RmmmiqJrH@⌐ $Mb``B,j_ !Jpkjs5T Rh8;WZpvYTac.pMKg>m7<Pj4Bc6Sð7Yލ, g#4XYzRG;?%JWR+m0{ *]}SqI*?JWy Y nWI#̺myjʿqS1)� kU6_r?3 O w�:ڧ;mM%軈HS(Qe$|.B5ױ_d0bPJ,FóvMNQfl[젠 D.13"TiWw_L$*Xi䰪hp.*¼Ѭ܅|ۛl9<[嗰} z!i2Uc Əo? XT~E>iW ԰=op\}n;f#ksSC)^P *r2!8[jA +2Vg8Z@d bb0̗LHj3G\;dJyD7 F=r19Hto`hU=&I 7׀iXBȏF+Łu_4@7+z/z2 _uп";gݯ�zh!x< X̭zlQ0&cNBL IOyo$vBv%bG!B"ޭ9(4¤;R2"-O&fLPlvzVOVI}x7cN"@z|Ls4ArGͻb_˒һ4EX s1_b Ç`dj <pi< @܅ ۉZir"aΔ 8h:@dG`L{FQa=&҅t ):]/j[..kMd 0h+SBvHiںמgwGD<\+բ`:1/~?^R.~8Kg @V/GgqvAQ�l3! 1EKw[C.ǟxP+̓`>j>?Goph6u#Nr%jj "E ZՃ@90#}-mt"e#Ɨִl~i)NW=8Щ橲b˄;j@̏m&1oM$tBsXw's ^֜t02I<ϰ 48#ᶿI3eIKd|p# o~F[#J#r]=bdElTãM1N<3 rT{:JY*ilR:6-kZ zFR 9].BUaX2'i|-OLyI UqO8JPH$Z669GҰ"j=jʿqS1)`uq7G)ݫaK5{JN놼FՃ\~[K $J֦)β]Z~y$G|T4m0Hwc,�,VG/e$.x+I$Q _^RYJ5hYO=զ5(0޴ǝ*-)Y01Z@>۠_tMDݺmpd@n09 *`tU}*0K Y: [/r.e ~bdxk7jF I *s9ר (UЮDn_GG639ZXr|>q /#4;xY &DFJYt�[ Ux2*Uq JFX"qkzC+zT|`f!r} ^"bzJjk;|Pk/X\oGwc)G!P&KРB%=_HW.׆<%-6�E:y|$~,:og]2Q9410vQV6CH?b lQJ0-qT^m)ҎQ_3xkrvt~nN "qUS7 ϓ%\ˀ}`^j1 jB^dH8ygʉb=&:W}O/M/"]~9ePK(Pn&d`(dEOvd1Kخb:wP8GpC�ڞ9�tWNY%D.WpKb>=T\-(po0Iq#26El]Y`4 /T5!ǺWX$唦$B3e@܂Z`~lzm9PMJ�Pn9bR" g[",_x%e-,)ule~hAU4%/LǧS}ghpV NFd %\L-yԻr|G$2뭮:/x|BH h-OAh(qV#2 XD.2JfSFږPߑ s󺧪G#\*= yh ?9, jVN r7;=T~@> n<r^.P'8z 0jI�v78Z ֒+ISaͭ[Y23-<.rE0fvB*.wWbGm" N?eALYZ=G *SyCr $cP|_4]C"n7ިROf3T"(y''(޸``{UDx5H6_/8,IG<w*|εLܻWeDGkf JHF7 Cr"ix49~LNƋ%!7ی& ?H2vܐ"==Ts&#eyBzo;^=yc\s]VHxC-mN({ K Ļ%i L}S#9?I6-x/|DG VKġk*86�J3I> *zPθUr!&v@]T$gMH3lB#zHTWchT:Ǐes7!ZoJW7 k&eg "}J=>2i{<n0kH! 4P aI SҫKG@s&%ŃBgCX mv _ܪ5i-_*H'GV' mLn0mA7 rd?>]t|sM%<oXpž / aϫ$)[uf2 瑄5qB_Ļ5dS!u"ޚ=YY �0tJ^ɉ~iR^lH5/즈;,?.Pt N'ߑvW3QY_F5ADo˽|8=,JvP=;\"=HҞV|m#"$BCJøv~J7 OUfl:~zסh]Nn-C<}sGkFô[>x D2icnV��� B����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/xca.ico�������������������������������������������������������������������������������0000664�0000000�0000000�00000004276�11753427512�0014423�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������(��� ���@�����������������������������_�GCB�HCC�JFE�LGF�MIH�NIH�TON�TOO�TPO�UPO�VQP�XSR�\UU�ZVT�[VU�\VU�[WV�`\[�b\[�c]]�e^]�e_^�f`_�ga`�fba�hba�icb�jdc�kfe�lfe�mge�nhf�ohg�mih�pih�qji�pkj�qkj�qlk�slk�smk�tmk�unm�ton�wpn�wpo�xqo�xqp�yrp�yrq�wsq�ysq�zsq�ysr�{sr�{tr�{ts�|us�{ut�{vt�}vt�~vt�~wu�}xv�~xv�}xw�xw�yw�yx�zx�{y�|{�}{�}|�~�~�~���������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv����������������������vvvvvvvv��������������������������vvvvvv��������������������������vvvvv����uu���uu��uuu��u����u����vvvv�����u���u��u���u�u����u����vvvv������u�u���u�����uuuuuu����vvvv�������u����u�����u����u����vvvv������u�u���u�����u����u����vvvv�����u���u��u���u�u����u����vvvv����uu���uu��uuu���uuuu�����vvvvv��������������������������vvvvvv��������������������������vvvvvvvv����������������������vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv+7>+vvvvvvvvvvvvvvvvvvvvvvvvvCkppppmU4vvvvvvvvvvvvvvvvvvvvvvWopdGhpppl9vvvvvvvvvvvvvvvvvvvvUoppC Tpopp^vvvvvvvvvvvvvvvvvvv$l]bpD/FUppj:vvvvvvvvvvvvvvvvv(#D?*ppp[PfHKKKKKKKKKKKKHvvvvv&)ppp`O\\\\\\\\\\\\\\Z3v vvvvF2ppp`_qssssssssssssrqi vv E0ppp`XiaSXcHNVHHVB6;@,vLIIbY1- 5ppkA<tJ'v"v%vvvvvvvQoopGRekppYvvvvvvvvvvvvvvvvvvvv1hpp]MlppnUvvvvvvvvvvvvvvvvvvvvv.epppppgEvvvvvvvvvvvvvvvvvvvvvvvv5=?8!vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv��������������������������?����p��x���0���� ??����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/img/xdb.ico�������������������������������������������������������������������������������0000664�0000000�0000000�00000010276�11753427512�0014422�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��� ������(��� ���@���� �����������������������������������������EeuWxW~jjtJetGlWxj`W~Eeu>^nEk}V}etz<[k<asOu\WxKq>^nQwdt~<[kAaqLrOuLx<asLx]o<[k;ZjEeu>dv;ZjLxetz2Pe'DX(Ka/M]Sy]p/M]#?S'DXQw]p~'DX#?SLxatUWV')(#%$ LxetzTVU')(')(#%$  Qw]pced9;:9;:/20 ����������Lx]ogihHJIACA9;:�� #!��������QwctcedHJIHJI #%$����Ou]owcedRTSGIH #!����(+)LxctwgihUWV#%$����GIHLx]tced���� gihcwnjzJZe���� Jetknl ��ORPRTS�� 475����ced��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/�������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11753427512�0013310�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/.gitignore���������������������������������������������������������������������������0000664�0000000�0000000�00000000005�11753427512�0015273�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������*.qm ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/Makefile�����������������������������������������������������������������������������0000664�0000000�0000000�00000001510�11753427512�0014745�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ifeq ($(TOPDIR),) TOPDIR=.. BUILD=.. endif include $(TOPDIR)/Rules.mak PO_LANGUAGES=es tr fr LANGUAGES=de ru $(PO_LANGUAGES) QM_XCA=$(patsubst %, xca_%.qm, $(LANGUAGES)) QM_QT=$(patsubst %, qt_%.qm, $(LANGUAGES)) TS_XCA=$(patsubst %, xca_%.ts, $(PO_LANGUAGES)) lang all: $(QM_XCA) %.qm: %.ts @$(PRINT) " LANG [$(BASENAME)] $@" $(LRELEASE) -silent $< -qm $@ install: $(QM_XCA) install -m 755 -d $(destdir)$(prefix)/share/xca install -m 644 $(QM_XCA) $(destdir)$(prefix)/share/xca app: mkdir -p $(APPDIR)/Resources install -m 644 $(QM_XCA) $(APPDIR)/Resources cd $(TRANSLATIONS) && \ for x in $(QM_QT); do \ test -f "$$x" && install $$x $(APPDIR)/Resources;\ done || : po2ts: $(TS_XCA) xca_%.ts.xml: %.po po2ts -i $< > $(@) xca_%.ts: indent.xslt xca_%.ts.xml xsltproc -o $@ $^ xca.pot: xca.ts ts2po -P $< $@ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/es.po��������������������������������������������������������������������������������0000664�0000000�0000000�00000141073�11753427512�0014265�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-05-02 06:51+0200\n" "PO-Revision-Date: 2012-04-01 01:28+0000\n" "Last-Translator: Fitoschido <fitoschido@gmail.com>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-04-07 05:36+0000\n" "X-Generator: Launchpad (build 15060)\n" "Language: \n" #: About#1 msgid "Done" msgstr "Hecho" #: CaProperties#1 msgid "CA Properties" msgstr "Propiedades de la CA" #: CaProperties#2 msgid "Use random Serial numbers" msgstr "Usar números de Serie aleatorios" #: CaProperties#3 msgid "Days until next CRL issuing" msgstr "" #: CaProperties#4 msgid "Default template" msgstr "Plantilla predeterminada" #: CaProperties#5 msgid "Next serial for signing" msgstr "" #: CertDetail#1 msgid "Details of the Certificate" msgstr "Detalles del Certificado" #: CertDetail#2 msgid "S&tatus" msgstr "Estado" #: CertDetail#3 msgctxt "CertDetail#3" msgid "Serial" msgstr "Número de serie" #: CertDetail#4 msgid "The serial number of the certificate" msgstr "El número de serie del certificado" #: CertDetail#5 msgid "The internal name of the certificate in the database" msgstr "El nombre interno del certificado en la base de datos" #: CertDetail#6 msgctxt "CertDetail#6" msgid "Internal name" msgstr "Nombre interno" #: CertDetail#7 msgctxt "CertDetail#7" msgid "Signature algorithm" msgstr "Firma" #: CertDetail#8 msgctxt "CertDetail#8" msgid "Signature" msgstr "Firma" #: CertDetail#9 msgctxt "CertDetail#9" msgid "Key" msgstr "Clave" #: CertDetail#10 msgid "Fingerprints" msgstr "Huellas digitales" #: CertDetail#11 msgid "SHA1" msgstr "SHA1" #: CertDetail#12 msgid "MD5" msgstr "MD5" #: CertDetail#13 msgid "A SHA-1 hashsum of the certificate" msgstr "" #: CertDetail#14 msgid "An md5 hashsum of the certificate" msgstr "" #: CertDetail#15 msgctxt "CertDetail#15" msgid "Validity" msgstr "Validez" #: CertDetail#16 msgid "The time since the certificate is valid" msgstr "El momento desde el que el certificado es válido" #: CertDetail#17 msgid "The time until the certificate is valid" msgstr "El momento hasta el que el certificado es válido" #: CertDetail#18 msgid "&Subject" msgstr "As&unto" #: CertDetail#19 msgctxt "CertDetail#19" msgid "&Issuer" msgstr "" #: CertDetail#20 msgid "Attributes" msgstr "Atributos" #: CertDetail#21 msgctxt "CertDetail#21" msgid "&Extensions" msgstr "&Extensiones" #: CertDetail#22 msgid "Show config" msgstr "Mostrar configuración" #: CertDetail#23 msgid "Show extensions" msgstr "Mostrar extensiones" #: CertDetail#24 msgctxt "CertDetail#24" msgid "Not available" msgstr "No disponible" #: CertDetail#25 msgid "Details of the certificate" msgstr "Detalles del certificado" #: CertDetail#26 msgid "Signer unknown" msgstr "" #: CertDetail#27 msgid "Self signed" msgstr "" #: CertDetail#28 msgctxt "CertDetail#28" msgid "Not trusted" msgstr "No fiable" #: CertDetail#29 msgid "Trusted" msgstr "Fiable" #: CertDetail#30 msgid "Revoked: " msgstr "Revocado: " #: CertDetail#31 msgid "Not valid" msgstr "No válido" #: CertDetail#32 msgid "Valid" msgstr "Válido" #: CertDetail#33 msgid "Details of the certificate signing request" msgstr "Detalles de la solicitud" #: CertExtend#1 msgid "Certificate renewal" msgstr "Renovación de certificado" #: CertExtend#2 msgid "" "This will create a new certificate as a copy of the old one with a new " "serial number and adjusted validity values." msgstr "" #: CertExtend#3 msgctxt "CertExtend#3" msgid "Validity" msgstr "Validez" #: CertExtend#4 msgctxt "CertExtend#4" msgid "Not before" msgstr "No antes de" #: CertExtend#5 msgctxt "CertExtend#5" msgid "Not after" msgstr "No después de" #: CertExtend#6 msgctxt "CertExtend#6" msgid "Time range" msgstr "Rango de tiempo" #: CertExtend#7 msgctxt "CertExtend#7" msgid "No well-defined expiration" msgstr "" #: CertExtend#8 msgctxt "CertExtend#8" msgid "Apply" msgstr "Aplicar" #: CertExtend#9 msgctxt "CertExtend#9" msgid "Days" msgstr "Días" #: CertExtend#10 msgctxt "CertExtend#10" msgid "Months" msgstr "Meses" #: CertExtend#11 msgctxt "CertExtend#11" msgid "Years" msgstr "Años" #: CertExtend#12 msgctxt "CertExtend#12" msgid "Midnight" msgstr "Medianoche" #: CertExtend#13 msgctxt "CertExtend#13" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" #: CertExtend#14 msgid "Edit times" msgstr "" #: CertExtend#15 msgctxt "CertExtend#15" msgid "Abort rollout" msgstr "" #: CertExtend#16 msgctxt "CertExtend#16" msgid "Continue rollout" msgstr "" #: CertExtend#17 msgctxt "CertExtend#17" msgid "Adjust date and continue" msgstr "" #: CertExtend#18 msgctxt "CertExtend#18" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" #: CertView#1 msgctxt "CertView#1" msgid "There was no key found for the Certificate: " msgstr "" #: CertView#2 msgctxt "CertView#2" msgid "Import Certificate signing request" msgstr "" #: ClickLabel#1 msgid "Double click for details" msgstr "Haga doble click para obtener detalles" #: CrlDetail#1 msgid "Details of the Revocation list" msgstr "" #: CrlDetail#2 msgid "&Status" msgstr "" #: CrlDetail#3 msgid "Version" msgstr "" #: CrlDetail#4 msgctxt "CrlDetail#4" msgid "Signature" msgstr "Firma" #: CrlDetail#5 msgid "Signed by" msgstr "" #: CrlDetail#6 msgctxt "CrlDetail#6" msgid "Name" msgstr "Nombre" #: CrlDetail#7 msgid "The internal name of the CRL in the database" msgstr "" #: CrlDetail#8 msgid "issuing dates" msgstr "" #: CrlDetail#9 msgid "Next Update" msgstr "" #: CrlDetail#10 msgid "Last Update" msgstr "" #: CrlDetail#11 msgctxt "CrlDetail#11" msgid "&Issuer" msgstr "" #: CrlDetail#12 msgctxt "CrlDetail#12" msgid "&Extensions" msgstr "" #: CrlDetail#13 msgid "&Revocation list" msgstr "" #: CrlDetail#14 msgid "0" msgstr "" #: CrlDetail#15 msgctxt "CrlDetail#15" msgid "Serial" msgstr "" #: CrlDetail#16 msgctxt "CrlDetail#16" msgid "Revocation" msgstr "" #: CrlDetail#17 msgid "Reason" msgstr "" #: CrlDetail#18 msgid "Invalidation" msgstr "" #: CrlDetail#19 msgid "Failed" msgstr "" #: CrlDetail#20 msgid "Unknown signer" msgstr "" #: CrlDetail#21 msgid "Verification not possible" msgstr "" #: CrlDetail#22 msgid "Unknown certificate" msgstr "" #: ExportCert#1 msgid "X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )" msgstr "" #: ExportCert#2 msgid "" "DER is a binary format of the Certificate\n" "PEM is a base64 encoded Certificate\n" "PKCS#7 is an official Certificate exchange format\n" "PKCS#12 is an encrypted official Key-Certificate exchange format\n" msgstr "" #: ExportCert#3 msgid "Please enter the filename for the certificate." msgstr "" #: ExportCert#4 msgid "Certificate export" msgstr "" #: ExportDer#1 msgctxt "ExportDer#1" msgid "All files ( * )" msgstr "" #: ExportDer#2 msgid "" "DER is a binary format\n" "PEM is a base64 encoded DER file\n" msgstr "" #: ExportDialog#1 msgid "..." msgstr "..." #: ExportDialog#2 msgid "Filename" msgstr "" #: ExportDialog#3 msgid "Please enter the filename" msgstr "" #: ExportDialog#4 msgid "Export Format" msgstr "" #: ExportDialog#5 msgid "The file: '%1' already exists!" msgstr "" #: ExportDialog#6 msgid "Overwrite" msgstr "" #: ExportDialog#7 msgid "Do not overwrite" msgstr "" #: ExportKey#1 msgid "When exporting the private key it should be encrypted." msgstr "" #: ExportKey#2 msgid "When exporting the private part, it should be encrypted." msgstr "" #: ExportKey#3 msgid "E&xport the private part of the Key too" msgstr "" #: ExportKey#4 msgid "Export as PKCS#8" msgstr "" #: ExportKey#5 msgid "&Encrypt the Key with a password" msgstr "" #: ExportKey#6 msgid "Private keys ( *.pem *.der *.pk8 );;All files ( * )" msgstr "" #: ExportKey#7 msgid "" "DER is a binary format of the key without encryption\n" "PEM is a base64 encoded key with optional encryption\n" "PKCS#8 is an encrypted official Key-exchange format" msgstr "" "DER es un formato binario sin cifrado\n" "PEM es un formato texto bas64 con cifrado opcional\n" "PKCS#8 es un formato estandar de intercambio de claves" #: ExportKey#8 msgid "Please enter the filename for the key." msgstr "Introduzca nombre de fichero que contendrá la clave." #: ExportKey#9 msgid "Public key export" msgstr "" #: ExportKey#10 msgid "Key export" msgstr "Exportar clave" #: Help#1 msgid "<<" msgstr "" #: Help#2 msgid ">>" msgstr "" #: Help#3 msgctxt "Help#3" msgid "&Done" msgstr "" #: ImportMulti#1 msgid "Import PKI Items" msgstr "" #: ImportMulti#2 msgid "Import &All" msgstr "" #: ImportMulti#3 msgctxt "ImportMulti#3" msgid "&Import" msgstr "" #: ImportMulti#4 msgctxt "ImportMulti#4" msgid "&Done" msgstr "" #: ImportMulti#5 msgid "&Remove from list" msgstr "" #: ImportMulti#6 msgid "Details" msgstr "" #: ImportMulti#7 msgid "Delete from token" msgstr "" #: ImportMulti#8 msgid "Rename on token" msgstr "" #: ImportMulti#9 msgid "" "\n" "Name: %1\n" "Model: %2\n" "Serial: %3" msgstr "" #: ImportMulti#10 msgid "Manage security token" msgstr "" #: ImportMulti#11 msgid "The type of the Item '%1' is not recognized" msgstr "" #: ImportMulti#12 msgid "Details of the item '%1' cannot be shown" msgstr "" #: ImportMulti#13 msgid "The type of the item '%1' is not recognized" msgstr "" #: ImportMulti#14 msgid "The file '%1' did not contain PKI data" msgstr "" #: ImportMulti#15 msgid "The %1 files: '%2' did not contain PKI data" msgstr "" #: KeyDetail#1 msgctxt "KeyDetail#1" msgid "Name" msgstr "Nombre" #: KeyDetail#2 msgid "The internal name of the key used by xca" msgstr "" #: KeyDetail#3 msgctxt "KeyDetail#3" msgid "Security token" msgstr "" #: KeyDetail#4 msgid "Manufacturer" msgstr "" #: KeyDetail#5 msgctxt "KeyDetail#5" msgid "Serial" msgstr "" #: KeyDetail#6 msgctxt "KeyDetail#6" msgid "Key" msgstr "" #: KeyDetail#7 msgid "Public Exponent" msgstr "Exponente público" #: KeyDetail#8 msgctxt "KeyDetail#8" msgid "Keysize" msgstr "Tamaño de clave" #: KeyDetail#9 msgid "Private Exponent" msgstr "Exponente secreto" #: KeyDetail#10 msgid "Modulus" msgstr "Módulo" #: KeyDetail#11 msgid "Details of the %1 key" msgstr "" #: KeyDetail#12 msgctxt "KeyDetail#12" msgid "Not available" msgstr "Disponible" #: KeyDetail#13 msgid "Token" msgstr "" #: KeyDetail#14 msgid "Security token ID:%1" msgstr "" #: KeyDetail#15 msgid "Available" msgstr "Disponible" #: KeyDetail#16 msgid "Sub prime" msgstr "" #: KeyDetail#17 msgid "Public key" msgstr "" #: KeyDetail#18 msgctxt "KeyDetail#18" msgid "Private key" msgstr "Exponente secreto" #: KeyDetail#19 msgid "Curve name" msgstr "" #: KeyDetail#20 msgid "Unknown key" msgstr "" #: MainWindow#1 msgid "Private Keys" msgstr "" #: MainWindow#2 msgid "&New Key" msgstr "" #: MainWindow#3 msgid "&Export" msgstr "" #: MainWindow#4 msgctxt "MainWindow#4" msgid "&Import" msgstr "Importar" #: MainWindow#5 msgid "Import PFX (PKCS#12)" msgstr "" #: MainWindow#6 msgid "&Show Details" msgstr "" #: MainWindow#7 msgid "&Delete" msgstr "" #: MainWindow#8 msgid "Certificate signing requests" msgstr "" #: MainWindow#9 msgid "&New Request" msgstr "" #: MainWindow#10 msgid "Certificates" msgstr "" #: MainWindow#11 msgid "&New Certificate" msgstr "" #: MainWindow#12 msgid "Import &PKCS#12" msgstr "" #: MainWindow#13 msgid "Import P&KCS#7" msgstr "" #: MainWindow#14 msgctxt "MainWindow#14" msgid "Plain View" msgstr "" #: MainWindow#15 msgid "Templates" msgstr "" #: MainWindow#16 msgid "&New template" msgstr "" #: MainWindow#17 msgid "Ch&ange Template" msgstr "" #: MainWindow#18 msgid "Revocation lists" msgstr "" #: MainWindow#19 msgid "" "Using or exporting private keys will not be possible without providing the " "correct password" msgstr "" #: MainWindow#20 msgid "Database" msgstr "" #: MainWindow#21 msgid "No deleted items found" msgstr "" #: MainWindow#22 msgid "&File" msgstr "" #: MainWindow#23 msgid "&New DataBase" msgstr "" #: MainWindow#24 msgid "&Open DataBase" msgstr "" #: MainWindow#25 msgid "Generate DH parameter" msgstr "" #: MainWindow#26 msgid "Set as default DataBase" msgstr "" #: MainWindow#27 msgid "&Close DataBase" msgstr "" #: MainWindow#28 msgid "&Dump DataBase" msgstr "" #: MainWindow#29 msgid "C&hange DataBase password" msgstr "" #: MainWindow#30 msgid "&Import old db_dump" msgstr "" #: MainWindow#31 msgid "&Undelete items" msgstr "" #: MainWindow#32 msgid "Options" msgstr "" #: MainWindow#33 msgid "Exit" msgstr "" #: MainWindow#34 msgid "I&mport" msgstr "" #: MainWindow#35 msgid "Keys" msgstr "" #: MainWindow#36 msgid "Requests" msgstr "" #: MainWindow#37 msgid "PKCS#12" msgstr "" #: MainWindow#38 msgctxt "MainWindow#38" msgid "PKCS#7" msgstr "" #: MainWindow#39 msgctxt "MainWindow#39" msgid "Template" msgstr "" #: MainWindow#40 msgid "Revocation list" msgstr "" #: MainWindow#41 msgid "PEM file" msgstr "" #: MainWindow#42 msgid "paste PEM file" msgstr "" #: MainWindow#43 msgid "&Token" msgstr "" #: MainWindow#44 msgid "&Manage Security token" msgstr "" #: MainWindow#45 msgid "&Init Security token" msgstr "" #: MainWindow#46 msgid "&Change PIN" msgstr "" #: MainWindow#47 msgid "Change &SO PIN" msgstr "" #: MainWindow#48 msgid "Init PIN" msgstr "" #: MainWindow#49 msgid "&Help" msgstr "" #: MainWindow#50 msgid "&Content" msgstr "" #: MainWindow#51 msgid "&About" msgstr "" #: MainWindow#52 msgid "Donations" msgstr "" #: MainWindow#53 msgid "Database dump ( *.dump );;All files ( * )" msgstr "" #: MainWindow#54 msgid "Import password" msgstr "" #: MainWindow#55 msgid "Please enter the password of the old database" msgstr "" #: MainWindow#56 msgid "Password verification error. Ignore keys ?" msgstr "" #: MainWindow#57 msgid "Import anyway" msgstr "" #: MainWindow#58 msgctxt "MainWindow#58" msgid "Cancel" msgstr "Cancelar" #: MainWindow#59 msgid "no such option: %1" msgstr "" #: MainWindow#60 msgid "Import PEM data" msgstr "" #: MainWindow#61 msgid "Please enter the original SO PIN (PUK) of the token '%1'" msgstr "" #: MainWindow#62 msgid "Please enter the new SO PIN (PUK) of the token '%1'" msgstr "" #: MainWindow#63 msgid "The new label of the token '%1'" msgstr "" #: MainWindow#64 msgid "The token '%1' did not contain any keys or certificates" msgstr "" #: MainWindow#65 msgid "New Password" msgstr "" #: MainWindow#66 msgid "" "Please enter the new password to encrypt your private keys in the database-" "file" msgstr "" #: MainWindow#67 msgid "" "Please enter a password, that will be used to encrypt your private keys in " "the database file:\n" "%1" msgstr "" #: MainWindow#68 msgid "Password verify error, please try again" msgstr "Contraeña incorrecta, inténtelo de nuevo" #: MainWindow#69 msgctxt "MainWindow#69" msgid "Password" msgstr "Contraseña" #: MainWindow#70 msgid "" "Please enter the password for unlocking the database:\n" "%1" msgstr "" #: MainWindow#71 msgid "The following error occured:" msgstr "" #: MainWindow#72 msgid "Copy to Clipboard" msgstr "" #: MainWindow#73 msgid "" "Diffie-Hellman parameters are needed for different applications, but not " "handled by XCA.\n" "Please enter the DH parameter bits" msgstr "" #: MainWindow#74 msgctxt "MainWindow#74" msgid "Error opening file: '%1': %2" msgstr "" #: NewCrl#1 msgid "Create CRL" msgstr "" #: NewCrl#2 msgid "Dates" msgstr "" #: NewCrl#3 msgid "last update" msgstr "" #: NewCrl#4 msgid "next update" msgstr "" #: NewCrl#5 msgctxt "NewCrl#5" msgid "Days" msgstr "" #: NewCrl#6 msgctxt "NewCrl#6" msgid "Months" msgstr "" #: NewCrl#7 msgctxt "NewCrl#7" msgid "Years" msgstr "" #: NewCrl#8 msgctxt "NewCrl#8" msgid "Midnight" msgstr "" #: NewCrl#9 msgctxt "NewCrl#9" msgid "Apply" msgstr "" #: NewCrl#10 msgid "Hashing algorithm" msgstr "" #: NewCrl#11 msgctxt "NewCrl#11" msgid "Extensions" msgstr "" #: NewCrl#12 msgid "Authority key identifier" msgstr "" #: NewCrl#13 msgid "Subject alternative name" msgstr "" #: NewCrl#14 msgid "CRL Number" msgstr "" #: NewCrl#15 msgid "Revokation reasons" msgstr "" #: NewKey#1 msgid "New key" msgstr "" #: NewKey#2 msgid "Please give a name to the new key and select the desired keysize" msgstr "" #: NewKey#3 msgid "Key properties" msgstr "" #: NewKey#4 msgctxt "NewKey#4" msgid "Name" msgstr "Nombre" #: NewKey#5 msgid "The internal name of the new key" msgstr "" #: NewKey#6 msgctxt "NewKey#6" msgid "New Key" msgstr "Nueva clave" #: NewKey#7 msgid "Curve" msgstr "" #: NewKey#8 msgctxt "NewKey#8" msgid "Keysize" msgstr "Tamaño de clave" #: NewKey#9 msgid "Usually 1024 or 2048 bit keys are used" msgstr "" #: NewKey#10 msgid "Keytype" msgstr "" #: NewKey#11 msgctxt "NewKey#11" msgid "Create" msgstr "" #: NewX509#1 msgctxt "NewX509#1" msgid "Create" msgstr "" #: NewX509#2 msgid "Source" msgstr "" #: NewX509#3 msgid "Signing request" msgstr "" #: NewX509#4 msgid "" "A certificate signing request can be signed, even if the private key of the " "request is not available. This is the intention of a CSR:\n" "Getting signed by a CA certificate, whoes certificate of course must be in " "the database\n" "Of course you need the private key of the CSR if you want to create a self-" "signed cert from it." msgstr "" #: NewX509#5 msgid "Show request" msgstr "" #: NewX509#6 msgid "Sign this Certificate signing &request" msgstr "" #: NewX509#7 msgid "Copy extensions from the request" msgstr "" #: NewX509#8 msgid "Modify subject of the request" msgstr "" #: NewX509#9 msgid "Signing" msgstr "" #: NewX509#10 msgid "Create a &self signed certificate with the serial" msgstr "" #: NewX509#11 msgid "If you leave this blank the serial 00 will be used" msgstr "" #: NewX509#12 msgid "1" msgstr "" #: NewX509#13 msgid "Use &this Certificate for signing" msgstr "" #: NewX509#14 msgid "All certificates in your database that can create valid signatures" msgstr "" #: NewX509#15 msgid "" "This list contains all certificates with the CA-flag set to true and whoes " "private key is present in the key-database.\n" "If this list is disabled, you only can create a self-signed certificate." msgstr "" #: NewX509#16 msgctxt "NewX509#16" msgid "Signature algorithm" msgstr "Firma" #: NewX509#17 msgid "Template for the new certificate" msgstr "" #: NewX509#18 msgid "All available templates" msgstr "" #: NewX509#19 msgid "This list contains all templates from the toplevel template Tab" msgstr "" #: NewX509#20 msgid "Apply extensions" msgstr "" #: NewX509#21 msgid "Apply subject" msgstr "" #: NewX509#22 msgid "Apply all" msgstr "" #: NewX509#23 msgctxt "NewX509#23" msgid "Subject" msgstr "Sujeto" #: NewX509#24 msgid "Organisation" msgstr "" #: NewX509#25 msgid "" "This name is only used internally and does not appear in the resulting " "certificate" msgstr "" #: NewX509#26 msgid "Must be exactly 2 letter of size (DE, UK)" msgstr "" #: NewX509#27 msgid "Country code" msgstr "" #: NewX509#28 msgid "State or Province" msgstr "" #: NewX509#29 msgid "Locality" msgstr "" #: NewX509#30 msgid "Organisational unit" msgstr "" #: NewX509#31 msgid "E-Mail address" msgstr "" #: NewX509#32 msgctxt "NewX509#32" msgid "Internal name" msgstr "" #: NewX509#33 msgid "Common name" msgstr "" #: NewX509#34 msgctxt "NewX509#34" msgid "Add" msgstr "" #: NewX509#35 msgctxt "NewX509#35" msgid "Delete" msgstr "" #: NewX509#36 msgctxt "NewX509#36" msgid "Private key" msgstr "Exponente secreto" #: NewX509#37 msgid "This list only contains unused keys" msgstr "" #: NewX509#38 msgid "Used keys too" msgstr "" #: NewX509#39 msgid "&Generate a new key" msgstr "" #: NewX509#40 msgctxt "NewX509#40" msgid "Extensions" msgstr "" #: NewX509#41 msgid "Basic constraints" msgstr "" #: NewX509#42 msgctxt "NewX509#42" msgid "Type" msgstr "" #: NewX509#43 msgid "If this will become a CA certificate or not" msgstr "" #: NewX509#44 msgid "" "Set this to TRUE if you want to create a CA certificate that signs other " "certificates.\n" "This is always set to FALSE for client or server certificates. In most cases " "self-signed certificates are CA certificates.\n" "Self-signed non-CA certificates are unusual although they are possible." msgstr "" #: NewX509#45 msgid "Not defined" msgstr "" #: NewX509#46 msgid "Certification Authority" msgstr "" #: NewX509#47 msgid "End Entity" msgstr "" #: NewX509#48 msgid "Path length" msgstr "" #: NewX509#49 msgid "How much CAs may be below this." msgstr "" #: NewX509#50 msgid "" "If this is left empty the pathlen is not included in the certificate. " "Otherwise it distinguishes the count of chained CA certificates below this " "one.\n" "A pathlen of 0 means, that this certificate may not issue other sub-CA " "certificates. Although it can do it, all chain-checking algorithms in e.g. " "your browser or openssl will (should) fail." msgstr "" #: NewX509#51 msgid "The basic constraints should always be critical" msgstr "" #: NewX509#52 msgid "Key identifier" msgstr "" #: NewX509#53 msgid "Creates a hash of the key following the PKIX guidelines" msgstr "" #: NewX509#54 msgid "Copy the Subject Key Identifier from the issuer" msgstr "" #: NewX509#55 msgid "" "If this box is checked an attempt is made to copy the subject key identifier " "from the signing certificate.\n" "It also copies the issuer and serial number from the issuer certificate. " "Normally this will only be done if the keyid option fails." msgstr "" #: NewX509#56 msgctxt "NewX509#56" msgid "Validity" msgstr "Validez" #: NewX509#57 msgctxt "NewX509#57" msgid "Not before" msgstr "" #: NewX509#58 msgctxt "NewX509#58" msgid "Not after" msgstr "" #: NewX509#59 msgctxt "NewX509#59" msgid "Time range" msgstr "" #: NewX509#60 msgctxt "NewX509#60" msgid "Days" msgstr "" #: NewX509#61 msgctxt "NewX509#61" msgid "Months" msgstr "" #: NewX509#62 msgctxt "NewX509#62" msgid "Years" msgstr "" #: NewX509#63 msgctxt "NewX509#63" msgid "Apply" msgstr "" #: NewX509#64 msgid "Set the time to 00:00:00 and 23:59:59 respectively" msgstr "" #: NewX509#65 msgctxt "NewX509#65" msgid "Midnight" msgstr "" #: NewX509#66 msgctxt "NewX509#66" msgid "No well-defined expiration" msgstr "" #: NewX509#67 msgid "Authority Info Access" msgstr "" #: NewX509#68 msgid "CRL distribution point" msgstr "" #: NewX509#69 msgid "issuer alternative name" msgstr "" #: NewX509#70 msgid "URI:" msgstr "" #: NewX509#71 msgid "" "This is a multi-valued extension that supports all the literal options of " "subject alternative name. Of the few software packages that currentlyi " "nterpret this extension most only interpret the URI option.\n" "Currently each option will set a new DistributionPoint with the fullName " "field set to the given value.\n" "Other fields like cRLissuer and reasons cannot currently be set or " "displayed: at this time no examples were available that used these fields.\n" "If you see this extension with <UNSUPPORTED> when you attempt to print it " "out or it doesn't appear to display correctly then let steve know, including " "the certificate (mail steve at openssl dot org) .\n" "Examples:\n" "URI:http://www.myhost.com/myca.crl\n" "URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl" msgstr "" #: NewX509#72 msgid "can be altered by the file \"aia.txt\"" msgstr "" #: NewX509#73 msgid "Edit" msgstr "" #: NewX509#74 msgid "DNS: IP: URI: email: RID:" msgstr "" #: NewX509#75 msgid "" "The authority information access extension gives details about how to access " "certain information relating to the CA. Its syntax is accessOID;location " "where 'location' has the same syntax as subject alternative name (except " "that email:copy is not supported). accessOID can be any valid OID but only " "certain values are meaningful for example OCSP and caIssuers. OCSP gives the " "location of an OCSP responder: this is used by Netscape PSM and other " "software.\n" "\n" "Example:\n" "\n" "OCSP;URI:http://ocsp.my.host/\n" "caIssuers;URI:http://my.ca/ca.html" msgstr "" #: NewX509#76 msgid "" "The subject alternative name extension allows various literal values to be " "used. These include \"email\" (an email address) , \"URI\" a uniform " "resource indicator, \"DNS\" (a DNS domain name) , RID (a registered ID: " "OBJECT IDENTIFIER) and IP (an IP address).\n" "Examples:\n" "email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/\n" "email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld" msgstr "" #: NewX509#77 msgid "subject alternative name" msgstr "" #: NewX509#78 msgid "" "The issuer alternative name extension allows various literal values to be " "used. These include \"email\" (an email address) , \"URI\" a uniform " "resource indicator, \"DNS\" (a DNS domain name), RID (a registered ID: " "OBJECT IDENTIFIER) and IP (an IP address).\n" "Examples:\n" "email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/\n" "email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld" msgstr "" #: NewX509#79 msgid "Key usage" msgstr "" #: NewX509#80 msgid "Extended key usage" msgstr "" #: NewX509#81 msgid "Netscape" msgstr "" #: NewX509#82 msgid "CA Revocation URL" msgstr "" #: NewX509#83 msgid "Revocation URL" msgstr "" #: NewX509#84 msgid "SSL server name" msgstr "" #: NewX509#85 msgid "Certificate renewal URL" msgstr "" #: NewX509#86 msgid "Comment" msgstr "" #: NewX509#87 msgid "CA policy URL" msgstr "" #: NewX509#88 msgid "Base URL" msgstr "" #: NewX509#89 msgid "If you know a more pretty one tell me" msgstr "" #: NewX509#90 msgid "Advanced" msgstr "" #: NewX509#91 msgctxt "NewX509#91" msgid "Validate" msgstr "" #: NewX509#92 msgid "Create a &self signed certificate with a MD5-hashed QA serial" msgstr "" #: NewX509#93 msgid "Create Certificate signing request" msgstr "" #: NewX509#94 msgid "minimum size: %1" msgstr "" #: NewX509#95 msgid "maximum size: %1" msgstr "" #: NewX509#96 msgid "only a-z A-Z 0-9 '()+,-./:=?" msgstr "" #: NewX509#97 msgid "only 7-bit clean characters" msgstr "" #: NewX509#98 msgid "XCA template" msgstr "" #: NewX509#99 msgid "Create x509 Certificate" msgstr "" #: NewX509#100 msgid "From PKCS#10 request" msgstr "" #: NewX509#101 msgid "Other Tabs" msgstr "" #: NewX509#102 msgid "Advanced Tab" msgstr "" #: NewX509#103 msgid "Errors" msgstr "" #: NewX509#104 msgctxt "NewX509#104" msgid "Abort rollout" msgstr "" #: NewX509#105 msgid "The following length restrictions of RFC3280 are violated:" msgstr "" #: NewX509#106 msgid "Edit subject" msgstr "" #: NewX509#107 msgctxt "NewX509#107" msgid "Continue rollout" msgstr "" #: NewX509#108 msgid "" "The verification of the Certificate request failed.\n" "The rollout should be aborted." msgstr "" #: NewX509#109 msgid "Continue anyway" msgstr "" #: NewX509#110 msgid "" "The internal name and the common name are empty.\n" "Please set at least the internal name." msgstr "" #: NewX509#111 msgid "Edit name" msgstr "" #: NewX509#112 msgid "There is no Key selected for signing." msgstr "" #: NewX509#113 msgid "Select key" msgstr "" #: NewX509#114 msgid "" "The following distinguished name entries are empty:\n" "%1\n" "though you have declared them as mandatory in the options menu." msgstr "" #: NewX509#115 msgctxt "NewX509#115" msgid "The key you selected for signing is not a private one." msgstr "" #: NewX509#116 msgid "Select other signer" msgstr "" #: NewX509#117 msgid "Select other key" msgstr "" #: NewX509#118 msgctxt "NewX509#118" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" #: NewX509#119 msgid "Edit dates" msgstr "" #: NewX509#120 msgctxt "NewX509#120" msgid "Adjust date and continue" msgstr "" #: NewX509#121 msgctxt "NewX509#121" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" #: NewX509#122 msgid "" "The certificate will be out of date before it becomes valid. You most " "probably mixed up both dates." msgstr "" #: NewX509#123 msgid "" "The certificate contains duplicated extensions. Check the validation on the " "advanced tab." msgstr "" #: NewX509#124 msgid "Edit extensions" msgstr "" #: NewX509#125 msgid "Configfile error on line %1\n" msgstr "" #: Options#1 msgid "XCA Options" msgstr "" #: Options#2 msgid "Mandatory subject entries" msgstr "" #: Options#3 msgctxt "Options#3" msgid "Add" msgstr "" #: Options#4 msgctxt "Options#4" msgid "Delete" msgstr "" #: Options#5 msgid "Default hash algorithm" msgstr "" #: Options#6 msgid "String types" msgstr "" #: Options#7 msgid "Suppress success messages" msgstr "" #: Options#8 msgid "PKCS#11 provider" msgstr "" #: Options#9 msgid "Remove" msgstr "" #: Options#10 msgid "Printable string or UTF8 (default)" msgstr "" #: Options#11 msgid "PKIX recommendation in RFC2459" msgstr "" #: Options#12 msgid "No BMP strings, only printable and T61" msgstr "" #: Options#13 msgid "UTF8 strings only (RFC2459)" msgstr "" #: Options#14 msgid "All strings" msgstr "" #: Options#15 msgid "Load failed" msgstr "" #: PwDialog#1 msgctxt "PwDialog#1" msgid "Password" msgstr "" #: PwDialog#2 msgid "" "The password is parsed as 2-digit hex code. It must have an equal number of " "digits (0-9 and a-f)" msgstr "" #: PwDialog#3 msgid "Take as HEX string" msgstr "" #: PwDialog#4 msgid "Repeat %1" msgstr "" #: PwDialog#5 msgid "%1 missmatch" msgstr "" #: PwDialog#6 msgid "" "Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it " "must consist of an even number of characters" msgstr "" #: PwDialog#7 msgid "E&xit" msgstr "" #: QObject#1 msgid "Undefined" msgstr "" #: QObject#2 msgid "DB: Rename: '%1' already in use" msgstr "" #: QObject#3 msgid "DB: Entry to rename not found: %1" msgstr "" #: QObject#4 msgid "DB: Write error %1 - %2" msgstr "" #: QObject#5 msgid "Out of data" msgstr "" #: QObject#6 msgid "Error finding endmarker of string" msgstr "" #: QObject#7 msgid "Out of Memory at %1:%2" msgstr "" #: QObject#8 msgctxt "QObject#8" msgid "All files ( * )" msgstr "" #: QObject#9 msgid "PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;" msgstr "" #: QObject#10 msgid "Import RSA key" msgstr "" #: QObject#11 msgid "" "PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;" msgstr "" #: QObject#12 msgid "Import Request" msgstr "" #: QObject#13 msgid "Certificates ( *.pem *.der *.crt *.cer );;" msgstr "" #: QObject#14 msgid "Import X.509 Certificate" msgstr "" #: QObject#15 msgid "PKCS#7 data ( *.p7s *.p7m *.p7b );;" msgstr "" #: QObject#16 msgid "Import PKCS#7 Certificates" msgstr "" #: QObject#17 msgid "PKCS#12 Certificates ( *.p12 *.pfx );;" msgstr "" #: QObject#18 msgid "Import PKCS#12 Private Certificate" msgstr "" #: QObject#19 msgid "XCA templates ( *.xca );;" msgstr "" #: QObject#20 msgid "Import XCA Templates" msgstr "" #: QObject#21 msgid "Revocation lists ( *.pem *.der *.crl );;" msgstr "" #: QObject#22 msgid "Import Certificate Revocation List" msgstr "" #: QObject#23 msgid "XCA Databases ( *.xdb );;" msgstr "" #: QObject#24 msgid "Open XCA Database" msgstr "" #: QObject#25 msgid "PKCS#11 library ( *.dll );;" msgstr "" #: QObject#26 msgid "PKCS#11 library ( *.dylib *.so );;" msgstr "" #: QObject#27 msgid "PKCS#11 library ( *.so );;" msgstr "" #: QObject#28 msgid "Open PKCS#11 shared library" msgstr "" #: QObject#29 msgid "PEM files ( *.pem );;" msgstr "" #: QObject#30 msgid "Load PEM encoded file" msgstr "" #: QObject#31 msgid "Please enter the PIN on the PinPad" msgstr "" #: QObject#32 msgid "Please enter the SO PIN (PUK) of the token %1" msgstr "" #: QObject#33 msgid "Please enter the PIN of the token %1" msgstr "" #: QObject#34 msgid "No Security token found" msgstr "" #: QObject#35 msgid "Select" msgstr "" #: QObject#36 msgid "Please enter the new SO PIN (PUK) for the token: '%1'" msgstr "" #: QObject#37 msgid "Please enter the new PIN for the token: '%1'" msgstr "" #: QObject#38 msgid "Required PIN size: %1 - %2" msgstr "" #: QObject#39 msgid "Failed to open PKCS11 library: %1" msgstr "" #: QObject#40 msgid "PKCS#11 function '%1' failed: %2" msgstr "" #: QObject#41 msgid "" "PKCS#11 function '%1' failed: %2\n" "In library %3\n" "%4" msgstr "" #: QObject#42 msgid "Invalid" msgstr "" #: QObject#43 msgid "%1 is shorter than %2 bytes: '%3'" msgstr "" #: QObject#44 msgid "%1 is longer than %2 bytes: '%3'" msgstr "" #: Revoke#1 msgid "Revokation details" msgstr "" #: Revoke#2 msgid "Invalid since" msgstr "" #: Revoke#3 msgid "Revokation reason" msgstr "" #: SelectToken#1 msgid "Select Token" msgstr "" #: SelectToken#2 msgctxt "SelectToken#2" msgid "Security token" msgstr "" #: SelectToken#3 msgid "Please select the security token" msgstr "" #: TrustState#1 msgid "Set trustment of the Certificate" msgstr "" #: TrustState#2 msgid "Trustment" msgstr "" #: TrustState#3 msgid "&Never trust this certificate" msgstr "" #: TrustState#4 msgid "Only &trust this certificate, if we trust the signer" msgstr "" #: TrustState#5 msgid "&Always trust this certificate" msgstr "" #: Validity#1 msgid "yyyy-MM-dd hh:mm" msgstr "" #: db_base#1 msgctxt "db_base#1" msgid "Internal name" msgstr "" #: db_base#2 msgid "Reset" msgstr "" #: db_base#3 msgid "Subject entries" msgstr "" #: db_base#4 msgid "Paste PEM data" msgstr "" #: db_base#5 msgid "Columns" msgstr "" #: db_crl#1 msgid "Signer" msgstr "" #: db_crl#2 msgid "Internal name of the signer" msgstr "" #: db_crl#3 msgid "No. revoked" msgstr "" #: db_crl#4 msgid "Number of revoked certificates" msgstr "" #: db_crl#5 msgid "Last update" msgstr "" #: db_crl#6 msgid "Next update" msgstr "" #: db_crl#7 msgid "CRL number" msgstr "" #: db_crl#8 msgid "" "The revokation list already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" #: db_crl#9 msgid "CRL ( *.pem *.der *.crl )" msgstr "" #: db_crl#10 msgid "Revokation list export" msgstr "" #: db_crl#11 msgctxt "db_crl#11" msgid "Import" msgstr "Importar" #: db_crl#12 msgctxt "db_crl#12" msgid "Rename" msgstr "" #: db_crl#13 msgctxt "db_crl#13" msgid "Export" msgstr "" #: db_crl#14 msgctxt "db_crl#14" msgid "Clipboard" msgstr "" #: db_crl#15 msgctxt "db_crl#15" msgid "File" msgstr "" #: db_crl#16 msgctxt "db_crl#16" msgid "Delete" msgstr "" #: db_key#1 msgctxt "db_key#1" msgid "Type" msgstr "" #: db_key#2 msgid "Size" msgstr "" #: db_key#3 msgid "Use" msgstr "" #: db_key#4 msgctxt "db_key#4" msgid "Password" msgstr "Contraseña" #: db_key#5 msgid "" "The key is already in the database as:\n" "'%1'\n" "and is not going to be imported" msgstr "" #: db_key#6 msgid "" "The database already contains the public part of the imported key as\n" "'%1\n" "and will be completed by the new, private part of the key" msgstr "" #: db_key#7 msgid "Key size too small !" msgstr "" #: db_key#8 msgid "You are sure to create a key of the size: %1 ?" msgstr "" #: db_key#9 msgid "" "Shall the original key '%1' be replaced by the key on the token?\n" "This will delete the key '%1' and make it unexportable" msgstr "" #: db_key#10 msgctxt "db_key#10" msgid "New Key" msgstr "Nueva clave" #: db_key#11 msgctxt "db_key#11" msgid "Import" msgstr "Importar" #: db_key#12 msgctxt "db_key#12" msgid "Rename" msgstr "" #: db_key#13 msgctxt "db_key#13" msgid "Show Details" msgstr "" #: db_key#14 msgctxt "db_key#14" msgid "Delete" msgstr "" #: db_key#15 msgctxt "db_key#15" msgid "Export" msgstr "Exportar" #: db_key#16 msgid "Change password" msgstr "Cambiar contraseña" #: db_key#17 msgid "Reset password" msgstr "Restablecer la contraseña" #: db_key#18 msgid "Change PIN" msgstr "Cambiar PIN" #: db_key#19 msgid "Init PIN with SO PIN (PUK)" msgstr "" #: db_key#20 msgid "Change SO PIN (PUK)" msgstr "" #: db_key#21 msgid "Store on Security token" msgstr "" #: db_key#22 msgid "Tried to change password of a token" msgstr "" #: db_key#23 msgid "Tried to change PIN of a key" msgstr "" #: db_key#24 msgid "Tried to init PIN of a key" msgstr "" #: db_key#25 msgid "Tried to change SO PIN of a key" msgstr "" #: db_temp#1 msgctxt "db_temp#1" msgid "Type" msgstr "" #: db_temp#2 msgid "Bad template: %1" msgstr "" #: db_temp#3 msgid "Nothing" msgstr "" #: db_temp#4 msgid "Preset Template values" msgstr "" #: db_temp#5 msgid "copy" msgstr "" #: db_temp#6 msgid "Save template as" msgstr "" #: db_temp#7 msgid "XCA templates ( *.xca);; All files ( * )" msgstr "" #: db_temp#8 msgid "New Template" msgstr "" #: db_temp#9 msgctxt "db_temp#9" msgid "Import" msgstr "Importar" #: db_temp#10 msgctxt "db_temp#10" msgid "Rename" msgstr "" #: db_temp#11 msgctxt "db_temp#11" msgid "Export" msgstr "Importar" #: db_temp#12 msgid "Change" msgstr "" #: db_temp#13 msgctxt "db_temp#13" msgid "Delete" msgstr "" #: db_temp#14 msgid "Duplicate" msgstr "" #: db_temp#15 msgid "Create certificate" msgstr "" #: db_temp#16 msgid "Create request" msgstr "" #: db_x509#1 msgid "CA" msgstr "" #: db_x509#2 msgid "reflects the basic Constraints extension" msgstr "" #: db_x509#3 msgctxt "db_x509#3" msgid "Serial" msgstr "" #: db_x509#4 msgid "md5 fingerprint" msgstr "" #: db_x509#5 msgid "sha1 fingerprint" msgstr "" #: db_x509#6 msgid "Start date" msgstr "" #: db_x509#7 msgid "not Before" msgstr "" #: db_x509#8 msgid "Expiry date" msgstr "" #: db_x509#9 msgid "not After" msgstr "" #: db_x509#10 msgid "Trust state" msgstr "" #: db_x509#11 msgctxt "db_x509#11" msgid "Revocation" msgstr "" #: db_x509#12 msgctxt "db_x509#12" msgid "Plain View" msgstr "" #: db_x509#13 msgid "Tree View" msgstr "" #: db_x509#14 msgid "" "The certificate already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" #: db_x509#15 msgid "Invalid public key" msgstr "" #: db_x509#16 msgid "Please enter the new hexadecimal secret number for the QA process." msgstr "" #: db_x509#17 msgid "The QA process has been terminated by the user." msgstr "" #: db_x509#18 msgctxt "db_x509#18" msgid "The key you selected for signing is not a private one." msgstr "" #: db_x509#19 msgid "Store the certificate to the key on the token '%1 (#%2)' ?" msgstr "" #: db_x509#20 msgid "New Certificate" msgstr "" #: db_x509#21 msgctxt "db_x509#21" msgid "Import" msgstr "Importar" #: db_x509#22 msgid "Import PKCS#12" msgstr "" #: db_x509#23 msgid "Import from PKCS#7" msgstr "" #: db_x509#24 msgctxt "db_x509#24" msgid "Rename" msgstr "" #: db_x509#25 msgctxt "db_x509#25" msgid "Show Details" msgstr "" #: db_x509#26 msgctxt "db_x509#26" msgid "Extract public Key" msgstr "" #: db_x509#27 msgctxt "db_x509#27" msgid "Export" msgstr "Exportar" #: db_x509#28 msgctxt "db_x509#28" msgid "Clipboard" msgstr "Portapapeles" #: db_x509#29 msgctxt "db_x509#29" msgid "File" msgstr "Archivo" #: db_x509#30 msgid "Request" msgstr "Solicitud" #: db_x509#31 msgctxt "db_x509#31" msgid "Security token" msgstr "" #: db_x509#32 msgid "Other token" msgstr "" #: db_x509#33 msgctxt "db_x509#33" msgid "Template" msgstr "Plantilla" #: db_x509#34 msgctxt "db_x509#34" msgid "OpenSSL config" msgstr "" #: db_x509#35 msgctxt "db_x509#35" msgid "Delete" msgstr "Eliminar" #: db_x509#36 msgid "Delete from Security token" msgstr "" #: db_x509#37 msgid "Trust" msgstr "" #: db_x509#38 msgid "Properties" msgstr "" #: db_x509#39 msgid "Generate CRL" msgstr "" #: db_x509#40 msgctxt "db_x509#40" msgid "PKCS#7" msgstr "" #: db_x509#41 msgctxt "db_x509#41" msgid "Sign" msgstr "" #: db_x509#42 msgid "Encrypt" msgstr "" #: db_x509#43 msgid "Renewal" msgstr "" #: db_x509#44 msgid "Unrevoke" msgstr "" #: db_x509#45 msgid "Revoke" msgstr "" #: db_x509#46 msgid "There was no key found for the Certificate: '%1'" msgstr "" #: db_x509#47 msgid "Not possible for a token key: '%1'" msgstr "" #: db_x509#48 msgid "Not possible for the token-key Certificate '%1'" msgstr "" #: db_x509#49 msgid " days" msgstr "" #: db_x509name#1 msgctxt "db_x509name#1" msgid "Subject" msgstr "Sujeto" #: db_x509name#2 msgid "Complete distinguished name" msgstr "" #: db_x509name#3 msgid "Subject hash" msgstr "" #: db_x509name#4 msgid "Hash to lookup certs in directories" msgstr "" #: db_x509req#1 msgctxt "db_x509req#1" msgid "Signed" msgstr "Firma" #: db_x509req#2 msgid "whether the request is already signed or not" msgstr "" #: db_x509req#3 msgid "Unstructured name" msgstr "" #: db_x509req#4 msgid "Challenge password" msgstr "" #: db_x509req#5 msgid "" "The certificate signing request already exists in the database as\n" "'%1'\n" "and thus was not stored" msgstr "" #: db_x509req#6 msgid "Certificate request ( *.pem *.der *.crl )" msgstr "" #: db_x509req#7 msgid "Certificate request export" msgstr "" #: db_x509req#8 msgid "New Request" msgstr "" #: db_x509req#9 msgctxt "db_x509req#9" msgid "Import" msgstr "Importar" #: db_x509req#10 msgctxt "db_x509req#10" msgid "Extract public Key" msgstr "" #: db_x509req#11 msgctxt "db_x509req#11" msgid "Rename" msgstr "Renombrar" #: db_x509req#12 msgctxt "db_x509req#12" msgid "Show Details" msgstr "Mostrar detalles" #: db_x509req#13 msgctxt "db_x509req#13" msgid "Sign" msgstr "Firma" #: db_x509req#14 msgctxt "db_x509req#14" msgid "Export" msgstr "Importar" #: db_x509req#15 msgctxt "db_x509req#15" msgid "Clipboard" msgstr "" #: db_x509req#16 msgctxt "db_x509req#16" msgid "File" msgstr "" #: db_x509req#17 msgctxt "db_x509req#17" msgid "Template" msgstr "" #: db_x509req#18 msgctxt "db_x509req#18" msgid "OpenSSL config" msgstr "" #: db_x509req#19 msgctxt "db_x509req#19" msgid "Delete" msgstr "" #: db_x509super#1 msgid "Key name" msgstr "" #: db_x509super#2 msgid "Internal name of the key" msgstr "" #: db_x509super#3 msgid "Save as OpenSSL config" msgstr "" #: db_x509super#4 msgid "Config files ( *.conf *.cnf);; All files ( * )" msgstr "" #: db_x509super#5 msgid "The following extensions were not ported into the template" msgstr "" #: kvView#1 msgctxt "kvView#1" msgid "Type" msgstr "" #: kvView#2 msgid "Content" msgstr "" #: pass_info#1 msgctxt "pass_info#1" msgid "Password" msgstr "Contraseña" #: pass_info#2 msgctxt "pass_info#2" msgid "PIN" msgstr "" #: pki_base#1 msgctxt "pki_base#1" msgid "Error opening file: '%1': %2" msgstr "" #: pki_base#2 msgid "Error writing to file: '%1': %2" msgstr "" #: pki_base#3 msgid "Error: " msgstr "" #: pki_base#4 msgid "Internal error: Unexpected message: %1 %2" msgstr "" #: pki_crl#1 msgid "Successfully imported the revokation list '%1'" msgstr "" #: pki_crl#2 msgid "Delete the revokation list '%1'?" msgstr "" #: pki_crl#3 msgid "Successfully created the revokation list '%1'" msgstr "" #: pki_crl#4 msgid "Delete the %1 revokation lists: %2?" msgstr "" #: pki_crl#5 msgid "" "Unable to load the revokation list in file %1. Tried PEM and DER formatted " "CRL." msgstr "" #: pki_crl#6 msgid "No issuer given" msgstr "" #: pki_crl#7 msgctxt "pki_crl#7" msgid "Wrong Size %1" msgstr "" #: pki_crl#8 msgid "unknown" msgstr "" #: pki_evp#1 msgid "Failed to decrypt the key (bad password) " msgstr "" #: pki_evp#2 msgid "Please enter the password to decrypt the private key." msgstr "" #: pki_evp#3 msgid "" "Please enter the password to decrypt the private key from file:\n" "%1" msgstr "" #: pki_evp#4 msgid "" "Unable to load the private key in file %1. Tried PEM and DER private, public " "and PKCS#8 key types." msgstr "" #: pki_evp#5 msgid "Please enter the password to decrypt the private key: '%1'" msgstr "" #: pki_evp#6 msgid "Password input aborted" msgstr "" #: pki_evp#7 msgid "Please enter the database password for decrypting the key '%1'" msgstr "" #: pki_evp#8 msgid "Please enter the password to protect the private key: '%1'" msgstr "" #: pki_evp#9 msgid "Please enter the database password for encrypting the key" msgstr "" #: pki_evp#10 msgid "Please enter the password protecting the PKCS#8 key '%1'" msgstr "" #: pki_evp#11 msgid "Please enter the export password for the private key '%1'" msgstr "" #: pki_key#1 msgid "Successfully imported the %1 public key '%2'" msgstr "" #: pki_key#2 msgid "Delete the %1 public key '%2'?" msgstr "" #: pki_key#3 msgid "Successfully imported the %1 private key '%2'" msgstr "" #: pki_key#4 msgid "Delete the %1 private key '%2'?" msgstr "" #: pki_key#5 msgid "Successfully created the %1 private key '%2'" msgstr "" #: pki_key#6 msgctxt "pki_key#6" msgid "Delete the %1 keys: %2?" msgstr "" #: pki_key#7 msgid "public key" msgstr "" #: pki_key#8 msgid "Common" msgstr "" #: pki_key#9 msgid "Private" msgstr "" #: pki_key#10 msgid "Bogus" msgstr "" #: pki_key#11 msgctxt "pki_key#11" msgid "PIN" msgstr "" #: pki_key#12 msgid "No password" msgstr "" #: pki_multi#1 msgid "Seek failed" msgstr "" #: pki_pkcs12#1 msgid "" "Please enter the password to decrypt the PKCS#12 file:\n" "%1" msgstr "" #: pki_pkcs12#2 msgid "Unable to load the PKCS#12 (pfx) file %1." msgstr "" #: pki_pkcs12#3 msgid "The supplied password was wrong (%1)" msgstr "" #: pki_pkcs12#4 msgid "Please enter the password to encrypt the PKCS#12 file" msgstr "" #: pki_pkcs12#5 msgid "No key or no Cert and no pkcs12" msgstr "" #: pki_pkcs7#1 msgid "Unable to load the PKCS#7 file %1. Tried PEM and DER format." msgstr "" #: pki_scard#1 msgid "Successfully imported the token key '%1'" msgstr "" #: pki_scard#2 msgid "Delete the token key '%1'?" msgstr "" #: pki_scard#3 msgid "Successfully created the token key '%1'" msgstr "" #: pki_scard#4 msgctxt "pki_scard#4" msgid "Delete the %1 keys: %2?" msgstr "" #: pki_scard#5 msgid "Delete the private key '%1' from the token '%2 (#%3)' ?" msgstr "" #: pki_scard#6 msgid "only RSA keys can be stored on tokens" msgstr "" #: pki_scard#7 msgid "This Key is already on the token" msgstr "" #: pki_scard#8 msgid "PIN input aborted" msgstr "" #: pki_scard#9 msgid "Unable to find copied key on the token" msgstr "" #: pki_scard#10 msgid "Please insert card: %1 %2 [%3] with Serial: %4" msgstr "" #: pki_scard#11 msgid "Public Key missmatch. Please re-import card" msgstr "" #: pki_scard#12 msgid "Unable to find generated key on card" msgstr "" #: pki_scard#13 msgctxt "pki_scard#13" msgid "Wrong Size %1" msgstr "" #: pki_scard#14 msgid "Token %1" msgstr "" #: pki_scard#15 msgid "Failed to find the key on the token" msgstr "" #: pki_scard#16 msgid "Invalid Pin for the token" msgstr "" #: pki_temp#1 msgid "Successfully imported the XCA template '%1'" msgstr "" #: pki_temp#2 msgid "Delete the XCA template '%1'?" msgstr "" #: pki_temp#3 msgid "Successfully created the XCA template '%1'" msgstr "" #: pki_temp#4 msgid "Delete the %1 XCA templates: %2?" msgstr "" #: pki_temp#5 msgctxt "pki_temp#5" msgid "Wrong Size %1" msgstr "" #: pki_temp#6 msgid "Template file content error (too small): %1" msgstr "" #: pki_temp#7 msgid "Template file content error (bad size): %1 " msgstr "" #: pki_temp#8 msgid "Template file content error (bad length) :%1" msgstr "" #: pki_x509#1 msgid "Successfully imported the certificate '%1'" msgstr "" #: pki_x509#2 msgid "Delete the certificate '%1'?" msgstr "" #: pki_x509#3 msgid "Successfully created the certificate '%1'" msgstr "" #: pki_x509#4 msgid "Delete the %1 certificates: %2?" msgstr "" #: pki_x509#5 msgid "" "Unable to load the certificate in file %1. Tried PEM and DER certificate." msgstr "" #: pki_x509#6 msgid "This certificate is already on the security token" msgstr "" #: pki_x509#7 msgid "Delete the certificate '%1' from the token '%2 (#%3)'?" msgstr "" #: pki_x509#8 msgid "There is no key for signing !" msgstr "" #: pki_x509#9 msgctxt "pki_x509#9" msgid "Wrong Size %1" msgstr "" #: pki_x509#10 msgctxt "pki_x509#10" msgid "Not trusted" msgstr "" #: pki_x509#11 msgid "Trust inherited" msgstr "" #: pki_x509#12 msgid "Always Trusted" msgstr "" #: pki_x509#13 msgid "CRL expires: %1" msgstr "" #: pki_x509#14 msgid "No" msgstr "" #: pki_x509#15 msgid "Yes" msgstr "" #: pki_x509req#1 msgid "Signing key not valid (public key)" msgstr "" #: pki_x509req#2 msgid "Successfully imported the %1 certificate request '%2'" msgstr "" #: pki_x509req#3 msgid "Delete the %1 certificate request '%2'?" msgstr "" #: pki_x509req#4 msgid "Successfully created the %1 certificate request '%2'" msgstr "" #: pki_x509req#5 msgid "Delete the %1 certificate requests: %2?" msgstr "" #: pki_x509req#6 msgid "" "Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC " "format." msgstr "" #: pki_x509req#7 msgctxt "pki_x509req#7" msgid "Signed" msgstr "" #: pki_x509req#8 msgid "Unhandled" msgstr "" #: pki_x509req#9 msgctxt "pki_x509req#9" msgid "Wrong Size %1" msgstr "" #: v3ext#1 msgctxt "v3ext#1" msgid "Add" msgstr "" #: v3ext#2 msgctxt "v3ext#2" msgid "Delete" msgstr "" #: v3ext#3 msgctxt "v3ext#3" msgid "Apply" msgstr "" #: v3ext#4 msgctxt "v3ext#4" msgid "Validate" msgstr "" #: v3ext#5 msgctxt "v3ext#5" msgid "Cancel" msgstr "Cancelar" #: v3ext#6 msgid "An email address or 'copy'" msgstr "" #: v3ext#7 msgid "An email address" msgstr "" #: v3ext#8 msgid "a registered ID: OBJECT IDENTIFIER" msgstr "" #: v3ext#9 msgid "a uniform resource indicator" msgstr "" #: v3ext#10 msgid "a DNS domain name" msgstr "" #: v3ext#11 msgid "an IP address" msgstr "" #: v3ext#12 msgid "Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'" msgstr "" #: v3ext#13 msgid "No editing. Only 'copy' allowed here" msgstr "" #: v3ext#14 msgid "" "Validation failed:\n" "'%1'\n" "%2" msgstr "" #: v3ext#15 msgid "" "Validation successfull:\n" "'%1'" msgstr "" #: void#1 msgctxt "void#1" msgid "There was no key found for the Certificate: " msgstr "" #: void#2 msgctxt "void#2" msgid "Import Certificate signing request" msgstr "" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/fr.po��������������������������������������������������������������������������������0000664�0000000�0000000�00000220162�11753427512�0014262�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Patrick Monnerat <pm@datasphere.ch>, 2011. # demonipuch <Unknown>, 2012. # msgid "" msgstr "" "Project-Id-Version: xca 0.9.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-05-02 06:51+0200\n" "PO-Revision-Date: 2012-05-07 12:37+0200\n" "Last-Translator: demonipuch <Unknown>\n" "Language-Team: fr <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-04-07 05:36+0000\n" "X-Generator: Launchpad (build 15060)\n" "Language: \n" #: About#1 msgid "Done" msgstr "OK" #: CaProperties#1 msgid "CA Properties" msgstr "Propriétés du CA" #: CaProperties#2 msgid "Use random Serial numbers" msgstr "Utiliser des numéros de série aléatoires" #: CaProperties#3 msgid "Days until next CRL issuing" msgstr "" "Nombre de jours avant la génération de la prochaine liste de révocation" #: CaProperties#4 msgid "Default template" msgstr "Modèle par défaut" #: CaProperties#5 msgid "Next serial for signing" msgstr "Numéro de série suivant pour la signature" #: CertDetail#1 msgid "Details of the Certificate" msgstr "Détails du Certificat" #: CertDetail#2 msgid "S&tatus" msgstr "E&tat" #: CertDetail#3 msgctxt "CertDetail#3" msgid "Serial" msgstr "Numéro de série" #: CertDetail#4 msgid "The serial number of the certificate" msgstr "Le numéro de série du certificat" #: CertDetail#5 msgid "The internal name of the certificate in the database" msgstr "Le nom interne du certificat dans la base de données" #: CertDetail#6 msgctxt "CertDetail#6" msgid "Internal name" msgstr "Nom interne" #: CertDetail#7 msgctxt "CertDetail#7" msgid "Signature algorithm" msgstr "Algorithme de signature" #: CertDetail#8 msgctxt "CertDetail#8" msgid "Signature" msgstr "Signature" #: CertDetail#9 msgctxt "CertDetail#9" msgid "Key" msgstr "Clé" #: CertDetail#10 msgid "Fingerprints" msgstr "Empreinte" #: CertDetail#11 msgid "SHA1" msgstr "SHA1" #: CertDetail#12 msgid "MD5" msgstr "MD5" #: CertDetail#13 msgid "A SHA-1 hashsum of the certificate" msgstr "La somme de hachage SHA-1 du certificat" #: CertDetail#14 msgid "An md5 hashsum of the certificate" msgstr "La somme de hachage MD5 du certificat" #: CertDetail#15 msgctxt "CertDetail#15" msgid "Validity" msgstr "Validité" #: CertDetail#16 msgid "The time since the certificate is valid" msgstr "Le moment depuis lequel le certificat est valide" #: CertDetail#17 msgid "The time until the certificate is valid" msgstr "Le moment auquel le certificat échoit" #: CertDetail#18 msgid "&Subject" msgstr "&Sujet" #: CertDetail#19 msgctxt "CertDetail#19" msgid "&Issuer" msgstr "&Emetteur" #: CertDetail#20 msgid "Attributes" msgstr "Attributs" #: CertDetail#21 msgctxt "CertDetail#21" msgid "&Extensions" msgstr "E&xtensions" #: CertDetail#22 msgid "Show config" msgstr "Afficher la configuration" #: CertDetail#23 msgid "Show extensions" msgstr "Afficher les extensions" #: CertDetail#24 msgctxt "CertDetail#24" msgid "Not available" msgstr "Non disponible" #: CertDetail#25 msgid "Details of the certificate" msgstr "Détails du certificat" #: CertDetail#26 msgid "Signer unknown" msgstr "Signataire inconnu" #: CertDetail#27 msgid "Self signed" msgstr "Auto-signé" #: CertDetail#28 msgctxt "CertDetail#28" msgid "Not trusted" msgstr "Pas sûr" #: CertDetail#29 msgid "Trusted" msgstr "Sûr" #: CertDetail#30 msgid "Revoked: " msgstr "Révoqués: " #: CertDetail#31 msgid "Not valid" msgstr "Echu" #: CertDetail#32 msgid "Valid" msgstr "Valide" #: CertDetail#33 msgid "Details of the certificate signing request" msgstr "Détails de la requête de signature" #: CertExtend#1 msgid "Certificate renewal" msgstr "Renouvellement du certificat" #: CertExtend#2 msgid "" "This will create a new certificate as a copy of the old one with a new " "serial number and adjusted validity values." msgstr "" "Créer un nouveau certificat conforme à l'ancien, mais avec un nouveau numéro " "de série et les limites de validité ajustées." #: CertExtend#3 msgctxt "CertExtend#3" msgid "Validity" msgstr "Validité" #: CertExtend#4 msgctxt "CertExtend#4" msgid "Not before" msgstr "Pas avant" #: CertExtend#5 msgctxt "CertExtend#5" msgid "Not after" msgstr "Pas après" #: CertExtend#6 msgctxt "CertExtend#6" msgid "Time range" msgstr "Intervalle de temps" #: CertExtend#7 msgctxt "CertExtend#7" msgid "No well-defined expiration" msgstr "Date d'expiration mal définie" #: CertExtend#8 msgctxt "CertExtend#8" msgid "Apply" msgstr "Appliquer" #: CertExtend#9 msgctxt "CertExtend#9" msgid "Days" msgstr "Jours" #: CertExtend#10 msgctxt "CertExtend#10" msgid "Months" msgstr "Mois" #: CertExtend#11 msgctxt "CertExtend#11" msgid "Years" msgstr "Années" #: CertExtend#12 msgctxt "CertExtend#12" msgid "Midnight" msgstr "Minuit" #: CertExtend#13 msgctxt "CertExtend#13" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" "Le certificat serait valide avant son signataire. Ce n'est probablement pas " "ce qui est désiré." #: CertExtend#14 msgid "Edit times" msgstr "Modifier les limites de validité" #: CertExtend#15 msgctxt "CertExtend#15" msgid "Abort rollout" msgstr "Interrompre le déploiement" #: CertExtend#16 msgctxt "CertExtend#16" msgid "Continue rollout" msgstr "Continuer le déploiement" #: CertExtend#17 msgctxt "CertExtend#17" msgid "Adjust date and continue" msgstr "Ajuster la date et continuer" #: CertExtend#18 msgctxt "CertExtend#18" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" "Le certificat serait valide plus longtemps que son signataire. Ce n'est " "probablement pas ce qui est désiré." #: CertView#1 msgctxt "CertView#1" msgid "There was no key found for the Certificate: " msgstr "Aucune clé n'a été trouvée pour ce certificat: " #: CertView#2 msgctxt "CertView#2" msgid "Import Certificate signing request" msgstr "Importer une requête de signature" #: ClickLabel#1 msgid "Double click for details" msgstr "Double-cliquer pour afficher les détails" #: CrlDetail#1 msgid "Details of the Revocation list" msgstr "Détails de la liste de révocation" #: CrlDetail#2 msgid "&Status" msgstr "&Etat" #: CrlDetail#3 msgid "Version" msgstr "Version" #: CrlDetail#4 msgctxt "CrlDetail#4" msgid "Signature" msgstr "Signature" #: CrlDetail#5 msgid "Signed by" msgstr "Signé par" #: CrlDetail#6 msgctxt "CrlDetail#6" msgid "Name" msgstr "Nom" #: CrlDetail#7 msgid "The internal name of the CRL in the database" msgstr "Le nom interne de la liste de révocation dans la base de données" #: CrlDetail#8 msgid "issuing dates" msgstr "date d'émission" #: CrlDetail#9 msgid "Next Update" msgstr "Prochaine mise-à-jour" #: CrlDetail#10 msgid "Last Update" msgstr "Dernière mise-à-jour" #: CrlDetail#11 msgctxt "CrlDetail#11" msgid "&Issuer" msgstr "&Emetteur" #: CrlDetail#12 msgctxt "CrlDetail#12" msgid "&Extensions" msgstr "E&xtensions" #: CrlDetail#13 msgid "&Revocation list" msgstr "Liste de &révocation" #: CrlDetail#14 msgid "0" msgstr "0" #: CrlDetail#15 msgctxt "CrlDetail#15" msgid "Serial" msgstr "Numéro de série" #: CrlDetail#16 msgctxt "CrlDetail#16" msgid "Revocation" msgstr "Révocation" #: CrlDetail#17 msgid "Reason" msgstr "Raison" #: CrlDetail#18 msgid "Invalidation" msgstr "Invalidation" #: CrlDetail#19 msgid "Failed" msgstr "Echoué" #: CrlDetail#20 msgid "Unknown signer" msgstr "Signataire inconnu" #: CrlDetail#21 msgid "Verification not possible" msgstr "Vérification impossible" #: CrlDetail#22 msgid "Unknown certificate" msgstr "Certificat inconnu" #: ExportCert#1 msgid "X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )" msgstr "Certificats X509 ( *.cer *.crt *.p12 *.p7b);;Tous les fichiers ( * )" #: ExportCert#2 msgid "" "DER is a binary format of the Certificate\n" "PEM is a base64 encoded Certificate\n" "PKCS#7 is an official Certificate exchange format\n" "PKCS#12 is an encrypted official Key-Certificate exchange format\n" msgstr "" "DER est un format binaire de certificat\n" "PEM encode le certificat en base64\n" "PKCS#7 est un format officiel d'échange de certificat\n" "PKCS#12 est un format officiel encrypté d'échange de certificat et de clé\n" #: ExportCert#3 msgid "Please enter the filename for the certificate." msgstr "SVP entrer le nom du fichier pour le certificat." #: ExportCert#4 msgid "Certificate export" msgstr "Exportation de certificat" #: ExportDer#1 msgctxt "ExportDer#1" msgid "All files ( * )" msgstr "Tous les fichiers ( * )" #: ExportDer#2 msgid "" "DER is a binary format\n" "PEM is a base64 encoded DER file\n" msgstr "" "DER est un format binaire\n" "PEM est un format encodé en base64\n" #: ExportDialog#1 msgid "..." msgstr "..." #: ExportDialog#2 msgid "Filename" msgstr "Nom du fichier" #: ExportDialog#3 msgid "Please enter the filename" msgstr "SVP saisir le nom du fichier" #: ExportDialog#4 msgid "Export Format" msgstr "Format d'exportation" #: ExportDialog#5 msgid "The file: '%1' already exists!" msgstr "Le fichier '%1' existe déjà!" #: ExportDialog#6 msgid "Overwrite" msgstr "Ecraser" #: ExportDialog#7 msgid "Do not overwrite" msgstr "Ne pas écraser" #: ExportKey#1 msgid "When exporting the private key it should be encrypted." msgstr "Il est conseillé d'encrypter la clé privée lors de son exportation." #: ExportKey#2 msgid "When exporting the private part, it should be encrypted." msgstr "Il est conseillé d'encrypter la partie privée lors de son exportation." #: ExportKey#3 msgid "E&xport the private part of the Key too" msgstr "E&xporter aussi la partie privée de la clé" #: ExportKey#4 msgid "Export as PKCS#8" msgstr "Exporter en PKCS#8" #: ExportKey#5 msgid "&Encrypt the Key with a password" msgstr "&Encrypter la clé avec un mot de passe" #: ExportKey#6 msgid "Private keys ( *.pem *.der *.pk8 );;All files ( * )" msgstr "Clés privées ( *.pem *.der *.pk8 );;Tous les fichiers ( * )" #: ExportKey#7 msgid "" "DER is a binary format of the key without encryption\n" "PEM is a base64 encoded key with optional encryption\n" "PKCS#8 is an encrypted official Key-exchange format" msgstr "" "DER est un format binaire de clé sans encryption\n" "PEM encode la clé en base64 avec une encryption facultative\n" "PKCS#8 est un format officiel d'échange de clé" #: ExportKey#8 msgid "Please enter the filename for the key." msgstr "SVP saisir le nom du fichier pour la clé." #: ExportKey#9 msgid "Public key export" msgstr "Exporter la clé publique" #: ExportKey#10 msgid "Key export" msgstr "Exporter la clé" #: Help#1 msgid "<<" msgstr "<<" #: Help#2 msgid ">>" msgstr "<<" #: Help#3 msgctxt "Help#3" msgid "&Done" msgstr "&OK" #: ImportMulti#1 msgid "Import PKI Items" msgstr "Importer des objets PKI" #: ImportMulti#2 msgid "Import &All" msgstr "Importer &tout" #: ImportMulti#3 msgctxt "ImportMulti#3" msgid "&Import" msgstr "&Importer" #: ImportMulti#4 msgctxt "ImportMulti#4" msgid "&Done" msgstr "&OK" #: ImportMulti#5 msgid "&Remove from list" msgstr "&Retirer de la liste" #: ImportMulti#6 msgid "Details" msgstr "Détails" #: ImportMulti#7 msgid "Delete from token" msgstr "Enlever du jeton" #: ImportMulti#8 msgid "Rename on token" msgstr "Renommer dans le jeton" #: ImportMulti#9 msgid "" "\n" "Name: %1\n" "Model: %2\n" "Serial: %3" msgstr "" "\n" "Nom: %1\n" "Modèle: %2\n" "Numéro de série: %3" #: ImportMulti#10 msgid "Manage security token" msgstr "Gérer les jetons de sécurité" #: ImportMulti#11 msgid "The type of the Item '%1' is not recognized" msgstr "Le type de l'objet '%1' n'est pas reconnu" #: ImportMulti#12 msgid "Details of the item '%1' cannot be shown" msgstr "Les détails de l'objet '%1' ne peuvent pas être affichés" #: ImportMulti#13 msgid "The type of the item '%1' is not recognized" msgstr "Le type de l'objet '%1' n'est pas reconnu" #: ImportMulti#14 msgid "The file '%1' did not contain PKI data" msgstr "Le fichier '%1' ne contient pas de données PKI" #: ImportMulti#15 msgid "The %1 files: '%2' did not contain PKI data" msgstr "Les %1 fichiers: '%2' ne contiennent pas de données PKI" #: KeyDetail#1 msgctxt "KeyDetail#1" msgid "Name" msgstr "Nom" #: KeyDetail#2 msgid "The internal name of the key used by xca" msgstr "Le nom interne de la clé utilisé par xca" #: KeyDetail#3 msgctxt "KeyDetail#3" msgid "Security token" msgstr "Jeton de sécurité" #: KeyDetail#4 msgid "Manufacturer" msgstr "Fabricant" #: KeyDetail#5 msgctxt "KeyDetail#5" msgid "Serial" msgstr "Numéro de série" #: KeyDetail#6 msgctxt "KeyDetail#6" msgid "Key" msgstr "Clé" #: KeyDetail#7 msgid "Public Exponent" msgstr "Exposant public" #: KeyDetail#8 msgctxt "KeyDetail#8" msgid "Keysize" msgstr "Taille de la clé" #: KeyDetail#9 msgid "Private Exponent" msgstr "Exposant privé" #: KeyDetail#10 msgid "Modulus" msgstr "Modulo" #: KeyDetail#11 msgid "Details of the %1 key" msgstr "Détails de la clé %1" #: KeyDetail#12 msgctxt "KeyDetail#12" msgid "Not available" msgstr "Non disponible" #: KeyDetail#13 msgid "Token" msgstr "Jeton" #: KeyDetail#14 msgid "Security token ID:%1" msgstr "Identifiant de jeton de sécurité: %1" #: KeyDetail#15 msgid "Available" msgstr "Disponible" #: KeyDetail#16 msgid "Sub prime" msgstr "Sous-premier" #: KeyDetail#17 msgid "Public key" msgstr "Clé publique" #: KeyDetail#18 msgctxt "KeyDetail#18" msgid "Private key" msgstr "Clé privée" #: KeyDetail#19 msgid "Curve name" msgstr "Nom de la courbe" #: KeyDetail#20 msgid "Unknown key" msgstr "Clé inconnue" #: MainWindow#1 msgid "Private Keys" msgstr "Clés privées" #: MainWindow#2 msgid "&New Key" msgstr "&Nouvelle clé" #: MainWindow#3 msgid "&Export" msgstr "&Exporter" #: MainWindow#4 msgctxt "MainWindow#4" msgid "&Import" msgstr "&Importer" #: MainWindow#5 msgid "Import PFX (PKCS#12)" msgstr "Importer en PFX (PKCS#12)" #: MainWindow#6 msgid "&Show Details" msgstr "&Afficher les Détails" #: MainWindow#7 msgid "&Delete" msgstr "&Détruire" #: MainWindow#8 msgid "Certificate signing requests" msgstr "Requêtes de signature de certificat" #: MainWindow#9 msgid "&New Request" msgstr "&Nouvelle requête" #: MainWindow#10 msgid "Certificates" msgstr "Certificats" #: MainWindow#11 msgid "&New Certificate" msgstr "&Nouveau Certificat" #: MainWindow#12 msgid "Import &PKCS#12" msgstr "Importer en &PKCS#12" #: MainWindow#13 msgid "Import P&KCS#7" msgstr "Importer en P&KCS#7" #: MainWindow#14 msgctxt "MainWindow#14" msgid "Plain View" msgstr "Vue à plat" #: MainWindow#15 msgid "Templates" msgstr "Modèles" #: MainWindow#16 msgid "&New template" msgstr "&Nouveau modèle" #: MainWindow#17 msgid "Ch&ange Template" msgstr "&Modifier le Modèle" #: MainWindow#18 msgid "Revocation lists" msgstr "Listes de révocation" #: MainWindow#19 msgid "" "Using or exporting private keys will not be possible without providing the " "correct password" msgstr "" "L'usage ou l'exportation de clés privées seront impossible sans fournir le " "mot de passe correct." #: MainWindow#20 msgid "Database" msgstr "Base de donnée" #: MainWindow#21 msgid "No deleted items found" msgstr "Aucun objet détruit n'a été trouvé" #: MainWindow#22 msgid "&File" msgstr "&Fichier" #: MainWindow#23 msgid "&New DataBase" msgstr "&Nouvelle base de données" #: MainWindow#24 msgid "&Open DataBase" msgstr "&Ouvrir une base de données" #: MainWindow#25 msgid "Generate DH parameter" msgstr "Générer le paramètre DH" #: MainWindow#26 msgid "Set as default DataBase" msgstr "Définir comme base de données par défaut" #: MainWindow#27 msgid "&Close DataBase" msgstr "&Fermer la base de données" #: MainWindow#28 msgid "&Dump DataBase" msgstr "C&licher la base de données" #: MainWindow#29 msgid "C&hange DataBase password" msgstr "C&hanger le mot de passe de la base de données" #: MainWindow#30 msgid "&Import old db_dump" msgstr "&Importer un cliché de base de données en ancien format (db_dump)" #: MainWindow#31 msgid "&Undelete items" msgstr "&Récupérer des objets détruits" #: MainWindow#32 msgid "Options" msgstr "Options" #: MainWindow#33 msgid "Exit" msgstr "Quitter" #: MainWindow#34 msgid "I&mport" msgstr "I&mporter" #: MainWindow#35 msgid "Keys" msgstr "Clés" #: MainWindow#36 msgid "Requests" msgstr "Requêtes" #: MainWindow#37 msgid "PKCS#12" msgstr "PKCS#12" #: MainWindow#38 msgctxt "MainWindow#38" msgid "PKCS#7" msgstr "PKCS#7" #: MainWindow#39 msgctxt "MainWindow#39" msgid "Template" msgstr "Modèle" #: MainWindow#40 msgid "Revocation list" msgstr "Liste de révocation" #: MainWindow#41 msgid "PEM file" msgstr "Fichier PEM" #: MainWindow#42 msgid "paste PEM file" msgstr "Coller un fichier PEM" #: MainWindow#43 msgid "&Token" msgstr "&Jeton" #: MainWindow#44 msgid "&Manage Security token" msgstr "&Gérer le jeton de sécurité" #: MainWindow#45 msgid "&Init Security token" msgstr "&Initialiser le jeton de sécurité" #: MainWindow#46 msgid "&Change PIN" msgstr "&Changer le NIP" #: MainWindow#47 msgid "Change &SO PIN" msgstr "Changer le P&UK" #: MainWindow#48 msgid "Init PIN" msgstr "Initialiser le NIP" #: MainWindow#49 msgid "&Help" msgstr "&Aide" #: MainWindow#50 msgid "&Content" msgstr "&Contenu" #: MainWindow#51 msgid "&About" msgstr "&A propos" #: MainWindow#52 msgid "Donations" msgstr "Dons" #: MainWindow#53 msgid "Database dump ( *.dump );;All files ( * )" msgstr "Cliché de base de données ( *.dump );;Tous les fichiers ( * )" #: MainWindow#54 msgid "Import password" msgstr "Mot de passe d'importation" #: MainWindow#55 msgid "Please enter the password of the old database" msgstr "SVP saisir le mot de passe de l'ancienne base de données" #: MainWindow#56 msgid "Password verification error. Ignore keys ?" msgstr "La vérification du mot de passe a écoué. Ignorer les clés ?" #: MainWindow#57 msgid "Import anyway" msgstr "Importer quand-même" #: MainWindow#58 msgctxt "MainWindow#58" msgid "Cancel" msgstr "Annuler" #: MainWindow#59 msgid "no such option: %1" msgstr "'%1' n'est pas une option" #: MainWindow#60 msgid "Import PEM data" msgstr "Importer les données PEM" #: MainWindow#61 msgid "Please enter the original SO PIN (PUK) of the token '%1'" msgstr "SVP saisir le PUK original du jeton '%1'" #: MainWindow#62 msgid "Please enter the new SO PIN (PUK) of the token '%1'" msgstr "SVP saisir le nouveau PUK du jeton '%1'" #: MainWindow#63 msgid "The new label of the token '%1'" msgstr "La nouvelle étiquette du jeton '%1'" #: MainWindow#64 msgid "The token '%1' did not contain any keys or certificates" msgstr "Le jeton '%1' ne contient aucune clé ni aucun certificat" #: MainWindow#65 msgid "New Password" msgstr "Nouveau mot de passe" #: MainWindow#66 msgid "" "Please enter the new password to encrypt your private keys in the database-" "file" msgstr "" "SVP saisir le nouveau mot de passe pour encrypter les clés privées dans le " "fichier de base de données" #: MainWindow#67 msgid "" "Please enter a password, that will be used to encrypt your private keys in " "the database file:\n" "%1" msgstr "" "Veuillez entrer un mot de passe, qui sera utiliser pour chiffrer vos clés " "privées dans le fichier de la base de données:\n" "%1" #: MainWindow#68 msgid "Password verify error, please try again" msgstr "La vérification du mot de passe a échoué. SVP essayez encore" #: MainWindow#69 msgctxt "MainWindow#69" msgid "Password" msgstr "Mot de passe" #: MainWindow#70 msgid "" "Please enter the password for unlocking the database:\n" "%1" msgstr "" "Veuillez entrer le mot passe pour déverrouiller la base de données:\n" "%1" #: MainWindow#71 msgid "The following error occured:" msgstr "L'erreur suivante s'est produite:" #: MainWindow#72 msgid "Copy to Clipboard" msgstr "Copier dans le presse-papier" #: MainWindow#73 msgid "" "Diffie-Hellman parameters are needed for different applications, but not " "handled by XCA.\n" "Please enter the DH parameter bits" msgstr "" "Les paramètres de Diffie-Hellman sont nécessaires à certaines applications " "mais ne sont pas gérés par XCA.\n" "Saisir le nombre de bits du paramètre de Diffie-Hellman SVP" #: MainWindow#74 msgctxt "MainWindow#74" msgid "Error opening file: '%1': %2" msgstr "Erreur lors de l'ouverture du fichier: '%1': %2" #: NewCrl#1 msgid "Create CRL" msgstr "Créer une liste de révocation" #: NewCrl#2 msgid "Dates" msgstr "Dates" #: NewCrl#3 msgid "last update" msgstr "dernière mise-à-jour" #: NewCrl#4 msgid "next update" msgstr "prochaine mise-à-jour" #: NewCrl#5 msgctxt "NewCrl#5" msgid "Days" msgstr "Jours" #: NewCrl#6 msgctxt "NewCrl#6" msgid "Months" msgstr "Mois" #: NewCrl#7 msgctxt "NewCrl#7" msgid "Years" msgstr "Années" #: NewCrl#8 msgctxt "NewCrl#8" msgid "Midnight" msgstr "Minuit" #: NewCrl#9 msgctxt "NewCrl#9" msgid "Apply" msgstr "Appliquer" #: NewCrl#10 msgid "Hashing algorithm" msgstr "Algorithme de hachage" #: NewCrl#11 msgctxt "NewCrl#11" msgid "Extensions" msgstr "Extensions" #: NewCrl#12 msgid "Authority key identifier" msgstr "Identifiant de clé de l'autorité" #: NewCrl#13 msgid "Subject alternative name" msgstr "Nom alternatif du sujet" #: NewCrl#14 msgid "CRL Number" msgstr "Numéro de la liste de révocation" #: NewCrl#15 msgid "Revokation reasons" msgstr "Raisons de la révocation" #: NewKey#1 msgid "New key" msgstr "Nouvelle clé" #: NewKey#2 msgid "Please give a name to the new key and select the desired keysize" msgstr "" "SVP donner un nom à la nouvelle clé et sélectionner la taille de clé désirée" #: NewKey#3 msgid "Key properties" msgstr "Propriétés de la clé" #: NewKey#4 msgctxt "NewKey#4" msgid "Name" msgstr "Nom" #: NewKey#5 msgid "The internal name of the new key" msgstr "Le nom interne de la nouvelle clé" #: NewKey#6 msgctxt "NewKey#6" msgid "New Key" msgstr "Nouvelle Clé" #: NewKey#7 msgid "Curve" msgstr "Courbe" #: NewKey#8 msgctxt "NewKey#8" msgid "Keysize" msgstr "Taille de la clé" #: NewKey#9 msgid "Usually 1024 or 2048 bit keys are used" msgstr "1024 et 2048 bits sont les tailles de clé les plus usitées" #: NewKey#10 msgid "Keytype" msgstr "Type de clé" #: NewKey#11 msgctxt "NewKey#11" msgid "Create" msgstr "Créer" #: NewX509#1 msgctxt "NewX509#1" msgid "Create" msgstr "Créer" #: NewX509#2 msgid "Source" msgstr "Source" #: NewX509#3 msgid "Signing request" msgstr "Requête de signature" #: NewX509#4 msgid "" "A certificate signing request can be signed, even if the private key of the " "request is not available. This is the intention of a CSR:\n" "Getting signed by a CA certificate, whoes certificate of course must be in " "the database\n" "Of course you need the private key of the CSR if you want to create a self-" "signed cert from it." msgstr "" "Un requête de signature de certificat peut être signée même si la clé privée " "de la requête n'est pas disponible. C'est l'intention\n" "d'une requête de signature: être signée par un certificat d'autorité (CA) " "qui lui bien-sûr, doit être dans la base de donnée.\n" "Par contre, la clé privée d'une requête est nécessaire pour créer un " "certificat auto-signé à partir de celle-ci." #: NewX509#5 msgid "Show request" msgstr "Afficher la requête" #: NewX509#6 msgid "Sign this Certificate signing &request" msgstr "Signer cette &requête" #: NewX509#7 msgid "Copy extensions from the request" msgstr "Copier les extensions de la requête" #: NewX509#8 msgid "Modify subject of the request" msgstr "Modifier le sujet de la requête" #: NewX509#9 msgid "Signing" msgstr "Signer" #: NewX509#10 msgid "Create a &self signed certificate with the serial" msgstr "Créer un certificat auto-&signé avec le numéro de série" #: NewX509#11 msgid "If you leave this blank the serial 00 will be used" msgstr "Si ce champ est laissé vide, le numéro de série 00 sera utilisé" #: NewX509#12 msgid "1" msgstr "1" #: NewX509#13 msgid "Use &this Certificate for signing" msgstr "Utiliser &ce certificat pour signer" #: NewX509#14 msgid "All certificates in your database that can create valid signatures" msgstr "" "Tous les certificats dans la base de données qui peuvent produire des " "signatures valables" #: NewX509#15 msgid "" "This list contains all certificates with the CA-flag set to true and whoes " "private key is present in the key-database.\n" "If this list is disabled, you only can create a self-signed certificate." msgstr "" "Cette liste contient tous les certificats qui ont le drapeau CA levé et dont " "la clé privée est présente dans la base de données.\n" "Si cette liste est désactivée, seule la création d'un certificat auto-signé " "est possible." #: NewX509#16 msgctxt "NewX509#16" msgid "Signature algorithm" msgstr "Algorithme de signature" #: NewX509#17 msgid "Template for the new certificate" msgstr "Modèle pour le nouveau certificat" #: NewX509#18 msgid "All available templates" msgstr "Tous les modèles disponibles" #: NewX509#19 msgid "This list contains all templates from the toplevel template Tab" msgstr "Cette liste contient tous les modèles de l'onglet 'Modèles'" #: NewX509#20 msgid "Apply extensions" msgstr "Appliquer les extensions" #: NewX509#21 msgid "Apply subject" msgstr "Appliquer le sujet" #: NewX509#22 msgid "Apply all" msgstr "Appliquer tout" #: NewX509#23 msgctxt "NewX509#23" msgid "Subject" msgstr "Sujet" #: NewX509#24 msgid "Organisation" msgstr "Organisation" #: NewX509#25 msgid "" "This name is only used internally and does not appear in the resulting " "certificate" msgstr "" "Ce nom est seulement utilisé par xca et n'apparaît pas dans le certificat " "exporté" #: NewX509#26 msgid "Must be exactly 2 letter of size (DE, UK)" msgstr "Doit contenir exactement deux lettres [FR, UK]" #: NewX509#27 msgid "Country code" msgstr "Code du pays" #: NewX509#28 msgid "State or Province" msgstr "Etat ou Province" #: NewX509#29 msgid "Locality" msgstr "Ville" #: NewX509#30 msgid "Organisational unit" msgstr "Unité organisationnlle" #: NewX509#31 msgid "E-Mail address" msgstr "Adresse de courriel" #: NewX509#32 msgctxt "NewX509#32" msgid "Internal name" msgstr "Nom interne" #: NewX509#33 msgid "Common name" msgstr "Nom commun" #: NewX509#34 msgctxt "NewX509#34" msgid "Add" msgstr "Ajouter" #: NewX509#35 msgctxt "NewX509#35" msgid "Delete" msgstr "Enlever" #: NewX509#36 msgctxt "NewX509#36" msgid "Private key" msgstr "Clé privée" #: NewX509#37 msgid "This list only contains unused keys" msgstr "Cette liste ne contient que les clés inutilisées" #: NewX509#38 msgid "Used keys too" msgstr "Inclure les clés utilisées" #: NewX509#39 msgid "&Generate a new key" msgstr "&Générer une nouvelle clé" #: NewX509#40 msgctxt "NewX509#40" msgid "Extensions" msgstr "Extensions" #: NewX509#41 msgid "Basic constraints" msgstr "Contraintes basiques" #: NewX509#42 msgctxt "NewX509#42" msgid "Type" msgstr "Type" #: NewX509#43 msgid "If this will become a CA certificate or not" msgstr "Si un certificat d'autorité (CA) est en train d'être créé ou non" #: NewX509#44 msgid "" "Set this to TRUE if you want to create a CA certificate that signs other " "certificates.\n" "This is always set to FALSE for client or server certificates. In most cases " "self-signed certificates are CA certificates.\n" "Self-signed non-CA certificates are unusual although they are possible." msgstr "" "Sélectionner \"VRAI\" si vous voulez créer un certificat d'autorité (CA) qui " "peut signer d'autres certificats.\n" "\"FAUX\" doit toujours être séléectionné pour des certificats de clients ou " "de serveurs. Dans la plupart des cas,\n" "les certificats auto-signés sont des certificats d'autorité: bien que " "possibles, les certificats auto-signés non-CA sont rares." #: NewX509#45 msgid "Not defined" msgstr "Non défini" #: NewX509#46 msgid "Certification Authority" msgstr "Autorité de Certification" #: NewX509#47 msgid "End Entity" msgstr "Entité Finale" #: NewX509#48 msgid "Path length" msgstr "Distance aux feuilles" #: NewX509#49 msgid "How much CAs may be below this." msgstr "" "Combien de niveau de sous-CA peuvent apparaître jusqu'à une entité finale." #: NewX509#50 msgid "" "If this is left empty the pathlen is not included in the certificate. " "Otherwise it distinguishes the count of chained CA certificates below this " "one.\n" "A pathlen of 0 means, that this certificate may not issue other sub-CA " "certificates. Although it can do it, all chain-checking algorithms in e.g. " "your browser or openssl will (should) fail." msgstr "" "Si ce champ est laissé vide, la distance aux peuilles n'est pas incluse dans " "le certificat. Sinon il limite le nombre de sous-CA en dessous de celui-ci.\n" "Une distance aux feuilles de 0 signifie que ce certificat ne peut pas signer " "de sous-CA. Bien qu'il puisse effectivement le faire, tous les algorithme de " "vérification de\n" "chaînage des certificats (p.ex: dans votre navigateur ou openssl) les " "refuseront." #: NewX509#51 msgid "The basic constraints should always be critical" msgstr "Les contraintes basiques doivent toujours être critiques" #: NewX509#52 msgid "Key identifier" msgstr "Identifiant de clé" #: NewX509#53 msgid "Creates a hash of the key following the PKIX guidelines" msgstr "Crée un hachage de la clé conformément aux directives PKIX" #: NewX509#54 msgid "Copy the Subject Key Identifier from the issuer" msgstr "Copie l'identifiant de clé du sujet du signataire" #: NewX509#55 msgid "" "If this box is checked an attempt is made to copy the subject key identifier " "from the signing certificate.\n" "It also copies the issuer and serial number from the issuer certificate. " "Normally this will only be done if the keyid option fails." msgstr "" "Quand cette case est cochée, l'identifiant de clé est copiée du certificat " "signataire.\n" "L'emetteur et le numéro de série du certificat signataire sont aussi copiés: " "normalement cette copie n'est effectuée que si la copie de l'identifiant de " "clé échoue." #: NewX509#56 msgctxt "NewX509#56" msgid "Validity" msgstr "Validité" #: NewX509#57 msgctxt "NewX509#57" msgid "Not before" msgstr "Pas avant" #: NewX509#58 msgctxt "NewX509#58" msgid "Not after" msgstr "Pas après" #: NewX509#59 msgctxt "NewX509#59" msgid "Time range" msgstr "Intervalle de temps" #: NewX509#60 msgctxt "NewX509#60" msgid "Days" msgstr "Jours" #: NewX509#61 msgctxt "NewX509#61" msgid "Months" msgstr "Mois" #: NewX509#62 msgctxt "NewX509#62" msgid "Years" msgstr "Années" #: NewX509#63 msgctxt "NewX509#63" msgid "Apply" msgstr "Appliquer" #: NewX509#64 msgid "Set the time to 00:00:00 and 23:59:59 respectively" msgstr "Définir les heures à 00:00:00 et 23:59:59 respectivement" #: NewX509#65 msgctxt "NewX509#65" msgid "Midnight" msgstr "Minuit" #: NewX509#66 msgctxt "NewX509#66" msgid "No well-defined expiration" msgstr "Date d'expiration mal définie" #: NewX509#67 msgid "Authority Info Access" msgstr "Accès à l'information de l'autorité" #: NewX509#68 msgid "CRL distribution point" msgstr "Point de distribution de la liste de révocation" #: NewX509#69 msgid "issuer alternative name" msgstr "Nom alternatif du signataire" #: NewX509#70 msgid "URI:" msgstr "URI:" #: NewX509#71 msgid "" "This is a multi-valued extension that supports all the literal options of " "subject alternative name. Of the few software packages that currentlyi " "nterpret this extension most only interpret the URI option.\n" "Currently each option will set a new DistributionPoint with the fullName " "field set to the given value.\n" "Other fields like cRLissuer and reasons cannot currently be set or " "displayed: at this time no examples were available that used these fields.\n" "If you see this extension with <UNSUPPORTED> when you attempt to print it " "out or it doesn't appear to display correctly then let steve know, including " "the certificate (mail steve at openssl dot org) .\n" "Examples:\n" "URI:http://www.myhost.com/myca.crl\n" "URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl" msgstr "" "Cette extension est un agrégat de toutes les options littérales du nom " "alternatif du sujet. Parmi les quelques logiciels qui utilisent cette " "extension aujourd'hui, la plupart ne traitent uniquement l'option URI.\n" "Chaque option introduit un nouveau point de distribution qualifié par son " "nom complet.\n" "Pour l'instant, les autres champs comme 'CRLissuer' et 'reasons' ne peuvent " "pas être saisis ou affichés. Aucun exemple utilisant ces champs n'est " "disponible aujourd'hui.\n" "Si cette extension apparaît comme <UNSUPPORTED> ou si le contenu ne semble " "pas affiché correctement, faites-le savoir a Steve (courriel: steve arobase " "openssl point org).\n" "Exemples:\n" "URI:http://www.monsite.com/monca.crl\n" "URI:http://www.moi.com/moi.crl, URI:http://www.lui.com/moi.crl" #: NewX509#72 msgid "can be altered by the file \"aia.txt\"" msgstr "peut être altéré par le fichier \"aia.txt\"" #: NewX509#73 msgid "Edit" msgstr "Modifier" #: NewX509#74 msgid "DNS: IP: URI: email: RID:" msgstr "DNS: IP: URI: email: RID:" #: NewX509#75 msgid "" "The authority information access extension gives details about how to access " "certain information relating to the CA. Its syntax is accessOID;location " "where 'location' has the same syntax as subject alternative name (except " "that email:copy is not supported). accessOID can be any valid OID but only " "certain values are meaningful for example OCSP and caIssuers. OCSP gives the " "location of an OCSP responder: this is used by Netscape PSM and other " "software.\n" "\n" "Example:\n" "\n" "OCSP;URI:http://ocsp.my.host/\n" "caIssuers;URI:http://my.ca/ca.html" msgstr "" "L'extension d'accès à l'information de l'autorité indique comment accéder à " "certaines informations concernant le certificat d'autorité. La syntaxe est " "accèsOID;emplacement où 'emplacement` à la même syntaxe que le nom " "alternatif du sujet (à part 'email:copy\" qui n'est pas supporté). N'importe " "quel OID valide peut être spécifié pour accèsOID, mais seules certaines " "valeurs ont un sens, par exemple OCSP et caIssuers. OCSP renseigne sur " "l'emplacement d'un répondeur OCSP; ceci est untilisé par les navigateurs Web " "et d'autres logiciels.\n" "\n" "Exemple:\n" "\n" "OCSP;URI:http://ocsp.mon.site/\n" "caIssuers;URI:http://moi.ca/ca.html" #: NewX509#76 msgid "" "The subject alternative name extension allows various literal values to be " "used. These include \"email\" (an email address) , \"URI\" a uniform " "resource indicator, \"DNS\" (a DNS domain name) , RID (a registered ID: " "OBJECT IDENTIFIER) and IP (an IP address).\n" "Examples:\n" "email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/\n" "email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld" msgstr "" "Cette extension contient le nom alternatif du sujet et permet de regrouper " "plusieurs valeurs littérales. Celles-ci comprennent \"email\" (un adresse de " "courriel), \"URI\" (un indicateur uniforme de ressource), \"DNS\" (un nom de " "domaine), \"RID\" (un identifiant d'objet enregistré) et \"IP\" (une adresse " "IP).\n" "Exemples:\n" "email:mon@autre.adresse, IP: 1.1.1.1 , URI:http://mon.url.ici/\n" "email:mon@autre.adresse, RID:1.2.3.4, DNS: serveur.de.nom.tld" #: NewX509#77 msgid "subject alternative name" msgstr "nom alternatif du sujet" #: NewX509#78 msgid "" "The issuer alternative name extension allows various literal values to be " "used. These include \"email\" (an email address) , \"URI\" a uniform " "resource indicator, \"DNS\" (a DNS domain name), RID (a registered ID: " "OBJECT IDENTIFIER) and IP (an IP address).\n" "Examples:\n" "email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/\n" "email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld" msgstr "" "Cette extension contient le nom alternatif du signataire et permet de " "regrouper plusieurs valeurs littérales. Celles-ci comprennent \"email\" (un " "adresse de courriel), \"URI\" (un indicateur uniforme de ressource), \"DNS" "\" (un nom de domaine), \"RID\" (un identifiant d'objet enregistré) et \"IP" "\" (une adresse IP).\n" "Exemples:\n" "email:mon@autre.adresse, IP: 1.1.1.1 , URI:http://mon.url.ici/\n" "email:mon@autre.adresse, RID:1.2.3.4, DNS: serveur.de.nom.tld" #: NewX509#79 msgid "Key usage" msgstr "Utilisation de la clé" #: NewX509#80 msgid "Extended key usage" msgstr "Utilisation étendue de la clé" #: NewX509#81 msgid "Netscape" msgstr "Netscape" #: NewX509#82 msgid "CA Revocation URL" msgstr "URL de révocation du certificat CA" #: NewX509#83 msgid "Revocation URL" msgstr "URL de révocation" #: NewX509#84 msgid "SSL server name" msgstr "Nom du serveur SSL" #: NewX509#85 msgid "Certificate renewal URL" msgstr "URL de renouvellement de certificat" #: NewX509#86 msgid "Comment" msgstr "Commentaire" #: NewX509#87 msgid "CA policy URL" msgstr "URL des conditions générales du CA" #: NewX509#88 msgid "Base URL" msgstr "URL de base" #: NewX509#89 msgid "If you know a more pretty one tell me" msgstr "Si vous en connaissez un plus joli, faites-le moi savoir" #: NewX509#90 msgid "Advanced" msgstr "Avancé" #: NewX509#91 msgctxt "NewX509#91" msgid "Validate" msgstr "Valider" #: NewX509#92 msgid "Create a &self signed certificate with a MD5-hashed QA serial" msgstr "" "Créer un certificat auto-&signé avec un numéro de série QA basé sur MD5" #: NewX509#93 msgid "Create Certificate signing request" msgstr "Créer une requête de signature de certificat" #: NewX509#94 msgid "minimum size: %1" msgstr "taille minimale: %1" #: NewX509#95 msgid "maximum size: %1" msgstr "taille maximale: %1" #: NewX509#96 msgid "only a-z A-Z 0-9 '()+,-./:=?" msgstr "seulement a-z A-Z 0-9 '()+,-./:=?" #: NewX509#97 msgid "only 7-bit clean characters" msgstr "seulement des caractères 7-bit ASCII imprimables" #: NewX509#98 msgid "XCA template" msgstr "modèle XCA" #: NewX509#99 msgid "Create x509 Certificate" msgstr "Créer un certificat x509" #: NewX509#100 msgid "From PKCS#10 request" msgstr "A partir d'une requête en PKCS#10" #: NewX509#101 msgid "Other Tabs" msgstr "Autres Onglets" #: NewX509#102 msgid "Advanced Tab" msgstr "Onglet Avancé" #: NewX509#103 msgid "Errors" msgstr "Erreurs" #: NewX509#104 msgctxt "NewX509#104" msgid "Abort rollout" msgstr "Interrompre le déploiement" #: NewX509#105 msgid "The following length restrictions of RFC3280 are violated:" msgstr "" "Pour être en conformité avec la RFC3280, les règles de restriction de " "longueur suivantes ne sont pas respectées:" #: NewX509#106 msgid "Edit subject" msgstr "Modifier le sujet" #: NewX509#107 msgctxt "NewX509#107" msgid "Continue rollout" msgstr "Continuer le déploiement" #: NewX509#108 msgid "" "The verification of the Certificate request failed.\n" "The rollout should be aborted." msgstr "" "La vérification de la requête de signature à échoué.\n" "Le déploiement devrait être interrompu." #: NewX509#109 msgid "Continue anyway" msgstr "Continuer quand-même" #: NewX509#110 msgid "" "The internal name and the common name are empty.\n" "Please set at least the internal name." msgstr "" "Le nom interne et le nom commun sont vides.\n" "SVP saisir au moins le nom interne." #: NewX509#111 msgid "Edit name" msgstr "Modifier le nom" #: NewX509#112 msgid "There is no Key selected for signing." msgstr "Aucune clé n'est sélectionnée pour la signature." #: NewX509#113 msgid "Select key" msgstr "Sélectionner la clé" #: NewX509#114 msgid "" "The following distinguished name entries are empty:\n" "%1\n" "though you have declared them as mandatory in the options menu." msgstr "" "Les indications de nom distinctif suivantes sont vides:\n" "%1\n" "bien que vous les avez déclarées comme obligatoires dans le menu des options." #: NewX509#115 msgctxt "NewX509#115" msgid "The key you selected for signing is not a private one." msgstr "La clé sélectionnée pour la signature n'est pas une clé privée." #: NewX509#116 msgid "Select other signer" msgstr "Sélectionner un autre signataire" #: NewX509#117 msgid "Select other key" msgstr "Sélectionner une autre clé" #: NewX509#118 msgctxt "NewX509#118" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" "Le certificat serait valide avant son signataire. Ce n'est probablement pas " "ce qui est désiré." #: NewX509#119 msgid "Edit dates" msgstr "Modifier les limites de validité" #: NewX509#120 msgctxt "NewX509#120" msgid "Adjust date and continue" msgstr "Ajuster la date et continuer" #: NewX509#121 msgctxt "NewX509#121" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" "Le certificat serait valide plus longtemps que son signataire. Ce n'est " "probablement pas ce qui est désiré." #: NewX509#122 msgid "" "The certificate will be out of date before it becomes valid. You most " "probably mixed up both dates." msgstr "" "Le certificat serait échu avant de devenir actif. Vous avez probablement " "interverti les deux dates." #: NewX509#123 msgid "" "The certificate contains duplicated extensions. Check the validation on the " "advanced tab." msgstr "" "Le certificat contient des extensions dupliquées. Valider et vérifier sur " "l'onglet \"Avancé\"." #: NewX509#124 msgid "Edit extensions" msgstr "Modifier les extensions" #: NewX509#125 msgid "Configfile error on line %1\n" msgstr "Erreur dans le fichier de configuration à la ligne %1\n" #: Options#1 msgid "XCA Options" msgstr "Options de XCA" #: Options#2 msgid "Mandatory subject entries" msgstr "Inscriptions du sujet obligatoires" #: Options#3 msgctxt "Options#3" msgid "Add" msgstr "Ajouter" #: Options#4 msgctxt "Options#4" msgid "Delete" msgstr "Détruire" #: Options#5 msgid "Default hash algorithm" msgstr "Algorithme de hachage par défaut" #: Options#6 msgid "String types" msgstr "Types de chaînes" #: Options#7 msgid "Suppress success messages" msgstr "Supprimer les messages en cas de succès" #: Options#8 msgid "PKCS#11 provider" msgstr "Fournisseur PKCS#11" #: Options#9 msgid "Remove" msgstr "Enlever" #: Options#10 msgid "Printable string or UTF8 (default)" msgstr "Chaîne imprimable ou UTF8 (défaut)" #: Options#11 msgid "PKIX recommendation in RFC2459" msgstr "La recommandation PKIX est dans la RFC2459" #: Options#12 msgid "No BMP strings, only printable and T61" msgstr "Pas de chaîne BMP, seulement imprimable et T61" #: Options#13 msgid "UTF8 strings only (RFC2459)" msgstr "Chaînes UTF8 uniquement (RFC2459)" #: Options#14 msgid "All strings" msgstr "Toutes les chaînes" #: Options#15 msgid "Load failed" msgstr "Le chargement a échoué" #: PwDialog#1 msgctxt "PwDialog#1" msgid "Password" msgstr "Mot de passe" #: PwDialog#2 msgid "" "The password is parsed as 2-digit hex code. It must have an equal number of " "digits (0-9 and a-f)" msgstr "" "Le mot de passe doit être exprimé sous forme d'une suite de chiffres " "hexadécimaux. Il doit contenir un nombre pair de chiffres (0-9 et a-f)" #: PwDialog#3 msgid "Take as HEX string" msgstr "Exprimé en hexadécimal" #: PwDialog#4 msgid "Repeat %1" msgstr "Répéter %1" #: PwDialog#5 msgid "%1 missmatch" msgstr "%1 ne correspond pas" #: PwDialog#6 msgid "" "Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it " "must consist of an even number of characters" msgstr "" "Un mot de passe hexadécimal peut seulement contenir les caractères '0' à '9' " "et 'a' à 'f' et il doit consister en un nombre pair de caractères" #: PwDialog#7 msgid "E&xit" msgstr "&Quitter" #: QObject#1 msgid "Undefined" msgstr "Indéfini" #: QObject#2 msgid "DB: Rename: '%1' already in use" msgstr "DB: Renommer: '%1' déjà en utilisation" #: QObject#3 msgid "DB: Entry to rename not found: %1" msgstr "DB: l'inscription à renommer n'a pas été trouvée: '%1'" #: QObject#4 msgid "DB: Write error %1 - %2" msgstr "DB: Erreur d'écriture %1 - %2" #: QObject#5 msgid "Out of data" msgstr "A court de données" #: QObject#6 msgid "Error finding endmarker of string" msgstr "Erreur: une marque de fin de chaîne n'a pas été trouvée" #: QObject#7 msgid "Out of Memory at %1:%2" msgstr "A court de mémoire à %1:%2" #: QObject#8 msgctxt "QObject#8" msgid "All files ( * )" msgstr "Tous les fichiers ( * )" #: QObject#9 msgid "PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;" msgstr "Clés PKI ( *.pem *.der *.key );;Clés PKCS#8 ( *.p8 *.pk8 );;" #: QObject#10 msgid "Import RSA key" msgstr "Importer une clé RSA" #: QObject#11 msgid "PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;" msgstr "" "Requête PKCS#10 ( *.pem *.der *.csr );;Requête Netscape ( *.spkac *.spc );;" #: QObject#12 msgid "Import Request" msgstr "Importer une requête" #: QObject#13 msgid "Certificates ( *.pem *.der *.crt *.cer );;" msgstr "Certificats ( *.pem *.der *.crt *.cer );;" #: QObject#14 msgid "Import X.509 Certificate" msgstr "Importer un certificat X.509" #: QObject#15 msgid "PKCS#7 data ( *.p7s *.p7m *.p7b );;" msgstr "Données PKCS#7 ( *.p7s *.p7m *.p7b );;" #: QObject#16 msgid "Import PKCS#7 Certificates" msgstr "Importer un certificat PKCS#7" #: QObject#17 msgid "PKCS#12 Certificates ( *.p12 *.pfx );;" msgstr "Certificats PKCS#12 ( *.p12 *.pfx );;" #: QObject#18 msgid "Import PKCS#12 Private Certificate" msgstr "Importer un certificat privé PKCS#12" #: QObject#19 msgid "XCA templates ( *.xca );;" msgstr "Modèles XCA ( *.xca );;" #: QObject#20 msgid "Import XCA Templates" msgstr "Importer des modèles XCA" #: QObject#21 msgid "Revocation lists ( *.pem *.der *.crl );;" msgstr "Listes de révocation ( *.pem *.der *.crl );;" #: QObject#22 msgid "Import Certificate Revocation List" msgstr "Importer une liste de révocation de certificats" #: QObject#23 msgid "XCA Databases ( *.xdb );;" msgstr "Bases de données XCA ( *.xdb );;" #: QObject#24 msgid "Open XCA Database" msgstr "Ouvrir une Base de Données XCA" #: QObject#25 msgid "PKCS#11 library ( *.dll );;" msgstr "Bibliothèque PKCS#11 ( *.dll );;" #: QObject#26 msgid "PKCS#11 library ( *.dylib *.so );;" msgstr "Bibliothèque PKCS#11 ( *.dylib *.so );;" #: QObject#27 msgid "PKCS#11 library ( *.so );;" msgstr "Bibliothèque PKCS#11 ( *.so );;" #: QObject#28 msgid "Open PKCS#11 shared library" msgstr "Ouvrir une bibliothèque partagée PKCS#11" #: QObject#29 msgid "PEM files ( *.pem );;" msgstr "Fichiers PEM ( *.pem );;" #: QObject#30 msgid "Load PEM encoded file" msgstr "Charger un fichier encodé en PEM" #: QObject#31 msgid "Please enter the PIN on the PinPad" msgstr "Saisir le NIP sur le pavé prévu à cet effet SVP" #: QObject#32 msgid "Please enter the SO PIN (PUK) of the token %1" msgstr "SVP saisir le PUK du jeton '%1'" #: QObject#33 msgid "Please enter the PIN of the token %1" msgstr "SVP saisir le NIP du jeton '%1'" #: QObject#34 msgid "No Security token found" msgstr "Aucun jeton de sécurité trouvé" #: QObject#35 msgid "Select" msgstr "Sélectionner" #: QObject#36 msgid "Please enter the new SO PIN (PUK) for the token: '%1'" msgstr "SVP saisir le nouveau PUK pour le jeton: '%1'" #: QObject#37 msgid "Please enter the new PIN for the token: '%1'" msgstr "SVP saisir le nouveau NIP pour le jeton: '%1'" #: QObject#38 msgid "Required PIN size: %1 - %2" msgstr "Taille du NIP requise: %1 - %2" #: QObject#39 msgid "Failed to open PKCS11 library: %1" msgstr "L'ouverture de la bibliothèque PKCS#11 '%1' a échoué" #: QObject#40 msgid "PKCS#11 function '%1' failed: %2" msgstr "La fonction PKCS#11 '%1' a échoué: %2" #: QObject#41 msgid "" "PKCS#11 function '%1' failed: %2\n" "In library %3\n" "%4" msgstr "" "La fonction PKCS#11 '%1' a échoué: %2\n" "Dans la bibliothèque %3\n" "%4" #: QObject#42 msgid "Invalid" msgstr "Invalide" #: QObject#43 msgid "%1 is shorter than %2 bytes: '%3'" msgstr "%1 est plus court que %2 octets: '%3'" #: QObject#44 msgid "%1 is longer than %2 bytes: '%3'" msgstr "%1 est plus long que %2 octets: '%3'" #: Revoke#1 msgid "Revokation details" msgstr "Détails de la révocation" #: Revoke#2 msgid "Invalid since" msgstr "Non-valide depuis" #: Revoke#3 msgid "Revokation reason" msgstr "Raison de la révocation" #: SelectToken#1 msgid "Select Token" msgstr "Sélectionner un jeton" #: SelectToken#2 msgctxt "SelectToken#2" msgid "Security token" msgstr "Jeton de sécurité" #: SelectToken#3 msgid "Please select the security token" msgstr "SVP sélectionner le jeton de sécurité" #: TrustState#1 msgid "Set trustment of the Certificate" msgstr "Ajuster le niveau de confiance du certificat" #: TrustState#2 msgid "Trustment" msgstr "Niveau de confiance" #: TrustState#3 msgid "&Never trust this certificate" msgstr "&Ne jamais se fier à ce certificat" #: TrustState#4 msgid "Only &trust this certificate, if we trust the signer" msgstr "Ne &se fier à ce certificat qui si son signataire est de confiance" #: TrustState#5 msgid "&Always trust this certificate" msgstr "&Toujours se fier à ce certificat" #: Validity#1 msgid "yyyy-MM-dd hh:mm" msgstr "yyyy-MM-dd hh:mm" #: db_base#1 msgctxt "db_base#1" msgid "Internal name" msgstr "Nom interne" #: db_base#2 msgid "Reset" msgstr "Réinitialisation" #: db_base#3 msgid "Subject entries" msgstr "Inscriptions du sujet" #: db_base#4 msgid "Paste PEM data" msgstr "Coller les données en format PEM" #: db_base#5 msgid "Columns" msgstr "Colonnes" #: db_crl#1 msgid "Signer" msgstr "Signataire" #: db_crl#2 msgid "Internal name of the signer" msgstr "Nom interne du signataire" #: db_crl#3 msgid "No. revoked" msgstr "Numéro révoqué" #: db_crl#4 msgid "Number of revoked certificates" msgstr "Nombre de certificats révoqués" #: db_crl#5 msgid "Last update" msgstr "Dernière mise-à-jour" #: db_crl#6 msgid "Next update" msgstr "Prochaine mise-à-jour" #: db_crl#7 msgid "CRL number" msgstr "Numéro de la liste de révocation" #: db_crl#8 msgid "" "The revokation list already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" "Cette liste de révocation figure déjà dans la base de données sous le nom:\n" "'%1'\n" "En conséquence, elle n'a pas été importée" #: db_crl#9 msgid "CRL ( *.pem *.der *.crl )" msgstr "Listes de révocation ( *.pem *.der *.crl )" #: db_crl#10 msgid "Revokation list export" msgstr "Exportation d'une liste de révocation" #: db_crl#11 msgctxt "db_crl#11" msgid "Import" msgstr "Importer" #: db_crl#12 msgctxt "db_crl#12" msgid "Rename" msgstr "Renommer" #: db_crl#13 msgctxt "db_crl#13" msgid "Export" msgstr "Exporter" #: db_crl#14 msgctxt "db_crl#14" msgid "Clipboard" msgstr "Presse-papier" #: db_crl#15 msgctxt "db_crl#15" msgid "File" msgstr "Fichier" #: db_crl#16 msgctxt "db_crl#16" msgid "Delete" msgstr "Supprimer" #: db_key#1 msgctxt "db_key#1" msgid "Type" msgstr "Type" #: db_key#2 msgid "Size" msgstr "Taille" #: db_key#3 msgid "Use" msgstr "Usage" #: db_key#4 msgctxt "db_key#4" msgid "Password" msgstr "Mot de passe" #: db_key#5 msgid "" "The key is already in the database as:\n" "'%1'\n" "and is not going to be imported" msgstr "" "Cette clé figure déjà dans la base de données sous le nom:\n" "'%1'\n" "En conséquence, elle ne va pas être importée" #: db_key#6 msgid "" "The database already contains the public part of the imported key as\n" "'%1\n" "and will be completed by the new, private part of the key" msgstr "" "La base de donnée connait déjà la partie publique de la clé importée sous le " "nom\n" "'%1'\n" "En conséquence, cette dernière sera complétée par la partie privée de la clé " "importée" #: db_key#7 msgid "Key size too small !" msgstr "Taille de clé trop petite !" #: db_key#8 msgid "You are sure to create a key of the size: %1 ?" msgstr "Etes-vous sûr de couloir créer une clé de taille %1 ?" #: db_key#9 msgid "" "Shall the original key '%1' be replaced by the key on the token?\n" "This will delete the key '%1' and make it unexportable" msgstr "" "La clé originale '%1' doit-elle être remplacée par la clé en provenance du " "jeton ?\n" "Cela détruirait la clé '%1' et la rendrait non-exportable." #: db_key#10 msgctxt "db_key#10" msgid "New Key" msgstr "Nouvelle clé" #: db_key#11 msgctxt "db_key#11" msgid "Import" msgstr "Importer" #: db_key#12 msgctxt "db_key#12" msgid "Rename" msgstr "Renommer" #: db_key#13 msgctxt "db_key#13" msgid "Show Details" msgstr "Afficher les Détails" #: db_key#14 msgctxt "db_key#14" msgid "Delete" msgstr "Détruire" #: db_key#15 msgctxt "db_key#15" msgid "Export" msgstr "Exporter" #: db_key#16 msgid "Change password" msgstr "Changer le mot de passe" #: db_key#17 msgid "Reset password" msgstr "Effacer le mot de passe" #: db_key#18 msgid "Change PIN" msgstr "Changer le NIP" #: db_key#19 msgid "Init PIN with SO PIN (PUK)" msgstr "Initialiser le NIP avec le PUK" #: db_key#20 msgid "Change SO PIN (PUK)" msgstr "Changer le PUK" #: db_key#21 msgid "Store on Security token" msgstr "Enregistrer dans le jeton de sécurité" #: db_key#22 msgid "Tried to change password of a token" msgstr "Tentative de changement de mot de passe d'un jeton de sécurité" #: db_key#23 msgid "Tried to change PIN of a key" msgstr "Tentative de changement de NIP d'une clé" #: db_key#24 msgid "Tried to init PIN of a key" msgstr "Tentative d'initialisation du NIP d'une clé" #: db_key#25 msgid "Tried to change SO PIN of a key" msgstr "Tentative de changement de PUK d'une clé" #: db_temp#1 msgctxt "db_temp#1" msgid "Type" msgstr "Type" #: db_temp#2 msgid "Bad template: %1" msgstr "Mauvais modèle: %1" #: db_temp#3 msgid "Nothing" msgstr "Rien" #: db_temp#4 msgid "Preset Template values" msgstr "Initaliser les valeurs du modèle" #: db_temp#5 msgid "copy" msgstr "copier" #: db_temp#6 msgid "Save template as" msgstr "Enregistrer le modèle sous" #: db_temp#7 msgid "XCA templates ( *.xca);; All files ( * )" msgstr "Modèles XCA ( *.xca);; Tous les fichiers ( * )" #: db_temp#8 msgid "New Template" msgstr "Nouveau modèle" #: db_temp#9 msgctxt "db_temp#9" msgid "Import" msgstr "Importer" #: db_temp#10 msgctxt "db_temp#10" msgid "Rename" msgstr "Renommer" #: db_temp#11 msgctxt "db_temp#11" msgid "Export" msgstr "Exporter" #: db_temp#12 msgid "Change" msgstr "Changer" #: db_temp#13 msgctxt "db_temp#13" msgid "Delete" msgstr "Détruire" #: db_temp#14 msgid "Duplicate" msgstr "Dupliquer" #: db_temp#15 msgid "Create certificate" msgstr "Créer un certificat" #: db_temp#16 msgid "Create request" msgstr "Créer une requête" #: db_x509#1 msgid "CA" msgstr "CA" #: db_x509#2 msgid "reflects the basic Constraints extension" msgstr "reflète l'extension des contraintes basiques" #: db_x509#3 msgctxt "db_x509#3" msgid "Serial" msgstr "Numéro de série" #: db_x509#4 msgid "md5 fingerprint" msgstr "Empreinte MD5" #: db_x509#5 msgid "sha1 fingerprint" msgstr "Empreinte sha1" #: db_x509#6 msgid "Start date" msgstr "Date de début" #: db_x509#7 msgid "not Before" msgstr "pas Avant" #: db_x509#8 msgid "Expiry date" msgstr "Date d'expiration" #: db_x509#9 msgid "not After" msgstr "pas Après" #: db_x509#10 msgid "Trust state" msgstr "État de confiance" #: db_x509#11 msgctxt "db_x509#11" msgid "Revocation" msgstr "Révocation" #: db_x509#12 msgctxt "db_x509#12" msgid "Plain View" msgstr "Vue à plat" #: db_x509#13 msgid "Tree View" msgstr "Vue arborescente" #: db_x509#14 msgid "" "The certificate already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" "Ce certificat figure déjà dans la base de données sous le nom:\n" "'%1'\n" "En conséquence, il n'a pas été importé" #: db_x509#15 msgid "Invalid public key" msgstr "Clé publique invalide" #: db_x509#16 msgid "Please enter the new hexadecimal secret number for the QA process." msgstr "SVP saisir le nouveau nombre secret hexadécimal pour le processus QA." #: db_x509#17 msgid "The QA process has been terminated by the user." msgstr "Le processus QA a été arrêté par l'utilisateur." #: db_x509#18 msgctxt "db_x509#18" msgid "The key you selected for signing is not a private one." msgstr "La clé sélectionnée pour la signature n'est pas une clé privée." #: db_x509#19 msgid "Store the certificate to the key on the token '%1 (#%2)' ?" msgstr "Enregistrer le certificate avec la clé sur le jeton '%1 (#%2)' ?" #: db_x509#20 msgid "New Certificate" msgstr "Nouveau Certificat" #: db_x509#21 msgctxt "db_x509#21" msgid "Import" msgstr "Importer" #: db_x509#22 msgid "Import PKCS#12" msgstr "Importer en PKCS#12" #: db_x509#23 msgid "Import from PKCS#7" msgstr "Importer en PKCS#7" #: db_x509#24 msgctxt "db_x509#24" msgid "Rename" msgstr "Renommer" #: db_x509#25 msgctxt "db_x509#25" msgid "Show Details" msgstr "Afficher les Détails" #: db_x509#26 msgctxt "db_x509#26" msgid "Extract public Key" msgstr "Extraire la clé publique" #: db_x509#27 msgctxt "db_x509#27" msgid "Export" msgstr "Exporter" #: db_x509#28 msgctxt "db_x509#28" msgid "Clipboard" msgstr "Presse-papier" #: db_x509#29 msgctxt "db_x509#29" msgid "File" msgstr "Fichier" #: db_x509#30 msgid "Request" msgstr "Requête" #: db_x509#31 msgctxt "db_x509#31" msgid "Security token" msgstr "Jeton de sécurité" #: db_x509#32 msgid "Other token" msgstr "Autre jeton" #: db_x509#33 msgctxt "db_x509#33" msgid "Template" msgstr "Modèle" #: db_x509#34 msgctxt "db_x509#34" msgid "OpenSSL config" msgstr "Configuration OpenSSL" #: db_x509#35 msgctxt "db_x509#35" msgid "Delete" msgstr "Supprimer" #: db_x509#36 msgid "Delete from Security token" msgstr "Détruire sur le jeton de sécurité" #: db_x509#37 msgid "Trust" msgstr "Niveau de confiance" #: db_x509#38 msgid "Properties" msgstr "Propriétés" #: db_x509#39 msgid "Generate CRL" msgstr "Générer la liste de révocation" #: db_x509#40 msgctxt "db_x509#40" msgid "PKCS#7" msgstr "PKCS#7" #: db_x509#41 msgctxt "db_x509#41" msgid "Sign" msgstr "Signer" #: db_x509#42 msgid "Encrypt" msgstr "Encrypter" #: db_x509#43 msgid "Renewal" msgstr "Renouvellement" #: db_x509#44 msgid "Unrevoke" msgstr "Dé-révoquer" #: db_x509#45 msgid "Revoke" msgstr "Révoquer" #: db_x509#46 msgid "There was no key found for the Certificate: '%1'" msgstr "Aucune clé n'a été trouvée pour le Certificat. '%1'" #: db_x509#47 msgid "Not possible for a token key: '%1'" msgstr "Impossible pour une clé d'un jeton de sécurité: '%1'" #: db_x509#48 msgid "Not possible for the token-key Certificate '%1'" msgstr "Impossible pour le certificat d'une clé d'un jeton de sécurité: '%1'" #: db_x509#49 msgid " days" msgstr " jours" #: db_x509name#1 msgctxt "db_x509name#1" msgid "Subject" msgstr "Sujet" #: db_x509name#2 msgid "Complete distinguished name" msgstr "Nom distinctif complet" #: db_x509name#3 msgid "Subject hash" msgstr "Hachage du sujet" #: db_x509name#4 msgid "Hash to lookup certs in directories" msgstr "Hachage de recherche dans un dossier" #: db_x509req#1 msgctxt "db_x509req#1" msgid "Signed" msgstr "Signé" #: db_x509req#2 msgid "whether the request is already signed or not" msgstr "si la requête a déjà été signée ou non" #: db_x509req#3 msgid "Unstructured name" msgstr "Nom non-structuré" #: db_x509req#4 msgid "Challenge password" msgstr "Mot de passe challenge" #: db_x509req#5 msgid "" "The certificate signing request already exists in the database as\n" "'%1'\n" "and thus was not stored" msgstr "" "Cette requête de signature figure déjà dans la base de données sous le nom\n" "'%1'\n" "En conséquence, elle n'a pas été chargée" #: db_x509req#6 msgid "Certificate request ( *.pem *.der *.crl )" msgstr "Requête de signature de certificat ( *.pem *.der *.crl )" #: db_x509req#7 msgid "Certificate request export" msgstr "Exporter la requête de signature" #: db_x509req#8 msgid "New Request" msgstr "Nouvelle requête" #: db_x509req#9 msgctxt "db_x509req#9" msgid "Import" msgstr "Importer" #: db_x509req#10 msgctxt "db_x509req#10" msgid "Extract public Key" msgstr "Extraire la clé publique" #: db_x509req#11 msgctxt "db_x509req#11" msgid "Rename" msgstr "Renommer" #: db_x509req#12 msgctxt "db_x509req#12" msgid "Show Details" msgstr "Afficher les Détails" #: db_x509req#13 msgctxt "db_x509req#13" msgid "Sign" msgstr "Signer" #: db_x509req#14 msgctxt "db_x509req#14" msgid "Export" msgstr "Exporter" #: db_x509req#15 msgctxt "db_x509req#15" msgid "Clipboard" msgstr "Presse-papier" #: db_x509req#16 msgctxt "db_x509req#16" msgid "File" msgstr "Fichier" #: db_x509req#17 msgctxt "db_x509req#17" msgid "Template" msgstr "Modèle" #: db_x509req#18 msgctxt "db_x509req#18" msgid "OpenSSL config" msgstr "Configuration OpenSSL" #: db_x509req#19 msgctxt "db_x509req#19" msgid "Delete" msgstr "Détruire" #: db_x509super#1 msgid "Key name" msgstr "Nom de la clé" #: db_x509super#2 msgid "Internal name of the key" msgstr "Nom interne de la clé" #: db_x509super#3 msgid "Save as OpenSSL config" msgstr "Enregistrer en format de configuration OpenSSL" #: db_x509super#4 msgid "Config files ( *.conf *.cnf);; All files ( * )" msgstr "Fichiers de configuration (*.conf *.cnf);; Tous les fichiers ( * )" #: db_x509super#5 msgid "The following extensions were not ported into the template" msgstr "Les extensions suivantes n'ont pas été enregistrées dans le modèle" #: kvView#1 msgctxt "kvView#1" msgid "Type" msgstr "Type" #: kvView#2 msgid "Content" msgstr "Contenu" #: pass_info#1 msgctxt "pass_info#1" msgid "Password" msgstr "Mot de passe" #: pass_info#2 msgctxt "pass_info#2" msgid "PIN" msgstr "NIP" #: pki_base#1 msgctxt "pki_base#1" msgid "Error opening file: '%1': %2" msgstr "Erreur à l'ouverture du fichier '%1': %2" #: pki_base#2 msgid "Error writing to file: '%1': %2" msgstr "Erreur à l'écriture du fichier '%1': %2" #: pki_base#3 msgid "Error: " msgstr "Erreur: " #: pki_base#4 msgid "Internal error: Unexpected message: %1 %2" msgstr "Erreur interne: message inattendu: %1 %2" #: pki_crl#1 msgid "Successfully imported the revokation list '%1'" msgstr "La liste de révocation '%1' a été importée avec succès" #: pki_crl#2 msgid "Delete the revokation list '%1'?" msgstr "Détruire la liste de révocation '%1' ?" #: pki_crl#3 msgid "Successfully created the revokation list '%1'" msgstr "La liste de révocation '%1' a été créée avec succès" #: pki_crl#4 msgid "Delete the %1 revokation lists: %2?" msgstr "Détruire les %1 listes de révocation: %2 ?" #: pki_crl#5 msgid "" "Unable to load the revokation list in file %1. Tried PEM and DER formatted " "CRL." msgstr "" "Impossible de charger le liste de révocation du fichier %1. Les formats PEM " "et DER ont été essayés." #: pki_crl#6 msgid "No issuer given" msgstr "Aucun signataire spécifié" #: pki_crl#7 msgctxt "pki_crl#7" msgid "Wrong Size %1" msgstr "Taille fausse %1" #: pki_crl#8 msgid "unknown" msgstr "inconnu" #: pki_evp#1 msgid "Failed to decrypt the key (bad password) " msgstr "Le décryptage de la clé a échoué (mauvais mot de passe). " #: pki_evp#2 msgid "Please enter the password to decrypt the private key." msgstr "SVP saisir le mot de passe pour décrypter la clé privée" #: pki_evp#3 msgid "" "Please enter the password to decrypt the private key from file:\n" "%1" msgstr "" "SVP saisir le mot de passe pour décrypter la clé privée du fichier:\n" "%1" #: pki_evp#4 msgid "" "Unable to load the private key in file %1. Tried PEM and DER private, public " "and PKCS#8 key types." msgstr "" "Impossible de charger la clé privée du fichier %1. Les formats PEM et DER " "ainsi que les types de clés privé, public et PKCS#8 ont été essayés." #: pki_evp#5 msgid "Please enter the password to decrypt the private key: '%1'" msgstr "SVP saisir le mot de passe pour décrypter la clé privée: '%1'" #: pki_evp#6 msgid "Password input aborted" msgstr "Saisie du mot de passe abandonnée" #: pki_evp#7 msgid "Please enter the database password for decrypting the key '%1'" msgstr "" "SVP saisir le mot de basse de la base de données pour décrypter la clé '%1'" #: pki_evp#8 msgid "Please enter the password to protect the private key: '%1'" msgstr "SVP saisir le mot de pass pour protéger la clé privée: '%1'" #: pki_evp#9 msgid "Please enter the database password for encrypting the key" msgstr "SVP saisir le mot de passe de la base de données pour encrypter la clé" #: pki_evp#10 msgid "Please enter the password protecting the PKCS#8 key '%1'" msgstr "SVP saisir le mot de passe protégeant la clé en PKCS#8 '%1'" #: pki_evp#11 msgid "Please enter the export password for the private key '%1'" msgstr "SVP saisir le mot de passe d'exportation pour la clé privée '%1'" #: pki_key#1 msgid "Successfully imported the %1 public key '%2'" msgstr "Les %1 clés publiques '%2' ont été importées avec succès" #: pki_key#2 msgid "Delete the %1 public key '%2'?" msgstr "Détruire les %1 clés publiques '%2' ?" #: pki_key#3 msgid "Successfully imported the %1 private key '%2'" msgstr "Les %1 clés privées '%2' ont été importées avec succès" #: pki_key#4 msgid "Delete the %1 private key '%2'?" msgstr "Détruire les %1 clés privées '%2' ?" #: pki_key#5 msgid "Successfully created the %1 private key '%2'" msgstr "Les %1 clés privées '%2' ont été créées avec succès" #: pki_key#6 msgctxt "pki_key#6" msgid "Delete the %1 keys: %2?" msgstr "Détruire les %1 clés: '%2' ?" #: pki_key#7 msgid "public key" msgstr "clé publique" #: pki_key#8 msgid "Common" msgstr "Commun" #: pki_key#9 msgid "Private" msgstr "Privé" #: pki_key#10 msgid "Bogus" msgstr "Erroné" #: pki_key#11 msgctxt "pki_key#11" msgid "PIN" msgstr "NIP" #: pki_key#12 msgid "No password" msgstr "Pas de mot de passe" #: pki_multi#1 msgid "Seek failed" msgstr "Un \"seek\" a échoué" #: pki_pkcs12#1 msgid "" "Please enter the password to decrypt the PKCS#12 file:\n" "%1" msgstr "" "SVP saisir le mot de passe pour décrypter le fichier en PKCS#12:\n" "%1" #: pki_pkcs12#2 msgid "Unable to load the PKCS#12 (pfx) file %1." msgstr "Impossible de charger le fichier en PKCS#12 (pfx) %1." #: pki_pkcs12#3 msgid "The supplied password was wrong (%1)" msgstr "Le mot de passe renseigné était faux (%1)" #: pki_pkcs12#4 msgid "Please enter the password to encrypt the PKCS#12 file" msgstr "SVP saisir le mot de passe pour encrypter le fichier en PKCS#12" #: pki_pkcs12#5 msgid "No key or no Cert and no pkcs12" msgstr "Pas de clé ou pas de certificat et pas en PKCS#12" #: pki_pkcs7#1 msgid "Unable to load the PKCS#7 file %1. Tried PEM and DER format." msgstr "" "Impossible de charger le fichier en PKCS#7 %1. Les formats PEM et DER ont " "été essayés." #: pki_scard#1 msgid "Successfully imported the token key '%1'" msgstr "La clé du jeton '%1' a été importée avec succès" #: pki_scard#2 msgid "Delete the token key '%1'?" msgstr "Détruire la clé du jeton '%1' ?" #: pki_scard#3 msgid "Successfully created the token key '%1'" msgstr "La clé du jeton '%1' a été créée avec succès" #: pki_scard#4 msgctxt "pki_scard#4" msgid "Delete the %1 keys: %2?" msgstr "Détruire les %1 clés: '%2' ?" #: pki_scard#5 msgid "Delete the private key '%1' from the token '%2 (#%3)' ?" msgstr "Détruire la clé privée '%1' sur le jeton '%2 (#%3)' ?" #: pki_scard#6 msgid "only RSA keys can be stored on tokens" msgstr "Seules des clés RSA peuvent être enregistrées sur les jetons" #: pki_scard#7 msgid "This Key is already on the token" msgstr "Cette clé est déjà sur le jeton" #: pki_scard#8 msgid "PIN input aborted" msgstr "Saisie du NIP abandonnée" #: pki_scard#9 msgid "Unable to find copied key on the token" msgstr "Impossible de trouver la clé copiée sur le jeton" #: pki_scard#10 msgid "Please insert card: %1 %2 [%3] with Serial: %4" msgstr "SVP insérer la carte %1 %2 [%3] avec le numéro de série: %4" #: pki_scard#11 msgid "Public Key missmatch. Please re-import card" msgstr "La clé publique ne correspond pas. Veuillez re-importer la carte" #: pki_scard#12 msgid "Unable to find generated key on card" msgstr "Impossible de trouver la clé générée sur la carte" #: pki_scard#13 msgctxt "pki_scard#13" msgid "Wrong Size %1" msgstr "Taille fausse %1" #: pki_scard#14 msgid "Token %1" msgstr "Jeton %1" #: pki_scard#15 msgid "Failed to find the key on the token" msgstr "Impossible de trouver la clé sur le jeton" #: pki_scard#16 msgid "Invalid Pin for the token" msgstr "NIP invalide pour le jeton" #: pki_temp#1 msgid "Successfully imported the XCA template '%1'" msgstr "Le modèle XCA '%1' a été importé avec succès" #: pki_temp#2 msgid "Delete the XCA template '%1'?" msgstr "Détruire le modèle XCA '%1' ?" #: pki_temp#3 msgid "Successfully created the XCA template '%1'" msgstr "Le modèle XCA '%1' a été créé avec succès" #: pki_temp#4 msgid "Delete the %1 XCA templates: %2?" msgstr "Détruire les %1 modèles XCA: %2 ?" #: pki_temp#5 msgctxt "pki_temp#5" msgid "Wrong Size %1" msgstr "Taille fausse %1" #: pki_temp#6 msgid "Template file content error (too small): %1" msgstr "erreur de contenu du fichier de modèle (trop petit): %1" #: pki_temp#7 msgid "Template file content error (bad size): %1 " msgstr "erreur de contenu du fichier de modèle (mauvaise taille): %1 " #: pki_temp#8 msgid "Template file content error (bad length) :%1" msgstr "erreur de contenu du fichier de modèle (mauvaise longueur): %1" #: pki_x509#1 msgid "Successfully imported the certificate '%1'" msgstr "Le certificat '%1' a été importée avec succès" #: pki_x509#2 msgid "Delete the certificate '%1'?" msgstr "Détruire le certificat '%1' ?" #: pki_x509#3 msgid "Successfully created the certificate '%1'" msgstr "Le certificat '%1' a été créé avec succès" #: pki_x509#4 msgid "Delete the %1 certificates: %2?" msgstr "Détruire les %1 certificats: '%2' ?" #: pki_x509#5 msgid "" "Unable to load the certificate in file %1. Tried PEM and DER certificate." msgstr "" "Impossible de charge le certificat du fichier %1. Les formats PEM et DER ont " "été essayés." #: pki_x509#6 msgid "This certificate is already on the security token" msgstr "Ce certificat est déjà dans le jeton de sécurité" #: pki_x509#7 msgid "Delete the certificate '%1' from the token '%2 (#%3)'?" msgstr "Détruire le certificat '%1' sur le jeton '%2 (#%3)' ?" #: pki_x509#8 msgid "There is no key for signing !" msgstr "Il n'y a pas de clé pour signer !" #: pki_x509#9 msgctxt "pki_x509#9" msgid "Wrong Size %1" msgstr "Taille fausse %1" #: pki_x509#10 msgctxt "pki_x509#10" msgid "Not trusted" msgstr "Pas sûr" #: pki_x509#11 msgid "Trust inherited" msgstr "Confiance héritée" #: pki_x509#12 msgid "Always Trusted" msgstr "Sûr" #: pki_x509#13 msgid "CRL expires: %1" msgstr "La liste de révocation expire le %1" #: pki_x509#14 msgid "No" msgstr "Non" #: pki_x509#15 msgid "Yes" msgstr "Oui" #: pki_x509req#1 msgid "Signing key not valid (public key)" msgstr "La clé de signature n'est pas valide (c'est une clé publique)" #: pki_x509req#2 msgid "Successfully imported the %1 certificate request '%2'" msgstr "Les %1 requêtes de signature '%2' ont été importées avec succès" #: pki_x509req#3 msgid "Delete the %1 certificate request '%2'?" msgstr "Détruire les %1 requêtes de signature '%2' ?" #: pki_x509req#4 msgid "Successfully created the %1 certificate request '%2'" msgstr "Les %1 requêtes de signature '%2' ont été créées avec succès" #: pki_x509req#5 msgid "Delete the %1 certificate requests: %2?" msgstr "Détruire les %1 requêtes de signature '%2' ?" #: pki_x509req#6 msgid "" "Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC " "format." msgstr "" "Impossible de charger la requête de signature du fichier %1. Les formats " "PEM, DER et SPKAC ont été essayés." #: pki_x509req#7 msgctxt "pki_x509req#7" msgid "Signed" msgstr "Signé" #: pki_x509req#8 msgid "Unhandled" msgstr "Non-géré" #: pki_x509req#9 msgctxt "pki_x509req#9" msgid "Wrong Size %1" msgstr "Taille fausse %1" #: v3ext#1 msgctxt "v3ext#1" msgid "Add" msgstr "Ajouter" #: v3ext#2 msgctxt "v3ext#2" msgid "Delete" msgstr "Détruire" #: v3ext#3 msgctxt "v3ext#3" msgid "Apply" msgstr "Appliquer" #: v3ext#4 msgctxt "v3ext#4" msgid "Validate" msgstr "Valider" #: v3ext#5 msgctxt "v3ext#5" msgid "Cancel" msgstr "Abandonner" #: v3ext#6 msgid "An email address or 'copy'" msgstr "Une adresse de courriel ou 'copy'" #: v3ext#7 msgid "An email address" msgstr "Une adresse de courriel" #: v3ext#8 msgid "a registered ID: OBJECT IDENTIFIER" msgstr "un IDentifiant enregistré: IDENTIFICATEUR.OBJET" #: v3ext#9 msgid "a uniform resource indicator" msgstr "un indicateur uniforme de ressource" #: v3ext#10 msgid "a DNS domain name" msgstr "u nom de domaine DNS" #: v3ext#11 msgid "an IP address" msgstr "une adresse IP" #: v3ext#12 msgid "Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'" msgstr "Syntaxe: <OID>;TYPE:texte comme '1.2.3.4:UTF8:nom'" #: v3ext#13 msgid "No editing. Only 'copy' allowed here" msgstr "Pas de modification possible. Seul 'copy' est permis ici" #: v3ext#14 msgid "" "Validation failed:\n" "'%1'\n" "%2" msgstr "" "La validation a échoué:\n" "'%1'\n" "%2" #: v3ext#15 msgid "" "Validation successfull:\n" "'%1'" msgstr "" "La validation a été effectuée avec succès:\n" "'%1'" #: void#1 msgctxt "void#1" msgid "There was no key found for the Certificate: " msgstr "Aucune clé n'a été trouvée pour le Certificat: " #: void#2 msgctxt "void#2" msgid "Import Certificate signing request" msgstr "Importer une requête de signature" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/indent.xslt��������������������������������������������������������������������������0000664�0000000�0000000�00000000516�11753427512�0015507�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <!-- Remove all whitespace and propely indent the TS files --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/tr.po��������������������������������������������������������������������������������0000664�0000000�0000000�00000144403�11753427512�0014303�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Turkish translation for xca # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the xca package. # FIRST AUTHOR <EMAIL@ADDRESS>, 2010. # msgid "" msgstr "" "Project-Id-Version: xca\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-04-30 08:24+0200\n" "PO-Revision-Date: 2011-04-28 09:11+0000\n" "Last-Translator: Mesut YETER <Unknown>\n" "Language-Team: Turkish <tr@li.org>\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2011-04-30 05:52+0000\n" "X-Generator: Launchpad (build 12915)\n" #: About#1 msgid "Done" msgstr "Bitti" #: CaProperties#1 msgid "CA Properties" msgstr "CA Özellikleri" #: CaProperties#2 msgid "Use random Serial numbers" msgstr "Değişken Seri numaralar kullan" #: CaProperties#3 msgid "Days until next CRL issuing" msgstr "" #: CaProperties#4 msgid "Default template" msgstr "Varsayılan şablon" #: CaProperties#5 msgid "Next serial for signing" msgstr "İmza için sonraki seri" #: CertDetail#1 msgid "Details of the Certificate" msgstr "Sertifika bilgileri" #: CertDetail#2 msgid "S&tatus" msgstr "&Durum" #: CertDetail#3 msgctxt "CertDetail#3" msgid "Serial" msgstr "Seri" #: CertDetail#4 msgid "The serial number of the certificate" msgstr "Sertifika seri numarası" #: CertDetail#5 msgid "The internal name of the certificate in the database" msgstr "Sertifika veritabanındaki isim" #: CertDetail#6 msgctxt "CertDetail#6" msgid "Internal name" msgstr "Dahili adı" #: CertDetail#7 msgctxt "CertDetail#7" msgid "Signature algorithm" msgstr "İmza algoritması" #: CertDetail#8 msgctxt "CertDetail#8" msgid "Signature" msgstr "İmza" #: CertDetail#9 msgctxt "CertDetail#9" msgid "Key" msgstr "Anahtar" #: CertDetail#10 msgid "Fingerprints" msgstr "Parmak izleri" #: CertDetail#11 msgid "SHA1" msgstr "SHA1" #: CertDetail#12 msgid "MD5" msgstr "MD5" #: CertDetail#13 msgid "A SHA-1 hashsum of the certificate" msgstr "A SHA-1 hashsum sertifikası" #: CertDetail#14 msgid "An md5 hashsum of the certificate" msgstr "An md5 hassum sertifikası" #: CertDetail#15 msgctxt "CertDetail#15" msgid "Validity" msgstr "Geçerlilik" #: CertDetail#16 msgid "The time since the certificate is valid" msgstr "Zamana kadar geçerli sertifika" #: CertDetail#17 msgid "The time until the certificate is valid" msgstr "Bu zaman kadar sertifika geçerli" #: CertDetail#18 msgid "&Subject" msgstr "&Konu" #: CertDetail#19 msgctxt "CertDetail#19" msgid "&Issuer" msgstr "&veren" #: CertDetail#20 msgid "Attributes" msgstr "Nitelikler" #: CertDetail#21 msgctxt "CertDetail#21" msgid "&Extensions" msgstr "&Uzantıları" #: CertDetail#22 msgid "Show config" msgstr "Yapılandırmayı göster" #: CertDetail#23 msgid "Show extensions" msgstr "Uzantıları göster" #: CertDetail#24 msgctxt "CertDetail#24" msgid "Not available" msgstr "Kullanılamaz" #: CertDetail#25 msgid "Details of the certificate" msgstr "Sertifika detayları" #: CertDetail#26 msgid "Signer unknown" msgstr "Bilinmeyen imzalayan makam" #: CertDetail#27 msgid "Self signed" msgstr "Kendinden imzalı" #: CertDetail#28 msgctxt "CertDetail#28" msgid "Not trusted" msgstr "Güvenilmeyen" #: CertDetail#29 msgid "Trusted" msgstr "Güvenilir" #: CertDetail#30 msgid "Revoked: " msgstr "İptaledilmiş " #: CertDetail#31 msgid "Not valid" msgstr "Geçersiz" #: CertDetail#32 msgid "Valid" msgstr "Geçerli" #: CertDetail#33 msgid "Details of the certificate signing request" msgstr "sertifika imzalama isteği detayları" #: CertExtend#1 msgid "Certificate renewal" msgstr "Sertifika yenileme" #: CertExtend#2 msgid "" "This will create a new certificate as a copy of the old one with a new " "serial number and adjusted validity values." msgstr "" "Bu yeni bir seri numarası ve düzeltilmiş geçerlilik değerleri ile eski bir " "kopyası olarak yeni bir sertifika oluşturur." #: CertExtend#3 msgctxt "CertExtend#3" msgid "Validity" msgstr "Geçerlilik" #: CertExtend#4 msgctxt "CertExtend#4" msgid "Not before" msgstr "Öncedeğil" #: CertExtend#5 msgctxt "CertExtend#5" msgid "Not after" msgstr "Sonradeğil" #: CertExtend#6 msgctxt "CertExtend#6" msgid "Time range" msgstr "Zaman aralığı" #: CertExtend#7 msgctxt "CertExtend#7" msgid "No well-defined expiration" msgstr "Tanımlanmamış son" #: CertExtend#8 msgctxt "CertExtend#8" msgid "Apply" msgstr "Uygula" #: CertExtend#9 msgctxt "CertExtend#9" msgid "Days" msgstr "Gün" #: CertExtend#10 msgctxt "CertExtend#10" msgid "Months" msgstr "Ay" #: CertExtend#11 msgctxt "CertExtend#11" msgid "Years" msgstr "Yıl" #: CertExtend#12 msgctxt "CertExtend#12" msgid "Midnight" msgstr "Gece Yarısı" #: CertExtend#13 msgctxt "CertExtend#13" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" "Sertifika önceki imzalayandan daha geçerli olacaktır. Muhtemelen istediğiniz " "bu değildir." #: CertExtend#14 msgid "Edit times" msgstr "Zamanı düzenle" #: CertExtend#15 msgctxt "CertExtend#15" msgid "Abort rollout" msgstr "" #: CertExtend#16 msgctxt "CertExtend#16" msgid "Continue rollout" msgstr "" #: CertExtend#17 msgctxt "CertExtend#17" msgid "Adjust date and continue" msgstr "Tarihi düzenler ve devam eder" #: CertExtend#18 msgctxt "CertExtend#18" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" "Sertifika önceki imzalayandan daha geçerli olacaktır. Muhtemelen istediğiniz " "bu değildir." #: CertView#1 msgctxt "CertView#1" msgid "There was no key found for the Certificate: " msgstr "Sertifikadaki anahtar bulunamıyor. " #: CertView#2 msgctxt "CertView#2" msgid "Import Certificate signing request" msgstr "Sertifika imzalama isteği" #: ClickLabel#1 msgid "Double click for details" msgstr "Detaylariçin çift tıklayın" #: CrlDetail#1 msgid "Details of the Revocation list" msgstr "İptal listesi için çift tıklayın" #: CrlDetail#2 msgid "&Status" msgstr "&Durum" #: CrlDetail#3 msgid "Version" msgstr "Sürüm" #: CrlDetail#4 msgctxt "CrlDetail#4" msgid "Signature" msgstr "İmza" #: CrlDetail#5 msgid "Signed by" msgstr "İmzalayan:" #: CrlDetail#6 msgctxt "CrlDetail#6" msgid "Name" msgstr "İsim" #: CrlDetail#7 msgid "The internal name of the CRL in the database" msgstr "CRL veritabanındaki isim" #: CrlDetail#8 msgid "issuing dates" msgstr "Verilen tarih" #: CrlDetail#9 msgid "Next Update" msgstr "Sonraki Güncelleme" #: CrlDetail#10 msgid "Last Update" msgstr "Son Güncelleme" #: CrlDetail#11 msgctxt "CrlDetail#11" msgid "&Issuer" msgstr "&veren" #: CrlDetail#12 msgctxt "CrlDetail#12" msgid "&Extensions" msgstr "&Uzantıları" #: CrlDetail#13 msgid "&Revocation list" msgstr "&İptal listesi" #: CrlDetail#14 msgid "0" msgstr "0" #: CrlDetail#15 msgctxt "CrlDetail#15" msgid "Serial" msgstr "Seri" #: CrlDetail#16 msgctxt "CrlDetail#16" msgid "Revocation" msgstr "İptal" #: CrlDetail#17 msgid "Reason" msgstr "Neden" #: CrlDetail#18 msgid "Invalidation" msgstr "İptal" #: CrlDetail#19 msgid "Failed" msgstr "Başarısız" #: CrlDetail#20 msgid "Unknown signer" msgstr "Bilinmeyen imzalayan" #: CrlDetail#21 msgid "Verification not possible" msgstr "Doğrulama mümkün değil" #: CrlDetail#22 msgid "Unknown certificate" msgstr "Bilinmeyen sertifika" #: ExportCert#1 msgid "X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )" msgstr "X509 sertifikası (*cer *.crt *.p12 *.p7b);;Tüm dosyalar (*)" #: ExportCert#2 msgid "" "DER is a binary format of the Certificate\n" "PEM is a base64 encoded Certificate\n" "PKCS#7 is an official Certificate exchange format\n" "PKCS#12 is an encrypted official Key-Certificate exchange format\n" msgstr "" "DER ikili sertifika formatı\n" "PEM base64 kodlu sertifika\n" "PKCS#7 resmi değişim sertifikası\n" "PKCS#12 kriptolu anahtar sertifikası\n" #: ExportCert#3 msgid "Please enter the filename for the certificate." msgstr "Lütfen sertifika ismini giriniz." #: ExportCert#4 msgid "Certifikate export" msgstr "Sertifika dışa aktar" #: ExportDer#1 msgctxt "ExportDer#1" msgid "All files ( * )" msgstr "Bütün dosyalar ( * )" #: ExportDer#2 msgid "" "DER is a binary format\n" "PEM is a base64 encoded DER file\n" msgstr "" "DER ikili biçimdir\n" "PEM base64 kodlanmış DER dosyası\n" #: ExportDialog#1 msgid "..." msgstr "..." #: ExportDialog#2 msgid "Filename" msgstr "Dosya adı" #: ExportDialog#3 msgid "Please enter the filename" msgstr "Lütfen dosya adını giriniz" #: ExportDialog#4 msgid "Export Format" msgstr "Verme biçimi" #: ExportDialog#5 msgid "The file: '%1' already exists!" msgstr "Dosya: 2%1' zaten var" #: ExportDialog#6 msgid "Overwrite" msgstr "Üzerine yaz" #: ExportDialog#7 msgid "Do not overwrite" msgstr "Üzerine yazmayın" #: ExportKey#1 msgid "When exporting the private key it should be encrypted." msgstr "Özel anahtar dışa aktarılırken şifreli olmalıdır." #: ExportKey#2 msgid "When exporting the private part, it should be encrypted." msgstr "Özel bölüm aktarılırken şifreli olmalıdır." #: ExportKey#3 msgid "E&xport the private part of the Key too" msgstr "Dışa aktarılan özel bölüm anahtarı çok" #: ExportKey#4 msgid "Export as PKCS#8" msgstr "PKCS#8 olarak aktar" #: ExportKey#5 msgid "&Encrypt the Key with a password" msgstr "" #: ExportKey#6 msgid "Private keys ( *.pem *.der *.pk8 );;All files ( * )" msgstr "Özel anatarlar (*.pem *.der *.pk8);;Tüm dosyalar ( * )" #: ExportKey#7 msgid "" "DER is a binary format of the key without encryption\n" "PEM is a base64 encoded key with optional encryption\n" "PKCS#8 is an encrypted official Key-exchange format" msgstr "" #: ExportKey#8 msgid "Please enter the filename for the key." msgstr "" #: ExportKey#9 msgid "Public key export" msgstr "" #: ExportKey#10 msgid "Key export" msgstr "" #: Help#1 msgid "<<" msgstr "<<" #: Help#2 msgid ">>" msgstr ">>" #: Help#3 msgctxt "Help#3" msgid "&Done" msgstr "&Bitti" #: ImportMulti#1 msgid "Import PKI Items" msgstr "" #: ImportMulti#2 msgid "Import &All" msgstr "" #: ImportMulti#3 msgctxt "ImportMulti#3" msgid "&Import" msgstr "&İçe Aktar" #: ImportMulti#4 msgctxt "ImportMulti#4" msgid "&Done" msgstr "&Bitti" #: ImportMulti#5 #, fuzzy msgid "&Remove from list" msgstr "&İptal listesi" #: ImportMulti#6 msgid "Details" msgstr "Detaylar" #: ImportMulti#7 msgid "Delete from token" msgstr "" #: ImportMulti#8 msgid "Rename on token" msgstr "" #: ImportMulti#9 msgid "" "\n" "Name: %1\n" "Model: %2\n" "Serial: %3" msgstr "" #: ImportMulti#10 msgid "Manage security token" msgstr "" #: ImportMulti#11 msgid "The type of the Item '%1' is not recognized" msgstr "" #: ImportMulti#12 msgid "Details of the item '%1' cannot be shown" msgstr "" #: ImportMulti#13 msgid "The type of the item '%1' is not recognized" msgstr "" #: ImportMulti#14 msgid "The file '%1' did not contain PKI data" msgstr "" #: ImportMulti#15 msgid "The %1 files: '%2' did not contain PKI data" msgstr "" #: KeyDetail#1 msgctxt "KeyDetail#1" msgid "Name" msgstr "İsim" #: KeyDetail#2 msgid "The internal name of the key used by xca" msgstr "" #: KeyDetail#3 msgctxt "KeyDetail#3" msgid "Security token" msgstr "" #: KeyDetail#4 msgid "Manufacturer" msgstr "" #: KeyDetail#5 msgctxt "KeyDetail#5" msgid "Serial" msgstr "Seri" #: KeyDetail#6 msgctxt "KeyDetail#6" msgid "Key" msgstr "" #: KeyDetail#7 msgid "Public Exponent" msgstr "" #: KeyDetail#8 msgctxt "KeyDetail#8" msgid "Keysize" msgstr "" #: KeyDetail#9 msgid "Private Exponent" msgstr "" #: KeyDetail#10 msgid "Modulus" msgstr "" #: KeyDetail#11 msgid "Details of the %1 key" msgstr "" #: KeyDetail#12 msgctxt "KeyDetail#12" msgid "Not available" msgstr "" #: KeyDetail#13 msgid "Token" msgstr "" #: KeyDetail#14 msgid "Security token ID:%1" msgstr "" #: KeyDetail#15 msgid "Available" msgstr "" #: KeyDetail#16 msgid "Sub prime" msgstr "" #: KeyDetail#17 msgid "Public key" msgstr "" #: KeyDetail#18 msgctxt "KeyDetail#18" msgid "Private key" msgstr "" #: KeyDetail#19 msgid "Curve name" msgstr "" #: KeyDetail#20 msgid "Unknown key" msgstr "" #: MainWindow#1 msgid "Private Keys" msgstr "" #: MainWindow#2 msgid "&New Key" msgstr "" #: MainWindow#3 msgid "&Export" msgstr "" #: MainWindow#4 msgctxt "MainWindow#4" msgid "&Import" msgstr "" #: MainWindow#5 msgid "Import PFX (PKCS#12)" msgstr "" #: MainWindow#6 msgid "&Show Details" msgstr "" #: MainWindow#7 msgid "&Delete" msgstr "&Sil" #: MainWindow#8 msgid "Certificate signing requests" msgstr "" #: MainWindow#9 msgid "&New Request" msgstr "" #: MainWindow#10 msgid "Certificates" msgstr "Sertifikalar" #: MainWindow#11 msgid "&New Certificate" msgstr "" #: MainWindow#12 msgid "Import &PKCS#12" msgstr "" #: MainWindow#13 msgid "Import P&KCS#7" msgstr "" #: MainWindow#14 msgctxt "MainWindow#14" msgid "Plain View" msgstr "" #: MainWindow#15 msgid "Templates" msgstr "" #: MainWindow#16 msgid "&New template" msgstr "" #: MainWindow#17 msgid "Ch&ange Template" msgstr "" #: MainWindow#18 msgid "Revocation lists" msgstr "" #: MainWindow#19 msgid "" "Using or exporting private keys will not be possible without providing the " "correct password" msgstr "" #: MainWindow#20 msgid "Database" msgstr "Veri Tabanı" #: MainWindow#21 msgid "No deleted items found" msgstr "" #: MainWindow#22 msgid "&File" msgstr "&Dosya" #: MainWindow#23 msgid "&New DataBase" msgstr "" #: MainWindow#24 msgid "&Open DataBase" msgstr "" #: MainWindow#25 msgid "Generate DH parameter" msgstr "" #: MainWindow#26 msgid "Set as default DataBase" msgstr "" #: MainWindow#27 msgid "&Close DataBase" msgstr "" #: MainWindow#28 msgid "&Dump DataBase" msgstr "" #: MainWindow#29 msgid "C&hange DataBase password" msgstr "" #: MainWindow#30 msgid "&Import old db_dump" msgstr "" #: MainWindow#31 msgid "&Undelete items" msgstr "" #: MainWindow#32 msgid "Options" msgstr "" #: MainWindow#33 msgid "Exit" msgstr "Çıkış" #: MainWindow#34 msgid "I&mport" msgstr "" #: MainWindow#35 msgid "Keys" msgstr "" #: MainWindow#36 msgid "Requests" msgstr "" #: MainWindow#37 msgid "PKCS#12" msgstr "" #: MainWindow#38 msgctxt "MainWindow#38" msgid "PKCS#7" msgstr "" #: MainWindow#39 msgctxt "MainWindow#39" msgid "Template" msgstr "" #: MainWindow#40 msgid "Revocation list" msgstr "" #: MainWindow#41 msgid "PEM file" msgstr "" #: MainWindow#42 msgid "&Token" msgstr "" #: MainWindow#43 msgid "&Manage Security token" msgstr "" #: MainWindow#44 msgid "&Init Security token" msgstr "" #: MainWindow#45 msgid "&Change PIN" msgstr "" #: MainWindow#46 msgid "Change &SO PIN" msgstr "" #: MainWindow#47 msgid "Init PIN" msgstr "" #: MainWindow#48 msgid "&Help" msgstr "&Yardım" #: MainWindow#49 msgid "&Content" msgstr "" #: MainWindow#50 msgid "&About" msgstr "&Hakkında" #: MainWindow#51 msgid "Donations" msgstr "" #: MainWindow#52 msgid "Database dump ( *.dump );;All files ( * )" msgstr "" #: MainWindow#53 msgid "Import password" msgstr "" #: MainWindow#54 msgid "Please enter the password of the old database" msgstr "" #: MainWindow#55 msgid "Password verification error. Ignore keys ?" msgstr "" #: MainWindow#56 msgid "Import anyway" msgstr "" #: MainWindow#57 #, fuzzy msgctxt "MainWindow#57" msgid "Cancel" msgstr "İptal" #: MainWindow#58 msgid "no such option: %1" msgstr "" #: MainWindow#59 msgid "Import PEM data" msgstr "" #: MainWindow#60 msgid "Please enter the original SO PIN (PUK) of the token '%1'" msgstr "" #: MainWindow#61 msgid "Please enter the new SO PIN (PUK) of the token '%1'" msgstr "" #: MainWindow#62 msgid "The new label of the token '%1'" msgstr "" #: MainWindow#63 msgid "The token '%1' did not contain any keys or certificates" msgstr "" #: MainWindow#64 msgid "New Password" msgstr "Yeni Parola" #: MainWindow#65 msgid "" "Please enter the new password to encrypt your private keys in the database-" "file" msgstr "" #: MainWindow#66 msgid "" "Please enter a password, that will be used to encrypt your private keys in " "the database file:\n" "%1" msgstr "" #: MainWindow#67 msgid "Password verify error, please try again" msgstr "" #: MainWindow#68 #, fuzzy msgctxt "MainWindow#68" msgid "Password" msgstr "Parola" #: MainWindow#69 msgid "" "Please enter the password for unlocking the database:\n" "%1" msgstr "" #: MainWindow#70 msgid "The following error occured:" msgstr "" #: MainWindow#71 msgid "Copy to Clipboard" msgstr "" #: MainWindow#72 msgid "" "Diffie-Hellman paramters are needed for different applications. They are " "neither used by XCA nor stored in the database. After generating them, XCA " "will ask for a filename to store the DH parameters\n" "Please enter the DH parameter bits" msgstr "" #: MainWindow#73 msgctxt "MainWindow#73" msgid "Error opening file: '%1': %2" msgstr "" #: NewCrl#1 msgid "Create CRL" msgstr "" #: NewCrl#2 msgid "Dates" msgstr "" #: NewCrl#3 msgid "last update" msgstr "" #: NewCrl#4 msgid "next update" msgstr "" #: NewCrl#5 msgctxt "NewCrl#5" msgid "Days" msgstr "Gün" #: NewCrl#6 msgctxt "NewCrl#6" msgid "Months" msgstr "Ay" #: NewCrl#7 msgctxt "NewCrl#7" msgid "Years" msgstr "Yıl" #: NewCrl#8 msgctxt "NewCrl#8" msgid "Midnight" msgstr "" #: NewCrl#9 msgctxt "NewCrl#9" msgid "Apply" msgstr "Uygula" #: NewCrl#10 msgid "Hashing algorithm" msgstr "" #: NewCrl#11 msgctxt "NewCrl#11" msgid "Extensions" msgstr "" #: NewCrl#12 msgid "Authority key identifier" msgstr "" #: NewCrl#13 msgid "Subject alternative name" msgstr "" #: NewCrl#14 msgid "CRL Number" msgstr "" #: NewCrl#15 msgid "Revokation reasons" msgstr "" #: NewKey#1 msgid "New key" msgstr "" #: NewKey#2 msgid "Please give a name to the new key and select the desired keysize" msgstr "" #: NewKey#3 msgid "Key properties" msgstr "" #: NewKey#4 msgctxt "NewKey#4" msgid "Name" msgstr "İsim" #: NewKey#5 msgid "The internal name of the new key" msgstr "" #: NewKey#6 msgctxt "NewKey#6" msgid "New Key" msgstr "" #: NewKey#7 msgid "Curve" msgstr "" #: NewKey#8 msgctxt "NewKey#8" msgid "Keysize" msgstr "" #: NewKey#9 msgid "Usually 1024 or 2048 bit keys are used" msgstr "" #: NewKey#10 msgid "Keytype" msgstr "" #: NewKey#11 msgctxt "NewKey#11" msgid "Create" msgstr "Oluştur" #: NewX509#1 msgctxt "NewX509#1" msgid "Create" msgstr "Oluştur" #: NewX509#2 msgid "Source" msgstr "Kaynak" #: NewX509#3 msgid "Signing request" msgstr "" #: NewX509#4 msgid "" "A certificate signing request can be signed, even if the private key of the " "request is not available. This is the intention of a CSR:\n" "Getting signed by a CA certificate, whoes certificate of course must be in " "the database\n" "Of course you need the private key of the CSR if you want to create a self-" "signed cert from it." msgstr "" #: NewX509#5 msgid "Show request" msgstr "" #: NewX509#6 msgid "Sign this Certificate signing &request" msgstr "" #: NewX509#7 msgid "Copy extensions from the request" msgstr "" #: NewX509#8 msgid "Modify subject of the request" msgstr "" #: NewX509#9 msgid "Signing" msgstr "" #: NewX509#10 msgid "Create a &self signed certificate with the serial" msgstr "" #: NewX509#11 msgid "If you leave this blank the serial 00 will be used" msgstr "" #: NewX509#12 msgid "1" msgstr "1" #: NewX509#13 msgid "Use &this Certificate for signing" msgstr "" #: NewX509#14 msgid "All certificates in your database that can create valid signatures" msgstr "" #: NewX509#15 msgid "" "This list contains all certificates with the CA-flag set to true and whoes " "private key is present in the key-database.\n" "If this list is disabled, you only can create a self-signed certificate." msgstr "" #: NewX509#16 msgctxt "NewX509#16" msgid "Signature algorithm" msgstr "" #: NewX509#17 msgid "Template for the new certificate" msgstr "" #: NewX509#18 msgid "All available templates" msgstr "" #: NewX509#19 msgid "This list contains all templates from the toplevel template Tab" msgstr "" #: NewX509#20 msgid "Apply extensions" msgstr "" #: NewX509#21 msgid "Apply subject" msgstr "" #: NewX509#22 msgid "Apply all" msgstr "" #: NewX509#23 msgctxt "NewX509#23" msgid "Subject" msgstr "Konu" #: NewX509#24 msgid "Organisation" msgstr "Organizasyon" #: NewX509#25 msgid "" "This name is only used internally and does not appear in the resulting " "certificate" msgstr "" #: NewX509#26 msgid "Must be exactly 2 letter of size (DE, UK)" msgstr "" #: NewX509#27 msgid "Country code" msgstr "Ülke kodu" #: NewX509#28 msgid "State or Province" msgstr "" #: NewX509#29 msgid "Locality" msgstr "" #: NewX509#30 msgid "Organisational unit" msgstr "" #: NewX509#31 msgid "E-Mail address" msgstr "E-posta adresi" #: NewX509#32 msgctxt "NewX509#32" msgid "Internal name" msgstr "Dahili adı" #: NewX509#33 msgid "Common name" msgstr "" #: NewX509#34 msgctxt "NewX509#34" msgid "Add" msgstr "Ekle" #: NewX509#35 msgctxt "NewX509#35" msgid "Delete" msgstr "Sil" #: NewX509#36 msgctxt "NewX509#36" msgid "Private key" msgstr "" #: NewX509#37 msgid "This list only contains unused keys" msgstr "" #: NewX509#38 msgid "Used keys too" msgstr "" #: NewX509#39 msgid "&Generate a new key" msgstr "" #: NewX509#40 msgctxt "NewX509#40" msgid "Extensions" msgstr "" #: NewX509#41 msgid "Basic constraints" msgstr "" #: NewX509#42 msgctxt "NewX509#42" msgid "Type" msgstr "Tür" #: NewX509#43 msgid "If this will become a CA certificate or not" msgstr "" #: NewX509#44 msgid "" "Set this to TRUE if you want to create a CA certificate that signs other " "certificates.\n" "This is always set to FALSE for client or server certificates. In most cases " "self-signed certificates are CA certificates.\n" "Self-signed non-CA certificates are unusual although they are possible." msgstr "" #: NewX509#45 msgid "Not defined" msgstr "" #: NewX509#46 msgid "Certification Authority" msgstr "" #: NewX509#47 msgid "End Entity" msgstr "" #: NewX509#48 msgid "Path length" msgstr "" #: NewX509#49 msgid "How much CAs may be below this." msgstr "" #: NewX509#50 msgid "" "If this is left empty the pathlen is not included in the certificate. " "Otherwise it distinguishes the count of chained CA certificates below this " "one.\n" "A pathlen of 0 means, that this certificate may not issue other sub-CA " "certificates. Although it can do it, all chain-checking algorithms in e.g. " "your browser or openssl will (should) fail." msgstr "" #: NewX509#51 msgid "The basic constraints should always be critical" msgstr "" #: NewX509#52 msgid "Key identifier" msgstr "" #: NewX509#53 msgid "Creates a hash of the key following the PKIX guidelines" msgstr "" #: NewX509#54 msgid "Copy the Subject Key Identifier from the issuer" msgstr "" #: NewX509#55 msgid "" "If this box is checked an attempt is made to copy the subject key identifier " "from the signing certificate.\n" "It also copies the issuer and serial number from the issuer certificate. " "Normally this will only be done if the keyid option fails." msgstr "" #: NewX509#56 msgctxt "NewX509#56" msgid "Validity" msgstr "" #: NewX509#57 msgctxt "NewX509#57" msgid "Not before" msgstr "" #: NewX509#58 msgctxt "NewX509#58" msgid "Not after" msgstr "" #: NewX509#59 msgctxt "NewX509#59" msgid "Time range" msgstr "" #: NewX509#60 msgctxt "NewX509#60" msgid "Days" msgstr "Gün" #: NewX509#61 msgctxt "NewX509#61" msgid "Months" msgstr "Ay" #: NewX509#62 msgctxt "NewX509#62" msgid "Years" msgstr "Yıl" #: NewX509#63 msgctxt "NewX509#63" msgid "Apply" msgstr "Uygula" #: NewX509#64 msgid "Set the time to 00:00:00 and 23:59:59 respectively" msgstr "" #: NewX509#65 msgctxt "NewX509#65" msgid "Midnight" msgstr "" #: NewX509#66 msgctxt "NewX509#66" msgid "No well-defined expiration" msgstr "" #: NewX509#67 msgid "Authority Info Access" msgstr "" #: NewX509#68 msgid "CRL distribution point" msgstr "" #: NewX509#69 msgid "issuer alternative name" msgstr "" #: NewX509#70 msgid "URI:" msgstr "" #: NewX509#71 msgid "" "This is a multi-valued extension that supports all the literal options of " "subject alternative name. Of the few software packages that currentlyi " "nterpret this extension most only interpret the URI option.\n" "Currently each option will set a new DistributionPoint with the fullName " "field set to the given value.\n" "Other fields like cRLissuer and reasons cannot currently be set or " "displayed: at this time no examples were available that used these fields.\n" "If you see this extension with <UNSUPPORTED> when you attempt to print it " "out or it doesn't appear to display correctly then let steve know, including " "the certificate (mail steve at openssl dot org) .\n" "Examples:\n" "URI:http://www.myhost.com/myca.crl\n" "URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl" msgstr "" #: NewX509#72 msgid "can be altered by the file \"aia.txt\"" msgstr "" #: NewX509#73 msgid "Edit" msgstr "Düzenle" #: NewX509#74 msgid "DNS: IP: URI: email: RID:" msgstr "" #: NewX509#75 msgid "" "The authority information access extension gives details about how to access " "certain information relating to the CA. Its syntax is accessOID;location " "where 'location' has the same syntax as subject alternative name (except " "that email:copy is not supported). accessOID can be any valid OID but only " "certain values are meaningful for example OCSP and caIssuers. OCSP gives the " "location of an OCSP responder: this is used by Netscape PSM and other " "software.\n" "\n" "Example:\n" "\n" "OCSP;URI:http://ocsp.my.host/\n" "caIssuers;URI:http://my.ca/ca.html" msgstr "" #: NewX509#76 msgid "" "The subject alternative name extension allows various literal values to be " "used. These include \"email\" (an email address) , \"URI\" a uniform " "resource indicator, \"DNS\" (a DNS domain name) , RID (a registered ID: " "OBJECT IDENTIFIER) and IP (an IP address).\n" "Examples:\n" "email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/\n" "email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld" msgstr "" #: NewX509#77 msgid "subject alternative name" msgstr "" #: NewX509#78 msgid "" "The issuer alternative name extension allows various literal values to be " "used. These include \"email\" (an email address) , \"URI\" a uniform " "resource indicator, \"DNS\" (a DNS domain name), RID (a registered ID: " "OBJECT IDENTIFIER) and IP (an IP address).\n" "Examples:\n" "email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/\n" "email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld" msgstr "" #: NewX509#79 msgid "Key usage" msgstr "" #: NewX509#80 msgid "Extended key usage" msgstr "" #: NewX509#81 msgid "Netscape" msgstr "" #: NewX509#82 msgid "CA Revocation URL" msgstr "" #: NewX509#83 msgid "Revocation URL" msgstr "" #: NewX509#84 msgid "SSL server name" msgstr "" #: NewX509#85 msgid "Certificate renewal URL" msgstr "" #: NewX509#86 msgid "Comment" msgstr "" #: NewX509#87 msgid "CA policy URL" msgstr "" #: NewX509#88 msgid "Base URL" msgstr "" #: NewX509#89 msgid "If you know a more pretty one tell me" msgstr "" #: NewX509#90 msgid "Advanced" msgstr "Gelişmiş" #: NewX509#91 msgctxt "NewX509#91" msgid "Validate" msgstr "" #: NewX509#92 msgid "Create a &self signed certificate with a MD5-hashed QA serial" msgstr "" #: NewX509#93 msgid "Create Certificate signing request" msgstr "" #: NewX509#94 msgid "minimum size: %1" msgstr "" #: NewX509#95 msgid "maximum size: %1" msgstr "" #: NewX509#96 msgid "only a-z A-Z 0-9 '()+,-./:=?" msgstr "" #: NewX509#97 msgid "only 7-bit clean characters" msgstr "" #: NewX509#98 msgid "XCA template" msgstr "" #: NewX509#99 msgid "Create x509 Certificate" msgstr "" #: NewX509#100 msgid "From PKCS#10 request" msgstr "" #: NewX509#101 msgid "Other Tabs" msgstr "" #: NewX509#102 msgid "Advanced Tab" msgstr "" #: NewX509#103 msgid "Errors" msgstr "Hatalar" #: NewX509#104 msgctxt "NewX509#104" msgid "Abort rollout" msgstr "" #: NewX509#105 msgid "The following length restrictions of RFC3280 are violated:" msgstr "" #: NewX509#106 msgid "Edit subject" msgstr "" #: NewX509#107 msgctxt "NewX509#107" msgid "Continue rollout" msgstr "" #: NewX509#108 msgid "" "The verification of the Certificate request failed.\n" "The rollout should be aborted." msgstr "" #: NewX509#109 msgid "Continue anyway" msgstr "" #: NewX509#110 msgid "" "The internal name and the common name are empty.\n" "Please set at least the internal name." msgstr "" #: NewX509#111 msgid "Edit name" msgstr "İsmi Düzenle" #: NewX509#112 msgid "There is no Key selected for signing." msgstr "" #: NewX509#113 msgid "Select key" msgstr "" #: NewX509#114 msgid "" "The following distinguished name entries are empty:\n" "%1\n" "though you have declared them as mandatory in the options menu." msgstr "" #: NewX509#115 msgctxt "NewX509#115" msgid "The key you selected for signing is not a private one." msgstr "" #: NewX509#116 msgid "Select other signer" msgstr "" #: NewX509#117 msgid "Select other key" msgstr "" #: NewX509#118 msgctxt "NewX509#118" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" #: NewX509#119 msgid "Edit dates" msgstr "" #: NewX509#120 msgctxt "NewX509#120" msgid "Adjust date and continue" msgstr "" #: NewX509#121 msgctxt "NewX509#121" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" #: NewX509#122 msgid "" "The certificate will be out of date before it becomes valid. You most " "probably mixed up both dates." msgstr "" #: NewX509#123 msgid "" "The certificate contains duplicated extensions. Check the validation on the " "advanced tab." msgstr "" #: NewX509#124 msgid "Edit extensions" msgstr "" #: NewX509#125 msgid "Configfile error on line %1\n" msgstr "" #: Options#1 msgid "XCA Options" msgstr "" #: Options#2 msgid "Mandatory subject entries" msgstr "" #: Options#3 msgctxt "Options#3" msgid "Add" msgstr "" #: Options#4 msgctxt "Options#4" msgid "Delete" msgstr "" #: Options#5 msgid "Default hash algorithm" msgstr "" #: Options#6 msgid "String types" msgstr "" #: Options#7 msgid "Suppress success messages" msgstr "" #: Options#8 msgid "PKCS#11 provider" msgstr "" #: Options#9 msgid "Remove" msgstr "" #: Options#10 msgid "Printable string or UTF8 (default)" msgstr "" #: Options#11 msgid "PKIX recommendation in RFC2459" msgstr "" #: Options#12 msgid "No BMP strings, only printable and T61" msgstr "" #: Options#13 msgid "UTF8 strings only (RFC2459)" msgstr "" #: Options#14 msgid "All strings" msgstr "" #: Options#15 msgid "Load failed" msgstr "" #: PwDialog#1 #, fuzzy msgctxt "PwDialog#1" msgid "Password" msgstr "Parola" #: PwDialog#2 msgid "" "The password is parsed as 2-digit hex code. It must have an equal number of " "digits (0-9 and a-f)" msgstr "" #: PwDialog#3 msgid "Take as HEX string" msgstr "" #: PwDialog#4 msgid "Repeat %1" msgstr "" #: PwDialog#5 msgid "%1 missmatch" msgstr "" #: PwDialog#6 msgid "" "Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it " "must consist of an even number of characters" msgstr "" #: PwDialog#7 msgid "E&xit" msgstr "" #: QObject#1 msgid "Undefined" msgstr "" #: QObject#2 msgid "DB: Rename: '%1' already in use" msgstr "" #: QObject#3 msgid "DB: Entry to rename not found: %1" msgstr "" #: QObject#4 msgid "DB: Write error %1 - %2" msgstr "" #: QObject#5 msgid "Out of data" msgstr "" #: QObject#6 msgid "Error finding endmarker of string" msgstr "" #: QObject#7 msgid "Out of Memory at %1:%2" msgstr "" #: QObject#8 msgctxt "QObject#8" msgid "All files ( * )" msgstr "" #: QObject#9 msgid "PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;" msgstr "" #: QObject#10 msgid "Import RSA key" msgstr "" #: QObject#11 msgid "PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;" msgstr "" #: QObject#12 msgid "Import Request" msgstr "" #: QObject#13 msgid "Certificates ( *.pem *.der *.crt *.cer );;" msgstr "" #: QObject#14 msgid "Import X.509 Certificate" msgstr "" #: QObject#15 msgid "PKCS#7 data ( *.p7s *.p7m *.p7b );;" msgstr "" #: QObject#16 msgid "Import PKCS#7 Certificates" msgstr "" #: QObject#17 msgid "PKCS#12 Certificates ( *.p12 *.pfx );;" msgstr "" #: QObject#18 msgid "Import PKCS#12 Private Certificate" msgstr "" #: QObject#19 msgid "XCA templates ( *.xca );;" msgstr "" #: QObject#20 msgid "Import XCA Templates" msgstr "" #: QObject#21 msgid "Revocation lists ( *.pem *.der *.crl );;" msgstr "" #: QObject#22 msgid "Import Certificate Revocation List" msgstr "" #: QObject#23 msgid "XCA Databases ( *.xdb );;" msgstr "" #: QObject#24 msgid "Open XCA Database" msgstr "" #: QObject#25 msgid "PKCS#11 library ( *.dll );;" msgstr "" #: QObject#26 msgid "PKCS#11 library ( *.dylib *.so );;" msgstr "" #: QObject#27 msgid "PKCS#11 library ( *.so );;" msgstr "" #: QObject#28 msgid "Open PKCS#11 shared library" msgstr "" #: QObject#29 msgid "PEM files ( *.pem );;" msgstr "" #: QObject#30 msgid "Load PEM encoded file" msgstr "" #: QObject#31 msgid "Please enter the PIN on the PinPad" msgstr "" #: QObject#32 msgid "Please enter the SO PIN (PUK) of the token %1" msgstr "" #: QObject#33 msgid "Please enter the PIN of the token %1" msgstr "" #: QObject#34 msgid "No Security token found" msgstr "" #: QObject#35 msgid "Select" msgstr "" #: QObject#36 msgid "Please enter the new SO PIN (PUK) for the token: '%1'" msgstr "" #: QObject#37 msgid "Please enter the new PIN for the token: '%1'" msgstr "" #: QObject#38 msgid "Required PIN size: %1 - %2" msgstr "" #: QObject#39 msgid "Failed to open PKCS11 library: %1" msgstr "" #: QObject#40 msgid "PKCS#11 function '%1' failed: %2" msgstr "" #: QObject#41 msgid "" "PKCS#11 function '%1' failed: %2\n" "In library %3\n" "%4" msgstr "" #: QObject#42 msgid "Invalid" msgstr "" #: QObject#43 msgid "%1 is shorter than %2 bytes: '%3'" msgstr "" #: QObject#44 msgid "%1 is longer than %2 bytes: '%3'" msgstr "" #: Revoke#1 msgid "Revokation details" msgstr "" #: Revoke#2 msgid "Invalid since" msgstr "" #: Revoke#3 msgid "Revokation reason" msgstr "" #: SelectToken#1 msgid "Select Token" msgstr "" #: SelectToken#2 msgctxt "SelectToken#2" msgid "Security token" msgstr "" #: SelectToken#3 msgid "Please select the security token" msgstr "" #: TrustState#1 msgid "Set trustment of the Certificate" msgstr "" #: TrustState#2 msgid "Trustment" msgstr "" #: TrustState#3 msgid "&Never trust this certificate" msgstr "" #: TrustState#4 msgid "Only &trust this certificate, if we trust the signer" msgstr "" #: TrustState#5 msgid "&Always trust this certificate" msgstr "" #: Validity#1 msgid "yyyy-MM-dd hh:mm" msgstr "" #: db_base#1 msgctxt "db_base#1" msgid "Internal name" msgstr "" #: db_base#2 msgid "Reset" msgstr "" #: db_base#3 msgid "Subject entries" msgstr "" #: db_base#4 msgid "Paste PEM data" msgstr "" #: db_base#5 msgid "Columns" msgstr "" #: db_crl#1 msgid "Signer" msgstr "" #: db_crl#2 msgid "Internal name of the signer" msgstr "" #: db_crl#3 msgid "No. revoked" msgstr "" #: db_crl#4 msgid "Number of revoked certificates" msgstr "" #: db_crl#5 msgid "Last update" msgstr "" #: db_crl#6 msgid "Next update" msgstr "" #: db_crl#7 msgid "CRL number" msgstr "" #: db_crl#8 msgid "" "The revokation list already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" #: db_crl#9 msgid "CRL ( *.pem *.der *.crl )" msgstr "" #: db_crl#10 msgid "Revokation list export" msgstr "" #: db_crl#11 msgctxt "db_crl#11" msgid "Import" msgstr "" #: db_crl#12 msgctxt "db_crl#12" msgid "Rename" msgstr "" #: db_crl#13 msgctxt "db_crl#13" msgid "Export" msgstr "" #: db_crl#14 msgctxt "db_crl#14" msgid "Clipboard" msgstr "" #: db_crl#15 msgctxt "db_crl#15" msgid "File" msgstr "" #: db_crl#16 msgctxt "db_crl#16" msgid "Delete" msgstr "" #: db_key#1 msgctxt "db_key#1" msgid "Type" msgstr "" #: db_key#2 msgid "Size" msgstr "" #: db_key#3 msgid "Use" msgstr "" #: db_key#4 msgctxt "db_key#4" msgid "Password" msgstr "" #: db_key#5 msgid "" "The key is already in the database as:\n" "'%1'\n" "and is not going to be imported" msgstr "" #: db_key#6 msgid "" "The database already contains the public part of the imported key as\n" "'%1\n" "and will be completed by the new, private part of the key" msgstr "" #: db_key#7 msgid "Key size too small !" msgstr "" #: db_key#8 msgid "You are sure to create a key of the size: %1 ?" msgstr "" #: db_key#9 msgid "" "Shall the original key '%1' be replaced by the key on the token?\n" "This will delete the key '%1' and make it unexportable" msgstr "" #: db_key#10 msgctxt "db_key#10" msgid "New Key" msgstr "" #: db_key#11 msgctxt "db_key#11" msgid "Import" msgstr "" #: db_key#12 msgctxt "db_key#12" msgid "Rename" msgstr "" #: db_key#13 msgctxt "db_key#13" msgid "Show Details" msgstr "" #: db_key#14 msgctxt "db_key#14" msgid "Delete" msgstr "" #: db_key#15 msgctxt "db_key#15" msgid "Export" msgstr "" #: db_key#16 msgid "Change password" msgstr "" #: db_key#17 msgid "Reset password" msgstr "" #: db_key#18 msgid "Change PIN" msgstr "" #: db_key#19 msgid "Init PIN with SO PIN (PUK)" msgstr "" #: db_key#20 msgid "Change SO PIN (PUK)" msgstr "" #: db_key#21 msgid "Store on Security token" msgstr "" #: db_key#22 msgid "Tried to change password of a token" msgstr "" #: db_key#23 msgid "Tried to change PIN of a key" msgstr "" #: db_key#24 msgid "Tried to init PIN of a key" msgstr "" #: db_key#25 msgid "Tried to change SO PIN of a key" msgstr "" #: db_temp#1 msgctxt "db_temp#1" msgid "Type" msgstr "" #: db_temp#2 msgid "Bad template: %1" msgstr "" #: db_temp#3 msgid "Nothing" msgstr "" #: db_temp#4 msgid "Preset Template values" msgstr "" #: db_temp#5 msgid "copy" msgstr "" #: db_temp#6 msgid "Save template as" msgstr "" #: db_temp#7 msgid "XCA templates ( *.xca);; All files ( * )" msgstr "" #: db_temp#8 msgid "New Template" msgstr "" #: db_temp#9 msgctxt "db_temp#9" msgid "Import" msgstr "" #: db_temp#10 msgctxt "db_temp#10" msgid "Rename" msgstr "" #: db_temp#11 msgctxt "db_temp#11" msgid "Export" msgstr "" #: db_temp#12 msgid "Change" msgstr "" #: db_temp#13 msgctxt "db_temp#13" msgid "Delete" msgstr "" #: db_temp#14 msgid "Duplicate" msgstr "" #: db_temp#15 msgid "Create certificate" msgstr "" #: db_temp#16 msgid "Create request" msgstr "" #: db_x509#1 msgid "CA" msgstr "" #: db_x509#2 msgid "reflects the basic Constraints extension" msgstr "" #: db_x509#3 msgctxt "db_x509#3" msgid "Serial" msgstr "" #: db_x509#4 msgid "md5 fingerprint" msgstr "" #: db_x509#5 msgid "sha1 fingerprint" msgstr "" #: db_x509#6 msgid "Start date" msgstr "" #: db_x509#7 msgid "not Before" msgstr "" #: db_x509#8 msgid "Expiry date" msgstr "" #: db_x509#9 msgid "not After" msgstr "" #: db_x509#10 msgid "Trust state" msgstr "" #: db_x509#11 msgctxt "db_x509#11" msgid "Revocation" msgstr "" #: db_x509#12 msgctxt "db_x509#12" msgid "Plain View" msgstr "" #: db_x509#13 msgid "Tree View" msgstr "" #: db_x509#14 msgid "" "The certificate already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" #: db_x509#15 msgid "Invalid public key" msgstr "" #: db_x509#16 msgid "Please enter the new hexadecimal secret number for the QA process." msgstr "" #: db_x509#17 msgid "The QA process has been terminated by the user." msgstr "" #: db_x509#18 msgctxt "db_x509#18" msgid "The key you selected for signing is not a private one." msgstr "" #: db_x509#19 msgid "Store the certificate to the key on the token '%1 (#%2)' ?" msgstr "" #: db_x509#20 msgid "New Certificate" msgstr "" #: db_x509#21 #, fuzzy msgctxt "db_x509#21" msgid "Import" msgstr "&İçe Aktar" #: db_x509#22 msgid "Import PKCS#12" msgstr "" #: db_x509#23 msgid "Import from PKCS#7" msgstr "" #: db_x509#24 #, fuzzy msgctxt "db_x509#24" msgid "Rename" msgstr "Dosya adı" #: db_x509#25 #, fuzzy msgctxt "db_x509#25" msgid "Show Details" msgstr "Detaylar" #: db_x509#26 msgctxt "db_x509#26" msgid "Extract public Key" msgstr "" #: db_x509#27 #, fuzzy msgctxt "db_x509#27" msgid "Export" msgstr "Verme biçimi" #: db_x509#28 msgctxt "db_x509#28" msgid "Clipboard" msgstr "" #: db_x509#29 #, fuzzy msgctxt "db_x509#29" msgid "File" msgstr "&Dosya" #: db_x509#30 msgid "Request" msgstr "" #: db_x509#31 msgctxt "db_x509#31" msgid "Security token" msgstr "" #: db_x509#32 msgid "Other token" msgstr "" #: db_x509#33 msgctxt "db_x509#33" msgid "Template" msgstr "" #: db_x509#34 #, fuzzy msgctxt "db_x509#34" msgid "OpenSSL config" msgstr "Yapılandırmayı göster" #: db_x509#35 #, fuzzy msgctxt "db_x509#35" msgid "Delete" msgstr "Sil" #: db_x509#36 msgid "Delete from Security token" msgstr "" #: db_x509#37 msgid "Trust" msgstr "" #: db_x509#38 msgid "Properties" msgstr "" #: db_x509#39 msgid "Generate CRL" msgstr "" #: db_x509#40 msgctxt "db_x509#40" msgid "PKCS#7" msgstr "" #: db_x509#41 #, fuzzy msgctxt "db_x509#41" msgid "Sign" msgstr "İmzalayan:" #: db_x509#42 msgid "Encrypt" msgstr "" #: db_x509#43 msgid "Renewal" msgstr "" #: db_x509#44 msgid "Unrevoke" msgstr "" #: db_x509#45 msgid "Revoke" msgstr "" #: db_x509#46 msgid "There was no key found for the Certificate: '%1'" msgstr "" #: db_x509#47 msgid "Not possible for a token key: '%1'" msgstr "" #: db_x509#48 msgid "Not possible for the token-key Certificate '%1'" msgstr "" #: db_x509#49 msgid " days" msgstr "" #: db_x509name#1 msgctxt "db_x509name#1" msgid "Subject" msgstr "" #: db_x509name#2 msgid "Complete distinguished name" msgstr "" #: db_x509name#3 msgid "Subject hash" msgstr "" #: db_x509name#4 msgid "Hash to lookup certs in directories" msgstr "" #: db_x509req#1 msgctxt "db_x509req#1" msgid "Signed" msgstr "" #: db_x509req#2 msgid "whether the request is already signed or not" msgstr "" #: db_x509req#3 msgid "Unstructured name" msgstr "" #: db_x509req#4 #, fuzzy msgid "Challenge password" msgstr "Yeni Parola" #: db_x509req#5 msgid "" "The certificate signing request already exists in the database as\n" "'%1'\n" "and thus was not stored" msgstr "" #: db_x509req#6 msgid "Certificate request ( *.pem *.der *.crl )" msgstr "" #: db_x509req#7 msgid "Certificate request export" msgstr "" #: db_x509req#8 msgid "New Request" msgstr "" #: db_x509req#9 msgctxt "db_x509req#9" msgid "Import" msgstr "" #: db_x509req#10 msgctxt "db_x509req#10" msgid "Extract public Key" msgstr "" #: db_x509req#11 msgctxt "db_x509req#11" msgid "Rename" msgstr "" #: db_x509req#12 msgctxt "db_x509req#12" msgid "Show Details" msgstr "" #: db_x509req#13 msgctxt "db_x509req#13" msgid "Sign" msgstr "" #: db_x509req#14 msgctxt "db_x509req#14" msgid "Export" msgstr "" #: db_x509req#15 msgctxt "db_x509req#15" msgid "Clipboard" msgstr "" #: db_x509req#16 msgctxt "db_x509req#16" msgid "File" msgstr "" #: db_x509req#17 msgctxt "db_x509req#17" msgid "Template" msgstr "" #: db_x509req#18 #, fuzzy msgctxt "db_x509req#18" msgid "OpenSSL config" msgstr "Yapılandırmayı göster" #: db_x509req#19 #, fuzzy msgctxt "db_x509req#19" msgid "Delete" msgstr "Sil" #: db_x509super#1 msgid "Key name" msgstr "" #: db_x509super#2 msgid "Internal name of the key" msgstr "" #: db_x509super#3 msgid "Save as OpenSSL config" msgstr "" #: db_x509super#4 #, fuzzy msgid "Config files ( *.conf *.cnf);; All files ( * )" msgstr "X509 sertifikası (*cer *.crt *.p12 *.p7b);;Tüm dosyalar (*)" #: db_x509super#5 msgid "The following extensions were not ported into the template" msgstr "" #: kvView#1 msgctxt "kvView#1" msgid "Type" msgstr "" #: kvView#2 msgid "Content" msgstr "" #: pass_info#1 msgctxt "pass_info#1" msgid "Password" msgstr "" #: pass_info#2 msgctxt "pass_info#2" msgid "PIN" msgstr "" #: pki_base#1 msgctxt "pki_base#1" msgid "Error opening file: '%1': %2" msgstr "" #: pki_base#2 msgid "Error writing to file: '%1': %2" msgstr "" #: pki_base#3 msgid "Error: " msgstr "" #: pki_base#4 msgid "Internal error: Unexpected message: %1 %2" msgstr "" #: pki_crl#1 msgid "Successfully imported the revokation list '%1'" msgstr "" #: pki_crl#2 msgid "Delete the revokation list '%1'?" msgstr "" #: pki_crl#3 msgid "Successfully created the revokation list '%1'" msgstr "" #: pki_crl#4 msgid "Delete the %1 revokation lists: %2?" msgstr "" #: pki_crl#5 msgid "" "Unable to load the revokation list in file %1. Tried PEM and DER formatted " "CRL." msgstr "" #: pki_crl#6 msgid "No issuer given" msgstr "" #: pki_crl#7 msgctxt "pki_crl#7" msgid "Wrong Size %1" msgstr "" #: pki_crl#8 msgid "unknown" msgstr "" #: pki_evp#1 msgid "Failed to decrypt the key (bad password) " msgstr "" #: pki_evp#2 msgid "Please enter the password to decrypt the private key." msgstr "" #: pki_evp#3 msgid "" "Please enter the password to decrypt the private key from file:\n" "%1" msgstr "" #: pki_evp#4 msgid "" "Unable to load the private key in file %1. Tried PEM and DER private, public " "and PKCS#8 key types." msgstr "" #: pki_evp#5 msgid "Please enter the password to decrypt the private key: '%1'" msgstr "" #: pki_evp#6 msgid "Password input aborted" msgstr "" #: pki_evp#7 msgid "Please enter the database password for decrypting the key '%1'" msgstr "" #: pki_evp#8 msgid "Please enter the password to protect the private key: '%1'" msgstr "" #: pki_evp#9 msgid "Please enter the database password for encrypting the key" msgstr "" #: pki_evp#10 msgid "Please enter the password protecting the PKCS#8 key '%1'" msgstr "" #: pki_evp#11 msgid "Please enter the export password for the private key '%1'" msgstr "" #: pki_key#1 msgid "Successfully imported the %1 public key '%2'" msgstr "" #: pki_key#2 msgid "Delete the %1 public key '%2'?" msgstr "" #: pki_key#3 msgid "Successfully imported the %1 private key '%2'" msgstr "" #: pki_key#4 msgid "Delete the %1 private key '%2'?" msgstr "" #: pki_key#5 msgid "Successfully created the %1 private key '%2'" msgstr "" #: pki_key#6 msgctxt "pki_key#6" msgid "Delete the %1 keys: %2?" msgstr "" #: pki_key#7 msgid "public key" msgstr "" #: pki_key#8 msgid "Common" msgstr "" #: pki_key#9 msgid "Private" msgstr "" #: pki_key#10 msgid "Bogus" msgstr "" #: pki_key#11 msgctxt "pki_key#11" msgid "PIN" msgstr "" #: pki_key#12 msgid "No password" msgstr "" #: pki_multi#1 msgid "Seek failed" msgstr "" #: pki_pkcs12#1 msgid "" "Please enter the password to decrypt the PKCS#12 file:\n" "%1" msgstr "" #: pki_pkcs12#2 msgid "Unable to load the PKCS#12 (pfx) file %1." msgstr "" #: pki_pkcs12#3 msgid "The supplied password was wrong (%1)" msgstr "" #: pki_pkcs12#4 msgid "Please enter the password to encrypt the PKCS#12 file" msgstr "" #: pki_pkcs12#5 msgid "No key or no Cert and no pkcs12" msgstr "" #: pki_pkcs7#1 msgid "Unable to load the PKCS#7 file %1. Tried PEM and DER format." msgstr "" #: pki_scard#1 msgid "Successfully imported the token key '%1'" msgstr "" #: pki_scard#2 msgid "Delete the token key '%1'?" msgstr "" #: pki_scard#3 msgid "Successfully created the token key '%1'" msgstr "" #: pki_scard#4 msgctxt "pki_scard#4" msgid "Delete the %1 keys: %2?" msgstr "" #: pki_scard#5 msgid "Delete the private key '%1' from the token '%2 (#%3)' ?" msgstr "" #: pki_scard#6 msgid "only RSA keys can be stored on tokens" msgstr "" #: pki_scard#7 msgid "This Key is already on the token" msgstr "" #: pki_scard#8 msgid "PIN input aborted" msgstr "" #: pki_scard#9 msgid "Unable to find copied key on the token" msgstr "" #: pki_scard#10 msgid "Please insert card: %1 %2 [%3] with Serial: %4" msgstr "" #: pki_scard#11 msgid "Public Key missmatch. Please re-import card" msgstr "" #: pki_scard#12 msgid "Unable to find generated key on card" msgstr "" #: pki_scard#13 msgctxt "pki_scard#13" msgid "Wrong Size %1" msgstr "" #: pki_scard#14 msgid "Token %1" msgstr "" #: pki_scard#15 msgid "Failed to find the key on the token" msgstr "" #: pki_scard#16 msgid "Invalid Pin for the token" msgstr "" #: pki_temp#1 msgid "Successfully imported the XCA template '%1'" msgstr "" #: pki_temp#2 msgid "Delete the XCA template '%1'?" msgstr "" #: pki_temp#3 msgid "Successfully created the XCA template '%1'" msgstr "" #: pki_temp#4 msgid "Delete the %1 XCA templates: %2?" msgstr "" #: pki_temp#5 msgctxt "pki_temp#5" msgid "Wrong Size %1" msgstr "" #: pki_temp#6 msgid "Template file content error (too small): %1" msgstr "" #: pki_temp#7 msgid "Template file content error (bad size): %1 " msgstr "" #: pki_temp#8 msgid "Template file content error (bad length) :%1" msgstr "" #: pki_x509#1 msgid "Successfully imported the certificate '%1'" msgstr "" #: pki_x509#2 msgid "Delete the certificate '%1'?" msgstr "" #: pki_x509#3 msgid "Successfully created the certificate '%1'" msgstr "" #: pki_x509#4 msgid "Delete the %1 certificates: %2?" msgstr "" #: pki_x509#5 msgid "" "Unable to load the certificate in file %1. Tried PEM and DER certificate." msgstr "" #: pki_x509#6 msgid "This certificate is already on the security token" msgstr "" #: pki_x509#7 msgid "Delete the certificate '%1' from the token '%2 (#%3)'?" msgstr "" #: pki_x509#8 msgid "There is no key for signing !" msgstr "" #: pki_x509#9 msgctxt "pki_x509#9" msgid "Wrong Size %1" msgstr "" #: pki_x509#10 msgctxt "pki_x509#10" msgid "Not trusted" msgstr "" #: pki_x509#11 msgid "Trust inherited" msgstr "" #: pki_x509#12 msgid "Always Trusted" msgstr "" #: pki_x509#13 msgid "CRL expires: %1" msgstr "" #: pki_x509#14 msgid "No" msgstr "" #: pki_x509#15 msgid "Yes" msgstr "" #: pki_x509req#1 msgid "Signing key not valid (public key)" msgstr "" #: pki_x509req#2 msgid "Successfully imported the %1 certificate request '%2'" msgstr "" #: pki_x509req#3 msgid "Delete the %1 certificate request '%2'?" msgstr "" #: pki_x509req#4 msgid "Successfully created the %1 certificate request '%2'" msgstr "" #: pki_x509req#5 msgid "Delete the %1 certificate requests: %2?" msgstr "" #: pki_x509req#6 msgid "" "Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC " "format." msgstr "" #: pki_x509req#7 msgctxt "pki_x509req#7" msgid "Signed" msgstr "" #: pki_x509req#8 msgid "Unhandled" msgstr "" #: pki_x509req#9 msgctxt "pki_x509req#9" msgid "Wrong Size %1" msgstr "" #: v3ext#1 msgctxt "v3ext#1" msgid "Add" msgstr "" #: v3ext#2 msgctxt "v3ext#2" msgid "Delete" msgstr "" #: v3ext#3 msgctxt "v3ext#3" msgid "Apply" msgstr "" #: v3ext#4 msgctxt "v3ext#4" msgid "Validate" msgstr "" #: v3ext#5 msgctxt "v3ext#5" msgid "Cancel" msgstr "" #: v3ext#6 msgid "An email address or 'copy'" msgstr "" #: v3ext#7 msgid "An email address" msgstr "" #: v3ext#8 msgid "a registered ID: OBJECT IDENTIFIER" msgstr "" #: v3ext#9 msgid "a uniform resource indicator" msgstr "" #: v3ext#10 msgid "a DNS domain name" msgstr "" #: v3ext#11 msgid "an IP address" msgstr "" #: v3ext#12 msgid "Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'" msgstr "" #: v3ext#13 msgid "No editing. Only 'copy' allowed here" msgstr "" #: v3ext#14 msgid "" "Validation failed:\n" "'%1'\n" "%2" msgstr "" #: v3ext#15 msgid "" "Validation successful:\n" "'%1'" msgstr "" #: void#1 msgctxt "void#1" msgid "There was no key found for the Certificate: " msgstr "" #: void#2 msgctxt "void#2" msgid "Import Certificate signing request" msgstr "" #, fuzzy #~ msgctxt "db_x509#36" #~ msgid "Delete" #~ msgstr "Sil" #~ msgid "&Remove" #~ msgstr "&Kaldır" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/xca.pot������������������������������������������������������������������������������0000664�0000000�0000000�00000137735�11753427512�0014627�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-05-08 06:53+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.7.0\n" #: About#1 msgid "Done" msgstr "" #: CaProperties#1 msgid "CA Properties" msgstr "" #: CaProperties#2 msgid "Use random Serial numbers" msgstr "" #: CaProperties#3 msgid "Days until next CRL issuing" msgstr "" #: CaProperties#4 msgid "Default template" msgstr "" #: CaProperties#5 msgid "Next serial for signing" msgstr "" #: CertDetail#1 msgid "Details of the Certificate" msgstr "" #: CertDetail#2 msgid "S&tatus" msgstr "" #: CertDetail#3 msgctxt "CertDetail#3" msgid "Serial" msgstr "" #: CertDetail#4 msgid "The serial number of the certificate" msgstr "" #: CertDetail#5 msgid "The internal name of the certificate in the database" msgstr "" #: CertDetail#6 msgctxt "CertDetail#6" msgid "Internal name" msgstr "" #: CertDetail#7 msgctxt "CertDetail#7" msgid "Signature algorithm" msgstr "" #: CertDetail#8 msgctxt "CertDetail#8" msgid "Signature" msgstr "" #: CertDetail#9 msgctxt "CertDetail#9" msgid "Key" msgstr "" #: CertDetail#10 msgid "Fingerprints" msgstr "" #: CertDetail#11 msgid "SHA1" msgstr "" #: CertDetail#12 msgid "MD5" msgstr "" #: CertDetail#13 msgid "A SHA-1 hashsum of the certificate" msgstr "" #: CertDetail#14 msgid "An md5 hashsum of the certificate" msgstr "" #: CertDetail#15 msgctxt "CertDetail#15" msgid "Validity" msgstr "" #: CertDetail#16 msgid "The time since the certificate is valid" msgstr "" #: CertDetail#17 msgid "The time until the certificate is valid" msgstr "" #: CertDetail#18 msgid "&Subject" msgstr "" #: CertDetail#19 msgctxt "CertDetail#19" msgid "&Issuer" msgstr "" #: CertDetail#20 msgid "Attributes" msgstr "" #: CertDetail#21 msgctxt "CertDetail#21" msgid "&Extensions" msgstr "" #: CertDetail#22 msgid "Show config" msgstr "" #: CertDetail#23 msgid "Show extensions" msgstr "" #: CertDetail#24 msgctxt "CertDetail#24" msgid "Not available" msgstr "" #: CertDetail#25 msgid "Details of the certificate" msgstr "" #: CertDetail#26 msgid "Signer unknown" msgstr "" #: CertDetail#27 msgid "Self signed" msgstr "" #: CertDetail#28 msgctxt "CertDetail#28" msgid "Not trusted" msgstr "" #: CertDetail#29 msgid "Trusted" msgstr "" #: CertDetail#30 msgid "Revoked: " msgstr "" #: CertDetail#31 msgid "Not valid" msgstr "" #: CertDetail#32 msgid "Valid" msgstr "" #: CertDetail#33 msgid "Details of the certificate signing request" msgstr "" #: CertExtend#1 msgid "Certificate renewal" msgstr "" #: CertExtend#2 msgid "" "This will create a new certificate as a copy of the old one with a new " "serial number and adjusted validity values." msgstr "" #: CertExtend#3 msgctxt "CertExtend#3" msgid "Validity" msgstr "" #: CertExtend#4 msgctxt "CertExtend#4" msgid "Not before" msgstr "" #: CertExtend#5 msgctxt "CertExtend#5" msgid "Not after" msgstr "" #: CertExtend#6 msgctxt "CertExtend#6" msgid "Time range" msgstr "" #: CertExtend#7 msgctxt "CertExtend#7" msgid "Days" msgstr "" #: CertExtend#8 msgctxt "CertExtend#8" msgid "Months" msgstr "" #: CertExtend#9 msgctxt "CertExtend#9" msgid "Years" msgstr "" #: CertExtend#10 msgctxt "CertExtend#10" msgid "Apply" msgstr "" #: CertExtend#11 msgctxt "CertExtend#11" msgid "Midnight" msgstr "" #: CertExtend#12 msgctxt "CertExtend#12" msgid "Local time" msgstr "" #: CertExtend#13 msgctxt "CertExtend#13" msgid "No well-defined expiration" msgstr "" #: CertExtend#14 msgctxt "CertExtend#14" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" #: CertExtend#15 msgid "Edit times" msgstr "" #: CertExtend#16 msgctxt "CertExtend#16" msgid "Abort rollout" msgstr "" #: CertExtend#17 msgctxt "CertExtend#17" msgid "Continue rollout" msgstr "" #: CertExtend#18 msgctxt "CertExtend#18" msgid "Adjust date and continue" msgstr "" #: CertExtend#19 msgctxt "CertExtend#19" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" #: CertView#1 msgctxt "CertView#1" msgid "There was no key found for the Certificate: " msgstr "" #: CertView#2 msgctxt "CertView#2" msgid "Import Certificate signing request" msgstr "" #: ClickLabel#1 msgid "Double click for details" msgstr "" #: CrlDetail#1 msgid "Details of the Revocation list" msgstr "" #: CrlDetail#2 msgid "&Status" msgstr "" #: CrlDetail#3 msgid "Version" msgstr "" #: CrlDetail#4 msgctxt "CrlDetail#4" msgid "Signature" msgstr "" #: CrlDetail#5 msgid "Signed by" msgstr "" #: CrlDetail#6 msgctxt "CrlDetail#6" msgid "Name" msgstr "" #: CrlDetail#7 msgid "The internal name of the CRL in the database" msgstr "" #: CrlDetail#8 msgid "issuing dates" msgstr "" #: CrlDetail#9 msgid "Next Update" msgstr "" #: CrlDetail#10 msgid "Last Update" msgstr "" #: CrlDetail#11 msgctxt "CrlDetail#11" msgid "&Issuer" msgstr "" #: CrlDetail#12 msgctxt "CrlDetail#12" msgid "&Extensions" msgstr "" #: CrlDetail#13 msgid "&Revocation list" msgstr "" #: CrlDetail#14 msgid "0" msgstr "" #: CrlDetail#15 msgctxt "CrlDetail#15" msgid "Serial" msgstr "" #: CrlDetail#16 msgctxt "CrlDetail#16" msgid "Revocation" msgstr "" #: CrlDetail#17 msgid "Reason" msgstr "" #: CrlDetail#18 msgid "Invalidation" msgstr "" #: CrlDetail#19 msgid "Failed" msgstr "" #: CrlDetail#20 msgid "Unknown signer" msgstr "" #: CrlDetail#21 msgid "Verification not possible" msgstr "" #: CrlDetail#22 msgid "Unknown certificate" msgstr "" #: ExportCert#1 msgid "X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )" msgstr "" #: ExportCert#2 msgid "" "DER is a binary format of the Certificate\n" "PEM is a base64 encoded Certificate\n" "PKCS#7 is an official Certificate exchange format\n" "PKCS#12 is an encrypted official Key-Certificate exchange format\n" msgstr "" #: ExportCert#3 msgid "Please enter the filename for the certificate." msgstr "" #: ExportCert#4 msgid "Certifikate export" msgstr "" #: ExportDer#1 msgctxt "ExportDer#1" msgid "All files ( * )" msgstr "" #: ExportDer#2 msgid "" "DER is a binary format\n" "PEM is a base64 encoded DER file\n" msgstr "" #: ExportDialog#1 msgctxt "ExportDialog#1" msgid "..." msgstr "" #: ExportDialog#2 msgid "Filename" msgstr "" #: ExportDialog#3 msgid "Please enter the filename" msgstr "" #: ExportDialog#4 msgid "Export Format" msgstr "" #: ExportDialog#5 msgid "The file: '%1' already exists!" msgstr "" #: ExportDialog#6 msgid "Overwrite" msgstr "" #: ExportDialog#7 msgid "Do not overwrite" msgstr "" #: ExportKey#1 msgid "When exporting the private key it should be encrypted." msgstr "" #: ExportKey#2 msgid "When exporting the private part, it should be encrypted." msgstr "" #: ExportKey#3 msgid "E&xport the private part of the Key too" msgstr "" #: ExportKey#4 msgid "Export as PKCS#8" msgstr "" #: ExportKey#5 msgid "&Encrypt the Key with a password" msgstr "" #: ExportKey#6 msgid "Private keys ( *.pem *.der *.pk8 );;All files ( * )" msgstr "" #: ExportKey#7 msgid "" "DER is a binary format of the key without encryption\n" "PEM is a base64 encoded key with optional encryption\n" "PKCS#8 is an encrypted official Key-exchange format" msgstr "" #: ExportKey#8 msgid "Please enter the filename for the key." msgstr "" #: ExportKey#9 msgid "Public key export" msgstr "" #: ExportKey#10 msgid "Key export" msgstr "" #: Help#1 msgid "<<" msgstr "" #: Help#2 msgid ">>" msgstr "" #: Help#3 msgctxt "Help#3" msgid "&Done" msgstr "" #: ImportMulti#1 msgid "Import PKI Items" msgstr "" #: ImportMulti#2 msgid "Import &All" msgstr "" #: ImportMulti#3 msgctxt "ImportMulti#3" msgid "&Import" msgstr "" #: ImportMulti#4 msgctxt "ImportMulti#4" msgid "&Done" msgstr "" #: ImportMulti#5 msgid "&Remove from list" msgstr "" #: ImportMulti#6 msgid "Details" msgstr "" #: ImportMulti#7 msgid "Delete from token" msgstr "" #: ImportMulti#8 msgid "Rename on token" msgstr "" #: ImportMulti#9 msgid "" "\n" "Name: %1\n" "Model: %2\n" "Serial: %3" msgstr "" #: ImportMulti#10 msgid "Manage security token" msgstr "" #: ImportMulti#11 msgid "The type of the Item '%1' is not recognized" msgstr "" #: ImportMulti#12 msgid "Details of the item '%1' cannot be shown" msgstr "" #: ImportMulti#13 msgid "The type of the item '%1' is not recognized" msgstr "" #: ImportMulti#14 msgid "The file '%1' did not contain PKI data" msgstr "" #: ImportMulti#15 msgid "The %1 files: '%2' did not contain PKI data" msgstr "" #: KeyDetail#1 msgctxt "KeyDetail#1" msgid "Name" msgstr "" #: KeyDetail#2 msgid "The internal name of the key used by xca" msgstr "" #: KeyDetail#3 msgctxt "KeyDetail#3" msgid "Security token" msgstr "" #: KeyDetail#4 msgid "Manufacturer" msgstr "" #: KeyDetail#5 msgctxt "KeyDetail#5" msgid "Serial" msgstr "" #: KeyDetail#6 msgctxt "KeyDetail#6" msgid "Key" msgstr "" #: KeyDetail#7 msgid "Public Exponent" msgstr "" #: KeyDetail#8 msgctxt "KeyDetail#8" msgid "Keysize" msgstr "" #: KeyDetail#9 msgid "Private Exponent" msgstr "" #: KeyDetail#10 msgid "Modulus" msgstr "" #: KeyDetail#11 msgid "Details of the %1 key" msgstr "" #: KeyDetail#12 msgctxt "KeyDetail#12" msgid "Not available" msgstr "" #: KeyDetail#13 msgid "Token" msgstr "" #: KeyDetail#14 msgid "Security token ID:%1" msgstr "" #: KeyDetail#15 msgid "Available" msgstr "" #: KeyDetail#16 msgid "Sub prime" msgstr "" #: KeyDetail#17 msgid "Public key" msgstr "" #: KeyDetail#18 msgctxt "KeyDetail#18" msgid "Private key" msgstr "" #: KeyDetail#19 msgid "Curve name" msgstr "" #: KeyDetail#20 msgid "Unknown key" msgstr "" #: MainWindow#1 msgid "Private Keys" msgstr "" #: MainWindow#2 msgid "&New Key" msgstr "" #: MainWindow#3 msgid "&Export" msgstr "" #: MainWindow#4 msgctxt "MainWindow#4" msgid "&Import" msgstr "" #: MainWindow#5 msgid "Import PFX (PKCS#12)" msgstr "" #: MainWindow#6 msgid "&Show Details" msgstr "" #: MainWindow#7 msgid "&Delete" msgstr "" #: MainWindow#8 msgid "Certificate signing requests" msgstr "" #: MainWindow#9 msgid "&New Request" msgstr "" #: MainWindow#10 msgid "Certificates" msgstr "" #: MainWindow#11 msgid "&New Certificate" msgstr "" #: MainWindow#12 msgid "Import &PKCS#12" msgstr "" #: MainWindow#13 msgid "Import P&KCS#7" msgstr "" #: MainWindow#14 msgctxt "MainWindow#14" msgid "Plain View" msgstr "" #: MainWindow#15 msgid "Templates" msgstr "" #: MainWindow#16 msgid "&New template" msgstr "" #: MainWindow#17 msgid "Ch&ange Template" msgstr "" #: MainWindow#18 msgid "Revocation lists" msgstr "" #: MainWindow#19 msgid "" "Using or exporting private keys will not be possible without providing the " "correct password" msgstr "" #: MainWindow#20 msgid "Database" msgstr "" #: MainWindow#21 msgid "No deleted items found" msgstr "" #: MainWindow#22 msgid "&File" msgstr "" #: MainWindow#23 msgid "&New DataBase" msgstr "" #: MainWindow#24 msgid "&Open DataBase" msgstr "" #: MainWindow#25 msgid "Generate DH parameter" msgstr "" #: MainWindow#26 msgid "Set as default DataBase" msgstr "" #: MainWindow#27 msgid "&Close DataBase" msgstr "" #: MainWindow#28 msgid "&Dump DataBase" msgstr "" #: MainWindow#29 msgid "C&hange DataBase password" msgstr "" #: MainWindow#30 msgid "&Import old db_dump" msgstr "" #: MainWindow#31 msgid "&Undelete items" msgstr "" #: MainWindow#32 msgid "Options" msgstr "" #: MainWindow#33 msgid "Exit" msgstr "" #: MainWindow#34 msgid "I&mport" msgstr "" #: MainWindow#35 msgid "Keys" msgstr "" #: MainWindow#36 msgid "Requests" msgstr "" #: MainWindow#37 msgid "PKCS#12" msgstr "" #: MainWindow#38 msgctxt "MainWindow#38" msgid "PKCS#7" msgstr "" #: MainWindow#39 msgctxt "MainWindow#39" msgid "Template" msgstr "" #: MainWindow#40 msgid "Revocation list" msgstr "" #: MainWindow#41 msgid "PEM file" msgstr "" #: MainWindow#42 msgid "paste PEM file" msgstr "" #: MainWindow#43 msgid "&Token" msgstr "" #: MainWindow#44 msgid "&Manage Security token" msgstr "" #: MainWindow#45 msgid "&Init Security token" msgstr "" #: MainWindow#46 msgid "&Change PIN" msgstr "" #: MainWindow#47 msgid "Change &SO PIN" msgstr "" #: MainWindow#48 msgid "Init PIN" msgstr "" #: MainWindow#49 msgid "&Help" msgstr "" #: MainWindow#50 msgid "&Content" msgstr "" #: MainWindow#51 msgid "&About" msgstr "" #: MainWindow#52 msgid "Donations" msgstr "" #: MainWindow#53 msgid "Database dump ( *.dump );;All files ( * )" msgstr "" #: MainWindow#54 msgid "Import password" msgstr "" #: MainWindow#55 msgid "Please enter the password of the old database" msgstr "" #: MainWindow#56 msgid "Password verification error. Ignore keys ?" msgstr "" #: MainWindow#57 msgid "Import anyway" msgstr "" #: MainWindow#58 msgctxt "MainWindow#58" msgid "Cancel" msgstr "" #: MainWindow#59 msgid "no such option: %1" msgstr "" #: MainWindow#60 msgid "Import PEM data" msgstr "" #: MainWindow#61 msgid "Please enter the original SO PIN (PUK) of the token '%1'" msgstr "" #: MainWindow#62 msgid "Please enter the new SO PIN (PUK) of the token '%1'" msgstr "" #: MainWindow#63 msgid "The new label of the token '%1'" msgstr "" #: MainWindow#64 msgid "The token '%1' did not contain any keys or certificates" msgstr "" #: MainWindow#65 msgid "New Password" msgstr "" #: MainWindow#66 msgid "" "Please enter the new password to encrypt your private keys in the database-" "file" msgstr "" #: MainWindow#67 msgid "" "Please enter a password, that will be used to encrypt your private keys in " "the database file:\n" "%1" msgstr "" #: MainWindow#68 msgid "Password verify error, please try again" msgstr "" #: MainWindow#69 msgctxt "MainWindow#69" msgid "Password" msgstr "" #: MainWindow#70 msgid "" "Please enter the password for unlocking the database:\n" "%1" msgstr "" #: MainWindow#71 msgid "The following error occured:" msgstr "" #: MainWindow#72 msgid "Copy to Clipboard" msgstr "" #: MainWindow#73 msgid "" "Diffie-Hellman parameters are needed for different applications, but not " "handled by XCA.\n" "Please enter the DH parameter bits" msgstr "" #: MainWindow#74 msgctxt "MainWindow#74" msgid "Error opening file: '%1': %2" msgstr "" #: NewCrl#1 msgid "Create CRL" msgstr "" #: NewCrl#2 msgid "Dates" msgstr "" #: NewCrl#3 msgid "last update" msgstr "" #: NewCrl#4 msgid "next update" msgstr "" #: NewCrl#5 msgctxt "NewCrl#5" msgid "Days" msgstr "" #: NewCrl#6 msgctxt "NewCrl#6" msgid "Months" msgstr "" #: NewCrl#7 msgctxt "NewCrl#7" msgid "Years" msgstr "" #: NewCrl#8 msgctxt "NewCrl#8" msgid "Midnight" msgstr "" #: NewCrl#9 msgctxt "NewCrl#9" msgid "Local time" msgstr "" #: NewCrl#10 msgctxt "NewCrl#10" msgid "Apply" msgstr "" #: NewCrl#11 msgid "Hashing algorithm" msgstr "" #: NewCrl#12 msgctxt "NewCrl#12" msgid "Extensions" msgstr "" #: NewCrl#13 msgid "Authority key identifier" msgstr "" #: NewCrl#14 msgid "Subject alternative name" msgstr "" #: NewCrl#15 msgid "CRL Number" msgstr "" #: NewCrl#16 msgid "Revokation reasons" msgstr "" #: NewKey#1 msgid "New key" msgstr "" #: NewKey#2 msgid "Please give a name to the new key and select the desired keysize" msgstr "" #: NewKey#3 msgid "Key properties" msgstr "" #: NewKey#4 msgctxt "NewKey#4" msgid "Name" msgstr "" #: NewKey#5 msgid "The internal name of the new key" msgstr "" #: NewKey#6 msgctxt "NewKey#6" msgid "New Key" msgstr "" #: NewKey#7 msgid "Curve" msgstr "" #: NewKey#8 msgctxt "NewKey#8" msgid "Keysize" msgstr "" #: NewKey#9 msgid "Usually 1024 or 2048 bit keys are used" msgstr "" #: NewKey#10 msgid "Keytype" msgstr "" #: NewKey#11 msgctxt "NewKey#11" msgid "Create" msgstr "" #: NewX509#1 msgctxt "NewX509#1" msgid "Create" msgstr "" #: NewX509#2 msgid "Source" msgstr "" #: NewX509#3 msgid "Signing request" msgstr "" #: NewX509#4 msgid "" "A certificate signing request can be signed, even if the private key of the " "request is not available. This is the intention of a CSR:\n" "Getting signed by a CA certificate, whoes certificate of course must be in " "the database\n" "Of course you need the private key of the CSR if you want to create a self-" "signed cert from it." msgstr "" #: NewX509#5 msgid "Show request" msgstr "" #: NewX509#6 msgid "Sign this Certificate signing &request" msgstr "" #: NewX509#7 msgid "Copy extensions from the request" msgstr "" #: NewX509#8 msgid "Modify subject of the request" msgstr "" #: NewX509#9 msgid "Signing" msgstr "" #: NewX509#10 msgid "Create a &self signed certificate with the serial" msgstr "" #: NewX509#11 msgid "If you leave this blank the serial 00 will be used" msgstr "" #: NewX509#12 msgid "1" msgstr "" #: NewX509#13 msgid "Use &this Certificate for signing" msgstr "" #: NewX509#14 msgid "All certificates in your database that can create valid signatures" msgstr "" #: NewX509#15 msgid "" "This list contains all certificates with the CA-flag set to true and whoes " "private key is present in the key-database.\n" "If this list is disabled, you only can create a self-signed certificate." msgstr "" #: NewX509#16 msgctxt "NewX509#16" msgid "Signature algorithm" msgstr "" #: NewX509#17 msgid "Template for the new certificate" msgstr "" #: NewX509#18 msgid "All available templates" msgstr "" #: NewX509#19 msgid "This list contains all templates from the toplevel template Tab" msgstr "" #: NewX509#20 msgid "Apply extensions" msgstr "" #: NewX509#21 msgid "Apply subject" msgstr "" #: NewX509#22 msgid "Apply all" msgstr "" #: NewX509#23 msgctxt "NewX509#23" msgid "Subject" msgstr "" #: NewX509#24 msgid "Distinguished name" msgstr "" #: NewX509#25 msgid "Organisation" msgstr "" #: NewX509#26 msgid "" "This name is only used internally and does not appear in the resulting " "certificate" msgstr "" #: NewX509#27 msgid "Must be exactly 2 letter of size (DE, UK)" msgstr "" #: NewX509#28 msgid "Country code" msgstr "" #: NewX509#29 msgid "State or Province" msgstr "" #: NewX509#30 msgid "Locality" msgstr "" #: NewX509#31 msgid "Organisational unit" msgstr "" #: NewX509#32 msgid "E-Mail address" msgstr "" #: NewX509#33 msgctxt "NewX509#33" msgid "Internal name" msgstr "" #: NewX509#34 msgid "Common name" msgstr "" #: NewX509#35 msgctxt "NewX509#35" msgid "Add" msgstr "" #: NewX509#36 msgctxt "NewX509#36" msgid "Delete" msgstr "" #: NewX509#37 msgctxt "NewX509#37" msgid "Private key" msgstr "" #: NewX509#38 msgid "This list only contains unused keys" msgstr "" #: NewX509#39 msgid "Used keys too" msgstr "" #: NewX509#40 msgid "&Generate a new key" msgstr "" #: NewX509#41 msgctxt "NewX509#41" msgid "Extensions" msgstr "" #: NewX509#42 msgid "Basic constraints" msgstr "" #: NewX509#43 msgctxt "NewX509#43" msgid "Type" msgstr "" #: NewX509#44 msgid "If this will become a CA certificate or not" msgstr "" #: NewX509#45 msgid "" "Set this to TRUE if you want to create a CA certificate that signs other " "certificates.\n" "This is always set to FALSE for client or server certificates. In most cases " "self-signed certificates are CA certificates.\n" "Self-signed non-CA certificates are unusual although they are possible." msgstr "" #: NewX509#46 msgid "Not defined" msgstr "" #: NewX509#47 msgid "Certification Authority" msgstr "" #: NewX509#48 msgid "End Entity" msgstr "" #: NewX509#49 msgid "Path length" msgstr "" #: NewX509#50 msgid "How much CAs may be below this." msgstr "" #: NewX509#51 msgid "" "If this is left empty the pathlen is not included in the certificate. " "Otherwise it distinguishes the count of chained CA certificates below this " "one.\n" "A pathlen of 0 means, that this certificate may not issue other sub-CA " "certificates. Although it can do it, all chain-checking algorithms in e.g. " "your browser or openssl will (should) fail." msgstr "" #: NewX509#52 msgid "The basic constraints should always be critical" msgstr "" #: NewX509#53 msgid "Key identifier" msgstr "" #: NewX509#54 msgid "Creates a hash of the key following the PKIX guidelines" msgstr "" #: NewX509#55 msgid "Copy the Subject Key Identifier from the issuer" msgstr "" #: NewX509#56 msgid "" "If this box is checked an attempt is made to copy the subject key identifier " "from the signing certificate.\n" "It also copies the issuer and serial number from the issuer certificate. " "Normally this will only be done if the keyid option fails." msgstr "" #: NewX509#57 msgctxt "NewX509#57" msgid "Validity" msgstr "" #: NewX509#58 msgctxt "NewX509#58" msgid "Not before" msgstr "" #: NewX509#59 msgctxt "NewX509#59" msgid "Not after" msgstr "" #: NewX509#60 msgctxt "NewX509#60" msgid "Time range" msgstr "" #: NewX509#61 msgctxt "NewX509#61" msgid "Days" msgstr "" #: NewX509#62 msgctxt "NewX509#62" msgid "Months" msgstr "" #: NewX509#63 msgctxt "NewX509#63" msgid "Years" msgstr "" #: NewX509#64 msgctxt "NewX509#64" msgid "Apply" msgstr "" #: NewX509#65 msgid "Set the time to 00:00:00 and 23:59:59 respectively" msgstr "" #: NewX509#66 msgctxt "NewX509#66" msgid "Midnight" msgstr "" #: NewX509#67 msgctxt "NewX509#67" msgid "Local time" msgstr "" #: NewX509#68 msgctxt "NewX509#68" msgid "No well-defined expiration" msgstr "" #: NewX509#69 msgid "subject alternative name" msgstr "" #: NewX509#70 msgid "DNS: IP: URI: email: RID:" msgstr "" #: NewX509#71 msgid "" "The subject alternative name extension allows various literal values to be " "used. These include \"email\" (an email address) , \"URI\" a uniform resource " "indicator, \"DNS\" (a DNS domain name) , RID (a registered ID: OBJECT " "IDENTIFIER) and IP (an IP address).\n" "Examples:\n" "email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/\n" "email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld" msgstr "" #: NewX509#72 msgid "Edit" msgstr "" #: NewX509#73 msgid "issuer alternative name" msgstr "" #: NewX509#74 msgid "" "The issuer alternative name extension allows various literal values to be " "used. These include \"email\" (an email address) , \"URI\" a uniform resource " "indicator, \"DNS\" (a DNS domain name), RID (a registered ID: OBJECT " "IDENTIFIER) and IP (an IP address).\n" "Examples:\n" "email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/\n" "email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld" msgstr "" #: NewX509#75 msgid "CRL distribution point" msgstr "" #: NewX509#76 msgid "URI:" msgstr "" #: NewX509#77 msgid "" "This is a multi-valued extension that supports all the literal options of " "subject alternative name. Of the few software packages that currentlyi " "nterpret this extension most only interpret the URI option.\n" "Currently each option will set a new DistributionPoint with the fullName " "field set to the given value.\n" "Other fields like cRLissuer and reasons cannot currently be set or " "displayed: at this time no examples were available that used these fields.\n" "If you see this extension with <UNSUPPORTED> when you attempt to print it " "out or it doesn't appear to display correctly then let steve know, including " "the certificate (mail steve at openssl dot org) .\n" "Examples:\n" "URI:http://www.myhost.com/myca.crl\n" "URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl" msgstr "" #: NewX509#78 msgid "Authority Info Access" msgstr "" #: NewX509#79 msgid "can be altered by the file \"aia.txt\"" msgstr "" #: NewX509#80 msgid "" "The authority information access extension gives details about how to access " "certain information relating to the CA. Its syntax is accessOID;location " "where 'location' has the same syntax as subject alternative name (except " "that email:copy is not supported). accessOID can be any valid OID but only " "certain values are meaningful for example OCSP and caIssuers. OCSP gives the " "location of an OCSP responder: this is used by Netscape PSM and other " "software.\n" "\n" "Example:\n" "\n" "OCSP;URI:http://ocsp.my.host/\n" "caIssuers;URI:http://my.ca/ca.html" msgstr "" #: NewX509#81 msgid "Key usage" msgstr "" #: NewX509#82 msgid "Extended key usage" msgstr "" #: NewX509#83 msgid "Netscape" msgstr "" #: NewX509#84 msgid "CA Revocation URL" msgstr "" #: NewX509#85 msgid "Revocation URL" msgstr "" #: NewX509#86 msgid "SSL server name" msgstr "" #: NewX509#87 msgid "Certificate renewal URL" msgstr "" #: NewX509#88 msgid "Comment" msgstr "" #: NewX509#89 msgid "CA policy URL" msgstr "" #: NewX509#90 msgid "Base URL" msgstr "" #: NewX509#91 msgid "If you know a more pretty one tell me" msgstr "" #: NewX509#92 msgid "Advanced" msgstr "" #: NewX509#93 msgctxt "NewX509#93" msgid "Validate" msgstr "" #: NewX509#94 msgid "Create a &self signed certificate with a MD5-hashed QA serial" msgstr "" #: NewX509#95 msgid "Create Certificate signing request" msgstr "" #: NewX509#96 msgid "minimum size: %1" msgstr "" #: NewX509#97 msgid "maximum size: %1" msgstr "" #: NewX509#98 msgid "only a-z A-Z 0-9 '()+,-./:=?" msgstr "" #: NewX509#99 msgid "only 7-bit clean characters" msgstr "" #: NewX509#100 msgid "XCA template" msgstr "" #: NewX509#101 msgid "Create x509 Certificate" msgstr "" #: NewX509#102 msgid "From PKCS#10 request" msgstr "" #: NewX509#103 msgid "Other Tabs" msgstr "" #: NewX509#104 msgid "Advanced Tab" msgstr "" #: NewX509#105 msgid "Errors" msgstr "" #: NewX509#106 msgctxt "NewX509#106" msgid "Abort rollout" msgstr "" #: NewX509#107 msgid "The following length restrictions of RFC3280 are violated:" msgstr "" #: NewX509#108 msgid "Edit subject" msgstr "" #: NewX509#109 msgctxt "NewX509#109" msgid "Continue rollout" msgstr "" #: NewX509#110 msgid "" "The verification of the Certificate request failed.\n" "The rollout should be aborted." msgstr "" #: NewX509#111 msgid "Continue anyway" msgstr "" #: NewX509#112 msgid "" "The internal name and the common name are empty.\n" "Please set at least the internal name." msgstr "" #: NewX509#113 msgid "Edit name" msgstr "" #: NewX509#114 msgid "There is no Key selected for signing." msgstr "" #: NewX509#115 msgid "Select key" msgstr "" #: NewX509#116 msgid "" "The following distinguished name entries are empty:\n" "%1\n" "though you have declared them as mandatory in the options menu." msgstr "" #: NewX509#117 msgctxt "NewX509#117" msgid "The key you selected for signing is not a private one." msgstr "" #: NewX509#118 msgid "Select other signer" msgstr "" #: NewX509#119 msgid "Select other key" msgstr "" #: NewX509#120 msgctxt "NewX509#120" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" #: NewX509#121 msgid "Edit dates" msgstr "" #: NewX509#122 msgctxt "NewX509#122" msgid "Adjust date and continue" msgstr "" #: NewX509#123 msgctxt "NewX509#123" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" #: NewX509#124 msgid "" "The certificate will be out of date before it becomes valid. You most " "probably mixed up both dates." msgstr "" #: NewX509#125 msgid "" "The certificate contains invalid or duplicate extensions. Check the " "validation on the advanced tab." msgstr "" #: NewX509#126 msgid "Edit extensions" msgstr "" #: NewX509#127 msgid "Configfile error on line %1\n" msgstr "" #: Options#1 msgid "XCA Options" msgstr "" #: Options#2 msgid "Mandatory subject entries" msgstr "" #: Options#3 msgctxt "Options#3" msgid "Add" msgstr "" #: Options#4 msgctxt "Options#4" msgid "Delete" msgstr "" #: Options#5 msgid "Default hash algorithm" msgstr "" #: Options#6 msgid "String types" msgstr "" #: Options#7 msgid "Suppress success messages" msgstr "" #: Options#8 msgid "Don't colorize expired certificates" msgstr "" #: Options#9 msgid "PKCS#11 provider" msgstr "" #: Options#10 msgid "Remove" msgstr "" #: Options#11 msgctxt "Options#11" msgid "Search" msgstr "" #: Options#12 msgid "Printable string or UTF8 (default)" msgstr "" #: Options#13 msgid "PKIX recommendation in RFC2459" msgstr "" #: Options#14 msgid "No BMP strings, only printable and T61" msgstr "" #: Options#15 msgid "UTF8 strings only (RFC2459)" msgstr "" #: Options#16 msgid "All strings" msgstr "" #: Options#17 msgid "Load failed" msgstr "" #: PwDialog#1 msgid "" "The password is parsed as 2-digit hex code. It must have an even number of " "digits (0-9 and a-f)" msgstr "" #: PwDialog#2 msgid "Take as HEX string" msgstr "" #: PwDialog#3 msgid "Repeat %1" msgstr "" #: PwDialog#4 msgid "%1 missmatch" msgstr "" #: PwDialog#5 msgid "" "Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it " "must consist of an even number of characters" msgstr "" #: PwDialog#6 msgid "E&xit" msgstr "" #: QObject#1 msgid "Undefined" msgstr "" #: QObject#2 msgid "Broken / Invalid" msgstr "" #: QObject#3 msgid "DB: Rename: '%1' already in use" msgstr "" #: QObject#4 msgid "DB: Entry to rename not found: %1" msgstr "" #: QObject#5 msgid "DB: Write error %1 - %2" msgstr "" #: QObject#6 msgid "Out of data" msgstr "" #: QObject#7 msgid "Error finding endmarker of string" msgstr "" #: QObject#8 msgid "Out of Memory at %1:%2" msgstr "" #: QObject#9 msgctxt "QObject#9" msgid "All files ( * )" msgstr "" #: QObject#10 msgid "PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;" msgstr "" #: QObject#11 msgid "Import RSA key" msgstr "" #: QObject#12 msgid "PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;" msgstr "" #: QObject#13 msgid "Import Request" msgstr "" #: QObject#14 msgid "Certificates ( *.pem *.der *.crt *.cer );;" msgstr "" #: QObject#15 msgid "Import X.509 Certificate" msgstr "" #: QObject#16 msgid "PKCS#7 data ( *.p7s *.p7m *.p7b );;" msgstr "" #: QObject#17 msgid "Import PKCS#7 Certificates" msgstr "" #: QObject#18 msgid "PKCS#12 Certificates ( *.p12 *.pfx );;" msgstr "" #: QObject#19 msgid "Import PKCS#12 Private Certificate" msgstr "" #: QObject#20 msgid "XCA templates ( *.xca );;" msgstr "" #: QObject#21 msgid "Import XCA Templates" msgstr "" #: QObject#22 msgid "Revocation lists ( *.pem *.der *.crl );;" msgstr "" #: QObject#23 msgid "Import Certificate Revocation List" msgstr "" #: QObject#24 msgid "XCA Databases ( *.xdb );;" msgstr "" #: QObject#25 msgid "Open XCA Database" msgstr "" #: QObject#26 msgid "PKCS#11 library ( *.dll );;" msgstr "" #: QObject#27 msgid "PKCS#11 library ( *.dylib *.so );;" msgstr "" #: QObject#28 msgid "PKCS#11 library ( *.so );;" msgstr "" #: QObject#29 msgid "Open PKCS#11 shared library" msgstr "" #: QObject#30 msgid "PEM files ( *.pem );;" msgstr "" #: QObject#31 msgid "Load PEM encoded file" msgstr "" #: QObject#32 msgid "Please enter the PIN on the PinPad" msgstr "" #: QObject#33 msgid "Please enter the SO PIN (PUK) of the token %1" msgstr "" #: QObject#34 msgid "Please enter the PIN of the token %1" msgstr "" #: QObject#35 msgid "No Security token found" msgstr "" #: QObject#36 msgid "Select" msgstr "" #: QObject#37 msgid "Please enter the new SO PIN (PUK) for the token: '%1'" msgstr "" #: QObject#38 msgid "Please enter the new PIN for the token: '%1'" msgstr "" #: QObject#39 msgid "Required PIN size: %1 - %2" msgstr "" #: QObject#40 msgid "Failed to open PKCS11 library: %1" msgstr "" #: QObject#41 msgid "PKCS#11 function '%1' failed: %2" msgstr "" #: QObject#42 msgid "" "PKCS#11 function '%1' failed: %2\n" "In library %3\n" "%4" msgstr "" #: QObject#43 msgid "Invalid" msgstr "" #: QObject#44 msgid "%1 is shorter than %2 bytes: '%3'" msgstr "" #: QObject#45 msgid "%1 is longer than %2 bytes: '%3'" msgstr "" #: Revoke#1 msgid "Revokation details" msgstr "" #: Revoke#2 msgid "Invalid since" msgstr "" #: Revoke#3 msgctxt "Revoke#3" msgid "Local time" msgstr "" #: Revoke#4 msgid "Revokation reason" msgstr "" #: SearchPkcs11#1 msgid "Dialog" msgstr "" #: SearchPkcs11#2 msgid "Directory" msgstr "" #: SearchPkcs11#3 msgctxt "SearchPkcs11#3" msgid "..." msgstr "" #: SearchPkcs11#4 msgid "include sub directorys" msgstr "" #: SearchPkcs11#5 msgctxt "SearchPkcs11#5" msgid "Search" msgstr "" #: SearchPkcs11#6 msgid "The following files are possible PKCS#11 libraries" msgstr "" #: SelectToken#1 msgid "Select Token" msgstr "" #: SelectToken#2 msgctxt "SelectToken#2" msgid "Security token" msgstr "" #: SelectToken#3 msgid "Please select the security token" msgstr "" #: TrustState#1 msgid "Set trustment of the Certificate" msgstr "" #: TrustState#2 msgid "Trustment" msgstr "" #: TrustState#3 msgid "&Never trust this certificate" msgstr "" #: TrustState#4 msgid "Only &trust this certificate, if we trust the signer" msgstr "" #: TrustState#5 msgid "&Always trust this certificate" msgstr "" #: Validity#1 msgid "yyyy-MM-dd hh:mm" msgstr "" #: db_base#1 msgctxt "db_base#1" msgid "Internal name" msgstr "" #: db_base#2 msgid "Subject entries" msgstr "" #: db_base#3 msgid "X509v3 Extensions" msgstr "" #: db_base#4 msgid "Reset" msgstr "" #: db_base#5 msgid "Paste PEM data" msgstr "" #: db_base#6 msgid "Columns" msgstr "" #: db_crl#1 msgid "Signer" msgstr "" #: db_crl#2 msgid "Internal name of the signer" msgstr "" #: db_crl#3 msgid "No. revoked" msgstr "" #: db_crl#4 msgid "Number of revoked certificates" msgstr "" #: db_crl#5 msgid "Last update" msgstr "" #: db_crl#6 msgid "Next update" msgstr "" #: db_crl#7 msgid "CRL number" msgstr "" #: db_crl#8 msgid "" "The revokation list already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" #: db_crl#9 msgid "CRL ( *.pem *.der *.crl )" msgstr "" #: db_crl#10 msgid "Revokation list export" msgstr "" #: db_crl#11 msgctxt "db_crl#11" msgid "Import" msgstr "" #: db_crl#12 msgctxt "db_crl#12" msgid "Rename" msgstr "" #: db_crl#13 msgctxt "db_crl#13" msgid "Export" msgstr "" #: db_crl#14 msgctxt "db_crl#14" msgid "Clipboard" msgstr "" #: db_crl#15 msgctxt "db_crl#15" msgid "File" msgstr "" #: db_crl#16 msgctxt "db_crl#16" msgid "Delete" msgstr "" #: db_key#1 msgctxt "db_key#1" msgid "Type" msgstr "" #: db_key#2 msgid "Size" msgstr "" #: db_key#3 msgid "Use" msgstr "" #: db_key#4 msgctxt "db_key#4" msgid "Password" msgstr "" #: db_key#5 msgid "" "The key is already in the database as:\n" "'%1'\n" "and is not going to be imported" msgstr "" #: db_key#6 msgid "" "The database already contains the public part of the imported key as\n" "'%1\n" "and will be completed by the new, private part of the key" msgstr "" #: db_key#7 msgid "Key size too small !" msgstr "" #: db_key#8 msgid "You are sure to create a key of the size: %1 ?" msgstr "" #: db_key#9 msgid "" "Shall the original key '%1' be replaced by the key on the token?\n" "This will delete the key '%1' and make it unexportable" msgstr "" #: db_key#10 msgctxt "db_key#10" msgid "New Key" msgstr "" #: db_key#11 msgctxt "db_key#11" msgid "Import" msgstr "" #: db_key#12 msgctxt "db_key#12" msgid "Rename" msgstr "" #: db_key#13 msgctxt "db_key#13" msgid "Show Details" msgstr "" #: db_key#14 msgctxt "db_key#14" msgid "Delete" msgstr "" #: db_key#15 msgctxt "db_key#15" msgid "Export" msgstr "" #: db_key#16 msgid "Change password" msgstr "" #: db_key#17 msgid "Reset password" msgstr "" #: db_key#18 msgid "Change PIN" msgstr "" #: db_key#19 msgid "Init PIN with SO PIN (PUK)" msgstr "" #: db_key#20 msgid "Change SO PIN (PUK)" msgstr "" #: db_key#21 msgid "Store on Security token" msgstr "" #: db_key#22 msgid "Tried to change password of a token" msgstr "" #: db_key#23 msgid "Tried to change PIN of a key" msgstr "" #: db_key#24 msgid "Tried to init PIN of a key" msgstr "" #: db_key#25 msgid "Tried to change SO PIN of a key" msgstr "" #: db_temp#1 msgctxt "db_temp#1" msgid "Type" msgstr "" #: db_temp#2 msgid "Bad template: %1" msgstr "" #: db_temp#3 msgid "Nothing" msgstr "" #: db_temp#4 msgid "Preset Template values" msgstr "" #: db_temp#5 msgid "copy" msgstr "" #: db_temp#6 msgid "Save template as" msgstr "" #: db_temp#7 msgid "XCA templates ( *.xca);; All files ( * )" msgstr "" #: db_temp#8 msgid "New Template" msgstr "" #: db_temp#9 msgctxt "db_temp#9" msgid "Import" msgstr "" #: db_temp#10 msgctxt "db_temp#10" msgid "Rename" msgstr "" #: db_temp#11 msgctxt "db_temp#11" msgid "Export" msgstr "" #: db_temp#12 msgid "Change" msgstr "" #: db_temp#13 msgctxt "db_temp#13" msgid "Delete" msgstr "" #: db_temp#14 msgid "Duplicate" msgstr "" #: db_temp#15 msgid "Create certificate" msgstr "" #: db_temp#16 msgid "Create request" msgstr "" #: db_x509#1 msgid "CA" msgstr "" #: db_x509#2 msgid "reflects the basic Constraints extension" msgstr "" #: db_x509#3 msgctxt "db_x509#3" msgid "Serial" msgstr "" #: db_x509#4 msgid "md5 fingerprint" msgstr "" #: db_x509#5 msgid "sha1 fingerprint" msgstr "" #: db_x509#6 msgid "Start date" msgstr "" #: db_x509#7 msgid "not Before" msgstr "" #: db_x509#8 msgid "Expiry date" msgstr "" #: db_x509#9 msgid "not After" msgstr "" #: db_x509#10 msgid "Trust state" msgstr "" #: db_x509#11 msgctxt "db_x509#11" msgid "Revocation" msgstr "" #: db_x509#12 msgctxt "db_x509#12" msgid "Plain View" msgstr "" #: db_x509#13 msgid "Tree View" msgstr "" #: db_x509#14 msgid "" "The certificate already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" #: db_x509#15 msgid "Invalid public key" msgstr "" #: db_x509#16 msgid "Please enter the new hexadecimal secret number for the QA process." msgstr "" #: db_x509#17 msgid "The QA process has been terminated by the user." msgstr "" #: db_x509#18 msgctxt "db_x509#18" msgid "The key you selected for signing is not a private one." msgstr "" #: db_x509#19 msgid "Store the certificate to the key on the token '%1 (#%2)' ?" msgstr "" #: db_x509#20 msgid "New Certificate" msgstr "" #: db_x509#21 msgctxt "db_x509#21" msgid "Import" msgstr "" #: db_x509#22 msgid "Import PKCS#12" msgstr "" #: db_x509#23 msgid "Import from PKCS#7" msgstr "" #: db_x509#24 msgctxt "db_x509#24" msgid "Rename" msgstr "" #: db_x509#25 msgctxt "db_x509#25" msgid "Show Details" msgstr "" #: db_x509#26 msgctxt "db_x509#26" msgid "Extract public Key" msgstr "" #: db_x509#27 msgctxt "db_x509#27" msgid "Export" msgstr "" #: db_x509#28 msgctxt "db_x509#28" msgid "Clipboard" msgstr "" #: db_x509#29 msgctxt "db_x509#29" msgid "File" msgstr "" #: db_x509#30 msgid "Request" msgstr "" #: db_x509#31 msgctxt "db_x509#31" msgid "Security token" msgstr "" #: db_x509#32 msgid "Other token" msgstr "" #: db_x509#33 msgctxt "db_x509#33" msgid "Template" msgstr "" #: db_x509#34 msgctxt "db_x509#34" msgid "OpenSSL config" msgstr "" #: db_x509#35 msgctxt "db_x509#35" msgid "Delete" msgstr "" #: db_x509#36 msgid "Delete from Security token" msgstr "" #: db_x509#37 msgid "Trust" msgstr "" #: db_x509#38 msgid "Properties" msgstr "" #: db_x509#39 msgid "Generate CRL" msgstr "" #: db_x509#40 msgctxt "db_x509#40" msgid "PKCS#7" msgstr "" #: db_x509#41 msgctxt "db_x509#41" msgid "Sign" msgstr "" #: db_x509#42 msgid "Encrypt" msgstr "" #: db_x509#43 msgid "Renewal" msgstr "" #: db_x509#44 msgid "Unrevoke" msgstr "" #: db_x509#45 msgid "Revoke" msgstr "" #: db_x509#46 msgid "There was no key found for the Certificate: '%1'" msgstr "" #: db_x509#47 msgid "Not possible for a token key: '%1'" msgstr "" #: db_x509#48 msgid "Not possible for the token-key Certificate '%1'" msgstr "" #: db_x509#49 msgid " days" msgstr "" #: db_x509name#1 msgctxt "db_x509name#1" msgid "Subject" msgstr "" #: db_x509name#2 msgid "Complete distinguished name" msgstr "" #: db_x509name#3 msgid "Subject hash" msgstr "" #: db_x509name#4 msgid "Hash to lookup certs in directories" msgstr "" #: db_x509req#1 msgctxt "db_x509req#1" msgid "Signed" msgstr "" #: db_x509req#2 msgid "whether the request is already signed or not" msgstr "" #: db_x509req#3 msgid "Unstructured name" msgstr "" #: db_x509req#4 msgid "Challenge password" msgstr "" #: db_x509req#5 msgid "" "The certificate signing request already exists in the database as\n" "'%1'\n" "and thus was not stored" msgstr "" #: db_x509req#6 msgid "Certificate request ( *.pem *.der *.crl )" msgstr "" #: db_x509req#7 msgid "Certificate request export" msgstr "" #: db_x509req#8 msgid "New Request" msgstr "" #: db_x509req#9 msgctxt "db_x509req#9" msgid "Import" msgstr "" #: db_x509req#10 msgctxt "db_x509req#10" msgid "Extract public Key" msgstr "" #: db_x509req#11 msgctxt "db_x509req#11" msgid "Rename" msgstr "" #: db_x509req#12 msgctxt "db_x509req#12" msgid "Show Details" msgstr "" #: db_x509req#13 msgctxt "db_x509req#13" msgid "Sign" msgstr "" #: db_x509req#14 msgctxt "db_x509req#14" msgid "Export" msgstr "" #: db_x509req#15 msgctxt "db_x509req#15" msgid "Clipboard" msgstr "" #: db_x509req#16 msgctxt "db_x509req#16" msgid "File" msgstr "" #: db_x509req#17 msgctxt "db_x509req#17" msgid "Template" msgstr "" #: db_x509req#18 msgctxt "db_x509req#18" msgid "OpenSSL config" msgstr "" #: db_x509req#19 msgctxt "db_x509req#19" msgid "Delete" msgstr "" #: db_x509super#1 msgid "Key name" msgstr "" #: db_x509super#2 msgid "Internal name of the key" msgstr "" #: db_x509super#3 msgid "Save as OpenSSL config" msgstr "" #: db_x509super#4 msgid "Config files ( *.conf *.cnf);; All files ( * )" msgstr "" #: db_x509super#5 msgid "The following extensions were not ported into the template" msgstr "" #: kvView#1 msgctxt "kvView#1" msgid "Type" msgstr "" #: kvView#2 msgid "Content" msgstr "" #: pass_info#1 msgctxt "pass_info#1" msgid "Password" msgstr "" #: pass_info#2 msgctxt "pass_info#2" msgid "PIN" msgstr "" #: pki_base#1 msgctxt "pki_base#1" msgid "Error opening file: '%1': %2" msgstr "" #: pki_base#2 msgid "Error writing to file: '%1': %2" msgstr "" #: pki_base#3 msgid "Error: " msgstr "" #: pki_base#4 msgid "Internal error: Unexpected message: %1 %2" msgstr "" #: pki_crl#1 msgid "Successfully imported the revokation list '%1'" msgstr "" #: pki_crl#2 msgid "Delete the revokation list '%1'?" msgstr "" #: pki_crl#3 msgid "Successfully created the revokation list '%1'" msgstr "" #: pki_crl#4 msgid "Delete the %1 revokation lists: %2?" msgstr "" #: pki_crl#5 msgid "" "Unable to load the revokation list in file %1. Tried PEM and DER formatted " "CRL." msgstr "" #: pki_crl#6 msgid "No issuer given" msgstr "" #: pki_crl#7 msgctxt "pki_crl#7" msgid "Wrong Size %1" msgstr "" #: pki_crl#8 msgid "unknown" msgstr "" #: pki_evp#1 msgid "Failed to decrypt the key (bad password) " msgstr "" #: pki_evp#2 msgid "Please enter the password to decrypt the private key." msgstr "" #: pki_evp#3 msgid "" "Please enter the password to decrypt the private key from file:\n" "%1" msgstr "" #: pki_evp#4 msgid "" "Unable to load the private key in file %1. Tried PEM and DER private, public " "and PKCS#8 key types." msgstr "" #: pki_evp#5 msgid "Please enter the password to decrypt the private key: '%1'" msgstr "" #: pki_evp#6 msgid "Password input aborted" msgstr "" #: pki_evp#7 msgid "Please enter the database password for decrypting the key '%1'" msgstr "" #: pki_evp#8 msgid "Please enter the password to protect the private key: '%1'" msgstr "" #: pki_evp#9 msgid "Please enter the database password for encrypting the key" msgstr "" #: pki_evp#10 msgid "Please enter the password protecting the PKCS#8 key '%1'" msgstr "" #: pki_evp#11 msgid "Please enter the export password for the private key '%1'" msgstr "" #: pki_key#1 msgid "Successfully imported the %1 public key '%2'" msgstr "" #: pki_key#2 msgid "Delete the %1 public key '%2'?" msgstr "" #: pki_key#3 msgid "Successfully imported the %1 private key '%2'" msgstr "" #: pki_key#4 msgid "Delete the %1 private key '%2'?" msgstr "" #: pki_key#5 msgid "Successfully created the %1 private key '%2'" msgstr "" #: pki_key#6 msgctxt "pki_key#6" msgid "Delete the %1 keys: %2?" msgstr "" #: pki_key#7 msgid "public key" msgstr "" #: pki_key#8 msgid "Common" msgstr "" #: pki_key#9 msgid "Private" msgstr "" #: pki_key#10 msgid "Bogus" msgstr "" #: pki_key#11 msgctxt "pki_key#11" msgid "PIN" msgstr "" #: pki_key#12 msgid "No password" msgstr "" #: pki_multi#1 msgid "Seek failed" msgstr "" #: pki_pkcs12#1 msgid "" "Please enter the password to decrypt the PKCS#12 file:\n" "%1" msgstr "" #: pki_pkcs12#2 msgid "Unable to load the PKCS#12 (pfx) file %1." msgstr "" #: pki_pkcs12#3 msgid "The supplied password was wrong (%1)" msgstr "" #: pki_pkcs12#4 msgid "Please enter the password to encrypt the PKCS#12 file" msgstr "" #: pki_pkcs12#5 msgid "No key or no Cert and no pkcs12" msgstr "" #: pki_pkcs7#1 msgid "Unable to load the PKCS#7 file %1. Tried PEM and DER format." msgstr "" #: pki_scard#1 msgid "Successfully imported the token key '%1'" msgstr "" #: pki_scard#2 msgid "Delete the token key '%1'?" msgstr "" #: pki_scard#3 msgid "Successfully created the token key '%1'" msgstr "" #: pki_scard#4 msgctxt "pki_scard#4" msgid "Delete the %1 keys: %2?" msgstr "" #: pki_scard#5 msgid "Delete the private key '%1' from the token '%2 (#%3)' ?" msgstr "" #: pki_scard#6 msgid "only RSA keys can be stored on tokens" msgstr "" #: pki_scard#7 msgid "This Key is already on the token" msgstr "" #: pki_scard#8 msgid "PIN input aborted" msgstr "" #: pki_scard#9 msgid "Unable to find copied key on the token" msgstr "" #: pki_scard#10 msgid "Please insert card: %1 %2 [%3] with Serial: %4" msgstr "" #: pki_scard#11 msgid "Public Key missmatch. Please re-import card" msgstr "" #: pki_scard#12 msgid "Unable to find generated key on card" msgstr "" #: pki_scard#13 msgctxt "pki_scard#13" msgid "Wrong Size %1" msgstr "" #: pki_scard#14 msgid "Token %1" msgstr "" #: pki_scard#15 msgid "Failed to find the key on the token" msgstr "" #: pki_scard#16 msgid "Invalid Pin for the token" msgstr "" #: pki_temp#1 msgid "Successfully imported the XCA template '%1'" msgstr "" #: pki_temp#2 msgid "Delete the XCA template '%1'?" msgstr "" #: pki_temp#3 msgid "Successfully created the XCA template '%1'" msgstr "" #: pki_temp#4 msgid "Delete the %1 XCA templates: %2?" msgstr "" #: pki_temp#5 msgctxt "pki_temp#5" msgid "Wrong Size %1" msgstr "" #: pki_temp#6 msgid "Template file content error (too small): %1" msgstr "" #: pki_temp#7 msgid "Template file content error (bad size): %1 " msgstr "" #: pki_temp#8 msgid "Template file content error (bad length) :%1" msgstr "" #: pki_x509#1 msgid "Successfully imported the certificate '%1'" msgstr "" #: pki_x509#2 msgid "Delete the certificate '%1'?" msgstr "" #: pki_x509#3 msgid "Successfully created the certificate '%1'" msgstr "" #: pki_x509#4 msgid "Delete the %1 certificates: %2?" msgstr "" #: pki_x509#5 msgid "" "Unable to load the certificate in file %1. Tried PEM and DER certificate." msgstr "" #: pki_x509#6 msgid "This certificate is already on the security token" msgstr "" #: pki_x509#7 msgid "Delete the certificate '%1' from the token '%2 (#%3)'?" msgstr "" #: pki_x509#8 msgid "There is no key for signing !" msgstr "" #: pki_x509#9 msgctxt "pki_x509#9" msgid "Wrong Size %1" msgstr "" #: pki_x509#10 msgctxt "pki_x509#10" msgid "Not trusted" msgstr "" #: pki_x509#11 msgid "Trust inherited" msgstr "" #: pki_x509#12 msgid "Always Trusted" msgstr "" #: pki_x509#13 msgid "CRL expires: %1" msgstr "" #: pki_x509#14 msgid "No" msgstr "" #: pki_x509#15 msgid "Yes" msgstr "" #: pki_x509req#1 msgid "Signing key not valid (public key)" msgstr "" #: pki_x509req#2 msgid "Successfully imported the %1 certificate request '%2'" msgstr "" #: pki_x509req#3 msgid "Delete the %1 certificate request '%2'?" msgstr "" #: pki_x509req#4 msgid "Successfully created the %1 certificate request '%2'" msgstr "" #: pki_x509req#5 msgid "Delete the %1 certificate requests: %2?" msgstr "" #: pki_x509req#6 msgid "" "Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC " "format." msgstr "" #: pki_x509req#7 msgctxt "pki_x509req#7" msgid "Signed" msgstr "" #: pki_x509req#8 msgid "Unhandled" msgstr "" #: pki_x509req#9 msgctxt "pki_x509req#9" msgid "Wrong Size %1" msgstr "" #: v3ext#1 msgctxt "v3ext#1" msgid "Add" msgstr "" #: v3ext#2 msgctxt "v3ext#2" msgid "Delete" msgstr "" #: v3ext#3 msgctxt "v3ext#3" msgid "Apply" msgstr "" #: v3ext#4 msgctxt "v3ext#4" msgid "Validate" msgstr "" #: v3ext#5 msgctxt "v3ext#5" msgid "Cancel" msgstr "" #: v3ext#6 msgid "An email address or 'copy'" msgstr "" #: v3ext#7 msgid "An email address" msgstr "" #: v3ext#8 msgid "a registered ID: OBJECT IDENTIFIER" msgstr "" #: v3ext#9 msgid "a uniform resource indicator" msgstr "" #: v3ext#10 msgid "a DNS domain name" msgstr "" #: v3ext#11 msgid "an IP address" msgstr "" #: v3ext#12 msgid "Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'" msgstr "" #: v3ext#13 msgid "No editing. Only 'copy' allowed here" msgstr "" #: v3ext#14 msgid "" "Validation failed:\n" "'%1'\n" "%2" msgstr "" #: v3ext#15 msgid "" "Validation successful:\n" "'%1'" msgstr "" #: void#1 msgctxt "void#1" msgid "There was no key found for the Certificate: " msgstr "" #: void#2 msgctxt "void#2" msgid "Import Certificate signing request" msgstr "" �����������������������������������xca_0.9.3/lang/xca_de.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000411145�11753427512�0015111�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0" language="de_DE"> <context> <name>About</name> <message> <location filename="../ui/About.ui" line="+89"/> <source>Done</source> <translation>Schliessen</translation> </message> </context> <context> <name>CaProperties</name> <message> <location filename="../ui/CaProperties.ui" line="+122"/> <source>Next serial for signing</source> <translation>Nächste Seriennummer beim signieren</translation> </message> <message> <location line="-20"/> <source>Days until next CRL issuing</source> <translation>Tage bis zur nächsten CRL</translation> </message> <message> <location line="+10"/> <source>Default template</source> <translation>Standard Template</translation> </message> <message> <location line="-82"/> <source>CA Properties</source> <translation>CA Einstellungen</translation> </message> <message> <location line="+65"/> <source>Use random Serial numbers</source> <translation>Verwende zufällige Seriennummern</translation> </message> </context> <context> <name>CertDetail</name> <message> <location filename="../widgets/CertDetail.cpp" line="+37"/> <source>Show extensions</source> <translation>Erweiterungen anzeigen</translation> </message> <message> <location line="+19"/> <source>Not available</source> <translation>Nicht verfügbar</translation> </message> <message> <location line="+25"/> <source>Details of the certificate</source> <translation>Details des Zertifikates</translation> </message> <message> <location line="+9"/> <source>Signer unknown</source> <translation>Unterzeichner unbekannt</translation> </message> <message> <location line="+4"/> <source>Self signed</source> <translation>Selbstsigniert</translation> </message> <message> <location line="+11"/> <source>Not trusted</source> <translation>Nicht vertrauenswürdig</translation> </message> <message> <location line="+4"/> <source>Trusted</source> <translation>Vertrauenswürdig</translation> </message> <message> <location line="+19"/> <source>Revoked: </source> <translation>Zurückgezogen:</translation> </message> <message> <location line="+5"/> <source>Not valid</source> <translation>Nicht gültig</translation> </message> <message> <location line="+4"/> <source>Valid</source> <translation>Gültig</translation> </message> <message> <location line="+15"/> <source>Details of the certificate signing request</source> <translation>Details des Zertifikatsantrags</translation> </message> <message> <location filename="../ui/CertDetail.ui" line="+39"/> <source>Details of the Certificate</source> <translation>Details des Zertifikates</translation> </message> <message> <location line="+48"/> <source>S&tatus</source> <translation>S&tatus</translation> </message> <message> <location line="+60"/> <source>Serial</source> <translation>Seriennummer</translation> </message> <message> <location line="+13"/> <source>The serial number of the certificate</source> <translation>Die Seriennummer des Zertifikats</translation> </message> <message> <location line="+9"/> <source>The internal name of the certificate in the database</source> <translation>Der interne Name des Zerifikats in der Datenbank</translation> </message> <message> <location line="+7"/> <source>Internal name</source> <translation>Interner Name</translation> </message> <message> <location line="+23"/> <source>Signature algorithm</source> <translation>Signatur algorithmus</translation> </message> <message> <location line="+7"/> <source>Signature</source> <translation>Unterschrift</translation> </message> <message> <location line="+7"/> <source>Key</source> <translation>Schlüssel</translation> </message> <message> <location line="+10"/> <source>Fingerprints</source> <translation>Fingerprints</translation> </message> <message> <location line="+12"/> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <location line="+7"/> <source>MD5</source> <translation>MD5</translation> </message> <message> <location line="+7"/> <source>A SHA-1 hashsum of the certificate</source> <translation>Eine SHA-1 Summe des Zertifikats</translation> </message> <message> <location line="+7"/> <source>An md5 hashsum of the certificate</source> <translation>Eine md5 Summe des Zertifikats</translation> </message> <message> <location line="+10"/> <source>Validity</source> <translation>Gültigkeit</translation> </message> <message> <location line="+12"/> <source>The time since the certificate is valid</source> <translation>Beginn der Zertifikatsgültigkeit</translation> </message> <message> <location line="+7"/> <source>The time until the certificate is valid</source> <translation>Ablaufdatum des Zertifikats</translation> </message> <message> <location line="+34"/> <source>&Subject</source> <translation>Inha&ber</translation> </message> <message> <location line="+16"/> <source>&Issuer</source> <translation>&Aussteller</translation> </message> <message> <location line="+16"/> <source>Attributes</source> <translation>Attribute</translation> </message> <message> <location line="+10"/> <source>&Extensions</source> <translation>&Erweiterungen</translation> </message> <message> <location line="+13"/> <location filename="../widgets/CertDetail.cpp" line="-119"/> <source>Show config</source> <translation>Konfiguration anzeigen</translation> </message> </context> <context> <name>CertExtend</name> <message> <location filename="../ui/CertExtend.ui" line="+74"/> <source>This will create a new certificate as a copy of the old one with a new serial number and adjusted validity values.</source> <translation>Hiermit wird ein neues Zertifikat als Kopie des alten Zertifikats erstellt, mit neuer Seriennummer und aktueller Gültigkeit.</translation> </message> <message> <location line="+34"/> <source>Validity</source> <translation>Gültigkeit</translation> </message> <message> <location line="+20"/> <source>Not before</source> <translation>Nicht vor dem</translation> </message> <message> <location line="+7"/> <source>Not after</source> <translation>Nicht nach dem</translation> </message> <message> <location line="+26"/> <source>Time range</source> <translation>Zeitspanne</translation> </message> <message> <location line="+10"/> <source>Days</source> <translation>Tage</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Monate</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Jahre</translation> </message> <message> <location line="+15"/> <source>Midnight</source> <translation>Mitternacht</translation> </message> <message> <location line="-7"/> <source>Apply</source> <translation>Übernehmen</translation> </message> <message> <location line="-159"/> <source>Certificate renewal</source> <translation>Zertifikatsverlängerung</translation> </message> <message> <location line="+173"/> <source>Local time</source> <translation>Ortszeit</translation> </message> <message> <location line="+7"/> <source>No well-defined expiration</source> <translation>Undefiniertes Ablaufdatum</translation> </message> <message> <location filename="../widgets/CertExtend.cpp" line="+43"/> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation>Das Zertifikat is früher gültig als der Aussteller. Dies ist wahrscheinlich ungewollt.</translation> </message> <message> <location line="+3"/> <location line="+23"/> <source>Edit times</source> <translation>Zeiten einstellen</translation> </message> <message> <location line="-22"/> <location line="+23"/> <source>Abort rollout</source> <translation>Ausstellung abbrechen</translation> </message> <message> <location line="-22"/> <location line="+23"/> <source>Continue rollout</source> <translation>Ausstellung fortführen</translation> </message> <message> <location line="-22"/> <location line="+23"/> <source>Adjust date and continue</source> <translation>Datum anpassen und fortführen</translation> </message> <message> <location line="-6"/> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation>Das Zertifikat ist länger gültig als der Aussteller. Dies ist wahrscheinlich nicht gewollt.</translation> </message> </context> <context> <name>CertView</name> <message> <location filename="../lib/db_x509.cpp" line="+915"/> <source>There was no key found for the Certificate: </source> <translation>Es wurde kein Schlüssel gefunden für das Zertifikat: </translation> </message> <message> <location line="+8"/> <source>Import Certificate signing request</source> <translation>Zertifikatsantrag importieren</translation> </message> </context> <context> <name>ClickLabel</name> <message> <location filename="../widgets/clicklabel.cpp" line="+23"/> <source>Double click for details</source> <translation>Doppelklick für Details</translation> </message> </context> <context> <name>CrlDetail</name> <message> <location filename="../ui/CrlDetail.ui" line="+180"/> <location filename="../widgets/CrlDetail.cpp" line="+29"/> <source>Name</source> <translation>Name</translation> </message> <message> <location filename="../widgets/CrlDetail.cpp" line="+0"/> <source>Serial</source> <translation>Seriennummer</translation> </message> <message> <location line="+0"/> <source>Revocation</source> <translation>Rücknahme</translation> </message> <message> <location line="+0"/> <source>Reason</source> <translation>Grund</translation> </message> <message> <location line="+1"/> <source>Invalidation</source> <translation>Ungültig seit</translation> </message> <message> <location line="+25"/> <source>Failed</source> <translation>Fehlgeschlagen</translation> </message> <message> <location line="+9"/> <source>Verification not possible</source> <translation>Überprüfung nicht möglich</translation> </message> <message> <location line="-3"/> <source>Unknown signer</source> <translation>Unterzeichner unbekannt</translation> </message> <message> <location line="+27"/> <source>Unknown certificate</source> <translation>Unbekanntes Zertifikat</translation> </message> <message> <location filename="../ui/CrlDetail.ui" line="-141"/> <source>Details of the Revocation list</source> <translation>Details der Rücknahmeliste</translation> </message> <message> <location line="+48"/> <source>&Status</source> <translation>&Status</translation> </message> <message> <location line="+60"/> <source>Version</source> <translation>Version</translation> </message> <message> <location line="+19"/> <source>Signature</source> <translation>Unterschrift</translation> </message> <message> <location line="+7"/> <source>Signed by</source> <translation>Unterschrieben von</translation> </message> <message> <location line="+14"/> <source>The internal name of the CRL in the database</source> <translation>Der interne Name der CRL in der Datenbank</translation> </message> <message> <location line="+13"/> <source>issuing dates</source> <translation>Ausstellungszeiten</translation> </message> <message> <location line="+12"/> <source>Next Update</source> <translation>Nächstes Update</translation> </message> <message> <location line="+7"/> <source>Last Update</source> <translation>Letztes Update</translation> </message> <message> <location line="+33"/> <source>&Issuer</source> <translation>&Aussteller</translation> </message> <message> <location line="+16"/> <source>&Extensions</source> <translation>&Erweiterungen</translation> </message> <message> <location line="+23"/> <source>&Revocation list</source> <translation>&Rücknahmeliste</translation> </message> <message> <location line="+25"/> <source>0</source> <translation>0</translation> </message> </context> <context> <name>ExportCert</name> <message> <location filename="../widgets/ExportDialog.h" line="+78"/> <source>X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )</source> <translation>X509 Zertifikate ( *.cer *.crt *.p12 *.p7b);;Alle Dateien ( * )</translation> </message> <message> <location line="+1"/> <source>DER is a binary format of the Certificate PEM is a base64 encoded Certificate PKCS#7 is an official Certificate exchange format PKCS#12 is an encrypted official Key-Certificate exchange format </source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Please enter the filename for the certificate.</source> <translation>Bitte geben sie den Dateinamen des Zertifikats ein.</translation> </message> <message> <location line="+2"/> <source>Certifikate export</source> <translation>Zertifikatsexport</translation> </message> </context> <context> <name>ExportDer</name> <message> <location line="-45"/> <source>All files ( * )</source> <translation>Alle Dateien ( * )</translation> </message> <message> <location line="+1"/> <source>DER is a binary format PEM is a base64 encoded DER file </source> <translation type="unfinished"></translation> </message> </context> <context> <name>ExportDialog</name> <message> <location filename="../ui/ExportDialog.ui" line="+117"/> <source>...</source> <translation>...</translation> </message> <message> <location line="+13"/> <source>Filename</source> <translation>Dateiname</translation> </message> <message> <location line="+16"/> <source>Please enter the filename</source> <translation>Bitte den Dateinamen eingeben</translation> </message> <message> <location line="+49"/> <source>Export Format</source> <translation>Exportformat</translation> </message> <message> <location filename="../widgets/ExportDialog.cpp" line="+61"/> <source>The file: '%1' already exists!</source> <translation>Die Datei '%1' existiert bereits!</translation> </message> <message> <location line="+2"/> <source>Overwrite</source> <translation>Überschreiben</translation> </message> <message> <location line="+2"/> <source>Do not overwrite</source> <translation>Nicht überschreiben</translation> </message> </context> <context> <name>ExportKey</name> <message> <location filename="../widgets/ExportKey.cpp" line="+37"/> <source>Public key export</source> <translation>Export des öffentlichen Schlüssels</translation> </message> <message> <location line="+3"/> <source>Key export</source> <translation>Schlüssel export</translation> </message> <message> <location line="-8"/> <source>Please enter the filename for the key.</source> <translation>Bitte geben Sie den Dateinamen für den Schlüssel ein.</translation> </message> <message> <location line="-5"/> <source>DER is a binary format of the key without encryption PEM is a base64 encoded key with optional encryption PKCS#8 is an encrypted official Key-exchange format</source> <translation>DER ist ein binärformat ohne Passwort sicherung PEM ist ein base64 codierter Schlüssel mit optionaler Passwort sicherung PKCS#8 ist ein offizielles Austauschformat für Passwort gesicherte Schlüssel</translation> </message> <message> <location filename="../ui/ExportKey.ui" line="+23"/> <source>When exporting the private key it should be encrypted.</source> <translation>Der Private Schlüssel sollte beim Export durch ein Passwort geschützt werden.</translation> </message> <message> <location line="+7"/> <source>When exporting the private part, it should be encrypted.</source> <translation>Wenn der private Teil mit exportiert wird, sollte er verschlüsselt werden.</translation> </message> <message> <location line="+3"/> <source>E&xport the private part of the Key too</source> <translation>Den privaten Teil des Schlüssels mit e&xportieren</translation> </message> <message> <location line="+7"/> <source>Export as PKCS#8</source> <translation>Exportieren als PKCS#8</translation> </message> <message> <location line="+10"/> <source>&Encrypt the Key with a password</source> <translation>D&en Schlüssel mit einem Passwort sichern</translation> </message> <message> <location filename="../widgets/ExportKey.cpp" line="-2"/> <source>Private keys ( *.pem *.der *.pk8 );;All files ( * )</source> <translation>Private Schlüssel ( *.pem *.der *.pk8 );;Alle Dateien ( * )</translation> </message> </context> <context> <name>Help</name> <message> <location filename="../ui/Help.ui" line="+36"/> <source><<</source> <translation><<</translation> </message> <message> <location line="+10"/> <source>>></source> <translation>>></translation> </message> <message> <location line="+26"/> <source>&Done</source> <translation>&Fertig</translation> </message> </context> <context> <name>ImportMulti</name> <message> <location filename="../ui/ImportMulti.ui" line="+122"/> <source>Details</source> <translation>Details</translation> </message> <message> <location line="-28"/> <source>Import &All</source> <translation>&Alle importieren</translation> </message> <message> <location line="+7"/> <source>&Import</source> <translation>&Import</translation> </message> <message> <location line="+7"/> <source>&Done</source> <translation>&Fertig</translation> </message> <message> <location filename="../widgets/ImportMulti.cpp" line="+105"/> <location line="+145"/> <source>The type of the Item '%1' is not recognized</source> <translation>Unbekannter Typ bei '%1'</translation> </message> <message> <location line="+49"/> <source>Details of the item '%1' cannot be shown</source> <translation>Details von '%1' können nicht angezeigt werden</translation> </message> <message> <location line="+4"/> <source>The type of the item '%1' is not recognized</source> <translation>Unbekannter Typ bei '%1'</translation> </message> <message> <location line="+31"/> <source>The file '%1' did not contain PKI data</source> <translation>Die Datei '%1' enthielt keine verwendbaren Daten</translation> </message> <message> <location line="+4"/> <source>The %1 files: '%2' did not contain PKI data</source> <translation>Die %1 Dateien: '%2' enthielten keine verwendbaren Daten</translation> </message> <message> <location filename="../ui/ImportMulti.ui" line="-72"/> <source>Import PKI Items</source> <translation>Importieren</translation> </message> <message> <location line="+79"/> <source>&Remove from list</source> <translation>&Aus Liste entfernen</translation> </message> <message> <location line="+14"/> <source>Delete from token</source> <translation>Von der Chipkarte löschen</translation> </message> <message> <location line="+7"/> <source>Rename on token</source> <translation>Auf der Chipkarte umbenennen</translation> </message> <message> <location filename="../widgets/ImportMulti.cpp" line="-278"/> <source> Name: %1 Model: %2 Serial: %3</source> <translation> Name: %1 Modell: %2 Seriennummer: %3</translation> </message> <message> <location line="+5"/> <source>Manage security token</source> <translation>Chipkarte verwalten</translation> </message> </context> <context> <name>KeyDetail</name> <message> <location filename="../widgets/KeyDetail.cpp" line="+50"/> <source>Not available</source> <translation>Nicht verfügbar</translation> </message> <message> <location line="+12"/> <source>Available</source> <translation>Verfügbar</translation> </message> <message> <location filename="../ui/KeyDetail.ui" line="+91"/> <source>Name</source> <translation>Name</translation> </message> <message> <location line="+7"/> <source>The internal name of the key used by xca</source> <translation>Der interne Name in der Datenbank</translation> </message> <message> <location line="+83"/> <source>Keysize</source> <translation>Schlüssellänge</translation> </message> <message> <location line="+27"/> <source>Private Exponent</source> <translation>Privater Exponent</translation> </message> <message> <location line="-53"/> <source>Public Exponent</source> <translation>Öffentlicher Exponent</translation> </message> <message> <location line="+78"/> <source>Modulus</source> <translation>Modulus</translation> </message> <message> <location filename="../widgets/KeyDetail.cpp" line="+9"/> <source>Sub prime</source> <translation>Sub prime</translation> </message> <message> <location line="+1"/> <location line="+9"/> <source>Public key</source> <translation>Öffentlicher Schlüssel</translation> </message> <message> <location line="-8"/> <location line="+9"/> <source>Private key</source> <translation>Privater Schlüssel</translation> </message> <message> <location filename="../ui/KeyDetail.ui" line="-123"/> <source>Security token</source> <translation>Chipkarte</translation> </message> <message> <location line="+6"/> <source>Manufacturer</source> <translation>Hersteller</translation> </message> <message> <location line="+14"/> <source>Serial</source> <translation>Seriennummer</translation> </message> <message> <location line="+17"/> <location filename="../widgets/KeyDetail.cpp" line="-22"/> <source>Key</source> <translation>Schlüssel</translation> </message> <message> <location filename="../widgets/KeyDetail.cpp" line="-5"/> <source>Token</source> <translation>Chipkarte</translation> </message> <message> <location line="+28"/> <source>Curve name</source> <translation>Kurvenname</translation> </message> <message> <location line="-36"/> <source>Details of the %1 key</source> <translation>Details des %1 Schlüssels</translation> </message> <message> <location line="+12"/> <source>Security token ID:%1</source> <translation>Chipkarte ID:%1</translation> </message> <message> <location line="+31"/> <source>Unknown key</source> <translation>Unbekannter Schlüssel</translation> </message> </context> <context> <name>MainWindow</name> <message> <location filename="../widgets/MainWindow.cpp" line="+752"/> <source>Password</source> <translation>Passwort</translation> </message> <message> <location line="-1"/> <source>Password verify error, please try again</source> <translation>Die Passwort überprüfung ist fehlgeschlagen</translation> </message> <message> <location line="-128"/> <location line="+102"/> <source>New Password</source> <translation>Neues Passwort</translation> </message> <message> <location line="+62"/> <source>The following error occured:</source> <translation>Der folgende Fehler ist aufgetreten:</translation> </message> <message> <location line="+3"/> <source>Copy to Clipboard</source> <translation>In die Zwischenablage</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="+38"/> <source>&Close DataBase</source> <translation>Datenbank s&chliessen</translation> </message> <message> <location line="+48"/> <source>&Content</source> <translation>&Inhalt</translation> </message> <message> <location line="+2"/> <source>&About</source> <translation>Ü&ber</translation> </message> <message> <location line="-59"/> <source>&File</source> <translation>D&atei</translation> </message> <message> <location line="+56"/> <source>&Help</source> <translation>&Hilfe</translation> </message> <message> <location filename="../ui/MainWindow.ui" line="+28"/> <source>Private Keys</source> <translation>Private Schlüssel</translation> </message> <message> <location line="+30"/> <source>&New Key</source> <translation>&Neuer Schlüssel</translation> </message> <message> <location line="+7"/> <location line="+111"/> <location line="+98"/> <location line="+144"/> <location line="+70"/> <source>&Export</source> <translation>&Export</translation> </message> <message> <location line="-416"/> <location line="+111"/> <location line="+98"/> <location line="+130"/> <location line="+84"/> <source>&Import</source> <translation>&Import</translation> </message> <message> <location line="-416"/> <source>Import PFX (PKCS#12)</source> <translation>Import PFX (PKCS#12)</translation> </message> <message> <location line="+7"/> <location line="+104"/> <location line="+98"/> <location line="+214"/> <source>&Show Details</source> <translation>Detail&s anzeigen</translation> </message> <message> <location line="-409"/> <location line="+104"/> <location line="+98"/> <location line="+109"/> <location line="+105"/> <source>&Delete</source> <translation>&Löschen</translation> </message> <message> <location line="-376"/> <source>Certificate signing requests</source> <translation>Zertifikatsanträge</translation> </message> <message> <location line="+36"/> <source>&New Request</source> <translation>&Neuer Zertifikatsantrag</translation> </message> <message> <location line="+68"/> <location filename="../widgets/MW_menu.cpp" line="-27"/> <source>Certificates</source> <translation>Zertifikate</translation> </message> <message> <location line="+30"/> <source>&New Certificate</source> <translation>&Neues Zertifikat</translation> </message> <message> <location line="+35"/> <source>Import &PKCS#12</source> <translation>Import &PKCS#12</translation> </message> <message> <location line="+7"/> <source>Import P&KCS#7</source> <translation>Import P&KCS#7</translation> </message> <message> <location line="+7"/> <source>Plain View</source> <translation>Einfache Ansicht</translation> </message> <message> <location line="+40"/> <source>Templates</source> <translation>Vorlagen</translation> </message> <message> <location line="+34"/> <source>&New template</source> <translation>&Neue Vorlage</translation> </message> <message> <location line="+7"/> <source>Ch&ange Template</source> <translation>Vorl&age Ändern</translation> </message> <message> <location line="+61"/> <source>Revocation lists</source> <translation>Rücknahmelisten</translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="+177"/> <source>Database</source> <translation>Datenbank</translation> </message> <message> <location line="+70"/> <source>No deleted items found</source> <translation>Keine gelöschten Einträge gefunden</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-18"/> <source>&Dump DataBase</source> <translation>&Datenbank ausgeben</translation> </message> <message> <location line="+4"/> <source>&Import old db_dump</source> <translation>Alten db_dump &Importieren</translation> </message> <message> <location line="+2"/> <source>&Undelete items</source> <translation>&Gelöschte Einträge wiederherstellen</translation> </message> <message> <location line="+3"/> <source>Options</source> <translation>Optionen</translation> </message> <message> <location line="+5"/> <source>Keys</source> <translation>Schlüssel</translation> </message> <message> <location line="+2"/> <source>Requests</source> <translation>Zertifikatsanträge</translation> </message> <message> <location line="+4"/> <source>PKCS#12</source> <translation>PKCS#12</translation> </message> <message> <location line="+2"/> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <location line="+2"/> <source>Template</source> <translation>Vorlage</translation> </message> <message> <location line="+2"/> <source>Revocation list</source> <translation>Rücknahmeliste</translation> </message> <message> <location line="+2"/> <source>PEM file</source> <translation>PEM Datei</translation> </message> <message> <location line="+21"/> <source>Donations</source> <translation>Spenden</translation> </message> <message> <location line="+51"/> <source>Import password</source> <translation>Import Passwort</translation> </message> <message> <location line="+1"/> <source>Please enter the password of the old database</source> <translation>Bitte das Passwort der alten Datenbank eingeben</translation> </message> <message> <location line="+7"/> <source>Password verification error. Ignore keys ?</source> <translation>Falsches Passwort. Schlüssel ignorieren ?</translation> </message> <message> <location line="+1"/> <source>Import anyway</source> <translation>Trotzdem importieren</translation> </message> <message> <location line="+0"/> <source>Cancel</source> <translation>Abbrechen</translation> </message> <message> <location line="-96"/> <source>I&mport</source> <translation>I&mport</translation> </message> <message> <location line="+17"/> <source>paste PEM file</source> <translation>PEM datei (copy+paste)</translation> </message> <message> <location line="+65"/> <source>Database dump ( *.dump );;All files ( * )</source> <translation>Database dump ( *.dump );;All files ( * )</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-369"/> <source>Import PEM data</source> <translation>PEM daten importieren</translation> </message> <message> <location line="+43"/> <source>The new label of the token '%1'</source> <translation>Die neue Bezeichnung der Chipkarte '%1'</translation> </message> <message> <location line="+159"/> <source>Please enter the new password to encrypt your private keys in the database-file</source> <translation>Bitte das neue Passwort zur Verschlüsselung der privaten Schlüssel in der Datenbank eingeben</translation> </message> <message> <location line="+102"/> <source>Please enter a password, that will be used to encrypt your private keys in the database file: %1</source> <translation>Bitte geben Sie ein Passwort an um die privaten Schlüssel in der Datenbank %1 zu verschlüsseln</translation> </message> <message> <location line="+28"/> <source>Please enter the password for unlocking the database: %1</source> <translation>Bitte geben Sie das Passwort ein um die Datenbank %1 zu öffnen</translation> </message> <message> <location line="+109"/> <source>Diffie-Hellman parameters are needed for different applications, but not handled by XCA. Please enter the DH parameter bits</source> <translation>Diffie-Hellman Parameter werden von anderen Applikationen benötigt. XCA verwendet oder speichert sie aber nicht. Bitte die DH Parameter bits angeben</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-105"/> <source>&New DataBase</source> <translation>&Neue Datenbank</translation> </message> <message> <location line="+2"/> <source>&Open DataBase</source> <translation>Datenbank &Öffnen</translation> </message> <message> <location line="+44"/> <source>&Init Security token</source> <translation>Chipkarte &initialisieren</translation> </message> <message> <location line="-34"/> <source>C&hange DataBase password</source> <translation>Da&tenbankpasswort ändern</translation> </message> <message> <location line="+9"/> <source>Exit</source> <translation>Beenden</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-527"/> <source>no such option: %1</source> <translation>unbekannte option: %1</translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="-72"/> <source>Using or exporting private keys will not be possible without providing the correct password</source> <translation>Die Benutzung oder der Export privater Schlüssel ist nur mit dem richtigen Datenbankpasswort möglich</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="+116"/> <source>Please enter the original SO PIN (PUK) of the token '%1'</source> <translation>Die alte SO PIN (PUK) für die Chipkarte '%1' eingeben</translation> </message> <message> <location line="+6"/> <source>Please enter the new SO PIN (PUK) of the token '%1'</source> <translation>Die neue SO PIN (PUK) für die Chipkarte '%1' eingeben</translation> </message> <message> <location line="+116"/> <source>The token '%1' did not contain any keys or certificates</source> <translation>Die Chipkarte '%1' enthält keine Schlüssel oder Zertifikate</translation> </message> <message> <location line="+312"/> <source>Error opening file: '%1': %2</source> <translation>Öffnen der Datei '%1' fehlgeschlagen: %2</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-17"/> <source>Generate DH parameter</source> <translation>DH Parameter erstellen</translation> </message> <message> <location line="+2"/> <source>Set as default DataBase</source> <translation>Als Standard datenbank</translation> </message> <message> <location line="+37"/> <source>&Token</source> <translation>&Chipkarte</translation> </message> <message> <location line="+1"/> <source>&Manage Security token</source> <translation>Chipkarte &verwalten</translation> </message> <message> <location line="+4"/> <source>&Change PIN</source> <translation>&PIN ändern</translation> </message> <message> <location line="+2"/> <source>Change &SO PIN</source> <translation>&SO PIN ändern</translation> </message> <message> <location line="+2"/> <source>Init PIN</source> <translation>PIN initialisieren</translation> </message> </context> <context> <name>NewCrl</name> <message> <location filename="../ui/NewCrl.ui" line="+36"/> <source>Create CRL</source> <translation>CRL erstellen</translation> </message> <message> <location line="+54"/> <source>Dates</source> <translation>Zeiten</translation> </message> <message> <location line="+22"/> <source>next update</source> <translation>Nächstes Update</translation> </message> <message> <location line="-14"/> <source>last update</source> <translation>Letztes Update</translation> </message> <message> <location line="+43"/> <source>Days</source> <translation>Tage</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Monate</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Jahre</translation> </message> <message> <location line="+8"/> <source>Midnight</source> <translation>Mitternacht</translation> </message> <message> <location line="+7"/> <source>Local time</source> <translation>Ortszeit</translation> </message> <message> <location line="+7"/> <source>Apply</source> <translation>Übernehmen</translation> </message> <message> <location line="+12"/> <source>Hashing algorithm</source> <translation>Hash algorithmus</translation> </message> <message> <location line="+12"/> <source>Extensions</source> <translation>Erweiterungen</translation> </message> <message> <location line="+6"/> <source>Authority key identifier</source> <translation>Authority key identifier</translation> </message> <message> <location line="+7"/> <source>Subject alternative name</source> <translation>Subject alternative name</translation> </message> <message> <location line="+7"/> <source>CRL Number</source> <translation>CRL Nummer</translation> </message> <message> <location line="+10"/> <source>Revokation reasons</source> <translation>Rückzugsgrund</translation> </message> </context> <context> <name>NewKey</name> <message> <location filename="../ui/NewKey.ui" line="+14"/> <location line="+25"/> <source>New key</source> <translation>Neuer Schlüssel</translation> </message> <message> <location line="+47"/> <source>Please give a name to the new key and select the desired keysize</source> <translation>Bitte geben Sie dem Schlüssel einen Namen und wählen Sie die gewünschte Schlüssellänge</translation> </message> <message> <location line="+10"/> <source>Key properties</source> <translation>Schlüsseleigenschaften</translation> </message> <message> <location line="+6"/> <source>Name</source> <translation>Name</translation> </message> <message> <location line="+56"/> <source>Keysize</source> <translation>Schlüssellänge</translation> </message> <message> <location line="+13"/> <source>Usually 1024 or 2048 bit keys are used</source> <translation>Normalerweise werden 1024 oder 2048 bit Schlüssel verwendet</translation> </message> <message> <location line="-50"/> <source>The internal name of the new key</source> <translation>Interner Name des neuen Schlüssels</translation> </message> <message> <location line="+3"/> <source>New Key</source> <translation>Neuer Schlüssel</translation> </message> <message> <location line="+54"/> <source>Keytype</source> <translation>Schlüsseltyp</translation> </message> <message> <location line="-27"/> <source>Curve</source> <translation>Kurve</translation> </message> <message> <location filename="../widgets/NewKey.cpp" line="+142"/> <source>Create</source> <translation>Erstellen</translation> </message> </context> <context> <name>NewX509</name> <message> <location filename="../ui/NewX509.ui" line="+30"/> <location filename="../widgets/NewX509.cpp" line="+235"/> <source>Create</source> <translation>Erstellen</translation> </message> <message> <location line="+48"/> <source>Source</source> <translation>Herkunft</translation> </message> <message> <location line="+22"/> <source>Signing request</source> <translation>Zertifikatsantrag</translation> </message> <message> <location line="+21"/> <source>A certificate signing request can be signed, even if the private key of the request is not available. This is the intention of a CSR: Getting signed by a CA certificate, whoes certificate of course must be in the database Of course you need the private key of the CSR if you want to create a self-signed cert from it.</source> <translation>Ein CSR (Zertifikatsantrag) kann unterschrieben werden, auch wenn der private Schlüssel des Antrags nicht verfügbar ist. Dies ist die Aufgabe eines CSR.</translation> </message> <message> <location line="+9"/> <source>Show request</source> <translation>Request anzeigen</translation> </message> <message> <location line="+340"/> <source>Country code</source> <translation>Länder code</translation> </message> <message> <location line="+10"/> <source>State or Province</source> <translation>Bundesland, Kreis</translation> </message> <message> <location line="+13"/> <source>Locality</source> <translation>Ort</translation> </message> <message> <location line="-60"/> <source>Organisation</source> <translation>Firma</translation> </message> <message> <location line="+70"/> <source>Organisational unit</source> <translation>Firmenabteilung</translation> </message> <message> <location line="+39"/> <source>Common name</source> <translation>Üblicher Name</translation> </message> <message> <location line="-29"/> <source>E-Mail address</source> <translation>E-Mail Adresse</translation> </message> <message> <location line="-376"/> <source>Sign this Certificate signing &request</source> <translation>Diesen Zertifikatsant&rag unterschreiben</translation> </message> <message> <location line="+7"/> <source>Copy extensions from the request</source> <translation>Erweiterungen aus dem Zertifikatsantrag kopieren</translation> </message> <message> <location line="+51"/> <source>Signing</source> <translation>Unterschreiben</translation> </message> <message> <location line="+20"/> <source>Create a &self signed certificate with the serial</source> <translation>Erstelle ein &Selbst signiertes Zertifikat mit der Serien nummer</translation> </message> <message> <location line="+10"/> <source>If you leave this blank the serial 00 will be used</source> <translation>Wenn Sie dieses Feld frei lassen wird die Seriennummer 00 verwendet</translation> </message> <message> <location line="+3"/> <source>1</source> <translation>1</translation> </message> <message> <location line="+24"/> <source>All certificates in your database that can create valid signatures</source> <translation>Alle Zertifikate aus der Datenbank, die gültige Unterschriften leisten können</translation> </message> <message> <location line="+3"/> <source>This list contains all certificates with the CA-flag set to true and whoes private key is present in the key-database. If this list is disabled, you only can create a self-signed certificate.</source> <translation>Diese Liste enthält alle Zertifikate mit dem CA-flag gesetzt und dessen privater Schlüssel verfügbar ist. Wenn diese Liste ausgeschaltet ist, kann nur ein selbst unterschriebenes Zertifikat erstellt werden. </translation> </message> <message> <location line="+34"/> <source>Signature algorithm</source> <translation>Signatur algorithmus</translation> </message> <message> <location line="+28"/> <source>Template for the new certificate</source> <translation>Vorlage für das neue Zertifikat</translation> </message> <message> <location line="+12"/> <source>All available templates</source> <translation>Alle verfügbaren Vorlagen</translation> </message> <message> <location line="+3"/> <source>This list contains all templates from the toplevel template Tab</source> <translation>Diese Liste enthält alle Vorlagen</translation> </message> <message> <location line="+552"/> <source>Apply</source> <translation>Übernehmen</translation> </message> <message> <location line="-481"/> <location filename="../widgets/NewX509.cpp" line="+204"/> <source>Subject</source> <translation>Inhaber</translation> </message> <message> <location line="-158"/> <source>Use &this Certificate for signing</source> <translation>Verwende dieses Zertifika&t zum Unterschreiben</translation> </message> <message> <location line="+170"/> <source>Distinguished name</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>This name is only used internally and does not appear in the resulting certificate</source> <translation>Dieser Name wird nur intern verwendet und erscheint nicht im Zertifikat</translation> </message> <message> <location line="+10"/> <source>Must be exactly 2 letter of size (DE, UK)</source> <translation>Muss exakt 2 Zeichen lang sein (DE,UK)</translation> </message> <message> <location line="+76"/> <source>Internal name</source> <translation>Interner Name</translation> </message> <message> <location line="+46"/> <source>Add</source> <translation>Hinzufügen</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="+37"/> <source>Private key</source> <translation>Privater Schlüssel</translation> </message> <message> <location line="+18"/> <source>This list only contains unused keys</source> <translation>Diese Liste enthält nur unbenutzte Schlüssel</translation> </message> <message> <location line="+7"/> <source>Used keys too</source> <translation>auch verwendete Schlüssel</translation> </message> <message> <location line="+7"/> <source>&Generate a new key</source> <translation>&Erstelle einen neuen Schlüssel</translation> </message> <message> <location line="+11"/> <source>Extensions</source> <translation>Erweiterungen</translation> </message> <message> <location line="+8"/> <source>Basic constraints</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>Type</source> <translation>Typ</translation> </message> <message> <location line="+7"/> <source>If this will become a CA certificate or not</source> <translation>Ob dies ein CA Zertifikat wird oder nicht</translation> </message> <message> <location line="+3"/> <source>Set this to TRUE if you want to create a CA certificate that signs other certificates. This is always set to FALSE for client or server certificates. In most cases self-signed certificates are CA certificates. Self-signed non-CA certificates are unusual although they are possible.</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Not defined</source> <translation>Nicht definiert</translation> </message> <message> <location line="+5"/> <source>Certification Authority</source> <translation>Zertifikats Authorität</translation> </message> <message> <location line="+5"/> <source>End Entity</source> <translation>End Instanz</translation> </message> <message> <location line="+8"/> <source>Path length</source> <translation>Pfadlänge</translation> </message> <message> <location line="+7"/> <source>How much CAs may be below this.</source> <translation>Wieviele CAs in der Kette unter diesem sein dürfen.</translation> </message> <message> <location line="+3"/> <source>If this is left empty the pathlen is not included in the certificate. Otherwise it distinguishes the count of chained CA certificates below this one. A pathlen of 0 means, that this certificate may not issue other sub-CA certificates. Although it can do it, all chain-checking algorithms in e.g. your browser or openssl will (should) fail.</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>The basic constraints should always be critical</source> <translation>Die "basic constraints" sollten immer "critical" sein</translation> </message> <message> <location line="+13"/> <source>Key identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+15"/> <source>Creates a hash of the key following the PKIX guidelines</source> <translation>Erstellt eine hashsumme nach PKIX Vorgaben</translation> </message> <message> <location line="+10"/> <source>Copy the Subject Key Identifier from the issuer</source> <translation>Kopiere den "Subject key identifier" vom Aussteller</translation> </message> <message> <location line="+3"/> <source>If this box is checked an attempt is made to copy the subject key identifier from the signing certificate. It also copies the issuer and serial number from the issuer certificate. Normally this will only be done if the keyid option fails.</source> <translation type="unfinished"></translation> </message> <message> <location line="+41"/> <source>Validity</source> <translation>Gültigkeit</translation> </message> <message> <location line="+6"/> <source>Not before</source> <translation>Nicht vor dem</translation> </message> <message> <location line="+14"/> <source>Not after</source> <translation>Nicht nach dem</translation> </message> <message> <location line="+17"/> <source>Time range</source> <translation>Zeitspanne</translation> </message> <message> <location line="+10"/> <source>Days</source> <translation>Tage</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Monate</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Jahre</translation> </message> <message> <location line="+21"/> <source>Set the time to 00:00:00 and 23:59:59 respectively</source> <translation>Stell die Zeiten auf 00:00:00 und 23:59:59</translation> </message> <message> <location line="+3"/> <source>Midnight</source> <translation>Mitternacht</translation> </message> <message> <location line="+7"/> <source>Local time</source> <translation>Ortszeit</translation> </message> <message> <location line="+166"/> <source>Authority Info Access</source> <translation type="unfinished"></translation> </message> <message> <location line="-52"/> <source>CRL distribution point</source> <translation type="unfinished"></translation> </message> <message> <location line="-30"/> <source>issuer alternative name</source> <translation type="unfinished"></translation> </message> <message> <location line="+59"/> <source>URI:</source> <translation>URI:</translation> </message> <message> <location line="+3"/> <source>This is a multi-valued extension that supports all the literal options of subject alternative name. Of the few software packages that currentlyi nterpret this extension most only interpret the URI option. Currently each option will set a new DistributionPoint with the fullName field set to the given value. Other fields like cRLissuer and reasons cannot currently be set or displayed: at this time no examples were available that used these fields. If you see this extension with <UNSUPPORTED> when you attempt to print it out or it doesn't appear to display correctly then let steve know, including the certificate (mail steve at openssl dot org) . Examples: URI:http://www.myhost.com/myca.crl URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl</source> <translation type="unfinished"></translation> </message> <message> <location line="+49"/> <source>can be altered by the file "aia.txt"</source> <translation>Kann in der Datei "aia.txt" angepasst werden</translation> </message> <message> <location line="-118"/> <location line="+30"/> <location line="+52"/> <location line="+58"/> <location filename="../widgets/NewX509.cpp" line="-200"/> <location line="+564"/> <source>Edit</source> <translation>Bearbeiten</translation> </message> <message> <location line="-153"/> <location line="+30"/> <location line="+108"/> <source>DNS: IP: URI: email: RID:</source> <translation>DNS: IP: URI: email: RID:</translation> </message> <message> <location line="+3"/> <source>The authority information access extension gives details about how to access certain information relating to the CA. Its syntax is accessOID;location where 'location' has the same syntax as subject alternative name (except that email:copy is not supported). accessOID can be any valid OID but only certain values are meaningful for example OCSP and caIssuers. OCSP gives the location of an OCSP responder: this is used by Netscape PSM and other software. Example: OCSP;URI:http://ocsp.my.host/ caIssuers;URI:http://my.ca/ca.html</source> <translation type="unfinished"></translation> </message> <message> <location line="-138"/> <source>The subject alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name) , RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation type="unfinished"></translation> </message> <message> <location line="-32"/> <source>subject alternative name</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>The issuer alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name), RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation type="unfinished"></translation> </message> <message> <location line="+149"/> <location line="+20"/> <source>Key usage</source> <translation type="unfinished"></translation> </message> <message> <location line="+77"/> <source>Extended key usage</source> <translation type="unfinished"></translation> </message> <message> <location line="+35"/> <source>Netscape</source> <translation>Netscape</translation> </message> <message> <location line="+133"/> <source>CA Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>SSL server name</source> <translation type="unfinished"></translation> </message> <message> <location line="+16"/> <source>Certificate renewal URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Comment</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>CA policy URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Base URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>If you know a more pretty one tell me</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-696"/> <source>Create a &self signed certificate with a MD5-hashed QA serial</source> <translation>Erstelle ein &Selbst signiertes Zertifikat mit eine MD5-gehashten Serien nummer</translation> </message> <message> <location line="+77"/> <source>Create Certificate signing request</source> <translation>Erstelle einen Zertifikatsantrag</translation> </message> <message> <location line="+57"/> <source>XCA template</source> <translation>XCA Vorlage</translation> </message> <message> <location line="+10"/> <source>Create x509 Certificate</source> <translation>Erstelle x509 Zertifikat</translation> </message> <message> <location line="+701"/> <location line="+14"/> <location line="+20"/> <location line="+11"/> <location line="+17"/> <location line="+15"/> <location line="+30"/> <location line="+12"/> <location line="+24"/> <location line="+23"/> <location line="+20"/> <source>Abort rollout</source> <translation>Ausstellung abbrechen</translation> </message> <message> <location line="-177"/> <source>The following length restrictions of RFC3280 are violated:</source> <translation>Die folgenden Längenbeschränkungen aus RFC3280 werden verletzt:</translation> </message> <message> <location line="+34"/> <source>The internal name and the common name are empty. Please set at least the internal name.</source> <translation>Der interne Name und der commonName sind leer. Bitte mindestens den internen Namen setzen.</translation> </message> <message> <location line="+16"/> <source>There is no Key selected for signing.</source> <translation>Es ist kein Schlüssel zum Signieren ausgewählt.</translation> </message> <message> <location line="-44"/> <location line="+63"/> <location line="+42"/> <location line="+24"/> <location line="+43"/> <source>Continue rollout</source> <translation>Ausstellung fortführen</translation> </message> <message> <location line="-25"/> <source>The certificate will be out of date before it becomes valid. You most probably mixed up both dates.</source> <translation>Das Zertifikat wird abgelaufen sein, bevor es gültig wurde. Wahrscheinlich sind die Zeiten vertauscht.</translation> </message> <message> <location filename="../ui/NewX509.ui" line="-1340"/> <source>Modify subject of the request</source> <translation>Inhaberinformation "subject" des Zertifikatsantrags ändern</translation> </message> <message> <location line="+1370"/> <source>Advanced</source> <translation>Erweitert</translation> </message> <message> <location line="+24"/> <location filename="../widgets/NewX509.cpp" line="-301"/> <source>Validate</source> <translation>Überprüfen</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="+170"/> <source>The verification of the Certificate request failed. The rollout should be aborted.</source> <translation>Die Validierung des Requests ist fehlgeschlagen. Die Zertifikatserstellung sollte abgebrochen werden.</translation> </message> <message> <location line="+2"/> <source>Continue anyway</source> <translation>Trotzdem fortfahren</translation> </message> <message> <location filename="../ui/NewX509.ui" line="-640"/> <source>No well-defined expiration</source> <translation>Undefiniertes Ablaufdatum</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="+11"/> <source>Edit name</source> <translation>Namen editieren</translation> </message> <message> <location line="+17"/> <source>Select key</source> <translation>Schlüssel auswählen</translation> </message> <message> <location line="+12"/> <source>The following distinguished name entries are empty: %1 though you have declared them as mandatory in the options menu.</source> <translation>Die folgenden Subject-name Einträge sind leer: %1, obwohl sie im Optionen-menu als notwendig deklariert wurden.</translation> </message> <message> <location line="-60"/> <location line="+63"/> <source>Edit subject</source> <translation>Subject editieren</translation> </message> <message> <location line="+42"/> <location line="+24"/> <location line="+23"/> <source>Edit dates</source> <translation>Zeiten einstellen</translation> </message> <message> <location line="-62"/> <source>The key you selected for signing is not a private one.</source> <translation>Der ausgewählte Schlüssel zum signieren ist nicht vollständig.</translation> </message> <message> <location line="+2"/> <source>Select other signer</source> <translation>Andere CA wählen</translation> </message> <message> <location line="+0"/> <source>Select other key</source> <translation>Anderen Schlüssel wählen</translation> </message> <message> <location line="+10"/> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation>Das Zertifikat is früher gültig als der Aussteller. Dies ist wahrscheinlich ungewollt.</translation> </message> <message> <location line="+6"/> <location line="+24"/> <source>Adjust date and continue</source> <translation>Datum anpassen und fortführen</translation> </message> <message> <location line="-6"/> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation>Das Zertifikat ist länger gültig als der Aussteller. Dies ist wahrscheinlich nicht gewollt.</translation> </message> <message> <location line="+43"/> <source>The certificate contains invalid or duplicate extensions. Check the validation on the advanced tab.</source> <translation>Das Zertifikat enthält ungültige oder duplizierte Extensions. Bitte prüfen Sie die Validierung auf dem Erweitert Reiter.</translation> </message> <message> <location line="+3"/> <source>Edit extensions</source> <translation>Extensions editieren</translation> </message> <message> <location filename="../ui/NewX509.ui" line="-554"/> <source>Apply extensions</source> <translation>Erweiterungen übernehmen</translation> </message> <message> <location line="+7"/> <source>Apply subject</source> <translation>Subject übernehmen</translation> </message> <message> <location line="+13"/> <source>Apply all</source> <translation>Alles übernehmen</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-926"/> <source>minimum size: %1</source> <translation>Mindestlänge: %1</translation> </message> <message> <location line="+2"/> <source>maximum size: %1</source> <translation>Maximallänge: %1</translation> </message> <message> <location line="+2"/> <source>only a-z A-Z 0-9 '()+,-./:=?</source> <translation>nur die Zeichen a-z A-Z 0-9 '()+,-./:=?</translation> </message> <message> <location line="+4"/> <source>only 7-bit clean characters</source> <translation type="unfinished"></translation> </message> <message> <location line="+609"/> <source>From PKCS#10 request</source> <translation>Aus dem PKCS#10 Zertifikatsantrag</translation> </message> <message> <location line="+15"/> <source>Other Tabs</source> <translation>Andere Tabs</translation> </message> <message> <location line="+13"/> <source>Advanced Tab</source> <translation>Erweiterter Tab</translation> </message> <message> <location line="+7"/> <source>Errors</source> <translation>Fehler</translation> </message> <message> <location filename="../widgets/NewX509_ext.cpp" line="+220"/> <source>Configfile error on line %1 </source> <translation>Fehler in der Konfigurationsdatei in Zeile %1 </translation> </message> </context> <context> <name>Options</name> <message> <location filename="../ui/Options.ui" line="+38"/> <source>Mandatory subject entries</source> <translation>Pflichtfelder im subject-name</translation> </message> <message> <location line="+24"/> <location line="+103"/> <source>Add</source> <translation>Hinzufügen</translation> </message> <message> <location line="-96"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="+33"/> <source>Default hash algorithm</source> <translation>Standard Hash Algorithmus</translation> </message> <message> <location line="+20"/> <source>String types</source> <translation>Zeichenkettentyp</translation> </message> <message> <location line="+12"/> <source>Suppress success messages</source> <translation>Erstellungs- und Importnachrichten unterdrücken</translation> </message> <message> <location line="+7"/> <source>Don't colorize expired certificates</source> <translation>Abgelaufene Zertifikate nicht farblich markieren</translation> </message> <message> <location line="+7"/> <source>PKCS#11 provider</source> <translation>PKCS#11 anbieter</translation> </message> <message> <location line="+30"/> <source>Remove</source> <translation>Entfernen</translation> </message> <message> <location line="+7"/> <source>Search</source> <translation>Suchen</translation> </message> <message> <location filename="../widgets/Options.cpp" line="+34"/> <source>UTF8 strings only (RFC2459)</source> <translation>Nur UTF8 Zeichenketten (RFC2459)</translation> </message> <message> <location line="-3"/> <source>Printable string or UTF8 (default)</source> <translation></translation> </message> <message> <location line="+1"/> <source>PKIX recommendation in RFC2459</source> <translation></translation> </message> <message> <location line="+1"/> <source>No BMP strings, only printable and T61</source> <translation></translation> </message> <message> <location line="+2"/> <source>All strings</source> <translation></translation> </message> <message> <location line="+136"/> <source>Load failed</source> <translation>Laden fehlgeschlagen</translation> </message> <message> <location filename="../ui/Options.ui" line="-157"/> <source>XCA Options</source> <translation>XCA Optionen</translation> </message> </context> <context> <name>PwDialog</name> <message> <location filename="../widgets/PwDialog.cpp" line="+85"/> <source>Repeat %1</source> <translation>%1 wiederholen</translation> </message> <message> <location line="+14"/> <source>%1 missmatch</source> <translation>Keine %1 übereinstimmung</translation> </message> <message> <location line="+7"/> <source>Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it must consist of an even number of characters</source> <translation>Das Passwort wird als 2stelliger hex-code interpretiert. Er muss eine gradstellige Anzahl der Zeichen 0-9 und a-f enthalten</translation> </message> <message> <location line="+26"/> <source>E&xit</source> <translation>B&eenden</translation> </message> <message> <location filename="../ui/PwDialog.ui" line="+118"/> <source>The password is parsed as 2-digit hex code. It must have an even number of digits (0-9 and a-f)</source> <translation>Das Passwort wird als 2 stelliger hex-code interpretiert. Er muss eine grade Anzahl an Ziffern enthalten (0-9 und a-f)</translation> </message> <message> <location line="+3"/> <source>Take as HEX string</source> <translation>Als HEX Zeichenkette interpretieren</translation> </message> </context> <context> <name>QObject</name> <message> <location filename="../lib/load_obj.cpp" line="+54"/> <source>Import RSA key</source> <translation>Import von RSA Schlüssel</translation> </message> <message> <location line="+14"/> <source>Import Request</source> <translation>Import von Zertifikatsanträgen</translation> </message> <message> <location line="+13"/> <source>Import X.509 Certificate</source> <translation>Import von X.509 Zertifikaten</translation> </message> <message> <location line="+13"/> <source>Import PKCS#7 Certificates</source> <translation>Import von PKCS#7 Zertifikaten</translation> </message> <message> <location line="+13"/> <source>Import PKCS#12 Private Certificate</source> <translation>Import von PKCS#12 Privaten Zertifikaten</translation> </message> <message> <location line="+14"/> <source>Import XCA Templates</source> <translation>Import von XCA Vorlagen</translation> </message> <message> <location line="+26"/> <source>Open XCA Database</source> <translation>Öffnen einer XCA Datenbank</translation> </message> <message> <location line="-13"/> <source>Import Certificate Revocation List</source> <translation>Importiere Zertifikatsrücknahmeliste</translation> </message> <message> <location line="-82"/> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;</source> <translation>PKI Schlüssel ( *.pem *.der *.key );;PKCS#8 Schlüssel ( *.p8 *.pk8 );;</translation> </message> <message> <location line="+14"/> <source>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;</source> <translation>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;</translation> </message> <message> <location line="+14"/> <source>Certificates ( *.pem *.der *.crt *.cer );;</source> <translation>Zertifikate ( *.pem *.der *.crt *.cer );;</translation> </message> <message> <location line="+13"/> <source>PKCS#7 data ( *.p7s *.p7m *.p7b );;</source> <translation>PKCS#7 Daten ( *.p7s *.p7m *.p7b );;</translation> </message> <message> <location line="+13"/> <source>PKCS#12 Certificates ( *.p12 *.pfx );;</source> <translation>PKCS#12 Zertifikate ( *.p12 *.pfx );;</translation> </message> <message> <location line="+14"/> <source>XCA templates ( *.xca );;</source> <translation>XCA Vorlagen ( *.xca);;</translation> </message> <message> <location line="+13"/> <source>Revocation lists ( *.pem *.der *.crl );;</source> <translation>Rücknahmeliste ( *.pem *.der *.crl );;</translation> </message> <message> <location line="+13"/> <source>XCA Databases ( *.xdb );;</source> <translation>XCA Datenbanken ( *.xdb );;</translation> </message> <message> <location line="+11"/> <source>PKCS#11 library ( *.dylib *.so );;</source> <translation>PKCS#11 Bibliothek ( *.dylib *.so );;</translation> </message> <message> <location line="+11"/> <source>PEM files ( *.pem );;</source> <translation>PEM Dateien ( *.pem );;</translation> </message> <message> <location line="+1"/> <source>Load PEM encoded file</source> <translation>Lade PEM codierte Datei</translation> </message> <message> <location filename="../lib/x509name.cpp" line="+106"/> <source>Invalid</source> <translation>Ungültig</translation> </message> <message> <location line="+113"/> <source>%1 is shorter than %2 bytes: '%3'</source> <translation>%1 ist kürzer als %2 bytes: '%3'</translation> </message> <message> <location line="+5"/> <source>%1 is longer than %2 bytes: '%3'</source> <translation>%1 ist länger als %2 bytes: '%3'</translation> </message> <message> <location filename="../lib/load_obj.cpp" line="-149"/> <source>All files ( * )</source> <translation>Alle Dateien ( * )</translation> </message> <message> <location filename="../lib/asn1time.cpp" line="+127"/> <location line="+10"/> <location line="+19"/> <source>Undefined</source> <translation>Undefiniert</translation> </message> <message> <location line="-27"/> <location line="+10"/> <location line="+19"/> <source>Broken / Invalid</source> <translation>Ungültig</translation> </message> <message> <location filename="../lib/db.cpp" line="+176"/> <source>DB: Rename: '%1' already in use</source> <translation>DB: Rename: '%1' wird bereits verwendet</translation> </message> <message> <location line="+4"/> <source>DB: Entry to rename not found: %1</source> <translation>DB: Eintrag zur Umbenennung nicht gefunden: %1</translation> </message> <message> <location filename="../lib/load_obj.cpp" line="+135"/> <source>PKCS#11 library ( *.dll );;</source> <translation></translation> </message> <message> <location line="+4"/> <source>PKCS#11 library ( *.so );;</source> <translation></translation> </message> <message> <location line="+2"/> <source>Open PKCS#11 shared library</source> <translation>PKCS#11 library öffnen</translation> </message> <message> <location filename="../lib/db.cpp" line="+10"/> <source>DB: Write error %1 - %2</source> <translation>Datenbank: Schreibfehler %1 - %2</translation> </message> <message> <location filename="../lib/pkcs11.cpp" line="+224"/> <source>Please enter the PIN on the PinPad</source> <translation>Bitte die PIN am Lesegerät eingeben</translation> </message> <message> <location line="+11"/> <source>Please enter the SO PIN (PUK) of the token %1</source> <translation>Bitte die SO PIN (PUK) der Chipkarte %1 eingeben</translation> </message> <message> <location line="+1"/> <source>Please enter the PIN of the token %1</source> <translation>Bitte die PIN der Chipkarte %1 eingeben</translation> </message> <message> <location line="+50"/> <source>No Security token found</source> <translation>Keine Chipkarte gefunden</translation> </message> <message> <location filename="../lib/exception.h" line="+55"/> <source>Out of Memory at %1:%2</source> <translation>Kein Speicher verfügbar %1: %2</translation> </message> <message> <location filename="../lib/db.cpp" line="+243"/> <location line="+17"/> <source>Out of data</source> <translation>zuwenig Daten</translation> </message> <message> <location line="+23"/> <source>Error finding endmarker of string</source> <translation>Fehlerhafter String</translation> </message> <message> <location filename="../lib/pkcs11.cpp" line="+11"/> <source>Select</source> <translation>Auswählen</translation> </message> <message> <location line="+22"/> <source>Please enter the new SO PIN (PUK) for the token: '%1'</source> <translation>Bitte die neue SO PIN (PUK) für die Chipkarte '%1' eingeben</translation> </message> <message> <location line="+2"/> <source>Please enter the new PIN for the token: '%1'</source> <translation>Bitte die neue PIN der Chipkarte %1 eingeben</translation> </message> <message> <location filename="../lib/pkcs11_lib.cpp" line="+50"/> <source>Failed to open PKCS11 library: %1</source> <translation>Die PKCS#11 Bibliothek %1 konnte nicht geöffnet werden</translation> </message> <message> <location line="+218"/> <source>PKCS#11 function '%1' failed: %2</source> <translation>PKCS#11 Funktion '%1' fehlgeschlagen: %2</translation> </message> <message> <location line="+7"/> <source>PKCS#11 function '%1' failed: %2 In library %3 %4</source> <translation>PKCS#11 Funktion '%1' fehlgeschlagen: %2 in Bibliothek %3 %4</translation> </message> <message> <location filename="../lib/pkcs11.h" line="+80"/> <source>Required PIN size: %1 - %2</source> <translation>Benötigte PIN länge: %1 - %2</translation> </message> </context> <context> <name>Revoke</name> <message> <location filename="../ui/Revoke.ui" line="+17"/> <source>Revokation details</source> <translation>Details der Rücknahmeliste</translation> </message> <message> <location line="+6"/> <source>Invalid since</source> <translation>Ungültig seit</translation> </message> <message> <location line="+14"/> <source>Local time</source> <translation>Ortszeit</translation> </message> <message> <location line="+7"/> <source>Revokation reason</source> <translation>Rücknahmegrund</translation> </message> </context> <context> <name>SearchPkcs11</name> <message> <location filename="../ui/SearchPkcs11.ui" line="+14"/> <source>Dialog</source> <translation></translation> </message> <message> <location line="+27"/> <source>Directory</source> <translation>Verzeichnis</translation> </message> <message> <location line="+16"/> <source>...</source> <translation>...</translation> </message> <message> <location line="+7"/> <source>include sub directorys</source> <translation>Unterverzeichnisse einschliessen</translation> </message> <message> <location line="+7"/> <source>Search</source> <translation>Suchen</translation> </message> <message> <location filename="../widgets/SearchPkcs11.cpp" line="+77"/> <source>The following files are possible PKCS#11 libraries</source> <translation>Die folgenden Dateien sind mögliche PKCS#11 Bibliotheken</translation> </message> </context> <context> <name>SelectToken</name> <message> <location filename="../ui/SelectToken.ui" line="+14"/> <source>Select Token</source> <translation>Chipkarte auswählen</translation> </message> <message> <location line="+25"/> <source>Security token</source> <translation>Chipkarte</translation> </message> <message> <location line="+47"/> <source>Please select the security token</source> <translation>Bitte wählen Sie die Chipkarte</translation> </message> </context> <context> <name>TrustState</name> <message> <location filename="../ui/TrustState.ui" line="+115"/> <source>Trustment</source> <translation>Vertrauen</translation> </message> <message> <location line="+12"/> <source>&Never trust this certificate</source> <translation>&Niemals diesem Zertifikat vertrauen</translation> </message> <message> <location line="+7"/> <source>Only &trust this certificate, if we trust the signer</source> <translation>Nur dann ver&trauen, wenn wir dem Aussteller vertrauen</translation> </message> <message> <location line="+7"/> <source>&Always trust this certificate</source> <translation>Diesem Zertifikat immer vertr&auen</translation> </message> <message> <location line="-102"/> <source>Set trustment of the Certificate</source> <translation>Vertrauenseinstellung des Zertifikats</translation> </message> </context> <context> <name>Validity</name> <message> <location filename="../widgets/validity.cpp" line="+94"/> <source>yyyy-MM-dd hh:mm</source> <translation>dd.MM.yyyy hh:mm</translation> </message> </context> <context> <name>db_base</name> <message> <location filename="../lib/db_base.cpp" line="+28"/> <source>Internal name</source> <translation>Interner Name</translation> </message> <message> <location line="+641"/> <source>Reset</source> <translation>Zurücksetzen</translation> </message> <message> <location line="-2"/> <source>Subject entries</source> <translation>Namensteile</translation> </message> <message> <location line="+1"/> <source>X509v3 Extensions</source> <translation>X509v3 Erweiterungen</translation> </message> <message> <location line="+30"/> <source>Paste PEM data</source> <translation>Einfügen (PEM)</translation> </message> <message> <location line="+2"/> <source>Columns</source> <translation>Spalten</translation> </message> </context> <context> <name>db_crl</name> <message> <location filename="../lib/db_crl.cpp" line="+22"/> <source>Signer</source> <translation>Aussteller</translation> </message> <message> <location line="+1"/> <source>Internal name of the signer</source> <translation>Interner Name des Ausstellers</translation> </message> <message> <location line="+1"/> <source>No. revoked</source> <translation>Anzahl</translation> </message> <message> <location line="+1"/> <source>Number of revoked certificates</source> <translation>Anzahl zurückgezogener Zertifikate</translation> </message> <message> <location line="+1"/> <source>Last update</source> <translation>Letztes update</translation> </message> <message> <location line="+1"/> <source>Next update</source> <translation>Nächstes Update</translation> </message> <message> <location line="+1"/> <source>CRL number</source> <translation>CRL Nummer</translation> </message> <message> <location line="+106"/> <source>CRL ( *.pem *.der *.crl )</source> <translation>CRL ( *.pem *.der *.crl )</translation> </message> <message> <location line="+2"/> <source>Revokation list export</source> <translation>Rücknahmeliste exportieren</translation> </message> <message> <location line="+87"/> <source>Import</source> <translation>Import</translation> </message> <message> <location line="+2"/> <source>Rename</source> <translation>Umbenennen</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation>Export</translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation>Zwischenablage</translation> </message> <message> <location line="+2"/> <source>File</source> <translation>Datei</translation> </message> <message> <location line="+1"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="-131"/> <source>The revokation list already exists in the database as: '%1' and so it was not imported</source> <translation>Die Sperrliste existiert bereits in der Datenbank als: '%1' daher wurde ssie nicht importiert</translation> </message> </context> <context> <name>db_key</name> <message> <location filename="../lib/db_key.cpp" line="+134"/> <source>Key size too small !</source> <translation>Schlüsselgrösse zu klein !</translation> </message> <message> <location line="+95"/> <source>New Key</source> <translation>Neuer Schlüssel</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Import</translation> </message> <message> <location line="+2"/> <source>Rename</source> <translation>Umbenennen</translation> </message> <message> <location line="+1"/> <source>Show Details</source> <translation>Details anzeigen</translation> </message> <message> <location line="+2"/> <source>Export</source> <translation>Export</translation> </message> <message> <location line="-1"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="+5"/> <source>Change password</source> <translation>Passwort ändern</translation> </message> <message> <location line="+4"/> <source>Reset password</source> <translation>Passwort zurücksetzen</translation> </message> <message> <location line="-48"/> <source>Shall the original key '%1' be replaced by the key on the token? This will delete the key '%1' and make it unexportable</source> <translation>Soll der Originalschlüssel '%1' durch den Chipkartenschlüssel ersetzt werden? Dies löscht den Schlüssel '%1' und macht ihn nicht-exportierbar</translation> </message> <message> <location line="-157"/> <source>Type</source> <translation>Typ</translation> </message> <message> <location line="+1"/> <source>Size</source> <translation>Länge</translation> </message> <message> <location line="+1"/> <source>Use</source> <translation>Benutzt</translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Passwort</translation> </message> <message> <location line="+208"/> <source>Change PIN</source> <translation>PIN ändern</translation> </message> <message> <location line="+2"/> <source>Init PIN with SO PIN (PUK)</source> <translation>PIN mithilfe der SO PIN (PUK) initialisieren</translation> </message> <message> <location line="+2"/> <source>Change SO PIN (PUK)</source> <translation>SO PIN (PUK) ändern</translation> </message> <message> <location line="+4"/> <source>Store on Security token</source> <translation>Auf der Chipkarte speichern</translation> </message> <message> <location line="+89"/> <source>Tried to change password of a token</source> <translation></translation> </message> <message> <location line="+14"/> <source>Tried to change PIN of a key</source> <translation></translation> </message> <message> <location line="+16"/> <source>Tried to init PIN of a key</source> <translation></translation> </message> <message> <location line="+16"/> <source>Tried to change SO PIN of a key</source> <translation></translation> </message> <message> <location line="-297"/> <source>The key is already in the database as: '%1' and is not going to be imported</source> <translation>Der Schlüssel ist bereits in der Datenbank als: '%1' und wird daher nicht importiert</translation> </message> <message> <location line="+6"/> <source>The database already contains the public part of the imported key as '%1 and will be completed by the new, private part of the key</source> <translation>Die Datenbank enthält schon den öffentlichen Schlüssel '%1' und wird duch den importierten, privaten Teil vervollständigt</translation> </message> <message> <location line="+39"/> <source>You are sure to create a key of the size: %1 ?</source> <translation>Soll wirklich ein Schlüssel der Grösse %1 erstellt werden ?</translation> </message> </context> <context> <name>db_temp</name> <message> <location filename="../lib/db_temp.cpp" line="+23"/> <source>Type</source> <translation>Typ</translation> </message> <message> <location line="+90"/> <source>Nothing</source> <translation>Nichts</translation> </message> <message> <location line="+5"/> <source>Preset Template values</source> <translation>Vorlagenwerte voreinstellen</translation> </message> <message> <location line="+39"/> <source>copy</source> <translation>kopie</translation> </message> <message> <location line="+32"/> <source>Save template as</source> <translation>Vorlage speichern als</translation> </message> <message> <location line="+43"/> <source>New Template</source> <translation>Neue Vorlage</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Import</translation> </message> <message> <location line="+2"/> <source>Rename</source> <translation>Umbenennen</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation>Export</translation> </message> <message> <location line="+1"/> <source>Change</source> <translation>Ändern</translation> </message> <message> <location line="+1"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="+1"/> <source>Duplicate</source> <translation>Duplizieren</translation> </message> <message> <location line="+1"/> <source>Create certificate</source> <translation>Zertifikat erstellen</translation> </message> <message> <location line="+2"/> <source>Create request</source> <translation>Zertifikatsantrag erstellen</translation> </message> <message> <location line="-52"/> <source>XCA templates ( *.xca);; All files ( * )</source> <translation>XCA Vorlagen ( *.xca);; All files ( * )</translation> </message> <message> <location line="-141"/> <source>Bad template: %1</source> <translation>Ungültige Vorlage %1</translation> </message> </context> <context> <name>db_x509</name> <message> <location filename="../lib/db_x509.cpp" line="-887"/> <source>Serial</source> <translation>Seriennummer</translation> </message> <message> <location line="+1"/> <source>md5 fingerprint</source> <translation>md5 Fingerprint</translation> </message> <message> <location line="+1"/> <source>sha1 fingerprint</source> <translation>sha1 Fingerprint</translation> </message> <message> <location line="+1"/> <source>Start date</source> <translation>Gültigkeitsbeginn</translation> </message> <message> <location line="+1"/> <source>not Before</source> <translation>not Before</translation> </message> <message> <location line="+1"/> <source>Expiry date</source> <translation>Ablaufdatum</translation> </message> <message> <location line="+1"/> <source>not After</source> <translation>not After</translation> </message> <message> <location line="+1"/> <source>Trust state</source> <translation>Vertrauensstatus</translation> </message> <message> <location line="+1"/> <source>Revocation</source> <translation>Rücknahme</translation> </message> <message> <location line="+108"/> <source>Plain View</source> <translation>Einfache Ansicht</translation> </message> <message> <location line="+2"/> <source>Tree View</source> <translation>Baumansicht</translation> </message> <message> <location line="+317"/> <source>Invalid public key</source> <translation>Ungültiger öffentlicher Schlüssel</translation> </message> <message> <location line="+18"/> <source>Please enter the new hexadecimal secret number for the QA process.</source> <translation></translation> </message> <message> <location line="+8"/> <source>The QA process has been terminated by the user.</source> <translation></translation> </message> <message> <location line="+17"/> <source>The key you selected for signing is not a private one.</source> <translation>Der ausgewählte Schlüssel zum signieren ist nicht vollständig.</translation> </message> <message> <location line="+101"/> <source>New Certificate</source> <translation>Neues Zertifikat</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Import</translation> </message> <message> <location line="+1"/> <source>Import PKCS#12</source> <translation>Import PKCS#12</translation> </message> <message> <location line="+1"/> <source>Import from PKCS#7</source> <translation>Import von PKCS #7</translation> </message> <message> <location line="+3"/> <source>Rename</source> <translation>Umbenennen</translation> </message> <message> <location line="+1"/> <source>Show Details</source> <translation>Details anzeigen</translation> </message> <message> <location line="+2"/> <source>Extract public Key</source> <translation>Öffentlichen Schlüssel extrahieren</translation> </message> <message> <location line="+2"/> <source>Export</source> <translation>Export</translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation>Zwischenablage</translation> </message> <message> <location line="+2"/> <source>File</source> <translation>Datei</translation> </message> <message> <location line="+1"/> <source>Request</source> <translation>Zertifikatsantrag</translation> </message> <message> <location line="+7"/> <source>OpenSSL config</source> <translation>OpenSSL Konfiguration</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="+4"/> <source>Trust</source> <translation>Vertrauen</translation> </message> <message> <location line="-610"/> <location line="+612"/> <source>CA</source> <translation>CA</translation> </message> <message> <location line="-611"/> <source>reflects the basic Constraints extension</source> <translation>Zeigt den Inhalt der basic constraints erweiterung</translation> </message> <message> <location line="+612"/> <source>Properties</source> <translation>Eigenschaften</translation> </message> <message> <location line="+1"/> <source>Generate CRL</source> <translation>CRL erstellen</translation> </message> <message> <location line="+2"/> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <location line="+1"/> <source>Sign</source> <translation>Unterschreiben</translation> </message> <message> <location line="+1"/> <source>Encrypt</source> <translation>Verschlüsseln</translation> </message> <message> <location line="+3"/> <source>Renewal</source> <translation>Verlängerung</translation> </message> <message> <location line="+3"/> <source>Unrevoke</source> <translation>Rücknahme aufheben</translation> </message> <message> <location line="+4"/> <source>Revoke</source> <translation>Rücknahme</translation> </message> <message> <location line="+113"/> <source>Not possible for a token key: '%1'</source> <translation>Nicht möglich für einen Chipkartenschlüssel '%1'</translation> </message> <message> <location line="+365"/> <source> days</source> <translation>Tage</translation> </message> <message> <location line="-508"/> <source>Security token</source> <translation>Chipkarte</translation> </message> <message> <location line="+4"/> <source>Template</source> <translation>Vorlage</translation> </message> <message> <location line="+6"/> <source>Delete from Security token</source> <translation>Von der Chipkarte löschen</translation> </message> <message> <location line="-302"/> <source>The certificate already exists in the database as: '%1' and so it was not imported</source> <translation>Das Zertifikat existiert bereits in der Datenbank als: '%1' und wurde daher nicht importiert</translation> </message> <message> <location line="+429"/> <location line="+33"/> <source>There was no key found for the Certificate: '%1'</source> <translation>Es wurde kein Schlüssel für das Zertifikat: '%1' gefunden</translation> </message> <message> <location line="+5"/> <source>Not possible for the token-key Certificate '%1'</source> <translation>Nicht möglich für das Chipkartenzertifikat '%1'</translation> </message> <message> <location line="-245"/> <source>Store the certificate to the key on the token '%1 (#%2)' ?</source> <translation>Soll das Zertifikat zum privaten Schlüssel auf der Chipkarte '%1' mit der Seriennummer %2 abgelegt werden ?</translation> </message> <message> <location line="+72"/> <source>Other token</source> <translation>Andere Chipkarte</translation> </message> </context> <context> <name>db_x509name</name> <message> <location filename="../lib/db_x509super.cpp" line="+18"/> <source>Subject</source> <translation>Inhaber</translation> </message> <message> <location line="+1"/> <source>Complete distinguished name</source> <translation>Vollständiger name</translation> </message> <message> <location line="+1"/> <source>Subject hash</source> <translation>Namenshash</translation> </message> <message> <location line="+1"/> <source>Hash to lookup certs in directories</source> <translation>OpenSSL Prüfsumme zum Auffinden von Zertifikaten in Verzeichnissen</translation> </message> </context> <context> <name>db_x509req</name> <message> <location filename="../lib/db_x509req.cpp" line="+134"/> <source>Certificate request ( *.pem *.der *.crl )</source> <translation>Zertifikatsantrag ( *.pem *.der *.crl )</translation> </message> <message> <location line="+2"/> <source>Certificate request export</source> <translation>Zertifikatsantrag exportieren</translation> </message> <message> <location line="+40"/> <source>New Request</source> <translation>Neuer Zertifikatsantrag</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Import</translation> </message> <message> <location line="+3"/> <source>Extract public Key</source> <translation>Öffentlichen Schlüssel extrahieren</translation> </message> <message> <location line="+2"/> <source>Rename</source> <translation>Umbenennen</translation> </message> <message> <location line="+1"/> <source>Show Details</source> <translation>Details anzeigen</translation> </message> <message> <location line="+1"/> <source>Sign</source> <translation>Unterschreiben</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation>Export</translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation>Zwischenablage</translation> </message> <message> <location line="+4"/> <source>OpenSSL config</source> <translation>OpenSSL Konfiguration</translation> </message> <message> <location line="+2"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="-171"/> <source>Signed</source> <translation>Signiert</translation> </message> <message> <location line="+1"/> <source>whether the request is already signed or not</source> <translation>Ob die Anfrage bearbeitet wurde oder nicht</translation> </message> <message> <location line="+1"/> <source>Unstructured name</source> <translation>unstrukturierter Name</translation> </message> <message> <location line="+2"/> <source>Challenge password</source> <translation>Challenge-Passwort</translation> </message> <message> <location line="+163"/> <source>File</source> <translation>Datei</translation> </message> <message> <location line="+1"/> <source>Template</source> <translation>Vorlage</translation> </message> <message> <location line="-145"/> <source>The certificate signing request already exists in the database as '%1' and thus was not stored</source> <translation>Der Request existiert bereits in der Datenbank als '%1' und wurde daher nicht importiert</translation> </message> </context> <context> <name>db_x509super</name> <message> <location filename="../lib/db_x509super.cpp" line="+31"/> <source>Key name</source> <translation>Schlüsselname</translation> </message> <message> <location line="+1"/> <source>Internal name of the key</source> <translation>Interner name des Schlüssels</translation> </message> <message> <location line="+75"/> <source>Save as OpenSSL config</source> <translation>OpenSSL Konfiguration speichern</translation> </message> <message> <location line="+1"/> <source>Config files ( *.conf *.cnf);; All files ( * )</source> <translation>Konfigurations dateien ( *.conf *.cnf);; Alle Dateien ( * )</translation> </message> <message> <location line="+25"/> <source>The following extensions were not ported into the template</source> <translation>Die folgenden Extensions wurden nicht ins Template übertragen</translation> </message> </context> <context> <name>kvView</name> <message> <location filename="../widgets/kvView.cpp" line="+164"/> <source>Type</source> <translation>Typ</translation> </message> <message> <location line="+0"/> <source>Content</source> <translation>Inhalt</translation> </message> </context> <context> <name>pass_info</name> <message> <location filename="../lib/pass_info.cpp" line="+21"/> <source>Password</source> <translation>Passwort</translation> </message> <message> <location line="+6"/> <source>PIN</source> <translation>PIN</translation> </message> </context> <context> <name>pki_base</name> <message> <location filename="../lib/pki_base.cpp" line="+82"/> <source>Error opening file: '%1': %2</source> <translation>Öffnen der Datei %1 fehlgeschlagen: %2</translation> </message> <message> <location line="+8"/> <source>Error writing to file: '%1': %2</source> <translation>Fehler beim Schreiben der Datei: '%1': %2</translation> </message> <message> <location line="+9"/> <source>Error: </source> <translation>Fehler: </translation> </message> <message> <location filename="../lib/pki_base.h" line="+67"/> <source>Internal error: Unexpected message: %1 %2</source> <translation>Interner Fehler: Unerwartete Nachricht: %1 %2</translation> </message> </context> <context> <name>pki_crl</name> <message> <location filename="../lib/pki_crl.cpp" line="+47"/> <source>Delete the revokation list '%1'?</source> <translation>Die Sperrliste '%1' löschen?</translation> </message> <message> <location line="+1"/> <source>Successfully created the revokation list '%1'</source> <translation>Die Sperrliste '%1' wurde erfolgreich erstellt</translation> </message> <message> <location line="+2"/> <source>Delete the %1 revokation lists: %2?</source> <translation>Die %1 Sperrlisten: %2 löschen?</translation> </message> <message> <location line="+42"/> <source>No issuer given</source> <translation>Keine Austeller angegeben</translation> </message> <message> <location line="+224"/> <source>unknown</source> <translation>unbekannt</translation> </message> <message> <location line="-246"/> <source>Unable to load the revokation list in file %1. Tried PEM and DER formatted CRL.</source> <translation>Konnte die Sperrliste %1 nicht laden. Ist weder eine PEM noch eine DER formatierte CRL.</translation> </message> <message> <location line="-24"/> <source>Successfully imported the revokation list '%1'</source> <translation>Die Sperrliste '%1' wurde erfolgreich importiert</translation> </message> <message> <location line="+100"/> <location line="+197"/> <source>Wrong Size %1</source> <translation>Ungültige Größe %1</translation> </message> </context> <context> <name>pki_evp</name> <message> <location filename="../lib/pki_evp.cpp" line="+196"/> <source>Failed to decrypt the key (bad password) </source> <translation>Konnte den Schlüssel nicht entschlüsseln. (Falsches Passwort)</translation> </message> <message> <location line="+185"/> <location line="+11"/> <source>Password input aborted</source> <translation>Passworteingabe abgebrochen</translation> </message> <message> <location line="+82"/> <source>Please enter the password to protect the private key: '%1'</source> <translation>Bitte geben sie das Passwort zur Verschlüsselung des privaten Schlüssels: '%1' ein</translation> </message> <message> <location line="-161"/> <source>Unable to load the private key in file %1. Tried PEM and DER private, public and PKCS#8 key types.</source> <translation>Der Schlüssel aus der Datei %1 konnte nicht geladen werden. Private und öffentliche, sowie PKCS#8 Schlüssel im PEM und DER format wurden versucht.</translation> </message> <message> <location line="-107"/> <source>Please enter the password to decrypt the private key.</source> <translation>Bitte geben sie das Passwort zur Entschlüsselung des privaten Schlüssels ein.</translation> </message> <message> <location line="+55"/> <source>Please enter the password to decrypt the private key from file: %1</source> <translation>Bitte das Passwort zur Entschlüsselung der Schlüsseldatei %1 eingeben</translation> </message> <message> <location line="+117"/> <source>Please enter the password to decrypt the private key: '%1'</source> <translation>Bitte das Passwort zur Entschlüsselung des privaten Schlüssels: '%1' eingeben</translation> </message> <message> <location line="+111"/> <source>Please enter the database password for encrypting the key</source> <translation>Bitte geben sie das Datenbankpasswort zur Verschlüsselung des Schlüssels ein</translation> </message> <message> <location line="+83"/> <source>Please enter the password protecting the PKCS#8 key '%1'</source> <translation>Bitte das Passwort zum Schutz des PKCS#8 Schlüssels '%1' eingeben</translation> </message> <message> <location line="+35"/> <source>Please enter the export password for the private key '%1'</source> <translation>Bitte das Passwort zum Schutz des privaten Schlüssels '%1' eingeben</translation> </message> <message> <location line="-218"/> <source>Please enter the database password for decrypting the key '%1'</source> <translation>Bitte das Datenbankpasswort zur Entschlüsselung des Schlüssels '%1' eingeben</translation> </message> </context> <context> <name>pki_key</name> <message> <location filename="../lib/pki_key.cpp" line="+118"/> <source>Successfully imported the %1 public key '%2'</source> <translation>Der öffentliche %1 Schlüssel '%2' wurde erfolgreich importiert</translation> </message> <message> <location line="+1"/> <source>Delete the %1 public key '%2'?</source> <translation>Den öffentlichen %1 Schlüssel '%2' löschen?</translation> </message> <message> <location line="+5"/> <source>Successfully imported the %1 private key '%2'</source> <translation>Der private %1 Schlüssel '%2' wurde erfolgreich importiert</translation> </message> <message> <location line="+1"/> <source>Delete the %1 private key '%2'?</source> <translation>Den privaten %1 Schlüssel '%2' löschen?</translation> </message> <message> <location line="+1"/> <source>Successfully created the %1 private key '%2'</source> <translation>Der private %1 Schlüssel '%2' wurde erfolgreich erstellt</translation> </message> <message> <location line="+6"/> <source>Delete the %1 keys: %2?</source> <translation>Die %1 Schlüssel: %2 löschen?</translation> </message> <message> <location line="+8"/> <source>public key</source> <translation>öffentlicher Schlüssel</translation> </message> <message> <location line="+162"/> <source>Common</source> <translation>Standard</translation> </message> <message> <location line="+0"/> <source>Private</source> <translation>Privat</translation> </message> <message> <location line="+0"/> <source>Bogus</source> <translation>Nichts</translation> </message> <message> <location line="+10"/> <source>No password</source> <translation>Kein Passwort</translation> </message> <message> <location line="-10"/> <source>PIN</source> <translation>PIN</translation> </message> </context> <context> <name>pki_multi</name> <message> <location filename="../lib/pki_multi.cpp" line="+125"/> <location line="+5"/> <location line="+5"/> <source>Seek failed</source> <translation></translation> </message> </context> <context> <name>pki_pkcs12</name> <message> <location filename="../lib/pki_pkcs12.cpp" line="+112"/> <source>Please enter the password to encrypt the PKCS#12 file</source> <translation>Bitte geben Sie das Passwort zur Verschlüsselung der PKCS#12 Datei an</translation> </message> <message> <location line="+2"/> <source>No key or no Cert and no pkcs12</source> <translation>Kein Schlüssel oder kein Zertifikat und kein PKCS#12</translation> </message> <message> <location line="-68"/> <source>Unable to load the PKCS#12 (pfx) file %1.</source> <translation>Die PKCS#12 (pfx) Datei %1 konnte nicht geladen werden.</translation> </message> <message> <location line="-8"/> <source>Please enter the password to decrypt the PKCS#12 file: %1</source> <translation>Bitte geben Sie das Passwort zur Entschlüsselung der PKCS#12 Datei: %1 ein</translation> </message> <message> <location line="+22"/> <source>The supplied password was wrong (%1)</source> <translation>Das eingegebene Passwort war falsch (%1)</translation> </message> </context> <context> <name>pki_pkcs7</name> <message> <location filename="../lib/pki_pkcs7.cpp" line="+160"/> <source>Unable to load the PKCS#7 file %1. Tried PEM and DER format.</source> <translation>Konnte die PKCS#7 Datei %1 nicht laden. Ist weder im PEM noch im DER Format.</translation> </message> </context> <context> <name>pki_scard</name> <message> <location filename="../lib/pki_scard.cpp" line="+313"/> <source>This Key is already on the token</source> <translation>Der Schlüssel ist bereits auf der SmartCard</translation> </message> <message> <location line="+48"/> <source>Unable to find copied key on the token</source> <translation>Kann den eben kopierten Schlüssel auf der Chipkarte nicht finden</translation> </message> <message> <location line="+110"/> <source>Public Key missmatch. Please re-import card</source> <translation>Öffentlicher Schlüssel passt nicht. Bitte Chipkarte neu importieren</translation> </message> <message> <location line="+53"/> <source>Unable to find generated key on card</source> <translation>Kann den erstellten Schlüssel auf der Karte nicht finden</translation> </message> <message> <location line="+72"/> <location line="+12"/> <source>Failed to find the key on the token</source> <translation>Konnte den Schlüssel auf der Chipkarte nicht finden</translation> </message> <message> <location line="-5"/> <source>Invalid Pin for the token</source> <translation>Ungültige Pin für die Chipkarte</translation> </message> <message> <location line="-363"/> <source>Delete the private key '%1' from the token '%2 (#%3)' ?</source> <translation>Soll der private Schlüssel '%1' von der Chipkarte '%2' mit der Seriennummer %3 gelöscht werden ?</translation> </message> <message> <location line="-182"/> <source>Successfully imported the token key '%1'</source> <translation>Der Chipkartenschlüssel '%1' wurde erfolgreich importiert</translation> </message> <message> <location line="+1"/> <source>Delete the token key '%1'?</source> <translation>Den Chipkartenschlüssel '%1' löschen?</translation> </message> <message> <location line="+1"/> <source>Successfully created the token key '%1'</source> <translation>Der Chipkartenschlüssel '%1' wurde erfolgreich erstellt</translation> </message> <message> <location line="+2"/> <source>Delete the %1 keys: %2?</source> <translation>Die %1 Schlüssel: %2 löschen?</translation> </message> <message> <location line="+229"/> <source>only RSA keys can be stored on tokens</source> <translation>Auf der Chipkarte können nur RSA Schlüssel gespeichert werden</translation> </message> <message> <location line="+56"/> <source>PIN input aborted</source> <translation>PIN Eingabe abgebrochen</translation> </message> <message> <location line="+93"/> <source>Please insert card: %1 %2 [%3] with Serial: %4</source> <translation>Bitte die Chipkarte: %1 %2 [%3] mit Seriennummer: %4 einlegen</translation> </message> <message> <location line="+136"/> <source>Wrong Size %1</source> <translation>Falsche Größe %1</translation> </message> <message> <location line="+11"/> <source>Token %1</source> <translation>%1 Chipkarte</translation> </message> </context> <context> <name>pki_temp</name> <message> <location filename="../lib/pki_temp.cpp" line="+100"/> <source>Delete the XCA template '%1'?</source> <translation>Die XCA Vorlage '%1' löschen?</translation> </message> <message> <location line="+271"/> <source>Template file content error (too small): %1</source> <translation>Template zu klein: %1</translation> </message> <message> <location line="+26"/> <source>Template file content error (bad length) :%1</source> <translation>Templatefile ungültig (länge): %1</translation> </message> <message> <location line="-104"/> <location line="+205"/> <source>Wrong Size %1</source> <translation>Ungültige Größe %1</translation> </message> <message> <location line="-399"/> <source>Successfully imported the XCA template '%1'</source> <translation>Die XCA Vorlage '%1' wurde erfolgreich importiert</translation> </message> <message> <location line="+2"/> <source>Successfully created the XCA template '%1'</source> <translation>Die XCA Vorlage '%1' wurde erfolgreich erstellt</translation> </message> <message> <location line="+2"/> <source>Delete the %1 XCA templates: %2?</source> <translation>Die %1 XCA Vorlagen: %2 löschen?</translation> </message> <message> <location line="+285"/> <source>Template file content error (bad size): %1 </source> <translation>Templatefile ungültig (Größe): %1</translation> </message> </context> <context> <name>pki_x509</name> <message> <location filename="../lib/pki_x509.cpp" line="+801"/> <source>Not trusted</source> <translation>Nicht vertrauenswürdig</translation> </message> <message> <location line="+0"/> <source>Trust inherited</source> <translation>Vertrauensstellung geerbt</translation> </message> <message> <location line="+0"/> <source>Always Trusted</source> <translation>Immer Vertraut</translation> </message> <message> <location line="-330"/> <source>There is no key for signing !</source> <translation>Kein Schlüssel zum Unterschreiben!</translation> </message> <message> <location line="-400"/> <source>Delete the certificate '%1'?</source> <translation>Das Zertifikat '%1' löschen?</translation> </message> <message> <location line="+1"/> <source>Successfully created the certificate '%1'</source> <translation>Das Zertifikat '%1' wurde erfolgreich erstellt</translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificates: %2?</source> <translation>Die %1 Zertifikate: %2 löschen?</translation> </message> <message> <location line="+37"/> <source>Unable to load the certificate in file %1. Tried PEM and DER certificate.</source> <translation>Das Zertifikat aus der Datei %1 konnte nicht geladen werden. Ist weder PEM noch DER.</translation> </message> <message> <location line="+172"/> <source>This certificate is already on the security token</source> <translation>Dieses Zertifikat ist bereits auf der Chipkarte</translation> </message> <message> <location line="+61"/> <source>Delete the certificate '%1' from the token '%2 (#%3)'?</source> <translation>Das Zertifikat '%1' von der Chipkarte '%2 (#%3)' löschen?</translation> </message> <message> <location line="+472"/> <source>CRL expires: %1</source> <translation>CRL ungültig ab: %1</translation> </message> <message> <location line="+14"/> <source>No</source> <translation>Nein</translation> </message> <message> <location line="+2"/> <source>Yes</source> <translation>Ja</translation> </message> <message> <location line="-762"/> <source>Successfully imported the certificate '%1'</source> <translation>Das Zertifikat '%1' wurde erfolgreich importiert</translation> </message> <message> <location line="+438"/> <location line="+484"/> <source>Wrong Size %1</source> <translation>Ungültige Größe %1</translation> </message> </context> <context> <name>pki_x509req</name> <message> <location filename="../lib/pki_x509req.cpp" line="+51"/> <source>Signing key not valid (public key)</source> <translation>Signaturschlüssel ungültig (public key)</translation> </message> <message> <location line="+43"/> <source>Delete the %1 certificate request '%2'?</source> <translation>Den %1 Zertifikatsantrag '%2' löschen?</translation> </message> <message> <location line="-1"/> <source>Successfully imported the %1 certificate request '%2'</source> <translation>Der %1 Zertifikatsantrag '%2' wurde erfolgreich importiert</translation> </message> <message> <location line="+2"/> <source>Successfully created the %1 certificate request '%2'</source> <translation>Der %1 Zertifikatsantrag '%2' wurde erfolgreich erstellt</translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificate requests: %2?</source> <translation>Die %1 Zertifikatsanträge: %2 löschen?</translation> </message> <message> <location line="+39"/> <source>Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC format.</source> <translation>Konnte den Zertifikatsantrag aus der Datei %1 nicht laden. Versuchte Formate PEM, DER und SPKAC.</translation> </message> <message> <location line="+276"/> <source>Signed</source> <translation>Signiert</translation> </message> <message> <location line="+0"/> <source>Unhandled</source> <translation>Unbehandelt</translation> </message> <message> <location line="+43"/> <source>Wrong Size %1</source> <translation>Ungültige Größe %1</translation> </message> </context> <context> <name>v3ext</name> <message> <location filename="../ui/v3ext.ui" line="+51"/> <source>Add</source> <translation>Hinzufügen</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="+32"/> <source>Apply</source> <translation>Übernehmen</translation> </message> <message> <location line="+7"/> <source>Validate</source> <translation>Überprüfen</translation> </message> <message> <location line="+29"/> <source>Cancel</source> <translation>Abbrechen</translation> </message> <message> <location filename="../widgets/v3ext.cpp" line="+189"/> <source>Validation successful: '%1'</source> <translation>Überprüfung erfolgreich: '%1'</translation> </message> <message> <location line="-96"/> <source>An email address or 'copy'</source> <translation>Eine E-Mail adresse oder 'copy'</translation> </message> <message> <location line="+2"/> <source>An email address</source> <translation>Eine email Adresse</translation> </message> <message> <location line="+2"/> <source>a registered ID: OBJECT IDENTIFIER</source> <translation>Eine OID numerisch oder als Text</translation> </message> <message> <location line="+4"/> <source>a uniform resource indicator</source> <translation>Ein Uniform Resource Identifier</translation> </message> <message> <location line="+4"/> <source>a DNS domain name</source> <translation>Ein DNS domain Name</translation> </message> <message> <location line="+2"/> <source>an IP address</source> <translation>Eine IP Adresse</translation> </message> <message> <location line="+8"/> <source>No editing. Only 'copy' allowed here</source> <translation>Kein Editieren. Nur 'copy' möglich, um Subject alternative name vom Aussteller zu kopieren</translation> </message> <message> <location line="-4"/> <source>Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'</source> <translation>Format:<OID>;TYPE Beispiel: '1.2.3.4:UTF8:name'</translation> </message> <message> <location line="+72"/> <source>Validation failed: '%1' %2</source> <translation>Überprüfung fehlgeschlagen: '%1' %2</translation> </message> </context> <context> <name>void</name> <message> <location filename="../lib/db_x509.cpp" line="+241"/> <source>There was no key found for the Certificate: </source> <translation>Es wurde kein Schlüssel gefunden für das Zertifikat: </translation> </message> <message> <location line="+8"/> <source>Import Certificate signing request</source> <translation>Zertifikatsantrag importieren</translation> </message> </context> </TS> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/xca_es.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000252447�11753427512�0015140�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <TS> <context> <name>About</name> <message> <source>Done</source> <translation>Hecho</translation> </message> </context> <context> <name>CaProperties</name> <message> <source>CA Properties</source> <translation>Propiedades de la CA</translation> </message> <message> <source>Use random Serial numbers</source> <translation>Usar números de Serie aleatorios</translation> </message> <message> <source>Days until next CRL issuing</source> <translation type="unfinished"/> </message> <message> <source>Default template</source> <translation>Plantilla predeterminada</translation> </message> <message> <source>Next serial for signing</source> <translation type="unfinished"/> </message> </context> <context> <name>CertDetail</name> <message> <source>Details of the Certificate</source> <translation>Detalles del Certificado</translation> </message> <message> <source>S&tatus</source> <translation>Estado</translation> </message> <message> <source>Serial</source> <translation>Número de serie</translation> </message> <message> <source>The serial number of the certificate</source> <translation>El número de serie del certificado</translation> </message> <message> <source>The internal name of the certificate in the database</source> <translation>El nombre interno del certificado en la base de datos</translation> </message> <message> <source>Internal name</source> <translation>Nombre interno</translation> </message> <message> <source>Signature algorithm</source> <translation>Firma</translation> </message> <message> <source>Signature</source> <translation>Firma</translation> </message> <message> <source>Key</source> <translation>Clave</translation> </message> <message> <source>Fingerprints</source> <translation>Huellas digitales</translation> </message> <message> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <source>MD5</source> <translation>MD5</translation> </message> <message> <source>A SHA-1 hashsum of the certificate</source> <translation type="unfinished"/> </message> <message> <source>An md5 hashsum of the certificate</source> <translation type="unfinished"/> </message> <message> <source>Validity</source> <translation>Validez</translation> </message> <message> <source>The time since the certificate is valid</source> <translation>El momento desde el que el certificado es válido</translation> </message> <message> <source>The time until the certificate is valid</source> <translation>El momento hasta el que el certificado es válido</translation> </message> <message> <source>&Subject</source> <translation>As&unto</translation> </message> <message> <source>&Issuer</source> <translation type="unfinished"/> </message> <message> <source>Attributes</source> <translation>Atributos</translation> </message> <message> <source>&Extensions</source> <translation>&Extensiones</translation> </message> <message> <source>Show config</source> <translation>Mostrar configuración</translation> </message> <message> <source>Show extensions</source> <translation>Mostrar extensiones</translation> </message> <message> <source>Not available</source> <translation>No disponible</translation> </message> <message> <source>Details of the certificate</source> <translation>Detalles del certificado</translation> </message> <message> <source>Signer unknown</source> <translation type="unfinished"/> </message> <message> <source>Self signed</source> <translation type="unfinished"/> </message> <message> <source>Not trusted</source> <translation>No fiable</translation> </message> <message> <source>Trusted</source> <translation>Fiable</translation> </message> <message> <source>Revoked: </source> <translation>Revocado: </translation> </message> <message> <source>Not valid</source> <translation>No válido</translation> </message> <message> <source>Valid</source> <translation>Válido</translation> </message> <message> <source>Details of the certificate signing request</source> <translation>Detalles de la solicitud</translation> </message> </context> <context> <name>CertExtend</name> <message> <source>Certificate renewal</source> <translation>Renovación de certificado</translation> </message> <message> <source>This will create a new certificate as a copy of the old one with a new serial number and adjusted validity values.</source> <translation type="unfinished"/> </message> <message> <source>Validity</source> <translation>Validez</translation> </message> <message> <source>Not before</source> <translation>No antes de</translation> </message> <message> <source>Not after</source> <translation>No después de</translation> </message> <message> <source>Time range</source> <translation>Rango de tiempo</translation> </message> <message> <source>No well-defined expiration</source> <translation type="unfinished"/> </message> <message> <source>Apply</source> <translation>Aplicar</translation> </message> <message> <source>Days</source> <translation>Días</translation> </message> <message> <source>Months</source> <translation>Meses</translation> </message> <message> <source>Years</source> <translation>Años</translation> </message> <message> <source>Midnight</source> <translation>Medianoche</translation> </message> <message> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation type="unfinished"/> </message> <message> <source>Edit times</source> <translation type="unfinished"/> </message> <message> <source>Abort rollout</source> <translation type="unfinished"/> </message> <message> <source>Continue rollout</source> <translation type="unfinished"/> </message> <message> <source>Adjust date and continue</source> <translation type="unfinished"/> </message> <message> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation type="unfinished"/> </message> </context> <context> <name>CertView</name> <message> <source>There was no key found for the Certificate: </source> <translation type="unfinished"/> </message> <message> <source>Import Certificate signing request</source> <translation type="unfinished"/> </message> </context> <context> <name>ClickLabel</name> <message> <source>Double click for details</source> <translation>Haga doble click para obtener detalles</translation> </message> </context> <context> <name>CrlDetail</name> <message> <source>Details of the Revocation list</source> <translation type="unfinished"/> </message> <message> <source>&Status</source> <translation type="unfinished"/> </message> <message> <source>Version</source> <translation type="unfinished"/> </message> <message> <source>Signature</source> <translation>Firma</translation> </message> <message> <source>Signed by</source> <translation type="unfinished"/> </message> <message> <source>Name</source> <translation>Nombre</translation> </message> <message> <source>The internal name of the CRL in the database</source> <translation type="unfinished"/> </message> <message> <source>issuing dates</source> <translation type="unfinished"/> </message> <message> <source>Next Update</source> <translation type="unfinished"/> </message> <message> <source>Last Update</source> <translation type="unfinished"/> </message> <message> <source>&Issuer</source> <translation type="unfinished"/> </message> <message> <source>&Extensions</source> <translation type="unfinished"/> </message> <message> <source>&Revocation list</source> <translation type="unfinished"/> </message> <message> <source>0</source> <translation type="unfinished"/> </message> <message> <source>Serial</source> <translation type="unfinished"/> </message> <message> <source>Revocation</source> <translation type="unfinished"/> </message> <message> <source>Reason</source> <translation type="unfinished"/> </message> <message> <source>Invalidation</source> <translation type="unfinished"/> </message> <message> <source>Failed</source> <translation type="unfinished"/> </message> <message> <source>Unknown signer</source> <translation type="unfinished"/> </message> <message> <source>Verification not possible</source> <translation type="unfinished"/> </message> <message> <source>Unknown certificate</source> <translation type="unfinished"/> </message> </context> <context> <name>ExportCert</name> <message> <source>X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>DER is a binary format of the Certificate PEM is a base64 encoded Certificate PKCS#7 is an official Certificate exchange format PKCS#12 is an encrypted official Key-Certificate exchange format </source> <translation type="unfinished"/> </message> <message> <source>Please enter the filename for the certificate.</source> <translation type="unfinished"/> </message> <message> <source>Certificate export</source> <translation type="unfinished"/> </message> </context> <context> <name>ExportDer</name> <message> <source>All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>DER is a binary format PEM is a base64 encoded DER file </source> <translation type="unfinished"/> </message> </context> <context> <name>ExportDialog</name> <message> <source>...</source> <translation>...</translation> </message> <message> <source>Filename</source> <translation type="unfinished"/> </message> <message> <source>Please enter the filename</source> <translation type="unfinished"/> </message> <message> <source>Export Format</source> <translation type="unfinished"/> </message> <message> <source>The file: '%1' already exists!</source> <translation type="unfinished"/> </message> <message> <source>Overwrite</source> <translation type="unfinished"/> </message> <message> <source>Do not overwrite</source> <translation type="unfinished"/> </message> </context> <context> <name>ExportKey</name> <message> <source>When exporting the private key it should be encrypted.</source> <translation type="unfinished"/> </message> <message> <source>When exporting the private part, it should be encrypted.</source> <translation type="unfinished"/> </message> <message> <source>E&xport the private part of the Key too</source> <translation type="unfinished"/> </message> <message> <source>Export as PKCS#8</source> <translation type="unfinished"/> </message> <message> <source>&Encrypt the Key with a password</source> <translation type="unfinished"/> </message> <message> <source>Private keys ( *.pem *.der *.pk8 );;All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>DER is a binary format of the key without encryption PEM is a base64 encoded key with optional encryption PKCS#8 is an encrypted official Key-exchange format</source> <translation>DER es un formato binario sin cifrado PEM es un formato texto bas64 con cifrado opcional PKCS#8 es un formato estandar de intercambio de claves</translation> </message> <message> <source>Please enter the filename for the key.</source> <translation>Introduzca nombre de fichero que contendrá la clave.</translation> </message> <message> <source>Public key export</source> <translation type="unfinished"/> </message> <message> <source>Key export</source> <translation>Exportar clave</translation> </message> </context> <context> <name>Help</name> <message> <source><<</source> <translation type="unfinished"/> </message> <message> <source>>></source> <translation type="unfinished"/> </message> <message> <source>&Done</source> <translation type="unfinished"/> </message> </context> <context> <name>ImportMulti</name> <message> <source>Import PKI Items</source> <translation type="unfinished"/> </message> <message> <source>Import &All</source> <translation type="unfinished"/> </message> <message> <source>&Import</source> <translation type="unfinished"/> </message> <message> <source>&Done</source> <translation type="unfinished"/> </message> <message> <source>&Remove from list</source> <translation type="unfinished"/> </message> <message> <source>Details</source> <translation type="unfinished"/> </message> <message> <source>Delete from token</source> <translation type="unfinished"/> </message> <message> <source>Rename on token</source> <translation type="unfinished"/> </message> <message> <source> Name: %1 Model: %2 Serial: %3</source> <translation type="unfinished"/> </message> <message> <source>Manage security token</source> <translation type="unfinished"/> </message> <message> <source>The type of the Item '%1' is not recognized</source> <translation type="unfinished"/> </message> <message> <source>Details of the item '%1' cannot be shown</source> <translation type="unfinished"/> </message> <message> <source>The type of the item '%1' is not recognized</source> <translation type="unfinished"/> </message> <message> <source>The file '%1' did not contain PKI data</source> <translation type="unfinished"/> </message> <message> <source>The %1 files: '%2' did not contain PKI data</source> <translation type="unfinished"/> </message> </context> <context> <name>KeyDetail</name> <message> <source>Name</source> <translation>Nombre</translation> </message> <message> <source>The internal name of the key used by xca</source> <translation type="unfinished"/> </message> <message> <source>Security token</source> <translation type="unfinished"/> </message> <message> <source>Manufacturer</source> <translation type="unfinished"/> </message> <message> <source>Serial</source> <translation type="unfinished"/> </message> <message> <source>Key</source> <translation type="unfinished"/> </message> <message> <source>Public Exponent</source> <translation>Exponente público</translation> </message> <message> <source>Keysize</source> <translation>Tamaño de clave</translation> </message> <message> <source>Private Exponent</source> <translation>Exponente secreto</translation> </message> <message> <source>Modulus</source> <translation>Módulo</translation> </message> <message> <source>Details of the %1 key</source> <translation type="unfinished"/> </message> <message> <source>Not available</source> <translation>Disponible</translation> </message> <message> <source>Token</source> <translation type="unfinished"/> </message> <message> <source>Security token ID:%1</source> <translation type="unfinished"/> </message> <message> <source>Available</source> <translation>Disponible</translation> </message> <message> <source>Sub prime</source> <translation type="unfinished"/> </message> <message> <source>Public key</source> <translation type="unfinished"/> </message> <message> <source>Private key</source> <translation>Exponente secreto</translation> </message> <message> <source>Curve name</source> <translation type="unfinished"/> </message> <message> <source>Unknown key</source> <translation type="unfinished"/> </message> </context> <context> <name>MainWindow</name> <message> <source>Private Keys</source> <translation type="unfinished"/> </message> <message> <source>&New Key</source> <translation type="unfinished"/> </message> <message> <source>&Export</source> <translation type="unfinished"/> </message> <message> <source>&Import</source> <translation>Importar</translation> </message> <message> <source>Import PFX (PKCS#12)</source> <translation type="unfinished"/> </message> <message> <source>&Show Details</source> <translation type="unfinished"/> </message> <message> <source>&Delete</source> <translation type="unfinished"/> </message> <message> <source>Certificate signing requests</source> <translation type="unfinished"/> </message> <message> <source>&New Request</source> <translation type="unfinished"/> </message> <message> <source>Certificates</source> <translation type="unfinished"/> </message> <message> <source>&New Certificate</source> <translation type="unfinished"/> </message> <message> <source>Import &PKCS#12</source> <translation type="unfinished"/> </message> <message> <source>Import P&KCS#7</source> <translation type="unfinished"/> </message> <message> <source>Plain View</source> <translation type="unfinished"/> </message> <message> <source>Templates</source> <translation type="unfinished"/> </message> <message> <source>&New template</source> <translation type="unfinished"/> </message> <message> <source>Ch&ange Template</source> <translation type="unfinished"/> </message> <message> <source>Revocation lists</source> <translation type="unfinished"/> </message> <message> <source>Using or exporting private keys will not be possible without providing the correct password</source> <translation type="unfinished"/> </message> <message> <source>Database</source> <translation type="unfinished"/> </message> <message> <source>No deleted items found</source> <translation type="unfinished"/> </message> <message> <source>&File</source> <translation type="unfinished"/> </message> <message> <source>&New DataBase</source> <translation type="unfinished"/> </message> <message> <source>&Open DataBase</source> <translation type="unfinished"/> </message> <message> <source>Generate DH parameter</source> <translation type="unfinished"/> </message> <message> <source>Set as default DataBase</source> <translation type="unfinished"/> </message> <message> <source>&Close DataBase</source> <translation type="unfinished"/> </message> <message> <source>&Dump DataBase</source> <translation type="unfinished"/> </message> <message> <source>C&hange DataBase password</source> <translation type="unfinished"/> </message> <message> <source>&Import old db_dump</source> <translation type="unfinished"/> </message> <message> <source>&Undelete items</source> <translation type="unfinished"/> </message> <message> <source>Options</source> <translation type="unfinished"/> </message> <message> <source>Exit</source> <translation type="unfinished"/> </message> <message> <source>I&mport</source> <translation type="unfinished"/> </message> <message> <source>Keys</source> <translation type="unfinished"/> </message> <message> <source>Requests</source> <translation type="unfinished"/> </message> <message> <source>PKCS#12</source> <translation type="unfinished"/> </message> <message> <source>PKCS#7</source> <translation type="unfinished"/> </message> <message> <source>Template</source> <translation type="unfinished"/> </message> <message> <source>Revocation list</source> <translation type="unfinished"/> </message> <message> <source>PEM file</source> <translation type="unfinished"/> </message> <message> <source>paste PEM file</source> <translation type="unfinished"/> </message> <message> <source>&Token</source> <translation type="unfinished"/> </message> <message> <source>&Manage Security token</source> <translation type="unfinished"/> </message> <message> <source>&Init Security token</source> <translation type="unfinished"/> </message> <message> <source>&Change PIN</source> <translation type="unfinished"/> </message> <message> <source>Change &SO PIN</source> <translation type="unfinished"/> </message> <message> <source>Init PIN</source> <translation type="unfinished"/> </message> <message> <source>&Help</source> <translation type="unfinished"/> </message> <message> <source>&Content</source> <translation type="unfinished"/> </message> <message> <source>&About</source> <translation type="unfinished"/> </message> <message> <source>Donations</source> <translation type="unfinished"/> </message> <message> <source>Database dump ( *.dump );;All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>Import password</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password of the old database</source> <translation type="unfinished"/> </message> <message> <source>Password verification error. Ignore keys ?</source> <translation type="unfinished"/> </message> <message> <source>Import anyway</source> <translation type="unfinished"/> </message> <message> <source>Cancel</source> <translation>Cancelar</translation> </message> <message> <source>no such option: %1</source> <translation type="unfinished"/> </message> <message> <source>Import PEM data</source> <translation type="unfinished"/> </message> <message> <source>Please enter the original SO PIN (PUK) of the token '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the new SO PIN (PUK) of the token '%1'</source> <translation type="unfinished"/> </message> <message> <source>The new label of the token '%1'</source> <translation type="unfinished"/> </message> <message> <source>The token '%1' did not contain any keys or certificates</source> <translation type="unfinished"/> </message> <message> <source>New Password</source> <translation type="unfinished"/> </message> <message> <source>Please enter the new password to encrypt your private keys in the database-file</source> <translation type="unfinished"/> </message> <message> <source>Please enter a password, that will be used to encrypt your private keys in the database file: %1</source> <translation type="unfinished"/> </message> <message> <source>Password verify error, please try again</source> <translation>Contraeña incorrecta, inténtelo de nuevo</translation> </message> <message> <source>Password</source> <translation>Contraseña</translation> </message> <message> <source>Please enter the password for unlocking the database: %1</source> <translation type="unfinished"/> </message> <message> <source>The following error occured:</source> <translation type="unfinished"/> </message> <message> <source>Copy to Clipboard</source> <translation type="unfinished"/> </message> <message> <source>Diffie-Hellman parameters are needed for different applications, but not handled by XCA. Please enter the DH parameter bits</source> <translation type="unfinished"/> </message> <message> <source>Error opening file: '%1': %2</source> <translation type="unfinished"/> </message> </context> <context> <name>NewCrl</name> <message> <source>Create CRL</source> <translation type="unfinished"/> </message> <message> <source>Dates</source> <translation type="unfinished"/> </message> <message> <source>last update</source> <translation type="unfinished"/> </message> <message> <source>next update</source> <translation type="unfinished"/> </message> <message> <source>Days</source> <translation type="unfinished"/> </message> <message> <source>Months</source> <translation type="unfinished"/> </message> <message> <source>Years</source> <translation type="unfinished"/> </message> <message> <source>Midnight</source> <translation type="unfinished"/> </message> <message> <source>Apply</source> <translation type="unfinished"/> </message> <message> <source>Hashing algorithm</source> <translation type="unfinished"/> </message> <message> <source>Extensions</source> <translation type="unfinished"/> </message> <message> <source>Authority key identifier</source> <translation type="unfinished"/> </message> <message> <source>Subject alternative name</source> <translation type="unfinished"/> </message> <message> <source>CRL Number</source> <translation type="unfinished"/> </message> <message> <source>Revokation reasons</source> <translation type="unfinished"/> </message> </context> <context> <name>NewKey</name> <message> <source>New key</source> <translation type="unfinished"/> </message> <message> <source>Please give a name to the new key and select the desired keysize</source> <translation type="unfinished"/> </message> <message> <source>Key properties</source> <translation type="unfinished"/> </message> <message> <source>Name</source> <translation>Nombre</translation> </message> <message> <source>The internal name of the new key</source> <translation type="unfinished"/> </message> <message> <source>New Key</source> <translation>Nueva clave</translation> </message> <message> <source>Curve</source> <translation type="unfinished"/> </message> <message> <source>Keysize</source> <translation>Tamaño de clave</translation> </message> <message> <source>Usually 1024 or 2048 bit keys are used</source> <translation type="unfinished"/> </message> <message> <source>Keytype</source> <translation type="unfinished"/> </message> <message> <source>Create</source> <translation type="unfinished"/> </message> </context> <context> <name>NewX509</name> <message> <source>Create</source> <translation type="unfinished"/> </message> <message> <source>Source</source> <translation type="unfinished"/> </message> <message> <source>Signing request</source> <translation type="unfinished"/> </message> <message> <source>A certificate signing request can be signed, even if the private key of the request is not available. This is the intention of a CSR: Getting signed by a CA certificate, whoes certificate of course must be in the database Of course you need the private key of the CSR if you want to create a self-signed cert from it.</source> <translation type="unfinished"/> </message> <message> <source>Show request</source> <translation type="unfinished"/> </message> <message> <source>Sign this Certificate signing &request</source> <translation type="unfinished"/> </message> <message> <source>Copy extensions from the request</source> <translation type="unfinished"/> </message> <message> <source>Modify subject of the request</source> <translation type="unfinished"/> </message> <message> <source>Signing</source> <translation type="unfinished"/> </message> <message> <source>Create a &self signed certificate with the serial</source> <translation type="unfinished"/> </message> <message> <source>If you leave this blank the serial 00 will be used</source> <translation type="unfinished"/> </message> <message> <source>1</source> <translation type="unfinished"/> </message> <message> <source>Use &this Certificate for signing</source> <translation type="unfinished"/> </message> <message> <source>All certificates in your database that can create valid signatures</source> <translation type="unfinished"/> </message> <message> <source>This list contains all certificates with the CA-flag set to true and whoes private key is present in the key-database. If this list is disabled, you only can create a self-signed certificate.</source> <translation type="unfinished"/> </message> <message> <source>Signature algorithm</source> <translation>Firma</translation> </message> <message> <source>Template for the new certificate</source> <translation type="unfinished"/> </message> <message> <source>All available templates</source> <translation type="unfinished"/> </message> <message> <source>This list contains all templates from the toplevel template Tab</source> <translation type="unfinished"/> </message> <message> <source>Apply extensions</source> <translation type="unfinished"/> </message> <message> <source>Apply subject</source> <translation type="unfinished"/> </message> <message> <source>Apply all</source> <translation type="unfinished"/> </message> <message> <source>Subject</source> <translation>Sujeto</translation> </message> <message> <source>Organisation</source> <translation type="unfinished"/> </message> <message> <source>This name is only used internally and does not appear in the resulting certificate</source> <translation type="unfinished"/> </message> <message> <source>Must be exactly 2 letter of size (DE, UK)</source> <translation type="unfinished"/> </message> <message> <source>Country code</source> <translation type="unfinished"/> </message> <message> <source>State or Province</source> <translation type="unfinished"/> </message> <message> <source>Locality</source> <translation type="unfinished"/> </message> <message> <source>Organisational unit</source> <translation type="unfinished"/> </message> <message> <source>E-Mail address</source> <translation type="unfinished"/> </message> <message> <source>Internal name</source> <translation type="unfinished"/> </message> <message> <source>Common name</source> <translation type="unfinished"/> </message> <message> <source>Add</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> <message> <source>Private key</source> <translation>Exponente secreto</translation> </message> <message> <source>This list only contains unused keys</source> <translation type="unfinished"/> </message> <message> <source>Used keys too</source> <translation type="unfinished"/> </message> <message> <source>&Generate a new key</source> <translation type="unfinished"/> </message> <message> <source>Extensions</source> <translation type="unfinished"/> </message> <message> <source>Basic constraints</source> <translation type="unfinished"/> </message> <message> <source>Type</source> <translation type="unfinished"/> </message> <message> <source>If this will become a CA certificate or not</source> <translation type="unfinished"/> </message> <message> <source>Set this to TRUE if you want to create a CA certificate that signs other certificates. This is always set to FALSE for client or server certificates. In most cases self-signed certificates are CA certificates. Self-signed non-CA certificates are unusual although they are possible.</source> <translation type="unfinished"/> </message> <message> <source>Not defined</source> <translation type="unfinished"/> </message> <message> <source>Certification Authority</source> <translation type="unfinished"/> </message> <message> <source>End Entity</source> <translation type="unfinished"/> </message> <message> <source>Path length</source> <translation type="unfinished"/> </message> <message> <source>How much CAs may be below this.</source> <translation type="unfinished"/> </message> <message> <source>If this is left empty the pathlen is not included in the certificate. Otherwise it distinguishes the count of chained CA certificates below this one. A pathlen of 0 means, that this certificate may not issue other sub-CA certificates. Although it can do it, all chain-checking algorithms in e.g. your browser or openssl will (should) fail.</source> <translation type="unfinished"/> </message> <message> <source>The basic constraints should always be critical</source> <translation type="unfinished"/> </message> <message> <source>Key identifier</source> <translation type="unfinished"/> </message> <message> <source>Creates a hash of the key following the PKIX guidelines</source> <translation type="unfinished"/> </message> <message> <source>Copy the Subject Key Identifier from the issuer</source> <translation type="unfinished"/> </message> <message> <source>If this box is checked an attempt is made to copy the subject key identifier from the signing certificate. It also copies the issuer and serial number from the issuer certificate. Normally this will only be done if the keyid option fails.</source> <translation type="unfinished"/> </message> <message> <source>Validity</source> <translation>Validez</translation> </message> <message> <source>Not before</source> <translation type="unfinished"/> </message> <message> <source>Not after</source> <translation type="unfinished"/> </message> <message> <source>Time range</source> <translation type="unfinished"/> </message> <message> <source>Days</source> <translation type="unfinished"/> </message> <message> <source>Months</source> <translation type="unfinished"/> </message> <message> <source>Years</source> <translation type="unfinished"/> </message> <message> <source>Apply</source> <translation type="unfinished"/> </message> <message> <source>Set the time to 00:00:00 and 23:59:59 respectively</source> <translation type="unfinished"/> </message> <message> <source>Midnight</source> <translation type="unfinished"/> </message> <message> <source>No well-defined expiration</source> <translation type="unfinished"/> </message> <message> <source>Authority Info Access</source> <translation type="unfinished"/> </message> <message> <source>CRL distribution point</source> <translation type="unfinished"/> </message> <message> <source>issuer alternative name</source> <translation type="unfinished"/> </message> <message> <source>URI:</source> <translation type="unfinished"/> </message> <message> <source>This is a multi-valued extension that supports all the literal options of subject alternative name. Of the few software packages that currentlyi nterpret this extension most only interpret the URI option. Currently each option will set a new DistributionPoint with the fullName field set to the given value. Other fields like cRLissuer and reasons cannot currently be set or displayed: at this time no examples were available that used these fields. If you see this extension with <UNSUPPORTED> when you attempt to print it out or it doesn't appear to display correctly then let steve know, including the certificate (mail steve at openssl dot org) . Examples: URI:http://www.myhost.com/myca.crl URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl</source> <translation type="unfinished"/> </message> <message> <source>can be altered by the file "aia.txt"</source> <translation type="unfinished"/> </message> <message> <source>Edit</source> <translation type="unfinished"/> </message> <message> <source>DNS: IP: URI: email: RID:</source> <translation type="unfinished"/> </message> <message> <source>The authority information access extension gives details about how to access certain information relating to the CA. Its syntax is accessOID;location where 'location' has the same syntax as subject alternative name (except that email:copy is not supported). accessOID can be any valid OID but only certain values are meaningful for example OCSP and caIssuers. OCSP gives the location of an OCSP responder: this is used by Netscape PSM and other software. Example: OCSP;URI:http://ocsp.my.host/ caIssuers;URI:http://my.ca/ca.html</source> <translation type="unfinished"/> </message> <message> <source>The subject alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name) , RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation type="unfinished"/> </message> <message> <source>subject alternative name</source> <translation type="unfinished"/> </message> <message> <source>The issuer alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name), RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation type="unfinished"/> </message> <message> <source>Key usage</source> <translation type="unfinished"/> </message> <message> <source>Extended key usage</source> <translation type="unfinished"/> </message> <message> <source>Netscape</source> <translation type="unfinished"/> </message> <message> <source>CA Revocation URL</source> <translation type="unfinished"/> </message> <message> <source>Revocation URL</source> <translation type="unfinished"/> </message> <message> <source>SSL server name</source> <translation type="unfinished"/> </message> <message> <source>Certificate renewal URL</source> <translation type="unfinished"/> </message> <message> <source>Comment</source> <translation type="unfinished"/> </message> <message> <source>CA policy URL</source> <translation type="unfinished"/> </message> <message> <source>Base URL</source> <translation type="unfinished"/> </message> <message> <source>If you know a more pretty one tell me</source> <translation type="unfinished"/> </message> <message> <source>Advanced</source> <translation type="unfinished"/> </message> <message> <source>Validate</source> <translation type="unfinished"/> </message> <message> <source>Create a &self signed certificate with a MD5-hashed QA serial</source> <translation type="unfinished"/> </message> <message> <source>Create Certificate signing request</source> <translation type="unfinished"/> </message> <message> <source>minimum size: %1</source> <translation type="unfinished"/> </message> <message> <source>maximum size: %1</source> <translation type="unfinished"/> </message> <message> <source>only a-z A-Z 0-9 '()+,-./:=?</source> <translation type="unfinished"/> </message> <message> <source>only 7-bit clean characters</source> <translation type="unfinished"/> </message> <message> <source>XCA template</source> <translation type="unfinished"/> </message> <message> <source>Create x509 Certificate</source> <translation type="unfinished"/> </message> <message> <source>From PKCS#10 request</source> <translation type="unfinished"/> </message> <message> <source>Other Tabs</source> <translation type="unfinished"/> </message> <message> <source>Advanced Tab</source> <translation type="unfinished"/> </message> <message> <source>Errors</source> <translation type="unfinished"/> </message> <message> <source>Abort rollout</source> <translation type="unfinished"/> </message> <message> <source>The following length restrictions of RFC3280 are violated:</source> <translation type="unfinished"/> </message> <message> <source>Edit subject</source> <translation type="unfinished"/> </message> <message> <source>Continue rollout</source> <translation type="unfinished"/> </message> <message> <source>The verification of the Certificate request failed. The rollout should be aborted.</source> <translation type="unfinished"/> </message> <message> <source>Continue anyway</source> <translation type="unfinished"/> </message> <message> <source>The internal name and the common name are empty. Please set at least the internal name.</source> <translation type="unfinished"/> </message> <message> <source>Edit name</source> <translation type="unfinished"/> </message> <message> <source>There is no Key selected for signing.</source> <translation type="unfinished"/> </message> <message> <source>Select key</source> <translation type="unfinished"/> </message> <message> <source>The following distinguished name entries are empty: %1 though you have declared them as mandatory in the options menu.</source> <translation type="unfinished"/> </message> <message> <source>The key you selected for signing is not a private one.</source> <translation type="unfinished"/> </message> <message> <source>Select other signer</source> <translation type="unfinished"/> </message> <message> <source>Select other key</source> <translation type="unfinished"/> </message> <message> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation type="unfinished"/> </message> <message> <source>Edit dates</source> <translation type="unfinished"/> </message> <message> <source>Adjust date and continue</source> <translation type="unfinished"/> </message> <message> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation type="unfinished"/> </message> <message> <source>The certificate will be out of date before it becomes valid. You most probably mixed up both dates.</source> <translation type="unfinished"/> </message> <message> <source>The certificate contains duplicated extensions. Check the validation on the advanced tab.</source> <translation type="unfinished"/> </message> <message> <source>Edit extensions</source> <translation type="unfinished"/> </message> <message> <source>Configfile error on line %1 </source> <translation type="unfinished"/> </message> </context> <context> <name>Options</name> <message> <source>XCA Options</source> <translation type="unfinished"/> </message> <message> <source>Mandatory subject entries</source> <translation type="unfinished"/> </message> <message> <source>Add</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> <message> <source>Default hash algorithm</source> <translation type="unfinished"/> </message> <message> <source>String types</source> <translation type="unfinished"/> </message> <message> <source>Suppress success messages</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 provider</source> <translation type="unfinished"/> </message> <message> <source>Remove</source> <translation type="unfinished"/> </message> <message> <source>Printable string or UTF8 (default)</source> <translation type="unfinished"/> </message> <message> <source>PKIX recommendation in RFC2459</source> <translation type="unfinished"/> </message> <message> <source>No BMP strings, only printable and T61</source> <translation type="unfinished"/> </message> <message> <source>UTF8 strings only (RFC2459)</source> <translation type="unfinished"/> </message> <message> <source>All strings</source> <translation type="unfinished"/> </message> <message> <source>Load failed</source> <translation type="unfinished"/> </message> </context> <context> <name>PwDialog</name> <message> <source>Password</source> <translation type="unfinished"/> </message> <message> <source>The password is parsed as 2-digit hex code. It must have an equal number of digits (0-9 and a-f)</source> <translation type="unfinished"/> </message> <message> <source>Take as HEX string</source> <translation type="unfinished"/> </message> <message> <source>Repeat %1</source> <translation type="unfinished"/> </message> <message> <source>%1 missmatch</source> <translation type="unfinished"/> </message> <message> <source>Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it must consist of an even number of characters</source> <translation type="unfinished"/> </message> <message> <source>E&xit</source> <translation type="unfinished"/> </message> </context> <context> <name>QObject</name> <message> <source>Undefined</source> <translation type="unfinished"/> </message> <message> <source>DB: Rename: '%1' already in use</source> <translation type="unfinished"/> </message> <message> <source>DB: Entry to rename not found: %1</source> <translation type="unfinished"/> </message> <message> <source>DB: Write error %1 - %2</source> <translation type="unfinished"/> </message> <message> <source>Out of data</source> <translation type="unfinished"/> </message> <message> <source>Error finding endmarker of string</source> <translation type="unfinished"/> </message> <message> <source>Out of Memory at %1:%2</source> <translation type="unfinished"/> </message> <message> <source>All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;</source> <translation type="unfinished"/> </message> <message> <source>Import RSA key</source> <translation type="unfinished"/> </message> <message> <source>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;</source> <translation type="unfinished"/> </message> <message> <source>Import Request</source> <translation type="unfinished"/> </message> <message> <source>Certificates ( *.pem *.der *.crt *.cer );;</source> <translation type="unfinished"/> </message> <message> <source>Import X.509 Certificate</source> <translation type="unfinished"/> </message> <message> <source>PKCS#7 data ( *.p7s *.p7m *.p7b );;</source> <translation type="unfinished"/> </message> <message> <source>Import PKCS#7 Certificates</source> <translation type="unfinished"/> </message> <message> <source>PKCS#12 Certificates ( *.p12 *.pfx );;</source> <translation type="unfinished"/> </message> <message> <source>Import PKCS#12 Private Certificate</source> <translation type="unfinished"/> </message> <message> <source>XCA templates ( *.xca );;</source> <translation type="unfinished"/> </message> <message> <source>Import XCA Templates</source> <translation type="unfinished"/> </message> <message> <source>Revocation lists ( *.pem *.der *.crl );;</source> <translation type="unfinished"/> </message> <message> <source>Import Certificate Revocation List</source> <translation type="unfinished"/> </message> <message> <source>XCA Databases ( *.xdb );;</source> <translation type="unfinished"/> </message> <message> <source>Open XCA Database</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 library ( *.dll );;</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 library ( *.dylib *.so );;</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 library ( *.so );;</source> <translation type="unfinished"/> </message> <message> <source>Open PKCS#11 shared library</source> <translation type="unfinished"/> </message> <message> <source>PEM files ( *.pem );;</source> <translation type="unfinished"/> </message> <message> <source>Load PEM encoded file</source> <translation type="unfinished"/> </message> <message> <source>Please enter the PIN on the PinPad</source> <translation type="unfinished"/> </message> <message> <source>Please enter the SO PIN (PUK) of the token %1</source> <translation type="unfinished"/> </message> <message> <source>Please enter the PIN of the token %1</source> <translation type="unfinished"/> </message> <message> <source>No Security token found</source> <translation type="unfinished"/> </message> <message> <source>Select</source> <translation type="unfinished"/> </message> <message> <source>Please enter the new SO PIN (PUK) for the token: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the new PIN for the token: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Required PIN size: %1 - %2</source> <translation type="unfinished"/> </message> <message> <source>Failed to open PKCS11 library: %1</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 function '%1' failed: %2</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 function '%1' failed: %2 In library %3 %4</source> <translation type="unfinished"/> </message> <message> <source>Invalid</source> <translation type="unfinished"/> </message> <message> <source>%1 is shorter than %2 bytes: '%3'</source> <translation type="unfinished"/> </message> <message> <source>%1 is longer than %2 bytes: '%3'</source> <translation type="unfinished"/> </message> </context> <context> <name>Revoke</name> <message> <source>Revokation details</source> <translation type="unfinished"/> </message> <message> <source>Invalid since</source> <translation type="unfinished"/> </message> <message> <source>Revokation reason</source> <translation type="unfinished"/> </message> </context> <context> <name>SelectToken</name> <message> <source>Select Token</source> <translation type="unfinished"/> </message> <message> <source>Security token</source> <translation type="unfinished"/> </message> <message> <source>Please select the security token</source> <translation type="unfinished"/> </message> </context> <context> <name>TrustState</name> <message> <source>Set trustment of the Certificate</source> <translation type="unfinished"/> </message> <message> <source>Trustment</source> <translation type="unfinished"/> </message> <message> <source>&Never trust this certificate</source> <translation type="unfinished"/> </message> <message> <source>Only &trust this certificate, if we trust the signer</source> <translation type="unfinished"/> </message> <message> <source>&Always trust this certificate</source> <translation type="unfinished"/> </message> </context> <context> <name>Validity</name> <message> <source>yyyy-MM-dd hh:mm</source> <translation type="unfinished"/> </message> </context> <context> <name>db_base</name> <message> <source>Internal name</source> <translation type="unfinished"/> </message> <message> <source>Reset</source> <translation type="unfinished"/> </message> <message> <source>Subject entries</source> <translation type="unfinished"/> </message> <message> <source>Paste PEM data</source> <translation type="unfinished"/> </message> <message> <source>Columns</source> <translation type="unfinished"/> </message> </context> <context> <name>db_crl</name> <message> <source>Signer</source> <translation type="unfinished"/> </message> <message> <source>Internal name of the signer</source> <translation type="unfinished"/> </message> <message> <source>No. revoked</source> <translation type="unfinished"/> </message> <message> <source>Number of revoked certificates</source> <translation type="unfinished"/> </message> <message> <source>Last update</source> <translation type="unfinished"/> </message> <message> <source>Next update</source> <translation type="unfinished"/> </message> <message> <source>CRL number</source> <translation type="unfinished"/> </message> <message> <source>The revokation list already exists in the database as: '%1' and so it was not imported</source> <translation type="unfinished"/> </message> <message> <source>CRL ( *.pem *.der *.crl )</source> <translation type="unfinished"/> </message> <message> <source>Revokation list export</source> <translation type="unfinished"/> </message> <message> <source>Import</source> <translation>Importar</translation> </message> <message> <source>Rename</source> <translation type="unfinished"/> </message> <message> <source>Export</source> <translation type="unfinished"/> </message> <message> <source>Clipboard</source> <translation type="unfinished"/> </message> <message> <source>File</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> </context> <context> <name>db_key</name> <message> <source>Type</source> <translation type="unfinished"/> </message> <message> <source>Size</source> <translation type="unfinished"/> </message> <message> <source>Use</source> <translation type="unfinished"/> </message> <message> <source>Password</source> <translation>Contraseña</translation> </message> <message> <source>The key is already in the database as: '%1' and is not going to be imported</source> <translation type="unfinished"/> </message> <message> <source>The database already contains the public part of the imported key as '%1 and will be completed by the new, private part of the key</source> <translation type="unfinished"/> </message> <message> <source>Key size too small !</source> <translation type="unfinished"/> </message> <message> <source>You are sure to create a key of the size: %1 ?</source> <translation type="unfinished"/> </message> <message> <source>Shall the original key '%1' be replaced by the key on the token? This will delete the key '%1' and make it unexportable</source> <translation type="unfinished"/> </message> <message> <source>New Key</source> <translation>Nueva clave</translation> </message> <message> <source>Import</source> <translation>Importar</translation> </message> <message> <source>Rename</source> <translation type="unfinished"/> </message> <message> <source>Show Details</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> <message> <source>Export</source> <translation>Exportar</translation> </message> <message> <source>Change password</source> <translation>Cambiar contraseña</translation> </message> <message> <source>Reset password</source> <translation>Restablecer la contraseña</translation> </message> <message> <source>Change PIN</source> <translation>Cambiar PIN</translation> </message> <message> <source>Init PIN with SO PIN (PUK)</source> <translation type="unfinished"/> </message> <message> <source>Change SO PIN (PUK)</source> <translation type="unfinished"/> </message> <message> <source>Store on Security token</source> <translation type="unfinished"/> </message> <message> <source>Tried to change password of a token</source> <translation type="unfinished"/> </message> <message> <source>Tried to change PIN of a key</source> <translation type="unfinished"/> </message> <message> <source>Tried to init PIN of a key</source> <translation type="unfinished"/> </message> <message> <source>Tried to change SO PIN of a key</source> <translation type="unfinished"/> </message> </context> <context> <name>db_temp</name> <message> <source>Type</source> <translation type="unfinished"/> </message> <message> <source>Bad template: %1</source> <translation type="unfinished"/> </message> <message> <source>Nothing</source> <translation type="unfinished"/> </message> <message> <source>Preset Template values</source> <translation type="unfinished"/> </message> <message> <source>copy</source> <translation type="unfinished"/> </message> <message> <source>Save template as</source> <translation type="unfinished"/> </message> <message> <source>XCA templates ( *.xca);; All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>New Template</source> <translation type="unfinished"/> </message> <message> <source>Import</source> <translation>Importar</translation> </message> <message> <source>Rename</source> <translation type="unfinished"/> </message> <message> <source>Export</source> <translation>Importar</translation> </message> <message> <source>Change</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> <message> <source>Duplicate</source> <translation type="unfinished"/> </message> <message> <source>Create certificate</source> <translation type="unfinished"/> </message> <message> <source>Create request</source> <translation type="unfinished"/> </message> </context> <context> <name>db_x509</name> <message> <source>CA</source> <translation type="unfinished"/> </message> <message> <source>reflects the basic Constraints extension</source> <translation type="unfinished"/> </message> <message> <source>Serial</source> <translation type="unfinished"/> </message> <message> <source>md5 fingerprint</source> <translation type="unfinished"/> </message> <message> <source>sha1 fingerprint</source> <translation type="unfinished"/> </message> <message> <source>Start date</source> <translation type="unfinished"/> </message> <message> <source>not Before</source> <translation type="unfinished"/> </message> <message> <source>Expiry date</source> <translation type="unfinished"/> </message> <message> <source>not After</source> <translation type="unfinished"/> </message> <message> <source>Trust state</source> <translation type="unfinished"/> </message> <message> <source>Revocation</source> <translation type="unfinished"/> </message> <message> <source>Plain View</source> <translation type="unfinished"/> </message> <message> <source>Tree View</source> <translation type="unfinished"/> </message> <message> <source>The certificate already exists in the database as: '%1' and so it was not imported</source> <translation type="unfinished"/> </message> <message> <source>Invalid public key</source> <translation type="unfinished"/> </message> <message> <source>Please enter the new hexadecimal secret number for the QA process.</source> <translation type="unfinished"/> </message> <message> <source>The QA process has been terminated by the user.</source> <translation type="unfinished"/> </message> <message> <source>The key you selected for signing is not a private one.</source> <translation type="unfinished"/> </message> <message> <source>Store the certificate to the key on the token '%1 (#%2)' ?</source> <translation type="unfinished"/> </message> <message> <source>New Certificate</source> <translation type="unfinished"/> </message> <message> <source>Import</source> <translation>Importar</translation> </message> <message> <source>Import PKCS#12</source> <translation type="unfinished"/> </message> <message> <source>Import from PKCS#7</source> <translation type="unfinished"/> </message> <message> <source>Rename</source> <translation type="unfinished"/> </message> <message> <source>Show Details</source> <translation type="unfinished"/> </message> <message> <source>Extract public Key</source> <translation type="unfinished"/> </message> <message> <source>Export</source> <translation>Exportar</translation> </message> <message> <source>Clipboard</source> <translation>Portapapeles</translation> </message> <message> <source>File</source> <translation>Archivo</translation> </message> <message> <source>Request</source> <translation>Solicitud</translation> </message> <message> <source>Security token</source> <translation type="unfinished"/> </message> <message> <source>Other token</source> <translation type="unfinished"/> </message> <message> <source>Template</source> <translation>Plantilla</translation> </message> <message> <source>OpenSSL config</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation>Eliminar</translation> </message> <message> <source>Delete from Security token</source> <translation type="unfinished"/> </message> <message> <source>Trust</source> <translation type="unfinished"/> </message> <message> <source>Properties</source> <translation type="unfinished"/> </message> <message> <source>Generate CRL</source> <translation type="unfinished"/> </message> <message> <source>PKCS#7</source> <translation type="unfinished"/> </message> <message> <source>Sign</source> <translation type="unfinished"/> </message> <message> <source>Encrypt</source> <translation type="unfinished"/> </message> <message> <source>Renewal</source> <translation type="unfinished"/> </message> <message> <source>Unrevoke</source> <translation type="unfinished"/> </message> <message> <source>Revoke</source> <translation type="unfinished"/> </message> <message> <source>There was no key found for the Certificate: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Not possible for a token key: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Not possible for the token-key Certificate '%1'</source> <translation type="unfinished"/> </message> <message> <source> days</source> <translation type="unfinished"/> </message> </context> <context> <name>db_x509name</name> <message> <source>Subject</source> <translation>Sujeto</translation> </message> <message> <source>Complete distinguished name</source> <translation type="unfinished"/> </message> <message> <source>Subject hash</source> <translation type="unfinished"/> </message> <message> <source>Hash to lookup certs in directories</source> <translation type="unfinished"/> </message> </context> <context> <name>db_x509req</name> <message> <source>Signed</source> <translation>Firma</translation> </message> <message> <source>whether the request is already signed or not</source> <translation type="unfinished"/> </message> <message> <source>Unstructured name</source> <translation type="unfinished"/> </message> <message> <source>Challenge password</source> <translation type="unfinished"/> </message> <message> <source>The certificate signing request already exists in the database as '%1' and thus was not stored</source> <translation type="unfinished"/> </message> <message> <source>Certificate request ( *.pem *.der *.crl )</source> <translation type="unfinished"/> </message> <message> <source>Certificate request export</source> <translation type="unfinished"/> </message> <message> <source>New Request</source> <translation type="unfinished"/> </message> <message> <source>Import</source> <translation>Importar</translation> </message> <message> <source>Extract public Key</source> <translation type="unfinished"/> </message> <message> <source>Rename</source> <translation>Renombrar</translation> </message> <message> <source>Show Details</source> <translation>Mostrar detalles</translation> </message> <message> <source>Sign</source> <translation>Firma</translation> </message> <message> <source>Export</source> <translation>Importar</translation> </message> <message> <source>Clipboard</source> <translation type="unfinished"/> </message> <message> <source>File</source> <translation type="unfinished"/> </message> <message> <source>Template</source> <translation type="unfinished"/> </message> <message> <source>OpenSSL config</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> </context> <context> <name>db_x509super</name> <message> <source>Key name</source> <translation type="unfinished"/> </message> <message> <source>Internal name of the key</source> <translation type="unfinished"/> </message> <message> <source>Save as OpenSSL config</source> <translation type="unfinished"/> </message> <message> <source>Config files ( *.conf *.cnf);; All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>The following extensions were not ported into the template</source> <translation type="unfinished"/> </message> </context> <context> <name>kvView</name> <message> <source>Type</source> <translation type="unfinished"/> </message> <message> <source>Content</source> <translation type="unfinished"/> </message> </context> <context> <name>pass_info</name> <message> <source>Password</source> <translation>Contraseña</translation> </message> <message> <source>PIN</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_base</name> <message> <source>Error opening file: '%1': %2</source> <translation type="unfinished"/> </message> <message> <source>Error writing to file: '%1': %2</source> <translation type="unfinished"/> </message> <message> <source>Error: </source> <translation type="unfinished"/> </message> <message> <source>Internal error: Unexpected message: %1 %2</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_crl</name> <message> <source>Successfully imported the revokation list '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the revokation list '%1'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the revokation list '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 revokation lists: %2?</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the revokation list in file %1. Tried PEM and DER formatted CRL.</source> <translation type="unfinished"/> </message> <message> <source>No issuer given</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> <message> <source>unknown</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_evp</name> <message> <source>Failed to decrypt the key (bad password) </source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to decrypt the private key.</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to decrypt the private key from file: %1</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the private key in file %1. Tried PEM and DER private, public and PKCS#8 key types.</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to decrypt the private key: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Password input aborted</source> <translation type="unfinished"/> </message> <message> <source>Please enter the database password for decrypting the key '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to protect the private key: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the database password for encrypting the key</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password protecting the PKCS#8 key '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the export password for the private key '%1'</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_key</name> <message> <source>Successfully imported the %1 public key '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 public key '%2'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully imported the %1 private key '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 private key '%2'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the %1 private key '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 keys: %2?</source> <translation type="unfinished"/> </message> <message> <source>public key</source> <translation type="unfinished"/> </message> <message> <source>Common</source> <translation type="unfinished"/> </message> <message> <source>Private</source> <translation type="unfinished"/> </message> <message> <source>Bogus</source> <translation type="unfinished"/> </message> <message> <source>PIN</source> <translation type="unfinished"/> </message> <message> <source>No password</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_multi</name> <message> <source>Seek failed</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_pkcs12</name> <message> <source>Please enter the password to decrypt the PKCS#12 file: %1</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the PKCS#12 (pfx) file %1.</source> <translation type="unfinished"/> </message> <message> <source>The supplied password was wrong (%1)</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to encrypt the PKCS#12 file</source> <translation type="unfinished"/> </message> <message> <source>No key or no Cert and no pkcs12</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_pkcs7</name> <message> <source>Unable to load the PKCS#7 file %1. Tried PEM and DER format.</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_scard</name> <message> <source>Successfully imported the token key '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the token key '%1'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the token key '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 keys: %2?</source> <translation type="unfinished"/> </message> <message> <source>Delete the private key '%1' from the token '%2 (#%3)' ?</source> <translation type="unfinished"/> </message> <message> <source>only RSA keys can be stored on tokens</source> <translation type="unfinished"/> </message> <message> <source>This Key is already on the token</source> <translation type="unfinished"/> </message> <message> <source>PIN input aborted</source> <translation type="unfinished"/> </message> <message> <source>Unable to find copied key on the token</source> <translation type="unfinished"/> </message> <message> <source>Please insert card: %1 %2 [%3] with Serial: %4</source> <translation type="unfinished"/> </message> <message> <source>Public Key missmatch. Please re-import card</source> <translation type="unfinished"/> </message> <message> <source>Unable to find generated key on card</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> <message> <source>Token %1</source> <translation type="unfinished"/> </message> <message> <source>Failed to find the key on the token</source> <translation type="unfinished"/> </message> <message> <source>Invalid Pin for the token</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_temp</name> <message> <source>Successfully imported the XCA template '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the XCA template '%1'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the XCA template '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 XCA templates: %2?</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> <message> <source>Template file content error (too small): %1</source> <translation type="unfinished"/> </message> <message> <source>Template file content error (bad size): %1 </source> <translation type="unfinished"/> </message> <message> <source>Template file content error (bad length) :%1</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_x509</name> <message> <source>Successfully imported the certificate '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the certificate '%1'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the certificate '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 certificates: %2?</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the certificate in file %1. Tried PEM and DER certificate.</source> <translation type="unfinished"/> </message> <message> <source>This certificate is already on the security token</source> <translation type="unfinished"/> </message> <message> <source>Delete the certificate '%1' from the token '%2 (#%3)'?</source> <translation type="unfinished"/> </message> <message> <source>There is no key for signing !</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> <message> <source>Not trusted</source> <translation type="unfinished"/> </message> <message> <source>Trust inherited</source> <translation type="unfinished"/> </message> <message> <source>Always Trusted</source> <translation type="unfinished"/> </message> <message> <source>CRL expires: %1</source> <translation type="unfinished"/> </message> <message> <source>No</source> <translation type="unfinished"/> </message> <message> <source>Yes</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_x509req</name> <message> <source>Signing key not valid (public key)</source> <translation type="unfinished"/> </message> <message> <source>Successfully imported the %1 certificate request '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 certificate request '%2'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the %1 certificate request '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 certificate requests: %2?</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC format.</source> <translation type="unfinished"/> </message> <message> <source>Signed</source> <translation type="unfinished"/> </message> <message> <source>Unhandled</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> </context> <context> <name>v3ext</name> <message> <source>Add</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> <message> <source>Apply</source> <translation type="unfinished"/> </message> <message> <source>Validate</source> <translation type="unfinished"/> </message> <message> <source>Cancel</source> <translation>Cancelar</translation> </message> <message> <source>An email address or 'copy'</source> <translation type="unfinished"/> </message> <message> <source>An email address</source> <translation type="unfinished"/> </message> <message> <source>a registered ID: OBJECT IDENTIFIER</source> <translation type="unfinished"/> </message> <message> <source>a uniform resource indicator</source> <translation type="unfinished"/> </message> <message> <source>a DNS domain name</source> <translation type="unfinished"/> </message> <message> <source>an IP address</source> <translation type="unfinished"/> </message> <message> <source>Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'</source> <translation type="unfinished"/> </message> <message> <source>No editing. Only 'copy' allowed here</source> <translation type="unfinished"/> </message> <message> <source>Validation failed: '%1' %2</source> <translation type="unfinished"/> </message> <message> <source>Validation successfull: '%1'</source> <translation type="unfinished"/> </message> </context> <context> <name>void</name> <message> <source>There was no key found for the Certificate: </source> <translation type="unfinished"/> </message> <message> <source>Import Certificate signing request</source> <translation type="unfinished"/> </message> </context> </TS> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/xca_fr.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000322750�11753427512�0015133�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <TS> <context> <name>About</name> <message> <source>Done</source> <translation>OK</translation> </message> </context> <context> <name>CaProperties</name> <message> <source>CA Properties</source> <translation>Propriétés du CA</translation> </message> <message> <source>Use random Serial numbers</source> <translation>Utiliser des numéros de série aléatoires</translation> </message> <message> <source>Days until next CRL issuing</source> <translation>Nombre de jours avant la génération de la prochaine liste de révocation</translation> </message> <message> <source>Default template</source> <translation>Modèle par défaut</translation> </message> <message> <source>Next serial for signing</source> <translation>Numéro de série suivant pour la signature</translation> </message> </context> <context> <name>CertDetail</name> <message> <source>Details of the Certificate</source> <translation>Détails du Certificat</translation> </message> <message> <source>S&tatus</source> <translation>E&tat</translation> </message> <message> <source>Serial</source> <translation>Numéro de série</translation> </message> <message> <source>The serial number of the certificate</source> <translation>Le numéro de série du certificat</translation> </message> <message> <source>The internal name of the certificate in the database</source> <translation>Le nom interne du certificat dans la base de données</translation> </message> <message> <source>Internal name</source> <translation>Nom interne</translation> </message> <message> <source>Signature algorithm</source> <translation>Algorithme de signature</translation> </message> <message> <source>Signature</source> <translation>Signature</translation> </message> <message> <source>Key</source> <translation>Clé</translation> </message> <message> <source>Fingerprints</source> <translation>Empreinte</translation> </message> <message> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <source>MD5</source> <translation>MD5</translation> </message> <message> <source>A SHA-1 hashsum of the certificate</source> <translation>La somme de hachage SHA-1 du certificat</translation> </message> <message> <source>An md5 hashsum of the certificate</source> <translation>La somme de hachage MD5 du certificat</translation> </message> <message> <source>Validity</source> <translation>Validité</translation> </message> <message> <source>The time since the certificate is valid</source> <translation>Le moment depuis lequel le certificat est valide</translation> </message> <message> <source>The time until the certificate is valid</source> <translation>Le moment auquel le certificat échoit</translation> </message> <message> <source>&Subject</source> <translation>&Sujet</translation> </message> <message> <source>&Issuer</source> <translation>&Emetteur</translation> </message> <message> <source>Attributes</source> <translation>Attributs</translation> </message> <message> <source>&Extensions</source> <translation>E&xtensions</translation> </message> <message> <source>Show config</source> <translation>Afficher la configuration</translation> </message> <message> <source>Show extensions</source> <translation>Afficher les extensions</translation> </message> <message> <source>Not available</source> <translation>Non disponible</translation> </message> <message> <source>Details of the certificate</source> <translation>Détails du certificat</translation> </message> <message> <source>Signer unknown</source> <translation>Signataire inconnu</translation> </message> <message> <source>Self signed</source> <translation>Auto-signé</translation> </message> <message> <source>Not trusted</source> <translation>Pas sûr</translation> </message> <message> <source>Trusted</source> <translation>Sûr</translation> </message> <message> <source>Revoked: </source> <translation>Révoqués: </translation> </message> <message> <source>Not valid</source> <translation>Echu</translation> </message> <message> <source>Valid</source> <translation>Valide</translation> </message> <message> <source>Details of the certificate signing request</source> <translation>Détails de la requête de signature</translation> </message> </context> <context> <name>CertExtend</name> <message> <source>Certificate renewal</source> <translation>Renouvellement du certificat</translation> </message> <message> <source>This will create a new certificate as a copy of the old one with a new serial number and adjusted validity values.</source> <translation>Créer un nouveau certificat conforme à l'ancien, mais avec un nouveau numéro de série et les limites de validité ajustées.</translation> </message> <message> <source>Validity</source> <translation>Validité</translation> </message> <message> <source>Not before</source> <translation>Pas avant</translation> </message> <message> <source>Not after</source> <translation>Pas après</translation> </message> <message> <source>Time range</source> <translation>Intervalle de temps</translation> </message> <message> <source>No well-defined expiration</source> <translation>Date d'expiration mal définie</translation> </message> <message> <source>Apply</source> <translation>Appliquer</translation> </message> <message> <source>Days</source> <translation>Jours</translation> </message> <message> <source>Months</source> <translation>Mois</translation> </message> <message> <source>Years</source> <translation>Années</translation> </message> <message> <source>Midnight</source> <translation>Minuit</translation> </message> <message> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation>Le certificat serait valide avant son signataire. Ce n'est probablement pas ce qui est désiré.</translation> </message> <message> <source>Edit times</source> <translation>Modifier les limites de validité</translation> </message> <message> <source>Abort rollout</source> <translation>Interrompre le déploiement</translation> </message> <message> <source>Continue rollout</source> <translation>Continuer le déploiement</translation> </message> <message> <source>Adjust date and continue</source> <translation>Ajuster la date et continuer</translation> </message> <message> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation>Le certificat serait valide plus longtemps que son signataire. Ce n'est probablement pas ce qui est désiré.</translation> </message> </context> <context> <name>CertView</name> <message> <source>There was no key found for the Certificate: </source> <translation>Aucune clé n'a été trouvée pour ce certificat: </translation> </message> <message> <source>Import Certificate signing request</source> <translation>Importer une requête de signature</translation> </message> </context> <context> <name>ClickLabel</name> <message> <source>Double click for details</source> <translation>Double-cliquer pour afficher les détails</translation> </message> </context> <context> <name>CrlDetail</name> <message> <source>Details of the Revocation list</source> <translation>Détails de la liste de révocation</translation> </message> <message> <source>&Status</source> <translation>&Etat</translation> </message> <message> <source>Version</source> <translation>Version</translation> </message> <message> <source>Signature</source> <translation>Signature</translation> </message> <message> <source>Signed by</source> <translation>Signé par</translation> </message> <message> <source>Name</source> <translation>Nom</translation> </message> <message> <source>The internal name of the CRL in the database</source> <translation>Le nom interne de la liste de révocation dans la base de données</translation> </message> <message> <source>issuing dates</source> <translation>date d'émission</translation> </message> <message> <source>Next Update</source> <translation>Prochaine mise-à-jour</translation> </message> <message> <source>Last Update</source> <translation>Dernière mise-à-jour</translation> </message> <message> <source>&Issuer</source> <translation>&Emetteur</translation> </message> <message> <source>&Extensions</source> <translation>E&xtensions</translation> </message> <message> <source>&Revocation list</source> <translation>Liste de &révocation</translation> </message> <message> <source>0</source> <translation>0</translation> </message> <message> <source>Serial</source> <translation>Numéro de série</translation> </message> <message> <source>Revocation</source> <translation>Révocation</translation> </message> <message> <source>Reason</source> <translation>Raison</translation> </message> <message> <source>Invalidation</source> <translation>Invalidation</translation> </message> <message> <source>Failed</source> <translation>Echoué</translation> </message> <message> <source>Unknown signer</source> <translation>Signataire inconnu</translation> </message> <message> <source>Verification not possible</source> <translation>Vérification impossible</translation> </message> <message> <source>Unknown certificate</source> <translation>Certificat inconnu</translation> </message> </context> <context> <name>ExportCert</name> <message> <source>X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )</source> <translation>Certificats X509 ( *.cer *.crt *.p12 *.p7b);;Tous les fichiers ( * )</translation> </message> <message> <source>DER is a binary format of the Certificate PEM is a base64 encoded Certificate PKCS#7 is an official Certificate exchange format PKCS#12 is an encrypted official Key-Certificate exchange format </source> <translation>DER est un format binaire de certificat PEM encode le certificat en base64 PKCS#7 est un format officiel d'échange de certificat PKCS#12 est un format officiel encrypté d'échange de certificat et de clé </translation> </message> <message> <source>Please enter the filename for the certificate.</source> <translation>SVP entrer le nom du fichier pour le certificat.</translation> </message> <message> <source>Certificate export</source> <translation>Exportation de certificat</translation> </message> </context> <context> <name>ExportDer</name> <message> <source>All files ( * )</source> <translation>Tous les fichiers ( * )</translation> </message> <message> <source>DER is a binary format PEM is a base64 encoded DER file </source> <translation>DER est un format binaire PEM est un format encodé en base64 </translation> </message> </context> <context> <name>ExportDialog</name> <message> <source>...</source> <translation>...</translation> </message> <message> <source>Filename</source> <translation>Nom du fichier</translation> </message> <message> <source>Please enter the filename</source> <translation>SVP saisir le nom du fichier</translation> </message> <message> <source>Export Format</source> <translation>Format d'exportation</translation> </message> <message> <source>The file: '%1' already exists!</source> <translation>Le fichier '%1' existe déjà!</translation> </message> <message> <source>Overwrite</source> <translation>Ecraser</translation> </message> <message> <source>Do not overwrite</source> <translation>Ne pas écraser</translation> </message> </context> <context> <name>ExportKey</name> <message> <source>When exporting the private key it should be encrypted.</source> <translation>Il est conseillé d'encrypter la clé privée lors de son exportation.</translation> </message> <message> <source>When exporting the private part, it should be encrypted.</source> <translation>Il est conseillé d'encrypter la partie privée lors de son exportation.</translation> </message> <message> <source>E&xport the private part of the Key too</source> <translation>E&xporter aussi la partie privée de la clé</translation> </message> <message> <source>Export as PKCS#8</source> <translation>Exporter en PKCS#8</translation> </message> <message> <source>&Encrypt the Key with a password</source> <translation>&Encrypter la clé avec un mot de passe</translation> </message> <message> <source>Private keys ( *.pem *.der *.pk8 );;All files ( * )</source> <translation>Clés privées ( *.pem *.der *.pk8 );;Tous les fichiers ( * )</translation> </message> <message> <source>DER is a binary format of the key without encryption PEM is a base64 encoded key with optional encryption PKCS#8 is an encrypted official Key-exchange format</source> <translation>DER est un format binaire de clé sans encryption PEM encode la clé en base64 avec une encryption facultative PKCS#8 est un format officiel d'échange de clé</translation> </message> <message> <source>Please enter the filename for the key.</source> <translation>SVP saisir le nom du fichier pour la clé.</translation> </message> <message> <source>Public key export</source> <translation>Exporter la clé publique</translation> </message> <message> <source>Key export</source> <translation>Exporter la clé</translation> </message> </context> <context> <name>Help</name> <message> <source><<</source> <translation><<</translation> </message> <message> <source>>></source> <translation><<</translation> </message> <message> <source>&Done</source> <translation>&OK</translation> </message> </context> <context> <name>ImportMulti</name> <message> <source>Import PKI Items</source> <translation>Importer des objets PKI</translation> </message> <message> <source>Import &All</source> <translation>Importer &tout</translation> </message> <message> <source>&Import</source> <translation>&Importer</translation> </message> <message> <source>&Done</source> <translation>&OK</translation> </message> <message> <source>&Remove from list</source> <translation>&Retirer de la liste</translation> </message> <message> <source>Details</source> <translation>Détails</translation> </message> <message> <source>Delete from token</source> <translation>Enlever du jeton</translation> </message> <message> <source>Rename on token</source> <translation>Renommer dans le jeton</translation> </message> <message> <source> Name: %1 Model: %2 Serial: %3</source> <translation> Nom: %1 Modèle: %2 Numéro de série: %3</translation> </message> <message> <source>Manage security token</source> <translation>Gérer les jetons de sécurité</translation> </message> <message> <source>The type of the Item '%1' is not recognized</source> <translation>Le type de l'objet '%1' n'est pas reconnu</translation> </message> <message> <source>Details of the item '%1' cannot be shown</source> <translation>Les détails de l'objet '%1' ne peuvent pas être affichés</translation> </message> <message> <source>The type of the item '%1' is not recognized</source> <translation>Le type de l'objet '%1' n'est pas reconnu</translation> </message> <message> <source>The file '%1' did not contain PKI data</source> <translation>Le fichier '%1' ne contient pas de données PKI</translation> </message> <message> <source>The %1 files: '%2' did not contain PKI data</source> <translation>Les %1 fichiers: '%2' ne contiennent pas de données PKI</translation> </message> </context> <context> <name>KeyDetail</name> <message> <source>Name</source> <translation>Nom</translation> </message> <message> <source>The internal name of the key used by xca</source> <translation>Le nom interne de la clé utilisé par xca</translation> </message> <message> <source>Security token</source> <translation>Jeton de sécurité</translation> </message> <message> <source>Manufacturer</source> <translation>Fabricant</translation> </message> <message> <source>Serial</source> <translation>Numéro de série</translation> </message> <message> <source>Key</source> <translation>Clé</translation> </message> <message> <source>Public Exponent</source> <translation>Exposant public</translation> </message> <message> <source>Keysize</source> <translation>Taille de la clé</translation> </message> <message> <source>Private Exponent</source> <translation>Exposant privé</translation> </message> <message> <source>Modulus</source> <translation>Modulo</translation> </message> <message> <source>Details of the %1 key</source> <translation>Détails de la clé %1</translation> </message> <message> <source>Not available</source> <translation>Non disponible</translation> </message> <message> <source>Token</source> <translation>Jeton</translation> </message> <message> <source>Security token ID:%1</source> <translation>Identifiant de jeton de sécurité: %1</translation> </message> <message> <source>Available</source> <translation>Disponible</translation> </message> <message> <source>Sub prime</source> <translation>Sous-premier</translation> </message> <message> <source>Public key</source> <translation>Clé publique</translation> </message> <message> <source>Private key</source> <translation>Clé privée</translation> </message> <message> <source>Curve name</source> <translation>Nom de la courbe</translation> </message> <message> <source>Unknown key</source> <translation>Clé inconnue</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>Private Keys</source> <translation>Clés privées</translation> </message> <message> <source>&New Key</source> <translation>&Nouvelle clé</translation> </message> <message> <source>&Export</source> <translation>&Exporter</translation> </message> <message> <source>&Import</source> <translation>&Importer</translation> </message> <message> <source>Import PFX (PKCS#12)</source> <translation>Importer en PFX (PKCS#12)</translation> </message> <message> <source>&Show Details</source> <translation>&Afficher les Détails</translation> </message> <message> <source>&Delete</source> <translation>&Détruire</translation> </message> <message> <source>Certificate signing requests</source> <translation>Requêtes de signature de certificat</translation> </message> <message> <source>&New Request</source> <translation>&Nouvelle requête</translation> </message> <message> <source>Certificates</source> <translation>Certificats</translation> </message> <message> <source>&New Certificate</source> <translation>&Nouveau Certificat</translation> </message> <message> <source>Import &PKCS#12</source> <translation>Importer en &PKCS#12</translation> </message> <message> <source>Import P&KCS#7</source> <translation>Importer en P&KCS#7</translation> </message> <message> <source>Plain View</source> <translation>Vue à plat</translation> </message> <message> <source>Templates</source> <translation>Modèles</translation> </message> <message> <source>&New template</source> <translation>&Nouveau modèle</translation> </message> <message> <source>Ch&ange Template</source> <translation>&Modifier le Modèle</translation> </message> <message> <source>Revocation lists</source> <translation>Listes de révocation</translation> </message> <message> <source>Using or exporting private keys will not be possible without providing the correct password</source> <translation>L'usage ou l'exportation de clés privées seront impossible sans fournir le mot de passe correct.</translation> </message> <message> <source>Database</source> <translation>Base de donnée</translation> </message> <message> <source>No deleted items found</source> <translation>Aucun objet détruit n'a été trouvé</translation> </message> <message> <source>&File</source> <translation>&Fichier</translation> </message> <message> <source>&New DataBase</source> <translation>&Nouvelle base de données</translation> </message> <message> <source>&Open DataBase</source> <translation>&Ouvrir une base de données</translation> </message> <message> <source>Generate DH parameter</source> <translation>Générer le paramètre DH</translation> </message> <message> <source>Set as default DataBase</source> <translation>Définir comme base de données par défaut</translation> </message> <message> <source>&Close DataBase</source> <translation>&Fermer la base de données</translation> </message> <message> <source>&Dump DataBase</source> <translation>C&licher la base de données</translation> </message> <message> <source>C&hange DataBase password</source> <translation>C&hanger le mot de passe de la base de données</translation> </message> <message> <source>&Import old db_dump</source> <translation>&Importer un cliché de base de données en ancien format (db_dump)</translation> </message> <message> <source>&Undelete items</source> <translation>&Récupérer des objets détruits</translation> </message> <message> <source>Options</source> <translation>Options</translation> </message> <message> <source>Exit</source> <translation>Quitter</translation> </message> <message> <source>I&mport</source> <translation>I&mporter</translation> </message> <message> <source>Keys</source> <translation>Clés</translation> </message> <message> <source>Requests</source> <translation>Requêtes</translation> </message> <message> <source>PKCS#12</source> <translation>PKCS#12</translation> </message> <message> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <source>Template</source> <translation>Modèle</translation> </message> <message> <source>Revocation list</source> <translation>Liste de révocation</translation> </message> <message> <source>PEM file</source> <translation>Fichier PEM</translation> </message> <message> <source>paste PEM file</source> <translation>Coller un fichier PEM</translation> </message> <message> <source>&Token</source> <translation>&Jeton</translation> </message> <message> <source>&Manage Security token</source> <translation>&Gérer le jeton de sécurité</translation> </message> <message> <source>&Init Security token</source> <translation>&Initialiser le jeton de sécurité</translation> </message> <message> <source>&Change PIN</source> <translation>&Changer le NIP</translation> </message> <message> <source>Change &SO PIN</source> <translation>Changer le P&UK</translation> </message> <message> <source>Init PIN</source> <translation>Initialiser le NIP</translation> </message> <message> <source>&Help</source> <translation>&Aide</translation> </message> <message> <source>&Content</source> <translation>&Contenu</translation> </message> <message> <source>&About</source> <translation>&A propos</translation> </message> <message> <source>Donations</source> <translation>Dons</translation> </message> <message> <source>Database dump ( *.dump );;All files ( * )</source> <translation>Cliché de base de données ( *.dump );;Tous les fichiers ( * )</translation> </message> <message> <source>Import password</source> <translation>Mot de passe d'importation</translation> </message> <message> <source>Please enter the password of the old database</source> <translation>SVP saisir le mot de passe de l'ancienne base de données</translation> </message> <message> <source>Password verification error. Ignore keys ?</source> <translation>La vérification du mot de passe a écoué. Ignorer les clés ?</translation> </message> <message> <source>Import anyway</source> <translation>Importer quand-même</translation> </message> <message> <source>Cancel</source> <translation>Annuler</translation> </message> <message> <source>no such option: %1</source> <translation>'%1' n'est pas une option</translation> </message> <message> <source>Import PEM data</source> <translation>Importer les données PEM</translation> </message> <message> <source>Please enter the original SO PIN (PUK) of the token '%1'</source> <translation>SVP saisir le PUK original du jeton '%1'</translation> </message> <message> <source>Please enter the new SO PIN (PUK) of the token '%1'</source> <translation>SVP saisir le nouveau PUK du jeton '%1'</translation> </message> <message> <source>The new label of the token '%1'</source> <translation>La nouvelle étiquette du jeton '%1'</translation> </message> <message> <source>The token '%1' did not contain any keys or certificates</source> <translation>Le jeton '%1' ne contient aucune clé ni aucun certificat</translation> </message> <message> <source>New Password</source> <translation>Nouveau mot de passe</translation> </message> <message> <source>Please enter the new password to encrypt your private keys in the database-file</source> <translation>SVP saisir le nouveau mot de passe pour encrypter les clés privées dans le fichier de base de données</translation> </message> <message> <source>Please enter a password, that will be used to encrypt your private keys in the database file: %1</source> <translation>Veuillez entrer un mot de passe, qui sera utiliser pour chiffrer vos clés privées dans le fichier de la base de données: %1</translation> </message> <message> <source>Password verify error, please try again</source> <translation>La vérification du mot de passe a échoué. SVP essayez encore</translation> </message> <message> <source>Password</source> <translation>Mot de passe</translation> </message> <message> <source>Please enter the password for unlocking the database: %1</source> <translation>Veuillez entrer le mot passe pour déverrouiller la base de données: %1</translation> </message> <message> <source>The following error occured:</source> <translation>L'erreur suivante s'est produite:</translation> </message> <message> <source>Copy to Clipboard</source> <translation>Copier dans le presse-papier</translation> </message> <message> <source>Diffie-Hellman parameters are needed for different applications, but not handled by XCA. Please enter the DH parameter bits</source> <translation>Les paramètres de Diffie-Hellman sont nécessaires à certaines applications mais ne sont pas gérés par XCA. Saisir le nombre de bits du paramètre de Diffie-Hellman SVP</translation> </message> <message> <source>Error opening file: '%1': %2</source> <translation>Erreur lors de l'ouverture du fichier: '%1': %2</translation> </message> </context> <context> <name>NewCrl</name> <message> <source>Create CRL</source> <translation>Créer une liste de révocation</translation> </message> <message> <source>Dates</source> <translation>Dates</translation> </message> <message> <source>last update</source> <translation>dernière mise-à-jour</translation> </message> <message> <source>next update</source> <translation>prochaine mise-à-jour</translation> </message> <message> <source>Days</source> <translation>Jours</translation> </message> <message> <source>Months</source> <translation>Mois</translation> </message> <message> <source>Years</source> <translation>Années</translation> </message> <message> <source>Midnight</source> <translation>Minuit</translation> </message> <message> <source>Apply</source> <translation>Appliquer</translation> </message> <message> <source>Hashing algorithm</source> <translation>Algorithme de hachage</translation> </message> <message> <source>Extensions</source> <translation>Extensions</translation> </message> <message> <source>Authority key identifier</source> <translation>Identifiant de clé de l'autorité</translation> </message> <message> <source>Subject alternative name</source> <translation>Nom alternatif du sujet</translation> </message> <message> <source>CRL Number</source> <translation>Numéro de la liste de révocation</translation> </message> <message> <source>Revokation reasons</source> <translation>Raisons de la révocation</translation> </message> </context> <context> <name>NewKey</name> <message> <source>New key</source> <translation>Nouvelle clé</translation> </message> <message> <source>Please give a name to the new key and select the desired keysize</source> <translation>SVP donner un nom à la nouvelle clé et sélectionner la taille de clé désirée</translation> </message> <message> <source>Key properties</source> <translation>Propriétés de la clé</translation> </message> <message> <source>Name</source> <translation>Nom</translation> </message> <message> <source>The internal name of the new key</source> <translation>Le nom interne de la nouvelle clé</translation> </message> <message> <source>New Key</source> <translation>Nouvelle Clé</translation> </message> <message> <source>Curve</source> <translation>Courbe</translation> </message> <message> <source>Keysize</source> <translation>Taille de la clé</translation> </message> <message> <source>Usually 1024 or 2048 bit keys are used</source> <translation>1024 et 2048 bits sont les tailles de clé les plus usitées</translation> </message> <message> <source>Keytype</source> <translation>Type de clé</translation> </message> <message> <source>Create</source> <translation>Créer</translation> </message> </context> <context> <name>NewX509</name> <message> <source>Create</source> <translation>Créer</translation> </message> <message> <source>Source</source> <translation>Source</translation> </message> <message> <source>Signing request</source> <translation>Requête de signature</translation> </message> <message> <source>A certificate signing request can be signed, even if the private key of the request is not available. This is the intention of a CSR: Getting signed by a CA certificate, whoes certificate of course must be in the database Of course you need the private key of the CSR if you want to create a self-signed cert from it.</source> <translation>Un requête de signature de certificat peut être signée même si la clé privée de la requête n'est pas disponible. C'est l'intention d'une requête de signature: être signée par un certificat d'autorité (CA) qui lui bien-sûr, doit être dans la base de donnée. Par contre, la clé privée d'une requête est nécessaire pour créer un certificat auto-signé à partir de celle-ci.</translation> </message> <message> <source>Show request</source> <translation>Afficher la requête</translation> </message> <message> <source>Sign this Certificate signing &request</source> <translation>Signer cette &requête</translation> </message> <message> <source>Copy extensions from the request</source> <translation>Copier les extensions de la requête</translation> </message> <message> <source>Modify subject of the request</source> <translation>Modifier le sujet de la requête</translation> </message> <message> <source>Signing</source> <translation>Signer</translation> </message> <message> <source>Create a &self signed certificate with the serial</source> <translation>Créer un certificat auto-&signé avec le numéro de série</translation> </message> <message> <source>If you leave this blank the serial 00 will be used</source> <translation>Si ce champ est laissé vide, le numéro de série 00 sera utilisé</translation> </message> <message> <source>1</source> <translation>1</translation> </message> <message> <source>Use &this Certificate for signing</source> <translation>Utiliser &ce certificat pour signer</translation> </message> <message> <source>All certificates in your database that can create valid signatures</source> <translation>Tous les certificats dans la base de données qui peuvent produire des signatures valables</translation> </message> <message> <source>This list contains all certificates with the CA-flag set to true and whoes private key is present in the key-database. If this list is disabled, you only can create a self-signed certificate.</source> <translation>Cette liste contient tous les certificats qui ont le drapeau CA levé et dont la clé privée est présente dans la base de données. Si cette liste est désactivée, seule la création d'un certificat auto-signé est possible.</translation> </message> <message> <source>Signature algorithm</source> <translation>Algorithme de signature</translation> </message> <message> <source>Template for the new certificate</source> <translation>Modèle pour le nouveau certificat</translation> </message> <message> <source>All available templates</source> <translation>Tous les modèles disponibles</translation> </message> <message> <source>This list contains all templates from the toplevel template Tab</source> <translation>Cette liste contient tous les modèles de l'onglet 'Modèles'</translation> </message> <message> <source>Apply extensions</source> <translation>Appliquer les extensions</translation> </message> <message> <source>Apply subject</source> <translation>Appliquer le sujet</translation> </message> <message> <source>Apply all</source> <translation>Appliquer tout</translation> </message> <message> <source>Subject</source> <translation>Sujet</translation> </message> <message> <source>Organisation</source> <translation>Organisation</translation> </message> <message> <source>This name is only used internally and does not appear in the resulting certificate</source> <translation>Ce nom est seulement utilisé par xca et n'apparaît pas dans le certificat exporté</translation> </message> <message> <source>Must be exactly 2 letter of size (DE, UK)</source> <translation>Doit contenir exactement deux lettres [FR, UK]</translation> </message> <message> <source>Country code</source> <translation>Code du pays</translation> </message> <message> <source>State or Province</source> <translation>Etat ou Province</translation> </message> <message> <source>Locality</source> <translation>Ville</translation> </message> <message> <source>Organisational unit</source> <translation>Unité organisationnlle</translation> </message> <message> <source>E-Mail address</source> <translation>Adresse de courriel</translation> </message> <message> <source>Internal name</source> <translation>Nom interne</translation> </message> <message> <source>Common name</source> <translation>Nom commun</translation> </message> <message> <source>Add</source> <translation>Ajouter</translation> </message> <message> <source>Delete</source> <translation>Enlever</translation> </message> <message> <source>Private key</source> <translation>Clé privée</translation> </message> <message> <source>This list only contains unused keys</source> <translation>Cette liste ne contient que les clés inutilisées</translation> </message> <message> <source>Used keys too</source> <translation>Inclure les clés utilisées</translation> </message> <message> <source>&Generate a new key</source> <translation>&Générer une nouvelle clé</translation> </message> <message> <source>Extensions</source> <translation>Extensions</translation> </message> <message> <source>Basic constraints</source> <translation>Contraintes basiques</translation> </message> <message> <source>Type</source> <translation>Type</translation> </message> <message> <source>If this will become a CA certificate or not</source> <translation>Si un certificat d'autorité (CA) est en train d'être créé ou non</translation> </message> <message> <source>Set this to TRUE if you want to create a CA certificate that signs other certificates. This is always set to FALSE for client or server certificates. In most cases self-signed certificates are CA certificates. Self-signed non-CA certificates are unusual although they are possible.</source> <translation>Sélectionner "VRAI" si vous voulez créer un certificat d'autorité (CA) qui peut signer d'autres certificats. "FAUX" doit toujours être séléectionné pour des certificats de clients ou de serveurs. Dans la plupart des cas, les certificats auto-signés sont des certificats d'autorité: bien que possibles, les certificats auto-signés non-CA sont rares.</translation> </message> <message> <source>Not defined</source> <translation>Non défini</translation> </message> <message> <source>Certification Authority</source> <translation>Autorité de Certification</translation> </message> <message> <source>End Entity</source> <translation>Entité Finale</translation> </message> <message> <source>Path length</source> <translation>Distance aux feuilles</translation> </message> <message> <source>How much CAs may be below this.</source> <translation>Combien de niveau de sous-CA peuvent apparaître jusqu'à une entité finale.</translation> </message> <message> <source>If this is left empty the pathlen is not included in the certificate. Otherwise it distinguishes the count of chained CA certificates below this one. A pathlen of 0 means, that this certificate may not issue other sub-CA certificates. Although it can do it, all chain-checking algorithms in e.g. your browser or openssl will (should) fail.</source> <translation>Si ce champ est laissé vide, la distance aux peuilles n'est pas incluse dans le certificat. Sinon il limite le nombre de sous-CA en dessous de celui-ci. Une distance aux feuilles de 0 signifie que ce certificat ne peut pas signer de sous-CA. Bien qu'il puisse effectivement le faire, tous les algorithme de vérification de chaînage des certificats (p.ex: dans votre navigateur ou openssl) les refuseront.</translation> </message> <message> <source>The basic constraints should always be critical</source> <translation>Les contraintes basiques doivent toujours être critiques</translation> </message> <message> <source>Key identifier</source> <translation>Identifiant de clé</translation> </message> <message> <source>Creates a hash of the key following the PKIX guidelines</source> <translation>Crée un hachage de la clé conformément aux directives PKIX</translation> </message> <message> <source>Copy the Subject Key Identifier from the issuer</source> <translation>Copie l'identifiant de clé du sujet du signataire</translation> </message> <message> <source>If this box is checked an attempt is made to copy the subject key identifier from the signing certificate. It also copies the issuer and serial number from the issuer certificate. Normally this will only be done if the keyid option fails.</source> <translation>Quand cette case est cochée, l'identifiant de clé est copiée du certificat signataire. L'emetteur et le numéro de série du certificat signataire sont aussi copiés: normalement cette copie n'est effectuée que si la copie de l'identifiant de clé échoue.</translation> </message> <message> <source>Validity</source> <translation>Validité</translation> </message> <message> <source>Not before</source> <translation>Pas avant</translation> </message> <message> <source>Not after</source> <translation>Pas après</translation> </message> <message> <source>Time range</source> <translation>Intervalle de temps</translation> </message> <message> <source>Days</source> <translation>Jours</translation> </message> <message> <source>Months</source> <translation>Mois</translation> </message> <message> <source>Years</source> <translation>Années</translation> </message> <message> <source>Apply</source> <translation>Appliquer</translation> </message> <message> <source>Set the time to 00:00:00 and 23:59:59 respectively</source> <translation>Définir les heures à 00:00:00 et 23:59:59 respectivement</translation> </message> <message> <source>Midnight</source> <translation>Minuit</translation> </message> <message> <source>No well-defined expiration</source> <translation>Date d'expiration mal définie</translation> </message> <message> <source>Authority Info Access</source> <translation>Accès à l'information de l'autorité</translation> </message> <message> <source>CRL distribution point</source> <translation>Point de distribution de la liste de révocation</translation> </message> <message> <source>issuer alternative name</source> <translation>Nom alternatif du signataire</translation> </message> <message> <source>URI:</source> <translation>URI:</translation> </message> <message> <source>This is a multi-valued extension that supports all the literal options of subject alternative name. Of the few software packages that currentlyi nterpret this extension most only interpret the URI option. Currently each option will set a new DistributionPoint with the fullName field set to the given value. Other fields like cRLissuer and reasons cannot currently be set or displayed: at this time no examples were available that used these fields. If you see this extension with <UNSUPPORTED> when you attempt to print it out or it doesn't appear to display correctly then let steve know, including the certificate (mail steve at openssl dot org) . Examples: URI:http://www.myhost.com/myca.crl URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl</source> <translation>Cette extension est un agrégat de toutes les options littérales du nom alternatif du sujet. Parmi les quelques logiciels qui utilisent cette extension aujourd'hui, la plupart ne traitent uniquement l'option URI. Chaque option introduit un nouveau point de distribution qualifié par son nom complet. Pour l'instant, les autres champs comme 'CRLissuer' et 'reasons' ne peuvent pas être saisis ou affichés. Aucun exemple utilisant ces champs n'est disponible aujourd'hui. Si cette extension apparaît comme <UNSUPPORTED> ou si le contenu ne semble pas affiché correctement, faites-le savoir a Steve (courriel: steve arobase openssl point org). Exemples: URI:http://www.monsite.com/monca.crl URI:http://www.moi.com/moi.crl, URI:http://www.lui.com/moi.crl</translation> </message> <message> <source>can be altered by the file "aia.txt"</source> <translation>peut être altéré par le fichier "aia.txt"</translation> </message> <message> <source>Edit</source> <translation>Modifier</translation> </message> <message> <source>DNS: IP: URI: email: RID:</source> <translation>DNS: IP: URI: email: RID:</translation> </message> <message> <source>The authority information access extension gives details about how to access certain information relating to the CA. Its syntax is accessOID;location where 'location' has the same syntax as subject alternative name (except that email:copy is not supported). accessOID can be any valid OID but only certain values are meaningful for example OCSP and caIssuers. OCSP gives the location of an OCSP responder: this is used by Netscape PSM and other software. Example: OCSP;URI:http://ocsp.my.host/ caIssuers;URI:http://my.ca/ca.html</source> <translation>L'extension d'accès à l'information de l'autorité indique comment accéder à certaines informations concernant le certificat d'autorité. La syntaxe est accèsOID;emplacement où 'emplacement` à la même syntaxe que le nom alternatif du sujet (à part 'email:copy" qui n'est pas supporté). N'importe quel OID valide peut être spécifié pour accèsOID, mais seules certaines valeurs ont un sens, par exemple OCSP et caIssuers. OCSP renseigne sur l'emplacement d'un répondeur OCSP; ceci est untilisé par les navigateurs Web et d'autres logiciels. Exemple: OCSP;URI:http://ocsp.mon.site/ caIssuers;URI:http://moi.ca/ca.html</translation> </message> <message> <source>The subject alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name) , RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation>Cette extension contient le nom alternatif du sujet et permet de regrouper plusieurs valeurs littérales. Celles-ci comprennent "email" (un adresse de courriel), "URI" (un indicateur uniforme de ressource), "DNS" (un nom de domaine), "RID" (un identifiant d'objet enregistré) et "IP" (une adresse IP). Exemples: email:mon@autre.adresse, IP: 1.1.1.1 , URI:http://mon.url.ici/ email:mon@autre.adresse, RID:1.2.3.4, DNS: serveur.de.nom.tld</translation> </message> <message> <source>subject alternative name</source> <translation>nom alternatif du sujet</translation> </message> <message> <source>The issuer alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name), RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation>Cette extension contient le nom alternatif du signataire et permet de regrouper plusieurs valeurs littérales. Celles-ci comprennent "email" (un adresse de courriel), "URI" (un indicateur uniforme de ressource), "DNS" (un nom de domaine), "RID" (un identifiant d'objet enregistré) et "IP" (une adresse IP). Exemples: email:mon@autre.adresse, IP: 1.1.1.1 , URI:http://mon.url.ici/ email:mon@autre.adresse, RID:1.2.3.4, DNS: serveur.de.nom.tld</translation> </message> <message> <source>Key usage</source> <translation>Utilisation de la clé</translation> </message> <message> <source>Extended key usage</source> <translation>Utilisation étendue de la clé</translation> </message> <message> <source>Netscape</source> <translation>Netscape</translation> </message> <message> <source>CA Revocation URL</source> <translation>URL de révocation du certificat CA</translation> </message> <message> <source>Revocation URL</source> <translation>URL de révocation</translation> </message> <message> <source>SSL server name</source> <translation>Nom du serveur SSL</translation> </message> <message> <source>Certificate renewal URL</source> <translation>URL de renouvellement de certificat</translation> </message> <message> <source>Comment</source> <translation>Commentaire</translation> </message> <message> <source>CA policy URL</source> <translation>URL des conditions générales du CA</translation> </message> <message> <source>Base URL</source> <translation>URL de base</translation> </message> <message> <source>If you know a more pretty one tell me</source> <translation>Si vous en connaissez un plus joli, faites-le moi savoir</translation> </message> <message> <source>Advanced</source> <translation>Avancé</translation> </message> <message> <source>Validate</source> <translation>Valider</translation> </message> <message> <source>Create a &self signed certificate with a MD5-hashed QA serial</source> <translation>Créer un certificat auto-&signé avec un numéro de série QA basé sur MD5</translation> </message> <message> <source>Create Certificate signing request</source> <translation>Créer une requête de signature de certificat</translation> </message> <message> <source>minimum size: %1</source> <translation>taille minimale: %1</translation> </message> <message> <source>maximum size: %1</source> <translation>taille maximale: %1</translation> </message> <message> <source>only a-z A-Z 0-9 '()+,-./:=?</source> <translation>seulement a-z A-Z 0-9 '()+,-./:=?</translation> </message> <message> <source>only 7-bit clean characters</source> <translation>seulement des caractères 7-bit ASCII imprimables</translation> </message> <message> <source>XCA template</source> <translation>modèle XCA</translation> </message> <message> <source>Create x509 Certificate</source> <translation>Créer un certificat x509</translation> </message> <message> <source>From PKCS#10 request</source> <translation>A partir d'une requête en PKCS#10</translation> </message> <message> <source>Other Tabs</source> <translation>Autres Onglets</translation> </message> <message> <source>Advanced Tab</source> <translation>Onglet Avancé</translation> </message> <message> <source>Errors</source> <translation>Erreurs</translation> </message> <message> <source>Abort rollout</source> <translation>Interrompre le déploiement</translation> </message> <message> <source>The following length restrictions of RFC3280 are violated:</source> <translation>Pour être en conformité avec la RFC3280, les règles de restriction de longueur suivantes ne sont pas respectées:</translation> </message> <message> <source>Edit subject</source> <translation>Modifier le sujet</translation> </message> <message> <source>Continue rollout</source> <translation>Continuer le déploiement</translation> </message> <message> <source>The verification of the Certificate request failed. The rollout should be aborted.</source> <translation>La vérification de la requête de signature à échoué. Le déploiement devrait être interrompu.</translation> </message> <message> <source>Continue anyway</source> <translation>Continuer quand-même</translation> </message> <message> <source>The internal name and the common name are empty. Please set at least the internal name.</source> <translation>Le nom interne et le nom commun sont vides. SVP saisir au moins le nom interne.</translation> </message> <message> <source>Edit name</source> <translation>Modifier le nom</translation> </message> <message> <source>There is no Key selected for signing.</source> <translation>Aucune clé n'est sélectionnée pour la signature.</translation> </message> <message> <source>Select key</source> <translation>Sélectionner la clé</translation> </message> <message> <source>The following distinguished name entries are empty: %1 though you have declared them as mandatory in the options menu.</source> <translation>Les indications de nom distinctif suivantes sont vides: %1 bien que vous les avez déclarées comme obligatoires dans le menu des options.</translation> </message> <message> <source>The key you selected for signing is not a private one.</source> <translation>La clé sélectionnée pour la signature n'est pas une clé privée.</translation> </message> <message> <source>Select other signer</source> <translation>Sélectionner un autre signataire</translation> </message> <message> <source>Select other key</source> <translation>Sélectionner une autre clé</translation> </message> <message> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation>Le certificat serait valide avant son signataire. Ce n'est probablement pas ce qui est désiré.</translation> </message> <message> <source>Edit dates</source> <translation>Modifier les limites de validité</translation> </message> <message> <source>Adjust date and continue</source> <translation>Ajuster la date et continuer</translation> </message> <message> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation>Le certificat serait valide plus longtemps que son signataire. Ce n'est probablement pas ce qui est désiré.</translation> </message> <message> <source>The certificate will be out of date before it becomes valid. You most probably mixed up both dates.</source> <translation>Le certificat serait échu avant de devenir actif. Vous avez probablement interverti les deux dates.</translation> </message> <message> <source>The certificate contains duplicated extensions. Check the validation on the advanced tab.</source> <translation>Le certificat contient des extensions dupliquées. Valider et vérifier sur l'onglet "Avancé".</translation> </message> <message> <source>Edit extensions</source> <translation>Modifier les extensions</translation> </message> <message> <source>Configfile error on line %1 </source> <translation>Erreur dans le fichier de configuration à la ligne %1 </translation> </message> </context> <context> <name>Options</name> <message> <source>XCA Options</source> <translation>Options de XCA</translation> </message> <message> <source>Mandatory subject entries</source> <translation>Inscriptions du sujet obligatoires</translation> </message> <message> <source>Add</source> <translation>Ajouter</translation> </message> <message> <source>Delete</source> <translation>Détruire</translation> </message> <message> <source>Default hash algorithm</source> <translation>Algorithme de hachage par défaut</translation> </message> <message> <source>String types</source> <translation>Types de chaînes</translation> </message> <message> <source>Suppress success messages</source> <translation>Supprimer les messages en cas de succès</translation> </message> <message> <source>PKCS#11 provider</source> <translation>Fournisseur PKCS#11</translation> </message> <message> <source>Remove</source> <translation>Enlever</translation> </message> <message> <source>Printable string or UTF8 (default)</source> <translation>Chaîne imprimable ou UTF8 (défaut)</translation> </message> <message> <source>PKIX recommendation in RFC2459</source> <translation>La recommandation PKIX est dans la RFC2459</translation> </message> <message> <source>No BMP strings, only printable and T61</source> <translation>Pas de chaîne BMP, seulement imprimable et T61</translation> </message> <message> <source>UTF8 strings only (RFC2459)</source> <translation>Chaînes UTF8 uniquement (RFC2459)</translation> </message> <message> <source>All strings</source> <translation>Toutes les chaînes</translation> </message> <message> <source>Load failed</source> <translation>Le chargement a échoué</translation> </message> </context> <context> <name>PwDialog</name> <message> <source>Password</source> <translation>Mot de passe</translation> </message> <message> <source>The password is parsed as 2-digit hex code. It must have an equal number of digits (0-9 and a-f)</source> <translation>Le mot de passe doit être exprimé sous forme d'une suite de chiffres hexadécimaux. Il doit contenir un nombre pair de chiffres (0-9 et a-f)</translation> </message> <message> <source>Take as HEX string</source> <translation>Exprimé en hexadécimal</translation> </message> <message> <source>Repeat %1</source> <translation>Répéter %1</translation> </message> <message> <source>%1 missmatch</source> <translation>%1 ne correspond pas</translation> </message> <message> <source>Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it must consist of an even number of characters</source> <translation>Un mot de passe hexadécimal peut seulement contenir les caractères '0' à '9' et 'a' à 'f' et il doit consister en un nombre pair de caractères</translation> </message> <message> <source>E&xit</source> <translation>&Quitter</translation> </message> </context> <context> <name>QObject</name> <message> <source>Undefined</source> <translation>Indéfini</translation> </message> <message> <source>DB: Rename: '%1' already in use</source> <translation>DB: Renommer: '%1' déjà en utilisation</translation> </message> <message> <source>DB: Entry to rename not found: %1</source> <translation>DB: l'inscription à renommer n'a pas été trouvée: '%1'</translation> </message> <message> <source>DB: Write error %1 - %2</source> <translation>DB: Erreur d'écriture %1 - %2</translation> </message> <message> <source>Out of data</source> <translation>A court de données</translation> </message> <message> <source>Error finding endmarker of string</source> <translation>Erreur: une marque de fin de chaîne n'a pas été trouvée</translation> </message> <message> <source>Out of Memory at %1:%2</source> <translation>A court de mémoire à %1:%2</translation> </message> <message> <source>All files ( * )</source> <translation>Tous les fichiers ( * )</translation> </message> <message> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;</source> <translation>Clés PKI ( *.pem *.der *.key );;Clés PKCS#8 ( *.p8 *.pk8 );;</translation> </message> <message> <source>Import RSA key</source> <translation>Importer une clé RSA</translation> </message> <message> <source>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;</source> <translation>Requête PKCS#10 ( *.pem *.der *.csr );;Requête Netscape ( *.spkac *.spc );;</translation> </message> <message> <source>Import Request</source> <translation>Importer une requête</translation> </message> <message> <source>Certificates ( *.pem *.der *.crt *.cer );;</source> <translation>Certificats ( *.pem *.der *.crt *.cer );;</translation> </message> <message> <source>Import X.509 Certificate</source> <translation>Importer un certificat X.509</translation> </message> <message> <source>PKCS#7 data ( *.p7s *.p7m *.p7b );;</source> <translation>Données PKCS#7 ( *.p7s *.p7m *.p7b );;</translation> </message> <message> <source>Import PKCS#7 Certificates</source> <translation>Importer un certificat PKCS#7</translation> </message> <message> <source>PKCS#12 Certificates ( *.p12 *.pfx );;</source> <translation>Certificats PKCS#12 ( *.p12 *.pfx );;</translation> </message> <message> <source>Import PKCS#12 Private Certificate</source> <translation>Importer un certificat privé PKCS#12</translation> </message> <message> <source>XCA templates ( *.xca );;</source> <translation>Modèles XCA ( *.xca );;</translation> </message> <message> <source>Import XCA Templates</source> <translation>Importer des modèles XCA</translation> </message> <message> <source>Revocation lists ( *.pem *.der *.crl );;</source> <translation>Listes de révocation ( *.pem *.der *.crl );;</translation> </message> <message> <source>Import Certificate Revocation List</source> <translation>Importer une liste de révocation de certificats</translation> </message> <message> <source>XCA Databases ( *.xdb );;</source> <translation>Bases de données XCA ( *.xdb );;</translation> </message> <message> <source>Open XCA Database</source> <translation>Ouvrir une Base de Données XCA</translation> </message> <message> <source>PKCS#11 library ( *.dll );;</source> <translation>Bibliothèque PKCS#11 ( *.dll );;</translation> </message> <message> <source>PKCS#11 library ( *.dylib *.so );;</source> <translation>Bibliothèque PKCS#11 ( *.dylib *.so );;</translation> </message> <message> <source>PKCS#11 library ( *.so );;</source> <translation>Bibliothèque PKCS#11 ( *.so );;</translation> </message> <message> <source>Open PKCS#11 shared library</source> <translation>Ouvrir une bibliothèque partagée PKCS#11</translation> </message> <message> <source>PEM files ( *.pem );;</source> <translation>Fichiers PEM ( *.pem );;</translation> </message> <message> <source>Load PEM encoded file</source> <translation>Charger un fichier encodé en PEM</translation> </message> <message> <source>Please enter the PIN on the PinPad</source> <translation>Saisir le NIP sur le pavé prévu à cet effet SVP</translation> </message> <message> <source>Please enter the SO PIN (PUK) of the token %1</source> <translation>SVP saisir le PUK du jeton '%1'</translation> </message> <message> <source>Please enter the PIN of the token %1</source> <translation>SVP saisir le NIP du jeton '%1'</translation> </message> <message> <source>No Security token found</source> <translation>Aucun jeton de sécurité trouvé</translation> </message> <message> <source>Select</source> <translation>Sélectionner</translation> </message> <message> <source>Please enter the new SO PIN (PUK) for the token: '%1'</source> <translation>SVP saisir le nouveau PUK pour le jeton: '%1'</translation> </message> <message> <source>Please enter the new PIN for the token: '%1'</source> <translation>SVP saisir le nouveau NIP pour le jeton: '%1'</translation> </message> <message> <source>Required PIN size: %1 - %2</source> <translation>Taille du NIP requise: %1 - %2</translation> </message> <message> <source>Failed to open PKCS11 library: %1</source> <translation>L'ouverture de la bibliothèque PKCS#11 '%1' a échoué</translation> </message> <message> <source>PKCS#11 function '%1' failed: %2</source> <translation>La fonction PKCS#11 '%1' a échoué: %2</translation> </message> <message> <source>PKCS#11 function '%1' failed: %2 In library %3 %4</source> <translation>La fonction PKCS#11 '%1' a échoué: %2 Dans la bibliothèque %3 %4</translation> </message> <message> <source>Invalid</source> <translation>Invalide</translation> </message> <message> <source>%1 is shorter than %2 bytes: '%3'</source> <translation>%1 est plus court que %2 octets: '%3'</translation> </message> <message> <source>%1 is longer than %2 bytes: '%3'</source> <translation>%1 est plus long que %2 octets: '%3'</translation> </message> </context> <context> <name>Revoke</name> <message> <source>Revokation details</source> <translation>Détails de la révocation</translation> </message> <message> <source>Invalid since</source> <translation>Non-valide depuis</translation> </message> <message> <source>Revokation reason</source> <translation>Raison de la révocation</translation> </message> </context> <context> <name>SelectToken</name> <message> <source>Select Token</source> <translation>Sélectionner un jeton</translation> </message> <message> <source>Security token</source> <translation>Jeton de sécurité</translation> </message> <message> <source>Please select the security token</source> <translation>SVP sélectionner le jeton de sécurité</translation> </message> </context> <context> <name>TrustState</name> <message> <source>Set trustment of the Certificate</source> <translation>Ajuster le niveau de confiance du certificat</translation> </message> <message> <source>Trustment</source> <translation>Niveau de confiance</translation> </message> <message> <source>&Never trust this certificate</source> <translation>&Ne jamais se fier à ce certificat</translation> </message> <message> <source>Only &trust this certificate, if we trust the signer</source> <translation>Ne &se fier à ce certificat qui si son signataire est de confiance</translation> </message> <message> <source>&Always trust this certificate</source> <translation>&Toujours se fier à ce certificat</translation> </message> </context> <context> <name>Validity</name> <message> <source>yyyy-MM-dd hh:mm</source> <translation>yyyy-MM-dd hh:mm</translation> </message> </context> <context> <name>db_base</name> <message> <source>Internal name</source> <translation>Nom interne</translation> </message> <message> <source>Reset</source> <translation>Réinitialisation</translation> </message> <message> <source>Subject entries</source> <translation>Inscriptions du sujet</translation> </message> <message> <source>Paste PEM data</source> <translation>Coller les données en format PEM</translation> </message> <message> <source>Columns</source> <translation>Colonnes</translation> </message> </context> <context> <name>db_crl</name> <message> <source>Signer</source> <translation>Signataire</translation> </message> <message> <source>Internal name of the signer</source> <translation>Nom interne du signataire</translation> </message> <message> <source>No. revoked</source> <translation>Numéro révoqué</translation> </message> <message> <source>Number of revoked certificates</source> <translation>Nombre de certificats révoqués</translation> </message> <message> <source>Last update</source> <translation>Dernière mise-à-jour</translation> </message> <message> <source>Next update</source> <translation>Prochaine mise-à-jour</translation> </message> <message> <source>CRL number</source> <translation>Numéro de la liste de révocation</translation> </message> <message> <source>The revokation list already exists in the database as: '%1' and so it was not imported</source> <translation>Cette liste de révocation figure déjà dans la base de données sous le nom: '%1' En conséquence, elle n'a pas été importée</translation> </message> <message> <source>CRL ( *.pem *.der *.crl )</source> <translation>Listes de révocation ( *.pem *.der *.crl )</translation> </message> <message> <source>Revokation list export</source> <translation>Exportation d'une liste de révocation</translation> </message> <message> <source>Import</source> <translation>Importer</translation> </message> <message> <source>Rename</source> <translation>Renommer</translation> </message> <message> <source>Export</source> <translation>Exporter</translation> </message> <message> <source>Clipboard</source> <translation>Presse-papier</translation> </message> <message> <source>File</source> <translation>Fichier</translation> </message> <message> <source>Delete</source> <translation>Supprimer</translation> </message> </context> <context> <name>db_key</name> <message> <source>Type</source> <translation>Type</translation> </message> <message> <source>Size</source> <translation>Taille</translation> </message> <message> <source>Use</source> <translation>Usage</translation> </message> <message> <source>Password</source> <translation>Mot de passe</translation> </message> <message> <source>The key is already in the database as: '%1' and is not going to be imported</source> <translation>Cette clé figure déjà dans la base de données sous le nom: '%1' En conséquence, elle ne va pas être importée</translation> </message> <message> <source>The database already contains the public part of the imported key as '%1 and will be completed by the new, private part of the key</source> <translation>La base de donnée connait déjà la partie publique de la clé importée sous le nom '%1' En conséquence, cette dernière sera complétée par la partie privée de la clé importée</translation> </message> <message> <source>Key size too small !</source> <translation>Taille de clé trop petite !</translation> </message> <message> <source>You are sure to create a key of the size: %1 ?</source> <translation>Etes-vous sûr de couloir créer une clé de taille %1 ?</translation> </message> <message> <source>Shall the original key '%1' be replaced by the key on the token? This will delete the key '%1' and make it unexportable</source> <translation>La clé originale '%1' doit-elle être remplacée par la clé en provenance du jeton ? Cela détruirait la clé '%1' et la rendrait non-exportable.</translation> </message> <message> <source>New Key</source> <translation>Nouvelle clé</translation> </message> <message> <source>Import</source> <translation>Importer</translation> </message> <message> <source>Rename</source> <translation>Renommer</translation> </message> <message> <source>Show Details</source> <translation>Afficher les Détails</translation> </message> <message> <source>Delete</source> <translation>Détruire</translation> </message> <message> <source>Export</source> <translation>Exporter</translation> </message> <message> <source>Change password</source> <translation>Changer le mot de passe</translation> </message> <message> <source>Reset password</source> <translation>Effacer le mot de passe</translation> </message> <message> <source>Change PIN</source> <translation>Changer le NIP</translation> </message> <message> <source>Init PIN with SO PIN (PUK)</source> <translation>Initialiser le NIP avec le PUK</translation> </message> <message> <source>Change SO PIN (PUK)</source> <translation>Changer le PUK</translation> </message> <message> <source>Store on Security token</source> <translation>Enregistrer dans le jeton de sécurité</translation> </message> <message> <source>Tried to change password of a token</source> <translation>Tentative de changement de mot de passe d'un jeton de sécurité</translation> </message> <message> <source>Tried to change PIN of a key</source> <translation>Tentative de changement de NIP d'une clé</translation> </message> <message> <source>Tried to init PIN of a key</source> <translation>Tentative d'initialisation du NIP d'une clé</translation> </message> <message> <source>Tried to change SO PIN of a key</source> <translation>Tentative de changement de PUK d'une clé</translation> </message> </context> <context> <name>db_temp</name> <message> <source>Type</source> <translation>Type</translation> </message> <message> <source>Bad template: %1</source> <translation>Mauvais modèle: %1</translation> </message> <message> <source>Nothing</source> <translation>Rien</translation> </message> <message> <source>Preset Template values</source> <translation>Initaliser les valeurs du modèle</translation> </message> <message> <source>copy</source> <translation>copier</translation> </message> <message> <source>Save template as</source> <translation>Enregistrer le modèle sous</translation> </message> <message> <source>XCA templates ( *.xca);; All files ( * )</source> <translation>Modèles XCA ( *.xca);; Tous les fichiers ( * )</translation> </message> <message> <source>New Template</source> <translation>Nouveau modèle</translation> </message> <message> <source>Import</source> <translation>Importer</translation> </message> <message> <source>Rename</source> <translation>Renommer</translation> </message> <message> <source>Export</source> <translation>Exporter</translation> </message> <message> <source>Change</source> <translation>Changer</translation> </message> <message> <source>Delete</source> <translation>Détruire</translation> </message> <message> <source>Duplicate</source> <translation>Dupliquer</translation> </message> <message> <source>Create certificate</source> <translation>Créer un certificat</translation> </message> <message> <source>Create request</source> <translation>Créer une requête</translation> </message> </context> <context> <name>db_x509</name> <message> <source>CA</source> <translation>CA</translation> </message> <message> <source>reflects the basic Constraints extension</source> <translation>reflète l'extension des contraintes basiques</translation> </message> <message> <source>Serial</source> <translation>Numéro de série</translation> </message> <message> <source>md5 fingerprint</source> <translation>Empreinte MD5</translation> </message> <message> <source>sha1 fingerprint</source> <translation>Empreinte sha1</translation> </message> <message> <source>Start date</source> <translation>Date de début</translation> </message> <message> <source>not Before</source> <translation>pas Avant</translation> </message> <message> <source>Expiry date</source> <translation>Date d'expiration</translation> </message> <message> <source>not After</source> <translation>pas Après</translation> </message> <message> <source>Trust state</source> <translation>État de confiance</translation> </message> <message> <source>Revocation</source> <translation>Révocation</translation> </message> <message> <source>Plain View</source> <translation>Vue à plat</translation> </message> <message> <source>Tree View</source> <translation>Vue arborescente</translation> </message> <message> <source>The certificate already exists in the database as: '%1' and so it was not imported</source> <translation>Ce certificat figure déjà dans la base de données sous le nom: '%1' En conséquence, il n'a pas été importé</translation> </message> <message> <source>Invalid public key</source> <translation>Clé publique invalide</translation> </message> <message> <source>Please enter the new hexadecimal secret number for the QA process.</source> <translation>SVP saisir le nouveau nombre secret hexadécimal pour le processus QA.</translation> </message> <message> <source>The QA process has been terminated by the user.</source> <translation>Le processus QA a été arrêté par l'utilisateur.</translation> </message> <message> <source>The key you selected for signing is not a private one.</source> <translation>La clé sélectionnée pour la signature n'est pas une clé privée.</translation> </message> <message> <source>Store the certificate to the key on the token '%1 (#%2)' ?</source> <translation>Enregistrer le certificate avec la clé sur le jeton '%1 (#%2)' ?</translation> </message> <message> <source>New Certificate</source> <translation>Nouveau Certificat</translation> </message> <message> <source>Import</source> <translation>Importer</translation> </message> <message> <source>Import PKCS#12</source> <translation>Importer en PKCS#12</translation> </message> <message> <source>Import from PKCS#7</source> <translation>Importer en PKCS#7</translation> </message> <message> <source>Rename</source> <translation>Renommer</translation> </message> <message> <source>Show Details</source> <translation>Afficher les Détails</translation> </message> <message> <source>Extract public Key</source> <translation>Extraire la clé publique</translation> </message> <message> <source>Export</source> <translation>Exporter</translation> </message> <message> <source>Clipboard</source> <translation>Presse-papier</translation> </message> <message> <source>File</source> <translation>Fichier</translation> </message> <message> <source>Request</source> <translation>Requête</translation> </message> <message> <source>Security token</source> <translation>Jeton de sécurité</translation> </message> <message> <source>Other token</source> <translation>Autre jeton</translation> </message> <message> <source>Template</source> <translation>Modèle</translation> </message> <message> <source>OpenSSL config</source> <translation>Configuration OpenSSL</translation> </message> <message> <source>Delete</source> <translation>Supprimer</translation> </message> <message> <source>Delete from Security token</source> <translation>Détruire sur le jeton de sécurité</translation> </message> <message> <source>Trust</source> <translation>Niveau de confiance</translation> </message> <message> <source>Properties</source> <translation>Propriétés</translation> </message> <message> <source>Generate CRL</source> <translation>Générer la liste de révocation</translation> </message> <message> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <source>Sign</source> <translation>Signer</translation> </message> <message> <source>Encrypt</source> <translation>Encrypter</translation> </message> <message> <source>Renewal</source> <translation>Renouvellement</translation> </message> <message> <source>Unrevoke</source> <translation>Dé-révoquer</translation> </message> <message> <source>Revoke</source> <translation>Révoquer</translation> </message> <message> <source>There was no key found for the Certificate: '%1'</source> <translation>Aucune clé n'a été trouvée pour le Certificat. '%1'</translation> </message> <message> <source>Not possible for a token key: '%1'</source> <translation>Impossible pour une clé d'un jeton de sécurité: '%1'</translation> </message> <message> <source>Not possible for the token-key Certificate '%1'</source> <translation>Impossible pour le certificat d'une clé d'un jeton de sécurité: '%1'</translation> </message> <message> <source> days</source> <translation> jours</translation> </message> </context> <context> <name>db_x509name</name> <message> <source>Subject</source> <translation>Sujet</translation> </message> <message> <source>Complete distinguished name</source> <translation>Nom distinctif complet</translation> </message> <message> <source>Subject hash</source> <translation>Hachage du sujet</translation> </message> <message> <source>Hash to lookup certs in directories</source> <translation>Hachage de recherche dans un dossier</translation> </message> </context> <context> <name>db_x509req</name> <message> <source>Signed</source> <translation>Signé</translation> </message> <message> <source>whether the request is already signed or not</source> <translation>si la requête a déjà été signée ou non</translation> </message> <message> <source>Unstructured name</source> <translation>Nom non-structuré</translation> </message> <message> <source>Challenge password</source> <translation>Mot de passe challenge</translation> </message> <message> <source>The certificate signing request already exists in the database as '%1' and thus was not stored</source> <translation>Cette requête de signature figure déjà dans la base de données sous le nom '%1' En conséquence, elle n'a pas été chargée</translation> </message> <message> <source>Certificate request ( *.pem *.der *.crl )</source> <translation>Requête de signature de certificat ( *.pem *.der *.crl )</translation> </message> <message> <source>Certificate request export</source> <translation>Exporter la requête de signature</translation> </message> <message> <source>New Request</source> <translation>Nouvelle requête</translation> </message> <message> <source>Import</source> <translation>Importer</translation> </message> <message> <source>Extract public Key</source> <translation>Extraire la clé publique</translation> </message> <message> <source>Rename</source> <translation>Renommer</translation> </message> <message> <source>Show Details</source> <translation>Afficher les Détails</translation> </message> <message> <source>Sign</source> <translation>Signer</translation> </message> <message> <source>Export</source> <translation>Exporter</translation> </message> <message> <source>Clipboard</source> <translation>Presse-papier</translation> </message> <message> <source>File</source> <translation>Fichier</translation> </message> <message> <source>Template</source> <translation>Modèle</translation> </message> <message> <source>OpenSSL config</source> <translation>Configuration OpenSSL</translation> </message> <message> <source>Delete</source> <translation>Détruire</translation> </message> </context> <context> <name>db_x509super</name> <message> <source>Key name</source> <translation>Nom de la clé</translation> </message> <message> <source>Internal name of the key</source> <translation>Nom interne de la clé</translation> </message> <message> <source>Save as OpenSSL config</source> <translation>Enregistrer en format de configuration OpenSSL</translation> </message> <message> <source>Config files ( *.conf *.cnf);; All files ( * )</source> <translation>Fichiers de configuration (*.conf *.cnf);; Tous les fichiers ( * )</translation> </message> <message> <source>The following extensions were not ported into the template</source> <translation>Les extensions suivantes n'ont pas été enregistrées dans le modèle</translation> </message> </context> <context> <name>kvView</name> <message> <source>Type</source> <translation>Type</translation> </message> <message> <source>Content</source> <translation>Contenu</translation> </message> </context> <context> <name>pass_info</name> <message> <source>Password</source> <translation>Mot de passe</translation> </message> <message> <source>PIN</source> <translation>NIP</translation> </message> </context> <context> <name>pki_base</name> <message> <source>Error opening file: '%1': %2</source> <translation>Erreur à l'ouverture du fichier '%1': %2</translation> </message> <message> <source>Error writing to file: '%1': %2</source> <translation>Erreur à l'écriture du fichier '%1': %2</translation> </message> <message> <source>Error: </source> <translation>Erreur: </translation> </message> <message> <source>Internal error: Unexpected message: %1 %2</source> <translation>Erreur interne: message inattendu: %1 %2</translation> </message> </context> <context> <name>pki_crl</name> <message> <source>Successfully imported the revokation list '%1'</source> <translation>La liste de révocation '%1' a été importée avec succès</translation> </message> <message> <source>Delete the revokation list '%1'?</source> <translation>Détruire la liste de révocation '%1' ?</translation> </message> <message> <source>Successfully created the revokation list '%1'</source> <translation>La liste de révocation '%1' a été créée avec succès</translation> </message> <message> <source>Delete the %1 revokation lists: %2?</source> <translation>Détruire les %1 listes de révocation: %2 ?</translation> </message> <message> <source>Unable to load the revokation list in file %1. Tried PEM and DER formatted CRL.</source> <translation>Impossible de charger le liste de révocation du fichier %1. Les formats PEM et DER ont été essayés.</translation> </message> <message> <source>No issuer given</source> <translation>Aucun signataire spécifié</translation> </message> <message> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> <message> <source>unknown</source> <translation>inconnu</translation> </message> </context> <context> <name>pki_evp</name> <message> <source>Failed to decrypt the key (bad password) </source> <translation>Le décryptage de la clé a échoué (mauvais mot de passe). </translation> </message> <message> <source>Please enter the password to decrypt the private key.</source> <translation>SVP saisir le mot de passe pour décrypter la clé privée</translation> </message> <message> <source>Please enter the password to decrypt the private key from file: %1</source> <translation>SVP saisir le mot de passe pour décrypter la clé privée du fichier: %1</translation> </message> <message> <source>Unable to load the private key in file %1. Tried PEM and DER private, public and PKCS#8 key types.</source> <translation>Impossible de charger la clé privée du fichier %1. Les formats PEM et DER ainsi que les types de clés privé, public et PKCS#8 ont été essayés.</translation> </message> <message> <source>Please enter the password to decrypt the private key: '%1'</source> <translation>SVP saisir le mot de passe pour décrypter la clé privée: '%1'</translation> </message> <message> <source>Password input aborted</source> <translation>Saisie du mot de passe abandonnée</translation> </message> <message> <source>Please enter the database password for decrypting the key '%1'</source> <translation>SVP saisir le mot de basse de la base de données pour décrypter la clé '%1'</translation> </message> <message> <source>Please enter the password to protect the private key: '%1'</source> <translation>SVP saisir le mot de pass pour protéger la clé privée: '%1'</translation> </message> <message> <source>Please enter the database password for encrypting the key</source> <translation>SVP saisir le mot de passe de la base de données pour encrypter la clé</translation> </message> <message> <source>Please enter the password protecting the PKCS#8 key '%1'</source> <translation>SVP saisir le mot de passe protégeant la clé en PKCS#8 '%1'</translation> </message> <message> <source>Please enter the export password for the private key '%1'</source> <translation>SVP saisir le mot de passe d'exportation pour la clé privée '%1'</translation> </message> </context> <context> <name>pki_key</name> <message> <source>Successfully imported the %1 public key '%2'</source> <translation>Les %1 clés publiques '%2' ont été importées avec succès</translation> </message> <message> <source>Delete the %1 public key '%2'?</source> <translation>Détruire les %1 clés publiques '%2' ?</translation> </message> <message> <source>Successfully imported the %1 private key '%2'</source> <translation>Les %1 clés privées '%2' ont été importées avec succès</translation> </message> <message> <source>Delete the %1 private key '%2'?</source> <translation>Détruire les %1 clés privées '%2' ?</translation> </message> <message> <source>Successfully created the %1 private key '%2'</source> <translation>Les %1 clés privées '%2' ont été créées avec succès</translation> </message> <message> <source>Delete the %1 keys: %2?</source> <translation>Détruire les %1 clés: '%2' ?</translation> </message> <message> <source>public key</source> <translation>clé publique</translation> </message> <message> <source>Common</source> <translation>Commun</translation> </message> <message> <source>Private</source> <translation>Privé</translation> </message> <message> <source>Bogus</source> <translation>Erroné</translation> </message> <message> <source>PIN</source> <translation>NIP</translation> </message> <message> <source>No password</source> <translation>Pas de mot de passe</translation> </message> </context> <context> <name>pki_multi</name> <message> <source>Seek failed</source> <translation>Un "seek" a échoué</translation> </message> </context> <context> <name>pki_pkcs12</name> <message> <source>Please enter the password to decrypt the PKCS#12 file: %1</source> <translation>SVP saisir le mot de passe pour décrypter le fichier en PKCS#12: %1</translation> </message> <message> <source>Unable to load the PKCS#12 (pfx) file %1.</source> <translation>Impossible de charger le fichier en PKCS#12 (pfx) %1.</translation> </message> <message> <source>The supplied password was wrong (%1)</source> <translation>Le mot de passe renseigné était faux (%1)</translation> </message> <message> <source>Please enter the password to encrypt the PKCS#12 file</source> <translation>SVP saisir le mot de passe pour encrypter le fichier en PKCS#12</translation> </message> <message> <source>No key or no Cert and no pkcs12</source> <translation>Pas de clé ou pas de certificat et pas en PKCS#12</translation> </message> </context> <context> <name>pki_pkcs7</name> <message> <source>Unable to load the PKCS#7 file %1. Tried PEM and DER format.</source> <translation>Impossible de charger le fichier en PKCS#7 %1. Les formats PEM et DER ont été essayés.</translation> </message> </context> <context> <name>pki_scard</name> <message> <source>Successfully imported the token key '%1'</source> <translation>La clé du jeton '%1' a été importée avec succès</translation> </message> <message> <source>Delete the token key '%1'?</source> <translation>Détruire la clé du jeton '%1' ?</translation> </message> <message> <source>Successfully created the token key '%1'</source> <translation>La clé du jeton '%1' a été créée avec succès</translation> </message> <message> <source>Delete the %1 keys: %2?</source> <translation>Détruire les %1 clés: '%2' ?</translation> </message> <message> <source>Delete the private key '%1' from the token '%2 (#%3)' ?</source> <translation>Détruire la clé privée '%1' sur le jeton '%2 (#%3)' ?</translation> </message> <message> <source>only RSA keys can be stored on tokens</source> <translation>Seules des clés RSA peuvent être enregistrées sur les jetons</translation> </message> <message> <source>This Key is already on the token</source> <translation>Cette clé est déjà sur le jeton</translation> </message> <message> <source>PIN input aborted</source> <translation>Saisie du NIP abandonnée</translation> </message> <message> <source>Unable to find copied key on the token</source> <translation>Impossible de trouver la clé copiée sur le jeton</translation> </message> <message> <source>Please insert card: %1 %2 [%3] with Serial: %4</source> <translation>SVP insérer la carte %1 %2 [%3] avec le numéro de série: %4</translation> </message> <message> <source>Public Key missmatch. Please re-import card</source> <translation>La clé publique ne correspond pas. Veuillez re-importer la carte</translation> </message> <message> <source>Unable to find generated key on card</source> <translation>Impossible de trouver la clé générée sur la carte</translation> </message> <message> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> <message> <source>Token %1</source> <translation>Jeton %1</translation> </message> <message> <source>Failed to find the key on the token</source> <translation>Impossible de trouver la clé sur le jeton</translation> </message> <message> <source>Invalid Pin for the token</source> <translation>NIP invalide pour le jeton</translation> </message> </context> <context> <name>pki_temp</name> <message> <source>Successfully imported the XCA template '%1'</source> <translation>Le modèle XCA '%1' a été importé avec succès</translation> </message> <message> <source>Delete the XCA template '%1'?</source> <translation>Détruire le modèle XCA '%1' ?</translation> </message> <message> <source>Successfully created the XCA template '%1'</source> <translation>Le modèle XCA '%1' a été créé avec succès</translation> </message> <message> <source>Delete the %1 XCA templates: %2?</source> <translation>Détruire les %1 modèles XCA: %2 ?</translation> </message> <message> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> <message> <source>Template file content error (too small): %1</source> <translation>erreur de contenu du fichier de modèle (trop petit): %1</translation> </message> <message> <source>Template file content error (bad size): %1 </source> <translation>erreur de contenu du fichier de modèle (mauvaise taille): %1 </translation> </message> <message> <source>Template file content error (bad length) :%1</source> <translation>erreur de contenu du fichier de modèle (mauvaise longueur): %1</translation> </message> </context> <context> <name>pki_x509</name> <message> <source>Successfully imported the certificate '%1'</source> <translation>Le certificat '%1' a été importée avec succès</translation> </message> <message> <source>Delete the certificate '%1'?</source> <translation>Détruire le certificat '%1' ?</translation> </message> <message> <source>Successfully created the certificate '%1'</source> <translation>Le certificat '%1' a été créé avec succès</translation> </message> <message> <source>Delete the %1 certificates: %2?</source> <translation>Détruire les %1 certificats: '%2' ?</translation> </message> <message> <source>Unable to load the certificate in file %1. Tried PEM and DER certificate.</source> <translation>Impossible de charge le certificat du fichier %1. Les formats PEM et DER ont été essayés.</translation> </message> <message> <source>This certificate is already on the security token</source> <translation>Ce certificat est déjà dans le jeton de sécurité</translation> </message> <message> <source>Delete the certificate '%1' from the token '%2 (#%3)'?</source> <translation>Détruire le certificat '%1' sur le jeton '%2 (#%3)' ?</translation> </message> <message> <source>There is no key for signing !</source> <translation>Il n'y a pas de clé pour signer !</translation> </message> <message> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> <message> <source>Not trusted</source> <translation>Pas sûr</translation> </message> <message> <source>Trust inherited</source> <translation>Confiance héritée</translation> </message> <message> <source>Always Trusted</source> <translation>Sûr</translation> </message> <message> <source>CRL expires: %1</source> <translation>La liste de révocation expire le %1</translation> </message> <message> <source>No</source> <translation>Non</translation> </message> <message> <source>Yes</source> <translation>Oui</translation> </message> </context> <context> <name>pki_x509req</name> <message> <source>Signing key not valid (public key)</source> <translation>La clé de signature n'est pas valide (c'est une clé publique)</translation> </message> <message> <source>Successfully imported the %1 certificate request '%2'</source> <translation>Les %1 requêtes de signature '%2' ont été importées avec succès</translation> </message> <message> <source>Delete the %1 certificate request '%2'?</source> <translation>Détruire les %1 requêtes de signature '%2' ?</translation> </message> <message> <source>Successfully created the %1 certificate request '%2'</source> <translation>Les %1 requêtes de signature '%2' ont été créées avec succès</translation> </message> <message> <source>Delete the %1 certificate requests: %2?</source> <translation>Détruire les %1 requêtes de signature '%2' ?</translation> </message> <message> <source>Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC format.</source> <translation>Impossible de charger la requête de signature du fichier %1. Les formats PEM, DER et SPKAC ont été essayés.</translation> </message> <message> <source>Signed</source> <translation>Signé</translation> </message> <message> <source>Unhandled</source> <translation>Non-géré</translation> </message> <message> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> </context> <context> <name>v3ext</name> <message> <source>Add</source> <translation>Ajouter</translation> </message> <message> <source>Delete</source> <translation>Détruire</translation> </message> <message> <source>Apply</source> <translation>Appliquer</translation> </message> <message> <source>Validate</source> <translation>Valider</translation> </message> <message> <source>Cancel</source> <translation>Abandonner</translation> </message> <message> <source>An email address or 'copy'</source> <translation>Une adresse de courriel ou 'copy'</translation> </message> <message> <source>An email address</source> <translation>Une adresse de courriel</translation> </message> <message> <source>a registered ID: OBJECT IDENTIFIER</source> <translation>un IDentifiant enregistré: IDENTIFICATEUR.OBJET</translation> </message> <message> <source>a uniform resource indicator</source> <translation>un indicateur uniforme de ressource</translation> </message> <message> <source>a DNS domain name</source> <translation>u nom de domaine DNS</translation> </message> <message> <source>an IP address</source> <translation>une adresse IP</translation> </message> <message> <source>Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'</source> <translation>Syntaxe: <OID>;TYPE:texte comme '1.2.3.4:UTF8:nom'</translation> </message> <message> <source>No editing. Only 'copy' allowed here</source> <translation>Pas de modification possible. Seul 'copy' est permis ici</translation> </message> <message> <source>Validation failed: '%1' %2</source> <translation>La validation a échoué: '%1' %2</translation> </message> <message> <source>Validation successfull: '%1'</source> <translation>La validation a été effectuée avec succès: '%1'</translation> </message> </context> <context> <name>void</name> <message> <source>There was no key found for the Certificate: </source> <translation>Aucune clé n'a été trouvée pour le Certificat: </translation> </message> <message> <source>Import Certificate signing request</source> <translation>Importer une requête de signature</translation> </message> </context> </TS> ������������������������xca_0.9.3/lang/xca_ru.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000426415�11753427512�0015155�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0" language="ru_RU"> <context> <name>About</name> <message> <location filename="../ui/About.ui" line="+89"/> <source>Done</source> <translation>Закрыть</translation> </message> </context> <context> <name>CaProperties</name> <message> <location filename="../ui/CaProperties.ui" line="+122"/> <source>Next serial for signing</source> <translation>Следующий серийный номер для подписания</translation> </message> <message> <location line="-20"/> <source>Days until next CRL issuing</source> <translatorcomment>CRL - Списки отозванных сертификатов</translatorcomment> <translation>Дней до следующего выпуска CRL</translation> </message> <message> <location line="+10"/> <source>Default template</source> <translation>Шаблон по-умолчанию</translation> </message> <message> <location line="-82"/> <source>CA Properties</source> <translation>Свойства ЦС</translation> </message> <message> <location line="+65"/> <source>Use random Serial numbers</source> <translation>Использовать случайные cерийные номера</translation> </message> </context> <context> <name>CertDetail</name> <message> <location filename="../widgets/CertDetail.cpp" line="+37"/> <source>Show extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+19"/> <source>Not available</source> <translation type="unfinished">Недоступный</translation> </message> <message> <location line="+25"/> <source>Details of the certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>Signer unknown</source> <translation type="unfinished">подписавший неизвестен</translation> </message> <message> <location line="+4"/> <source>Self signed</source> <translation>Сомоподписанный</translation> </message> <message> <location line="+11"/> <source>Not trusted</source> <translation type="unfinished">Не доверенный</translation> </message> <message> <location line="+4"/> <source>Trusted</source> <translation>Доверенный</translation> </message> <message> <location line="+19"/> <source>Revoked: </source> <translation type="unfinished">Отозванный: </translation> </message> <message> <location line="+5"/> <source>Not valid</source> <translation type="unfinished">Не действительный</translation> </message> <message> <location line="+4"/> <source>Valid</source> <translation type="unfinished">Действительный</translation> </message> <message> <location line="+15"/> <source>Details of the certificate signing request</source> <translation type="unfinished">Подробная информация о пакете запроса на подпись сертификата</translation> </message> <message> <location filename="../ui/CertDetail.ui" line="+39"/> <source>Details of the Certificate</source> <translation>Подробная информация о сертификате</translation> </message> <message> <location line="+48"/> <source>S&tatus</source> <translation>С&татус</translation> </message> <message> <location line="+60"/> <source>Serial</source> <translation type="unfinished">Серийный номер</translation> </message> <message> <location line="+13"/> <source>The serial number of the certificate</source> <translation type="unfinished">Серийный номер сертификата</translation> </message> <message> <location line="+9"/> <source>The internal name of the certificate in the database</source> <translation type="unfinished">Внутреннее имя сертификата в базе данных</translation> </message> <message> <location line="+7"/> <source>Internal name</source> <translation>Внутреннее имя</translation> </message> <message> <location line="+23"/> <source>Signature algorithm</source> <translation>Алгоритм подписи</translation> </message> <message> <location line="+7"/> <source>Signature</source> <translation type="unfinished">Подпись</translation> </message> <message> <location line="+7"/> <source>Key</source> <translation type="unfinished">Ключ</translation> </message> <message> <location line="+10"/> <source>Fingerprints</source> <translation type="unfinished">Хэш-суммы</translation> </message> <message> <location line="+12"/> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <location line="+7"/> <source>MD5</source> <translation>MD5</translation> </message> <message> <location line="+7"/> <source>A SHA-1 hashsum of the certificate</source> <translation>SHA-1 хэшсумма сертификата</translation> </message> <message> <location line="+7"/> <source>An md5 hashsum of the certificate</source> <translation>MD5 хэшсумма сертификата</translation> </message> <message> <location line="+10"/> <source>Validity</source> <translation>Период действия</translation> </message> <message> <location line="+12"/> <source>The time since the certificate is valid</source> <translation type="unfinished">Сертификат действителен с</translation> </message> <message> <location line="+7"/> <source>The time until the certificate is valid</source> <translation type="unfinished">Время в течении которого сертификат действителен</translation> </message> <message> <location line="+34"/> <source>&Subject</source> <translation>&Владелец</translation> </message> <message> <location line="+16"/> <source>&Issuer</source> <translation>&Издатель</translation> </message> <message> <location line="+16"/> <source>Attributes</source> <translation type="unfinished">Атрибуты</translation> </message> <message> <location line="+10"/> <source>&Extensions</source> <translation type="unfinished">&Расширения</translation> </message> <message> <location line="+13"/> <location filename="../widgets/CertDetail.cpp" line="-119"/> <source>Show config</source> <translation type="unfinished"></translation> </message> </context> <context> <name>CertExtend</name> <message> <location filename="../ui/CertExtend.ui" line="+74"/> <source>This will create a new certificate as a copy of the old one with a new serial number and adjusted validity values.</source> <translation type="unfinished">Это позволит создать новый сертифика с новым серийным номером и скореректированным значением срока действия из старого сертификата.</translation> </message> <message> <location line="+34"/> <source>Validity</source> <translation>Действителен</translation> </message> <message> <location line="+20"/> <source>Not before</source> <translation>Не раньше, чем</translation> </message> <message> <location line="+7"/> <source>Not after</source> <translation>Не позже, чем</translation> </message> <message> <location line="+26"/> <source>Time range</source> <translation type="unfinished">Диапозон времяни</translation> </message> <message> <location line="+10"/> <source>Days</source> <translation type="unfinished">Дней</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation type="unfinished">Месяцев</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation type="unfinished">Лет</translation> </message> <message> <location line="+15"/> <source>Midnight</source> <translation>Полночь</translation> </message> <message> <location line="-7"/> <source>Apply</source> <translation>Применить</translation> </message> <message> <location line="-159"/> <source>Certificate renewal</source> <translation>Сертификат обновлен</translation> </message> <message> <location line="+173"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>No well-defined expiration</source> <translation type="unfinished">No well-defined expiration</translation> </message> <message> <location filename="../widgets/CertExtend.cpp" line="+43"/> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <location line="+23"/> <source>Edit times</source> <translation>Изменить время</translation> </message> <message> <location line="-22"/> <location line="+23"/> <source>Abort rollout</source> <translation>Прервать</translation> </message> <message> <location line="-22"/> <location line="+23"/> <source>Continue rollout</source> <translation>Продолжить</translation> </message> <message> <location line="-22"/> <location line="+23"/> <source>Adjust date and continue</source> <translation type="unfinished">Скорректировать дату и продолжить</translation> </message> <message> <location line="-6"/> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation type="unfinished"></translation> </message> </context> <context> <name>CertView</name> <message> <location filename="../lib/db_x509.cpp" line="+915"/> <source>There was no key found for the Certificate: </source> <translation>Не найден ключ для сетификата: </translation> </message> <message> <location line="+8"/> <source>Import Certificate signing request</source> <translation>Импорт запроса на подпись сертификата</translation> </message> </context> <context> <name>ClickLabel</name> <message> <location filename="../widgets/clicklabel.cpp" line="+23"/> <source>Double click for details</source> <translation>Щелкните дважды чтобы просмотреть детали</translation> </message> </context> <context> <name>CrlDetail</name> <message> <location filename="../ui/CrlDetail.ui" line="+180"/> <location filename="../widgets/CrlDetail.cpp" line="+29"/> <source>Name</source> <translation>Имя</translation> </message> <message> <location filename="../widgets/CrlDetail.cpp" line="+0"/> <source>Serial</source> <translation type="unfinished">Серийный номер</translation> </message> <message> <location line="+0"/> <source>Revocation</source> <translation type="unfinished">Аннулирован</translation> </message> <message> <location line="+0"/> <source>Reason</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Invalidation</source> <translation type="unfinished"></translation> </message> <message> <location line="+25"/> <source>Failed</source> <translation type="unfinished">Ошибка</translation> </message> <message> <location line="+6"/> <source>Unknown signer</source> <translation type="unfinished">Неизвестный подписавшийся</translation> </message> <message> <location line="+3"/> <source>Verification not possible</source> <translation type="unfinished">Проверка не возможна</translation> </message> <message> <location line="+24"/> <source>Unknown certificate</source> <translation type="unfinished">Неизвестный сертификат</translation> </message> <message> <location filename="../ui/CrlDetail.ui" line="-141"/> <source>Details of the Revocation list</source> <translation type="unfinished">Подробная информация о списке отзыва</translation> </message> <message> <location line="+48"/> <source>&Status</source> <translation>&Статус</translation> </message> <message> <location line="+60"/> <source>Version</source> <translation type="unfinished">Версия</translation> </message> <message> <location line="+19"/> <source>Signature</source> <translation type="unfinished">Подпись</translation> </message> <message> <location line="+7"/> <source>Signed by</source> <translation type="unfinished">Подпись</translation> </message> <message> <location line="+14"/> <source>The internal name of the CRL in the database</source> <translatorcomment>CRL - Списки отозванных сертификатов</translatorcomment> <translation type="unfinished">Внутреннее имя CRL в базе данных</translation> </message> <message> <location line="+13"/> <source>issuing dates</source> <translation type="unfinished">issuing dates</translation> </message> <message> <location line="+12"/> <source>Next Update</source> <translation type="unfinished">Следующее обновление</translation> </message> <message> <location line="+7"/> <source>Last Update</source> <translation type="unfinished">Последнее обновление</translation> </message> <message> <location line="+33"/> <source>&Issuer</source> <translation>&Издатель</translation> </message> <message> <location line="+16"/> <source>&Extensions</source> <translation type="unfinished">&Расширения</translation> </message> <message> <location line="+23"/> <source>&Revocation list</source> <translation type="unfinished">&Аннулированные списки</translation> </message> <message> <location line="+25"/> <source>0</source> <translation>0</translation> </message> </context> <context> <name>ExportCert</name> <message> <location filename="../widgets/ExportDialog.h" line="+78"/> <source>X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>DER is a binary format of the Certificate PEM is a base64 encoded Certificate PKCS#7 is an official Certificate exchange format PKCS#12 is an encrypted official Key-Certificate exchange format </source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Please enter the filename for the certificate.</source> <translation>Введите имя файла для сертификата.</translation> </message> <message> <location line="+2"/> <source>Certifikate export</source> <translation type="unfinished"></translation> </message> </context> <context> <name>ExportDer</name> <message> <location line="-45"/> <source>All files ( * )</source> <translation type="unfinished">Все файлы ( * )</translation> </message> <message> <location line="+1"/> <source>DER is a binary format PEM is a base64 encoded DER file </source> <translation type="unfinished"></translation> </message> </context> <context> <name>ExportDialog</name> <message> <location filename="../ui/ExportDialog.ui" line="+117"/> <source>...</source> <translation type="unfinished">...</translation> </message> <message> <location line="+13"/> <source>Filename</source> <translation type="unfinished">Имя файла</translation> </message> <message> <location line="+16"/> <source>Please enter the filename</source> <translation type="unfinished"></translation> </message> <message> <location line="+49"/> <source>Export Format</source> <translation type="unfinished">Формат экспорта</translation> </message> <message> <location filename="../widgets/ExportDialog.cpp" line="+61"/> <source>The file: '%1' already exists!</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Overwrite</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Do not overwrite</source> <translation type="unfinished"></translation> </message> </context> <context> <name>ExportKey</name> <message> <location filename="../widgets/ExportKey.cpp" line="+37"/> <source>Public key export</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Key export</source> <translation>Экспорт ключа</translation> </message> <message> <location line="-8"/> <source>Please enter the filename for the key.</source> <translation>Пожалуйста, введите имя файла для ключа.</translation> </message> <message> <location line="-5"/> <source>DER is a binary format of the key without encryption PEM is a base64 encoded key with optional encryption PKCS#8 is an encrypted official Key-exchange format</source> <translation>DER - это двоичный формат без шифрования PEM - это base64 формат с обязательным шифрованием PKCS#8 - это официальный формат обмена ключами с возможностью шифрования</translation> </message> <message> <location filename="../ui/ExportKey.ui" line="+23"/> <source>When exporting the private key it should be encrypted.</source> <translation type="unfinished">При экспорте закрытый ключ должен быть зашифрован.</translation> </message> <message> <location line="+7"/> <source>When exporting the private part, it should be encrypted.</source> <translation type="unfinished">При экспорте закрытые части должны быть зашифрованы.</translation> </message> <message> <location line="+3"/> <source>E&xport the private part of the Key too</source> <translation type="unfinished">&Экспорт закрытых частей вместе с ключем</translation> </message> <message> <location line="+7"/> <source>Export as PKCS#8</source> <translation>Экспорт в PKCS#8</translation> </message> <message> <location line="+10"/> <source>&Encrypt the Key with a password</source> <translation type="unfinished">&Шифрование ключа с помощью пароля</translation> </message> <message> <location filename="../widgets/ExportKey.cpp" line="-2"/> <source>Private keys ( *.pem *.der *.pk8 );;All files ( * )</source> <translation>Закрытые ключи ( *.pem *.der *.pk8 );;Все файлы ( * )</translation> </message> </context> <context> <name>Help</name> <message> <location filename="../ui/Help.ui" line="+36"/> <source><<</source> <translation><<</translation> </message> <message> <location line="+10"/> <source>>></source> <translation>>></translation> </message> <message> <location line="+26"/> <source>&Done</source> <translation>&Закрыть</translation> </message> </context> <context> <name>ImportMulti</name> <message> <location filename="../ui/ImportMulti.ui" line="+122"/> <source>Details</source> <translation>Детали</translation> </message> <message> <location line="-28"/> <source>Import &All</source> <translation>Восстановить &всё</translation> </message> <message> <location line="+7"/> <source>&Import</source> <translation>&Восстановить</translation> </message> <message> <location line="+7"/> <source>&Done</source> <translation>&Закрыть</translation> </message> <message> <location filename="../widgets/ImportMulti.cpp" line="+105"/> <location line="+145"/> <source>The type of the Item '%1' is not recognized</source> <translation type="unfinished"></translation> </message> <message> <location line="+49"/> <source>Details of the item '%1' cannot be shown</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>The type of the item '%1' is not recognized</source> <translation type="unfinished"></translation> </message> <message> <location line="+31"/> <source>The file '%1' did not contain PKI data</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>The %1 files: '%2' did not contain PKI data</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/ImportMulti.ui" line="-72"/> <source>Import PKI Items</source> <translation type="unfinished"></translation> </message> <message> <location line="+79"/> <source>&Remove from list</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>Delete from token</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Rename on token</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/ImportMulti.cpp" line="-278"/> <source> Name: %1 Model: %2 Serial: %3</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Manage security token</source> <translation type="unfinished"></translation> </message> </context> <context> <name>KeyDetail</name> <message> <location filename="../widgets/KeyDetail.cpp" line="+62"/> <source>Available</source> <translation>Есть в наличии</translation> </message> <message> <location line="-12"/> <source>Not available</source> <translation>Нет в наличии</translation> </message> <message> <location filename="../ui/KeyDetail.ui" line="+91"/> <source>Name</source> <translation>Имя</translation> </message> <message> <location line="+7"/> <source>The internal name of the key used by xca</source> <translation>Внутреннее имя ключа, используемого в XCA</translation> </message> <message> <location line="+83"/> <source>Keysize</source> <translation>Размер ключа</translation> </message> <message> <location line="+27"/> <source>Private Exponent</source> <translation>Закрытая Экспонента</translation> </message> <message> <location line="-53"/> <source>Public Exponent</source> <translation>Открытая Экспонента</translation> </message> <message> <location line="+78"/> <source>Modulus</source> <translation>Значение открытого ключа</translation> </message> <message> <location filename="../widgets/KeyDetail.cpp" line="+21"/> <source>Sub prime</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <location line="+9"/> <source>Public key</source> <translation>Открытый ключ</translation> </message> <message> <location line="-8"/> <location line="+9"/> <source>Private key</source> <translation>Закрытый ключ</translation> </message> <message> <location filename="../ui/KeyDetail.ui" line="-123"/> <source>Security token</source> <translation>Токен</translation> </message> <message> <location line="+6"/> <source>Manufacturer</source> <translation>Изготовитель</translation> </message> <message> <location line="+14"/> <source>Serial</source> <translation>Серийный номер</translation> </message> <message> <location line="+17"/> <location filename="../widgets/KeyDetail.cpp" line="-22"/> <source>Key</source> <translation>Ключ</translation> </message> <message> <location filename="../widgets/KeyDetail.cpp" line="-5"/> <source>Token</source> <translation>Токен</translation> </message> <message> <location line="+28"/> <source>Curve name</source> <translation>Характеристики имени</translation> </message> <message> <location line="-36"/> <source>Details of the %1 key</source> <translation>Характеристики %1 ключа</translation> </message> <message> <location line="+12"/> <source>Security token ID:%1</source> <translation>ID Токена:%1</translation> </message> <message> <location line="+31"/> <source>Unknown key</source> <translation>Неизвестный ключ</translation> </message> </context> <context> <name>MainWindow</name> <message> <location filename="../widgets/MainWindow.cpp" line="+752"/> <source>Password</source> <translation>Пароль</translation> </message> <message> <location line="-1"/> <source>Password verify error, please try again</source> <translation>Неверный пароль, попробуйте еще раз</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="+38"/> <source>&Close DataBase</source> <translation>&Закрыть базу данных</translation> </message> <message> <location line="+48"/> <source>&Content</source> <translation>&Содержание</translation> </message> <message> <location line="+2"/> <source>&About</source> <translation>&О программе</translation> </message> <message> <location line="-59"/> <source>&File</source> <translation>&Файл</translation> </message> <message> <location line="+56"/> <source>&Help</source> <translation>&Помощь</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-128"/> <location line="+102"/> <source>New Password</source> <translation>Новый Пароль</translation> </message> <message> <location line="+62"/> <source>The following error occured:</source> <translation>Внимание произошла ошибка:</translation> </message> <message> <location line="+3"/> <source>Copy to Clipboard</source> <translation>Копировать в буфер обмена</translation> </message> <message> <location filename="../ui/MainWindow.ui" line="+28"/> <source>Private Keys</source> <translation>Закрытые ключи</translation> </message> <message> <location line="+30"/> <source>&New Key</source> <translation>&Новый ключ</translation> </message> <message> <location line="+7"/> <location line="+111"/> <location line="+98"/> <location line="+144"/> <location line="+70"/> <source>&Export</source> <translation>&Экспорт</translation> </message> <message> <location line="-416"/> <location line="+111"/> <location line="+98"/> <location line="+130"/> <location line="+84"/> <source>&Import</source> <translation>&Импорт</translation> </message> <message> <location line="-416"/> <source>Import PFX (PKCS#12)</source> <translation>Импорт PFX (PKCS#12)</translation> </message> <message> <location line="+7"/> <location line="+104"/> <location line="+98"/> <location line="+214"/> <source>&Show Details</source> <translation>&Посмотреть детали</translation> </message> <message> <location line="-409"/> <location line="+104"/> <location line="+98"/> <location line="+109"/> <location line="+105"/> <source>&Delete</source> <translation>&Удалить</translation> </message> <message> <location line="-376"/> <source>Certificate signing requests</source> <translation>Запросы на сертификаты</translation> </message> <message> <location line="+36"/> <source>&New Request</source> <translation>&Новый запрос</translation> </message> <message> <location line="+68"/> <location filename="../widgets/MW_menu.cpp" line="-27"/> <source>Certificates</source> <translation>Сертификаты</translation> </message> <message> <location line="+30"/> <source>&New Certificate</source> <translation>&Новый сертификат</translation> </message> <message> <location line="+35"/> <source>Import &PKCS#12</source> <translation>Импорт &PKCS#12</translation> </message> <message> <location line="+7"/> <source>Import P&KCS#7</source> <translation>Импорт P&KCS#7</translation> </message> <message> <location line="+7"/> <source>Plain View</source> <translation>Список</translation> </message> <message> <location line="+40"/> <source>Templates</source> <translation>Шаблоны</translation> </message> <message> <location line="+34"/> <source>&New template</source> <translation>&Новый шаблон</translation> </message> <message> <location line="+7"/> <source>Ch&ange Template</source> <translation>Из&менить шаблон</translation> </message> <message> <location line="+61"/> <source>Revocation lists</source> <translation>Списки отозванных сертификатов</translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="+177"/> <source>Database</source> <translation>База данных</translation> </message> <message> <location line="+70"/> <source>No deleted items found</source> <translation>Нет удаленных записей</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-18"/> <source>&Dump DataBase</source> <translation>&Дамп базы данных</translation> </message> <message> <location line="+4"/> <source>&Import old db_dump</source> <translation>&Импорт дампа базы данных</translation> </message> <message> <location line="+2"/> <source>&Undelete items</source> <translation>&Восстановить удаленные записи</translation> </message> <message> <location line="+3"/> <source>Options</source> <translation>Опции</translation> </message> <message> <location line="+5"/> <source>Keys</source> <translation>Ключи</translation> </message> <message> <location line="+2"/> <source>Requests</source> <translation>Запросы</translation> </message> <message> <location line="+4"/> <source>PKCS#12</source> <translation>PKCS#12</translation> </message> <message> <location line="+2"/> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <location line="+2"/> <source>Template</source> <translation>Шаблоны</translation> </message> <message> <location line="+2"/> <source>Revocation list</source> <translation>Аннулированные списки</translation> </message> <message> <location line="+2"/> <source>PEM file</source> <translation>PEM файлы</translation> </message> <message> <location line="+21"/> <source>Donations</source> <translation>Пожертвование</translation> </message> <message> <location line="+51"/> <source>Import password</source> <translation>Импорт пароля</translation> </message> <message> <location line="+1"/> <source>Please enter the password of the old database</source> <translation>Пожалуйста, введите пароль от старой базы данных</translation> </message> <message> <location line="+7"/> <source>Password verification error. Ignore keys ?</source> <translation>Неверный пароль. Игнорировать ключи?</translation> </message> <message> <location line="+1"/> <source>Import anyway</source> <translation type="unfinished">Импортировать в любом случае</translation> </message> <message> <location line="+0"/> <source>Cancel</source> <translation>Отмена</translation> </message> <message> <location line="-96"/> <source>I&mport</source> <translation>И&мпорт</translation> </message> <message> <location line="+17"/> <source>paste PEM file</source> <translation type="unfinished">Вставить PEM данные</translation> </message> <message> <location line="+65"/> <source>Database dump ( *.dump );;All files ( * )</source> <translation>Дамп базы данных ( *.dump );;All files ( * )</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-369"/> <source>Import PEM data</source> <translation>Импорт</translation> </message> <message> <location line="+43"/> <source>The new label of the token '%1'</source> <translation>Новое название Токена '%1'</translation> </message> <message> <location line="+159"/> <source>Please enter the new password to encrypt your private keys in the database-file</source> <translation>Пожалуйста, введите новый пароль для шифрования закрытых ключей в базе данных</translation> </message> <message> <location line="+102"/> <source>Please enter a password, that will be used to encrypt your private keys in the database file: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>Please enter the password for unlocking the database: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+109"/> <source>Diffie-Hellman parameters are needed for different applications, but not handled by XCA. Please enter the DH parameter bits</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-105"/> <source>&New DataBase</source> <translation>&Новая база данных</translation> </message> <message> <location line="+2"/> <source>&Open DataBase</source> <translation>&Открыть базу данных</translation> </message> <message> <location line="+44"/> <source>&Init Security token</source> <translation>&Инициализировать Токен</translation> </message> <message> <location line="-34"/> <source>C&hange DataBase password</source> <translation>С&менить пароль базы данных</translation> </message> <message> <location line="+9"/> <source>Exit</source> <translation>Выход</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-527"/> <source>no such option: %1</source> <translation type="unfinished">нет таких вариантов: %1</translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="-72"/> <source>Using or exporting private keys will not be possible without providing the correct password</source> <translation type="unfinished">Использование или экспорт закрытых ключей будет невозможным без ввода правильного пароля</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="+116"/> <source>Please enter the original SO PIN (PUK) of the token '%1'</source> <translation type="unfinished">Пожалуйста, введите первоначальный PIN SO (PUK) для Токена '%1'</translation> </message> <message> <location line="+6"/> <source>Please enter the new SO PIN (PUK) of the token '%1'</source> <translation type="unfinished">Пожалуйста, введите новый PIN SO (PUK) для Токена '%1'</translation> </message> <message> <location line="+116"/> <source>The token '%1' did not contain any keys or certificates</source> <translation type="unfinished">Маркер '%1' не содержит никаких ключей или сертификатов</translation> </message> <message> <location line="+312"/> <source>Error opening file: '%1': %2</source> <translation type="unfinished">Ошибка открытия файла: '%1': %2</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-17"/> <source>Generate DH parameter</source> <translation type="unfinished">Создать DH параметр</translation> </message> <message> <location line="+2"/> <source>Set as default DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+37"/> <source>&Token</source> <translation>&Токен</translation> </message> <message> <location line="+1"/> <source>&Manage Security token</source> <translation>&Управление Токенами</translation> </message> <message> <location line="+4"/> <source>&Change PIN</source> <translation>&Сменить PIN</translation> </message> <message> <location line="+2"/> <source>Change &SO PIN</source> <translation>Сменить &SO PIN</translation> </message> <message> <location line="+2"/> <source>Init PIN</source> <translation type="unfinished">Инициализировать PIN</translation> </message> </context> <context> <name>NewCrl</name> <message> <location filename="../ui/NewCrl.ui" line="+36"/> <source>Create CRL</source> <translation>Создание CRL</translation> </message> <message> <location line="+54"/> <source>Dates</source> <translation>Даты</translation> </message> <message> <location line="+22"/> <source>next update</source> <translation type="unfinished">следующее обновление</translation> </message> <message> <location line="-14"/> <source>last update</source> <translation type="unfinished">последнее обновление</translation> </message> <message> <location line="+43"/> <source>Days</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Months</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Years</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>Midnight</source> <translation type="unfinished">Полночь</translation> </message> <message> <location line="+7"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Apply</source> <translation type="unfinished">Применить</translation> </message> <message> <location line="+12"/> <source>Hashing algorithm</source> <translation>Алгоритм хэширования</translation> </message> <message> <location line="+12"/> <source>Extensions</source> <translation>Расширения</translation> </message> <message> <location line="+6"/> <source>Authority key identifier</source> <translation type="unfinished">Идентификатор ключа ЦС</translation> </message> <message> <location line="+7"/> <source>Subject alternative name</source> <translation>Альтернативное имя владельца</translation> </message> <message> <location line="+7"/> <source>CRL Number</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Revokation reasons</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NewKey</name> <message> <location filename="../ui/NewKey.ui" line="+14"/> <location line="+25"/> <source>New key</source> <translation>Новый ключ</translation> </message> <message> <location line="+47"/> <source>Please give a name to the new key and select the desired keysize</source> <translation>Введите название и задайте тип и размер нового ключа</translation> </message> <message> <location line="+10"/> <source>Key properties</source> <translation>Свойства ключа</translation> </message> <message> <location line="+6"/> <source>Name</source> <translation>Имя ключа</translation> </message> <message> <location line="+56"/> <source>Keysize</source> <translation>Длинна ключа</translation> </message> <message> <location line="+13"/> <source>Usually 1024 or 2048 bit keys are used</source> <translation>Обычно используют 1024 или 2048 битные ключи</translation> </message> <message> <location line="-50"/> <source>The internal name of the new key</source> <translation>Внутреннее имя нового ключа</translation> </message> <message> <location line="+3"/> <source>New Key</source> <translation>Новый ключ</translation> </message> <message> <location line="+54"/> <source>Keytype</source> <translation>Тип ключа</translation> </message> <message> <location line="-27"/> <source>Curve</source> <translation>Характеристики</translation> </message> <message> <location filename="../widgets/NewKey.cpp" line="+142"/> <source>Create</source> <translation type="unfinished">Создать</translation> </message> </context> <context> <name>NewX509</name> <message> <location filename="../ui/NewX509.ui" line="+30"/> <location filename="../widgets/NewX509.cpp" line="+235"/> <source>Create</source> <translation>Создать</translation> </message> <message> <location line="+48"/> <source>Source</source> <translation>Источник</translation> </message> <message> <location line="+22"/> <source>Signing request</source> <translation>Подписанный запрос</translation> </message> <message> <location line="+21"/> <source>A certificate signing request can be signed, even if the private key of the request is not available. This is the intention of a CSR: Getting signed by a CA certificate, whoes certificate of course must be in the database Of course you need the private key of the CSR if you want to create a self-signed cert from it.</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>Show request</source> <translation type="unfinished">Показать запрос</translation> </message> <message> <location line="+7"/> <source>Sign this Certificate signing &request</source> <translation type="unfinished">Использавать подписанный &запрос на сертификат</translation> </message> <message> <location line="+7"/> <source>Copy extensions from the request</source> <translation type="unfinished">Копировать расширения из запроса</translation> </message> <message> <location line="+51"/> <source>Signing</source> <translation>Подписание</translation> </message> <message> <location line="+20"/> <source>Create a &self signed certificate with the serial</source> <translation>Создать &самоподписанный сертификат с серийным номером</translation> </message> <message> <location line="+10"/> <source>If you leave this blank the serial 00 will be used</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>1</source> <translation>1</translation> </message> <message> <location line="+24"/> <source>All certificates in your database that can create valid signatures</source> <translation type="unfinished">Все сертификаты в базе данных, которыми можно создать действительные подписи</translation> </message> <message> <location line="+3"/> <source>This list contains all certificates with the CA-flag set to true and whoes private key is present in the key-database. If this list is disabled, you only can create a self-signed certificate.</source> <translation type="unfinished"></translation> </message> <message> <location line="+34"/> <source>Signature algorithm</source> <translation>Алгоритм подписи</translation> </message> <message> <location line="+28"/> <source>Template for the new certificate</source> <translation>Шаблон для нового сертификата</translation> </message> <message> <location line="+12"/> <source>All available templates</source> <translation>Все имеющиеся шаблоны</translation> </message> <message> <location line="+3"/> <source>This list contains all templates from the toplevel template Tab</source> <translation type="unfinished"></translation> </message> <message> <location line="+552"/> <source>Apply</source> <translation>Применить</translation> </message> <message> <location line="-481"/> <location filename="../widgets/NewX509.cpp" line="+204"/> <source>Subject</source> <translation>Владелец</translation> </message> <message> <location line="-158"/> <source>Use &this Certificate for signing</source> <translation type="unfinished"></translation> </message> <message> <location line="+170"/> <source>Distinguished name</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>This name is only used internally and does not appear in the resulting certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Must be exactly 2 letter of size (DE, UK)</source> <translation type="unfinished">Код страны состоит из 2х символов (RU,BY,UK)</translation> </message> <message> <location line="+76"/> <source>Internal name</source> <translation>Внутреннее имя</translation> </message> <message> <location line="+46"/> <source>Add</source> <translation>Добавить</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Удалить</translation> </message> <message> <location line="+37"/> <source>Private key</source> <translation>Закрытый ключ</translation> </message> <message> <location line="+18"/> <source>This list only contains unused keys</source> <translation type="unfinished">Этот список содержит только неиспользованные ключи</translation> </message> <message> <location line="+7"/> <source>Used keys too</source> <translation type="unfinished">Отображать уже использованные ключи</translation> </message> <message> <location line="+7"/> <source>&Generate a new key</source> <translation>&Создать новый ключ</translation> </message> <message> <location line="+11"/> <source>Extensions</source> <translation>Расширения</translation> </message> <message> <location line="+8"/> <source>Basic constraints</source> <translation>Основные ограничения</translation> </message> <message> <location line="+9"/> <source>Type</source> <translation>Тип</translation> </message> <message> <location line="+7"/> <source>If this will become a CA certificate or not</source> <translation>Субъектом сертификата может быть конечный пользователь, система или ЦС</translation> </message> <message> <location line="+3"/> <source>Set this to TRUE if you want to create a CA certificate that signs other certificates. This is always set to FALSE for client or server certificates. In most cases self-signed certificates are CA certificates. Self-signed non-CA certificates are unusual although they are possible.</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Not defined</source> <translation>Не определен</translation> </message> <message> <location line="+5"/> <source>Certification Authority</source> <translation>Центр Сертификации</translation> </message> <message> <location line="+5"/> <source>End Entity</source> <translation>Конечный пользователь</translation> </message> <message> <location line="+8"/> <source>Path length</source> <translation type="unfinished">Длинна пути</translation> </message> <message> <location line="+7"/> <source>How much CAs may be below this.</source> <translation type="unfinished">Колличество ЦС может быть ниже этого.</translation> </message> <message> <location line="+3"/> <source>If this is left empty the pathlen is not included in the certificate. Otherwise it distinguishes the count of chained CA certificates below this one. A pathlen of 0 means, that this certificate may not issue other sub-CA certificates. Although it can do it, all chain-checking algorithms in e.g. your browser or openssl will (should) fail.</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>The basic constraints should always be critical</source> <translation type="unfinished">Основные ограничения всегда должны быть введены</translation> </message> <message> <location line="+13"/> <source>Key identifier</source> <translation>Идентификотор ключа</translation> </message> <message> <location line="+15"/> <source>Creates a hash of the key following the PKIX guidelines</source> <translation type="unfinished">Идентификатор ключа субъекта, используется для того, чтобы различать ключи подписи в сертификатах одного и того же владельца</translation> </message> <message> <location line="+10"/> <source>Copy the Subject Key Identifier from the issuer</source> <translatorcomment>Идентификатор ключа владельца используется для того, чтобы различать ключи подписи в сертификатах одного и того же владельца</translatorcomment> <translation type="unfinished">Копировать идентификатор ключа владельца из издателя</translation> </message> <message> <location line="+3"/> <source>If this box is checked an attempt is made to copy the subject key identifier from the signing certificate. It also copies the issuer and serial number from the issuer certificate. Normally this will only be done if the keyid option fails.</source> <translation type="unfinished"></translation> </message> <message> <location line="+41"/> <source>Validity</source> <translation type="unfinished">Период действия</translation> </message> <message> <location line="+6"/> <source>Not before</source> <translation>Не раньше,чем</translation> </message> <message> <location line="+14"/> <source>Not after</source> <translation>Не позже, чем</translation> </message> <message> <location line="+17"/> <source>Time range</source> <translation>Временной диапазон</translation> </message> <message> <location line="+10"/> <source>Days</source> <translation>Дни</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Месяцы</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Года</translation> </message> <message> <location line="+21"/> <source>Set the time to 00:00:00 and 23:59:59 respectively</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Midnight</source> <translation>Полночь</translation> </message> <message> <location line="+7"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location line="+166"/> <source>Authority Info Access</source> <translation>способ доступа к информации ЦС</translation> </message> <message> <location line="-52"/> <source>CRL distribution point</source> <translation>пункт распостраненния САС</translation> </message> <message> <location line="-30"/> <source>issuer alternative name</source> <translation>алтернативное имя издателя</translation> </message> <message> <location line="+59"/> <source>URI:</source> <translation>URI:</translation> </message> <message> <location line="+3"/> <source>This is a multi-valued extension that supports all the literal options of subject alternative name. Of the few software packages that currentlyi nterpret this extension most only interpret the URI option. Currently each option will set a new DistributionPoint with the fullName field set to the given value. Other fields like cRLissuer and reasons cannot currently be set or displayed: at this time no examples were available that used these fields. If you see this extension with <UNSUPPORTED> when you attempt to print it out or it doesn't appear to display correctly then let steve know, including the certificate (mail steve at openssl dot org) . Examples: URI:http://www.myhost.com/myca.crl URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl</source> <translation type="unfinished"></translation> </message> <message> <location line="+49"/> <source>can be altered by the file "aia.txt"</source> <translation type="unfinished">может быть изменен в файле "aia.txt"</translation> </message> <message> <location line="-118"/> <location line="+30"/> <location line="+52"/> <location line="+58"/> <location filename="../widgets/NewX509.cpp" line="-200"/> <location line="+564"/> <source>Edit</source> <translation>Редактировать</translation> </message> <message> <location line="-153"/> <location line="+30"/> <location line="+108"/> <source>DNS: IP: URI: email: RID:</source> <translation>DNS: IP: URI: email: RID:</translation> </message> <message> <location line="+3"/> <source>The authority information access extension gives details about how to access certain information relating to the CA. Its syntax is accessOID;location where 'location' has the same syntax as subject alternative name (except that email:copy is not supported). accessOID can be any valid OID but only certain values are meaningful for example OCSP and caIssuers. OCSP gives the location of an OCSP responder: this is used by Netscape PSM and other software. Example: OCSP;URI:http://ocsp.my.host/ caIssuers;URI:http://my.ca/ca.html</source> <translation type="unfinished"></translation> </message> <message> <location line="-138"/> <source>The subject alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name) , RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation type="unfinished"></translation> </message> <message> <location line="-32"/> <source>subject alternative name</source> <translation>альтернативное имя владельца</translation> </message> <message> <location line="+62"/> <source>The issuer alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name), RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation type="unfinished"></translation> </message> <message> <location line="+149"/> <location line="+20"/> <source>Key usage</source> <translation>Область применения ключа</translation> </message> <message> <location line="+77"/> <source>Extended key usage</source> <translation>Расширенная область применения ключа</translation> </message> <message> <location line="+35"/> <source>Netscape</source> <translation>Netscape</translation> </message> <message> <location line="+133"/> <source>CA Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>SSL server name</source> <translation type="unfinished"></translation> </message> <message> <location line="+16"/> <source>Certificate renewal URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Comment</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>CA policy URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Base URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>If you know a more pretty one tell me</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-696"/> <source>Create a &self signed certificate with a MD5-hashed QA serial</source> <translation type="unfinished"></translation> </message> <message> <location line="+77"/> <source>Create Certificate signing request</source> <translation>Создание запроса на сертификат</translation> </message> <message> <location line="+57"/> <source>XCA template</source> <translation>Шаблон XCA</translation> </message> <message> <location line="+10"/> <source>Create x509 Certificate</source> <translation type="unfinished">Создание x509 сертификата</translation> </message> <message> <location line="+701"/> <location line="+14"/> <location line="+20"/> <location line="+11"/> <location line="+17"/> <location line="+15"/> <location line="+30"/> <location line="+12"/> <location line="+24"/> <location line="+23"/> <location line="+20"/> <source>Abort rollout</source> <translation type="unfinished">Прервать</translation> </message> <message> <location line="-177"/> <source>The following length restrictions of RFC3280 are violated:</source> <translation type="unfinished"></translation> </message> <message> <location line="+34"/> <source>The internal name and the common name are empty. Please set at least the internal name.</source> <translation type="unfinished"></translation> </message> <message> <location line="+16"/> <source>There is no Key selected for signing.</source> <translation type="unfinished"></translation> </message> <message> <location line="-44"/> <location line="+63"/> <location line="+42"/> <location line="+24"/> <location line="+43"/> <source>Continue rollout</source> <translation type="unfinished">Продолжить</translation> </message> <message> <location line="-25"/> <source>The certificate will be out of date before it becomes valid. You most probably mixed up both dates.</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/NewX509.ui" line="-1340"/> <source>Modify subject of the request</source> <translation type="unfinished">Изменить владельца в запросе</translation> </message> <message> <location line="+1370"/> <source>Advanced</source> <translation>Дополнительно</translation> </message> <message> <location line="+24"/> <location filename="../widgets/NewX509.cpp" line="-301"/> <source>Validate</source> <translation type="unfinished">Утвердить</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="+170"/> <source>The verification of the Certificate request failed. The rollout should be aborted.</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Continue anyway</source> <translation type="unfinished">Продолжать в любом случае</translation> </message> <message> <location filename="../ui/NewX509.ui" line="-640"/> <source>No well-defined expiration</source> <translation>Нет четко определенного срока</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="+11"/> <source>Edit name</source> <translation type="unfinished">Изменить имя</translation> </message> <message> <location line="+17"/> <source>Select key</source> <translation type="unfinished">Выберете ключ</translation> </message> <message> <location line="+12"/> <source>The following distinguished name entries are empty: %1 though you have declared them as mandatory in the options menu.</source> <translation type="unfinished"></translation> </message> <message> <location line="-60"/> <location line="+63"/> <source>Edit subject</source> <translation type="unfinished">Изменить владельца</translation> </message> <message> <location line="+42"/> <location line="+24"/> <location line="+23"/> <source>Edit dates</source> <translation type="unfinished">Изменить дату</translation> </message> <message> <location line="-62"/> <source>The key you selected for signing is not a private one.</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Select other signer</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Select other key</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <location line="+24"/> <source>Adjust date and continue</source> <translation type="unfinished">Скорректировать дату и продолжить</translation> </message> <message> <location line="-6"/> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation type="unfinished"></translation> </message> <message> <location line="+43"/> <source>The certificate contains invalid or duplicate extensions. Check the validation on the advanced tab.</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Edit extensions</source> <translation type="unfinished">Изменить расширения</translation> </message> <message> <location filename="../ui/NewX509.ui" line="-475"/> <source>Organisation</source> <translation type="unfinished">Организация (O)</translation> </message> <message> <location line="+37"/> <source>Country code</source> <translation>Код страны (C)</translation> </message> <message> <location line="+10"/> <source>State or Province</source> <translation>Республика, край, область (ST)</translation> </message> <message> <location line="+13"/> <source>Locality</source> <translation>Город, поселок, село</translation> </message> <message> <location line="+10"/> <source>Organisational unit</source> <translation type="unfinished">Департамент, отдел (OU)</translation> </message> <message> <location line="+10"/> <source>E-Mail address</source> <translation type="unfinished">Адрес эл.почты</translation> </message> <message> <location line="+29"/> <source>Common name</source> <translation>Общее имя (CN)</translation> </message> <message> <location line="-188"/> <source>Apply extensions</source> <translation type="unfinished">Применить расширения</translation> </message> <message> <location line="+7"/> <source>Apply subject</source> <translation type="unfinished">Применить владельца</translation> </message> <message> <location line="+13"/> <source>Apply all</source> <translation type="unfinished">Применить все</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-926"/> <source>minimum size: %1</source> <translation type="unfinished">минимальный размер: %1</translation> </message> <message> <location line="+2"/> <source>maximum size: %1</source> <translation type="unfinished">максимальный размер: %1</translation> </message> <message> <location line="+2"/> <source>only a-z A-Z 0-9 '()+,-./:=?</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>only 7-bit clean characters</source> <translation type="unfinished"></translation> </message> <message> <location line="+609"/> <source>From PKCS#10 request</source> <translation type="unfinished"></translation> </message> <message> <location line="+15"/> <source>Other Tabs</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>Advanced Tab</source> <translation type="unfinished">Вкладка "Дополнительно"</translation> </message> <message> <location line="+7"/> <source>Errors</source> <translation type="unfinished">Ошибки</translation> </message> <message> <location filename="../widgets/NewX509_ext.cpp" line="+220"/> <source>Configfile error on line %1 </source> <translation type="unfinished">Ошибка кофигурационного файла в строке %1 </translation> </message> </context> <context> <name>Options</name> <message> <location filename="../ui/Options.ui" line="+38"/> <source>Mandatory subject entries</source> <translation type="unfinished">Обязательные записи</translation> </message> <message> <location line="+24"/> <location line="+103"/> <source>Add</source> <translation type="unfinished">Добавить</translation> </message> <message> <location line="-96"/> <source>Delete</source> <translation type="unfinished">Удалить</translation> </message> <message> <location line="+33"/> <source>Default hash algorithm</source> <translation type="unfinished">Хэш-алгоритм по-умолчанию</translation> </message> <message> <location line="+20"/> <source>String types</source> <translation type="unfinished">Типы строк</translation> </message> <message> <location line="+12"/> <source>Suppress success messages</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Don't colorize expired certificates</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>PKCS#11 provider</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>Remove</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/Options.cpp" line="+34"/> <source>UTF8 strings only (RFC2459)</source> <translation type="unfinished">Только строки UTF8 (RFC2459)</translation> </message> <message> <location line="-3"/> <source>Printable string or UTF8 (default)</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PKIX recommendation in RFC2459</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>No BMP strings, only printable and T61</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All strings</source> <translation>Все строки</translation> </message> <message> <location line="+136"/> <source>Load failed</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/Options.ui" line="-157"/> <source>XCA Options</source> <translation>Опции XCA</translation> </message> </context> <context> <name>PwDialog</name> <message> <location filename="../widgets/PwDialog.cpp" line="+85"/> <source>Repeat %1</source> <translation type="unfinished">Повторить %1</translation> </message> <message> <location line="+14"/> <source>%1 missmatch</source> <translation type="unfinished">Несоответствие %1</translation> </message> <message> <location line="+7"/> <source>Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it must consist of an even number of characters</source> <translation type="unfinished">Hex пароль должен содержать символы '0 '- '9' и 'a' - 'f' и должен состоять из четного числа символов</translation> </message> <message> <location line="+26"/> <source>E&xit</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/PwDialog.ui" line="+118"/> <source>The password is parsed as 2-digit hex code. It must have an even number of digits (0-9 and a-f)</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Take as HEX string</source> <translation type="unfinished"></translation> </message> </context> <context> <name>QObject</name> <message> <location filename="../lib/load_obj.cpp" line="+54"/> <source>Import RSA key</source> <translation>Импорт RSA ключа</translation> </message> <message> <location line="+14"/> <source>Import Request</source> <translation>Импорт запроса</translation> </message> <message> <location line="+13"/> <source>Import X.509 Certificate</source> <translation>Импорт X.509 сертификата</translation> </message> <message> <location line="+13"/> <source>Import PKCS#7 Certificates</source> <translation>Импорт сертификата PKCS#7</translation> </message> <message> <location line="+13"/> <source>Import PKCS#12 Private Certificate</source> <translation>Импорт закрытого сертификата PKCS#12</translation> </message> <message> <location line="+14"/> <source>Import XCA Templates</source> <translation>Импорт XCA шаблонов</translation> </message> <message> <location line="+13"/> <source>Import Certificate Revocation List</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>Open XCA Database</source> <translation>Открыть базу данных XCA</translation> </message> <message> <location line="-95"/> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;</source> <translation>PKI ключи ( *.pem *.der *.key );;PKCS#8 ключи ( *.p8 *.pk8 );;</translation> </message> <message> <location line="+14"/> <source>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>Certificates ( *.pem *.der *.crt *.cer );;</source> <translation>Сертификаты ( *.pem *.der *.crt *.cer );;</translation> </message> <message> <location line="+13"/> <source>PKCS#7 data ( *.p7s *.p7m *.p7b );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>PKCS#12 Certificates ( *.p12 *.pfx );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>XCA templates ( *.xca );;</source> <translation>XCA шаблоны ( *.xca );;</translation> </message> <message> <location line="+13"/> <source>Revocation lists ( *.pem *.der *.crl );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>XCA Databases ( *.xdb );;</source> <translation>Базы данных XCA ( *.xdb );;</translation> </message> <message> <location line="+11"/> <source>PKCS#11 library ( *.dylib *.so );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>PEM files ( *.pem );;</source> <translation>PEM файлы ( *.pem );;</translation> </message> <message> <location line="+1"/> <source>Load PEM encoded file</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/x509name.cpp" line="+106"/> <source>Invalid</source> <translation type="unfinished"></translation> </message> <message> <location line="+113"/> <source>%1 is shorter than %2 bytes: '%3'</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>%1 is longer than %2 bytes: '%3'</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/load_obj.cpp" line="-149"/> <source>All files ( * )</source> <translation>Все файлы ( * )</translation> </message> <message> <location filename="../lib/asn1time.cpp" line="+127"/> <location line="+10"/> <location line="+19"/> <source>Undefined</source> <translation type="unfinished"></translation> </message> <message> <location line="-27"/> <location line="+10"/> <location line="+19"/> <source>Broken / Invalid</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/db.cpp" line="+176"/> <source>DB: Rename: '%1' already in use</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>DB: Entry to rename not found: %1</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/load_obj.cpp" line="+135"/> <source>PKCS#11 library ( *.dll );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>PKCS#11 library ( *.so );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Open PKCS#11 shared library</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/db.cpp" line="+10"/> <source>DB: Write error %1 - %2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/pkcs11.cpp" line="+224"/> <source>Please enter the PIN on the PinPad</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Please enter the SO PIN (PUK) of the token %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Please enter the PIN of the token %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+50"/> <source>No Security token found</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/exception.h" line="+55"/> <source>Out of Memory at %1:%2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/db.cpp" line="+243"/> <location line="+17"/> <source>Out of data</source> <translation type="unfinished"></translation> </message> <message> <location line="+23"/> <source>Error finding endmarker of string</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/pkcs11.cpp" line="+11"/> <source>Select</source> <translation type="unfinished"></translation> </message> <message> <location line="+22"/> <source>Please enter the new SO PIN (PUK) for the token: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Please enter the new PIN for the token: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/pkcs11.h" line="+80"/> <source>Required PIN size: %1 - %2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/pkcs11_lib.cpp" line="+50"/> <source>Failed to open PKCS11 library: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+218"/> <source>PKCS#11 function '%1' failed: %2</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>PKCS#11 function '%1' failed: %2 In library %3 %4</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Revoke</name> <message> <location filename="../ui/Revoke.ui" line="+17"/> <source>Revokation details</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Invalid since</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Revokation reason</source> <translation type="unfinished"></translation> </message> </context> <context> <name>SearchPkcs11</name> <message> <location filename="../ui/SearchPkcs11.ui" line="+14"/> <source>Dialog</source> <translation type="unfinished"></translation> </message> <message> <location line="+27"/> <source>Directory</source> <translation type="unfinished"></translation> </message> <message> <location line="+16"/> <source>...</source> <translation type="unfinished">...</translation> </message> <message> <location line="+7"/> <source>include sub directorys</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/SearchPkcs11.cpp" line="+77"/> <source>The following files are possible PKCS#11 libraries</source> <translation type="unfinished"></translation> </message> </context> <context> <name>SelectToken</name> <message> <location filename="../ui/SelectToken.ui" line="+14"/> <source>Select Token</source> <translation>Выберите Токен</translation> </message> <message> <location line="+25"/> <source>Security token</source> <translation>Токен</translation> </message> <message> <location line="+47"/> <source>Please select the security token</source> <translation>Пожалуйста, выберите Токен</translation> </message> </context> <context> <name>TrustState</name> <message> <location filename="../ui/TrustState.ui" line="+115"/> <source>Trustment</source> <translation type="unfinished">Доверия</translation> </message> <message> <location line="+12"/> <source>&Never trust this certificate</source> <translation>&Никогда не доверять этому сертификату</translation> </message> <message> <location line="+7"/> <source>Only &trust this certificate, if we trust the signer</source> <translation type="unfinished">Доверять этому сертификату &только, ели есть доверие к подписавшему</translation> </message> <message> <location line="+7"/> <source>&Always trust this certificate</source> <translation>&Всегда доверять этому сертификату</translation> </message> <message> <location line="-102"/> <source>Set trustment of the Certificate</source> <translation type="unfinished">Установить доверия сертификата</translation> </message> </context> <context> <name>Validity</name> <message> <location filename="../widgets/validity.cpp" line="+94"/> <source>yyyy-MM-dd hh:mm</source> <translation type="unfinished">yyyy-MM-dd hh:mm</translation> </message> </context> <context> <name>db_base</name> <message> <location filename="../lib/db_base.cpp" line="+28"/> <source>Internal name</source> <translation type="unfinished">Внутреннее имя</translation> </message> <message> <location line="+641"/> <source>Reset</source> <translation type="unfinished"></translation> </message> <message> <location line="-2"/> <source>Subject entries</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>X509v3 Extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>Paste PEM data</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Columns</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_crl</name> <message> <location filename="../lib/db_crl.cpp" line="+22"/> <source>Signer</source> <translation type="unfinished">Подписавший</translation> </message> <message> <location line="+1"/> <source>Internal name of the signer</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>No. revoked</source> <translation type="unfinished">Номер CRL</translation> </message> <message> <location line="+1"/> <source>Number of revoked certificates</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Last update</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Next update</source> <translation type="unfinished">Следующее обновление</translation> </message> <message> <location line="+1"/> <source>CRL number</source> <translation type="unfinished"></translation> </message> <message> <location line="+106"/> <source>CRL ( *.pem *.der *.crl )</source> <translation type="unfinished">CRL ( *.pem *.der *.crl )</translation> </message> <message> <location line="+2"/> <source>Revokation list export</source> <translation type="unfinished"></translation> </message> <message> <location line="+87"/> <source>Import</source> <translation>Импорт</translation> </message> <message> <location line="+2"/> <source>Rename</source> <translation>Переименовать</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation>Экспорт</translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>File</source> <translation type="unfinished">Файл</translation> </message> <message> <location line="+1"/> <source>Delete</source> <translation>Удалить</translation> </message> <message> <location line="-131"/> <source>The revokation list already exists in the database as: '%1' and so it was not imported</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_key</name> <message> <location filename="../lib/db_key.cpp" line="+134"/> <source>Key size too small !</source> <translation type="unfinished"></translation> </message> <message> <location line="+95"/> <source>New Key</source> <translation>Новый ключ</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Импорт</translation> </message> <message> <location line="+2"/> <source>Rename</source> <translation>Переименовать</translation> </message> <message> <location line="+1"/> <source>Show Details</source> <translation>Посмотреть детали</translation> </message> <message> <location line="+2"/> <source>Export</source> <translation>Экспорт</translation> </message> <message> <location line="-1"/> <source>Delete</source> <translation>Удалить</translation> </message> <message> <location line="+5"/> <source>Change password</source> <translation>Задать индивидуальный пароль</translation> </message> <message> <location line="+4"/> <source>Reset password</source> <translation>Удалить индивидуальный пароль</translation> </message> <message> <location line="-48"/> <source>Shall the original key '%1' be replaced by the key on the token? This will delete the key '%1' and make it unexportable</source> <translation type="unfinished"></translation> </message> <message> <location line="-157"/> <source>Type</source> <translation>Тип</translation> </message> <message> <location line="+1"/> <source>Size</source> <translation>Размер</translation> </message> <message> <location line="+1"/> <source>Use</source> <translation>Использован</translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Пароль</translation> </message> <message> <location line="+208"/> <source>Change PIN</source> <translation>Сменить PIN</translation> </message> <message> <location line="+2"/> <source>Init PIN with SO PIN (PUK)</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Change SO PIN (PUK)</source> <translation type="unfinished">Сменить SO PIN (PUK)</translation> </message> <message> <location line="+4"/> <source>Store on Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+89"/> <source>Tried to change password of a token</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>Tried to change PIN of a key</source> <translation type="unfinished"></translation> </message> <message> <location line="+16"/> <source>Tried to init PIN of a key</source> <translation type="unfinished"></translation> </message> <message> <location line="+16"/> <source>Tried to change SO PIN of a key</source> <translation type="unfinished"></translation> </message> <message> <location line="-297"/> <source>The key is already in the database as: '%1' and is not going to be imported</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>The database already contains the public part of the imported key as '%1 and will be completed by the new, private part of the key</source> <translation type="unfinished"></translation> </message> <message> <location line="+39"/> <source>You are sure to create a key of the size: %1 ?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_temp</name> <message> <location filename="../lib/db_temp.cpp" line="+23"/> <source>Type</source> <translation type="unfinished">Тип</translation> </message> <message> <location line="+90"/> <source>Nothing</source> <translation type="unfinished">Новый</translation> </message> <message> <location line="+5"/> <source>Preset Template values</source> <translation type="unfinished">Предустановленные значения шаблона</translation> </message> <message> <location line="+39"/> <source>copy</source> <translation type="unfinished">копировать</translation> </message> <message> <location line="+32"/> <source>Save template as</source> <translation>Сохранить шаблон как</translation> </message> <message> <location line="+43"/> <source>New Template</source> <translation>Новый шаблон</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Импорт</translation> </message> <message> <location line="+2"/> <source>Rename</source> <translation>Переименовать</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation>Экспорт</translation> </message> <message> <location line="+1"/> <source>Change</source> <translation type="unfinished">Изменение</translation> </message> <message> <location line="+1"/> <source>Delete</source> <translation>Удалить</translation> </message> <message> <location line="+1"/> <source>Duplicate</source> <translation type="unfinished">Дублировать</translation> </message> <message> <location line="+1"/> <source>Create certificate</source> <translation>Создать сертификат</translation> </message> <message> <location line="+2"/> <source>Create request</source> <translation>Создать запрос</translation> </message> <message> <location line="-52"/> <source>XCA templates ( *.xca);; All files ( * )</source> <translation>XCA шаблоны ( *.xca);; Всеl файлы ( * )</translation> </message> <message> <location line="-141"/> <source>Bad template: %1</source> <translation>Неправильный шаблон: %1</translation> </message> </context> <context> <name>db_x509</name> <message> <location filename="../lib/db_x509.cpp" line="-887"/> <source>Serial</source> <translation type="unfinished">Серийный номер</translation> </message> <message> <location line="+6"/> <source>not After</source> <translation type="unfinished">Не позже, чем</translation> </message> <message> <location line="+1"/> <source>Trust state</source> <translation type="unfinished">Состояния доверия</translation> </message> <message> <location line="+1"/> <source>Revocation</source> <translation type="unfinished">Аннулирован</translation> </message> <message> <location line="-3"/> <source>Expiry date</source> <translation type="unfinished">Дата истечения срока действия</translation> </message> <message> <location line="-6"/> <source>reflects the basic Constraints extension</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>md5 fingerprint</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>sha1 fingerprint</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Start date</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>not Before</source> <translation type="unfinished"></translation> </message> <message> <location line="+112"/> <source>Plain View</source> <translation>Список</translation> </message> <message> <location line="+2"/> <source>Tree View</source> <translation>Дерево</translation> </message> <message> <location line="+317"/> <source>Invalid public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+18"/> <source>Please enter the new hexadecimal secret number for the QA process.</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>The QA process has been terminated by the user.</source> <translation type="unfinished"></translation> </message> <message> <location line="+17"/> <source>The key you selected for signing is not a private one.</source> <translation type="unfinished"></translation> </message> <message> <location line="+101"/> <source>New Certificate</source> <translation>Новый сертификат</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Импорт</translation> </message> <message> <location line="+1"/> <source>Import PKCS#12</source> <translation>Ипорт PKCS#12</translation> </message> <message> <location line="+1"/> <source>Import from PKCS#7</source> <translation>Импорт из PKCS#7</translation> </message> <message> <location line="+3"/> <source>Rename</source> <translation>Переименовать</translation> </message> <message> <location line="+1"/> <source>Show Details</source> <translation>Посмотреть детали</translation> </message> <message> <location line="+2"/> <source>Extract public Key</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Export</source> <translation>Экспорт</translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>File</source> <translation>Файл</translation> </message> <message> <location line="+1"/> <source>Request</source> <translation type="unfinished">Запрос</translation> </message> <message> <location line="+7"/> <source>OpenSSL config</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation>Удалить</translation> </message> <message> <location line="+4"/> <source>Trust</source> <translation type="unfinished">Доверие</translation> </message> <message> <location line="-610"/> <location line="+612"/> <source>CA</source> <translation>ЦС</translation> </message> <message> <location line="+1"/> <source>Properties</source> <translation>Свойства</translation> </message> <message> <location line="+1"/> <source>Generate CRL</source> <translation>Создать CRL</translation> </message> <message> <location line="+2"/> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <location line="+1"/> <source>Sign</source> <translation type="unfinished">Подпись</translation> </message> <message> <location line="+1"/> <source>Encrypt</source> <translation type="unfinished">Шифровать</translation> </message> <message> <location line="+3"/> <source>Renewal</source> <translation type="unfinished">Обновить</translation> </message> <message> <location line="+3"/> <source>Unrevoke</source> <translation type="unfinished">Вернуть</translation> </message> <message> <location line="+4"/> <source>Revoke</source> <translation type="unfinished">Отозвать</translation> </message> <message> <location line="+113"/> <source>Not possible for a token key: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+365"/> <source> days</source> <translation type="unfinished">дней</translation> </message> <message> <location line="-508"/> <source>Security token</source> <translation>Токен</translation> </message> <message> <location line="+4"/> <source>Template</source> <translation>Шаблон</translation> </message> <message> <location line="+6"/> <source>Delete from Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="-302"/> <source>The certificate already exists in the database as: '%1' and so it was not imported</source> <translation type="unfinished"></translation> </message> <message> <location line="+429"/> <location line="+33"/> <source>There was no key found for the Certificate: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Not possible for the token-key Certificate '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="-245"/> <source>Store the certificate to the key on the token '%1 (#%2)' ?</source> <translation type="unfinished"></translation> </message> <message> <location line="+72"/> <source>Other token</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_x509name</name> <message> <location filename="../lib/db_x509super.cpp" line="+18"/> <source>Subject</source> <translation type="unfinished">Владелец</translation> </message> <message> <location line="+1"/> <source>Complete distinguished name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Subject hash</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Hash to lookup certs in directories</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_x509req</name> <message> <location filename="../lib/db_x509req.cpp" line="+25"/> <source>Challenge password</source> <translation type="unfinished"></translation> </message> <message> <location line="+109"/> <source>Certificate request ( *.pem *.der *.crl )</source> <translation type="unfinished">Запросы на сертификат ( *.pem *.der *.crl )</translation> </message> <message> <location line="+2"/> <source>Certificate request export</source> <translation type="unfinished">Экспорт запроса на сертификат</translation> </message> <message> <location line="+40"/> <source>New Request</source> <translation>Новый запрос</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Импорт</translation> </message> <message> <location line="+3"/> <source>Extract public Key</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Rename</source> <translation>Переименовать</translation> </message> <message> <location line="+1"/> <source>Show Details</source> <translation>Посмотреть детали</translation> </message> <message> <location line="+1"/> <source>Sign</source> <translation type="unfinished">Подпись</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation>Экспорт</translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>OpenSSL config</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete</source> <translation>Удалить</translation> </message> <message> <location line="-171"/> <source>Signed</source> <translation type="unfinished">Подписанный</translation> </message> <message> <location line="+1"/> <source>whether the request is already signed or not</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Unstructured name</source> <translation type="unfinished"></translation> </message> <message> <location line="+165"/> <source>File</source> <translation>Файл</translation> </message> <message> <location line="+1"/> <source>Template</source> <translation>Шаблон</translation> </message> <message> <location line="-145"/> <source>The certificate signing request already exists in the database as '%1' and thus was not stored</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_x509super</name> <message> <location filename="../lib/db_x509super.cpp" line="+31"/> <source>Key name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Internal name of the key</source> <translation type="unfinished"></translation> </message> <message> <location line="+75"/> <source>Save as OpenSSL config</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Config files ( *.conf *.cnf);; All files ( * )</source> <translation type="unfinished"></translation> </message> <message> <location line="+25"/> <source>The following extensions were not ported into the template</source> <translation>Следующие расширения не были перенесены в шаблон</translation> </message> </context> <context> <name>kvView</name> <message> <location filename="../widgets/kvView.cpp" line="+164"/> <source>Type</source> <translation>Тип</translation> </message> <message> <location line="+0"/> <source>Content</source> <translation>Содержание</translation> </message> </context> <context> <name>pass_info</name> <message> <location filename="../lib/pass_info.cpp" line="+21"/> <source>Password</source> <translation>Пароль</translation> </message> <message> <location line="+6"/> <source>PIN</source> <translation>ПИН</translation> </message> </context> <context> <name>pki_base</name> <message> <location filename="../lib/pki_base.cpp" line="+82"/> <source>Error opening file: '%1': %2</source> <translation>Произошла ошибка при открытии файла: '%1': %2</translation> </message> <message> <location line="+8"/> <source>Error writing to file: '%1': %2</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>Error: </source> <translation>Ошибка: </translation> </message> <message> <location filename="../lib/pki_base.h" line="+67"/> <source>Internal error: Unexpected message: %1 %2</source> <translation type="unfinished">Внутренняя ошибка: Неожиданное сообщение: %1 %2</translation> </message> </context> <context> <name>pki_crl</name> <message> <location filename="../lib/pki_crl.cpp" line="+92"/> <source>No issuer given</source> <translation>Данного издателя несуществует</translation> </message> <message> <location line="+224"/> <source>unknown</source> <translation>неизвестный</translation> </message> <message> <location line="-246"/> <source>Unable to load the revokation list in file %1. Tried PEM and DER formatted CRL.</source> <translation>Не удается загрузить список отзыва сертификатов из файла %1. Формат файла, содержащий CRL должен быть PEM или DER.</translation> </message> <message> <location line="-24"/> <source>Successfully imported the revokation list '%1'</source> <translation>Список отзыва '%1' импортирован успешно</translation> </message> <message> <location line="+1"/> <source>Delete the revokation list '%1'?</source> <translation>Удалить список отзыва '%1'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the revokation list '%1'</source> <translation>Список отзыва '%1' создан успешно</translation> </message> <message> <location line="+2"/> <source>Delete the %1 revokation lists: %2?</source> <translation>Удалить %1 списки отзыва: %2?</translation> </message> <message> <location line="+96"/> <location line="+197"/> <source>Wrong Size %1</source> <translation>Неправильный размер %1</translation> </message> </context> <context> <name>pki_evp</name> <message> <location filename="../lib/pki_evp.cpp" line="+196"/> <source>Failed to decrypt the key (bad password) </source> <translation type="unfinished">Не удалось расшифровать ключ (неверный пароль)</translation> </message> <message> <location line="+185"/> <location line="+11"/> <source>Password input aborted</source> <translation></translation> </message> <message> <location line="+82"/> <source>Please enter the password to protect the private key: '%1'</source> <translation>Пожалуйста, введите пароль для защиты закрытого ключа '%1'</translation> </message> <message> <location line="-161"/> <source>Unable to load the private key in file %1. Tried PEM and DER private, public and PKCS#8 key types.</source> <translation type="unfinished">Не удается загрузить закрытый ключ из файла %1. Формат файла должен быть PEM или DER.</translation> </message> <message> <location line="-107"/> <source>Please enter the password to decrypt the private key.</source> <translation type="unfinished"></translation> </message> <message> <location line="+55"/> <source>Please enter the password to decrypt the private key from file: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+117"/> <source>Please enter the password to decrypt the private key: '%1'</source> <translation type="unfinished">Пожалуйста, введите пароль для расшифровки закрытого ключа: '%1'</translation> </message> <message> <location line="+111"/> <source>Please enter the database password for encrypting the key</source> <translation>Пожалуйста, введите пароль к базе данных для шифрования ключа</translation> </message> <message> <location line="+83"/> <source>Please enter the password protecting the PKCS#8 key '%1'</source> <translation>Пожалуйста, введите пароль для защиты PKCS#8 ключа '%1'</translation> </message> <message> <location line="+35"/> <source>Please enter the export password for the private key '%1'</source> <translation>Пожалуйста, введите пароль для экспорта закрытого ключа '%1'</translation> </message> <message> <location line="-218"/> <source>Please enter the database password for decrypting the key '%1'</source> <translation>Пожалуйста, введите пароль к базе данных для расшифровки ключа '%1'</translation> </message> </context> <context> <name>pki_key</name> <message> <location filename="../lib/pki_key.cpp" line="+118"/> <source>Successfully imported the %1 public key '%2'</source> <translation type="unfinished">Открытый %1 ключ '%2' импортирован успешно</translation> </message> <message> <location line="+1"/> <source>Delete the %1 public key '%2'?</source> <translation type="unfinished">Удалить открытый %1 ключ '%2'?</translation> </message> <message> <location line="+5"/> <source>Successfully imported the %1 private key '%2'</source> <translation type="unfinished">Закрытый %1 ключ '%2' импортирован успешно</translation> </message> <message> <location line="+1"/> <source>Delete the %1 private key '%2'?</source> <translation type="unfinished">Удалить закрытый %1 ключ '%2'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the %1 private key '%2'</source> <translation type="unfinished">Закрытый %1 ключ '%2' создан успешно</translation> </message> <message> <location line="+6"/> <source>Delete the %1 keys: %2?</source> <translation type="unfinished">Удалить %1 ключ: %2?</translation> </message> <message> <location line="+8"/> <source>public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+162"/> <source>Common</source> <translation>Общий</translation> </message> <message> <location line="+0"/> <source>Private</source> <translation>Индивидуальный</translation> </message> <message> <location line="+0"/> <source>Bogus</source> <translation type="unfinished">Поддельный</translation> </message> <message> <location line="+10"/> <source>No password</source> <translation>Без пароля</translation> </message> <message> <location line="-10"/> <source>PIN</source> <translation>ПИН</translation> </message> </context> <context> <name>pki_multi</name> <message> <location filename="../lib/pki_multi.cpp" line="+125"/> <location line="+5"/> <location line="+5"/> <source>Seek failed</source> <translation>Ничего не найдено</translation> </message> </context> <context> <name>pki_pkcs12</name> <message> <location filename="../lib/pki_pkcs12.cpp" line="+112"/> <source>Please enter the password to encrypt the PKCS#12 file</source> <translation>Пожалуйста, введите пароль для шифрования PKCS#12 файла</translation> </message> <message> <location line="+2"/> <source>No key or no Cert and no pkcs12</source> <translation type="unfinished"></translation> </message> <message> <location line="-68"/> <source>Unable to load the PKCS#12 (pfx) file %1.</source> <translation>Не удается загрузить PKCS#12 (pfx) файл %1.</translation> </message> <message> <location line="-8"/> <source>Please enter the password to decrypt the PKCS#12 file: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+22"/> <source>The supplied password was wrong (%1)</source> <translation type="unfinished">Полученный пароль неверен (%1)</translation> </message> </context> <context> <name>pki_pkcs7</name> <message> <location filename="../lib/pki_pkcs7.cpp" line="+160"/> <source>Unable to load the PKCS#7 file %1. Tried PEM and DER format.</source> <translation>Не удалось загрузить PKCS#7 файл %1. Формат файла должен быть PEM или DER.</translation> </message> </context> <context> <name>pki_scard</name> <message> <location filename="../lib/pki_scard.cpp" line="+313"/> <source>This Key is already on the token</source> <translation type="unfinished">Этот ключ уже есть на Токене безопасности</translation> </message> <message> <location line="+48"/> <source>Unable to find copied key on the token</source> <translation type="unfinished">Не удается найти копию ключа на Токене безопасности</translation> </message> <message> <location line="+110"/> <source>Public Key missmatch. Please re-import card</source> <translation type="unfinished"></translation> </message> <message> <location line="+53"/> <source>Unable to find generated key on card</source> <translation type="unfinished"></translation> </message> <message> <location line="+72"/> <location line="+12"/> <source>Failed to find the key on the token</source> <translation type="unfinished"></translation> </message> <message> <location line="-5"/> <source>Invalid Pin for the token</source> <translation type="unfinished">Неверный PIN для этого Токена безопасности</translation> </message> <message> <location line="-363"/> <source>Delete the private key '%1' from the token '%2 (#%3)' ?</source> <translation type="unfinished"></translation> </message> <message> <location line="-182"/> <source>Successfully imported the token key '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the token key '%1'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the token key '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete the %1 keys: %2?</source> <translation type="unfinished">Удалить %1 ключ: %2?</translation> </message> <message> <location line="+229"/> <source>only RSA keys can be stored on tokens</source> <translation type="unfinished"></translation> </message> <message> <location line="+56"/> <source>PIN input aborted</source> <translation type="unfinished"></translation> </message> <message> <location line="+93"/> <source>Please insert card: %1 %2 [%3] with Serial: %4</source> <translation type="unfinished"></translation> </message> <message> <location line="+136"/> <source>Wrong Size %1</source> <translation type="unfinished">Неправильный размер %1</translation> </message> <message> <location line="+11"/> <source>Token %1</source> <translation type="unfinished">Токен %1</translation> </message> </context> <context> <name>pki_temp</name> <message> <location filename="../lib/pki_temp.cpp" line="+371"/> <source>Template file content error (too small): %1</source> <translation>Содержимое файл-шаблона ошибочно (слишком мал) :%1</translation> </message> <message> <location line="+26"/> <source>Template file content error (bad length) :%1</source> <translation>Содержимое файл-шаблона ошибочно (неверная длинна) :%1</translation> </message> <message> <location line="-104"/> <location line="+205"/> <source>Wrong Size %1</source> <translation>Неправильный размер %1</translation> </message> <message> <location line="-399"/> <source>Successfully imported the XCA template '%1'</source> <translation>XCA шаблон '%1' ипортирован успешно</translation> </message> <message> <location line="+1"/> <source>Delete the XCA template '%1'?</source> <translation>Удалить XCA шаблон '%1'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the XCA template '%1'</source> <translation>XCA шаблон '%1' создан успешно</translation> </message> <message> <location line="+2"/> <source>Delete the %1 XCA templates: %2?</source> <translation>Удалить %1 XCA шаблоны: %2?</translation> </message> <message> <location line="+285"/> <source>Template file content error (bad size): %1 </source> <translation>Содержимое файл-шаблона ошибочно (неверный размер) :%1</translation> </message> </context> <context> <name>pki_x509</name> <message> <location filename="../lib/pki_x509.cpp" line="+70"/> <source>Successfully imported the certificate '%1'</source> <translation>Сертификат '%1' импортирован успешно</translation> </message> <message> <location line="+1"/> <source>Delete the certificate '%1'?</source> <translation>Удалить сертификат '%1'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the certificate '%1'</source> <translation>Сертификат '%1' создан успешно</translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificates: %2?</source> <translation type="unfinished">Удалить %1 сертификатов: %2?</translation> </message> <message> <location line="+270"/> <source>Delete the certificate '%1' from the token '%2 (#%3)'?</source> <translation>Удалить сертификат '%1' из Токена '%2 (#%3)'?</translation> </message> <message> <location line="+457"/> <source>Not trusted</source> <translation>Доверия нет</translation> </message> <message> <location line="+0"/> <source>Trust inherited</source> <translation>Доверие унаследовано</translation> </message> <message> <location line="+0"/> <source>Always Trusted</source> <translation>Доверие есть</translation> </message> <message> <location line="+29"/> <source>No</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Yes</source> <translation type="unfinished"></translation> </message> <message> <location line="-361"/> <source>There is no key for signing !</source> <translation type="unfinished">Не существует ключа для подписания !</translation> </message> <message> <location line="-360"/> <source>Unable to load the certificate in file %1. Tried PEM and DER certificate.</source> <translation>Не удается загрузить сертификат из файла %1. Формат файла должен быть PEM или DER.</translation> </message> <message> <location line="+172"/> <source>This certificate is already on the security token</source> <translation>Этот сертификат уже есть на Токене</translation> </message> <message> <location line="+533"/> <source>CRL expires: %1</source> <translation type="unfinished">CRL истекает: %1</translation> </message> <message> <location line="-308"/> <location line="+484"/> <source>Wrong Size %1</source> <translation type="unfinished">Неправильный размер %1</translation> </message> </context> <context> <name>pki_x509req</name> <message> <location filename="../lib/pki_x509req.cpp" line="+51"/> <source>Signing key not valid (public key)</source> <translation type="unfinished">Ключ для подписи не действителен (открытый ключ)</translation> </message> <message> <location line="+42"/> <source>Successfully imported the %1 certificate request '%2'</source> <translation type="unfinished">%1 запрос '%2' импортирован успешно</translation> </message> <message> <location line="+1"/> <source>Delete the %1 certificate request '%2'?</source> <translation type="unfinished">Удалить %1 запрос: %2?</translation> </message> <message> <location line="+1"/> <source>Successfully created the %1 certificate request '%2'</source> <translation type="unfinished">Запрос %1 на создание сертификата '%2' создан успешно</translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificate requests: %2?</source> <translation type="unfinished">Удалить %1 запрос: %2?</translation> </message> <message> <location line="+39"/> <source>Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC format.</source> <translation type="unfinished">Не удается загрузить запрос на создание сертификата из файла %1. Формат файла должен быть PEM или DER.</translation> </message> <message> <location line="+276"/> <source>Signed</source> <translation>Подписан</translation> </message> <message> <location line="+0"/> <source>Unhandled</source> <translation>Необработан</translation> </message> <message> <location line="+43"/> <source>Wrong Size %1</source> <translation type="unfinished">Неправильный размер %1</translation> </message> </context> <context> <name>v3ext</name> <message> <location filename="../ui/v3ext.ui" line="+51"/> <source>Add</source> <translation type="unfinished">Добавить</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation type="unfinished">Удалить</translation> </message> <message> <location line="+32"/> <source>Apply</source> <translation type="unfinished">Применить</translation> </message> <message> <location line="+7"/> <source>Validate</source> <translation type="unfinished">Утвердить</translation> </message> <message> <location line="+29"/> <source>Cancel</source> <translation type="unfinished">Отмена</translation> </message> <message> <location filename="../widgets/v3ext.cpp" line="+189"/> <source>Validation successful: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="-96"/> <source>An email address or 'copy'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>An email address</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>a registered ID: OBJECT IDENTIFIER</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>a uniform resource indicator</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>a DNS domain name</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>an IP address</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>No editing. Only 'copy' allowed here</source> <translation type="unfinished"></translation> </message> <message> <location line="-4"/> <source>Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'</source> <translation type="unfinished"></translation> </message> <message> <location line="+72"/> <source>Validation failed: '%1' %2</source> <translation type="unfinished"></translation> </message> </context> <context> <name>void</name> <message> <location filename="../lib/db_x509.cpp" line="+241"/> <source>There was no key found for the Certificate: </source> <translation>Не найден ключ для сетификата: </translation> </message> <message> <location line="+8"/> <source>Import Certificate signing request</source> <translation>Импорт запроса на подпись сертификата</translation> </message> </context> </TS> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lang/xca_tr.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000255046�11753427512�0015154�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <TS> <context> <name>About</name> <message> <source>Done</source> <translation>Bitti</translation> </message> </context> <context> <name>CaProperties</name> <message> <source>CA Properties</source> <translation>CA Özellikleri</translation> </message> <message> <source>Use random Serial numbers</source> <translation>Değişken Seri numaralar kullan</translation> </message> <message> <source>Days until next CRL issuing</source> <translation type="unfinished"/> </message> <message> <source>Default template</source> <translation>Varsayılan şablon</translation> </message> <message> <source>Next serial for signing</source> <translation>İmza için sonraki seri</translation> </message> </context> <context> <name>CertDetail</name> <message> <source>Details of the Certificate</source> <translation>Sertifika bilgileri</translation> </message> <message> <source>S&tatus</source> <translation>&Durum</translation> </message> <message> <source>Serial</source> <translation>Seri</translation> </message> <message> <source>The serial number of the certificate</source> <translation>Sertifika seri numarası</translation> </message> <message> <source>The internal name of the certificate in the database</source> <translation>Sertifika veritabanındaki isim</translation> </message> <message> <source>Internal name</source> <translation>Dahili adı</translation> </message> <message> <source>Signature algorithm</source> <translation>İmza algoritması</translation> </message> <message> <source>Signature</source> <translation>İmza</translation> </message> <message> <source>Key</source> <translation>Anahtar</translation> </message> <message> <source>Fingerprints</source> <translation>Parmak izleri</translation> </message> <message> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <source>MD5</source> <translation>MD5</translation> </message> <message> <source>A SHA-1 hashsum of the certificate</source> <translation>A SHA-1 hashsum sertifikası</translation> </message> <message> <source>An md5 hashsum of the certificate</source> <translation>An md5 hassum sertifikası</translation> </message> <message> <source>Validity</source> <translation>Geçerlilik</translation> </message> <message> <source>The time since the certificate is valid</source> <translation>Zamana kadar geçerli sertifika</translation> </message> <message> <source>The time until the certificate is valid</source> <translation>Bu zaman kadar sertifika geçerli</translation> </message> <message> <source>&Subject</source> <translation>&Konu</translation> </message> <message> <source>&Issuer</source> <translation>&veren</translation> </message> <message> <source>Attributes</source> <translation>Nitelikler</translation> </message> <message> <source>&Extensions</source> <translation>&Uzantıları</translation> </message> <message> <source>Show config</source> <translation>Yapılandırmayı göster</translation> </message> <message> <source>Show extensions</source> <translation>Uzantıları göster</translation> </message> <message> <source>Not available</source> <translation>Kullanılamaz</translation> </message> <message> <source>Details of the certificate</source> <translation>Sertifika detayları</translation> </message> <message> <source>Signer unknown</source> <translation>Bilinmeyen imzalayan makam</translation> </message> <message> <source>Self signed</source> <translation>Kendinden imzalı</translation> </message> <message> <source>Not trusted</source> <translation>Güvenilmeyen</translation> </message> <message> <source>Trusted</source> <translation>Güvenilir</translation> </message> <message> <source>Revoked: </source> <translation>İptaledilmiş </translation> </message> <message> <source>Not valid</source> <translation>Geçersiz</translation> </message> <message> <source>Valid</source> <translation>Geçerli</translation> </message> <message> <source>Details of the certificate signing request</source> <translation>sertifika imzalama isteği detayları</translation> </message> </context> <context> <name>CertExtend</name> <message> <source>Certificate renewal</source> <translation>Sertifika yenileme</translation> </message> <message> <source>This will create a new certificate as a copy of the old one with a new serial number and adjusted validity values.</source> <translation>Bu yeni bir seri numarası ve düzeltilmiş geçerlilik değerleri ile eski bir kopyası olarak yeni bir sertifika oluşturur.</translation> </message> <message> <source>Validity</source> <translation>Geçerlilik</translation> </message> <message> <source>Not before</source> <translation>Öncedeğil</translation> </message> <message> <source>Not after</source> <translation>Sonradeğil</translation> </message> <message> <source>Time range</source> <translation>Zaman aralığı</translation> </message> <message> <source>No well-defined expiration</source> <translation>Tanımlanmamış son</translation> </message> <message> <source>Apply</source> <translation>Uygula</translation> </message> <message> <source>Days</source> <translation>Gün</translation> </message> <message> <source>Months</source> <translation>Ay</translation> </message> <message> <source>Years</source> <translation>Yıl</translation> </message> <message> <source>Midnight</source> <translation>Gece Yarısı</translation> </message> <message> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation>Sertifika önceki imzalayandan daha geçerli olacaktır. Muhtemelen istediğiniz bu değildir.</translation> </message> <message> <source>Edit times</source> <translation>Zamanı düzenle</translation> </message> <message> <source>Abort rollout</source> <translation type="unfinished"/> </message> <message> <source>Continue rollout</source> <translation type="unfinished"/> </message> <message> <source>Adjust date and continue</source> <translation>Tarihi düzenler ve devam eder</translation> </message> <message> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation>Sertifika önceki imzalayandan daha geçerli olacaktır. Muhtemelen istediğiniz bu değildir.</translation> </message> </context> <context> <name>CertView</name> <message> <source>There was no key found for the Certificate: </source> <translation>Sertifikadaki anahtar bulunamıyor. </translation> </message> <message> <source>Import Certificate signing request</source> <translation>Sertifika imzalama isteği</translation> </message> </context> <context> <name>ClickLabel</name> <message> <source>Double click for details</source> <translation>Detaylariçin çift tıklayın</translation> </message> </context> <context> <name>CrlDetail</name> <message> <source>Details of the Revocation list</source> <translation>İptal listesi için çift tıklayın</translation> </message> <message> <source>&Status</source> <translation>&Durum</translation> </message> <message> <source>Version</source> <translation>Sürüm</translation> </message> <message> <source>Signature</source> <translation>İmza</translation> </message> <message> <source>Signed by</source> <translation>İmzalayan:</translation> </message> <message> <source>Name</source> <translation>İsim</translation> </message> <message> <source>The internal name of the CRL in the database</source> <translation>CRL veritabanındaki isim</translation> </message> <message> <source>issuing dates</source> <translation>Verilen tarih</translation> </message> <message> <source>Next Update</source> <translation>Sonraki Güncelleme</translation> </message> <message> <source>Last Update</source> <translation>Son Güncelleme</translation> </message> <message> <source>&Issuer</source> <translation>&veren</translation> </message> <message> <source>&Extensions</source> <translation>&Uzantıları</translation> </message> <message> <source>&Revocation list</source> <translation>&İptal listesi</translation> </message> <message> <source>0</source> <translation>0</translation> </message> <message> <source>Serial</source> <translation>Seri</translation> </message> <message> <source>Revocation</source> <translation>İptal</translation> </message> <message> <source>Reason</source> <translation>Neden</translation> </message> <message> <source>Invalidation</source> <translation>İptal</translation> </message> <message> <source>Failed</source> <translation>Başarısız</translation> </message> <message> <source>Unknown signer</source> <translation>Bilinmeyen imzalayan</translation> </message> <message> <source>Verification not possible</source> <translation>Doğrulama mümkün değil</translation> </message> <message> <source>Unknown certificate</source> <translation>Bilinmeyen sertifika</translation> </message> </context> <context> <name>ExportCert</name> <message> <source>X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )</source> <translation>X509 sertifikası (*cer *.crt *.p12 *.p7b);;Tüm dosyalar (*)</translation> </message> <message> <source>DER is a binary format of the Certificate PEM is a base64 encoded Certificate PKCS#7 is an official Certificate exchange format PKCS#12 is an encrypted official Key-Certificate exchange format </source> <translation>DER ikili sertifika formatı PEM base64 kodlu sertifika PKCS#7 resmi değişim sertifikası PKCS#12 kriptolu anahtar sertifikası </translation> </message> <message> <source>Please enter the filename for the certificate.</source> <translation>Lütfen sertifika ismini giriniz.</translation> </message> <message> <source>Certifikate export</source> <translation>Sertifika dışa aktar</translation> </message> </context> <context> <name>ExportDer</name> <message> <source>All files ( * )</source> <translation>Bütün dosyalar ( * )</translation> </message> <message> <source>DER is a binary format PEM is a base64 encoded DER file </source> <translation>DER ikili biçimdir PEM base64 kodlanmış DER dosyası </translation> </message> </context> <context> <name>ExportDialog</name> <message> <source>...</source> <translation>...</translation> </message> <message> <source>Filename</source> <translation>Dosya adı</translation> </message> <message> <source>Please enter the filename</source> <translation>Lütfen dosya adını giriniz</translation> </message> <message> <source>Export Format</source> <translation>Verme biçimi</translation> </message> <message> <source>The file: '%1' already exists!</source> <translation>Dosya: 2%1' zaten var</translation> </message> <message> <source>Overwrite</source> <translation>Üzerine yaz</translation> </message> <message> <source>Do not overwrite</source> <translation>Üzerine yazmayın</translation> </message> </context> <context> <name>ExportKey</name> <message> <source>When exporting the private key it should be encrypted.</source> <translation>Özel anahtar dışa aktarılırken şifreli olmalıdır.</translation> </message> <message> <source>When exporting the private part, it should be encrypted.</source> <translation>Özel bölüm aktarılırken şifreli olmalıdır.</translation> </message> <message> <source>E&xport the private part of the Key too</source> <translation>Dışa aktarılan özel bölüm anahtarı çok</translation> </message> <message> <source>Export as PKCS#8</source> <translation>PKCS#8 olarak aktar</translation> </message> <message> <source>&Encrypt the Key with a password</source> <translation type="unfinished"/> </message> <message> <source>Private keys ( *.pem *.der *.pk8 );;All files ( * )</source> <translation>Özel anatarlar (*.pem *.der *.pk8);;Tüm dosyalar ( * )</translation> </message> <message> <source>DER is a binary format of the key without encryption PEM is a base64 encoded key with optional encryption PKCS#8 is an encrypted official Key-exchange format</source> <translation type="unfinished"/> </message> <message> <source>Please enter the filename for the key.</source> <translation type="unfinished"/> </message> <message> <source>Public key export</source> <translation type="unfinished"/> </message> <message> <source>Key export</source> <translation type="unfinished"/> </message> </context> <context> <name>Help</name> <message> <source><<</source> <translation><<</translation> </message> <message> <source>>></source> <translation>>></translation> </message> <message> <source>&Done</source> <translation>&Bitti</translation> </message> </context> <context> <name>ImportMulti</name> <message> <source>Import PKI Items</source> <translation type="unfinished"/> </message> <message> <source>Import &All</source> <translation type="unfinished"/> </message> <message> <source>&Import</source> <translation>&İçe Aktar</translation> </message> <message> <source>&Done</source> <translation>&Bitti</translation> </message> <message> <source>&Remove from list</source> <translation type="unfinished">&İptal listesi</translation> </message> <message> <source>Details</source> <translation>Detaylar</translation> </message> <message> <source>Delete from token</source> <translation type="unfinished"/> </message> <message> <source>Rename on token</source> <translation type="unfinished"/> </message> <message> <source> Name: %1 Model: %2 Serial: %3</source> <translation type="unfinished"/> </message> <message> <source>Manage security token</source> <translation type="unfinished"/> </message> <message> <source>The type of the Item '%1' is not recognized</source> <translation type="unfinished"/> </message> <message> <source>Details of the item '%1' cannot be shown</source> <translation type="unfinished"/> </message> <message> <source>The type of the item '%1' is not recognized</source> <translation type="unfinished"/> </message> <message> <source>The file '%1' did not contain PKI data</source> <translation type="unfinished"/> </message> <message> <source>The %1 files: '%2' did not contain PKI data</source> <translation type="unfinished"/> </message> </context> <context> <name>KeyDetail</name> <message> <source>Name</source> <translation>İsim</translation> </message> <message> <source>The internal name of the key used by xca</source> <translation type="unfinished"/> </message> <message> <source>Security token</source> <translation type="unfinished"/> </message> <message> <source>Manufacturer</source> <translation type="unfinished"/> </message> <message> <source>Serial</source> <translation>Seri</translation> </message> <message> <source>Key</source> <translation type="unfinished"/> </message> <message> <source>Public Exponent</source> <translation type="unfinished"/> </message> <message> <source>Keysize</source> <translation type="unfinished"/> </message> <message> <source>Private Exponent</source> <translation type="unfinished"/> </message> <message> <source>Modulus</source> <translation type="unfinished"/> </message> <message> <source>Details of the %1 key</source> <translation type="unfinished"/> </message> <message> <source>Not available</source> <translation type="unfinished"/> </message> <message> <source>Token</source> <translation type="unfinished"/> </message> <message> <source>Security token ID:%1</source> <translation type="unfinished"/> </message> <message> <source>Available</source> <translation type="unfinished"/> </message> <message> <source>Sub prime</source> <translation type="unfinished"/> </message> <message> <source>Public key</source> <translation type="unfinished"/> </message> <message> <source>Private key</source> <translation type="unfinished"/> </message> <message> <source>Curve name</source> <translation type="unfinished"/> </message> <message> <source>Unknown key</source> <translation type="unfinished"/> </message> </context> <context> <name>MainWindow</name> <message> <source>Private Keys</source> <translation type="unfinished"/> </message> <message> <source>&New Key</source> <translation type="unfinished"/> </message> <message> <source>&Export</source> <translation type="unfinished"/> </message> <message> <source>&Import</source> <translation type="unfinished"/> </message> <message> <source>Import PFX (PKCS#12)</source> <translation type="unfinished"/> </message> <message> <source>&Show Details</source> <translation type="unfinished"/> </message> <message> <source>&Delete</source> <translation>&Sil</translation> </message> <message> <source>Certificate signing requests</source> <translation type="unfinished"/> </message> <message> <source>&New Request</source> <translation type="unfinished"/> </message> <message> <source>Certificates</source> <translation>Sertifikalar</translation> </message> <message> <source>&New Certificate</source> <translation type="unfinished"/> </message> <message> <source>Import &PKCS#12</source> <translation type="unfinished"/> </message> <message> <source>Import P&KCS#7</source> <translation type="unfinished"/> </message> <message> <source>Plain View</source> <translation type="unfinished"/> </message> <message> <source>Templates</source> <translation type="unfinished"/> </message> <message> <source>&New template</source> <translation type="unfinished"/> </message> <message> <source>Ch&ange Template</source> <translation type="unfinished"/> </message> <message> <source>Revocation lists</source> <translation type="unfinished"/> </message> <message> <source>Using or exporting private keys will not be possible without providing the correct password</source> <translation type="unfinished"/> </message> <message> <source>Database</source> <translation>Veri Tabanı</translation> </message> <message> <source>No deleted items found</source> <translation type="unfinished"/> </message> <message> <source>&File</source> <translation>&Dosya</translation> </message> <message> <source>&New DataBase</source> <translation type="unfinished"/> </message> <message> <source>&Open DataBase</source> <translation type="unfinished"/> </message> <message> <source>Generate DH parameter</source> <translation type="unfinished"/> </message> <message> <source>Set as default DataBase</source> <translation type="unfinished"/> </message> <message> <source>&Close DataBase</source> <translation type="unfinished"/> </message> <message> <source>&Dump DataBase</source> <translation type="unfinished"/> </message> <message> <source>C&hange DataBase password</source> <translation type="unfinished"/> </message> <message> <source>&Import old db_dump</source> <translation type="unfinished"/> </message> <message> <source>&Undelete items</source> <translation type="unfinished"/> </message> <message> <source>Options</source> <translation type="unfinished"/> </message> <message> <source>Exit</source> <translation>Çıkış</translation> </message> <message> <source>I&mport</source> <translation type="unfinished"/> </message> <message> <source>Keys</source> <translation type="unfinished"/> </message> <message> <source>Requests</source> <translation type="unfinished"/> </message> <message> <source>PKCS#12</source> <translation type="unfinished"/> </message> <message> <source>PKCS#7</source> <translation type="unfinished"/> </message> <message> <source>Template</source> <translation type="unfinished"/> </message> <message> <source>Revocation list</source> <translation type="unfinished"/> </message> <message> <source>PEM file</source> <translation type="unfinished"/> </message> <message> <source>&Token</source> <translation type="unfinished"/> </message> <message> <source>&Manage Security token</source> <translation type="unfinished"/> </message> <message> <source>&Init Security token</source> <translation type="unfinished"/> </message> <message> <source>&Change PIN</source> <translation type="unfinished"/> </message> <message> <source>Change &SO PIN</source> <translation type="unfinished"/> </message> <message> <source>Init PIN</source> <translation type="unfinished"/> </message> <message> <source>&Help</source> <translation>&Yardım</translation> </message> <message> <source>&Content</source> <translation type="unfinished"/> </message> <message> <source>&About</source> <translation>&Hakkında</translation> </message> <message> <source>Donations</source> <translation type="unfinished"/> </message> <message> <source>Database dump ( *.dump );;All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>Import password</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password of the old database</source> <translation type="unfinished"/> </message> <message> <source>Password verification error. Ignore keys ?</source> <translation type="unfinished"/> </message> <message> <source>Import anyway</source> <translation type="unfinished"/> </message> <message> <source>Cancel</source> <translation type="unfinished">İptal</translation> </message> <message> <source>no such option: %1</source> <translation type="unfinished"/> </message> <message> <source>Import PEM data</source> <translation type="unfinished"/> </message> <message> <source>Please enter the original SO PIN (PUK) of the token '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the new SO PIN (PUK) of the token '%1'</source> <translation type="unfinished"/> </message> <message> <source>The new label of the token '%1'</source> <translation type="unfinished"/> </message> <message> <source>The token '%1' did not contain any keys or certificates</source> <translation type="unfinished"/> </message> <message> <source>New Password</source> <translation>Yeni Parola</translation> </message> <message> <source>Please enter the new password to encrypt your private keys in the database-file</source> <translation type="unfinished"/> </message> <message> <source>Please enter a password, that will be used to encrypt your private keys in the database file: %1</source> <translation type="unfinished"/> </message> <message> <source>Password verify error, please try again</source> <translation type="unfinished"/> </message> <message> <source>Password</source> <translation type="unfinished">Parola</translation> </message> <message> <source>Please enter the password for unlocking the database: %1</source> <translation type="unfinished"/> </message> <message> <source>The following error occured:</source> <translation type="unfinished"/> </message> <message> <source>Copy to Clipboard</source> <translation type="unfinished"/> </message> <message> <source>Diffie-Hellman paramters are needed for different applications. They are neither used by XCA nor stored in the database. After generating them, XCA will ask for a filename to store the DH parameters Please enter the DH parameter bits</source> <translation type="unfinished"/> </message> <message> <source>Error opening file: '%1': %2</source> <translation type="unfinished"/> </message> </context> <context> <name>NewCrl</name> <message> <source>Create CRL</source> <translation type="unfinished"/> </message> <message> <source>Dates</source> <translation type="unfinished"/> </message> <message> <source>last update</source> <translation type="unfinished"/> </message> <message> <source>next update</source> <translation type="unfinished"/> </message> <message> <source>Days</source> <translation>Gün</translation> </message> <message> <source>Months</source> <translation>Ay</translation> </message> <message> <source>Years</source> <translation>Yıl</translation> </message> <message> <source>Midnight</source> <translation type="unfinished"/> </message> <message> <source>Apply</source> <translation>Uygula</translation> </message> <message> <source>Hashing algorithm</source> <translation type="unfinished"/> </message> <message> <source>Extensions</source> <translation type="unfinished"/> </message> <message> <source>Authority key identifier</source> <translation type="unfinished"/> </message> <message> <source>Subject alternative name</source> <translation type="unfinished"/> </message> <message> <source>CRL Number</source> <translation type="unfinished"/> </message> <message> <source>Revokation reasons</source> <translation type="unfinished"/> </message> </context> <context> <name>NewKey</name> <message> <source>New key</source> <translation type="unfinished"/> </message> <message> <source>Please give a name to the new key and select the desired keysize</source> <translation type="unfinished"/> </message> <message> <source>Key properties</source> <translation type="unfinished"/> </message> <message> <source>Name</source> <translation>İsim</translation> </message> <message> <source>The internal name of the new key</source> <translation type="unfinished"/> </message> <message> <source>New Key</source> <translation type="unfinished"/> </message> <message> <source>Curve</source> <translation type="unfinished"/> </message> <message> <source>Keysize</source> <translation type="unfinished"/> </message> <message> <source>Usually 1024 or 2048 bit keys are used</source> <translation type="unfinished"/> </message> <message> <source>Keytype</source> <translation type="unfinished"/> </message> <message> <source>Create</source> <translation>Oluştur</translation> </message> </context> <context> <name>NewX509</name> <message> <source>Create</source> <translation>Oluştur</translation> </message> <message> <source>Source</source> <translation>Kaynak</translation> </message> <message> <source>Signing request</source> <translation type="unfinished"/> </message> <message> <source>A certificate signing request can be signed, even if the private key of the request is not available. This is the intention of a CSR: Getting signed by a CA certificate, whoes certificate of course must be in the database Of course you need the private key of the CSR if you want to create a self-signed cert from it.</source> <translation type="unfinished"/> </message> <message> <source>Show request</source> <translation type="unfinished"/> </message> <message> <source>Sign this Certificate signing &request</source> <translation type="unfinished"/> </message> <message> <source>Copy extensions from the request</source> <translation type="unfinished"/> </message> <message> <source>Modify subject of the request</source> <translation type="unfinished"/> </message> <message> <source>Signing</source> <translation type="unfinished"/> </message> <message> <source>Create a &self signed certificate with the serial</source> <translation type="unfinished"/> </message> <message> <source>If you leave this blank the serial 00 will be used</source> <translation type="unfinished"/> </message> <message> <source>1</source> <translation>1</translation> </message> <message> <source>Use &this Certificate for signing</source> <translation type="unfinished"/> </message> <message> <source>All certificates in your database that can create valid signatures</source> <translation type="unfinished"/> </message> <message> <source>This list contains all certificates with the CA-flag set to true and whoes private key is present in the key-database. If this list is disabled, you only can create a self-signed certificate.</source> <translation type="unfinished"/> </message> <message> <source>Signature algorithm</source> <translation type="unfinished"/> </message> <message> <source>Template for the new certificate</source> <translation type="unfinished"/> </message> <message> <source>All available templates</source> <translation type="unfinished"/> </message> <message> <source>This list contains all templates from the toplevel template Tab</source> <translation type="unfinished"/> </message> <message> <source>Apply extensions</source> <translation type="unfinished"/> </message> <message> <source>Apply subject</source> <translation type="unfinished"/> </message> <message> <source>Apply all</source> <translation type="unfinished"/> </message> <message> <source>Subject</source> <translation>Konu</translation> </message> <message> <source>Organisation</source> <translation>Organizasyon</translation> </message> <message> <source>This name is only used internally and does not appear in the resulting certificate</source> <translation type="unfinished"/> </message> <message> <source>Must be exactly 2 letter of size (DE, UK)</source> <translation type="unfinished"/> </message> <message> <source>Country code</source> <translation>Ülke kodu</translation> </message> <message> <source>State or Province</source> <translation type="unfinished"/> </message> <message> <source>Locality</source> <translation type="unfinished"/> </message> <message> <source>Organisational unit</source> <translation type="unfinished"/> </message> <message> <source>E-Mail address</source> <translation>E-posta adresi</translation> </message> <message> <source>Internal name</source> <translation>Dahili adı</translation> </message> <message> <source>Common name</source> <translation type="unfinished"/> </message> <message> <source>Add</source> <translation>Ekle</translation> </message> <message> <source>Delete</source> <translation>Sil</translation> </message> <message> <source>Private key</source> <translation type="unfinished"/> </message> <message> <source>This list only contains unused keys</source> <translation type="unfinished"/> </message> <message> <source>Used keys too</source> <translation type="unfinished"/> </message> <message> <source>&Generate a new key</source> <translation type="unfinished"/> </message> <message> <source>Extensions</source> <translation type="unfinished"/> </message> <message> <source>Basic constraints</source> <translation type="unfinished"/> </message> <message> <source>Type</source> <translation>Tür</translation> </message> <message> <source>If this will become a CA certificate or not</source> <translation type="unfinished"/> </message> <message> <source>Set this to TRUE if you want to create a CA certificate that signs other certificates. This is always set to FALSE for client or server certificates. In most cases self-signed certificates are CA certificates. Self-signed non-CA certificates are unusual although they are possible.</source> <translation type="unfinished"/> </message> <message> <source>Not defined</source> <translation type="unfinished"/> </message> <message> <source>Certification Authority</source> <translation type="unfinished"/> </message> <message> <source>End Entity</source> <translation type="unfinished"/> </message> <message> <source>Path length</source> <translation type="unfinished"/> </message> <message> <source>How much CAs may be below this.</source> <translation type="unfinished"/> </message> <message> <source>If this is left empty the pathlen is not included in the certificate. Otherwise it distinguishes the count of chained CA certificates below this one. A pathlen of 0 means, that this certificate may not issue other sub-CA certificates. Although it can do it, all chain-checking algorithms in e.g. your browser or openssl will (should) fail.</source> <translation type="unfinished"/> </message> <message> <source>The basic constraints should always be critical</source> <translation type="unfinished"/> </message> <message> <source>Key identifier</source> <translation type="unfinished"/> </message> <message> <source>Creates a hash of the key following the PKIX guidelines</source> <translation type="unfinished"/> </message> <message> <source>Copy the Subject Key Identifier from the issuer</source> <translation type="unfinished"/> </message> <message> <source>If this box is checked an attempt is made to copy the subject key identifier from the signing certificate. It also copies the issuer and serial number from the issuer certificate. Normally this will only be done if the keyid option fails.</source> <translation type="unfinished"/> </message> <message> <source>Validity</source> <translation type="unfinished"/> </message> <message> <source>Not before</source> <translation type="unfinished"/> </message> <message> <source>Not after</source> <translation type="unfinished"/> </message> <message> <source>Time range</source> <translation type="unfinished"/> </message> <message> <source>Days</source> <translation>Gün</translation> </message> <message> <source>Months</source> <translation>Ay</translation> </message> <message> <source>Years</source> <translation>Yıl</translation> </message> <message> <source>Apply</source> <translation>Uygula</translation> </message> <message> <source>Set the time to 00:00:00 and 23:59:59 respectively</source> <translation type="unfinished"/> </message> <message> <source>Midnight</source> <translation type="unfinished"/> </message> <message> <source>No well-defined expiration</source> <translation type="unfinished"/> </message> <message> <source>Authority Info Access</source> <translation type="unfinished"/> </message> <message> <source>CRL distribution point</source> <translation type="unfinished"/> </message> <message> <source>issuer alternative name</source> <translation type="unfinished"/> </message> <message> <source>URI:</source> <translation type="unfinished"/> </message> <message> <source>This is a multi-valued extension that supports all the literal options of subject alternative name. Of the few software packages that currentlyi nterpret this extension most only interpret the URI option. Currently each option will set a new DistributionPoint with the fullName field set to the given value. Other fields like cRLissuer and reasons cannot currently be set or displayed: at this time no examples were available that used these fields. If you see this extension with <UNSUPPORTED> when you attempt to print it out or it doesn't appear to display correctly then let steve know, including the certificate (mail steve at openssl dot org) . Examples: URI:http://www.myhost.com/myca.crl URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl</source> <translation type="unfinished"/> </message> <message> <source>can be altered by the file "aia.txt"</source> <translation type="unfinished"/> </message> <message> <source>Edit</source> <translation>Düzenle</translation> </message> <message> <source>DNS: IP: URI: email: RID:</source> <translation type="unfinished"/> </message> <message> <source>The authority information access extension gives details about how to access certain information relating to the CA. Its syntax is accessOID;location where 'location' has the same syntax as subject alternative name (except that email:copy is not supported). accessOID can be any valid OID but only certain values are meaningful for example OCSP and caIssuers. OCSP gives the location of an OCSP responder: this is used by Netscape PSM and other software. Example: OCSP;URI:http://ocsp.my.host/ caIssuers;URI:http://my.ca/ca.html</source> <translation type="unfinished"/> </message> <message> <source>The subject alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name) , RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation type="unfinished"/> </message> <message> <source>subject alternative name</source> <translation type="unfinished"/> </message> <message> <source>The issuer alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name), RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</source> <translation type="unfinished"/> </message> <message> <source>Key usage</source> <translation type="unfinished"/> </message> <message> <source>Extended key usage</source> <translation type="unfinished"/> </message> <message> <source>Netscape</source> <translation type="unfinished"/> </message> <message> <source>CA Revocation URL</source> <translation type="unfinished"/> </message> <message> <source>Revocation URL</source> <translation type="unfinished"/> </message> <message> <source>SSL server name</source> <translation type="unfinished"/> </message> <message> <source>Certificate renewal URL</source> <translation type="unfinished"/> </message> <message> <source>Comment</source> <translation type="unfinished"/> </message> <message> <source>CA policy URL</source> <translation type="unfinished"/> </message> <message> <source>Base URL</source> <translation type="unfinished"/> </message> <message> <source>If you know a more pretty one tell me</source> <translation type="unfinished"/> </message> <message> <source>Advanced</source> <translation>Gelişmiş</translation> </message> <message> <source>Validate</source> <translation type="unfinished"/> </message> <message> <source>Create a &self signed certificate with a MD5-hashed QA serial</source> <translation type="unfinished"/> </message> <message> <source>Create Certificate signing request</source> <translation type="unfinished"/> </message> <message> <source>minimum size: %1</source> <translation type="unfinished"/> </message> <message> <source>maximum size: %1</source> <translation type="unfinished"/> </message> <message> <source>only a-z A-Z 0-9 '()+,-./:=?</source> <translation type="unfinished"/> </message> <message> <source>only 7-bit clean characters</source> <translation type="unfinished"/> </message> <message> <source>XCA template</source> <translation type="unfinished"/> </message> <message> <source>Create x509 Certificate</source> <translation type="unfinished"/> </message> <message> <source>From PKCS#10 request</source> <translation type="unfinished"/> </message> <message> <source>Other Tabs</source> <translation type="unfinished"/> </message> <message> <source>Advanced Tab</source> <translation type="unfinished"/> </message> <message> <source>Errors</source> <translation>Hatalar</translation> </message> <message> <source>Abort rollout</source> <translation type="unfinished"/> </message> <message> <source>The following length restrictions of RFC3280 are violated:</source> <translation type="unfinished"/> </message> <message> <source>Edit subject</source> <translation type="unfinished"/> </message> <message> <source>Continue rollout</source> <translation type="unfinished"/> </message> <message> <source>The verification of the Certificate request failed. The rollout should be aborted.</source> <translation type="unfinished"/> </message> <message> <source>Continue anyway</source> <translation type="unfinished"/> </message> <message> <source>The internal name and the common name are empty. Please set at least the internal name.</source> <translation type="unfinished"/> </message> <message> <source>Edit name</source> <translation>İsmi Düzenle</translation> </message> <message> <source>There is no Key selected for signing.</source> <translation type="unfinished"/> </message> <message> <source>Select key</source> <translation type="unfinished"/> </message> <message> <source>The following distinguished name entries are empty: %1 though you have declared them as mandatory in the options menu.</source> <translation type="unfinished"/> </message> <message> <source>The key you selected for signing is not a private one.</source> <translation type="unfinished"/> </message> <message> <source>Select other signer</source> <translation type="unfinished"/> </message> <message> <source>Select other key</source> <translation type="unfinished"/> </message> <message> <source>The certificate will be earlier valid than the signer. This is probably not what you want.</source> <translation type="unfinished"/> </message> <message> <source>Edit dates</source> <translation type="unfinished"/> </message> <message> <source>Adjust date and continue</source> <translation type="unfinished"/> </message> <message> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation type="unfinished"/> </message> <message> <source>The certificate will be out of date before it becomes valid. You most probably mixed up both dates.</source> <translation type="unfinished"/> </message> <message> <source>The certificate contains duplicated extensions. Check the validation on the advanced tab.</source> <translation type="unfinished"/> </message> <message> <source>Edit extensions</source> <translation type="unfinished"/> </message> <message> <source>Configfile error on line %1 </source> <translation type="unfinished"/> </message> </context> <context> <name>Options</name> <message> <source>XCA Options</source> <translation type="unfinished"/> </message> <message> <source>Mandatory subject entries</source> <translation type="unfinished"/> </message> <message> <source>Add</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> <message> <source>Default hash algorithm</source> <translation type="unfinished"/> </message> <message> <source>String types</source> <translation type="unfinished"/> </message> <message> <source>Suppress success messages</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 provider</source> <translation type="unfinished"/> </message> <message> <source>Remove</source> <translation type="unfinished"/> </message> <message> <source>Printable string or UTF8 (default)</source> <translation type="unfinished"/> </message> <message> <source>PKIX recommendation in RFC2459</source> <translation type="unfinished"/> </message> <message> <source>No BMP strings, only printable and T61</source> <translation type="unfinished"/> </message> <message> <source>UTF8 strings only (RFC2459)</source> <translation type="unfinished"/> </message> <message> <source>All strings</source> <translation type="unfinished"/> </message> <message> <source>Load failed</source> <translation type="unfinished"/> </message> </context> <context> <name>PwDialog</name> <message> <source>Password</source> <translation type="unfinished">Parola</translation> </message> <message> <source>The password is parsed as 2-digit hex code. It must have an equal number of digits (0-9 and a-f)</source> <translation type="unfinished"/> </message> <message> <source>Take as HEX string</source> <translation type="unfinished"/> </message> <message> <source>Repeat %1</source> <translation type="unfinished"/> </message> <message> <source>%1 missmatch</source> <translation type="unfinished"/> </message> <message> <source>Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it must consist of an even number of characters</source> <translation type="unfinished"/> </message> <message> <source>E&xit</source> <translation type="unfinished"/> </message> </context> <context> <name>QObject</name> <message> <source>Undefined</source> <translation type="unfinished"/> </message> <message> <source>DB: Rename: '%1' already in use</source> <translation type="unfinished"/> </message> <message> <source>DB: Entry to rename not found: %1</source> <translation type="unfinished"/> </message> <message> <source>DB: Write error %1 - %2</source> <translation type="unfinished"/> </message> <message> <source>Out of data</source> <translation type="unfinished"/> </message> <message> <source>Error finding endmarker of string</source> <translation type="unfinished"/> </message> <message> <source>Out of Memory at %1:%2</source> <translation type="unfinished"/> </message> <message> <source>All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;</source> <translation type="unfinished"/> </message> <message> <source>Import RSA key</source> <translation type="unfinished"/> </message> <message> <source>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;</source> <translation type="unfinished"/> </message> <message> <source>Import Request</source> <translation type="unfinished"/> </message> <message> <source>Certificates ( *.pem *.der *.crt *.cer );;</source> <translation type="unfinished"/> </message> <message> <source>Import X.509 Certificate</source> <translation type="unfinished"/> </message> <message> <source>PKCS#7 data ( *.p7s *.p7m *.p7b );;</source> <translation type="unfinished"/> </message> <message> <source>Import PKCS#7 Certificates</source> <translation type="unfinished"/> </message> <message> <source>PKCS#12 Certificates ( *.p12 *.pfx );;</source> <translation type="unfinished"/> </message> <message> <source>Import PKCS#12 Private Certificate</source> <translation type="unfinished"/> </message> <message> <source>XCA templates ( *.xca );;</source> <translation type="unfinished"/> </message> <message> <source>Import XCA Templates</source> <translation type="unfinished"/> </message> <message> <source>Revocation lists ( *.pem *.der *.crl );;</source> <translation type="unfinished"/> </message> <message> <source>Import Certificate Revocation List</source> <translation type="unfinished"/> </message> <message> <source>XCA Databases ( *.xdb );;</source> <translation type="unfinished"/> </message> <message> <source>Open XCA Database</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 library ( *.dll );;</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 library ( *.dylib *.so );;</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 library ( *.so );;</source> <translation type="unfinished"/> </message> <message> <source>Open PKCS#11 shared library</source> <translation type="unfinished"/> </message> <message> <source>PEM files ( *.pem );;</source> <translation type="unfinished"/> </message> <message> <source>Load PEM encoded file</source> <translation type="unfinished"/> </message> <message> <source>Please enter the PIN on the PinPad</source> <translation type="unfinished"/> </message> <message> <source>Please enter the SO PIN (PUK) of the token %1</source> <translation type="unfinished"/> </message> <message> <source>Please enter the PIN of the token %1</source> <translation type="unfinished"/> </message> <message> <source>No Security token found</source> <translation type="unfinished"/> </message> <message> <source>Select</source> <translation type="unfinished"/> </message> <message> <source>Please enter the new SO PIN (PUK) for the token: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the new PIN for the token: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Required PIN size: %1 - %2</source> <translation type="unfinished"/> </message> <message> <source>Failed to open PKCS11 library: %1</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 function '%1' failed: %2</source> <translation type="unfinished"/> </message> <message> <source>PKCS#11 function '%1' failed: %2 In library %3 %4</source> <translation type="unfinished"/> </message> <message> <source>Invalid</source> <translation type="unfinished"/> </message> <message> <source>%1 is shorter than %2 bytes: '%3'</source> <translation type="unfinished"/> </message> <message> <source>%1 is longer than %2 bytes: '%3'</source> <translation type="unfinished"/> </message> </context> <context> <name>Revoke</name> <message> <source>Revokation details</source> <translation type="unfinished"/> </message> <message> <source>Invalid since</source> <translation type="unfinished"/> </message> <message> <source>Revokation reason</source> <translation type="unfinished"/> </message> </context> <context> <name>SelectToken</name> <message> <source>Select Token</source> <translation type="unfinished"/> </message> <message> <source>Security token</source> <translation type="unfinished"/> </message> <message> <source>Please select the security token</source> <translation type="unfinished"/> </message> </context> <context> <name>TrustState</name> <message> <source>Set trustment of the Certificate</source> <translation type="unfinished"/> </message> <message> <source>Trustment</source> <translation type="unfinished"/> </message> <message> <source>&Never trust this certificate</source> <translation type="unfinished"/> </message> <message> <source>Only &trust this certificate, if we trust the signer</source> <translation type="unfinished"/> </message> <message> <source>&Always trust this certificate</source> <translation type="unfinished"/> </message> </context> <context> <name>Validity</name> <message> <source>yyyy-MM-dd hh:mm</source> <translation type="unfinished"/> </message> </context> <context> <name>db_base</name> <message> <source>Internal name</source> <translation type="unfinished"/> </message> <message> <source>Reset</source> <translation type="unfinished"/> </message> <message> <source>Subject entries</source> <translation type="unfinished"/> </message> <message> <source>Paste PEM data</source> <translation type="unfinished"/> </message> <message> <source>Columns</source> <translation type="unfinished"/> </message> </context> <context> <name>db_crl</name> <message> <source>Signer</source> <translation type="unfinished"/> </message> <message> <source>Internal name of the signer</source> <translation type="unfinished"/> </message> <message> <source>No. revoked</source> <translation type="unfinished"/> </message> <message> <source>Number of revoked certificates</source> <translation type="unfinished"/> </message> <message> <source>Last update</source> <translation type="unfinished"/> </message> <message> <source>Next update</source> <translation type="unfinished"/> </message> <message> <source>CRL number</source> <translation type="unfinished"/> </message> <message> <source>The revokation list already exists in the database as: '%1' and so it was not imported</source> <translation type="unfinished"/> </message> <message> <source>CRL ( *.pem *.der *.crl )</source> <translation type="unfinished"/> </message> <message> <source>Revokation list export</source> <translation type="unfinished"/> </message> <message> <source>Import</source> <translation type="unfinished"/> </message> <message> <source>Rename</source> <translation type="unfinished"/> </message> <message> <source>Export</source> <translation type="unfinished"/> </message> <message> <source>Clipboard</source> <translation type="unfinished"/> </message> <message> <source>File</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> </context> <context> <name>db_key</name> <message> <source>Type</source> <translation type="unfinished"/> </message> <message> <source>Size</source> <translation type="unfinished"/> </message> <message> <source>Use</source> <translation type="unfinished"/> </message> <message> <source>Password</source> <translation type="unfinished"/> </message> <message> <source>The key is already in the database as: '%1' and is not going to be imported</source> <translation type="unfinished"/> </message> <message> <source>The database already contains the public part of the imported key as '%1 and will be completed by the new, private part of the key</source> <translation type="unfinished"/> </message> <message> <source>Key size too small !</source> <translation type="unfinished"/> </message> <message> <source>You are sure to create a key of the size: %1 ?</source> <translation type="unfinished"/> </message> <message> <source>Shall the original key '%1' be replaced by the key on the token? This will delete the key '%1' and make it unexportable</source> <translation type="unfinished"/> </message> <message> <source>New Key</source> <translation type="unfinished"/> </message> <message> <source>Import</source> <translation type="unfinished"/> </message> <message> <source>Rename</source> <translation type="unfinished"/> </message> <message> <source>Show Details</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> <message> <source>Export</source> <translation type="unfinished"/> </message> <message> <source>Change password</source> <translation type="unfinished"/> </message> <message> <source>Reset password</source> <translation type="unfinished"/> </message> <message> <source>Change PIN</source> <translation type="unfinished"/> </message> <message> <source>Init PIN with SO PIN (PUK)</source> <translation type="unfinished"/> </message> <message> <source>Change SO PIN (PUK)</source> <translation type="unfinished"/> </message> <message> <source>Store on Security token</source> <translation type="unfinished"/> </message> <message> <source>Tried to change password of a token</source> <translation type="unfinished"/> </message> <message> <source>Tried to change PIN of a key</source> <translation type="unfinished"/> </message> <message> <source>Tried to init PIN of a key</source> <translation type="unfinished"/> </message> <message> <source>Tried to change SO PIN of a key</source> <translation type="unfinished"/> </message> </context> <context> <name>db_temp</name> <message> <source>Type</source> <translation type="unfinished"/> </message> <message> <source>Bad template: %1</source> <translation type="unfinished"/> </message> <message> <source>Nothing</source> <translation type="unfinished"/> </message> <message> <source>Preset Template values</source> <translation type="unfinished"/> </message> <message> <source>copy</source> <translation type="unfinished"/> </message> <message> <source>Save template as</source> <translation type="unfinished"/> </message> <message> <source>XCA templates ( *.xca);; All files ( * )</source> <translation type="unfinished"/> </message> <message> <source>New Template</source> <translation type="unfinished"/> </message> <message> <source>Import</source> <translation type="unfinished"/> </message> <message> <source>Rename</source> <translation type="unfinished"/> </message> <message> <source>Export</source> <translation type="unfinished"/> </message> <message> <source>Change</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> <message> <source>Duplicate</source> <translation type="unfinished"/> </message> <message> <source>Create certificate</source> <translation type="unfinished"/> </message> <message> <source>Create request</source> <translation type="unfinished"/> </message> </context> <context> <name>db_x509</name> <message> <source>CA</source> <translation type="unfinished"/> </message> <message> <source>reflects the basic Constraints extension</source> <translation type="unfinished"/> </message> <message> <source>Serial</source> <translation type="unfinished"/> </message> <message> <source>md5 fingerprint</source> <translation type="unfinished"/> </message> <message> <source>sha1 fingerprint</source> <translation type="unfinished"/> </message> <message> <source>Start date</source> <translation type="unfinished"/> </message> <message> <source>not Before</source> <translation type="unfinished"/> </message> <message> <source>Expiry date</source> <translation type="unfinished"/> </message> <message> <source>not After</source> <translation type="unfinished"/> </message> <message> <source>Trust state</source> <translation type="unfinished"/> </message> <message> <source>Revocation</source> <translation type="unfinished"/> </message> <message> <source>Plain View</source> <translation type="unfinished"/> </message> <message> <source>Tree View</source> <translation type="unfinished"/> </message> <message> <source>The certificate already exists in the database as: '%1' and so it was not imported</source> <translation type="unfinished"/> </message> <message> <source>Invalid public key</source> <translation type="unfinished"/> </message> <message> <source>Please enter the new hexadecimal secret number for the QA process.</source> <translation type="unfinished"/> </message> <message> <source>The QA process has been terminated by the user.</source> <translation type="unfinished"/> </message> <message> <source>The key you selected for signing is not a private one.</source> <translation type="unfinished"/> </message> <message> <source>Store the certificate to the key on the token '%1 (#%2)' ?</source> <translation type="unfinished"/> </message> <message> <source>New Certificate</source> <translation type="unfinished"/> </message> <message> <source>Import</source> <translation type="unfinished">&İçe Aktar</translation> </message> <message> <source>Import PKCS#12</source> <translation type="unfinished"/> </message> <message> <source>Import from PKCS#7</source> <translation type="unfinished"/> </message> <message> <source>Rename</source> <translation type="unfinished">Dosya adı</translation> </message> <message> <source>Show Details</source> <translation type="unfinished">Detaylar</translation> </message> <message> <source>Extract public Key</source> <translation type="unfinished"/> </message> <message> <source>Export</source> <translation type="unfinished">Verme biçimi</translation> </message> <message> <source>Clipboard</source> <translation type="unfinished"/> </message> <message> <source>File</source> <translation type="unfinished">&Dosya</translation> </message> <message> <source>Request</source> <translation type="unfinished"/> </message> <message> <source>Security token</source> <translation type="unfinished"/> </message> <message> <source>Other token</source> <translation type="unfinished"/> </message> <message> <source>Template</source> <translation type="unfinished"/> </message> <message> <source>OpenSSL config</source> <translation type="unfinished">Yapılandırmayı göster</translation> </message> <message> <source>Delete</source> <translation type="unfinished">Sil</translation> </message> <message> <source>Delete from Security token</source> <translation type="unfinished"/> </message> <message> <source>Trust</source> <translation type="unfinished"/> </message> <message> <source>Properties</source> <translation type="unfinished"/> </message> <message> <source>Generate CRL</source> <translation type="unfinished"/> </message> <message> <source>PKCS#7</source> <translation type="unfinished"/> </message> <message> <source>Sign</source> <translation type="unfinished">İmzalayan:</translation> </message> <message> <source>Encrypt</source> <translation type="unfinished"/> </message> <message> <source>Renewal</source> <translation type="unfinished"/> </message> <message> <source>Unrevoke</source> <translation type="unfinished"/> </message> <message> <source>Revoke</source> <translation type="unfinished"/> </message> <message> <source>There was no key found for the Certificate: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Not possible for a token key: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Not possible for the token-key Certificate '%1'</source> <translation type="unfinished"/> </message> <message> <source> days</source> <translation type="unfinished"/> </message> </context> <context> <name>db_x509name</name> <message> <source>Subject</source> <translation type="unfinished"/> </message> <message> <source>Complete distinguished name</source> <translation type="unfinished"/> </message> <message> <source>Subject hash</source> <translation type="unfinished"/> </message> <message> <source>Hash to lookup certs in directories</source> <translation type="unfinished"/> </message> </context> <context> <name>db_x509req</name> <message> <source>Signed</source> <translation type="unfinished"/> </message> <message> <source>whether the request is already signed or not</source> <translation type="unfinished"/> </message> <message> <source>Unstructured name</source> <translation type="unfinished"/> </message> <message> <source>Challenge password</source> <translation type="unfinished">Yeni Parola</translation> </message> <message> <source>The certificate signing request already exists in the database as '%1' and thus was not stored</source> <translation type="unfinished"/> </message> <message> <source>Certificate request ( *.pem *.der *.crl )</source> <translation type="unfinished"/> </message> <message> <source>Certificate request export</source> <translation type="unfinished"/> </message> <message> <source>New Request</source> <translation type="unfinished"/> </message> <message> <source>Import</source> <translation type="unfinished"/> </message> <message> <source>Extract public Key</source> <translation type="unfinished"/> </message> <message> <source>Rename</source> <translation type="unfinished"/> </message> <message> <source>Show Details</source> <translation type="unfinished"/> </message> <message> <source>Sign</source> <translation type="unfinished"/> </message> <message> <source>Export</source> <translation type="unfinished"/> </message> <message> <source>Clipboard</source> <translation type="unfinished"/> </message> <message> <source>File</source> <translation type="unfinished"/> </message> <message> <source>Template</source> <translation type="unfinished"/> </message> <message> <source>OpenSSL config</source> <translation type="unfinished">Yapılandırmayı göster</translation> </message> <message> <source>Delete</source> <translation type="unfinished">Sil</translation> </message> </context> <context> <name>db_x509super</name> <message> <source>Key name</source> <translation type="unfinished"/> </message> <message> <source>Internal name of the key</source> <translation type="unfinished"/> </message> <message> <source>Save as OpenSSL config</source> <translation type="unfinished"/> </message> <message> <source>Config files ( *.conf *.cnf);; All files ( * )</source> <translation type="unfinished">X509 sertifikası (*cer *.crt *.p12 *.p7b);;Tüm dosyalar (*)</translation> </message> <message> <source>The following extensions were not ported into the template</source> <translation type="unfinished"/> </message> </context> <context> <name>kvView</name> <message> <source>Type</source> <translation type="unfinished"/> </message> <message> <source>Content</source> <translation type="unfinished"/> </message> </context> <context> <name>pass_info</name> <message> <source>Password</source> <translation type="unfinished"/> </message> <message> <source>PIN</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_base</name> <message> <source>Error opening file: '%1': %2</source> <translation type="unfinished"/> </message> <message> <source>Error writing to file: '%1': %2</source> <translation type="unfinished"/> </message> <message> <source>Error: </source> <translation type="unfinished"/> </message> <message> <source>Internal error: Unexpected message: %1 %2</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_crl</name> <message> <source>Successfully imported the revokation list '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the revokation list '%1'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the revokation list '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 revokation lists: %2?</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the revokation list in file %1. Tried PEM and DER formatted CRL.</source> <translation type="unfinished"/> </message> <message> <source>No issuer given</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> <message> <source>unknown</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_evp</name> <message> <source>Failed to decrypt the key (bad password) </source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to decrypt the private key.</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to decrypt the private key from file: %1</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the private key in file %1. Tried PEM and DER private, public and PKCS#8 key types.</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to decrypt the private key: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Password input aborted</source> <translation type="unfinished"/> </message> <message> <source>Please enter the database password for decrypting the key '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to protect the private key: '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the database password for encrypting the key</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password protecting the PKCS#8 key '%1'</source> <translation type="unfinished"/> </message> <message> <source>Please enter the export password for the private key '%1'</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_key</name> <message> <source>Successfully imported the %1 public key '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 public key '%2'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully imported the %1 private key '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 private key '%2'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the %1 private key '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 keys: %2?</source> <translation type="unfinished"/> </message> <message> <source>public key</source> <translation type="unfinished"/> </message> <message> <source>Common</source> <translation type="unfinished"/> </message> <message> <source>Private</source> <translation type="unfinished"/> </message> <message> <source>Bogus</source> <translation type="unfinished"/> </message> <message> <source>PIN</source> <translation type="unfinished"/> </message> <message> <source>No password</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_multi</name> <message> <source>Seek failed</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_pkcs12</name> <message> <source>Please enter the password to decrypt the PKCS#12 file: %1</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the PKCS#12 (pfx) file %1.</source> <translation type="unfinished"/> </message> <message> <source>The supplied password was wrong (%1)</source> <translation type="unfinished"/> </message> <message> <source>Please enter the password to encrypt the PKCS#12 file</source> <translation type="unfinished"/> </message> <message> <source>No key or no Cert and no pkcs12</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_pkcs7</name> <message> <source>Unable to load the PKCS#7 file %1. Tried PEM and DER format.</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_scard</name> <message> <source>Successfully imported the token key '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the token key '%1'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the token key '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 keys: %2?</source> <translation type="unfinished"/> </message> <message> <source>Delete the private key '%1' from the token '%2 (#%3)' ?</source> <translation type="unfinished"/> </message> <message> <source>only RSA keys can be stored on tokens</source> <translation type="unfinished"/> </message> <message> <source>This Key is already on the token</source> <translation type="unfinished"/> </message> <message> <source>PIN input aborted</source> <translation type="unfinished"/> </message> <message> <source>Unable to find copied key on the token</source> <translation type="unfinished"/> </message> <message> <source>Please insert card: %1 %2 [%3] with Serial: %4</source> <translation type="unfinished"/> </message> <message> <source>Public Key missmatch. Please re-import card</source> <translation type="unfinished"/> </message> <message> <source>Unable to find generated key on card</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> <message> <source>Token %1</source> <translation type="unfinished"/> </message> <message> <source>Failed to find the key on the token</source> <translation type="unfinished"/> </message> <message> <source>Invalid Pin for the token</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_temp</name> <message> <source>Successfully imported the XCA template '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the XCA template '%1'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the XCA template '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 XCA templates: %2?</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> <message> <source>Template file content error (too small): %1</source> <translation type="unfinished"/> </message> <message> <source>Template file content error (bad size): %1 </source> <translation type="unfinished"/> </message> <message> <source>Template file content error (bad length) :%1</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_x509</name> <message> <source>Successfully imported the certificate '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the certificate '%1'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the certificate '%1'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 certificates: %2?</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the certificate in file %1. Tried PEM and DER certificate.</source> <translation type="unfinished"/> </message> <message> <source>This certificate is already on the security token</source> <translation type="unfinished"/> </message> <message> <source>Delete the certificate '%1' from the token '%2 (#%3)'?</source> <translation type="unfinished"/> </message> <message> <source>There is no key for signing !</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> <message> <source>Not trusted</source> <translation type="unfinished"/> </message> <message> <source>Trust inherited</source> <translation type="unfinished"/> </message> <message> <source>Always Trusted</source> <translation type="unfinished"/> </message> <message> <source>CRL expires: %1</source> <translation type="unfinished"/> </message> <message> <source>No</source> <translation type="unfinished"/> </message> <message> <source>Yes</source> <translation type="unfinished"/> </message> </context> <context> <name>pki_x509req</name> <message> <source>Signing key not valid (public key)</source> <translation type="unfinished"/> </message> <message> <source>Successfully imported the %1 certificate request '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 certificate request '%2'?</source> <translation type="unfinished"/> </message> <message> <source>Successfully created the %1 certificate request '%2'</source> <translation type="unfinished"/> </message> <message> <source>Delete the %1 certificate requests: %2?</source> <translation type="unfinished"/> </message> <message> <source>Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC format.</source> <translation type="unfinished"/> </message> <message> <source>Signed</source> <translation type="unfinished"/> </message> <message> <source>Unhandled</source> <translation type="unfinished"/> </message> <message> <source>Wrong Size %1</source> <translation type="unfinished"/> </message> </context> <context> <name>v3ext</name> <message> <source>Add</source> <translation type="unfinished"/> </message> <message> <source>Delete</source> <translation type="unfinished"/> </message> <message> <source>Apply</source> <translation type="unfinished"/> </message> <message> <source>Validate</source> <translation type="unfinished"/> </message> <message> <source>Cancel</source> <translation type="unfinished"/> </message> <message> <source>An email address or 'copy'</source> <translation type="unfinished"/> </message> <message> <source>An email address</source> <translation type="unfinished"/> </message> <message> <source>a registered ID: OBJECT IDENTIFIER</source> <translation type="unfinished"/> </message> <message> <source>a uniform resource indicator</source> <translation type="unfinished"/> </message> <message> <source>a DNS domain name</source> <translation type="unfinished"/> </message> <message> <source>an IP address</source> <translation type="unfinished"/> </message> <message> <source>Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'</source> <translation type="unfinished"/> </message> <message> <source>No editing. Only 'copy' allowed here</source> <translation type="unfinished"/> </message> <message> <source>Validation failed: '%1' %2</source> <translation type="unfinished"/> </message> <message> <source>Validation successful: '%1'</source> <translation type="unfinished"/> </message> </context> <context> <name>void</name> <message> <source>There was no key found for the Certificate: </source> <translation type="unfinished"/> </message> <message> <source>Import Certificate signing request</source> <translation type="unfinished"/> </message> </context> </TS> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/��������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11753427512�0013135�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/Makefile������������������������������������������������������������������������������0000664�0000000�0000000�00000001155�11753427512�0014577�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ifeq ($(TOPDIR),) TOPDIR=.. BUILD=.. endif MOCNAMES=db_crl db_key db_temp db_x509 db_x509req db_x509super db_base db_token\ pki_temp pki_x509 pki_crl pki_x509req pki_key pki_x509super pki_pkcs12 \ pki_base pki_multi pki_evp pki_scard pass_info pki_pkcs7 NAMES=$(MOCNAMES) asn1int oid x509rev asn1time \ x509v3ext func load_obj main x509name db import \ pk11_attribute pkcs11 pkcs11_lib Passwd OBJS=$(patsubst %, %.o, $(NAMES)) $(patsubst %, moc_%.o, $(MOCNAMES)) include $(TOPDIR)/Rules.mak sinclude .depend db_dump: db_dump.cpp db.o db.h gcc $(CPPFLAGS) $(LDFLAGS) $(CFLAGS) db_dump.cpp db.o $(LIBS) -g -o $@ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/Passwd.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000000536�11753427512�0015106�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2012 Christian Hohnstaedt. * * All rights reserved. */ #include <QtCore/QByteArray> #include "Passwd.h" void Passwd::cleanse() { memset(data(), 0, size()); } Passwd::~Passwd() { Passwd::cleanse(); } unsigned char *Passwd::constUchar() const { return (unsigned char *)(size() ? constData() : ""); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/Passwd.h������������������������������������������������������������������������������0000664�0000000�0000000�00000000736�11753427512�0014555�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PASSWD_H #define __PASSWD_H #include <QtCore/QByteArray> class Passwd: public QByteArray { public: void cleanse(); ~Passwd(); unsigned char *constUchar() const; Passwd & operator= (const char *p) { return (Passwd&)QByteArray::operator=(p); } Passwd & operator= (const QByteArray &other) { return (Passwd&)QByteArray::operator=(other); } }; #endif ����������������������������������xca_0.9.3/lib/asn1int.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000005756�11753427512�0015233�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "asn1int.h" #include "func.h" #include "exception.h" #include <openssl/err.h> #include <openssl/bn.h> ASN1_INTEGER *a1int::dup(const ASN1_INTEGER *a) const { // this wrapper casts the const to work around the nonconst // declared ASN1_STRING_dup (actually it is const return ASN1_INTEGER_dup((ASN1_INTEGER *)a); } a1int::a1int() { in = ASN1_INTEGER_new(); ASN1_INTEGER_set(in, 0); } a1int::a1int(const ASN1_INTEGER *i) { in = dup(i); if (!in) in = ASN1_INTEGER_new(); } a1int::a1int(const a1int &a) { in = dup(a.in); if (!in) in = ASN1_INTEGER_new(); } a1int::a1int(long l) { in = ASN1_INTEGER_new(); set(l); } a1int::~a1int() { ASN1_INTEGER_free(in); } a1int &a1int::set(const ASN1_INTEGER *i) { ASN1_INTEGER_free(in); in = dup(i); return *this; } a1int &a1int::set(long l) { ASN1_INTEGER_set(in, l); return *this; } QString a1int::toHex() const { QString r; if (in->length == 0) { return r; } BIGNUM *bn = ASN1_INTEGER_to_BN(in, NULL); char *res = BN_bn2hex(bn); r = res; OPENSSL_free(res); BN_free(bn); return r; } QString a1int::toDec() const { QString r; if (in->length == 0) { return r; } BIGNUM *bn = ASN1_INTEGER_to_BN(in, NULL); char *res = BN_bn2dec(bn); r = res; BN_free(bn); OPENSSL_free(res); return r; } a1int &a1int::setHex(const QString &s) { BIGNUM *bn=0; if (s.isEmpty()) { return *this; } if (!BN_hex2bn(&bn,s.toAscii())) openssl_error(); BN_to_ASN1_INTEGER(bn, in); BN_free(bn); return *this; } a1int &a1int::setDec(const QString &s) { BIGNUM *bn=0; if (!BN_dec2bn(&bn,s.toAscii())) openssl_error(); BN_to_ASN1_INTEGER(bn, in); BN_free(bn); return *this; } a1int &a1int::setRaw(const unsigned char *data, unsigned len) { BIGNUM *bn = BN_bin2bn(data, len, NULL); if (!bn) openssl_error(); BN_to_ASN1_INTEGER(bn, in); BN_free(bn); return *this; } ASN1_INTEGER *a1int::get() const { return dup(in); } long a1int::getLong() const { return ASN1_INTEGER_get(in); } a1int &a1int::operator ++ (void) { BIGNUM *bn = ASN1_INTEGER_to_BN(in, NULL); BN_add(bn, bn, BN_value_one()); BN_to_ASN1_INTEGER(bn, in); BN_free(bn); return *this; } a1int a1int::operator ++ (int) { a1int tmp = *this; operator ++ (); return tmp; } a1int &a1int::operator = (const a1int &a) { set(a.in); return *this; } a1int &a1int::operator = (long i) { ASN1_INTEGER_set(in, i); return *this; } bool a1int::operator > (const a1int &a) const { return (ASN1_INTEGER_cmp(in, a.in) > 0); } bool a1int::operator < (const a1int &a) const { return (ASN1_INTEGER_cmp(in, a.in) < 0); } bool a1int::operator == (const a1int &a) const { return (ASN1_INTEGER_cmp(in, a.in) == 0); } bool a1int::operator != (const a1int &a) const { return (ASN1_INTEGER_cmp(in, a.in) != 0); } unsigned char *a1int::i2d(unsigned char *p) { unsigned char *mp = p; i2d_ASN1_INTEGER(in, &mp); return mp; } int a1int::derSize() const { return i2d_ASN1_INTEGER(in, NULL); } ������������������xca_0.9.3/lib/asn1int.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000002054�11753427512�0014664�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __ASN1INTEGER_H #define __ASN1INTEGER_H #include <QtCore/QString> #include <openssl/asn1.h> class a1int { private: ASN1_INTEGER *in; ASN1_INTEGER *dup(const ASN1_INTEGER *a) const; public: a1int(); a1int(const ASN1_INTEGER *i); a1int(const a1int &a); a1int(long l); ~a1int(); a1int &set(const ASN1_INTEGER *i); a1int &set(long l); QString toHex() const; QString toDec() const; a1int &setHex(const QString &s); a1int &setDec(const QString &s); a1int &setRaw(const unsigned char *data, unsigned len); long getLong() const; ASN1_INTEGER *get() const; unsigned char *i2d(unsigned char *p); int derSize() const; a1int &operator ++ (void); a1int operator ++ (int); a1int &operator = (const a1int &a); a1int &operator = (long i); bool operator > (const a1int &a) const; bool operator < (const a1int &a) const; bool operator == (const a1int &a) const; bool operator != (const a1int &a) const; }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/asn1time.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000006713�11753427512�0015371�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "base.h" #include "func.h" #include "exception.h" #include <time.h> #include "asn1time.h" #include <openssl/x509.h> #include <openssl/err.h> #include <openssl/opensslv.h> #include <QtCore/QObject> /* As defined in rfc-5280 4.1.2.5 */ #define UNDEFINED_DATE "99991231235959Z" #define UTC_FORMAT "yyMMddHHmmss'Z'" #define GEN_FORMAT "yy" UTC_FORMAT bool a1time::isUndefined() const { return toTime_t() == 0; } void a1time::setUndefined() { /* This way we handle "Jan 01, 1970 00:00:00" * like RFC-5280 undefined date. I dare it */ setTimeSpec(Qt::UTC); setTime_t(0); } int a1time::from_asn1(const ASN1_TIME *a) { ASN1_GENERALIZEDTIME *gt; QString t; *this = QDateTime(); if (!a) return -1; gt = ASN1_TIME_to_generalizedtime((ASN1_TIME*)a, NULL); if (!gt) return -1; t = QString::fromAscii((char*)gt->data, gt->length); ASN1_GENERALIZEDTIME_free(gt); if (t == UNDEFINED_DATE) { setUndefined(); return 0; } *this = QDateTime::fromString(t, GEN_FORMAT); setTimeSpec(Qt::UTC); return 0; } int a1time::set_asn1(QString str, int type) { if (!atime) atime = ASN1_TIME_new(); if (!atime) return -1; atime->type = type; if (ASN1_STRING_set(atime, str.toAscii(), str.length())) return -1; return 0; } a1time::a1time(const QDateTime &a) : QDateTime(a) { atime = NULL; } a1time::a1time(const a1time &a) : QDateTime(a) { atime = NULL; } a1time &a1time::operator = (const a1time &a) { if (atime) ASN1_TIME_free(atime); atime = NULL; QDateTime::operator=(a); return *this; } a1time::a1time() { atime = NULL; *this = now(); } a1time::a1time(const ASN1_TIME *a) { atime = NULL; from_asn1(a); } a1time::~a1time() { if (atime) ASN1_TIME_free(atime); } ASN1_TIME *a1time::get_utc() { int year = date().year(); if (!isValid() || isUndefined() || year > 2049 || year < 1950) return get(); set_asn1(toUTC().toString(UTC_FORMAT), V_ASN1_UTCTIME); return atime; } ASN1_TIME *a1time::get() { if (isUndefined()) set_asn1(UNDEFINED_DATE, V_ASN1_GENERALIZEDTIME); else if (!isValid()) throw errorEx("Invalid Time"); else set_asn1(toUTC().toString(GEN_FORMAT), V_ASN1_GENERALIZEDTIME); return atime; } a1time &a1time::set(const ASN1_TIME *a) { from_asn1(a); return *this; } QString a1time::toPretty() const { if (isUndefined()) return QObject::tr("Undefined"); if (!isValid()) return QObject::tr("Broken / Invalid"); return toLocalTime().toString(Qt::SystemLocaleLongDate); } QString a1time::toPrettyGMT() const { if (isUndefined()) return QObject::tr("Undefined"); if (!isValid()) return QObject::tr("Broken / Invalid"); return toUTC().toString(Qt::ISODate) + " GMT"; } QString a1time::toPlain() const { if (isUndefined()) return QString(UNDEFINED_DATE); if (!isValid()) return QString("Broken-InvalidZ"); return toUTC().toString(GEN_FORMAT); } QString a1time::toSortable() const { if (isUndefined()) return QObject::tr("Undefined"); if (!isValid()) return QObject::tr("Broken / Invalid"); return toUTC().toString("yyyy-MM-dd"); } QDateTime a1time::now(int delta) { QDateTime dt = QDateTime::currentDateTime().toUTC().addSecs(delta); return dt; } void a1time::d2i(QByteArray &ba) { ASN1_TIME *n = (ASN1_TIME*)d2i_bytearray( D2I_VOID(d2i_ASN1_TIME), ba); if (n) { from_asn1(n); ASN1_TIME_free(n); } } QByteArray a1time::i2d() { get(); return i2d_bytearray(I2D_VOID(i2d_ASN1_TIME), atime); } �����������������������������������������������������xca_0.9.3/lib/asn1time.h����������������������������������������������������������������������������0000664�0000000�0000000�00000001601�11753427512�0015025�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __ASN1TIME_H #define __ASN1TIME_H #include <QtCore/QString> #include <QtCore/QDateTime> #include <openssl/asn1.h> #define SECONDS_PER_DAY (60*60*24) class a1time : public QDateTime { private: ASN1_TIME *atime; int from_asn1(const ASN1_TIME *a); int set_asn1(QString str, int type); public: a1time(); a1time(const QDateTime &a); a1time(const ASN1_TIME *a); a1time(const a1time &a); a1time &operator = (const a1time &a); ~a1time(); a1time &set(const ASN1_TIME *a); void setUndefined(); bool isUndefined() const; QString toPretty() const; QString toPrettyGMT() const; QString toPlain() const; QString toSortable() const; ASN1_TIME *get(); ASN1_TIME *get_utc(); static QDateTime now(int delta = 0); QByteArray i2d(); void d2i(QByteArray &ba); }; #endif �������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/base.h��������������������������������������������������������������������������������0000664�0000000�0000000�00000001165�11753427512�0014223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __BASE_H #define __BASE_H #define QT_NO_CAST_TO_ASCII 1 #define XCA_TITLE "X Certificate and Key management" #include <QtCore/qglobal.h> #include "local.h" #ifdef WIN32 #include <windows.h> #endif #include <openssl/opensslv.h> #define CCHAR(x) qPrintable(x) #endif #define C_FILE ((strrchr(__FILE__, '/') ? : __FILE__- 1) + 1) #define TRACE fprintf(stderr, "File: %s Func: %s Line: %d\n", C_FILE, __func__, __LINE__); #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) #define MIN(a,b) ((a)<(b)) ? (a) : (b) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db.cpp��������������������������������������������������������������������������������0000664�0000000�0000000�00000023004�11753427512�0014225�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "db.h" #include "base.h" #include "func.h" #include "exception.h" #include <QtCore/QStringList> #ifdef WIN32 #include <windows.h> #else #include <netinet/in.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #endif db::db(QString filename, QFlags<QFile::Permission> perm) { name = filename; file.setFileName(filename); bool newFile = !file.exists(); if (!file.open(QIODevice::ReadWrite)) { fileIOerr("open"); } else { first(); if (newFile) file.setPermissions(perm); } } db::~db() { file.close(); } void db::fileIOerr(QString s) { errstr = QString("DB ") + s + "() '" + file.fileName() + "'"; dberrno = errno; throw errorEx(errstr, strerror(errno)); } void db::init_header(db_header_t *db, int ver, int len, enum pki_type type, QString name) { memset(db, 0, sizeof(db_header_t)); db->magic = htonl(XCA_MAGIC); db->len = htonl(sizeof(db_header_t)+len); db->headver = htons(1); db->type = htons(type); db->version = htons(ver); db->flags = 0; strncpy(db->name, name.toUtf8(), NAMELEN); db->name[NAMELEN-1] = '\0'; } void db::convert_header(db_header_t *h) { h->magic = ntohl(head.magic); h->len = ntohl(head.len); h->headver = ntohs(head.headver); h->type = ntohs(head.type); h->version = ntohs(head.version); h->flags = ntohs(head.flags); memcpy(h->name, head.name, NAMELEN); } bool db::verify_magic(void) { if (!eof()) if (ntohl(head.magic) != XCA_MAGIC) { throw errorEx(QString("database error '") + file.fileName() +"'", "at: " + QString::number(head_offset)); return false; } return true; } bool db::eof() { return (head_offset == OFF_EOF); } int db::find(enum pki_type type, QString name) { while (!eof()) { if (ntohs(head.type) == type) { if (name.isEmpty()) { /* only compare type */ return 0; } else if (QString::fromUtf8(head.name) == name) { return 0; } } if (!verify_magic()) { return -1; } next(); } return 1; } void db::first(int flag) { int ret; memset(&head, 0, sizeof(db_header_t) ); head_offset = 0; file.seek(0); ret = file.read((char*)&head, sizeof(db_header_t) ); if (ret < 0 ) fileIOerr("read"); if (ret==0) { head_offset = OFF_EOF; return; } if (!verify_magic()) return; if (ntohs(head.flags) & flag) next(flag); } int db::next(int flag) { int ret; if (eof()) return 1; head_offset += ntohl(head.len); file.seek(head_offset); ret = file.read((char*)&head, sizeof(db_header_t) ); if (ret==0) { //printf("Next: EOF at %lu\n", head_offset); head_offset = OFF_EOF; return 1; } if (ret < 0) { fileIOerr("read"); return -1; } if (ret != sizeof(db_header_t)) { printf("Length broken: %d instead of %ld\n", ret, (long)sizeof(db_header_t) ); //ftruncate(fd, head_offset); head_offset = OFF_EOF; return -1; } if (!verify_magic()){ printf("Garbage found at %lu\n", (unsigned long)head_offset); head_offset+=4; return next(flag); } if (ntohs(head.flags) & flag) return next(flag); return 0; } void db::rename(enum pki_type type, QString name, QString n) { int ret; first(); if (find(type, n) == 0) { throw errorEx(QObject::tr("DB: Rename: '%1' already in use").arg(n)); } first(); if (find(type, name) != 0) { throw errorEx(QObject::tr("DB: Entry to rename not found: %1").arg(name)); } strncpy(head.name, n.toUtf8(), NAMELEN); head.name[NAMELEN-1] = '\0'; file.seek(head_offset); ret = file.write((char*)&head, sizeof(head)); if (ret < 0) { fileIOerr("write"); } if (ret != sizeof(head)) { throw errorEx(QObject::tr("DB: Write error %1 - %2" ).arg(ret).arg(sizeof(head))); } } QString db::uniq_name(QString s, QList<enum pki_type> types) { int i; QString myname; QStringList sl; bool ok; s = s.left(NAMELEN-6); sl = s.split("_"); sl.last().toUInt(&ok, 10); if (ok && (sl.count() > 1)) { sl.removeLast(); s = sl.join("_"); } for (i=1, myname = s; ; i++) { bool found = false; foreach (enum pki_type type, types) { first(); if (find(type, myname) == 0) { myname = s + QString("_%1").arg(i); found = true; break; } } if (!found) break; } return myname; } int db::add(const unsigned char *p, int len, int ver, enum pki_type type, QString name) { db_header_t db; init_header(&db, ver, len, type, name); file.seek(file.size()); if (file.write((char*)&db, sizeof(db)) != sizeof(db)) { fileIOerr("write"); return -1; } if (file.write((char*)p, len) != len) { fileIOerr("write"); return -1; } return 0; } int db::set(const unsigned char *p, int len, int ver, enum pki_type type, QString name) { int ret; first(); ret = find(type, name); if (ret == 1) { return add(p, len, ver, type, name); } if (ret == 0) { //printf("offs = %x, len=%d, head.len=%d name = %s flags=%x\n", // head_offset, len, ntohl(head.len), head.name, // ntohs(head.flags)); file.seek(head_offset); if (len != (int)(ntohl(head.len) - sizeof(db_header_t))) { //printf("## Found and len unequal %d, %d\n", // len, ntohl(head.len) - sizeof(db_header_t)); int flags; flags = head.flags; head.flags |= htons(DBFLAG_DELETED | DBFLAG_OUTDATED); if (file.write((char*)&head, sizeof(db_header_t)) != sizeof(db_header_t)) { fileIOerr("write"); return -1; } if (add(p, len, ver, type, name) < 0) { file.seek(head_offset); head.flags = flags; ret = file.write((char*)&head, sizeof(db_header_t)); if (ret != sizeof(db_header_t)) fileIOerr("write"); } return 0; } //printf("## Overwriting entry at %u\n", head_offset); head.version = htons(ver); if (file.write((char*)&head, sizeof(db_header_t)) != sizeof(db_header_t)) { fileIOerr("write"); return -1; } if (file.write((char*)p, len) != len) { fileIOerr("write"); return -1; } } return 0; } unsigned char *db::load(db_header_t *u_header) { uint32_t size; unsigned ret; unsigned char *data; if (eof()) return NULL; size = ntohl(head.len) - sizeof(db_header_t); data = (unsigned char *)malloc(size); file.seek(head_offset + sizeof(db_header_t)); ret = file.read((char*)data, size); if (ret == size) { if (u_header) convert_header(u_header); return data; } else { free(data); fileIOerr("read"); return NULL; } } bool db::get_header(db_header_t *u_header) { if (eof()) return false; convert_header(u_header); return true; } int db::erase(void) { if (eof()) return -1; head.flags |= htons(DBFLAG_DELETED); file.seek(head_offset); if (file.write((char*)&head, sizeof(db_header_t)) != sizeof(db_header_t)) { fileIOerr("write"); return -1; } return 0; } int db::shrink(int flags) { int ret; uint32_t offs; char buf[BUFSIZ]; QFile new_file; new_file.setFileName(name + "{new}"); if (!new_file.open(QIODevice::ReadWrite)) { fileIOerr("open"); return 1; } file.reset(); while ((ret = file.read((char*)&head, sizeof(head))) > 0) { if (!verify_magic()) return 1; head_offset = ntohl(head.len) - sizeof(head); if ((ntohs(head.flags) & flags)) { //printf("Skip Entry\n"); /* FF to the next entry */ offs = file.seek(head_offset + file.pos()); //printf("Seeking to %d\n", offs); if (head_offset == -1) break; continue; } ret = new_file.write((char*)&head, sizeof(head)); if (ret != sizeof(head)) break; offs = head_offset; while (offs) { ret = file.read((char*)buf, (offs > BUFSIZ) ? BUFSIZ : offs); if (ret<=0) break; if (new_file.write(buf, ret) != ret) break; offs -= ret; } if (offs) break; } new_file.close(); if (ret) { unlink(QString2filename(new_file.fileName())); return 1; } file.close(); return mv(new_file); } int db::mv(QFile &new_file) { #ifdef WIN32 // here we try to reimplement the simple "mv" command on unix // atomic renaming fails on WIN32 platforms and // forces us to work with temporary files :-( QString tempn = name + "{orig}"; QFile::remove(tempn); if (file.rename(tempn)) { if (new_file.rename(name)) { QFile::remove(tempn); } else { QFile::rename(tempn, name); QFile::remove(new_file.fileName()); return 1; } } return 0; #else // use the global rename() function and not the method of this class char *newfile = strdup(filename2bytearray(new_file.fileName())); check_oom(newfile); int ret = ::rename(newfile, QString2filename(name)) == -1; free(newfile); return ret; #endif } QByteArray db::intToData(uint32_t val) { uint32_t v = htonl(val); return QByteArray((char*)&v, sizeof(uint32_t)); } uint32_t db::intFromData(QByteArray &ba) { uint32_t ret; if ((unsigned)(ba.count()) < sizeof(uint32_t)) { throw errorEx(QObject::tr("Out of data")); } memcpy(&ret, ba.constData(), sizeof(uint32_t)); ba = ba.mid(sizeof(uint32_t)); return ntohl(ret); } QByteArray db::boolToData(bool val) { char c = val ? 1 : 0; return QByteArray(&c, 1); } bool db::boolFromData(QByteArray &ba) { unsigned char c; if (ba.count() < 1) throw errorEx(QObject::tr("Out of data")); c = ba.constData()[0]; ba = ba.mid(1); return c ? true : false; } QByteArray db::stringToData(const QString val) { QByteArray ba = val.toUtf8(); int idx = ba.indexOf('\0'); if (idx == -1) ba += '\0'; else ba.truncate(idx +1); return ba; } QString db::stringFromData(QByteArray &ba) { int idx = ba.indexOf('\0'); if (idx == -1) throw errorEx(QObject::tr("Error finding endmarker of string")); QString ret = QString::fromUtf8(ba.constData(), idx); ba = ba.mid(idx+1); return ret; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db.h����������������������������������������������������������������������������������0000664�0000000�0000000�00000003752�11753427512�0013702�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __XCA_DB_H #define __XCA_DB_H #include <stdint.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <QtCore/QString> #include <QtCore/QFile> #define XCA_MAGIC 0xcadb1969 #define NAMELEN 80 #define FNAMLEN 256 #define OFF_EOF ((off_t)-1) #define DBFLAG_DELETED 0x1 #define DBFLAG_OUTDATED 0x2 enum pki_type { none, asym_key, x509_req, x509, revokation, tmpl, setting, smartCard, }; typedef struct { uint32_t magic; uint32_t len; /* length of this entry */ uint16_t headver; uint16_t type; uint16_t version; uint16_t flags; char name[NAMELEN]; /* name of the entry */ } db_header_t ; class db { private: QFile file; QString name; QString errstr; int dberrno; db_header_t head; void init_header(db_header_t *db, int ver, int len, enum pki_type type, QString name); void convert_header(db_header_t *h); void fileIOerr(QString s); public: bool verify_magic(void); off_t head_offset; db(QString, QFlags<QFile::Permission> perm = QFile::ReadOwner | QFile::WriteOwner); ~db(); bool eof(); void first(int flag = DBFLAG_DELETED); int find(enum pki_type type, QString name); int next(int flag = DBFLAG_DELETED); QString uniq_name(QString s, QList<enum pki_type> types); void rename(enum pki_type type, QString name, QString n); int add(const unsigned char *p, int len, int ver, enum pki_type type, QString name); int set(const unsigned char *p, int len, int ver, enum pki_type type, QString name); unsigned char *load(db_header_t *u_header); bool get_header(db_header_t *u_header); int erase(void); int shrink(int flags); int mv(QFile &new_file); static QByteArray intToData(uint32_t val); static uint32_t intFromData(QByteArray &ba); static QByteArray boolToData(bool val); static bool boolFromData(QByteArray &ba); static QByteArray stringToData(const QString val); static QString stringFromData(QByteArray &ba); }; #endif ����������������������xca_0.9.3/lib/db_base.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000034714�11753427512�0015231�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "db_base.h" #include "func.h" #include "exception.h" #include <QtGui/QMessageBox> #include <QtGui/QListView> #include <QtGui/QClipboard> #include <QtCore/QDir> #include "widgets/MainWindow.h" #include "widgets/ImportMulti.h" db_base::db_base(QString db, MainWindow *mw) :QAbstractItemModel(NULL) { dbName = db; rootItem = newPKI(); mainwin = mw; colResizing = 0; currentIdx = QModelIndex(); class_name = "base"; allHeaders << new dbheader(HD_internal_name, true, tr("Internal name")); } db_base::~db_base() { saveHeaderState(); delete rootItem; } pki_base *db_base::newPKI(db_header_t *) { return new pki_base("rootItem"); } void db_base::createSuccess(pki_base *pki) { if (!pki) return; if (pki_base::suppress_messages) return; QMessageBox::information(mainwin, XCA_TITLE, pki->getMsg(pki_base::msg_create). arg(pki->getIntName())); } void db_base::remFromCont(QModelIndex &idx) { if (!idx.isValid()) return; pki_base *pki = static_cast<pki_base*>(idx.internalPointer()); pki_base *parent_pki = pki->getParent(); int row = pki->row(); beginRemoveRows(parent(idx), row, row); parent_pki->takeChild(pki); endRemoveRows(); emit columnsContentChanged(); } void db_base::loadContainer() { db mydb(dbName); unsigned char *p = NULL; db_header_t head; pki_base *pki; for (int i=0; i < pkitype.count(); i++) { mydb.first(); while (mydb.find(pkitype[i], QString()) == 0) { QString s; p = mydb.load(&head); if (!p) { printf("Load was empty !\n"); goto next; } pki = newPKI(&head); if (pki->getVersion() < head.version) { printf("Item[%s]: Version %d " "> known version: %d -> ignored\n", head.name, head.version, pki->getVersion() ); free(p); delete pki; goto next; } pki->setIntName(QString::fromUtf8(head.name)); try { pki->fromData(p, &head); } catch (errorEx &err) { err.appendString(pki->getIntName()); mainwin->Error(err); delete pki; pki = NULL; } free(p); if (pki) { inToCont(pki); } next: if (mydb.next()) break; } } mydb.first(); if (!mydb.find(setting, class_name + "_hdView")) { QByteArray ba; char *p; if ((p = (char *)mydb.load(&head))) { ba = QByteArray(p, head.len - sizeof(db_header_t)); free(p); } if (head.version != 5) return; try { allHeaders.fromData(ba); } catch (errorEx()) { for (int i=0; i< allHeaders.count(); i++) { allHeaders[i]->reset(); } } } emit columnsContentChanged(); return; } void db_base::saveHeaderState() { QByteArray ba; if (dbName.isEmpty()) return; ba = allHeaders.toData(); db mydb(dbName); mydb.set((const unsigned char *)ba.constData(), ba.size(), 5, setting, class_name + "_hdView"); } void db_base::setVisualIndex(int i, int visualIndex) { if (colResizing) return; allHeaders[i]->visualIndex = visualIndex; } void db_base::sectionResized(int i, int, int newSize) { if (!allHeaders[i]->show || newSize <= 0 || colResizing) return; allHeaders[i]->size = newSize; } bool db_base::fixedHeaderSize(int sect) { return allHeaders[sect]->size != -1; } void db_base::initHeaderView(QHeaderView *hv) { int max = allHeaders.count(); colResizeStart(); for (int i=0; i<max; i++) { allHeaders[i]->setupHeaderView(i, hv); } for (int i=0; i<max; i++) { if (allHeaders[i]->visualIndex == -1) continue; if (hv->visualIndex(i) != allHeaders[i]->visualIndex) { hv->moveSection(hv->visualIndex(i), allHeaders[i]->visualIndex); } } colResizeEnd(); } void db_base::sortIndicatorChanged(int logicalIndex, Qt::SortOrder order) { int max = allHeaders.count(); for (int i=0; i<max; i++) { allHeaders[i]->sortIndicator = -1; } allHeaders[logicalIndex]->sortIndicator = order; } void db_base::insertPKI(pki_base *pki) { QString name; db mydb(dbName); QByteArray ba = pki->toData(); if (ba.count() > 0) { name = mydb.uniq_name(pki->getIntName(), pkitype); pki->setIntName(name); mydb.add((const unsigned char*)ba.constData(), ba.count(), pki->getVersion(), pki->getType(), name); } inToCont(pki); emit columnsContentChanged(); } void db_base::delete_ask() { if (!currentIdx.isValid()) return; pki_base *pki = static_cast<pki_base*>(currentIdx.internalPointer()); if (QMessageBox::question(mainwin, XCA_TITLE, pki->getMsg(pki_base::msg_delete) .arg(pki->getIntName()), QMessageBox::Ok | QMessageBox::Cancel) != QMessageBox::Ok) return; deletePKI(); } void db_base::pem2clipboard() { long l; const char *p; QString msg; QClipboard *cb = QApplication::clipboard(); BIO *bio = BIO_new(BIO_s_mem()); if (!currentIdx.isValid()) return; pki_base *pki = static_cast<pki_base*>(currentIdx.internalPointer()); pki->pem(bio); openssl_error(); l = BIO_get_mem_data(bio, &p); msg = QString::fromUtf8(p, l); BIO_free(bio); if (cb->supportsSelection()) cb->setText(msg, QClipboard::Selection); else cb->setText(msg); } void db_base::deletePKI() { if (!currentIdx.isValid()) return; pki_base *pki = static_cast<pki_base*>(currentIdx.internalPointer()); try { try { pki->deleteFromToken(); } catch (errorEx &err) { MainWindow::Error(err); } remFromCont(currentIdx); db mydb(dbName); mydb.find(pki->getType(), pki->getIntName()); mydb.erase(); delete pki; } catch (errorEx &err) { MainWindow::Error(err); } } void db_base::updatePKI(pki_base *pki) { db mydb(dbName); QByteArray ba = pki->toData(); if (ba.count() > 0) { mydb.set((const unsigned char*)ba.constData(), ba.count(), pki->getVersion(), pki->getType(), pki->getIntName()); } } void db_base::deleteSelectedItems(XcaTreeView* view) { QModelIndexList indexes = view->getSelectedIndexes(); QModelIndex index; QString items, msg; int count = 0; pki_base *pki = NULL; if (indexes.count() == 0) return; foreach(index, indexes) { if (index.column() != 0) continue; pki = static_cast<pki_base*>(index.internalPointer()); items += "'" + pki->getIntName() + "' "; count++; } if (count == 1) msg = pki->getMsg(pki_base::msg_delete).arg(pki->getIntName()); else msg = pki->getMsg(pki_base::msg_delete_multi).arg(count). arg(items); if (QMessageBox::question(mainwin, XCA_TITLE, msg, QMessageBox::Ok | QMessageBox::Cancel) != QMessageBox::Ok) return; foreach(index, indexes) { if (index.column() != 0) continue; currentIdx = index; deletePKI(); } currentIdx = QModelIndex(); } void db_base::showSelectedItems(XcaTreeView* view) { QModelIndexList indexes = view->getSelectedIndexes(); QModelIndex index; QString items; foreach(index, indexes) { if (index.column() != 0) continue; currentIdx = index; showItem(); } currentIdx = QModelIndex(); } void db_base::storeSelectedItems(XcaTreeView* view) { QModelIndexList indexes = view->getSelectedIndexes(); QModelIndex index; QString items; foreach(index, indexes) { if (index.column() != 0) continue; try { currentIdx = index; store(); } catch (errorEx &err) { MainWindow::Error(err); } } currentIdx = QModelIndex(); } void db_base::showItem(const QModelIndex &index) { showPki(static_cast<pki_key*>(index.internalPointer())); } void db_base::showItem(const QString name) { pki_base *pki = getByName(name); if (pki) showPki(pki); } void db_base::insertChild(pki_base *parent, pki_base *child) { QModelIndex idx = QModelIndex(); if (parent == child || parent == NULL) parent = rootItem; if (parent != rootItem) idx = index(parent); beginInsertRows(idx, 0, 0); parent->insert(0,child); endInsertRows(); } void db_base::inToCont(pki_base *pki) { insertChild(rootItem, pki); } pki_base *db_base::getByName(QString desc) { FOR_ALL_pki(pki, pki_base) { if (pki->getIntName() == desc) return pki; } return NULL; } pki_base *db_base::getByReference(pki_base *refpki) { if (refpki == NULL) return NULL; FOR_ALL_pki(pki, pki_base) { if (refpki->compare(pki)) return pki; } return NULL; } QStringList db_base::getDesc() { QStringList x; x.clear(); FOR_ALL_pki(pki, pki_base) { x.append(pki->getIntName()); } return x; } pki_base *db_base::insert(pki_base *item) { insertPKI(item); return item; } void db_base::writeAll(void) { } void db_base::dump(QString dirname) { dirname += QDir::separator() + class_name; QDir d(dirname); if (!d.exists() && !d.mkdir(dirname)) { throw errorEx("Could not create directory '" + dirname + "'"); } try { FOR_ALL_pki(pki, pki_base) { pki->writeDefault(dirname); } } catch (errorEx &err) { mainwin->Error(err); } } QModelIndex db_base::index(int row, int column, const QModelIndex &parent) const { pki_base *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<pki_base*>(parent.internalPointer()); pki_base *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } QModelIndex db_base::index(pki_base *pki) const { return createIndex(pki->row(), 0, pki); } QModelIndex db_base::parent(const QModelIndex &idx) const { if (!idx.isValid()) return QModelIndex(); pki_base *childItem = static_cast<pki_base*>(idx.internalPointer()); pki_base *parentItem = childItem->getParent(); #if 0 if (parentItem == NULL) { printf("Item: (%s) %s: parent == NULL\n", childItem->className(), CCHAR(childItem->getIntName())); } printf("Parent of:%s(%p) %p %p\n", CCHAR(childItem->getIntName()), childItem, parentItem, rootItem); #endif if (parentItem == rootItem || parentItem == NULL) return QModelIndex(); return index(parentItem); } int db_base::rowCount(const QModelIndex &parent) const { pki_base *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<pki_base*>(parent.internalPointer()); //printf("%s rows=%d\n", CCHAR(parentItem->getIntName()), parentItem->childCount()); return parentItem->childCount(); } int db_base::columnCount(const QModelIndex &) const { return allHeaders.count(); } QVariant db_base::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); dbheader *hd = allHeaders[index.column()]; pki_base *item = static_cast<pki_base*>(index.internalPointer()); switch (role) { case Qt::EditRole: case Qt::DisplayRole: return item->column_data(hd); case Qt::DecorationRole: return item->getIcon(hd); case Qt::TextAlignmentRole: return hd->isNumeric() ? Qt::AlignRight : Qt::AlignLeft; case Qt::FontRole: { if (hd->isNumeric()) return QVariant(QFont("Monospace")); return QVariant(QApplication::font()); } case Qt::BackgroundRole: { return item->bg_color(hd); } } return QVariant(); } #if 0 static QString getHeaderViewInfo(int sect, dbheader *h) { return QString("H[%1] Show:%2%3 Size:%4 VI:%5 Indi:%6"). arg(sect).arg(h->show).arg(h->showDefault).arg(h->size). arg(h->visualIndex).arg(h->sortIndicator); } #endif QVariant db_base::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal) { switch (role) { case Qt::DisplayRole: return QVariant(allHeaders[section]->name); case Qt::ToolTipRole: #if 0 return getHeaderViewInfo(section, allHeaders[section]); #endif return QVariant(allHeaders[section]->tooltip); } } return QVariant(); } Qt::ItemFlags db_base::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::ItemIsEnabled; if (index.column() == 0) return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; else return QAbstractItemModel::flags(index); } bool db_base::setData(const QModelIndex &index, const QVariant &value, int role) { QString on, nn; pki_base *item; if (index.isValid() && role == Qt::EditRole) { nn = value.toString(); item = static_cast<pki_base*>(index.internalPointer()); on = item->getIntName(); if (nn == on) return true; db mydb(dbName); try { mydb.rename(item->getType(), on, nn); item->setIntName(nn); emit dataChanged(index, index); return true; } catch (errorEx &err) { mainwin->Error(err); } } return false; } void db_base::load_default(load_base &load) { QString s; QStringList slist = QFileDialog::getOpenFileNames(mainwin, load.caption, mainwin->getPath(), load.filter); if (!slist.count()) return; QString fn = slist[0]; mainwin->setPath(fn.mid(0, fn.lastIndexOf("/"))); ImportMulti *dlgi = new ImportMulti(mainwin); foreach(s, slist) { pki_base *item = NULL; try { item = load.loadItem(s); dlgi->addItem(item); } catch (errorEx &err) { MainWindow::Error(err); delete item; } } dlgi->execute(); delete dlgi; } void db_base::edit() { if (!currentIdx.isValid()) return; emit editItem(currentIdx); } void db_base::showItem() { if (!currentIdx.isValid()) return; showItem(currentIdx); } bool db_base::columnHidden(int col) const { return !allHeaders[col]->show; } void db_base::columnResetDefaults() { dbheader *hd; foreach(hd, allHeaders) { hd->reset(); } emit resetHeader(); } bool db_base::isNumericCol(int col) const { return allHeaders[col]->isNumeric(); } void db_base::showHeaderMenu(QContextMenuEvent *e, int sect) { contextMenu(e, NULL, sect); } void db_base::contextMenu(QContextMenuEvent *e, QMenu *parent, int) { int shown = 0; QMenu *menu, *dn, *v3ext, *current; QAction *a, *sep; dbheader *hd; menu = new QMenu(mainwin); dn = new QMenu(tr("Subject entries")); v3ext = new QMenu(tr("X509v3 Extensions")); menu->addAction(tr("Reset"), this, SLOT(columnResetDefaults())); sep = menu->addSeparator(); foreach(hd, allHeaders) { switch (hd->type) { case dbheader::hd_x509name: current = dn; break; case dbheader::hd_v3ext: current = v3ext; break; default: current = menu; break; } a = current->addAction(hd->name); a->setCheckable(true); a->setChecked(hd->show); if (!hd->tooltip.isEmpty()) a->setToolTip(hd->tooltip); hd->action = a; } if (!dn->isEmpty() || !v3ext->isEmpty()) menu->insertSeparator(sep); if (!dn->isEmpty()) menu->insertMenu(sep, dn); if (!v3ext->isEmpty()) menu->insertMenu(sep, v3ext); if (parent) { parent->addAction(tr("Paste PEM data"), mainwin, SLOT(pastePem())); parent->addMenu(menu)->setText(tr("Columns")); parent->exec(e->globalPos()); } else { menu->exec(e->globalPos()); } foreach(hd, allHeaders) { if (hd->action) hd->show = hd->action->isChecked(); shown += hd->show ? 1 : 0; hd->action = NULL; } if (!shown) allHeaders[0]->show = true; delete menu; if (parent) delete parent; emit updateHeader(); } ����������������������������������������������������xca_0.9.3/lib/db_base.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000006724�11753427512�0014676�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __DB_BASE_H #define __DB_BASE_H #include "db.h" #include "base.h" #include "load_obj.h" #include <QtGui/QListView> #include <QtGui/QPixmap> #include <QtGui/QContextMenuEvent> #include <QtCore/QStringList> #include <QtCore/QAbstractItemModel> #include "pki_base.h" //#include "widgets/XcaTreeView.h" #define FOR_ALL_pki(pki, pki_type) \ for(pki_type *pki=(pki_type*)rootItem->iterate(); pki; pki=(pki_type*)pki->iterate()) class MainWindow; class QContextMenuEvent; class XcaTreeView; class NewX509; class db_base: public QAbstractItemModel { Q_OBJECT protected: QString dbName; QModelIndex currentIdx; void _writePKI(pki_base *pki, bool overwrite); void _removePKI(pki_base *pki ); void removeItem(QString k); QList<enum pki_type> pkitype; MainWindow *mainwin; QString class_name; dbheaderList allHeaders; int colResizing; public: pki_base *rootItem; db_base(QString db, MainWindow *mw); virtual ~db_base(); virtual pki_base *newPKI(db_header_t *head = NULL); virtual void insertPKI(pki_base *pki); virtual void updatePKI(pki_base *pki); pki_base *getByName(QString desc); pki_base *getByReference(pki_base *refpki); pki_base *getByPtr(void *); virtual void loadContainer(); QStringList getDesc(); virtual pki_base* insert(pki_base *item); virtual void inToCont(pki_base *pki); virtual void remFromCont(QModelIndex &idx); QPixmap *loadImg(const char *name); void writeAll(void); void dump(QString dirname); virtual void showContextMenu(QContextMenuEvent * , const QModelIndex &) {}; QModelIndex index(int row, int column, const QModelIndex &parent)const; QModelIndex index(pki_base *pki)const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role); void deleteSelectedItems(XcaTreeView* view); void showSelectedItems(XcaTreeView *view); void storeSelectedItems(XcaTreeView *view); void load_default(load_base &load); void insertChild(pki_base *parent, pki_base *child); void createSuccess(pki_base *pki); void showHeaderMenu(QContextMenuEvent *e, int sect); bool columnHidden(int col) const; bool isNumericCol(int col) const; void saveHeaderState(); void contextMenu(QContextMenuEvent *e, QMenu *parent = NULL, int sect = -1); void initHeaderView(QHeaderView *hv); void setVisualIndex(int i, int visualIndex); bool fixedHeaderSize(int sect); void colResizeStart() { colResizing++; } void colResizeEnd() { colResizing--; } public slots: void deletePKI(); void delete_ask(); void edit(); void columnResetDefaults(); virtual void showItem(); virtual void store(){}; virtual void showPki(pki_base *) {}; virtual void showItem(const QModelIndex &index); virtual void showItem(const QString keyname); void sectionResized(int i, int, int newSize); void sortIndicatorChanged(int logicalIndex, Qt::SortOrder order); void pem2clipboard(); signals: void connNewX509(NewX509 *dlg); void resetHeader(); void updateHeader(); void columnsContentChanged(); void editItem(const QModelIndex &); }; #endif ��������������������������������������������xca_0.9.3/lib/db_crl.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000012462�11753427512�0015073�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "db_crl.h" #include "exception.h" #include "widgets/MainWindow.h" #include "widgets/CrlDetail.h" #include "widgets/NewCrl.h" #include <QtGui/QMessageBox> #include <QtGui/QContextMenuEvent> #include "ui_NewCrl.h" db_crl::db_crl(QString db, MainWindow *mw) :db_x509name(db,mw) { allHeaders << new dbheader(HD_crl_signer, true, tr("Signer"), tr("Internal name of the signer")) << new dbheader(HD_crl_revoked, true, tr("No. revoked"), tr("Number of revoked certificates")) << new dbheader(HD_crl_lastUpdate, false,tr("Last update")) << new dbheader(HD_crl_nextUpdate, true, tr("Next update")) << new dbheader(HD_crl_crlnumber, false,tr("CRL number")); class_name = "crls"; pkitype << revokation; loadContainer(); } pki_base *db_crl::newPKI(db_header_t *) { return new pki_crl(); } void db_crl::load() { load_crl l; load_default(l); } void db_crl::revokeCerts(pki_crl *crl) { int numc, i; if (!mainwin->certs) return; x509rev revok; pki_x509 *signer = crl->getIssuer(); if (!signer) return; numc = crl->numRev(); for (i=0; i<numc; i++) { revok = crl->getRev(i); mainwin->certs->revokeCert(revok, signer); } } void db_crl::removeSigner(pki_base *signer) { FOR_ALL_pki(crl, pki_crl) { if (crl->getIssuer() == signer) crl->setIssuer(NULL); } } void db_crl::inToCont(pki_base *pki) { pki_crl *crl = (pki_crl *)pki; if (crl->getIssuer() == NULL) { pki_x509 *iss = NULL, *last = NULL; x509name issname = crl->getSubject(); while ((iss = mainwin->certs->getBySubject(issname, last)) != NULL) { pki_key *key = iss->getPubKey(); if (key) { if (crl->verify(key)) { delete key; break; } delete key; } last = iss; } crl->setIssuer(iss); } revokeCerts(crl); db_base::inToCont(pki); } pki_base *db_crl::insert(pki_base *item) { pki_crl *crl = (pki_crl *)item; pki_crl *oldcrl = (pki_crl *)getByReference(crl); if (oldcrl) { QMessageBox::information(mainwin, XCA_TITLE, tr("The revokation list already exists in the database as:\n'%1'\nand so it was not imported").arg(oldcrl->getIntName())); delete(crl); return NULL; } insertPKI(crl); return crl; } void db_crl::showPki(pki_base *pki) { pki_crl *crl = (pki_crl *)pki; CrlDetail *dlg; dlg = new CrlDetail(mainwin); if (dlg) { dlg->setCrl(crl); connect( dlg->issuerIntName, SIGNAL( doubleClicked(QString) ), mainwin->certs, SLOT( showItem(QString) )); dlg->exec(); delete dlg; } } void db_crl::store() { if (!currentIdx.isValid()) return; pki_crl *crl = static_cast<pki_crl*>(currentIdx.internalPointer()); if (!crl) return; QString fn = mainwin->getPath() + QDir::separator() + crl->getUnderlinedName() + ".pem"; ExportDer *dlg = new ExportDer(mainwin, fn, tr("CRL ( *.pem *.der *.crl )")); dlg->image->setPixmap(*MainWindow::revImg); dlg->label->setText(tr("Revokation list export")); int dlgret = dlg->exec(); if (!dlgret) { delete dlg; return; } QString fname = dlg->filename->text(); bool pem = dlg->exportFormat->currentIndex() == 0 ? true : false; delete dlg; if (fname == "") { return; } mainwin->setPath(fname.mid(0, fname.lastIndexOf(QRegExp("[/\\\\]")) )); try { crl->writeCrl(fname, pem); } catch (errorEx &err) { mainwin->Error(err); } } pki_crl *db_crl::newItem(pki_x509 *cert) { if (!cert) return NULL; pki_crl *crl = NULL; NewCrl *dlg = new NewCrl(mainwin, cert); if (!dlg->exec()) { delete dlg; return NULL; } try { x509v3ext e; X509V3_CTX ext_ctx; X509V3_set_ctx(&ext_ctx, cert->getCert(), NULL, NULL, NULL, 0); X509V3_set_ctx_nodb(&ext_ctx); crl = new pki_crl(); crl->createCrl(cert->getIntName(), cert); QList<pki_x509*> list = mainwin->certs->getIssuedCerts(cert); bool reason = dlg->revokationReasons->isChecked(); for (int i =0; i<list.size(); i++) { if (list.at(i)->isRevoked() ) { crl->addRev(list.at(i)->getRev(reason)); } } if (dlg->authKeyId->isChecked()) { crl->addV3ext(e.create(NID_authority_key_identifier, "keyid,issuer", &ext_ctx)); } if (dlg->subAltName->isChecked()) { if (cert->hasExtension(NID_subject_alt_name)) { crl->addV3ext(e.create(NID_issuer_alt_name, "issuer:copy", &ext_ctx)); } } if (dlg->crlNumber->isChecked()) { crl->setCrlNumber(cert->getIncCrlNumber()); } crl->setLastUpdate(dlg->lastUpdate->getDate()); crl->setNextUpdate(dlg->nextUpdate->getDate()); crl->sign(cert->getRefKey(), dlg->hashAlgo->currentHash()); cert->setCrlExpiry(dlg->nextUpdate->getDate()); mainwin->certs->updatePKI(cert); createSuccess(insert(crl)); } catch (errorEx &err) { MainWindow::Error(err); if (crl) delete crl; crl = NULL; } delete dlg; return crl; } void db_crl::showContextMenu(QContextMenuEvent *e, const QModelIndex &index) { QMenu *menu = new QMenu(mainwin); currentIdx = index; QMenu *subExport; menu->addAction(tr("Import"), this, SLOT(load())); if (index != QModelIndex()) { menu->addAction(tr("Rename"), this, SLOT(edit())); subExport = menu->addMenu(tr("Export")); subExport->addAction(tr("Clipboard"), this, SLOT(pem2clipboard())); subExport->addAction(tr("File"), this, SLOT(store())); menu->addAction(tr("Delete"), this, SLOT(delete_ask())); } contextMenu(e, menu); currentIdx = QModelIndex(); return; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_crl.h������������������������������������������������������������������������������0000664�0000000�0000000�00000001525�11753427512�0014536�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __DB_CRL_H #define __DB_CRL_H #include "db_x509.h" #include "pki_crl.h" #include "widgets/ExportDialog.h" #include <QtCore/QObject> #include <QtGui/QPixmap> #include <QtGui/QContextMenuEvent> class db_crl: public db_x509name { Q_OBJECT protected: QPixmap *crlicon; public: db_crl(QString db, MainWindow *mw); pki_base *newPKI(db_header_t *head = NULL); void revokeCerts(pki_crl *crl); void inToCont(pki_base *pki); pki_base *insert(pki_base *item); pki_crl *newItem(pki_x509 *cert); void showContextMenu(QContextMenuEvent *e, const QModelIndex &index); void removeSigner(pki_base *signer); public slots: void store(); void load(); void showPki(pki_base *pki); signals: void updateCertView(); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_dump.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000002457�11753427512�0015263�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "db.h" #include "exception.h" #include <stdlib.h> #include <qbytearray.h> QByteArray filename2bytearray(const QString &fname) { #ifdef WIN32 return fname.toLocal8Bit(); #else return fname.toUtf8(); #endif } QString filename2QString(const char *fname) { #ifdef WIN32 return QString::fromLocal8Bit(fname); #else return QString::fromUtf8(fname); #endif } static QByteArray fileNameEncoderFunc(const QString &fileName) { return filename2bytearray(fileName); } static QString fileNAmeDecoderFunc(const QByteArray &localFileName) { return filename2QString(localFileName.constData()); } int main(int argc, char *argv[]) { if (argc < 2) return 1; QFile::setEncodingFunction(fileNameEncoderFunc); QFile::setDecodingFunction(fileNAmeDecoderFunc); QString database = filename2QString(argv[1]); db mydb(database); unsigned char *p; db_header_t h; int i=0; char type[] = "NKRCLTSUXX"; try { mydb.first(0); while (!mydb.eof()) { p = mydb.load(&h); free(p); printf("%3d: %c V%d O:%6zd, F:%x L:%5d %s\n", i++, type[h.type], h.version, mydb.head_offset, h.flags, h.len, h.name); mydb.next(0); } } catch (errorEx &ex) { printf("Exception: '%s'\n", ex.getCString()); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_key.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000021702�11753427512�0015100�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "db_key.h" #include "pki_evp.h" #include "pki_scard.h" #include <QtGui/QDialog> #include <QtGui/QLabel> #include <QtGui/QPushButton> #include <QtGui/QMessageBox> #include <QtGui/QProgressBar> #include <QtGui/QStatusBar> #include <QtGui/QContextMenuEvent> #include "exception.h" #include "ui_NewKey.h" #include "pkcs11.h" #include "widgets/PwDialog.h" #include "widgets/ExportKey.h" #include "widgets/KeyDetail.h" #include "widgets/NewKey.h" db_key::db_key(QString db, MainWindow *mw) :db_base(db, mw) { rootItem->setIntName("[key root]"); class_name = "keys"; pkitype << asym_key << smartCard; allHeaders << new dbheader(HD_key_type, true, tr("Type")) << new dbheader(HD_key_size, true, tr("Size")) << new dbheader(HD_key_use, true, tr("Use")) << new dbheader(HD_key_passwd, true, tr("Password")); loadContainer(); } pki_base *db_key::newPKI(db_header_t *head) { if (!head || head->type == asym_key) return new pki_evp(""); return new pki_scard(""); } QStringList db_key::getPrivateDesc() { QStringList x; x.clear(); FOR_ALL_pki(pki, pki_key) if (pki->isPrivKey()) x.append(pki->getIntName()); return x; } QStringList db_key::get0KeyDesc(bool all) { QStringList x; FOR_ALL_pki(pki, pki_key) { if ((pki->getUcount() == 0) || all) x.append(pki->getIntNameWithType()); } return x; } void db_key::remFromCont(QModelIndex &idx) { db_base::remFromCont(idx); pki_base *pki = static_cast<pki_base*>(currentIdx.internalPointer()); emit delKey((pki_key *)pki); } void db_key::inToCont(pki_base *pki) { db_base::inToCont(pki); emit newKey((pki_key *)pki); } pki_base* db_key::insert(pki_base *item) { pki_key *lkey = (pki_key *)item; pki_key *oldkey; oldkey = (pki_key *)getByReference(lkey); if (oldkey != NULL) { if ((oldkey->isPrivKey() && lkey->isPrivKey()) || lkey->isPubKey()){ QMessageBox::information(mainwin, XCA_TITLE, tr("The key is already in the database as:\n'%1'\nand is not going to be imported").arg(oldkey->getIntName())); delete(lkey); return NULL; } else { QMessageBox::information(mainwin, XCA_TITLE, tr("The database already contains the public part of the imported key as\n'%1\nand will be completed by the new, private part of the key").arg(oldkey->getIntName())); lkey->setIntName(oldkey->getIntName()); currentIdx = index(oldkey->row(), 0, QModelIndex()); deletePKI(); currentIdx = QModelIndex(); } } insertPKI(lkey); return lkey; } void db_key::newItem() { newItem(""); } void db_key::newItem(QString name) { NewKey *dlg = new NewKey(qApp->activeWindow(), name); QProgressBar *bar; QStatusBar *status = mainwin->statusBar(); pki_evp *nkey = NULL; pki_scard *cardkey = NULL; pki_key *key = NULL; if (!dlg->exec()) { delete dlg; return; } int ksize = dlg->getKeysize(); if (ksize > 0) { if (ksize < 32) { QMessageBox::warning(NULL, XCA_TITLE, tr("Key size too small !")); delete dlg; return; } if (ksize < 1024 || ksize > 8192) if (QMessageBox::warning(NULL, XCA_TITLE, tr("You are sure to create a key of the size: %1 ?").arg(ksize), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { delete dlg; return; } } mainwin->repaint(); bar = new QProgressBar(); status->addPermanentWidget(bar, 1); try { if (dlg->isToken()) { key = cardkey = new pki_scard(dlg->keyDesc->text()); cardkey->generateKey_card(dlg->getKeyCardSlot(), ksize, bar); } else { key = nkey = new pki_evp(dlg->keyDesc->text()); nkey->generate(ksize, dlg->getKeytype(), bar, dlg->getKeyCurve_nid()); } key = (pki_key*)insert(key); emit keyDone(key->getIntNameWithType()); createSuccess(key); } catch (errorEx &err) { delete key; mainwin->Error(err); } status->removeWidget(bar); delete bar; delete dlg; } void db_key::load(void) { load_key l; load_default(l); } void db_key::toToken() { pki_key *key = static_cast<pki_scard*>(currentIdx.internalPointer()); if (!key || !pkcs11::loaded() || key->isToken()) return; pki_scard *card = NULL; try { pkcs11 p11; slotid slot; if (!p11.selectToken(&slot, mainwin)) return; card = new pki_scard(key->getIntName()); card->store_token(slot, key->decryptKey()); QString msg = tr("Shall the original key '%1' be replaced by the key on the token?\nThis will delete the key '%1' and make it unexportable"). arg(key->getIntName()); if (QMessageBox::question(mainwin, XCA_TITLE, msg, QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { deletePKI(); insertPKI(card); card = NULL; } } catch (errorEx &err) { mainwin->Error(err); } if (card) delete card; } void db_key::showPki(pki_base *pki) { pki_evp *key = (pki_evp *)pki; KeyDetail *dlg = new KeyDetail(mainwin); if (dlg) { dlg->setKey(key); dlg->exec(); delete dlg; } } void db_key::showContextMenu(QContextMenuEvent *e, const QModelIndex &index) { QMenu *menu = new QMenu(mainwin); currentIdx = index; pki_key *key = static_cast<pki_key*>(currentIdx.internalPointer()); menu->addAction(tr("New Key"), this, SLOT(newItem())); menu->addAction(tr("Import"), this, SLOT(load())); if (index != QModelIndex()) { menu->addAction(tr("Rename"), this, SLOT(edit())); menu->addAction(tr("Show Details"), this, SLOT(showItem())); menu->addAction(tr("Delete"), this, SLOT(delete_ask())); menu->addAction(tr("Export"), this, SLOT(store())); if (key->isPrivKey() && !key->isToken()) { switch (key->getOwnPass()) { case pki_key::ptCommon: menu->addAction(tr("Change password"), this, SLOT(setOwnPass())); break; case pki_key::ptPrivate: menu->addAction(tr("Reset password"), this, SLOT(resetOwnPass())); break; } } if (key->isToken() && pkcs11::loaded()) { menu->addAction(tr("Change PIN"), this, SLOT(changePin())); menu->addAction(tr("Init PIN with SO PIN (PUK)"), this, SLOT(initPin())); menu->addAction(tr("Change SO PIN (PUK)"), this, SLOT(changeSoPin())); } if (!key->isToken() && pkcs11::loaded()) { menu->addAction(tr("Store on Security token"), this, SLOT(toToken())); } } contextMenu(e, menu); currentIdx = QModelIndex(); return; } void db_key::store() { bool pem; const EVP_CIPHER *enc = NULL; if (!currentIdx.isValid()) return; pki_key *targetKey =static_cast<pki_evp*>(currentIdx.internalPointer()); QString fn = mainwin->getPath() + QDir::separator() + targetKey->getUnderlinedName() + ".pem"; ExportKey *dlg = new ExportKey(mainwin, fn, targetKey->isPubKey() || targetKey->isToken()); if (targetKey->isToken()) dlg->image->setPixmap(*MainWindow::scardImg); else dlg->image->setPixmap(*MainWindow::keyImg); if (!dlg->exec()) { delete dlg; return; } QString fname = dlg->filename->text(); if (fname.isEmpty()) { delete dlg; return; } mainwin->setPath(fname.mid(0, fname.lastIndexOf(QRegExp("[/\\\\]")) )); try { pem = dlg->exportFormat->currentText() == "PEM" ? true : false; if (dlg->encryptKey->isChecked()) enc = EVP_des_ede3_cbc(); if (dlg->exportPrivate->isChecked() && !targetKey->isToken()) { pki_evp *evpKey = (pki_evp *)targetKey; if (dlg->exportPkcs8->isChecked()) { evpKey->writePKCS8(fname, enc, PwDialog::pwCallback, pem); } else { evpKey->writeKey(fname, enc, PwDialog::pwCallback, pem); } } else { targetKey->writePublic(fname, pem); } } catch (errorEx &err) { mainwin->Error(err); } delete dlg; } void db_key::setOwnPass() { try { __setOwnPass(pki_key::ptPrivate); } catch (errorEx &err) { mainwin->Error(err); } } void db_key::resetOwnPass() { try { __setOwnPass(pki_key::ptCommon); } catch (errorEx &err) { mainwin->Error(err); } } void db_key::__setOwnPass(enum pki_key::passType x) { pki_evp *targetKey; if (!currentIdx.isValid()) return; targetKey = static_cast<pki_evp*>(currentIdx.internalPointer()); if (targetKey->isToken()) { throw errorEx(tr("Tried to change password of a token")); } targetKey->setOwnPass(x); updatePKI(targetKey); } void db_key::changePin() { pki_scard *scard; if (!currentIdx.isValid()) return; scard = static_cast<pki_scard*>(currentIdx.internalPointer()); try { if (!scard->isToken()) { throw errorEx(tr("Tried to change PIN of a key")); } scard->changePin(); } catch (errorEx &err) { mainwin->Error(err); } } void db_key::initPin() { pki_scard *scard; if (!currentIdx.isValid()) return; scard = static_cast<pki_scard*>(currentIdx.internalPointer()); try { if (!scard->isToken()) { throw errorEx(tr("Tried to init PIN of a key")); } scard->initPin(); } catch (errorEx &err) { mainwin->Error(err); } } void db_key::changeSoPin() { pki_scard *scard; if (!currentIdx.isValid()) return; scard = static_cast<pki_scard*>(currentIdx.internalPointer()); try { if (!scard->isToken()) { throw errorEx(tr("Tried to change SO PIN of a key")); } scard->changeSoPin(); } catch (errorEx &err) { mainwin->Error(err); } } ��������������������������������������������������������������xca_0.9.3/lib/db_key.h������������������������������������������������������������������������������0000664�0000000�0000000�00000002161�11753427512�0014543�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __DB_KEY_H #define __DB_KEY_H #include "db_base.h" #include "pki_key.h" #include <QtCore/QStringList> #include <QtCore/QObject> class MainWindow; class QModelIndex; class QContextMenuEvent; class db_key: public db_base { Q_OBJECT private: void __setOwnPass(enum pki_key::passType); public: db_key(QString db, MainWindow *mw); QStringList getPrivateDesc(); QStringList get0KeyDesc(bool all = false); pki_base *newPKI(db_header_t *head = NULL); void inToCont(pki_base *pki); void remFromCont(QModelIndex &idx); pki_base* insert(pki_base *item); void writeAll(); void showContextMenu(QContextMenuEvent * e, const QModelIndex &index); public slots: void newItem(); void newItem(QString name); void load(); void store(); void showPki(pki_base *pki); void setOwnPass(); void resetOwnPass(); void changePin(); void initPin(); void changeSoPin(); void toToken(); signals: void delKey(pki_key *delkey); void newKey(pki_key *newkey); void keyDone(QString name); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_temp.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000012412�11753427512�0015253�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "db_temp.h" #include "func.h" #include <widgets/NewX509.h> #include <widgets/MainWindow.h> #include <QtGui/QFileDialog> #include <QtCore/QDir> #include <QtGui/QContextMenuEvent> #include <QtGui/QAction> #include <QtGui/QInputDialog> #include <QtGui/QMessageBox> db_temp::db_temp(QString DBfile, MainWindow *mw) :db_x509name(DBfile, mw) { allHeaders << new dbheader(HD_temp_type, true, tr("Type")); class_name = "templates"; pkitype << tmpl; loadContainer(); predefs = newPKI(); QDir dir; if (!dir.cd(getPrefix())) return; dir.setFilter(QDir::Files | QDir::NoSymLinks); QFileInfoList list = dir.entryInfoList(); load_temp l; pki_base *tmpl; for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QString name = getPrefix() + QDir::separator() + fileInfo.fileName(); if (!name.endsWith(".xca", Qt::CaseInsensitive)) continue; try { tmpl = l.loadItem(name); if (tmpl) predefs->append(tmpl); } catch(errorEx &err) { QMessageBox::warning(mainwin, tr(XCA_TITLE), tr("Bad template: %1").arg(name)); } } } db_temp::~db_temp() { delete predefs; } pki_base *db_temp::newPKI(db_header_t *) { return new pki_temp(""); } QStringList db_temp::getDescPredefs() { QStringList x; x.clear(); for(pki_temp *pki=(pki_temp*)predefs->iterate(); pki; pki=(pki_temp*)pki->iterate()) { x.append(QString("[default] ") + pki->getIntName()); } x += getDesc(); return x; } pki_base *db_temp::getByName(QString desc) { if (!desc.startsWith("[default] ")) return db_base::getByName(desc); desc.remove(0, 10); // "[default] " for(pki_temp *pki=(pki_temp*)predefs->iterate(); pki; pki=(pki_temp*)pki->iterate()) { if (pki->getIntName() == desc) return pki; } return NULL; } bool db_temp::runTempDlg(pki_temp *temp) { NewX509 *dlg = new NewX509(mainwin); emit connNewX509(dlg); dlg->setTemp(temp); dlg->fromTemplate(temp); if (!dlg->exec()) { delete dlg; return false; } dlg->toTemplate(temp); delete dlg; return true; } void db_temp::newItem() { pki_temp *temp = NULL; QStringList sl; QString type; bool ok; int i, len; len = predefs->childCount(); sl << tr("Nothing"); for (i=0; i<len; i++) { sl << predefs->child(i)->getIntName(); } type = QInputDialog::getItem(mainwin, tr(XCA_TITLE), tr("Preset Template values"), sl, 0, false, &ok, 0 ); if (ok) { if (type == sl[0]) { temp = new pki_temp(""); } else { for (i=0; i<len; i++) { pki_temp *t = (pki_temp *)predefs->child(i); if (type == t->getIntName()) { temp = new pki_temp(t); break; } } } if (!temp) return; temp->setIntName("--"); if (runTempDlg(temp)) { insertPKI(temp); createSuccess(temp); return; } } delete temp; } void db_temp::changeTemp() { if (!currentIdx.isValid()) return; pki_temp *temp = static_cast<pki_temp*>(currentIdx.internalPointer()); alterTemp(temp); } void db_temp::duplicateTemp() { if (!currentIdx.isValid()) return; pki_temp *temp = static_cast<pki_temp*>(currentIdx.internalPointer()); pki_temp *newtemp = new pki_temp(temp); newtemp->setIntName(newtemp->getIntName() + " " + tr("copy")); insertPKI(newtemp); } bool db_temp::alterTemp(pki_temp *temp) { if (!runTempDlg(temp)) return false; updatePKI(temp); return true; } void db_temp::showPki(pki_base *pki) { alterTemp((pki_temp *)pki); } void db_temp::load() { load_temp l; load_default(l); } void db_temp::store() { if (!currentIdx.isValid()) return; pki_temp *temp = static_cast<pki_temp*>(currentIdx.internalPointer()); QString fn = mainwin->getPath() + QDir::separator() + temp->getUnderlinedName() + ".xca"; QString s = QFileDialog::getSaveFileName(mainwin, tr("Save template as"), fn, tr("XCA templates ( *.xca);; All files ( * )")); if (s.isEmpty()) return; s = QDir::convertSeparators(s); mainwin->setPath(s.mid(0, s.lastIndexOf(QRegExp("[/\\\\]")) )); try { temp->writeTemp(s); } catch (errorEx &err) { MainWindow::Error(err); } } void db_temp::certFromTemp() { if (!currentIdx.isValid()) return; pki_temp *temp = static_cast<pki_temp*>(currentIdx.internalPointer()); emit newCert(temp); } void db_temp::reqFromTemp() { if (!currentIdx.isValid()) return; pki_temp *temp = static_cast<pki_temp*>(currentIdx.internalPointer()); emit newReq(temp); } void db_temp::alterTemp() { if (!currentIdx.isValid()) return; pki_temp *temp = static_cast<pki_temp*>(currentIdx.internalPointer()); alterTemp(temp); } void db_temp::showContextMenu(QContextMenuEvent *e, const QModelIndex &index) { QMenu *menu = new QMenu(mainwin); currentIdx = index; menu->addAction(tr("New Template"), this, SLOT(newItem())); menu->addAction(tr("Import"), this, SLOT(load())); if (index != QModelIndex()) { menu->addAction(tr("Rename"), this, SLOT(edit())); menu->addAction(tr("Export"), this, SLOT(store())); menu->addAction(tr("Change"), this, SLOT(alterTemp())); menu->addAction(tr("Delete"), this, SLOT(delete_ask())); menu->addAction(tr("Duplicate"), this, SLOT(duplicateTemp())); menu->addAction(tr("Create certificate"), this, SLOT(certFromTemp())); menu->addAction(tr("Create request"), this, SLOT(reqFromTemp())); } contextMenu(e, menu); currentIdx = QModelIndex(); return; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_temp.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000001725�11753427512�0014725�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __DB_TEMP_H #define __DB_TEMP_H #include "db_base.h" #include "pki_temp.h" #include "db_x509super.h" #include <QtCore/QObject> #include <QtGui/QPixmap> class Mainwin; class db_temp: public db_x509name { Q_OBJECT protected: QPixmap *keyicon; pki_base *predefs; public: db_temp(QString DBfile, MainWindow *mw); ~db_temp(); pki_base *newPKI(db_header_t *head = NULL); bool runTempDlg(pki_temp *temp); bool alterTemp(pki_temp *temp); void showContextMenu(QContextMenuEvent *e, const QModelIndex &index); pki_base *getByName(QString desc); QStringList getDescPredefs(); public slots: void newItem(); void changeTemp(); void showPki(pki_base *pki); void load(); void store(); void certFromTemp(); void reqFromTemp(); void alterTemp(); void duplicateTemp(); signals: void newReq(pki_temp *); void newCert(pki_temp *); }; #endif �������������������������������������������xca_0.9.3/lib/db_token.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000001275�11753427512�0015433�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #include "db_token.h" #include "exception.h" #include "widgets/MainWindow.h" db_token::db_token(QString db, MainWindow *mw) :db_base(db, mw) { class_name = "manageTokens"; } bool db_token::setData(const QModelIndex &index, const QVariant &value, int role) { QString on, nn; pki_base *item; if (index.isValid() && role == Qt::EditRole) { nn = value.toString(); item = static_cast<pki_base*>(index.internalPointer()); on = item->getIntName(); if (on == nn) return true; try { if (item->renameOnToken(slot, nn)) { item->setIntName(nn); emit dataChanged(index, index); return true; } } catch (errorEx &err) { mainwin->Error(err); } } return false; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_token.h����������������������������������������������������������������������������0000664�0000000�0000000�00000001017�11753427512�0015072�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __DB_TOKEN_H #define __DB_TOKEN_H #include <QtCore/QObject> #include <QtGui/QPixmap> #include <QtCore/QEvent> #include "pkcs11_lib.h" #include "db_base.h" class db_token: public db_base { Q_OBJECT private: slotid slot; public: db_token(QString db, MainWindow *mw); bool setData(const QModelIndex &index, const QVariant &value, int role); void setSlot(slotid s) { slot = s; } }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_x509.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000066151�11753427512�0015024�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "db_x509.h" #include "pki_pkcs12.h" #include "pki_pkcs7.h" #include "pki_evp.h" #include "pki_scard.h" #include "pass_info.h" #include "widgets/CertDetail.h" #include "widgets/CertExtend.h" #include "widgets/ExportDialog.h" #include "widgets/MainWindow.h" #include "widgets/PwDialog.h" #include "ui_TrustState.h" #include "ui_CaProperties.h" #include "ui_About.h" #include "ui_Revoke.h" #include <QtGui/QMessageBox> #include <QtGui/QContextMenuEvent> #include <QtGui/QAction> bool db_x509::treeview = true; db_x509::db_x509(QString DBfile, MainWindow *mw) :db_x509super(DBfile, mw) { rootItem->setIntName("[x509 root]"); allHeaders << new dbheader(HD_cert_ca, true, tr("CA"), tr("reflects the basic Constraints extension")) << new dbheader(HD_cert_serial, true, tr("Serial")) << new dbheader(HD_cert_md5fp, false,tr("md5 fingerprint")) << new dbheader(HD_cert_sha1fp, false,tr("sha1 fingerprint")) << new dbheader(HD_cert_notBefore, false,tr("Start date"), tr("not Before")) << new dbheader(HD_cert_notAfter, true, tr("Expiry date"), tr("not After")) << new dbheader(HD_cert_trust, false,tr("Trust state")) << new dbheader(HD_cert_revokation,true, tr("Revocation")); class_name = "certificates"; pkitype << x509; loadContainer(); } pki_base *db_x509::newPKI(db_header_t *) { return new pki_x509(); } pki_x509 *db_x509::findSigner(pki_x509 *client) { pki_x509 *signer; if ((signer = client->getSigner()) != NULL) return signer; // first check for self-signed if (client->verify(client)) { return client; } FOR_ALL_pki(pki, pki_x509) { if (client->verify(pki)) { return pki; } } return NULL; } QStringList db_x509::getPrivateDesc() { QStringList x; FOR_ALL_pki(pki, pki_x509) if (pki->getRefKey()) x.append(pki->getIntName()); return x; } QStringList db_x509::getSignerDesc() { QStringList x; FOR_ALL_pki(pki, pki_x509) if (pki->canSign()) x.append(pki->getIntName()); return x; } void db_x509::remFromCont(QModelIndex &idx) { int row; pki_base *pki = static_cast<pki_base*>(currentIdx.internalPointer()); pki_base *parent_pki = pki->getParent(); row = pki->row(); pki_x509 *child; pki_base *new_parent; QModelIndex new_idx; beginRemoveRows(parent(idx), row, row); parent_pki->takeChild(pki); endRemoveRows(); while (pki->childCount()) { child = (pki_x509*)pki->childItems.takeFirst(); child->delSigner((pki_x509*)pki); new_parent = findSigner(child); insertChild(new_parent, child); } mainwin->crls->removeSigner(pki); pki_key *pub = ((pki_x509*)pki)->getPubKey(); if (pub) { if (mainwin->certs->findByPubKey(pub).count() == 0) { QList<pki_x509super *> reqs; reqs = mainwin->reqs->findByPubKey(pub); foreach(pki_x509super *r, reqs) ((pki_x509req*)r)->setDone(false); } delete pub; } return; } void db_x509::changeView() { pki_base *temproot; int rows = rowCount(QModelIndex()); if (!rows) return; temproot = new pki_base(); mainwin->certView->hide(); mainwin->certView->setModel(NULL); beginRemoveRows(QModelIndex(), 0, rows -1); pki_base *pki = rootItem; pki_base *parent; while(pki->childCount()) { pki = pki->takeFirst(); while(pki != rootItem && !pki->childCount()) { parent = pki->getParent(); temproot->append(pki); pki = parent; } } endRemoveRows(); treeview = !treeview; if (treeview) mainwin->BNviewState->setText(tr("Plain View")); else mainwin->BNviewState->setText(tr("Tree View")); while ((temproot->childCount())) { pki = temproot->takeFirst(); inToCont(pki); } delete temproot; mainwin->certView->setModel(this); mainwin->certView->show(); } void db_x509::calcEffTrust() { FOR_ALL_pki(pki, pki_x509) pki->calcEffTrust(); } void db_x509::inToCont(pki_base *pki) { pki_x509 *cert = (pki_x509*)pki; cert->setParent(NULL); cert->delSigner(cert->getSigner()); findSigner(cert); pki_base *root = cert->getSigner(); if (!treeview || root == cert) root = rootItem; insertChild(root, pki); /* search for dangling certificates, which signer this is */ FOR_ALL_pki(client, pki_x509) { if (client->getSigner() == NULL) { if (client->verify(cert) && treeview ) { int row = client->row(); pki_x509 *s; /* recursive signing check */ for (s = cert; s; s = s->getSigner()) { if (s == s->getSigner()) { s = NULL; break; } if (s == client) { printf("Recursive signing: '%s' <-> '%s'\n", CCHAR(client->getIntName()), CCHAR(cert->getIntName())); break; } } if (s) continue; beginRemoveRows(QModelIndex(), row, row); rootItem->takeChild(client); endRemoveRows(); insertChild(pki, client); client = (pki_x509*)rootItem; } } } findKey(cert); pki_key *pub = cert->getPubKey(); if (pub) { QList<pki_x509super *> reqs = mainwin->reqs->findByPubKey(pub); delete pub; foreach (pki_x509super *r, reqs) { ((pki_x509req*)r)->setDone(); } } calcEffTrust(); } QList<pki_x509*> db_x509::getIssuedCerts(const pki_x509 *issuer) { QList<pki_x509*> c; c.clear(); if (!issuer) return c; FOR_ALL_pki(pki, pki_x509) { if (pki->getSigner() == issuer) c.append(pki); } return c; } pki_x509 *db_x509::getBySubject(const x509name &xname, pki_x509 *last) { bool lastfound = false; if (last == NULL) lastfound = true; FOR_ALL_pki(pki, pki_x509) { if ( pki->getSubject() == xname) { if (lastfound) { return pki; } } if (pki == last) { lastfound = true; } } return NULL; } void db_x509::revokeCert(const x509rev &revok, const pki_x509 *iss) { pki_x509 *crt = getByIssSerial(iss, revok.getSerial()); if (crt) crt->setRevoked(revok.getDate()); } pki_x509 *db_x509::getByIssSerial(const pki_x509 *issuer, const a1int &a) { if (!issuer ) return NULL; FOR_ALL_pki(pki, pki_x509) { if ((pki->getSigner() == issuer) && (a == pki->getSerial())) return pki; } return NULL; } void db_x509::writeAllCerts(const QString fname, bool onlyTrusted) { bool append = false; FOR_ALL_pki(pki, pki_x509) { if (onlyTrusted && pki->getTrust() != 2) continue; pki->writeCert(fname.toAscii(), true, append); append = true; } } QList<pki_x509*> db_x509::getCerts(bool onlyTrusted) { QList<pki_x509*> c; c.clear(); FOR_ALL_pki(pki, pki_x509) { if (onlyTrusted && pki->getTrust() != 2) continue; c.append(pki); } return c; } a1int db_x509::searchSerial(pki_x509 *signer) { // returns the highest certificate serial // of all certs with this signer (itself too) a1int sserial, myserial; if (!signer) return sserial; sserial = signer->getCaSerial(); FOR_ALL_pki(pki, pki_x509) if (pki->getSigner() == signer) { myserial = pki->getSerial(); if (sserial < myserial) { sserial = myserial; } } return sserial; } a1int db_x509::getUniqueSerial(pki_x509 *signer) { // returnes an unused unique serial a1int serial; bool dup; do { dup = false; serial = signer->getIncCaSerial(); FOR_ALL_pki(pki, pki_x509) if (pki->getSigner() == signer) { if (serial == pki->getSerial()) { dup = true; break; } } } while (dup); if (!signer->usesRandomSerial()) updatePKI(signer); return serial; } pki_base *db_x509::insert(pki_base *item) { pki_x509 *cert = (pki_x509 *)item; pki_x509 *oldcert = (pki_x509 *)getByReference(cert); if (oldcert) { QMessageBox::information(mainwin, XCA_TITLE, tr("The certificate already exists in the database as:\n'%1'\nand so it was not imported").arg(oldcert->getIntName())); delete(cert); return NULL; } cert->setCaSerial((cert->getSerial())); insertPKI(cert); a1int serial; // check the CA serial of the CA of this cert to avoid serial doubles if (cert->getSigner() != cert && cert->getSigner()) { serial = cert->getSerial(); if (cert->getSigner()->getCaSerial() < ++serial ) { cert->getSigner()->setCaSerial(serial); updatePKI(cert->getSigner()); } } // check CA serial of this cert serial = searchSerial(cert); if ( ++serial > cert->getCaSerial()) { cert->setCaSerial(serial); } updatePKI(cert); return cert; } void db_x509::load(void) { load_cert c; load_default(c); } void db_x509::loadPKCS12() { load_pkcs12 l; load_default(l); } void db_x509::loadPKCS7() { load_pkcs7 l; load_default(l); } pki_x509 *db_x509::get1SelectedCert() { QModelIndexList indexes = mainwin->certView->getSelectedIndexes(); QModelIndex index; if (indexes.count()) index = indexes[0]; if (index == QModelIndex()) return NULL; return static_cast<pki_x509*>(index.internalPointer()); } void db_x509::newItem() { NewX509 *dlg = new NewX509(mainwin); emit connNewX509(dlg); dlg->setCert(); pki_x509 *sigcert = get1SelectedCert(); dlg->defineSigner((pki_x509*)sigcert); if (dlg->exec()) { newCert(dlg); } delete dlg; } void db_x509::newCert(pki_x509req *req) { NewX509 *dlg = new NewX509(mainwin); emit connNewX509(dlg); pki_x509 *sigcert = get1SelectedCert(); dlg->setCert(); dlg->defineRequest(req); dlg->defineSigner(sigcert); if (dlg->exec()) { newCert(dlg); } delete dlg; } void db_x509::newCert(pki_temp *temp) { NewX509 *dlg = new NewX509(mainwin); emit connNewX509(dlg); dlg->setCert(); dlg->defineTemplate(temp); if (dlg->exec()) { newCert(dlg); } delete dlg; } void db_x509::newCert(NewX509 *dlg) { pki_x509 *cert = NULL; pki_x509 *signcert = NULL; pki_x509req *req = NULL; pki_key *signkey = NULL, *clientkey = NULL, *tempkey = NULL; a1int serial; x509name subject; QString intname; try { // Step 1 - Subject and key if (!dlg->fromReqCB->isChecked()) { clientkey = dlg->getSelectedKey(); if (!clientkey) return; subject = dlg->getX509name(); intname = dlg->description->text(); } else { // A PKCS#10 Request was selected req = dlg->getSelectedReq(); if (!req) return; clientkey = req->getRefKey(); if (clientkey == NULL) { clientkey = req->getPubKey(); tempkey = clientkey; } if (dlg->reqSubChange->isChecked()) subject = dlg->getX509name(); else subject = req->getSubject(); intname = req->getIntName(); } if (clientkey == NULL) throw errorEx(tr("Invalid public key")); // initially create cert cert = new pki_x509(); cert->setIntName(intname); cert->setSubject(subject); cert->setPubKey(clientkey); // Step 2 - select Signing if (dlg->foreignSignRB->isChecked()) { signcert = dlg->getSelectedSigner(); if (!signcert) return; serial = getUniqueSerial(signcert); signkey = signcert->getRefKey(); cert->setTrust(1); #ifdef WG_QA_SERIAL } else if (dlg->selfQASignRB->isChecked()){ Passwd pass; pass_info p(XCA_TITLE, tr("Please enter the new hexadecimal secret number for the QA process.")); #if 0 ui.passA->setValidator(new QRegExpValidator(QRegExp("[0-9a-fA-F]*"), ui.passA)); ui.passB->setValidator(new QRegExpValidator(QRegExp("[0-9a-fA-F]*"), ui.passB)); #endif if (PwDialog::execute(&p, &pass, true) != 1) throw errorEx(tr("The QA process has been terminated by the user.")); signcert = cert; signkey = clientkey; serial.setHex(pass); cert->setTrust(2); #endif } else { signcert = cert; signkey = clientkey; serial.setHex(dlg->serialNr->text()); cert->setTrust(2); } dlg->initCtx(cert, signcert, NULL); // if we can not sign if (! signkey || signkey->isPubKey()) { free(cert); throw errorEx(tr("The key you selected for signing is not a private one.")); } // set the issuers name cert->setIssuer(signcert->getSubject()); cert->setSerial(serial); // Step 3 - Choose the Date // Date handling cert->setNotBefore(dlg->notBefore->getDate()); a1time a; if (dlg->noWellDefinedExpDate->isChecked()) a.setUndefined(); else a = dlg->notAfter->getDate(); cert->setNotAfter(a); // STEP 4 handle extensions if (dlg->copyReqExtCB->isChecked() && dlg->fromReqCB->isChecked()) { extList el = req->getV3ext(); int m = el.count(); for (int i=0; i<m; i++) cert->addV3ext(el[i]); } // apply all extensions to the subject cert in the context dlg->getAllExt(); const EVP_MD *hashAlgo = dlg->hashAlgo->currentHash(); #ifdef WG_QA_SERIAL if (dlg->selfQASignRB->isChecked()) { // sign the request intermediately in order to finally fill // up the cert_info substructure. cert->sign(signkey, hashAlgo); // now set the QA serial. cert->setSerial(cert->hashInfo(EVP_md5())); } #endif // and finally sign the request cert->sign(signkey, hashAlgo); cert = (pki_x509*)insert(cert); createSuccess(cert); updatePKI(signcert); if (cert && clientkey->isToken()) { pki_scard *card = (pki_scard*)clientkey; if (QMessageBox::information(mainwin, XCA_TITLE, tr("Store the certificate to the key on the token '%1 (#%2)' ?"). arg(card->getCardLabel()).arg(card->getSerial()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { try { cert->store_token(false); } catch (errorEx &err) { mainwin->Error(err); } } } if (tempkey != NULL) delete(tempkey); tempkey = NULL; } catch (errorEx &err) { mainwin->Error(err); delete cert; if (tempkey != NULL) delete(tempkey); } } void db_x509::showPki(pki_base *pki) { pki_x509 *crt = (pki_x509 *)pki; CertDetail *dlg; dlg = new CertDetail(mainwin); if (dlg) { dlg->setCert(crt); connect( dlg->privKey, SIGNAL( doubleClicked(QString) ), mainwin->keys, SLOT( showItem(QString) )); connect( dlg->signature, SIGNAL( doubleClicked(QString) ), this, SLOT( showItem(QString) )); dlg->exec(); delete dlg; } } void db_x509::showContextMenu(QContextMenuEvent *e, const QModelIndex &index) { QMenu *menu = new QMenu(mainwin); QMenu *subExport, *subCa; QAction *itemReq, *itemRevoke, *itemExtend, *itemTrust, *action; QList<QAction*> scardItems; bool parentCanSign, canSign, hasScard; currentIdx = index; pki_key *privkey; pki_x509 *cert = static_cast<pki_x509*>(index.internalPointer()); menu->addAction(tr("New Certificate"), this, SLOT(newItem())); menu->addAction(tr("Import"), this, SLOT(load())); menu->addAction(tr("Import PKCS#12"), this, SLOT(loadPKCS12())); menu->addAction(tr("Import from PKCS#7"), this, SLOT(loadPKCS7())); if (index != QModelIndex()) { privkey = cert->getRefKey(); menu->addAction(tr("Rename"), this, SLOT(edit())); menu->addAction(tr("Show Details"), this, SLOT(showItem())); if (!privkey) menu->addAction(tr("Extract public Key"), this, SLOT(extractPubkey())); subExport = menu->addMenu(tr("Export")); subExport->addAction(tr("Clipboard"), this, SLOT(pem2clipboard())); subExport->addAction(tr("File"), this, SLOT(store())); itemReq = subExport->addAction(tr("Request"), this, SLOT(toRequest())); scardItems += subExport->addAction(tr("Security token"), this, SLOT(toToken())); scardItems += subExport->addAction(tr("Other token"), this, SLOT(toOtherToken())); subExport->addAction(tr("Template"), this, SLOT(toTemplate())); subExport->addAction(tr("OpenSSL config"), this, SLOT(toOpenssl())); menu->addAction(tr("Delete"), this, SLOT(delete_ask())); scardItems += menu->addAction( tr("Delete from Security token"), this, SLOT(deleteFromToken())); itemTrust = menu->addAction(tr("Trust"), this,SLOT(setTrust())); menu->addSeparator(); subCa = menu->addMenu(tr("CA")); subCa->addAction(tr("Properties"), this, SLOT(caProperties())); subCa->addAction(tr("Generate CRL"), this, SLOT(genCrl())); #if 0 QMenu *subP7 = menu->addMenu(tr("PKCS#7")); subP7->addAction(tr("Sign"), this, SLOT(signP7())); subP7->addAction(tr("Encrypt"), this, SLOT(encryptP7())); #endif menu->addSeparator(); itemExtend = menu->addAction(tr("Renewal"), this, SLOT(extendCert())); if (cert->isRevoked()) { itemRevoke = menu->addAction(tr("Unrevoke"), this, SLOT(unRevoke())); itemTrust->setEnabled(false); } else { itemRevoke = menu->addAction(tr("Revoke"), this, SLOT(revoke())); } parentCanSign = (cert->getSigner() && cert->getSigner()->canSign() && (cert->getSigner() != cert)); canSign = cert->canSign(); hasScard = pkcs11::loaded(); itemRevoke->setEnabled(parentCanSign); itemExtend->setEnabled(parentCanSign); subCa->setEnabled(canSign); itemReq->setEnabled(privkey && privkey->isPrivKey()); foreach(action, scardItems) action->setEnabled(hasScard); #if 0 subP7->setEnabled(privkey); #endif } contextMenu(e, menu); currentIdx = QModelIndex(); return; } #define P7_ONLY 0 #define P7_CHAIN 1 #define P7_TRUSTED 2 #define P7_ALL 3 void db_x509::store() { QStringList filt; bool pkcs8 = false, append; if (!currentIdx.isValid()) return; pki_x509 *crt = static_cast<pki_x509*>(currentIdx.internalPointer()); pki_x509 *oldcrt = NULL; if (!crt) return; pki_key *privkey = crt->getRefKey(); QString fn = mainwin->getPath() + QDir::separator() + crt->getUnderlinedName() + ".crt"; ExportCert *dlg = new ExportCert(mainwin, fn, (privkey && privkey->isPrivKey()) && !privkey->isToken()); dlg->image->setPixmap(*MainWindow::certImg); int dlgret = dlg->exec(); if (!dlgret) { delete dlg; return; } QString fname = dlg->filename->text(); if (fname == "") { delete dlg; return; } mainwin->setPath(fname.mid(0, fname.lastIndexOf(QRegExp("[/\\\\]")) )); try { switch (dlg->exportFormat->currentIndex()) { case 0: // PEM crt->writeCert(fname,true,false); break; case 1: // PEM with chain append = false; while(crt && crt != oldcrt) { crt->writeCert(fname, true, append); append = true; oldcrt = crt; crt = crt->getSigner(); } break; case 2: // PEM all trusted Certificates writeAllCerts(fname,true); break; case 3: // PEM all Certificates writeAllCerts(fname,false); break; case 4: // DER crt->writeCert(fname,false,false); break; case 5: // P7 lonely writePKCS7(crt,fname, P7_ONLY); break; case 6: // P7 writePKCS7(crt,fname, P7_CHAIN); break; case 7: // P7 writePKCS7(crt,fname, P7_TRUSTED); break; case 8: // P7 writePKCS7(crt,fname, P7_ALL); break; case 9: // P12 writePKCS12(crt,fname,false); break; case 10: // P12 + cert chain writePKCS12(crt,fname,true); break; case 12: // Certificate and Key in PKCS8 format pkcs8 = true; case 11: // Certificate and Key in PEM format for apache pki_evp *privkey = (pki_evp *)crt->getRefKey(); if (!privkey || privkey->isPubKey()) { QMessageBox::warning(mainwin, XCA_TITLE, tr("There was no key found for the Certificate: '%1'"). arg(crt->getIntName())); return; } if (privkey->isToken()) { QMessageBox::warning(mainwin, XCA_TITLE, tr("Not possible for a token key: '%1'"). arg(crt->getIntName())); return; } if (pkcs8) { privkey->writePKCS8(fname, NULL, NULL, true); } else { privkey->writeKey(fname, NULL, NULL, true); } crt->writeCert(fname, true, true); } } catch (errorEx &err) { MainWindow::Error(err); } delete dlg; } void db_x509::writePKCS12(pki_x509 *cert, QString s, bool chain) { QStringList filt; try { pki_evp *privkey = (pki_evp *)cert->getRefKey(); if (!privkey || privkey->isPubKey()) { QMessageBox::warning(mainwin, XCA_TITLE, tr("There was no key found for the Certificate: '%1'").arg(cert->getIntName())); return; } if (privkey->isToken()) { QMessageBox::warning(mainwin, XCA_TITLE, tr("Not possible for the token-key Certificate '%1'"). arg(cert->getIntName())); return; } if (s.isEmpty()) return; s = QDir::convertSeparators(s); pki_pkcs12 *p12 = new pki_pkcs12(cert->getIntName(), cert, privkey); pki_x509 *signer = cert->getSigner(); while ((signer != NULL ) && (signer != cert) && chain) { p12->addCaCert(signer); cert=signer; signer=signer->getSigner(); } p12->writePKCS12(s); delete p12; } catch (errorEx &err) { MainWindow::Error(err); } } void db_x509::writePKCS7(pki_x509 *cert, QString s, int type) { pki_pkcs7 *p7 = NULL; QList<pki_base> list; try { p7 = new pki_pkcs7(""); switch (type) { case P7_CHAIN: while (cert != NULL) { p7->addCert(cert); if (cert->getSigner() == cert) cert = NULL; else cert = cert->getSigner(); } break; case P7_ONLY: p7->addCert(cert); break; case P7_TRUSTED: case P7_ALL: FOR_ALL_pki(cer, pki_x509) { if ((type == P7_ALL) || (cer->getTrust() == 2)) p7->addCert(cer); } } p7->writeP7(s, false); } catch (errorEx &err) { MainWindow::Error(err); } if (p7 != NULL ) delete p7; } # if 0 void ::signP7() { QStringList filt; try { pki_x509 *cert = (pki_x509 *)getSelected(); if (!cert) return; pki_key *privkey = cert->getRefKey(); if (!privkey || privkey->isPubKey()) { QMessageBox::warning(this,tr(XCA_TITLE), tr("There was no key found for the Certificate: ") + cert->getIntName()); return; } filt.append("All Files ( * )"); QString s=""; QStringList slist; Q3FileDialog *dlg = new Q3FileDialog(this,0,true); dlg->setCaption(tr("Import Certificate signing request")); dlg->setFilters(filt); dlg->setMode( Q3FileDialog::ExistingFiles ); dlg->setDir(MainWindow::getPath()); if (dlg->exec()) { slist = dlg->selectedFiles(); MainWindow::setPath(dlg->dirPath()); } delete dlg; pki_pkcs7 * p7 = new pki_pkcs7(""); for ( QStringList::Iterator it = slist.begin(); it != slist.end(); ++it ) { s = *it; s = QDir::convertSeparators(s); p7->signFile(cert, s); p7->writeP7((s + ".p7s"), true); } delete p7; } catch (errorEx &err) { Qt::SocketError(err); } } void CertView::encryptP7() { QStringList filt; try { pki_x509 *cert = (pki_x509 *)getSelected(); if (!cert) return; pki_key *privkey = cert->getRefKey(); if (!privkey || privkey->isPubKey()) { QMessageBox::warning(this,tr(XCA_TITLE), tr("There was no key found for the Certificate: ") + cert->getIntName()) ; return; } filt.append("All Files ( * )"); QString s=""; QStringList slist; Q3FileDialog *dlg = new Q3FileDialog(this,0,true); dlg->setCaption(tr("Import Certificate signing request")); dlg->setFilters(filt); dlg->setMode( Q3FileDialog::ExistingFiles ); dlg->setDir(MainWindow::getPath()); if (dlg->exec()) { slist = dlg->selectedFiles(); MainWindow::setPath(dlg->dirPath()); } delete dlg; pki_pkcs7 * p7 = new pki_pkcs7(""); for ( QStringList::Iterator it = slist.begin(); it != slist.end(); ++it ) { s = *it; s = QDir::convertSeparators(s); p7->encryptFile(cert, s); p7->writeP7((s + ".p7m"), true); } delete p7; } catch (errorEx &err) { Qt::SocketError(err); } } #endif void db_x509::setMultiTrust(QAbstractItemView* view) { QItemSelectionModel *selectionModel = view->selectionModel(); QModelIndexList indexes = selectionModel->selectedIndexes(); QString items; foreach(currentIdx, indexes) { setTrust(); } currentIdx = QModelIndex(); } void db_x509::deleteFromToken() { if (!currentIdx.isValid()) return; pki_x509 *pki = static_cast<pki_x509*>(currentIdx.internalPointer()); try { pki->deleteFromToken(); } catch (errorEx &err) { mainwin->Error(err); } } void db_x509::setTrust() { int state, newstate = 0; Ui::TrustState ui; pki_x509 *cert = static_cast<pki_x509*>(currentIdx.internalPointer()); if (!cert) return; QDialog *dlg = new QDialog(mainwin); ui.setupUi(dlg); ui.image->setPixmap(*MainWindow::certImg); state = cert->getTrust(); if (cert->getSigner() == cert) { if (state == 1) state = 0; ui.trust1->setDisabled(true); } if (state == 0 ) ui.trust0->setChecked(true); if (state == 1 ) ui.trust1->setChecked(true); if (state == 2 ) ui.trust2->setChecked(true); ui.certName->setText(cert->getIntName()); if (dlg->exec()) { if (ui.trust0->isChecked()) newstate = 0; if (ui.trust1->isChecked()) newstate = 1; if (ui.trust2->isChecked()) newstate = 2; if (newstate!=state) { cert->setTrust(newstate); updatePKI(cert); } } delete dlg; } void db_x509::extendCert() { pki_x509 *oldcert = NULL, *signer = NULL, *newcert =NULL; pki_key *signkey = NULL; a1time time; a1int serial; CertExtend *dlg = NULL; try { oldcert = static_cast<pki_x509*>(currentIdx.internalPointer()); if (!oldcert || !(signer = oldcert->getSigner()) || !(signkey = signer->getRefKey()) || signkey->isPubKey()) return; CertExtend *dlg = new CertExtend(mainwin, signer); if (!dlg->exec()) { delete dlg; return; } newcert = new pki_x509(oldcert); serial = getUniqueSerial(signer); // change date and serial newcert->setSerial(serial); newcert->setNotBefore(dlg->notBefore->getDate()); a1time a; if (dlg->noWellDefinedExpDate->isChecked()) a.setUndefined(); else a = dlg->notAfter->getDate(); newcert->setNotAfter(a); // and finally sign the cert newcert->sign(signkey, oldcert->getDigest()); newcert = (pki_x509 *)insert(newcert); createSuccess(newcert); } catch (errorEx &err) { MainWindow::Error(err); if (newcert) delete newcert; } if (dlg) delete dlg; } void db_x509::revoke() { pki_x509 *cert = static_cast<pki_x509*>(currentIdx.internalPointer()); if (!cert) return; Ui::Revoke ui; QDialog *revoke = new QDialog(mainwin, 0); ui.setupUi(revoke); ui.invalid->setNow(); ui.reason->addItems(x509rev::crlreasons()); if (revoke->exec()) { cert->setRevoked(true, ui.invalid->getDate(), ui.reason->currentText()); updatePKI(cert); } } void db_x509::unRevoke() { pki_x509 *cert = static_cast<pki_x509*>(currentIdx.internalPointer()); if (!cert) return; cert->setRevoked(false); updatePKI(cert); } void db_x509::genCrl() { pki_x509 *cert = static_cast<pki_x509*>(currentIdx.internalPointer()); mainwin->crls->newItem(cert); } void db_x509::toRequest() { pki_x509 *cert = static_cast<pki_x509*>(currentIdx.internalPointer()); if (!cert) return; try { pki_x509req *req = new pki_x509req(); check_oom(req); req->setIntName(cert->getIntName()); req->createReq(cert->getRefKey(), cert->getSubject(), cert->getRefKey()->getDefaultMD(), cert->getV3ext()); createSuccess(mainwin->reqs->insert(req)); } catch (errorEx &err) { mainwin->Error(err); } } void db_x509::myToToken(bool alwaysSelect) { pki_x509 *cert = static_cast<pki_x509*>(currentIdx.internalPointer()); if (!cert) return; try { cert->store_token(alwaysSelect); } catch (errorEx &err) { mainwin->Error(err); } } void db_x509::toToken() { myToToken(false); } void db_x509::toOtherToken() { myToToken(true); } void db_x509::caProperties() { Ui::CaProperties ui; int i; pki_x509 *cert = static_cast<pki_x509*>(currentIdx.internalPointer()); if (!cert) return; QDialog *dlg = new QDialog(mainwin); ui.setupUi(dlg); ui.serial->setText(cert->getCaSerial().toHex()); ui.serial->setDisabled(cert->usesRandomSerial()); ui.randomSerial->setChecked(cert->usesRandomSerial()); ui.days->setSuffix(tr(" days")); ui.days->setMaximum(1000000); ui.days->setValue(cert->getCrlDays()); ui.image->setPixmap(*MainWindow::certImg); QString templ = cert->getTemplate(); QStringList tempList = mainwin->temps->getDesc(); for (i=0; i<tempList.count(); i++) { if (tempList[i] == templ) break; } ui.temp->addItems(tempList); ui.temp->setCurrentIndex(i); ui.certName->setTitle(cert->getIntName()); if (dlg->exec()) { a1int nserial; cert->setCrlDays(ui.days->value()); nserial.setHex(ui.serial->text()); cert->setCaSerial(nserial); cert->setTemplate(ui.temp->currentText()); cert->setUseRandomSerial(ui.randomSerial->isChecked()); updatePKI(cert); } delete dlg; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_x509.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000004052�11753427512�0014461�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __DB_X509_H #define __DB_X509_H #include <QtGui/QListView> #include <QtCore/QObject> #include <QtGui/QPixmap> #include "db_key.h" #include "db_x509super.h" #include "pki_x509.h" #include "pki_crl.h" #include "pki_temp.h" class db_x509: public db_x509super { Q_OBJECT protected: QPixmap *certicon[4]; pki_x509 *get1SelectedCert(); public: static bool treeview; db_x509(QString DBfile, MainWindow *mw); pki_base *newPKI(db_header_t *head = NULL); pki_x509 *findSigner(pki_x509 *client); bool updateView(); void updateViewAll(); void updateViewPKI(pki_base *pki); void remFromCont(QModelIndex &idx); QStringList getPrivateDesc(); QStringList getSignerDesc(); void calcEffTrust(); QList<pki_x509*> getIssuedCerts(const pki_x509 *issuer); QList<pki_x509*> getCerts(bool onlyTrusted); a1int searchSerial(pki_x509 *signer); void writeAllCerts(const QString fname, bool onlyTrusted); pki_x509 *getByIssSerial(const pki_x509 *issuer, const a1int &a); pki_x509 *getBySubject(const x509name &xname, pki_x509 *last = NULL); pki_base *insert(pki_base *item); void newCert(NewX509 *dlg); void writePKCS12(pki_x509 *cert, QString s, bool chain); void writePKCS7(pki_x509 *cert, QString s, int type); void showContextMenu(QContextMenuEvent *e, const QModelIndex &index); void inToCont(pki_base *pki); void changeView(); a1int getUniqueSerial(pki_x509 *signer); void myToToken(bool alwaysSelect); public slots: void load(void); void newItem(void); void revokeCert(const x509rev &revok, const pki_x509 *issuer); void store(); void showPki(pki_base *pki); void setMultiTrust(QAbstractItemView* view); void setTrust(); void deleteFromToken(); void extendCert(); void revoke(); void unRevoke(); void genCrl(); void caProperties(); void toRequest(); void toToken(); void toOtherToken(); void newCert(pki_temp *); void newCert(pki_x509req *); void loadPKCS12(); void loadPKCS7(); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_x509req.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000011306�11753427512�0015524�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "db_x509req.h" #include "pki_x509req.h" #include "widgets/CertDetail.h" #include "widgets/MainWindow.h" #include <QtGui/QMessageBox> #include <QtGui/QContextMenuEvent> #include <QtGui/QAction> db_x509req::db_x509req(QString DBfile, MainWindow *mw) :db_x509super(DBfile, mw) { allHeaders << new dbheader(HD_req_signed, true, tr("Signed"), tr("whether the request is already signed or not")) << new dbheader(HD_req_unstr_name, false, tr("Unstructured name"), QString(OBJ_nid2ln(NID_pkcs9_unstructuredName))) << new dbheader(HD_req_chall_pass, false, tr("Challenge password"), QString(OBJ_nid2ln(NID_pkcs9_challengePassword))); class_name = "requests"; pkitype << x509_req; loadContainer(); } pki_base *db_x509req::newPKI(db_header_t *) { return new pki_x509req(); } pki_base *db_x509req::insert(pki_base *item) { pki_x509req *oldreq, *req; req = (pki_x509req *)item; oldreq = (pki_x509req *)getByReference(req); if (oldreq) { QMessageBox::information(mainwin, XCA_TITLE, tr("The certificate signing request already exists in the database as\n'%1'\nand thus was not stored").arg(oldreq->getIntName())); delete(req); return NULL; } insertPKI(req); return req; } void db_x509req::newItem(pki_temp *temp) { pki_x509req *req = NULL; NewX509 *dlg = new NewX509(mainwin); emit connNewX509(dlg); if (temp) { dlg->defineTemplate(temp); } dlg->setRequest(); if (! dlg->exec()){ delete dlg; return; } try { pki_key *key = dlg->getSelectedKey(); x509name xn = dlg->getX509name(); req = new pki_x509req(); req->setIntName(dlg->description->text()); dlg->initCtx(NULL, NULL, req); dlg->addReqAttributes(req); req->createReq(key, xn, dlg->hashAlgo->currentHash(), dlg->getAllExt()); createSuccess(insert(req)); } catch (errorEx &err) { MainWindow::Error(err); if (req) delete req; } } void db_x509req::inToCont(pki_base *pki) { pki_x509req *req = (pki_x509req *)pki; db_base::inToCont(pki); findKey(req); if (!mainwin->certs) return; pki_key *pub = req->getPubKey(); if (pub) { int certs = mainwin->certs->findByPubKey(pub).count(); delete pub; if (certs > 0) { req->setDone(); } } } void db_x509req::load(void) { load_req l; load_default(l); } void db_x509req::showPki(pki_base *pki) { pki_x509req *req = (pki_x509req *)pki; CertDetail *dlg; dlg = new CertDetail(mainwin); if (dlg) { dlg->setReq(req); connect(dlg->privKey, SIGNAL( doubleClicked(QString) ), mainwin->keys, SLOT( showItem(QString) )); dlg->exec(); delete dlg; } } void db_x509req::store() { if (!currentIdx.isValid()) return; pki_x509req *req = static_cast<pki_x509req*>(currentIdx.internalPointer()); if (!req) return; QString fn = mainwin->getPath() + QDir::separator() + req->getUnderlinedName() + ".pem"; ExportDer *dlg = new ExportDer(mainwin, fn, tr("Certificate request ( *.pem *.der *.crl )") ); dlg->image->setPixmap(*MainWindow::csrImg); dlg->label->setText(tr("Certificate request export")); int dlgret = dlg->exec(); if (!dlgret) { delete dlg; return; } QString fname = dlg->filename->text(); bool pem = dlg->exportFormat->currentIndex() == 0 ? true : false; delete dlg; if (fname == "") { return; } mainwin->setPath(fname.mid(0, fname.lastIndexOf(QRegExp("[/\\\\]")) )); try { req->writeReq(fname, pem); } catch (errorEx &err) { mainwin->Error(err); } } void db_x509req::signReq() { if (!currentIdx.isValid()) return; pki_x509req *req = static_cast<pki_x509req*>(currentIdx.internalPointer()); emit newCert(req); } void db_x509req::showContextMenu(QContextMenuEvent *e, const QModelIndex &index) { QMenu *menu = new QMenu(mainwin); QMenu *subExport; currentIdx = index; pki_x509req *req = static_cast<pki_x509req*>(index.internalPointer()); menu->addAction(tr("New Request"), this, SLOT(newItem())); menu->addAction(tr("Import"), this, SLOT(load())); if (index != QModelIndex()) { if (!req->getRefKey()) menu->addAction(tr("Extract public Key"), this, SLOT(extractPubkey())); menu->addAction(tr("Rename"), this, SLOT(edit())); menu->addAction(tr("Show Details"), this, SLOT(showItem())); menu->addAction(tr("Sign"), this, SLOT(signReq())); subExport = menu->addMenu(tr("Export")); subExport->addAction(tr("Clipboard"), this, SLOT(pem2clipboard())); subExport->addAction(tr("File"), this, SLOT(store())); subExport->addAction(tr("Template"), this, SLOT(toTemplate())); subExport->addAction(tr("OpenSSL config"), this, SLOT(toOpenssl())); menu->addAction(tr("Delete"), this, SLOT(delete_ask())); subExport->setEnabled(!req->isSpki()); } contextMenu(e, menu); currentIdx = QModelIndex(); return; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_x509req.h��������������������������������������������������������������������������0000664�0000000�0000000�00000001334�11753427512�0015171�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __DB_X509REQ_H #define __DB_X509REQ_H #include "db_key.h" #include "db_x509super.h" #include "pki_temp.h" #include "pki_x509req.h" class db_x509req: public db_x509super { Q_OBJECT public: db_x509req(QString DBfile, MainWindow *mw); pki_base* insert(pki_base *item); pki_base *newPKI(db_header_t *head = NULL); void showContextMenu(QContextMenuEvent *e, const QModelIndex &index); void inToCont(pki_base *pki); public slots: void newItem(pki_temp *temp = NULL); void load(); void store(); void showPki(pki_base *pki); void signReq(); signals: void newCert(pki_x509req *req); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_x509super.cpp����������������������������������������������������������������������0000664�0000000�0000000�00000010205�11753427512�0016070�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_base.h" #include "db_x509super.h" #include "widgets/MainWindow.h" #include "ui_About.h" #include <QtGui/QMessageBox> db_x509name::db_x509name(QString db, MainWindow *mw) :db_base(db, mw) { NIDlist dn_nid = *MainWindow::dn_nid; allHeaders << new dbheader(HD_subject_name, false, tr("Subject"), tr("Complete distinguished name")) << new dbheader(HD_subject_hash, false, tr("Subject hash"), tr("Hash to lookup certs in directories")); for (int i=0; i < dn_nid.count(); i++) { int nid = dn_nid[i]; dbheader *h = new dbheader(nid, nid == NID_commonName); h->type = dbheader::hd_x509name; allHeaders << h; } } db_x509super::db_x509super(QString db, MainWindow *mw) :db_x509name(db, mw) { static const int v3nid[] = { NID_subject_alt_name, NID_issuer_alt_name, NID_subject_key_identifier, NID_authority_key_identifier, NID_key_usage, NID_ext_key_usage, NID_crl_distribution_points, NID_info_access, NID_netscape_cert_type, NID_netscape_base_url, NID_netscape_revocation_url, NID_netscape_ca_revocation_url, NID_netscape_renewal_url, NID_netscape_ca_policy_url, NID_netscape_ssl_server_name, NID_netscape_comment, }; allHeaders << new dbheader(HD_x509key_name, false, tr("Key name"), tr("Internal name of the key")); for (unsigned i=0; i<ARRAY_SIZE(v3nid); i++) { int nid = v3nid[i]; dbheader *h = new dbheader(nid, false); h->type = dbheader::hd_v3ext; allHeaders << h; } } void db_x509super::delKey(pki_key *delkey) { FOR_ALL_pki(pki, pki_x509super) { pki->delRefKey(delkey); } } void db_x509super::newKey(pki_key *newkey) { FOR_ALL_pki(pki,pki_x509super) { pki->setRefKey(newkey); } } pki_key *db_x509super::findKey(pki_x509super *ref) { pki_key *key, *refkey; if (!ref) return NULL; if ((key = ref->getRefKey()) != NULL ) return key; refkey = ref->getPubKey(); if (!refkey) return NULL; key = (pki_key *)mainwin->keys->getByReference(refkey); ref->setRefKey(key); delete(refkey); return key; } QList<pki_x509super *> db_x509super::findByPubKey(pki_key *refkey) { QList<pki_x509super *> list; FOR_ALL_pki(pki, pki_x509super) { pki_key *key = pki->getPubKey(); if (!key) continue; if (refkey->compare(key)) list << pki; delete key; } return list; } void db_x509super::extractPubkey() { pki_key *key; pki_x509super *pki = static_cast<pki_x509super*>(currentIdx.internalPointer()); if (!pki) return; key = pki->getPubKey(); if (!key) return; key->setIntName(pki->getIntName()); key = (pki_key*)mainwin->keys->insert(key); if (!key) return; if (pki_base::suppress_messages) return; QMessageBox::information(mainwin, XCA_TITLE, key->getMsg(pki_base::msg_import).arg(pki->getIntName())); } void db_x509super::toOpenssl() const { pki_x509super *pki = static_cast<pki_x509super*>(currentIdx.internalPointer()); QString fn = mainwin->getPath() + QDir::separator() + pki->getUnderlinedName() + ".conf"; QString fname = QFileDialog::getSaveFileName(mainwin, tr("Save as OpenSSL config"), fn, tr("Config files ( *.conf *.cnf);; All files ( * )")); if (fname.isEmpty()) return; fname = QDir::convertSeparators(fname); mainwin->setPath(fname.mid(0, fname.lastIndexOf(QRegExp("[/\\\\]")) )); pki->opensslConf(fname); } void db_x509super::toTemplate() { pki_x509super *pki = static_cast<pki_x509super*>(currentIdx.internalPointer()); if (!pki) return; try { pki_temp *temp = new pki_temp(); check_oom(temp); temp->setIntName(pki->getIntName()); extList el = temp->fromCert(pki); if (el.size()) { Ui::About ui; QString etext; QDialog *d = new QDialog(mainwin, 0); ui.setupUi(d); etext = QString("<h3>") + tr("The following extensions were not ported into the template") + QString("</h3><hr>") + el.getHtml("<br>"); ui.textbox->setHtml(etext); d->setWindowTitle(XCA_TITLE); ui.image->setPixmap(*MainWindow::tempImg); ui.image1->setPixmap(*MainWindow::certImg); d->exec(); delete d; } createSuccess(mainwin->temps->insert(temp)); } catch (errorEx &err) { mainwin->Error(err); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/db_x509super.h������������������������������������������������������������������������0000664�0000000�0000000�00000001271�11753427512�0015540�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __DB_X509SUPER_H #define __DB_X509SUPER_H #include "db_key.h" #include "pki_x509super.h" #include <QtCore/QList> class db_x509name: public db_base { Q_OBJECT public: db_x509name(QString db, MainWindow *mw); }; class db_x509super: public db_x509name { Q_OBJECT public: db_x509super(QString db, MainWindow *mw); pki_key *findKey(pki_x509super *ref); QList<pki_x509super *> findByPubKey(pki_key *refkey); public slots: void delKey(pki_key *delkey); void newKey(pki_key *newKey); void extractPubkey(); void toTemplate(); void toOpenssl() const; }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/exception.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001641�11753427512�0015306�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_EXCEPTION_H #define __PKI_EXCEPTION_H #include <QtCore/QString> #include <QtCore/QObject> #include "base.h" #define E_PASSWD 1 class errorEx { private: QString msg; public: int info; errorEx(QString txt = "", QString className = "", int inf = 0) { msg = txt; if (!className.isEmpty()) msg += " (" + className + ")"; info = inf; } errorEx(const errorEx &e) { msg = e.msg; info = e.info; } void appendString(QString s) { msg = msg + " " + s; } QString getString() const { return msg; } const char *getCString() const { return msg.toAscii(); } bool isEmpty() const { return msg.isEmpty(); } }; #define check_oom(ptr) \ if(!ptr) { \ throw errorEx(QObject::tr("Out of Memory at %1:%2").\ arg(C_FILE).arg(__LINE__)); \ } #endif �����������������������������������������������������������������������������������������������xca_0.9.3/lib/func.cpp������������������������������������������������������������������������������0000664�0000000�0000000�00000023507�11753427512�0014603�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "func.h" #include "exception.h" #include "lib/asn1time.h" #include "widgets/validity.h" #include <openssl/objects.h> #include <openssl/asn1.h> #include <openssl/err.h> #include <openssl/bio.h> #include <openssl/buffer.h> #if defined(Q_WS_MAC) #include <QtGui/QDesktopServices> #endif #include <QtCore/QDir> #include <QtCore/QFile> #include <QtCore/QStringList> #include <QtGui/QLabel> #include <QtGui/QLineEdit> #include <QtGui/QComboBox> #include <QtGui/QMessageBox> #include <QtGui/QApplication> #include <QtGui/QPushButton> #include <QtGui/QProgressBar> #ifdef WIN32 #include <windows.h> #include <shlobj.h> #else /* for htons() */ #include <netinet/in.h> #endif QPixmap *loadImg(const char *name ) { return new QPixmap(QString(":") + name); } QString getDefaultPkcs11Lib() { #if defined(_WIN32) || defined(USE_CYGWIN) return getLibDir() +QDir::separator() +QString("opensc-pkcs11.dll"); #elif defined(Q_WS_MAC) return QString("/Library/OpenSC/lib/opensc-pkcs11.so"); #else return QString("/usr/lib/opensc-pkcs11.so"); #endif } QStringList getLibExtensions() { QStringList l; #if defined(_WIN32) || defined(USE_CYGWIN) l << QString("*.dll") << QString("*.DLL"); #elif defined(Q_WS_MAC) l << QString("*.dylib") << QString("*.so"); #else l << QString("*.so"); #endif return l; } /* returns e.g. /usr/local/share/xca for unix systems * or HKEY_LOCAL_MACHINE->Software->xca for WIN32 * (e.g. c:\Program Files\xca ) */ QString getPrefix() { #ifdef WIN32 static char inst_dir[100] = ""; char *p; ULONG dwLength = 100; LONG lRc; HKEY hKey; if (inst_dir[0] != '\0') { /* if we already once discovered the directory just return it */ return QString(inst_dir); } // fallback: directory of xca.exe GetModuleFileName(0, inst_dir, dwLength - 1); p = strrchr(inst_dir, '\\'); if (p) { *p = '\0'; return QString(inst_dir); } p = inst_dir; *p = '\0'; lRc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\xca", 0, KEY_READ, &hKey); if (lRc != ERROR_SUCCESS) { QMessageBox::warning(NULL,XCA_TITLE, "Registry Key: 'HKEY_LOCAL_MACHINE->Software->xca' not found"); return QString(inst_dir); } lRc = RegQueryValueEx(hKey, "Install_Dir", NULL, NULL, (unsigned char *)inst_dir, &dwLength); if (lRc != ERROR_SUCCESS){ QMessageBox::warning(NULL, XCA_TITLE, "Registry Key: " "'HKEY_LOCAL_MACHINE->Software->xca->Install_Dir' not found"); } lRc = RegCloseKey(hKey); return QString(inst_dir); #elif defined(Q_WS_MAC) // since this is platform-specific anyway, // this is a more robust way to get the bundle directory QDir bundleDir(qApp->applicationDirPath()); bundleDir.cdUp(); return bundleDir.canonicalPath() + "/Resources"; #else return QString(PREFIX) + "/share/xca"; #endif } QString getHomeDir() { QString hd; #ifdef WIN32 LPITEMIDLIST pidl = NULL; TCHAR buf[255] = ""; if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl))) { SHGetPathFromIDList(pidl, buf); } hd = buf; #else hd = QDir::homePath(); #endif return hd; } QString getLibDir() { QString hd; #ifdef WIN32 LPITEMIDLIST pidl = NULL; TCHAR buf[255] = ""; if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_SYSTEM, &pidl))) { SHGetPathFromIDList(pidl, buf); } hd = buf; #else hd = QString("/usr/lib"); #endif return hd; } QString getDocDir() { #if defined(WIN32) || defined (Q_WS_MAC) return getPrefix(); #else return QString(DOCDIR); #endif } // The intent of this function is to return the proper location for // user-controlled settings on the current platform // i.e. PROFILE\Application Data\xca on windows, HOME/.xca on UNIX, // ~/Library/Preferences/xca on Mac OS X QString getUserSettingsDir() { QString rv; #ifdef WIN32 LPITEMIDLIST pidl = NULL; TCHAR buf[255] = ""; if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl))) { SHGetPathFromIDList(pidl, buf); } rv = buf; rv += QDir::separator(); rv += "xca"; #elif defined(Q_WS_MAC) rv = QDesktopServices::storageLocation(QDesktopServices::DataLocation); rv.insert(rv.count() - QCoreApplication::applicationName().count(), QCoreApplication::organizationName() + "/"); #else rv = QDir::homePath(); rv += QDir::separator(); rv += ".xca"; #endif return rv; } // Qt's open and save dialogs result in some undesirable quirks. // This function makes sure that a filename has the user-selected extension. QString getFullFilename(const QString & filename, const QString & selectedFilter) { QString rv = filename.trimmed(), ext; QRegExp rx(".* \\( ?\\*(.[a-z]{1,3}) ?\\)"); rx.indexIn(selectedFilter); ext = rx.cap(1); if (!ext.isEmpty() && !rv.endsWith(ext)) { rv += ext; } return rv; } QByteArray filename2bytearray(const QString &fname) { #ifdef WIN32 return fname.toLocal8Bit(); #else return fname.toUtf8(); #endif } QString filename2QString(const char *fname) { #ifdef WIN32 return QString::fromLocal8Bit(fname); #else return QString::fromUtf8(fname); #endif } QString compressFilename(QString filename, int maxlen) { if (filename.length() < maxlen) return filename; QString fn = filename.replace("\\", "/"); int len, lastslash = fn.lastIndexOf('/'); QString base = filename.mid(lastslash); len = base.length(); len = maxlen - len -3; if (len < 0) return QString("...") + base.right(maxlen -3); fn = fn.left(len); lastslash = fn.lastIndexOf('/'); return filename.left(lastslash+1) + "..." + base; } QString asn1ToQString(const ASN1_STRING *str, bool quote) { QString qs; unsigned short *bmp; int i; if (!str) return qs; switch (str->type) { case V_ASN1_BMPSTRING: bmp = (unsigned short*)str->data; for (i = 0; i < str->length/2; i++) { unsigned short s = ntohs(bmp[i]); qs += QString::fromUtf16(&s, 1); } break; case V_ASN1_UTF8STRING: qs = QString::fromUtf8((const char*)str->data, str->length); break; case V_ASN1_T61STRING: qs = QString::fromLocal8Bit((const char*)str->data, str->length); break; default: qs = QString::fromLatin1((const char*)str->data, str->length); } #if 0 printf("Convert %s (%d %d) string to '%s' len %d:", ASN1_tag2str(str->type), str->type, V_ASN1_UTF8STRING, CCHAR(qs), str->length); for (int i=0; i< str->length; i++) printf(" %02x", str->data[i]); printf("\n"); #endif if (quote) qs.replace('\n', "\\n\\"); return qs; } /* returns an encoded ASN1 string from QString for a special nid*/ ASN1_STRING *QStringToAsn1(const QString s, int nid) { QByteArray ba = s.toUtf8(); const unsigned char *utf8 = (const unsigned char *)ba.constData(); unsigned long global_mask = ASN1_STRING_get_default_mask(); unsigned long mask = DIRSTRING_TYPE & global_mask; ASN1_STRING *out = NULL; ASN1_STRING_TABLE *tbl; tbl = ASN1_STRING_TABLE_get(nid); if (tbl) { mask = tbl->mask; if (!(tbl->flags & STABLE_NO_MASK)) mask &= global_mask; } ASN1_mbstring_copy(&out, utf8, -1, MBSTRING_UTF8, mask); openssl_error(QString("'%1' (%2)").arg(s).arg(OBJ_nid2ln(nid))); return out; } const char *OBJ_ln2sn(const char *ln) { return OBJ_nid2sn(OBJ_ln2nid(ln)); } const char *OBJ_sn2ln(const char *sn) { return OBJ_nid2ln(OBJ_sn2nid(sn)); } const char *OBJ_obj2sn(ASN1_OBJECT *a) { OBJ_obj2nid(a); openssl_error(); return OBJ_nid2sn(OBJ_obj2nid(a)); } QString OBJ_obj2QString(ASN1_OBJECT *a, int no_name) { char buf[512]; int len; len = OBJ_obj2txt(buf, 256, a, no_name); openssl_error(); return QString::fromAscii(buf, len); } QByteArray i2d_bytearray(int(*i2d)(const void*, unsigned char **), const void *data) { QByteArray ba; ba.resize(i2d(data, NULL)); unsigned char *p = (unsigned char*)ba.data(); i2d(data, &p); openssl_error(); return ba; } void *d2i_bytearray(void *(*d2i)(void *, unsigned char **, long), QByteArray &ba) { unsigned char *p, *p1; void *ret; p = p1 = (unsigned char *)ba.constData(); ret = d2i(NULL, &p1, ba.count()); ba = ba.mid(p1-p); openssl_error(); return ret; } void _openssl_error(const QString txt, const char *file, int line) { QString error; while (int i = ERR_get_error() ) { error += QString(ERR_error_string(i, NULL)) + "\n"; fputs(CCHAR(QString("OpenSSL error (%1:%2) : %3\n"). arg(file).arg(line).arg(ERR_error_string(i, NULL))), stderr); } if (!error.isEmpty()) { if (!txt.isEmpty()) error = txt + "\n" + error + "\n" + QString("(%1:%2)").arg(file).arg(line); throw errorEx(error); } } #undef PRINT_IGNORED_ANYWAY bool _ign_openssl_error(const QString txt, const char *file, int line) { // ignore openssl errors QString errtxt; #if PRINT_IGNORED_ANYWAY if (!txt.isEmpty() && ERR_peek_error()) fprintf(stderr, "%s\n", CCHAR(txt)); #endif while (int i = ERR_get_error() ) { errtxt = ERR_error_string(i, NULL); #if PRINT_IGNORED_ANYWAY fprintf(stderr, CCHAR(QString("IGNORED (%1:%2) : %3\n"). arg(file).arg(line).arg(errtxt))); #endif } return !errtxt.isEmpty(); } void inc_progress_bar(int, int, void *p) { QProgressBar *bar = (QProgressBar *)p; int value = bar->value(); if (value == bar->maximum()) { bar->reset(); } else { bar->setValue(value +1); } } static long mem_ctrl(BIO *b, int cmd, long num, void *ptr) { BUF_MEM *bm = (BUF_MEM *)b->ptr; if (!bm->data || !(b->flags & BIO_FLAGS_MEM_RDONLY)) return BIO_s_mem()->ctrl(b, cmd, num, ptr); switch (cmd) { case BIO_C_FILE_SEEK: if (num > (long)bm->max) num = bm->max; bm->data -= (bm->max - bm->length) - num; bm->length = bm->max - num; case BIO_C_FILE_TELL: return bm->max - bm->length; } return BIO_s_mem()->ctrl(b, cmd, num, ptr); } void BIO_seekable_romem(BIO *b) { static BIO_METHOD *mymeth = NULL; static BIO_METHOD _meth; if (!(b->flags & BIO_FLAGS_MEM_RDONLY) || (b->method->type != BIO_TYPE_MEM)) { return; } if (!mymeth) { _meth = *BIO_s_mem(); _meth.ctrl = mem_ctrl; mymeth = &_meth; } b->method = mymeth; } BIO *BIO_QBA_mem_buf(QByteArray &a) { BIO *b = BIO_new_mem_buf(a.data(), a.size()); BIO_seekable_romem(b); return b; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/func.h��������������������������������������������������������������������������������0000664�0000000�0000000�00000003327�11753427512�0014246�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __FUNC_H #define __FUNC_H #include <openssl/asn1.h> #include <QtGui/QPixmap> #include <QtCore/QByteArray> #include "base.h" class Validity; QPixmap *loadImg(const char *name); QString getPrefix(); QString getHomeDir(); QString getLibDir(); QString getDocDir(); QString getUserSettingsDir(); QString getDefaultPkcs11Lib(); QString getFullFilename(const QString &filename, const QString &selectedFilter); QStringList getLibExtensions(); QByteArray filename2bytearray(const QString &fname); QString filename2QString(const char *fname); QString compressFilename(QString filename, int maxlen = 50); QString asn1ToQString(const ASN1_STRING *str, bool quote = false); ASN1_STRING *QStringToAsn1(QString s, int nid); const char *OBJ_ln2sn(const char *ln); const char *OBJ_sn2ln(const char *sn); const char *OBJ_obj2sn(ASN1_OBJECT *a); QString OBJ_obj2QString(ASN1_OBJECT *a, int no_name = 0); void inc_progress_bar(int, int, void *p); #define openssl_error(x) _openssl_error(QString(x), C_FILE, __LINE__) #define ign_openssl_error(x) _ign_openssl_error(QString(x), C_FILE, __LINE__) void _openssl_error(const QString txt, const char *file, int line); bool _ign_openssl_error(const QString txt, const char *file, int line); QByteArray i2d_bytearray(int(*i2d)(const void*, unsigned char**), const void*); void *d2i_bytearray(void *(*d2i)(void*, unsigned char**, long), QByteArray &ba); BIO *BIO_QBA_mem_buf(QByteArray &a); #define I2D_VOID(a) ((int (*)(const void *, unsigned char **))(a)) #define D2I_VOID(a) ((void *(*)(void *, unsigned char **, long))(a)) #define QString2filename(str) filename2bytearray(str).constData() #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/headerlist.h��������������������������������������������������������������������������0000664�0000000�0000000�00000007545�11753427512�0015445�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2010 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "db.h" #include "func.h" #include <QtCore/QString> #include <QtCore/QList> #include <QtGui/QAction> #include <QtGui/QHeaderView> #include <openssl/objects.h> #define HD_undef NID_undef #define HD_internal_name -2 #define HD_subject_name -3 #define HD_subject_hash -4 #define HD_x509key_name -5 #define HD_cert_serial -10 #define HD_cert_notBefore -11 #define HD_cert_notAfter -12 #define HD_cert_trust -13 #define HD_cert_revokation -14 #define HD_cert_ca -15 #define HD_cert_md5fp -16 #define HD_cert_sha1fp -17 #define HD_req_signed -20 #define HD_req_unstr_name -21 #define HD_req_chall_pass -22 #define HD_temp_type -30 #define HD_crl_signer -40 #define HD_crl_revoked -42 #define HD_crl_lastUpdate -43 #define HD_crl_nextUpdate -44 #define HD_crl_crlnumber -45 #define HD_key_type -50 #define HD_key_size -51 #define HD_key_use -52 #define HD_key_passwd -53 class dbheader { private: void init() { id = HD_undef; action = NULL; show = showDefault = false; size = -1; visualIndex = -1; sortIndicator = -1; type = hd_default; } public: enum hdr_type { hd_default, hd_x509name, hd_v3ext, }; int id; bool show; bool showDefault; QString name; QString tooltip; QAction *action; int size; int visualIndex; int sortIndicator; enum hdr_type type; dbheader(QString aname = QString()) { init(); name = aname; } dbheader(int aid, bool ashow = false, QString aname = QString(), QString atip = QString()) { init(); id = aid; name = aname; tooltip = atip; if (id > 0 && name.isEmpty()) { name = OBJ_nid2ln(aid); tooltip = OBJ_nid2sn(aid); } show = showDefault = ashow; } bool mustSave() { return size != -1 || visualIndex != -1 || sortIndicator != -1 || show != showDefault; } bool operator == (const dbheader *h) const { if (h->id == HD_undef) return name == h->name; return id == h->id; } bool isNumeric() { switch (id) { case HD_key_size: case HD_key_use: case HD_cert_serial: case HD_crl_revoked: case HD_crl_crlnumber: case HD_subject_hash: case HD_cert_md5fp: case HD_cert_sha1fp: case NID_subject_key_identifier: case NID_authority_key_identifier: return true; } return false; } QByteArray toData() { QByteArray ba; ba += db::intToData(visualIndex); ba += db::intToData(sortIndicator); ba += db::intToData(size); ba += db::boolToData(show); return ba; } void fromData(QByteArray &ba) { visualIndex = db::intFromData(ba); sortIndicator = db::intFromData(ba); size = db::intFromData(ba); show = db::boolFromData(ba); } void setupHeaderView(int sect, QHeaderView *hv) { hv->setSectionHidden(sect, !show); if (size != -1) hv->resizeSection(sect, size); if (sortIndicator != -1) { hv->setSortIndicator(sect, sortIndicator ? Qt::DescendingOrder : Qt::AscendingOrder); } } void reset() { action = NULL; show = showDefault; size = -1; visualIndex = -1; sortIndicator = -1; } }; class dbheaderList: public QList<dbheader*> { public: QByteArray toData() { QByteArray ba; for (int i=0; i<count(); i++) { dbheader *h = at(i); if (!h->mustSave()) continue; ba += db::intToData(h->id); if (h->id > 0) { ASN1_OBJECT *o = OBJ_nid2obj(h->id); ba += i2d_bytearray(I2D_VOID(i2d_ASN1_OBJECT), o); } ba += h->toData(); } return ba; } void fromData(QByteArray &ba) { while (ba.size()) { int id = db::intFromData(ba); if (id > 0) { ASN1_OBJECT *o = (ASN1_OBJECT*)d2i_bytearray(D2I_VOID(d2i_ASN1_OBJECT), ba); id = OBJ_obj2nid(o); ASN1_OBJECT_free(o); } for (int i=0; i<count(); i++) { dbheader *h = at(i); if (h->id == id) { h->fromData(ba); id = 0; break; } } if (id != 0) { dbheader h("dummy"); h.fromData(ba); } } } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/import.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000006536�11753427512�0015165�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #include "exception.h" #include "db_base.h" #include <errno.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <QtCore/QFile> #define RESIZE 1024 #define RDBUF 256 static int database = -1; static int h2n(const char c) { if (c>='0' && c<='9') return c-'0'; if (c>='a' && c<='f') return c-'a'+10; if (c>='A' && c<='F') return c-'A'+10; return 0; } static char *read_data(const char *asc, int *retlen) { char *p; int len=0, binlen=0, alloclen=RESIZE; p = (char*)malloc(alloclen); if (!p) return NULL; *retlen = 0; while(asc[len] != '\0') { p[binlen] = (h2n(asc[len])<<4) + h2n(asc[len+1]); len +=2; binlen++; if (binlen == alloclen) { alloclen +=RESIZE; p = (char *)realloc(p, alloclen); } } *retlen = binlen; return p; } QString readLine(QFile *file) { QString data; qint64 begin; char buffer[RDBUF], *p; int ret, len; while ((ret = file->read(buffer, RDBUF-1)) >0) { p = strchr(buffer, '\n'); if (p) { begin = file->pos() - ret; len = p - buffer; file->seek(begin + len + 1); //printf("Begin: %ld len=%d\n", begin,len); if (p > buffer && p[-1] == '\r') p--; *p = '\0'; data += buffer; return data; } buffer[ret] = '\0'; data += buffer; continue; } return data; } static int set_db(const char *name) { QStringList sl; sl << "keydb" << "reqdb" << "certdb" << "tempdb" << "crldb" << "settings"; for (int i=0; i<sl.count(); i++) { if (sl[i] == name) return i; } return -1; } static void handle_option(QString opt) { QStringList sl = opt.split('='); if (sl.count() != 2) { printf("No '=' found in: '%s'\n", CCHAR(opt)); return; } if (!sl[0].compare("database")) { database = set_db(CCHAR(sl[1])); } } int read_dump(const char *filename, db_base **dbs, char *md5, int md5_len) { char *p; int ret = -1, retlen = 0; int kv=0; bool md5sum = false; pki_base *pki = NULL; db_base *db; QFile file; QString line; file.setFileName(filename); if (! file.open(QIODevice::ReadOnly)) { throw errorEx(filename, strerror(errno)); return -1; } for (;;) { line = readLine(&file); //printf("Line: '%s'\n", CCHAR(line)); if (line.isNull()) { ret = 0; break; } //printf("FIRST char = '%c'\n", CCHAR(line)[0]); if (line[0] == ' ') { if (database >= 0 && database < 5) db = dbs[database]; else db = NULL; kv ^= 1; p = read_data(CCHAR(line.trimmed()), &retlen); if (db && !md5) { if (kv) { pki = db->newPKI(); if (!pki) { break; } pki->setIntName(p); } else { try { pki->oldFromData((unsigned char*)p, retlen); db->insert(pki); } catch (errorEx &err) { printf("Error catched for '%s'\n", CCHAR(pki->getIntName())); } } } else if (md5) { if (database == 5) { p = read_data(CCHAR(line.trimmed()), &retlen); if (kv) md5sum = (!strcmp(p, "pwhash")) ? true : false; if (!kv && md5sum) { strncpy(md5, p, md5_len); ret = 0; break; } } } free(p); } else { if (kv) { printf("Binary value expected\n"); break; } handle_option(line); } } file.close(); if (ret <0) { throw errorEx(filename, strerror(errno)); return -1; } return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/load_obj.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000006256�11753427512�0015423�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "load_obj.h" #include "pki_x509.h" #include "pki_key.h" #include "pki_x509req.h" #include "pki_pkcs7.h" #include "pki_pkcs12.h" #include "pki_multi.h" #include "pki_temp.h" #include "pki_crl.h" load_base::load_base() { filter = QObject::tr("All files ( * )"); caption = ""; } pki_base *load_base::loadItem(QString s) { pki_base *pki = newItem(); if (!pki) return NULL; try { pki->fload(s); } catch (errorEx &err){ delete pki; throw err; } return pki; } pki_base * load_base::newItem() { return NULL; } load_base::~load_base() { } /* Keys */ load_key::load_key() :load_base() { filter = QObject::tr("PKI Keys ( *.pem *.der *.key );;" "PKCS#8 Keys ( *.p8 *.pk8 );;") + filter; caption = QObject::tr("Import RSA key"); } pki_base * load_key::newItem() { return new pki_evp(); } /* Requests */ load_req::load_req() :load_base() { filter = QObject::tr("PKCS#10 CSR ( *.pem *.der *.csr );;" "Netscape Request ( *.spkac *.spc );;") + filter; caption = QObject::tr("Import Request"); } pki_base * load_req::newItem() { return new pki_x509req(); } /* Certificates */ load_cert::load_cert() :load_base() { filter = QObject::tr("Certificates ( *.pem *.der *.crt *.cer );;") + filter; caption = QObject::tr("Import X.509 Certificate"); } pki_base * load_cert::newItem() { return new pki_x509(); } /* PKCS#7 Certificates */ load_pkcs7::load_pkcs7() :load_base() { filter = QObject::tr("PKCS#7 data ( *.p7s *.p7m *.p7b );;") + filter; caption = QObject::tr("Import PKCS#7 Certificates"); } pki_base * load_pkcs7::newItem() { return new pki_pkcs7(); } /* PKCS#12 Certificates */ load_pkcs12::load_pkcs12() :load_base() { filter = QObject::tr("PKCS#12 Certificates ( *.p12 *.pfx );;") + filter; caption = QObject::tr("Import PKCS#12 Private Certificate"); } pki_base * load_pkcs12::loadItem(QString s) { pki_base *p12 = new pki_pkcs12(s); return p12; } /* Templates */ load_temp::load_temp() :load_base() { filter = QObject::tr("XCA templates ( *.xca );;") + filter; caption = QObject::tr("Import XCA Templates"); } pki_base * load_temp::newItem() { return new pki_temp(); } /* CRLs */ load_crl::load_crl() :load_base() { filter = QObject::tr("Revocation lists ( *.pem *.der *.crl );;") + filter; caption = QObject::tr("Import Certificate Revocation List"); } pki_base * load_crl::newItem() { return new pki_crl(); } /* Database */ load_db::load_db() :load_base() { filter = QObject::tr("XCA Databases ( *.xdb );;") + filter; caption = QObject::tr("Open XCA Database"); } /* Shared library */ load_pkcs11::load_pkcs11() :load_base() { #ifdef WIN32 filter = QObject::tr("PKCS#11 library ( *.dll );;") + filter; #elif defined(Q_WS_MAC) filter = QObject::tr("PKCS#11 library ( *.dylib *.so );;") + filter; #else filter = QObject::tr("PKCS#11 library ( *.so );;") + filter; #endif caption = QObject::tr("Open PKCS#11 shared library"); } /* General PEM loader */ load_pem::load_pem() :load_base() { filter = QObject::tr("PEM files ( *.pem );;") + filter; caption = QObject::tr("Load PEM encoded file"); } pki_base *load_pem::newItem() { return new pki_multi(); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/load_obj.h����������������������������������������������������������������������������0000664�0000000�0000000�00000002302�11753427512�0015054�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __LOAD_OBJ_H #define __LOAD_OBJ_H #include <QtCore/QStringList> class pki_base; class load_base { public: QString filter; QString caption; load_base(); virtual ~load_base(); virtual pki_base *loadItem(QString s); virtual pki_base *newItem(); }; class load_key: public load_base { public: load_key(); pki_base *newItem(); }; class load_req: public load_base { public: load_req(); pki_base *newItem(); }; class load_cert: public load_base { public: load_cert(); pki_base *newItem(); }; class load_pkcs7: public load_base { public: load_pkcs7(); pki_base *newItem(); }; class load_pkcs12: public load_base { public: load_pkcs12(); pki_base *loadItem(QString s); }; class load_temp: public load_base { public: load_temp(); pki_base *newItem(); }; class load_crl: public load_base { public: load_crl(); pki_base *newItem(); }; class load_db: public load_base { public: load_db(); }; class load_pkcs11: public load_base { public: load_pkcs11(); }; class load_pem: public load_base { public: load_pem(); pki_base *newItem(); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/main.cpp������������������������������������������������������������������������������0000664�0000000�0000000�00000003750�11753427512�0014572�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include <QtGui/QApplication> #include <QtCore/QTranslator> #include <QtCore/QTextCodec> #include <QtCore/QDir> #include "widgets/MainWindow.h" #include "lib/func.h" #ifdef WIN32 #include <windows.h> #endif class XCA_application : public QApplication { MainWindow *mainw; QTranslator qtTr; QTranslator xcaTr; public: XCA_application(int &argc, char *argv[]); void setMainwin(MainWindow *m) { mainw = m; } protected: bool event(QEvent *ev); }; XCA_application::XCA_application(int &argc, char *argv[]) :QApplication(argc, argv) { QString locale; QStringList dirs; locale = QLocale::system().name(); dirs #ifdef XCA_DEFAULT_QT_TRANSLATE << XCA_DEFAULT_QT_TRANSLATE #endif << getPrefix() #ifndef WIN32 << "/usr/local/share/qt4/translations/" << "/usr/share/qt4/translations/" << "/usr/share/qt/translations/" #endif ; foreach(QString dir, dirs) { if (qtTr.load(QString("qt_%1").arg(locale), dir)) { break; } } xcaTr.load(QString("xca_%1").arg(locale), getPrefix()); installTranslator(&qtTr); installTranslator(&xcaTr); #ifdef Q_WS_MAC QStringList libp = libraryPaths(); libp.prepend(applicationDirPath() + "/../Plugins"); setLibraryPaths(libp); #endif } bool XCA_application::event(QEvent *ev) { if (ev->type() == QEvent::FileOpen) { QString file = static_cast<QFileOpenEvent *>(ev)->file(); if (mainw) mainw->importAnything(file); return true; } return QApplication::event(ev); } int main( int argc, char *argv[] ) { int ret = 0, pkictr; MainWindow *mw; XCA_application a( argc, argv ); mw = new MainWindow(NULL); try { a.setMainwin(mw); mw->read_cmdline(); if (mw->exitApp == 0) { if (mw->open_default_db() != 2) { mw->show(); ret = a.exec(); } } } catch (errorEx &ex) { mw->Error(ex); } delete mw; pkictr = pki_base::get_pki_counter(); if (pkictr) fprintf(stderr, "PKI Counter (%d)\n", pkictr); return ret; } ������������������������xca_0.9.3/lib/oid.cpp�������������������������������������������������������������������������������0000664�0000000�0000000�00000005153�11753427512�0014420�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ /* here we have the possibility to add our own OIDS */ #include <openssl/objects.h> #include <QtCore/QStringList> #include <QtGui/QMessageBox> #include <QtCore/QDir> #include "func.h" #include "oid.h" int first_additional_oid = 0; /* reads additional OIDs from a file: oid, sn, ln */ static void readOIDs(QString fname) { char buff[128]; QString pb; FILE *fp; int line = 0; QStringList sl; fp = fopen(QString2filename(fname), "r"); if (fp == NULL) return; while (fgets(buff, 127, fp)) { line++; pb = buff; pb = pb.trimmed(); if (pb.startsWith('#') || pb.size() == 0) continue; sl.clear(); sl = pb.split(':'); if (sl.count() != 3) { QMessageBox::warning(NULL, QString(XCA_TITLE), QString("Error reading config file: ") + fname + " Line: " + QString::number(line) ); fclose(fp); return; } else { QByteArray oid = sl[0].trimmed().toAscii(); QByteArray sn = sl[1].trimmed().toAscii(); QByteArray ln = sl[2].trimmed().toAscii(); int nid = OBJ_txt2nid(oid.constData()); if ((nid != NID_undef) && (sn != OBJ_nid2sn(nid))) { printf("OID: '%s' SN differs: '%s' '%s'\n", oid.constData(), sn.constData(), OBJ_nid2sn(nid)); } if ((nid == NID_undef) || (sn != OBJ_nid2sn(nid))) { OBJ_create(oid.constData(), sn.constData(), ln.constData()); } } } fclose(fp); } void initOIDs() { QString oids = QString(QDir::separator()) + "oids.txt"; QString dir = getPrefix(); first_additional_oid = OBJ_new_nid(0); readOIDs(dir + oids); #ifndef WIN32 #if !defined(Q_WS_MAC) readOIDs(QString(ETC) + oids); #endif readOIDs(getUserSettingsDir() + oids); #endif } /* reads a list of OIDs/SNs from a file and turns them into a QValueList * of integers, representing the NIDs. Usually to be used by NewX509 for * the list of ExtendedKeyUsage and Distinguished Name */ NIDlist readNIDlist(QString fname) { char buff[128]; const char *pb; char *pbe; FILE *fp; int line = 0, nid; NIDlist nl; nl.clear(); fp = fopen(QString2filename(fname), "r"); if (fp == NULL) return nl; while (fgets(buff, 127, fp)) { line++; pb = buff; while (*pb==' ' || *pb=='\t' ) pb++; if (*pb == '#' ) continue; pbe = buff + strlen(buff) -1; while (*pbe == ' ' || *pbe == '\t' || *pbe == '\r' || *pbe == '\n') *pbe-- = '\0'; nid = OBJ_txt2nid((char *)pb); if (nid == NID_undef) QMessageBox::warning(NULL, QString(XCA_TITLE), QString("Unknown (flying:-) Object: ") + fname + " Line: " + QString::number(line) ); else nl += nid; } fclose(fp); return nl; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/oid.h���������������������������������������������������������������������������������0000664�0000000�0000000�00000001064�11753427512�0014062�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __OID_H #define __OID_H class QString; #include <QtCore/QList> extern int first_additional_oid; typedef QList<int> NIDlist; /* reads additional OIDs from a file: oid, sn, ln */ void initOIDs(); /* reads a list of OIDs/SNs from a file and turns them into a QValueList * of integers, representing the NIDs. Usually to be used by NewX509 for * the list of ExtendedKeyUsage and Distinguished Name */ NIDlist readNIDlist(QString fname); #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/opensc-pkcs11.h�����������������������������������������������������������������������0000664�0000000�0000000�00000123162�11753427512�0015702�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* pkcs11.h Copyright 2006, 2007 g10 Code GmbH Copyright 2006 Andreas Jellinghaus This file is free software; as a special exception the author gives unlimited permission to copy and/or distribute it, with or without modifications, as long as this notice is preserved. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY, to the extent permitted by law; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ /* Please submit changes back to the Scute project at http://www.scute.org/ (or send them to marcus@g10code.com), so that they can be picked up by other projects from there as well. */ /* This file is a modified implementation of the PKCS #11 standard by RSA Security Inc. It is mostly a drop-in replacement, with the following change: This header file does not require any macro definitions by the user (like CK_DEFINE_FUNCTION etc). In fact, it defines those macros for you (if useful, some are missing, let me know if you need more). There is an additional API available that does comply better to the GNU coding standard. It can be switched on by defining CRYPTOKI_GNU before including this header file. For this, the following changes are made to the specification: All structure types are changed to a "struct ck_foo" where CK_FOO is the type name in PKCS #11. All non-structure types are changed to ck_foo_t where CK_FOO is the lowercase version of the type name in PKCS #11. The basic types (CK_ULONG et al.) are removed without substitute. All members of structures are modified in the following way: Type indication prefixes are removed, and underscore characters are inserted before words. Then the result is lowercased. Note that function names are still in the original case, as they need for ABI compatibility. CK_FALSE, CK_TRUE and NULL_PTR are removed without substitute. Use <stdbool.h>. If CRYPTOKI_COMPAT is defined before including this header file, then none of the API changes above take place, and the API is the one defined by the PKCS #11 standard. */ #ifndef PKCS11_H #define PKCS11_H 1 #if defined(__cplusplus) extern "C" { #endif /* The version of cryptoki we implement. The revision is changed with each modification of this file. If you do not use the "official" version of this file, please consider deleting the revision macro (you may use a macro with a different name to keep track of your versions). */ #define CRYPTOKI_VERSION_MAJOR 2 #define CRYPTOKI_VERSION_MINOR 20 #define CRYPTOKI_VERSION_REVISION 6 /* Compatibility interface is default, unless CRYPTOKI_GNU is given. */ #ifndef CRYPTOKI_GNU #ifndef CRYPTOKI_COMPAT #define CRYPTOKI_COMPAT 1 #endif #endif /* System dependencies. */ #if defined(_WIN32) || defined(CRYPTOKI_FORCE_WIN32) /* There is a matching pop below. */ #pragma pack(push, cryptoki, 1) #ifdef CRYPTOKI_EXPORTS #define CK_SPEC __declspec(dllexport) #else #define CK_SPEC __declspec(dllimport) #endif #else #define CK_SPEC #endif #ifdef CRYPTOKI_COMPAT /* If we are in compatibility mode, switch all exposed names to the PKCS #11 variant. There are corresponding #undefs below. */ #define ck_flags_t CK_FLAGS #define ck_version _CK_VERSION #define ck_info _CK_INFO #define cryptoki_version cryptokiVersion #define manufacturer_id manufacturerID #define library_description libraryDescription #define library_version libraryVersion #define ck_notification_t CK_NOTIFICATION #define ck_slot_id_t CK_SLOT_ID #define ck_slot_info _CK_SLOT_INFO #define slot_description slotDescription #define hardware_version hardwareVersion #define firmware_version firmwareVersion #define ck_token_info _CK_TOKEN_INFO #define serial_number serialNumber #define max_session_count ulMaxSessionCount #define session_count ulSessionCount #define max_rw_session_count ulMaxRwSessionCount #define rw_session_count ulRwSessionCount #define max_pin_len ulMaxPinLen #define min_pin_len ulMinPinLen #define total_public_memory ulTotalPublicMemory #define free_public_memory ulFreePublicMemory #define total_private_memory ulTotalPrivateMemory #define free_private_memory ulFreePrivateMemory #define utc_time utcTime #define ck_session_handle_t CK_SESSION_HANDLE #define ck_user_type_t CK_USER_TYPE #define ck_state_t CK_STATE #define ck_session_info _CK_SESSION_INFO #define slot_id slotID #define device_error ulDeviceError #define ck_object_handle_t CK_OBJECT_HANDLE #define ck_object_class_t CK_OBJECT_CLASS #define ck_hw_feature_type_t CK_HW_FEATURE_TYPE #define ck_key_type_t CK_KEY_TYPE #define ck_certificate_type_t CK_CERTIFICATE_TYPE #define ck_attribute_type_t CK_ATTRIBUTE_TYPE #define ck_attribute _CK_ATTRIBUTE #define value pValue #define value_len ulValueLen #define ck_date _CK_DATE #define ck_mechanism_type_t CK_MECHANISM_TYPE #define ck_mechanism _CK_MECHANISM #define parameter pParameter #define parameter_len ulParameterLen #define ck_mechanism_info _CK_MECHANISM_INFO #define min_key_size ulMinKeySize #define max_key_size ulMaxKeySize #define ck_rv_t CK_RV #define ck_notify_t CK_NOTIFY #define ck_function_list _CK_FUNCTION_LIST #define ck_createmutex_t CK_CREATEMUTEX #define ck_destroymutex_t CK_DESTROYMUTEX #define ck_lockmutex_t CK_LOCKMUTEX #define ck_unlockmutex_t CK_UNLOCKMUTEX #define ck_c_initialize_args _CK_C_INITIALIZE_ARGS #define create_mutex CreateMutex #define destroy_mutex DestroyMutex #define lock_mutex LockMutex #define unlock_mutex UnlockMutex #define reserved pReserved #endif /* CRYPTOKI_COMPAT */ typedef unsigned long ck_flags_t; struct ck_version { unsigned char major; unsigned char minor; }; struct ck_info { struct ck_version cryptoki_version; unsigned char manufacturer_id[32]; ck_flags_t flags; unsigned char library_description[32]; struct ck_version library_version; }; typedef unsigned long ck_notification_t; #define CKN_SURRENDER (0) typedef unsigned long ck_slot_id_t; struct ck_slot_info { unsigned char slot_description[64]; unsigned char manufacturer_id[32]; ck_flags_t flags; struct ck_version hardware_version; struct ck_version firmware_version; }; #define CKF_TOKEN_PRESENT (1 << 0) #define CKF_REMOVABLE_DEVICE (1 << 1) #define CKF_HW_SLOT (1 << 2) #define CKF_ARRAY_ATTRIBUTE (1 << 30) struct ck_token_info { unsigned char label[32]; unsigned char manufacturer_id[32]; unsigned char model[16]; unsigned char serial_number[16]; ck_flags_t flags; unsigned long max_session_count; unsigned long session_count; unsigned long max_rw_session_count; unsigned long rw_session_count; unsigned long max_pin_len; unsigned long min_pin_len; unsigned long total_public_memory; unsigned long free_public_memory; unsigned long total_private_memory; unsigned long free_private_memory; struct ck_version hardware_version; struct ck_version firmware_version; unsigned char utc_time[16]; }; #define CKF_RNG (1 << 0) #define CKF_WRITE_PROTECTED (1 << 1) #define CKF_LOGIN_REQUIRED (1 << 2) #define CKF_USER_PIN_INITIALIZED (1 << 3) #define CKF_RESTORE_KEY_NOT_NEEDED (1 << 5) #define CKF_CLOCK_ON_TOKEN (1 << 6) #define CKF_PROTECTED_AUTHENTICATION_PATH (1 << 8) #define CKF_DUAL_CRYPTO_OPERATIONS (1 << 9) #define CKF_TOKEN_INITIALIZED (1 << 10) #define CKF_SECONDARY_AUTHENTICATION (1 << 11) #define CKF_USER_PIN_COUNT_LOW (1 << 16) #define CKF_USER_PIN_FINAL_TRY (1 << 17) #define CKF_USER_PIN_LOCKED (1 << 18) #define CKF_USER_PIN_TO_BE_CHANGED (1 << 19) #define CKF_SO_PIN_COUNT_LOW (1 << 20) #define CKF_SO_PIN_FINAL_TRY (1 << 21) #define CKF_SO_PIN_LOCKED (1 << 22) #define CKF_SO_PIN_TO_BE_CHANGED (1 << 23) #define CK_UNAVAILABLE_INFORMATION ((unsigned long) -1) #define CK_EFFECTIVELY_INFINITE (0) typedef unsigned long ck_session_handle_t; #define CK_INVALID_HANDLE (0) typedef unsigned long ck_user_type_t; #define CKU_SO (0) #define CKU_USER (1) #define CKU_CONTEXT_SPECIFIC (2) typedef unsigned long ck_state_t; #define CKS_RO_PUBLIC_SESSION (0) #define CKS_RO_USER_FUNCTIONS (1) #define CKS_RW_PUBLIC_SESSION (2) #define CKS_RW_USER_FUNCTIONS (3) #define CKS_RW_SO_FUNCTIONS (4) struct ck_session_info { ck_slot_id_t slot_id; ck_state_t state; ck_flags_t flags; unsigned long device_error; }; #define CKF_RW_SESSION (1 << 1) #define CKF_SERIAL_SESSION (1 << 2) typedef unsigned long ck_object_handle_t; typedef unsigned long ck_object_class_t; #define CKO_DATA (0) #define CKO_CERTIFICATE (1) #define CKO_PUBLIC_KEY (2) #define CKO_PRIVATE_KEY (3) #define CKO_SECRET_KEY (4) #define CKO_HW_FEATURE (5) #define CKO_DOMAIN_PARAMETERS (6) #define CKO_MECHANISM (7) #define CKO_VENDOR_DEFINED ((unsigned long) (1 << 31)) typedef unsigned long ck_hw_feature_type_t; #define CKH_MONOTONIC_COUNTER (1) #define CKH_CLOCK (2) #define CKH_USER_INTERFACE (3) #define CKH_VENDOR_DEFINED ((unsigned long) (1 << 31)) typedef unsigned long ck_key_type_t; #define CKK_RSA (0) #define CKK_DSA (1) #define CKK_DH (2) #define CKK_ECDSA (3) #define CKK_EC (3) #define CKK_X9_42_DH (4) #define CKK_KEA (5) #define CKK_GENERIC_SECRET (0x10) #define CKK_RC2 (0x11) #define CKK_RC4 (0x12) #define CKK_DES (0x13) #define CKK_DES2 (0x14) #define CKK_DES3 (0x15) #define CKK_CAST (0x16) #define CKK_CAST3 (0x17) #define CKK_CAST128 (0x18) #define CKK_RC5 (0x19) #define CKK_IDEA (0x1a) #define CKK_SKIPJACK (0x1b) #define CKK_BATON (0x1c) #define CKK_JUNIPER (0x1d) #define CKK_CDMF (0x1e) #define CKK_AES (0x1f) #define CKK_BLOWFISH (0x20) #define CKK_TWOFISH (0x21) #define CKK_VENDOR_DEFINED ((unsigned long) (1 << 31)) typedef unsigned long ck_certificate_type_t; #define CKC_X_509 (0) #define CKC_X_509_ATTR_CERT (1) #define CKC_WTLS (2) #define CKC_VENDOR_DEFINED ((unsigned long) (1 << 31)) typedef unsigned long ck_attribute_type_t; #define CKA_CLASS (0UL) #define CKA_TOKEN (1UL) #define CKA_PRIVATE (2UL) #define CKA_LABEL (3UL) #define CKA_APPLICATION (0x10UL) #define CKA_VALUE (0x11UL) #define CKA_OBJECT_ID (0x12UL) #define CKA_CERTIFICATE_TYPE (0x80UL) #define CKA_ISSUER (0x81UL) #define CKA_SERIAL_NUMBER (0x82UL) #define CKA_AC_ISSUER (0x83UL) #define CKA_OWNER (0x84UL) #define CKA_ATTR_TYPES (0x85UL) #define CKA_TRUSTED (0x86UL) #define CKA_CERTIFICATE_CATEGORY (0x87UL) #define CKA_JAVA_MIDP_SECURITY_DOMAIN (0x88UL) #define CKA_URL (0x89UL) #define CKA_HASH_OF_SUBJECT_PUBLIC_KEY (0x8aUL) #define CKA_HASH_OF_ISSUER_PUBLIC_KEY (0x8bUL) #define CKA_CHECK_VALUE (0x90UL) #define CKA_KEY_TYPE (0x100UL) #define CKA_SUBJECT (0x101UL) #define CKA_ID (0x102UL) #define CKA_SENSITIVE (0x103UL) #define CKA_ENCRYPT (0x104UL) #define CKA_DECRYPT (0x105UL) #define CKA_WRAP (0x106UL) #define CKA_UNWRAP (0x107UL) #define CKA_SIGN (0x108UL) #define CKA_SIGN_RECOVER (0x109UL) #define CKA_VERIFY (0x10aUL) #define CKA_VERIFY_RECOVER (0x10bUL) #define CKA_DERIVE (0x10cUL) #define CKA_START_DATE (0x110UL) #define CKA_END_DATE (0x111UL) #define CKA_MODULUS (0x120UL) #define CKA_MODULUS_BITS (0x121UL) #define CKA_PUBLIC_EXPONENT (0x122UL) #define CKA_PRIVATE_EXPONENT (0x123UL) #define CKA_PRIME_1 (0x124UL) #define CKA_PRIME_2 (0x125UL) #define CKA_EXPONENT_1 (0x126UL) #define CKA_EXPONENT_2 (0x127UL) #define CKA_COEFFICIENT (0x128UL) #define CKA_PRIME (0x130UL) #define CKA_SUBPRIME (0x131UL) #define CKA_BASE (0x132UL) #define CKA_PRIME_BITS (0x133UL) #define CKA_SUB_PRIME_BITS (0x134UL) #define CKA_VALUE_BITS (0x160UL) #define CKA_VALUE_LEN (0x161UL) #define CKA_EXTRACTABLE (0x162UL) #define CKA_LOCAL (0x163UL) #define CKA_NEVER_EXTRACTABLE (0x164UL) #define CKA_ALWAYS_SENSITIVE (0x165UL) #define CKA_KEY_GEN_MECHANISM (0x166UL) #define CKA_MODIFIABLE (0x170UL) #define CKA_ECDSA_PARAMS (0x180UL) #define CKA_EC_PARAMS (0x180UL) #define CKA_EC_POINT (0x181UL) #define CKA_SECONDARY_AUTH (0x200UL) #define CKA_AUTH_PIN_FLAGS (0x201UL) #define CKA_ALWAYS_AUTHENTICATE (0x202UL) #define CKA_WRAP_WITH_TRUSTED (0x210UL) #define CKA_HW_FEATURE_TYPE (0x300UL) #define CKA_RESET_ON_INIT (0x301UL) #define CKA_HAS_RESET (0x302UL) #define CKA_PIXEL_X (0x400UL) #define CKA_PIXEL_Y (0x401UL) #define CKA_RESOLUTION (0x402UL) #define CKA_CHAR_ROWS (0x403UL) #define CKA_CHAR_COLUMNS (0x404UL) #define CKA_COLOR (0x405UL) #define CKA_BITS_PER_PIXEL (0x406UL) #define CKA_CHAR_SETS (0x480UL) #define CKA_ENCODING_METHODS (0x481UL) #define CKA_MIME_TYPES (0x482UL) #define CKA_MECHANISM_TYPE (0x500UL) #define CKA_REQUIRED_CMS_ATTRIBUTES (0x501UL) #define CKA_DEFAULT_CMS_ATTRIBUTES (0x502UL) #define CKA_SUPPORTED_CMS_ATTRIBUTES (0x503UL) #define CKA_WRAP_TEMPLATE (CKF_ARRAY_ATTRIBUTE | 0x211UL) #define CKA_UNWRAP_TEMPLATE (CKF_ARRAY_ATTRIBUTE | 0x212UL) #define CKA_ALLOWED_MECHANISMS (CKF_ARRAY_ATTRIBUTE | 0x600UL) #define CKA_VENDOR_DEFINED ((unsigned long) (1 << 31)) struct ck_attribute { ck_attribute_type_t type; void *value; unsigned long value_len; }; struct ck_date { unsigned char year[4]; unsigned char month[2]; unsigned char day[2]; }; typedef unsigned long ck_mechanism_type_t; #define CKM_RSA_PKCS_KEY_PAIR_GEN (0) #define CKM_RSA_PKCS (1) #define CKM_RSA_9796 (2) #define CKM_RSA_X_509 (3) #define CKM_MD2_RSA_PKCS (4) #define CKM_MD5_RSA_PKCS (5) #define CKM_SHA1_RSA_PKCS (6) #define CKM_RIPEMD128_RSA_PKCS (7) #define CKM_RIPEMD160_RSA_PKCS (8) #define CKM_RSA_PKCS_OAEP (9) #define CKM_RSA_X9_31_KEY_PAIR_GEN (0xa) #define CKM_RSA_X9_31 (0xb) #define CKM_SHA1_RSA_X9_31 (0xc) #define CKM_RSA_PKCS_PSS (0xd) #define CKM_SHA1_RSA_PKCS_PSS (0xe) #define CKM_DSA_KEY_PAIR_GEN (0x10) #define CKM_DSA (0x11) #define CKM_DSA_SHA1 (0x12) #define CKM_DH_PKCS_KEY_PAIR_GEN (0x20) #define CKM_DH_PKCS_DERIVE (0x21) #define CKM_X9_42_DH_KEY_PAIR_GEN (0x30) #define CKM_X9_42_DH_DERIVE (0x31) #define CKM_X9_42_DH_HYBRID_DERIVE (0x32) #define CKM_X9_42_MQV_DERIVE (0x33) #define CKM_SHA256_RSA_PKCS (0x40) #define CKM_SHA384_RSA_PKCS (0x41) #define CKM_SHA512_RSA_PKCS (0x42) #define CKM_SHA256_RSA_PKCS_PSS (0x43) #define CKM_SHA384_RSA_PKCS_PSS (0x44) #define CKM_SHA512_RSA_PKCS_PSS (0x45) #define CKM_RC2_KEY_GEN (0x100) #define CKM_RC2_ECB (0x101) #define CKM_RC2_CBC (0x102) #define CKM_RC2_MAC (0x103) #define CKM_RC2_MAC_GENERAL (0x104) #define CKM_RC2_CBC_PAD (0x105) #define CKM_RC4_KEY_GEN (0x110) #define CKM_RC4 (0x111) #define CKM_DES_KEY_GEN (0x120) #define CKM_DES_ECB (0x121) #define CKM_DES_CBC (0x122) #define CKM_DES_MAC (0x123) #define CKM_DES_MAC_GENERAL (0x124) #define CKM_DES_CBC_PAD (0x125) #define CKM_DES2_KEY_GEN (0x130) #define CKM_DES3_KEY_GEN (0x131) #define CKM_DES3_ECB (0x132) #define CKM_DES3_CBC (0x133) #define CKM_DES3_MAC (0x134) #define CKM_DES3_MAC_GENERAL (0x135) #define CKM_DES3_CBC_PAD (0x136) #define CKM_CDMF_KEY_GEN (0x140) #define CKM_CDMF_ECB (0x141) #define CKM_CDMF_CBC (0x142) #define CKM_CDMF_MAC (0x143) #define CKM_CDMF_MAC_GENERAL (0x144) #define CKM_CDMF_CBC_PAD (0x145) #define CKM_MD2 (0x200) #define CKM_MD2_HMAC (0x201) #define CKM_MD2_HMAC_GENERAL (0x202) #define CKM_MD5 (0x210) #define CKM_MD5_HMAC (0x211) #define CKM_MD5_HMAC_GENERAL (0x212) #define CKM_SHA_1 (0x220) #define CKM_SHA_1_HMAC (0x221) #define CKM_SHA_1_HMAC_GENERAL (0x222) #define CKM_RIPEMD128 (0x230) #define CKM_RIPEMD128_HMAC (0x231) #define CKM_RIPEMD128_HMAC_GENERAL (0x232) #define CKM_RIPEMD160 (0x240) #define CKM_RIPEMD160_HMAC (0x241) #define CKM_RIPEMD160_HMAC_GENERAL (0x242) #define CKM_SHA256 (0x250) #define CKM_SHA256_HMAC (0x251) #define CKM_SHA256_HMAC_GENERAL (0x252) #define CKM_SHA384 (0x260) #define CKM_SHA384_HMAC (0x261) #define CKM_SHA384_HMAC_GENERAL (0x262) #define CKM_SHA512 (0x270) #define CKM_SHA512_HMAC (0x271) #define CKM_SHA512_HMAC_GENERAL (0x272) #define CKM_CAST_KEY_GEN (0x300) #define CKM_CAST_ECB (0x301) #define CKM_CAST_CBC (0x302) #define CKM_CAST_MAC (0x303) #define CKM_CAST_MAC_GENERAL (0x304) #define CKM_CAST_CBC_PAD (0x305) #define CKM_CAST3_KEY_GEN (0x310) #define CKM_CAST3_ECB (0x311) #define CKM_CAST3_CBC (0x312) #define CKM_CAST3_MAC (0x313) #define CKM_CAST3_MAC_GENERAL (0x314) #define CKM_CAST3_CBC_PAD (0x315) #define CKM_CAST5_KEY_GEN (0x320) #define CKM_CAST128_KEY_GEN (0x320) #define CKM_CAST5_ECB (0x321) #define CKM_CAST128_ECB (0x321) #define CKM_CAST5_CBC (0x322) #define CKM_CAST128_CBC (0x322) #define CKM_CAST5_MAC (0x323) #define CKM_CAST128_MAC (0x323) #define CKM_CAST5_MAC_GENERAL (0x324) #define CKM_CAST128_MAC_GENERAL (0x324) #define CKM_CAST5_CBC_PAD (0x325) #define CKM_CAST128_CBC_PAD (0x325) #define CKM_RC5_KEY_GEN (0x330) #define CKM_RC5_ECB (0x331) #define CKM_RC5_CBC (0x332) #define CKM_RC5_MAC (0x333) #define CKM_RC5_MAC_GENERAL (0x334) #define CKM_RC5_CBC_PAD (0x335) #define CKM_IDEA_KEY_GEN (0x340) #define CKM_IDEA_ECB (0x341) #define CKM_IDEA_CBC (0x342) #define CKM_IDEA_MAC (0x343) #define CKM_IDEA_MAC_GENERAL (0x344) #define CKM_IDEA_CBC_PAD (0x345) #define CKM_GENERIC_SECRET_KEY_GEN (0x350) #define CKM_CONCATENATE_BASE_AND_KEY (0x360) #define CKM_CONCATENATE_BASE_AND_DATA (0x362) #define CKM_CONCATENATE_DATA_AND_BASE (0x363) #define CKM_XOR_BASE_AND_DATA (0x364) #define CKM_EXTRACT_KEY_FROM_KEY (0x365) #define CKM_SSL3_PRE_MASTER_KEY_GEN (0x370) #define CKM_SSL3_MASTER_KEY_DERIVE (0x371) #define CKM_SSL3_KEY_AND_MAC_DERIVE (0x372) #define CKM_SSL3_MASTER_KEY_DERIVE_DH (0x373) #define CKM_TLS_PRE_MASTER_KEY_GEN (0x374) #define CKM_TLS_MASTER_KEY_DERIVE (0x375) #define CKM_TLS_KEY_AND_MAC_DERIVE (0x376) #define CKM_TLS_MASTER_KEY_DERIVE_DH (0x377) #define CKM_SSL3_MD5_MAC (0x380) #define CKM_SSL3_SHA1_MAC (0x381) #define CKM_MD5_KEY_DERIVATION (0x390) #define CKM_MD2_KEY_DERIVATION (0x391) #define CKM_SHA1_KEY_DERIVATION (0x392) #define CKM_PBE_MD2_DES_CBC (0x3a0) #define CKM_PBE_MD5_DES_CBC (0x3a1) #define CKM_PBE_MD5_CAST_CBC (0x3a2) #define CKM_PBE_MD5_CAST3_CBC (0x3a3) #define CKM_PBE_MD5_CAST5_CBC (0x3a4) #define CKM_PBE_MD5_CAST128_CBC (0x3a4) #define CKM_PBE_SHA1_CAST5_CBC (0x3a5) #define CKM_PBE_SHA1_CAST128_CBC (0x3a5) #define CKM_PBE_SHA1_RC4_128 (0x3a6) #define CKM_PBE_SHA1_RC4_40 (0x3a7) #define CKM_PBE_SHA1_DES3_EDE_CBC (0x3a8) #define CKM_PBE_SHA1_DES2_EDE_CBC (0x3a9) #define CKM_PBE_SHA1_RC2_128_CBC (0x3aa) #define CKM_PBE_SHA1_RC2_40_CBC (0x3ab) #define CKM_PKCS5_PBKD2 (0x3b0) #define CKM_PBA_SHA1_WITH_SHA1_HMAC (0x3c0) #define CKM_KEY_WRAP_LYNKS (0x400) #define CKM_KEY_WRAP_SET_OAEP (0x401) #define CKM_SKIPJACK_KEY_GEN (0x1000) #define CKM_SKIPJACK_ECB64 (0x1001) #define CKM_SKIPJACK_CBC64 (0x1002) #define CKM_SKIPJACK_OFB64 (0x1003) #define CKM_SKIPJACK_CFB64 (0x1004) #define CKM_SKIPJACK_CFB32 (0x1005) #define CKM_SKIPJACK_CFB16 (0x1006) #define CKM_SKIPJACK_CFB8 (0x1007) #define CKM_SKIPJACK_WRAP (0x1008) #define CKM_SKIPJACK_PRIVATE_WRAP (0x1009) #define CKM_SKIPJACK_RELAYX (0x100a) #define CKM_KEA_KEY_PAIR_GEN (0x1010) #define CKM_KEA_KEY_DERIVE (0x1011) #define CKM_FORTEZZA_TIMESTAMP (0x1020) #define CKM_BATON_KEY_GEN (0x1030) #define CKM_BATON_ECB128 (0x1031) #define CKM_BATON_ECB96 (0x1032) #define CKM_BATON_CBC128 (0x1033) #define CKM_BATON_COUNTER (0x1034) #define CKM_BATON_SHUFFLE (0x1035) #define CKM_BATON_WRAP (0x1036) #define CKM_ECDSA_KEY_PAIR_GEN (0x1040) #define CKM_EC_KEY_PAIR_GEN (0x1040) #define CKM_ECDSA (0x1041) #define CKM_ECDSA_SHA1 (0x1042) #define CKM_ECDH1_DERIVE (0x1050) #define CKM_ECDH1_COFACTOR_DERIVE (0x1051) #define CKM_ECMQV_DERIVE (0x1052) #define CKM_JUNIPER_KEY_GEN (0x1060) #define CKM_JUNIPER_ECB128 (0x1061) #define CKM_JUNIPER_CBC128 (0x1062) #define CKM_JUNIPER_COUNTER (0x1063) #define CKM_JUNIPER_SHUFFLE (0x1064) #define CKM_JUNIPER_WRAP (0x1065) #define CKM_FASTHASH (0x1070) #define CKM_AES_KEY_GEN (0x1080) #define CKM_AES_ECB (0x1081) #define CKM_AES_CBC (0x1082) #define CKM_AES_MAC (0x1083) #define CKM_AES_MAC_GENERAL (0x1084) #define CKM_AES_CBC_PAD (0x1085) #define CKM_DSA_PARAMETER_GEN (0x2000) #define CKM_DH_PKCS_PARAMETER_GEN (0x2001) #define CKM_X9_42_DH_PARAMETER_GEN (0x2002) #define CKM_VENDOR_DEFINED ((unsigned long) (1 << 31)) struct ck_mechanism { ck_mechanism_type_t mechanism; void *parameter; unsigned long parameter_len; }; struct ck_mechanism_info { unsigned long min_key_size; unsigned long max_key_size; ck_flags_t flags; }; #define CKF_HW (1 << 0) #define CKF_ENCRYPT (1 << 8) #define CKF_DECRYPT (1 << 9) #define CKF_DIGEST (1 << 10) #define CKF_SIGN (1 << 11) #define CKF_SIGN_RECOVER (1 << 12) #define CKF_VERIFY (1 << 13) #define CKF_VERIFY_RECOVER (1 << 14) #define CKF_GENERATE (1 << 15) #define CKF_GENERATE_KEY_PAIR (1 << 16) #define CKF_WRAP (1 << 17) #define CKF_UNWRAP (1 << 18) #define CKF_DERIVE (1 << 19) #define CKF_EXTENSION ((unsigned long) (1 << 31)) /* Flags for C_WaitForSlotEvent. */ #define CKF_DONT_BLOCK (1) typedef unsigned long ck_rv_t; typedef ck_rv_t (*ck_notify_t) (ck_session_handle_t session, ck_notification_t event, void *application); /* Forward reference. */ struct ck_function_list; #define _CK_DECLARE_FUNCTION(name, args) \ typedef ck_rv_t (*CK_ ## name) args; \ ck_rv_t CK_SPEC name args _CK_DECLARE_FUNCTION (C_Initialize, (void *init_args)); _CK_DECLARE_FUNCTION (C_Finalize, (void *reserved)); _CK_DECLARE_FUNCTION (C_GetInfo, (struct ck_info *info)); _CK_DECLARE_FUNCTION (C_GetFunctionList, (struct ck_function_list **function_list)); _CK_DECLARE_FUNCTION (C_GetSlotList, (unsigned char token_present, ck_slot_id_t *slot_list, unsigned long *count)); _CK_DECLARE_FUNCTION (C_GetSlotInfo, (ck_slot_id_t slot_id, struct ck_slot_info *info)); _CK_DECLARE_FUNCTION (C_GetTokenInfo, (ck_slot_id_t slot_id, struct ck_token_info *info)); _CK_DECLARE_FUNCTION (C_WaitForSlotEvent, (ck_flags_t flags, ck_slot_id_t *slot, void *reserved)); _CK_DECLARE_FUNCTION (C_GetMechanismList, (ck_slot_id_t slot_id, ck_mechanism_type_t *mechanism_list, unsigned long *count)); _CK_DECLARE_FUNCTION (C_GetMechanismInfo, (ck_slot_id_t slot_id, ck_mechanism_type_t type, struct ck_mechanism_info *info)); _CK_DECLARE_FUNCTION (C_InitToken, (ck_slot_id_t slot_id, unsigned char *pin, unsigned long pin_len, unsigned char *label)); _CK_DECLARE_FUNCTION (C_InitPIN, (ck_session_handle_t session, unsigned char *pin, unsigned long pin_len)); _CK_DECLARE_FUNCTION (C_SetPIN, (ck_session_handle_t session, unsigned char *old_pin, unsigned long old_len, unsigned char *new_pin, unsigned long new_len)); _CK_DECLARE_FUNCTION (C_OpenSession, (ck_slot_id_t slot_id, ck_flags_t flags, void *application, ck_notify_t notify, ck_session_handle_t *session)); _CK_DECLARE_FUNCTION (C_CloseSession, (ck_session_handle_t session)); _CK_DECLARE_FUNCTION (C_CloseAllSessions, (ck_slot_id_t slot_id)); _CK_DECLARE_FUNCTION (C_GetSessionInfo, (ck_session_handle_t session, struct ck_session_info *info)); _CK_DECLARE_FUNCTION (C_GetOperationState, (ck_session_handle_t session, unsigned char *operation_state, unsigned long *operation_state_len)); _CK_DECLARE_FUNCTION (C_SetOperationState, (ck_session_handle_t session, unsigned char *operation_state, unsigned long operation_state_len, ck_object_handle_t encryption_key, ck_object_handle_t authentiation_key)); _CK_DECLARE_FUNCTION (C_Login, (ck_session_handle_t session, ck_user_type_t user_type, unsigned char *pin, unsigned long pin_len)); _CK_DECLARE_FUNCTION (C_Logout, (ck_session_handle_t session)); _CK_DECLARE_FUNCTION (C_CreateObject, (ck_session_handle_t session, struct ck_attribute *templ, unsigned long count, ck_object_handle_t *object)); _CK_DECLARE_FUNCTION (C_CopyObject, (ck_session_handle_t session, ck_object_handle_t object, struct ck_attribute *templ, unsigned long count, ck_object_handle_t *new_object)); _CK_DECLARE_FUNCTION (C_DestroyObject, (ck_session_handle_t session, ck_object_handle_t object)); _CK_DECLARE_FUNCTION (C_GetObjectSize, (ck_session_handle_t session, ck_object_handle_t object, unsigned long *size)); _CK_DECLARE_FUNCTION (C_GetAttributeValue, (ck_session_handle_t session, ck_object_handle_t object, struct ck_attribute *templ, unsigned long count)); _CK_DECLARE_FUNCTION (C_SetAttributeValue, (ck_session_handle_t session, ck_object_handle_t object, struct ck_attribute *templ, unsigned long count)); _CK_DECLARE_FUNCTION (C_FindObjectsInit, (ck_session_handle_t session, struct ck_attribute *templ, unsigned long count)); _CK_DECLARE_FUNCTION (C_FindObjects, (ck_session_handle_t session, ck_object_handle_t *object, unsigned long max_object_count, unsigned long *object_count)); _CK_DECLARE_FUNCTION (C_FindObjectsFinal, (ck_session_handle_t session)); _CK_DECLARE_FUNCTION (C_EncryptInit, (ck_session_handle_t session, struct ck_mechanism *mechanism, ck_object_handle_t key)); _CK_DECLARE_FUNCTION (C_Encrypt, (ck_session_handle_t session, unsigned char *data, unsigned long data_len, unsigned char *encrypted_data, unsigned long *encrypted_data_len)); _CK_DECLARE_FUNCTION (C_EncryptUpdate, (ck_session_handle_t session, unsigned char *part, unsigned long part_len, unsigned char *encrypted_part, unsigned long *encrypted_part_len)); _CK_DECLARE_FUNCTION (C_EncryptFinal, (ck_session_handle_t session, unsigned char *last_encrypted_part, unsigned long *last_encrypted_part_len)); _CK_DECLARE_FUNCTION (C_DecryptInit, (ck_session_handle_t session, struct ck_mechanism *mechanism, ck_object_handle_t key)); _CK_DECLARE_FUNCTION (C_Decrypt, (ck_session_handle_t session, unsigned char *encrypted_data, unsigned long encrypted_data_len, unsigned char *data, unsigned long *data_len)); _CK_DECLARE_FUNCTION (C_DecryptUpdate, (ck_session_handle_t session, unsigned char *encrypted_part, unsigned long encrypted_part_len, unsigned char *part, unsigned long *part_len)); _CK_DECLARE_FUNCTION (C_DecryptFinal, (ck_session_handle_t session, unsigned char *last_part, unsigned long *last_part_len)); _CK_DECLARE_FUNCTION (C_DigestInit, (ck_session_handle_t session, struct ck_mechanism *mechanism)); _CK_DECLARE_FUNCTION (C_Digest, (ck_session_handle_t session, unsigned char *data, unsigned long data_len, unsigned char *digest, unsigned long *digest_len)); _CK_DECLARE_FUNCTION (C_DigestUpdate, (ck_session_handle_t session, unsigned char *part, unsigned long part_len)); _CK_DECLARE_FUNCTION (C_DigestKey, (ck_session_handle_t session, ck_object_handle_t key)); _CK_DECLARE_FUNCTION (C_DigestFinal, (ck_session_handle_t session, unsigned char *digest, unsigned long *digest_len)); _CK_DECLARE_FUNCTION (C_SignInit, (ck_session_handle_t session, struct ck_mechanism *mechanism, ck_object_handle_t key)); _CK_DECLARE_FUNCTION (C_Sign, (ck_session_handle_t session, unsigned char *data, unsigned long data_len, unsigned char *signature, unsigned long *signature_len)); _CK_DECLARE_FUNCTION (C_SignUpdate, (ck_session_handle_t session, unsigned char *part, unsigned long part_len)); _CK_DECLARE_FUNCTION (C_SignFinal, (ck_session_handle_t session, unsigned char *signature, unsigned long *signature_len)); _CK_DECLARE_FUNCTION (C_SignRecoverInit, (ck_session_handle_t session, struct ck_mechanism *mechanism, ck_object_handle_t key)); _CK_DECLARE_FUNCTION (C_SignRecover, (ck_session_handle_t session, unsigned char *data, unsigned long data_len, unsigned char *signature, unsigned long *signature_len)); _CK_DECLARE_FUNCTION (C_VerifyInit, (ck_session_handle_t session, struct ck_mechanism *mechanism, ck_object_handle_t key)); _CK_DECLARE_FUNCTION (C_Verify, (ck_session_handle_t session, unsigned char *data, unsigned long data_len, unsigned char *signature, unsigned long signature_len)); _CK_DECLARE_FUNCTION (C_VerifyUpdate, (ck_session_handle_t session, unsigned char *part, unsigned long part_len)); _CK_DECLARE_FUNCTION (C_VerifyFinal, (ck_session_handle_t session, unsigned char *signature, unsigned long signature_len)); _CK_DECLARE_FUNCTION (C_VerifyRecoverInit, (ck_session_handle_t session, struct ck_mechanism *mechanism, ck_object_handle_t key)); _CK_DECLARE_FUNCTION (C_VerifyRecover, (ck_session_handle_t session, unsigned char *signature, unsigned long signature_len, unsigned char *data, unsigned long *data_len)); _CK_DECLARE_FUNCTION (C_DigestEncryptUpdate, (ck_session_handle_t session, unsigned char *part, unsigned long part_len, unsigned char *encrypted_part, unsigned long *encrypted_part_len)); _CK_DECLARE_FUNCTION (C_DecryptDigestUpdate, (ck_session_handle_t session, unsigned char *encrypted_part, unsigned long encrypted_part_len, unsigned char *part, unsigned long *part_len)); _CK_DECLARE_FUNCTION (C_SignEncryptUpdate, (ck_session_handle_t session, unsigned char *part, unsigned long part_len, unsigned char *encrypted_part, unsigned long *encrypted_part_len)); _CK_DECLARE_FUNCTION (C_DecryptVerifyUpdate, (ck_session_handle_t session, unsigned char *encrypted_part, unsigned long encrypted_part_len, unsigned char *part, unsigned long *part_len)); _CK_DECLARE_FUNCTION (C_GenerateKey, (ck_session_handle_t session, struct ck_mechanism *mechanism, struct ck_attribute *templ, unsigned long count, ck_object_handle_t *key)); _CK_DECLARE_FUNCTION (C_GenerateKeyPair, (ck_session_handle_t session, struct ck_mechanism *mechanism, struct ck_attribute *public_key_template, unsigned long public_key_attribute_count, struct ck_attribute *private_key_template, unsigned long private_key_attribute_count, ck_object_handle_t *public_key, ck_object_handle_t *private_key)); _CK_DECLARE_FUNCTION (C_WrapKey, (ck_session_handle_t session, struct ck_mechanism *mechanism, ck_object_handle_t wrapping_key, ck_object_handle_t key, unsigned char *wrapped_key, unsigned long *wrapped_key_len)); _CK_DECLARE_FUNCTION (C_UnwrapKey, (ck_session_handle_t session, struct ck_mechanism *mechanism, ck_object_handle_t unwrapping_key, unsigned char *wrapped_key, unsigned long wrapped_key_len, struct ck_attribute *templ, unsigned long attribute_count, ck_object_handle_t *key)); _CK_DECLARE_FUNCTION (C_DeriveKey, (ck_session_handle_t session, struct ck_mechanism *mechanism, ck_object_handle_t base_key, struct ck_attribute *templ, unsigned long attribute_count, ck_object_handle_t *key)); _CK_DECLARE_FUNCTION (C_SeedRandom, (ck_session_handle_t session, unsigned char *seed, unsigned long seed_len)); _CK_DECLARE_FUNCTION (C_GenerateRandom, (ck_session_handle_t session, unsigned char *random_data, unsigned long random_len)); _CK_DECLARE_FUNCTION (C_GetFunctionStatus, (ck_session_handle_t session)); _CK_DECLARE_FUNCTION (C_CancelFunction, (ck_session_handle_t session)); struct ck_function_list { struct ck_version version; CK_C_Initialize C_Initialize; CK_C_Finalize C_Finalize; CK_C_GetInfo C_GetInfo; CK_C_GetFunctionList C_GetFunctionList; CK_C_GetSlotList C_GetSlotList; CK_C_GetSlotInfo C_GetSlotInfo; CK_C_GetTokenInfo C_GetTokenInfo; CK_C_GetMechanismList C_GetMechanismList; CK_C_GetMechanismInfo C_GetMechanismInfo; CK_C_InitToken C_InitToken; CK_C_InitPIN C_InitPIN; CK_C_SetPIN C_SetPIN; CK_C_OpenSession C_OpenSession; CK_C_CloseSession C_CloseSession; CK_C_CloseAllSessions C_CloseAllSessions; CK_C_GetSessionInfo C_GetSessionInfo; CK_C_GetOperationState C_GetOperationState; CK_C_SetOperationState C_SetOperationState; CK_C_Login C_Login; CK_C_Logout C_Logout; CK_C_CreateObject C_CreateObject; CK_C_CopyObject C_CopyObject; CK_C_DestroyObject C_DestroyObject; CK_C_GetObjectSize C_GetObjectSize; CK_C_GetAttributeValue C_GetAttributeValue; CK_C_SetAttributeValue C_SetAttributeValue; CK_C_FindObjectsInit C_FindObjectsInit; CK_C_FindObjects C_FindObjects; CK_C_FindObjectsFinal C_FindObjectsFinal; CK_C_EncryptInit C_EncryptInit; CK_C_Encrypt C_Encrypt; CK_C_EncryptUpdate C_EncryptUpdate; CK_C_EncryptFinal C_EncryptFinal; CK_C_DecryptInit C_DecryptInit; CK_C_Decrypt C_Decrypt; CK_C_DecryptUpdate C_DecryptUpdate; CK_C_DecryptFinal C_DecryptFinal; CK_C_DigestInit C_DigestInit; CK_C_Digest C_Digest; CK_C_DigestUpdate C_DigestUpdate; CK_C_DigestKey C_DigestKey; CK_C_DigestFinal C_DigestFinal; CK_C_SignInit C_SignInit; CK_C_Sign C_Sign; CK_C_SignUpdate C_SignUpdate; CK_C_SignFinal C_SignFinal; CK_C_SignRecoverInit C_SignRecoverInit; CK_C_SignRecover C_SignRecover; CK_C_VerifyInit C_VerifyInit; CK_C_Verify C_Verify; CK_C_VerifyUpdate C_VerifyUpdate; CK_C_VerifyFinal C_VerifyFinal; CK_C_VerifyRecoverInit C_VerifyRecoverInit; CK_C_VerifyRecover C_VerifyRecover; CK_C_DigestEncryptUpdate C_DigestEncryptUpdate; CK_C_DecryptDigestUpdate C_DecryptDigestUpdate; CK_C_SignEncryptUpdate C_SignEncryptUpdate; CK_C_DecryptVerifyUpdate C_DecryptVerifyUpdate; CK_C_GenerateKey C_GenerateKey; CK_C_GenerateKeyPair C_GenerateKeyPair; CK_C_WrapKey C_WrapKey; CK_C_UnwrapKey C_UnwrapKey; CK_C_DeriveKey C_DeriveKey; CK_C_SeedRandom C_SeedRandom; CK_C_GenerateRandom C_GenerateRandom; CK_C_GetFunctionStatus C_GetFunctionStatus; CK_C_CancelFunction C_CancelFunction; CK_C_WaitForSlotEvent C_WaitForSlotEvent; }; typedef ck_rv_t (*ck_createmutex_t) (void **mutex); typedef ck_rv_t (*ck_destroymutex_t) (void *mutex); typedef ck_rv_t (*ck_lockmutex_t) (void *mutex); typedef ck_rv_t (*ck_unlockmutex_t) (void *mutex); struct ck_c_initialize_args { ck_createmutex_t create_mutex; ck_destroymutex_t destroy_mutex; ck_lockmutex_t lock_mutex; ck_unlockmutex_t unlock_mutex; ck_flags_t flags; void *reserved; }; #define CKF_LIBRARY_CANT_CREATE_OS_THREADS (1 << 0) #define CKF_OS_LOCKING_OK (1 << 1) #define CKR_OK (0) #define CKR_CANCEL (1) #define CKR_HOST_MEMORY (2) #define CKR_SLOT_ID_INVALID (3) #define CKR_GENERAL_ERROR (5) #define CKR_FUNCTION_FAILED (6) #define CKR_ARGUMENTS_BAD (7) #define CKR_NO_EVENT (8) #define CKR_NEED_TO_CREATE_THREADS (9) #define CKR_CANT_LOCK (0xa) #define CKR_ATTRIBUTE_READ_ONLY (0x10) #define CKR_ATTRIBUTE_SENSITIVE (0x11) #define CKR_ATTRIBUTE_TYPE_INVALID (0x12) #define CKR_ATTRIBUTE_VALUE_INVALID (0x13) #define CKR_DATA_INVALID (0x20) #define CKR_DATA_LEN_RANGE (0x21) #define CKR_DEVICE_ERROR (0x30) #define CKR_DEVICE_MEMORY (0x31) #define CKR_DEVICE_REMOVED (0x32) #define CKR_ENCRYPTED_DATA_INVALID (0x40) #define CKR_ENCRYPTED_DATA_LEN_RANGE (0x41) #define CKR_FUNCTION_CANCELED (0x50) #define CKR_FUNCTION_NOT_PARALLEL (0x51) #define CKR_FUNCTION_NOT_SUPPORTED (0x54) #define CKR_KEY_HANDLE_INVALID (0x60) #define CKR_KEY_SIZE_RANGE (0x62) #define CKR_KEY_TYPE_INCONSISTENT (0x63) #define CKR_KEY_NOT_NEEDED (0x64) #define CKR_KEY_CHANGED (0x65) #define CKR_KEY_NEEDED (0x66) #define CKR_KEY_INDIGESTIBLE (0x67) #define CKR_KEY_FUNCTION_NOT_PERMITTED (0x68) #define CKR_KEY_NOT_WRAPPABLE (0x69) #define CKR_KEY_UNEXTRACTABLE (0x6a) #define CKR_MECHANISM_INVALID (0x70) #define CKR_MECHANISM_PARAM_INVALID (0x71) #define CKR_OBJECT_HANDLE_INVALID (0x82) #define CKR_OPERATION_ACTIVE (0x90) #define CKR_OPERATION_NOT_INITIALIZED (0x91) #define CKR_PIN_INCORRECT (0xa0) #define CKR_PIN_INVALID (0xa1) #define CKR_PIN_LEN_RANGE (0xa2) #define CKR_PIN_EXPIRED (0xa3) #define CKR_PIN_LOCKED (0xa4) #define CKR_SESSION_CLOSED (0xb0) #define CKR_SESSION_COUNT (0xb1) #define CKR_SESSION_HANDLE_INVALID (0xb3) #define CKR_SESSION_PARALLEL_NOT_SUPPORTED (0xb4) #define CKR_SESSION_READ_ONLY (0xb5) #define CKR_SESSION_EXISTS (0xb6) #define CKR_SESSION_READ_ONLY_EXISTS (0xb7) #define CKR_SESSION_READ_WRITE_SO_EXISTS (0xb8) #define CKR_SIGNATURE_INVALID (0xc0) #define CKR_SIGNATURE_LEN_RANGE (0xc1) #define CKR_TEMPLATE_INCOMPLETE (0xd0) #define CKR_TEMPLATE_INCONSISTENT (0xd1) #define CKR_TOKEN_NOT_PRESENT (0xe0) #define CKR_TOKEN_NOT_RECOGNIZED (0xe1) #define CKR_TOKEN_WRITE_PROTECTED (0xe2) #define CKR_UNWRAPPING_KEY_HANDLE_INVALID (0xf0) #define CKR_UNWRAPPING_KEY_SIZE_RANGE (0xf1) #define CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT (0xf2) #define CKR_USER_ALREADY_LOGGED_IN (0x100) #define CKR_USER_NOT_LOGGED_IN (0x101) #define CKR_USER_PIN_NOT_INITIALIZED (0x102) #define CKR_USER_TYPE_INVALID (0x103) #define CKR_USER_ANOTHER_ALREADY_LOGGED_IN (0x104) #define CKR_USER_TOO_MANY_TYPES (0x105) #define CKR_WRAPPED_KEY_INVALID (0x110) #define CKR_WRAPPED_KEY_LEN_RANGE (0x112) #define CKR_WRAPPING_KEY_HANDLE_INVALID (0x113) #define CKR_WRAPPING_KEY_SIZE_RANGE (0x114) #define CKR_WRAPPING_KEY_TYPE_INCONSISTENT (0x115) #define CKR_RANDOM_SEED_NOT_SUPPORTED (0x120) #define CKR_RANDOM_NO_RNG (0x121) #define CKR_DOMAIN_PARAMS_INVALID (0x130) #define CKR_BUFFER_TOO_SMALL (0x150) #define CKR_SAVED_STATE_INVALID (0x160) #define CKR_INFORMATION_SENSITIVE (0x170) #define CKR_STATE_UNSAVEABLE (0x180) #define CKR_CRYPTOKI_NOT_INITIALIZED (0x190) #define CKR_CRYPTOKI_ALREADY_INITIALIZED (0x191) #define CKR_MUTEX_BAD (0x1a0) #define CKR_MUTEX_NOT_LOCKED (0x1a1) #define CKR_FUNCTION_REJECTED (0x200) #define CKR_VENDOR_DEFINED ((unsigned long) (1 << 31)) /* Compatibility layer. */ #ifdef CRYPTOKI_COMPAT #undef CK_DEFINE_FUNCTION #define CK_DEFINE_FUNCTION(retval, name) retval CK_SPEC name /* For NULL. */ #include <stddef.h> typedef unsigned char CK_BYTE; typedef unsigned char CK_CHAR; typedef unsigned char CK_UTF8CHAR; typedef unsigned char CK_BBOOL; typedef unsigned long int CK_ULONG; typedef long int CK_LONG; typedef CK_BYTE *CK_BYTE_PTR; typedef CK_CHAR *CK_CHAR_PTR; typedef CK_UTF8CHAR *CK_UTF8CHAR_PTR; typedef CK_ULONG *CK_ULONG_PTR; typedef void *CK_VOID_PTR; typedef void **CK_VOID_PTR_PTR; #define CK_FALSE 0 #define CK_TRUE 1 #ifndef CK_DISABLE_TRUE_FALSE #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #endif typedef struct ck_version CK_VERSION; typedef struct ck_version *CK_VERSION_PTR; typedef struct ck_info CK_INFO; typedef struct ck_info *CK_INFO_PTR; typedef ck_slot_id_t *CK_SLOT_ID_PTR; typedef struct ck_slot_info CK_SLOT_INFO; typedef struct ck_slot_info *CK_SLOT_INFO_PTR; typedef struct ck_token_info CK_TOKEN_INFO; typedef struct ck_token_info *CK_TOKEN_INFO_PTR; typedef ck_session_handle_t *CK_SESSION_HANDLE_PTR; typedef struct ck_session_info CK_SESSION_INFO; typedef struct ck_session_info *CK_SESSION_INFO_PTR; typedef ck_object_handle_t *CK_OBJECT_HANDLE_PTR; typedef ck_object_class_t *CK_OBJECT_CLASS_PTR; typedef struct ck_attribute CK_ATTRIBUTE; typedef struct ck_attribute *CK_ATTRIBUTE_PTR; typedef struct ck_date CK_DATE; typedef struct ck_date *CK_DATE_PTR; typedef ck_mechanism_type_t *CK_MECHANISM_TYPE_PTR; typedef struct ck_mechanism CK_MECHANISM; typedef struct ck_mechanism *CK_MECHANISM_PTR; typedef struct ck_mechanism_info CK_MECHANISM_INFO; typedef struct ck_mechanism_info *CK_MECHANISM_INFO_PTR; typedef struct ck_function_list CK_FUNCTION_LIST; typedef struct ck_function_list *CK_FUNCTION_LIST_PTR; typedef struct ck_function_list **CK_FUNCTION_LIST_PTR_PTR; typedef struct ck_c_initialize_args CK_C_INITIALIZE_ARGS; typedef struct ck_c_initialize_args *CK_C_INITIALIZE_ARGS_PTR; #define NULL_PTR NULL /* Delete the helper macros defined at the top of the file. */ #undef ck_flags_t #undef ck_version #undef ck_info #undef cryptoki_version #undef manufacturer_id #undef library_description #undef library_version #undef ck_notification_t #undef ck_slot_id_t #undef ck_slot_info #undef slot_description #undef hardware_version #undef firmware_version #undef ck_token_info #undef serial_number #undef max_session_count #undef session_count #undef max_rw_session_count #undef rw_session_count #undef max_pin_len #undef min_pin_len #undef total_public_memory #undef free_public_memory #undef total_private_memory #undef free_private_memory #undef utc_time #undef ck_session_handle_t #undef ck_user_type_t #undef ck_state_t #undef ck_session_info #undef slot_id #undef device_error #undef ck_object_handle_t #undef ck_object_class_t #undef ck_hw_feature_type_t #undef ck_key_type_t #undef ck_certificate_type_t #undef ck_attribute_type_t #undef ck_attribute #undef value #undef value_len #undef ck_date #undef ck_mechanism_type_t #undef ck_mechanism #undef parameter #undef parameter_len #undef ck_mechanism_info #undef min_key_size #undef max_key_size #undef ck_rv_t #undef ck_notify_t #undef ck_function_list #undef ck_createmutex_t #undef ck_destroymutex_t #undef ck_lockmutex_t #undef ck_unlockmutex_t #undef ck_c_initialize_args #undef create_mutex #undef destroy_mutex #undef lock_mutex #undef unlock_mutex #undef reserved #endif /* CRYPTOKI_COMPAT */ /* System dependencies. */ #if defined(_WIN32) || defined(CRYPTOKI_FORCE_WIN32) #pragma pack(pop, cryptoki) #endif #if defined(__cplusplus) } #endif #endif /* PKCS11_H */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pass_info.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000000763�11753427512�0015630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #include <QtCore/QString> #include <QtGui/QWidget> #include <QtGui/QApplication> #include "pass_info.h" pass_info::pass_info(QString t, QString d, QWidget *w) { title = t; description = d; widget = w; if (!widget) widget = qApp->activeWindow(); type = tr("Password"); pixmap = MainWindow::keyImg; } void pass_info::setPin() { type = tr("PIN"); pixmap = MainWindow::scardImg; } �������������xca_0.9.3/lib/pass_info.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001566�11753427512�0015277�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PASS_INFO_H #define __PASS_INFO_H #include <QtCore/QString> #include <QtCore/QObject> #include <QtGui/QWidget> #include "widgets/MainWindow.h" class pass_info: public QObject { Q_OBJECT private: QString title; QString description; QWidget *widget; QString type; QPixmap *pixmap; public: pass_info(QString t, QString d, QWidget *w = NULL); QString getTitle() { return title; } QString getDescription() { return description; } QWidget *getWidget() { return widget; } QString getType() { return type; } QPixmap getImage() { return QPixmap(*pixmap); } void setTitle(QString t) { title = t; } void setDescription(QString d) { description = d; } void setWidget(QWidget *w) { widget = w; } void setPin(); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pk11_attribute.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000006156�11753427512�0016510�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "pkcs11.h" #include "pk11_attribute.h" #include "exception.h" #include <QtCore/QObject> void pk11_attribute::load(slotid slot, CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj) { CK_RV rv; rv = slot.p11()->C_GetAttributeValue(sess, obj, &attr, 1); if (rv != CKR_OK) pk11error("C_GetAttribute()", rv); } void pk11_attr_data::load(slotid slot, CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj) { CK_RV rv; if (attr.pValue) { free(attr.pValue); attr.pValue = NULL; } attr.ulValueLen = 0; rv = slot.p11()->C_GetAttributeValue(sess, obj, &attr, 1); if (rv == CKR_OK) { attr.pValue = malloc(attr.ulValueLen +1); check_oom(attr.pValue); rv = slot.p11()->C_GetAttributeValue(sess, obj, &attr, 1); \ if (rv == CKR_OK) return; } pk11error("C_GetAttributeValue(data)", rv); \ } void pk11_attr_data::setValue(const unsigned char *ptr, unsigned long len) { if (attr.pValue) free(attr.pValue); if (!ptr || len == 0) { attr.ulValueLen = 0; attr.pValue = NULL; return; } attr.pValue = malloc(len+1); check_oom(attr.pValue); memcpy(attr.pValue, ptr, len); attr.ulValueLen = len; ((char*)attr.pValue)[len] = 0; } void pk11_attr_data::setBignum(BIGNUM *bn, bool consume) { attr.ulValueLen = BN_num_bytes(bn); if (attr.pValue) free(attr.pValue); attr.pValue = malloc(attr.ulValueLen); check_oom(attr.pValue); attr.ulValueLen = BN_bn2bin(bn, (unsigned char *)attr.pValue); if (consume) BN_free(bn); } void pk11_attribute::store(slotid slot, CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj) { CK_RV rv; rv = slot.p11()->C_SetAttributeValue(sess, obj, &attr, 1); if (rv != CKR_OK) pk11error("C_SetAttributeValue", rv); } void pk11_attlist::copy(const pk11_attlist &a) { reset(); attlen = a.attlen; alloc_len = a.alloc_len; if (alloc_len) { attributes = (CK_ATTRIBUTE *)malloc(alloc_len *sizeof(*attributes)); check_oom(attributes); memcpy(attributes, a.attributes, attlen *sizeof(*attributes)); } for (unsigned long i=0; i<attlen; i++) { char *p = (char*)malloc(attributes[i].ulValueLen +1); check_oom(p); memcpy(p, a.attributes[i].pValue, attributes[i].ulValueLen); p[attributes[i].ulValueLen] = '\0'; attributes[i].pValue = p; } } pk11_attlist::pk11_attlist(const pk11_attlist &a) { copy(a); } pk11_attlist::~pk11_attlist() { for (unsigned long i=0; i<attlen; i++) free(attributes[i].pValue); if (attributes) free(attributes); } void pk11_attlist::addAttribute(const pk11_attribute &a) { CK_ATTRIBUTE *attr; if (attlen == alloc_len) { alloc_len = alloc_len ? alloc_len *2 : 16; attributes = (CK_ATTRIBUTE *)realloc(attributes, alloc_len * sizeof(*attributes)); check_oom(attributes); } attr = attributes + attlen++; attr->type = a.attr.type; attr->ulValueLen = a.attr.ulValueLen; attr->pValue = malloc(attr->ulValueLen +1); check_oom(attr->pValue); memcpy(attr->pValue, a.attr.pValue, attr->ulValueLen); ((char*)attr->pValue)[attr->ulValueLen] = 0; } void pk11_attlist::reset() { for (unsigned long i=0; i<attlen; i++) free(attributes[i].pValue); attlen = 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pk11_attribute.h����������������������������������������������������������������������0000664�0000000�0000000�00000012030�11753427512�0016141�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_PKCS11_ATTRIBUTE_H #define __PKI_PKCS11_ATTRIBUTE_H #include <QtCore/QString> #include <stdlib.h> #include <openssl/bn.h> #include "opensc-pkcs11.h" #include "exception.h" #define UTF8QSTRING(x,s) QString::fromUtf8((const char*)(x), s).trimmed() #define ASCIIQSTRING(x,s) QString::fromAscii((const char*)(x), s).trimmed() class pk11_attlist; class pk11_attribute { friend class pk11_attlist; protected: CK_ATTRIBUTE attr; public: pk11_attribute(unsigned long type) { memset(&attr, 0, sizeof(attr)); attr.type = type; } virtual ~pk11_attribute() { } const CK_ATTRIBUTE *getAttribute() const { return &attr; } unsigned long type() const { return attr.type; } QByteArray getData() const { return QByteArray((char*)attr.pValue, attr.ulValueLen); } virtual void store(slotid slot, CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj); virtual void load(slotid slot, CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj); bool cmp(const pk11_attribute &other) const { return (attr.type == other.attr.type) && (attr.ulValueLen == other.attr.ulValueLen) && !memcmp(attr.pValue, other.attr.pValue, attr.ulValueLen); } bool operator == (const pk11_attribute &other) const { return cmp(other); } }; class pk11_attr_bool: public pk11_attribute { protected: unsigned char value; public: pk11_attr_bool(unsigned long type, bool v = false) :pk11_attribute(type) { attr.pValue = &value; attr.ulValueLen = sizeof(value); setValue(v); } pk11_attr_bool(const pk11_attr_bool &p) :pk11_attribute(p.type()) { attr.pValue = &value; attr.ulValueLen = sizeof(value); setValue(p.value); } bool getValue() const { return value ? true : false; } void setValue(unsigned long v) { value = v ? 1 : 0; } }; class pk11_attr_ulong: public pk11_attribute { protected: unsigned long value; public: pk11_attr_ulong(unsigned long type, unsigned long v = 0) :pk11_attribute(type) { attr.pValue = &value; attr.ulValueLen = sizeof(value); setValue(v); } pk11_attr_ulong(const pk11_attr_ulong &p) :pk11_attribute(p.type()) { attr.pValue = &value; attr.ulValueLen = sizeof(value); setValue(p.value); } unsigned long getValue() const { return value; } void setValue(unsigned long v) { value = v; } }; class pk11_attr_data: public pk11_attribute { public: pk11_attr_data() :pk11_attribute(0) { } pk11_attr_data(unsigned long type, const unsigned char *v = NULL, unsigned long len = 0) :pk11_attribute(type) { setValue(v, len); } pk11_attr_data(const pk11_attr_data &p) :pk11_attribute(p.type()) { const unsigned char *ptr; unsigned long size = p.getValue(&ptr); setValue(ptr, size); } pk11_attr_data(unsigned long type, QByteArray ba) :pk11_attribute(type) { setValue((const unsigned char *)ba.constData(), ba.size()); } pk11_attr_data(unsigned long type, BIGNUM *bn, bool consume=true) :pk11_attribute(type) { setBignum(bn, consume); } pk11_attr_data(unsigned long type, unsigned long value) :pk11_attribute(type) { setULong(value); } void setULong(unsigned long value) { BIGNUM *bn = BN_new(); check_oom(bn); check_oom(BN_set_word(bn, value)); setBignum(bn, true); } unsigned long getValue(const unsigned char **ptr) const { *ptr = (const unsigned char*)attr.pValue; return attr.ulValueLen; } ~pk11_attr_data() { if (attr.pValue) free(attr.pValue); } QString getText() const { unsigned long len = attr.ulValueLen; char *p = (char*)attr.pValue; /* Fixup 0 padded attributes, returned by some broken libs like OpenLimit */ while (p[len-1] == 0 && len > 0) len--; return UTF8QSTRING(attr.pValue, len); } BIGNUM *getBignum() const { return BN_bin2bn((unsigned char*)attr.pValue, attr.ulValueLen, NULL); } void setBignum(BIGNUM *bn, bool consume=true); void load(slotid slot, CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj); void setValue(const unsigned char *ptr, unsigned long len); pk11_attr_data &operator = (const pk11_attr_data &p) { const unsigned char *ptr; unsigned long size = p.getValue(&ptr); attr.type = p.attr.type; setValue(ptr, size); return *this; } }; class pk11_attlist { private: CK_ATTRIBUTE *attributes; unsigned long attlen; unsigned long alloc_len; void init() { attlen = 0; alloc_len = 0; attributes = NULL; } public: pk11_attlist() { init(); } pk11_attlist(const pk11_attlist &a); pk11_attlist(const pk11_attribute &a) { init(); addAttribute(a); } ~pk11_attlist(); unsigned long get(CK_ATTRIBUTE **attp) { *attp = attributes; return attlen; } void addAttribute(const pk11_attribute &a); pk11_attlist &operator << (const pk11_attribute &a) { addAttribute(a); return *this; } CK_ATTRIBUTE *getAttributes() { return attributes; } unsigned long length() { return attlen; } pk11_attlist &operator = (const pk11_attlist &a) { copy(a); return *this; } void copy(const pk11_attlist &a); void reset(); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pkcs11.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000034402�11753427512�0014746�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "pkcs11_lib.h" #include "pkcs11.h" #include "pk11_attribute.h" #include "exception.h" #include "db_base.h" #include "func.h" #include "pass_info.h" #include "Passwd.h" #include <openssl/rand.h> #include <QtGui/QMessageBox> #include <QtCore/QThread> #include <ltdl.h> #include "ui_SelectToken.h" #include "widgets/PwDialog.h" pkcs11_lib_list pkcs11::libs; pkcs11::pkcs11() { session = CK_INVALID_HANDLE; p11obj = CK_INVALID_HANDLE; } pkcs11::~pkcs11() { if (session != CK_INVALID_HANDLE && p11slot.p11()) { WAITCURSOR_START; p11slot.p11()->C_CloseSession(session); WAITCURSOR_END; } } pkcs11_lib *pkcs11::load_lib(QString fname, bool silent) { pkcs11_lib *l; if (fname.isEmpty()) return NULL; try { l = libs.add_lib(fname); } catch (errorEx &ex) { if (silent) return NULL; throw ex; } return l; } void pkcs11::load_libs(QString list, bool silent) { QStringList errs; if (!list.isEmpty()) { foreach(QString l, list.split('\n')) { try { pkcs11::load_lib(l, silent); } catch (errorEx &err) { errs << err.getString(); } } if (errs.count()) throw errorEx(errs.join("\n")); } } void pkcs11::startSession(slotid slot, bool rw) { CK_RV rv; unsigned long flags = CKF_SERIAL_SESSION | (rw ? CKF_RW_SESSION : 0); if (session != CK_INVALID_HANDLE) { WAITCURSOR_START; rv = slot.p11()->C_CloseSession(session); WAITCURSOR_END; session = CK_INVALID_HANDLE; if (rv != CKR_OK) pk11error(slot, "C_CloseSession", rv); } WAITCURSOR_START; rv = slot.p11()->C_OpenSession(slot.id, flags, NULL, NULL, &session); WAITCURSOR_END; if (rv != CKR_OK) pk11error(slot, "C_OpenSession", rv); p11slot = slot; } QList<CK_MECHANISM_TYPE> pkcs11::mechanismList(slotid slot) { CK_RV rv; CK_MECHANISM_TYPE *m; QList<CK_MECHANISM_TYPE> ml; unsigned long count; WAITCURSOR_START; rv = slot.p11()->C_GetMechanismList(slot.id, NULL, &count); WAITCURSOR_END; if (count != 0) { m = (CK_MECHANISM_TYPE *)malloc(count *sizeof(*m)); check_oom(m); WAITCURSOR_START; rv = slot.p11()->C_GetMechanismList(slot.id, m, &count); WAITCURSOR_END; if (rv != CKR_OK) { free(m); pk11error(slot, "C_GetMechanismList", rv); } for (unsigned i=0; i<count; i++) { ml << m[i]; } free(m); } return ml; } void pkcs11::mechanismInfo(slotid slot, CK_MECHANISM_TYPE m, CK_MECHANISM_INFO *info) { CK_RV rv; WAITCURSOR_START; rv = slot.p11()->C_GetMechanismInfo(slot.id, m, info); WAITCURSOR_END; if (rv != CKR_OK) { pk11error(slot, "C_GetMechanismInfo", rv); } } void pkcs11::logout() { CK_RV rv; p11slot.isValid(); WAITCURSOR_START; rv = p11slot.p11()->C_Logout(session); WAITCURSOR_END; if (rv != CKR_OK && rv != CKR_USER_NOT_LOGGED_IN) pk11error("C_Logout", rv); } bool pkcs11::needsLogin(bool so) { CK_SESSION_INFO sinfo; CK_RV rv; p11slot.isValid(); WAITCURSOR_START; rv = p11slot.p11()->C_GetSessionInfo(session, &sinfo); WAITCURSOR_END; if (rv != CKR_OK) pk11error("C_GetSessionInfo", rv); switch (sinfo.state) { case CKS_RO_PUBLIC_SESSION: case CKS_RW_PUBLIC_SESSION: return true; case CKS_RW_SO_FUNCTIONS: if (so) { return false; } else { logout(); return true; } case CKS_RO_USER_FUNCTIONS: case CKS_RW_USER_FUNCTIONS: if (!so) { return false; } else { logout(); return true; } } return true; } void pkcs11::login(unsigned char *pin, unsigned long pinlen, bool so) { unsigned long user = so ? CKU_SO : CKU_USER; CK_RV rv; p11slot.isValid(); WAITCURSOR_START; rv = p11slot.p11()->C_Login(session, user, pin, pinlen); WAITCURSOR_END; if (rv != CKR_OK && rv != CKR_USER_ALREADY_LOGGED_IN) pk11error("C_Login", rv); } class pinPadLoginThread: public QThread { bool so; pkcs11 *p11; public: errorEx err; pinPadLoginThread(pkcs11 *_p11, bool _so) : QThread() { so = _so; p11 = _p11; } void run() { try { p11->login(NULL, 0, so); } catch (errorEx &e) { err = e; } } }; static QDialog *newPinPadBox() { QDialog *box = new QDialog(NULL, Qt::WindowStaysOnTopHint); box->setWindowTitle(XCA_TITLE); QHBoxLayout *h = new QHBoxLayout(box); QLabel *l = new QLabel(); l->setPixmap(*MainWindow::scardImg); l->setMaximumSize(QSize(95, 40)); l->setScaledContents(true); h->addWidget(l); l = new QLabel(QObject::tr("Please enter the PIN on the PinPad")); h->addWidget(l); return box; } QString pkcs11::tokenLogin(QString name, bool so, bool force) { Passwd pin; bool need_login; QString text = so ? QObject::tr("Please enter the SO PIN (PUK) of the token %1"): QObject::tr("Please enter the PIN of the token %1"); pass_info p(XCA_TITLE, text.arg(name)); p.setPin(); need_login = needsLogin(so); if (force || need_login) { if (!need_login) logout(); if (tokenInfo().protAuthPath()) { pin.clear(); QDialog *pinpadbox = newPinPadBox(); pinpadbox->show(); pinPadLoginThread ppt(this, so); ppt.start(); while(!ppt.wait(20)) { qApp->processEvents(); pinpadbox->raise(); } delete pinpadbox; if (!ppt.err.isEmpty()) throw errorEx(ppt.err); } else { if (PwDialog::execute(&p, &pin, false) != 1) return QString(); } login(pin.constUchar(), pin.size(), so); } else { return QString(""); } return QString(pin); } bool pkcs11::selectToken(slotid *slot, QWidget *w) { slotidList p11_slots = getSlotList(); QStringList slotnames; foreach(slotid slot, p11_slots) { try { tkInfo info = tokenInfo(slot); slotnames << QString("%1 (#%2)"). arg(info.label()).arg(info.serial()); } catch (errorEx &e) { QMessageBox::warning(w, XCA_TITLE, QString("Error: %1").arg(e.getString())); } } switch (slotnames.count()) { case 0: QMessageBox::warning(w, XCA_TITLE, QObject::tr("No Security token found")); return false; case 1: *slot = p11_slots[0]; return true; } Ui::SelectToken ui; QDialog *select_slot = new QDialog(w); ui.setupUi(select_slot); ui.image->setPixmap(*MainWindow::scardImg); ui.tokenBox->addItems(slotnames); ui.buttonBox->button(QDialogButtonBox::Ok)->setText(QObject::tr("Select")); if (select_slot->exec() == 0) { delete select_slot; return false; } int selected = ui.tokenBox->currentIndex(); *slot = p11_slots[selected]; delete select_slot; return true; } void pkcs11::setPin(unsigned char *oldPin, unsigned long oldPinLen, unsigned char *pin, unsigned long pinLen) { p11slot.isValid(); WAITCURSOR_START; CK_RV rv = p11slot.p11()->C_SetPIN(session, oldPin, oldPinLen, pin, pinLen); WAITCURSOR_END; if (rv != CKR_OK) pk11error("C_SetPIN", rv); } static QString newSoPinTxt = QObject::tr( "Please enter the new SO PIN (PUK) for the token: '%1'"); static QString newPinTxt = QObject::tr( "Please enter the new PIN for the token: '%1'"); void pkcs11::changePin(slotid slot, bool so) { Passwd newPin, pinp; QString pin; startSession(slot, true); tkInfo ti = tokenInfo(); if (ti.protAuthPath()) { setPin(NULL, 0, NULL, 0); return; } pin = tokenLogin(ti.label(), so, true); if (pin.isNull()) return; QString msg = so ? newSoPinTxt : newPinTxt; pass_info p(XCA_TITLE, msg.arg(ti.label()) + "\n" + ti.pinInfo()); p.setPin(); if (PwDialog::execute(&p, &newPin, true) == 1) { pinp = pin.toAscii(); setPin(pinp.constUchar(), pinp.size(), newPin.constUchar(), newPin.size()); } logout(); } void pkcs11::initPin(slotid slot) { Passwd newPin, pinp; int ret = 1; QString pin; startSession(slot, true); tkInfo ti = tokenInfo(); pin = tokenLogin(ti.label(), true, false); if (pin.isNull()) return; pass_info p(XCA_TITLE, newPinTxt.arg(ti.label()) + "\n" + ti.pinInfo()); p.setPin(); if (!ti.protAuthPath()) { ret = PwDialog::execute(&p, &newPin, true); pinp = newPin; } p11slot.isValid(); if (ret == 1) { WAITCURSOR_START; CK_RV rv = p11slot.p11()->C_InitPIN(session, pinp.constUchar(), pinp.size()); WAITCURSOR_END; if (rv != CKR_OK) pk11error("C_InitPIN", rv); } logout(); } void pkcs11::initToken(slotid slot, unsigned char *pin, int pinlen, QString label) { unsigned char clabel[32]; QByteArray ba = label.toUtf8().left(32); memset(clabel, ' ', 32); memcpy(clabel, ba.constData(), ba.size()); WAITCURSOR_START; CK_RV rv = slot.p11()->C_InitToken(slot.id, pin, pinlen, clabel); WAITCURSOR_END; if (rv != CKR_OK) pk11error(slot, "C_InitToken", rv); } tkInfo pkcs11::tokenInfo(slotid slot) { CK_TOKEN_INFO token_info; CK_RV rv; WAITCURSOR_START; rv = slot.p11()->C_GetTokenInfo(slot.id, &token_info); WAITCURSOR_END; if (rv != CKR_OK) { pk11error(slot, "C_GetTokenInfo", rv); } return tkInfo(&token_info); } void pkcs11::loadAttribute(pk11_attribute &attribute, CK_OBJECT_HANDLE object) { p11slot.isValid(); attribute.load(p11slot, session, object); } void pkcs11::storeAttribute(pk11_attribute &attribute, CK_OBJECT_HANDLE object) { p11slot.isValid(); attribute.store(p11slot, session, object); } CK_OBJECT_HANDLE pkcs11::createObject(pk11_attlist &attrs) { CK_RV rv; CK_OBJECT_HANDLE obj; p11slot.isValid(); WAITCURSOR_START; rv = p11slot.p11()->C_CreateObject(session, attrs.getAttributes(), attrs.length(), &obj); WAITCURSOR_END; if (rv != CKR_OK) { pk11error("C_CreateObject", rv); } return obj; } int pkcs11::deleteObjects(QList<CK_OBJECT_HANDLE> objects) { CK_RV rv; p11slot.isValid(); for (int i=0; i< objects.count(); i++) { WAITCURSOR_START; rv = p11slot.p11()->C_DestroyObject(session, objects[i]); WAITCURSOR_END; if (rv != CKR_OK) { pk11error("C_DestroyObject", rv); } } return objects.count(); } #define ID_LEN 8 pk11_attr_data pkcs11::findUniqueID(unsigned long oclass) { pk11_attr_data id(CKA_ID); pk11_attr_ulong class_att(CKA_CLASS, oclass); while (1) { unsigned char buf[ID_LEN]; pk11_attlist atts(class_att); RAND_pseudo_bytes(buf, ID_LEN); id.setValue(buf, ID_LEN); atts << id; if (objectList(atts).count() == 0) break; } return id; } pk11_attr_data pkcs11::generateRSAKey(QString name, unsigned long bits) { CK_RV rv; CK_OBJECT_HANDLE pubkey, privkey; pk11_attlist priv_atts, pub_atts; CK_MECHANISM mechanism = {CKM_RSA_PKCS_KEY_PAIR_GEN, NULL_PTR, 0}; pk11_attr_data label(CKA_LABEL, name.toUtf8()); pk11_attr_data new_id = findUniqueID(CKO_PUBLIC_KEY); pub_atts << pk11_attr_ulong(CKA_CLASS, CKO_PUBLIC_KEY) << pk11_attr_bool(CKA_TOKEN, true) << pk11_attr_bool(CKA_PRIVATE, false) << pk11_attr_bool(CKA_ENCRYPT, true) << pk11_attr_bool(CKA_VERIFY, true) << pk11_attr_bool(CKA_WRAP, true) << pk11_attr_ulong(CKA_MODULUS_BITS, bits) << pk11_attr_data(CKA_PUBLIC_EXPONENT, 0x10001) << label << new_id; priv_atts << pk11_attr_ulong(CKA_CLASS, CKO_PRIVATE_KEY) << pk11_attr_bool(CKA_TOKEN, true) << pk11_attr_bool(CKA_PRIVATE, true) << pk11_attr_bool(CKA_SENSITIVE, true) << pk11_attr_bool(CKA_DECRYPT, true) << pk11_attr_bool(CKA_SIGN, true) << pk11_attr_bool(CKA_UNWRAP, true) << label << new_id; p11slot.isValid(); WAITCURSOR_START; rv = p11slot.p11()->C_GenerateKeyPair(session, &mechanism, pub_atts.getAttributes(), pub_atts.length(), priv_atts.getAttributes(), priv_atts.length(), &pubkey, &privkey); WAITCURSOR_END; if (rv != CKR_OK) { pk11error("C_GenerateKeyPair", rv); } return new_id; } QList<CK_OBJECT_HANDLE> pkcs11::objectList(pk11_attlist &atts) { CK_RV rv; CK_OBJECT_HANDLE objects[256]; QList<CK_OBJECT_HANDLE> list; unsigned long len, i, att_num; CK_ATTRIBUTE *attribute; att_num = atts.get(&attribute); p11slot.isValid(); WAITCURSOR_START; rv = p11slot.p11()->C_FindObjectsInit(session, attribute, att_num); WAITCURSOR_END; if (rv != CKR_OK) pk11error("C_FindObjectsInit", rv); do { WAITCURSOR_START; rv = p11slot.p11()->C_FindObjects(session, objects, 256, &len); WAITCURSOR_END; if (rv != CKR_OK) pk11error("C_FindObjects", rv); for (i=0; i<len; i++) list += objects[i]; } while (len); WAITCURSOR_START; rv = p11slot.p11()->C_FindObjectsFinal(session); WAITCURSOR_END; if (rv != CKR_OK) pk11error("C_FindObjectsFinal", rv); return list; } int pkcs11::decrypt(int flen, const unsigned char *from, unsigned char *to, int tolen) { CK_MECHANISM mech; CK_ULONG size = tolen; CK_RV rv; memset(&mech, 0, sizeof(mech)); mech.mechanism = CKM_RSA_PKCS; WAITCURSOR_START; rv = p11slot.p11()->C_DecryptInit(session, &mech, p11obj); if (rv == CKR_OK) rv = p11slot.p11()->C_Decrypt(session, (CK_BYTE *)from, flen, to, &size); WAITCURSOR_END; if (rv != CKR_OK) { fprintf(stderr, "Error: C_Decrypt(init): %s\n", pk11errorString(rv)); return -1; } return size; } int pkcs11::encrypt(int flen, const unsigned char *from, unsigned char *to, int tolen) { CK_MECHANISM mech; CK_ULONG size = tolen; CK_RV rv; memset(&mech, 0, sizeof(mech)); mech.mechanism = CKM_RSA_PKCS; WAITCURSOR_START; rv = p11slot.p11()->C_SignInit(session, &mech, p11obj); if (rv == CKR_OK) rv = p11slot.p11()->C_Sign(session, (CK_BYTE *)from, flen, to, &size); WAITCURSOR_END; if (rv != CKR_OK) { fprintf(stderr, "Error: C_Sign(init): %s\n", pk11errorString(rv)); return -1; } return size; } static int rsa_privdata_free(RSA *rsa) { pkcs11 *priv = (pkcs11*)RSA_get_app_data(rsa); delete priv; return 0; } static int rsa_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA * rsa, int padding) { pkcs11 *priv = (pkcs11*)RSA_get_app_data(rsa); if (padding != RSA_PKCS1_PADDING) { return -1; } return priv->encrypt(flen, from, to, BN_num_bytes(rsa->n)); } static int rsa_decrypt(int flen, const unsigned char *from, unsigned char *to, RSA * rsa, int padding) { pkcs11 *priv = (pkcs11*)RSA_get_app_data(rsa); if (padding != RSA_PKCS1_PADDING) { return -1; } return priv->decrypt(flen, from, to, flen); } EVP_PKEY *pkcs11::getPrivateKey(EVP_PKEY *pub, CK_OBJECT_HANDLE obj) { static RSA_METHOD rsa_meth, *ops = NULL; RSA *rsa; EVP_PKEY *evp; if (EVP_PKEY_type(pub->type) != EVP_PKEY_RSA) return NULL; p11slot.isValid(); rsa = RSAPublicKey_dup(pub->pkey.rsa); openssl_error(); if (!ops) { rsa_meth = *RSA_get_default_method(); rsa_meth.rsa_priv_enc = rsa_encrypt; rsa_meth.rsa_priv_dec = rsa_decrypt; rsa_meth.finish = rsa_privdata_free; ops = &rsa_meth; } p11obj = obj; RSA_set_method(rsa, ops); RSA_set_app_data(rsa, this); evp = EVP_PKEY_new(); openssl_error(); EVP_PKEY_assign_RSA(evp, rsa); return evp; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pkcs11.h������������������������������������������������������������������������������0000664�0000000�0000000�00000010063�11753427512�0014410�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __XCA_PKCS11_H #define __XCA_PKCS11_H #include "pkcs11_lib.h" #include "opensc-pkcs11.h" #include <QtCore/QStringList> #include <QtCore/QString> #include <QtCore/QList> #include <ltdl.h> #include "pk11_attribute.h" #define WAITCURSOR_START QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)) #define WAITCURSOR_END QApplication::restoreOverrideCursor() class tkInfo { private: CK_TOKEN_INFO token_info; public: tkInfo(const CK_TOKEN_INFO *ti) { set(ti); } tkInfo(const tkInfo &tk) { set(&tk.token_info); } void set(const CK_TOKEN_INFO *ti) { memcpy(&token_info, ti, sizeof(token_info)); // sanitize strings for (int i=0; i<32; i++) { if (token_info.label[i] == 0) token_info.label[i] = ' '; if (token_info.manufacturerID[i] == 0) token_info.manufacturerID[i] = ' '; } for (int i=0; i<16; i++) { if (token_info.model[i] == 0) token_info.model[i] = ' '; if (token_info.serialNumber[i] == 0) token_info.serialNumber[i] = ' '; } } QString label() const { return UTF8QSTRING(token_info.label, 32); } QString manufacturerID() const { return UTF8QSTRING(token_info.manufacturerID, 32); } QString model() const { return UTF8QSTRING(token_info.model, 16); } QString serial() const { return ASCIIQSTRING(token_info.serialNumber, 16); } bool protAuthPath() const { return !!(token_info.flags & CKF_PROTECTED_AUTHENTICATION_PATH); } bool tokenInitialized() const { return !!(token_info.flags & CKF_TOKEN_INITIALIZED); } QString pinInfo() const { return QObject::tr("Required PIN size: %1 - %2"). arg(token_info.ulMinPinLen). arg(token_info.ulMaxPinLen); } }; class pkcs11 { friend class pk11_attribute; friend class pk11_attr_ulong; friend class pk11_attr_data; private: static pkcs11_lib_list libs; slotid p11slot; CK_SESSION_HANDLE session; CK_OBJECT_HANDLE p11obj; public: pkcs11(); ~pkcs11(); static bool loaded() { return libs.count() != 0; } static pkcs11_lib *load_lib(QString fname, bool silent); static pkcs11_lib *get_lib(QString fname) { return libs.get_lib(fname); } static bool remove_lib(QString fname) { return libs.remove_lib(fname); } static void remove_libs() { while (!libs.isEmpty()) delete libs.takeFirst(); } static void load_libs(QString list, bool silent); static pkcs11_lib_list get_libs() { return libs; } tkInfo tokenInfo(slotid slot); tkInfo tokenInfo() { return tokenInfo(p11slot); } QString driverInfo(slotid slot) { return slot.lib->driverInfo(); } slotidList getSlotList() { return libs.getSlotList(); } bool selectToken(slotid *slot, QWidget *w); void changePin(slotid slot, bool so); void initPin(slotid slot); void initToken(slotid slot, unsigned char *pin, int pinlen, QString label); QList<CK_MECHANISM_TYPE> mechanismList(slotid slot); void mechanismInfo(slotid slot, CK_MECHANISM_TYPE m, CK_MECHANISM_INFO *info); void startSession(slotid slot, bool rw = false); /* Session based functions */ void loadAttribute(pk11_attribute &attribute, CK_OBJECT_HANDLE object); void storeAttribute(pk11_attribute &attribute, CK_OBJECT_HANDLE object); QList<CK_OBJECT_HANDLE> objectList(pk11_attlist &atts); QString tokenLogin(QString name, bool so, bool force=false); void logout(); bool needsLogin(bool so); void login(unsigned char *pin, unsigned long pinlen, bool so); void setPin(unsigned char *oldPin, unsigned long oldPinLen, unsigned char *pin, unsigned long pinLen); CK_OBJECT_HANDLE createObject(pk11_attlist &attrs); pk11_attr_data findUniqueID(unsigned long oclass); pk11_attr_data generateRSAKey(QString name, unsigned long bits); int deleteObjects(QList<CK_OBJECT_HANDLE> objects); EVP_PKEY *getPrivateKey(EVP_PKEY *pub, CK_OBJECT_HANDLE obj); int encrypt(int flen, const unsigned char *from, unsigned char *to, int tolen); int decrypt(int flen, const unsigned char *from, unsigned char *to, int tolen); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pkcs11_lib.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000015416�11753427512�0015600�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "pkcs11.h" #include "pk11_attribute.h" #include "exception.h" #include "db_base.h" #include "func.h" #include "pass_info.h" #include <openssl/rand.h> #include <QtGui/QMessageBox> #include <ltdl.h> #include "ui_SelectToken.h" pkcs11_lib::pkcs11_lib(QString f) { CK_RV (*c_get_function_list)(CK_FUNCTION_LIST_PTR_PTR); CK_RV rv; file = f; lt_dlinit(); p11 = NULL; dl_handle = lt_dlopen(QString2filename(file)); if (dl_handle == NULL) goto how_bad; /* Get the list of function pointers */ c_get_function_list = (CK_RV (*)(CK_FUNCTION_LIST_PTR_PTR)) lt_dlsym(dl_handle, "C_GetFunctionList"); if (!c_get_function_list) goto how_bad; if (c_get_function_list(&p11) != CKR_OK) goto how_bad; rv = p11->C_Initialize(NULL); if (rv != CKR_OK && rv != CKR_CRYPTOKI_ALREADY_INITIALIZED) pk11error("C_Initialize", rv); return; how_bad: lt_dlexit(); throw errorEx(QObject::tr("Failed to open PKCS11 library: %1"). arg(file)); } pkcs11_lib::~pkcs11_lib() { p11->C_Finalize(NULL); lt_dlclose(dl_handle); lt_dlexit(); } QList<unsigned long> pkcs11_lib::getSlotList() { CK_RV rv; CK_SLOT_ID *p11_slots = NULL; QList<unsigned long> sl; unsigned long i, num_slots = 0; /* This one helps to avoid errors. * Fist time it fails, 2nd time it works */ WAITCURSOR_START; p11->C_GetSlotList(CK_TRUE, p11_slots, &num_slots); WAITCURSOR_END; while (1) { rv = p11->C_GetSlotList(CK_TRUE, p11_slots, &num_slots); if (rv != CKR_OK && rv != CKR_BUFFER_TOO_SMALL) pk11error("C_GetSlotList", rv); if (num_slots == 0) break; if ((rv == CKR_OK) && p11_slots) break; p11_slots = (CK_SLOT_ID *)realloc(p11_slots, num_slots *sizeof(CK_SLOT_ID)); check_oom(p11_slots); } for (i=0; i<num_slots; i++) { sl << p11_slots[i]; } if (p11_slots) free(p11_slots); return sl; } QString pkcs11_lib::driverInfo() { CK_INFO info; CK_RV rv; WAITCURSOR_START; rv = p11->C_GetInfo(&info); WAITCURSOR_END; if (rv != CKR_OK) { pk11error("C_GetInfo", rv); } return QString( "Cryptoki version: %1.%2\n" "Manufacturer: %3\n" "Library: %4 (%5.%6)\n"). arg(info.cryptokiVersion.major).arg(info.cryptokiVersion.minor). arg(UTF8QSTRING(info.manufacturerID, 32)). arg(UTF8QSTRING(info.libraryDescription, 32)). arg(info.libraryVersion.major).arg(info.libraryVersion.minor); } pkcs11_lib *pkcs11_lib_list::add_lib(QString fname) { foreach(pkcs11_lib *l, *this) { if (l->filename() == fname) return l; } pkcs11_lib *l = new pkcs11_lib(fname); append(l); return l; } pkcs11_lib *pkcs11_lib_list::get_lib(QString fname) { foreach(pkcs11_lib *l, *this) { if (l->filename() == fname) return l; } return NULL; } bool pkcs11_lib_list::remove_lib(QString fname) { for(int i=0; i<count(); i++) { if (at(i)->filename() == fname) { delete takeAt(i); return true; } } return false; } slotidList pkcs11_lib_list::getSlotList() { slotidList list; QString ex; bool success = false; for (int i=0; i<count(); i++) { pkcs11_lib *l = at(i); try { QList<unsigned long> realids; realids = l->getSlotList(); foreach(int id, realids) list << slotid(l, id); success = true; } catch (errorEx &e) { ex = e.getString(); } } if (success || ex.isEmpty()) return list; throw errorEx(ex); } const char *pk11errorString(unsigned long rv) { #define PK11_ERR(x) case x : return #x; switch (rv) { PK11_ERR(CKR_OK) PK11_ERR(CKR_CANCEL) PK11_ERR(CKR_HOST_MEMORY) PK11_ERR(CKR_SLOT_ID_INVALID) PK11_ERR(CKR_GENERAL_ERROR) PK11_ERR(CKR_FUNCTION_FAILED) PK11_ERR(CKR_ARGUMENTS_BAD) PK11_ERR(CKR_NO_EVENT) PK11_ERR(CKR_NEED_TO_CREATE_THREADS) PK11_ERR(CKR_CANT_LOCK) PK11_ERR(CKR_ATTRIBUTE_READ_ONLY) PK11_ERR(CKR_ATTRIBUTE_SENSITIVE) PK11_ERR(CKR_ATTRIBUTE_TYPE_INVALID) PK11_ERR(CKR_ATTRIBUTE_VALUE_INVALID) PK11_ERR(CKR_DATA_INVALID) PK11_ERR(CKR_DATA_LEN_RANGE) PK11_ERR(CKR_DEVICE_ERROR) PK11_ERR(CKR_DEVICE_MEMORY) PK11_ERR(CKR_DEVICE_REMOVED) PK11_ERR(CKR_ENCRYPTED_DATA_INVALID) PK11_ERR(CKR_ENCRYPTED_DATA_LEN_RANGE) PK11_ERR(CKR_FUNCTION_CANCELED) PK11_ERR(CKR_FUNCTION_NOT_PARALLEL) PK11_ERR(CKR_FUNCTION_NOT_SUPPORTED) PK11_ERR(CKR_KEY_HANDLE_INVALID) PK11_ERR(CKR_KEY_SIZE_RANGE) PK11_ERR(CKR_KEY_TYPE_INCONSISTENT) PK11_ERR(CKR_KEY_NOT_NEEDED) PK11_ERR(CKR_KEY_CHANGED) PK11_ERR(CKR_KEY_NEEDED) PK11_ERR(CKR_KEY_INDIGESTIBLE) PK11_ERR(CKR_KEY_FUNCTION_NOT_PERMITTED) PK11_ERR(CKR_KEY_NOT_WRAPPABLE) PK11_ERR(CKR_KEY_UNEXTRACTABLE) PK11_ERR(CKR_MECHANISM_INVALID) PK11_ERR(CKR_MECHANISM_PARAM_INVALID) PK11_ERR(CKR_OBJECT_HANDLE_INVALID) PK11_ERR(CKR_OPERATION_ACTIVE) PK11_ERR(CKR_OPERATION_NOT_INITIALIZED) PK11_ERR(CKR_PIN_INCORRECT) PK11_ERR(CKR_PIN_INVALID) PK11_ERR(CKR_PIN_LEN_RANGE) PK11_ERR(CKR_PIN_EXPIRED) PK11_ERR(CKR_PIN_LOCKED) PK11_ERR(CKR_SESSION_CLOSED) PK11_ERR(CKR_SESSION_COUNT) PK11_ERR(CKR_SESSION_HANDLE_INVALID) PK11_ERR(CKR_SESSION_PARALLEL_NOT_SUPPORTED) PK11_ERR(CKR_SESSION_READ_ONLY) PK11_ERR(CKR_SESSION_EXISTS) PK11_ERR(CKR_SESSION_READ_ONLY_EXISTS) PK11_ERR(CKR_SESSION_READ_WRITE_SO_EXISTS) PK11_ERR(CKR_SIGNATURE_INVALID) PK11_ERR(CKR_SIGNATURE_LEN_RANGE) PK11_ERR(CKR_TEMPLATE_INCOMPLETE) PK11_ERR(CKR_TEMPLATE_INCONSISTENT) PK11_ERR(CKR_TOKEN_NOT_PRESENT) PK11_ERR(CKR_TOKEN_NOT_RECOGNIZED) PK11_ERR(CKR_TOKEN_WRITE_PROTECTED) PK11_ERR(CKR_UNWRAPPING_KEY_HANDLE_INVALID) PK11_ERR(CKR_UNWRAPPING_KEY_SIZE_RANGE) PK11_ERR(CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT) PK11_ERR(CKR_USER_ALREADY_LOGGED_IN) PK11_ERR(CKR_USER_NOT_LOGGED_IN) PK11_ERR(CKR_USER_PIN_NOT_INITIALIZED) PK11_ERR(CKR_USER_TYPE_INVALID) PK11_ERR(CKR_USER_ANOTHER_ALREADY_LOGGED_IN) PK11_ERR(CKR_USER_TOO_MANY_TYPES) PK11_ERR(CKR_WRAPPED_KEY_INVALID) PK11_ERR(CKR_WRAPPED_KEY_LEN_RANGE) PK11_ERR(CKR_WRAPPING_KEY_HANDLE_INVALID) PK11_ERR(CKR_WRAPPING_KEY_SIZE_RANGE) PK11_ERR(CKR_WRAPPING_KEY_TYPE_INCONSISTENT) PK11_ERR(CKR_RANDOM_SEED_NOT_SUPPORTED) PK11_ERR(CKR_RANDOM_NO_RNG) PK11_ERR(CKR_DOMAIN_PARAMS_INVALID) PK11_ERR(CKR_BUFFER_TOO_SMALL) PK11_ERR(CKR_SAVED_STATE_INVALID) PK11_ERR(CKR_INFORMATION_SENSITIVE) PK11_ERR(CKR_STATE_UNSAVEABLE) PK11_ERR(CKR_CRYPTOKI_NOT_INITIALIZED) PK11_ERR(CKR_CRYPTOKI_ALREADY_INITIALIZED) PK11_ERR(CKR_MUTEX_BAD) PK11_ERR(CKR_MUTEX_NOT_LOCKED) PK11_ERR(CKR_VENDOR_DEFINED) } return "unknown PKCS11 error"; } void pk11error(QString func, int rv) { errorEx err(QObject::tr("PKCS#11 function '%1' failed: %2").arg(func). arg(pk11errorString(rv))); throw err; } void pk11error(slotid slot, QString func, int rv) { errorEx err(QObject::tr("PKCS#11 function '%1' failed: %2\nIn library %3\n%4"). arg(func).arg(pk11errorString(rv)).arg(slot.lib->filename()). arg(slot.lib->driverInfo())); throw err; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pkcs11_lib.h��������������������������������������������������������������������������0000664�0000000�0000000�00000002533�11753427512�0015241�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __XCA_PKCS11_LIB_H #define __XCA_PKCS11_LIB_H #include "lib/exception.h" #include "opensc-pkcs11.h" #include <QtCore/QString> #include <QtCore/QList> #include <ltdl.h> class pkcs11_lib { private: lt_dlhandle dl_handle; CK_FUNCTION_LIST *p11; QString file; public: pkcs11_lib(QString file); ~pkcs11_lib(); QList<unsigned long> getSlotList(); QString driverInfo(); QString filename() { return file; } CK_FUNCTION_LIST *ptr() { return p11; } }; class slotid { public: CK_ULONG id; pkcs11_lib *lib; slotid() { lib = NULL; id = 0; } slotid(pkcs11_lib *l, CK_ULONG i) { lib = l; id = i; } slotid &operator = (const slotid &other) { lib = other.lib; id = other.id; return *this; } void isValid() { if (!lib) throw errorEx("InternalError: slotid is invalid"); } CK_FUNCTION_LIST *p11() { return lib->ptr(); } }; typedef QList<slotid> slotidList; class pkcs11_lib_list: public QList<pkcs11_lib*> { public: pkcs11_lib *add_lib(QString fname); pkcs11_lib *get_lib(QString fname); bool remove_lib(QString fname); slotidList getSlotList(); }; void pk11error(QString fmt, int r); void pk11error(slotid slot, QString func, int rv); const char *pk11errorString(unsigned long rv); #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_base.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000006626�11753427512�0015430�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "func.h" #include "pki_base.h" #include "exception.h" #include <QtCore/QString> int pki_base::pki_counter = 0; int pki_base::suppress_messages = 0; pki_base::pki_base(const QString name, pki_base *p) { desc = name; class_name = "pki_base"; parent = p; pki_counter++; childItems.clear(); dataVersion=0; pkiType=none; } int pki_base::getVersion() { return dataVersion; } enum pki_type pki_base::getType() { return pkiType; } pki_base::~pki_base(void) { while((childCount())) delete takeFirst(); pki_counter--; } QString pki_base::getIntName() const { return desc; } QString pki_base::getUnderlinedName() const { QString a = getIntName(); int i, l = a.length(); for (i=0; i<l; i++) { if (a[i] == ' ' || a[i] == '&' || a[i] == ';' || a[i] == '`') a[i] = '_'; } return a; } int pki_base::get_pki_counter() { return pki_counter; } QString pki_base::getClassName() { QString x = class_name; return x; } void pki_base::setIntName(const QString &d) { desc = d; } void pki_base::fopen_error(const QString fname) { my_error(tr("Error opening file: '%1': %2"). arg(fname). arg(strerror(errno))); } void pki_base::fwrite_ba(FILE *fp, QByteArray ba, QString fname) { if (fwrite(ba.constData(), 1, ba.size(), fp) != (size_t)ba.size()) { my_error(tr("Error writing to file: '%1': %2"). arg(fname). arg(strerror(errno))); } } void pki_base::my_error(const QString error) const { if (!error.isEmpty()) { fprintf(stderr, "%s\n", CCHAR(tr("Error: ") + error)); throw errorEx(error, class_name); } } QString pki_base::rmslashdot(const QString &s) { QByteArray a = s.toAscii().replace("\\", "/"); int r = a.lastIndexOf('.'); int l = a.lastIndexOf('/'); return s.mid(l+1,r-l-1); } pki_base *pki_base::getParent() { return parent; } void pki_base::setParent(pki_base *p) { parent = p; } pki_base *pki_base::child(int row) { return childItems.value(row); } void pki_base::append(pki_base *item) { childItems.append(item); item->setParent(this); } void pki_base::insert(int row, pki_base *item) { childItems.insert(row, item); item->setParent(this); } int pki_base::childCount() { return childItems.count(); } int pki_base::row(void) const { if (parent) return parent->childItems.indexOf(const_cast<pki_base*>(this)); return 0; } pki_base *pki_base::iterate(pki_base *pki) { if (pki == NULL) pki = (childItems.isEmpty()) ? NULL : childItems.first(); else pki = childItems.value(pki->row()+1); if (pki) { return pki; } if (!parent) { return NULL; } return parent->iterate(this); } void pki_base::takeChild(pki_base *pki) { childItems.takeAt(pki->row()); } pki_base *pki_base::takeFirst() { return childItems.takeFirst(); } QVariant pki_base::column_data(dbheader *hd) { switch (hd->id) { case HD_internal_name: return QVariant(getIntName()); } return QVariant(); } QVariant pki_base::getIcon(dbheader *hd) { return QVariant(); } uint32_t pki_base::intFromData(QByteArray &ba) { /* For import "oldFromData" use the endian dependent version */ uint32_t ret; if ((unsigned)(ba.count()) < sizeof(uint32_t)) { ba.clear(); return 0; } memcpy(&ret, ba.constData(), sizeof(uint32_t)); ba = ba.mid(sizeof(uint32_t)); return ret; } bool pki_base::compare(pki_base *refcrl) { bool ret; ret = (i2d() == refcrl->i2d()); pki_openssl_error(); return ret; } ����������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_base.h����������������������������������������������������������������������������0000664�0000000�0000000�00000005220�11753427512�0015062�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_BASE_H #define __PKI_BASE_H #include <openssl/err.h> #include <QtCore/QString> #include <QtGui/QListView> #include "pkcs11_lib.h" #include "db.h" #include "base.h" #include "headerlist.h" #define __ME QString("(%1:%2)").arg(class_name).arg(getIntName()) #define pki_openssl_error() _openssl_error(__ME, C_FILE, __LINE__) #define pki_ign_openssl_error() _ign_openssl_error(__ME, C_FILE, __LINE__) class pki_base : public QObject { Q_OBJECT private: static int pki_counter; protected: const char *class_name; QString desc; int dataVersion; enum pki_type pkiType; /* model data */ pki_base *parent; void my_error(const QString myerr) const; void fopen_error(const QString fname); public: enum msg_type { msg_import, msg_delete, msg_delete_multi, msg_create, }; static int suppress_messages; QList<pki_base*> childItems; pki_base(const QString d = "", pki_base *p = NULL); virtual void fload(const QString) {}; virtual void writeDefault(const QString) {}; static int get_pki_counter(void); virtual void fromData(const unsigned char *, db_header_t *) {}; virtual void oldFromData(unsigned char *, int ) {}; virtual QByteArray toData() { return QByteArray(); } virtual bool compare(pki_base *); virtual ~pki_base(); QString getIntName() const; QString getUnderlinedName() const; void setIntName(const QString &d); QString getClassName(); static QString rmslashdot(const QString &fname); virtual QString getMsg(msg_type msg) { return tr("Internal error: Unexpected message: %1 %2"). arg(class_name).arg(msg); }; int getVersion(); enum pki_type getType(); void setParent(pki_base *p); virtual pki_base *getParent(); pki_base *child(int row); void append(pki_base *item); void insert(int row, pki_base *item); int childCount(); int row() const; pki_base *iterate(pki_base *pki = NULL); void takeChild(pki_base *pki); pki_base *takeFirst(); virtual QVariant column_data(dbheader *hd); virtual QVariant getIcon(dbheader *hd); const char *className() { return class_name; }; uint32_t intFromData(QByteArray &ba); virtual void fromPEM_BIO(BIO *, QString) {}; virtual void deleteFromToken() { }; virtual void deleteFromToken(slotid) { }; virtual int renameOnToken(slotid, QString) { return 0; }; virtual QByteArray i2d() { return QByteArray(); } virtual BIO *pem(BIO *) { return NULL; } void fwrite_ba(FILE *fp, QByteArray ba, QString fname); virtual QVariant bg_color(dbheader *hd) { return QVariant(); } }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_crl.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000015127�11753427512�0015272�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_crl.h" #include "func.h" #include "exception.h" #include <QtCore/QDir> QPixmap *pki_crl::icon = NULL; pki_crl::pki_crl(const QString name ) :pki_x509name(name) { issuer = NULL; crl = X509_CRL_new(); class_name="pki_crl"; pki_openssl_error(); dataVersion=1; pkiType=revokation; } void pki_crl::fromPEM_BIO(BIO *bio, QString name) { X509_CRL*_crl; _crl = PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL); openssl_error(name); X509_CRL_free(crl); crl = _crl; setIntName(rmslashdot(name)); } QString pki_crl::getMsg(msg_type msg) { /* * We do not construct english sentences from fragments * to allow proper translations. * * %1 will be replaced by the internal name of the CRL */ switch (msg) { case msg_import: return tr("Successfully imported the revokation list '%1'"); case msg_delete: return tr("Delete the revokation list '%1'?"); case msg_create: return tr("Successfully created the revokation list '%1'"); /* %1: Number of CRLs; %2: list of CRL names */ case msg_delete_multi: return tr("Delete the %1 revokation lists: %2?"); } return pki_base::getMsg(msg); } void pki_crl::fload(const QString fname) { FILE *fp = fopen(QString2filename(fname), "r"); X509_CRL *_crl; if (fp != NULL) { _crl = PEM_read_X509_CRL(fp, NULL, NULL, NULL); if (!_crl) { pki_ign_openssl_error(); rewind(fp); _crl = d2i_X509_CRL_fp(fp, NULL); } fclose(fp); if (pki_ign_openssl_error()) { if (_crl) X509_CRL_free(_crl); throw errorEx(tr("Unable to load the revokation list in file %1. Tried PEM and DER formatted CRL.").arg(fname)); } if (crl) X509_CRL_free(crl); crl = _crl; setIntName(rmslashdot(fname)); pki_openssl_error(); } else fopen_error(fname); } QString pki_crl::getSigAlg() { QString alg = OBJ_nid2ln(OBJ_obj2nid(crl->sig_alg->algorithm)); return alg; } void pki_crl::createCrl(const QString d, pki_x509 *iss ) { setIntName(d); issuer = iss; if (!iss) my_error(tr("No issuer given")); crl->crl->issuer = issuer->getSubject().get(); a1int version = 1; /* version 2 CRL */ crl->crl->version = version.get(); pki_openssl_error(); } a1int pki_crl::getVersion() { a1int a(crl->crl->version); return a; } void pki_crl::setLastUpdate(const a1time &a) { a1time t(a); X509_CRL_set_lastUpdate(crl, t.get_utc()); } void pki_crl::setNextUpdate(const a1time &a) { a1time t(a); X509_CRL_set_nextUpdate(crl, t.get_utc()); } pki_crl::~pki_crl() { X509_CRL_free(crl); } void pki_crl::d2i(QByteArray &ba) { X509_CRL *c = (X509_CRL*)d2i_bytearray(D2I_VOID(d2i_X509_CRL), ba); if (c) { X509_CRL_free(crl); crl = c; } } QByteArray pki_crl::i2d() { return i2d_bytearray(I2D_VOID(i2d_X509_CRL), crl); } void pki_crl::fromData(const unsigned char *p, db_header_t *head) { int size; size = head->len - sizeof(db_header_t); QByteArray ba((const char*)p, size); d2i(ba); if (ba.count() > 0) { my_error(tr("Wrong Size %1").arg(ba.count())); } } QByteArray pki_crl::toData() { QByteArray ba = i2d(); pki_openssl_error(); return ba; } void pki_crl::addRev(const x509rev &xrev) { X509_CRL_add0_revoked(crl, xrev.get()); pki_openssl_error(); } void pki_crl::addV3ext(const x509v3ext &e) { X509_EXTENSION *ext = e.get(); X509_CRL_add_ext(crl, ext, -1); X509_EXTENSION_free(ext); pki_openssl_error(); } void pki_crl::sign(pki_key *key, const EVP_MD *md) { EVP_PKEY *pkey; if (!key || key->isPubKey()) return; X509_CRL_sort(crl); pkey = key->decryptKey(); X509_CRL_sign(crl, pkey, md); EVP_PKEY_free(pkey); pki_openssl_error(); } void pki_crl::writeDefault(const QString fname) { writeCrl(fname + QDir::separator() + getUnderlinedName() + ".crl", true); } void pki_crl::writeCrl(const QString fname, bool pem) { FILE *fp = fopen(QString2filename(fname), "w"); if (fp != NULL) { if (crl){ if (pem) PEM_write_X509_CRL(fp, crl); else i2d_X509_CRL_fp(fp, crl); } fclose(fp); pki_openssl_error(); } else fopen_error(fname); } BIO *pki_crl::pem(BIO *b) { if (!b) b = BIO_new(BIO_s_mem()); PEM_write_bio_X509_CRL(b, crl); return b; } a1time pki_crl::getLastUpdate() { a1time a; if (crl && crl->crl) a.set(crl->crl->lastUpdate); return a; } a1time pki_crl::getNextUpdate() { a1time a; if (crl && crl->crl) a.set(crl->crl->nextUpdate); return a; } int pki_crl::numRev() { if (crl && crl->crl && crl->crl->revoked) return sk_X509_REVOKED_num(crl->crl->revoked); else return 0; } x509rev pki_crl::getRev(int num) { x509rev ret; if (crl && crl->crl && crl->crl->revoked) { ret.set(sk_X509_REVOKED_value(crl->crl->revoked, num)); pki_openssl_error(); } return ret; } x509name pki_crl::getSubject() const { x509name x; if (crl && crl->crl && crl->crl->issuer) { x.set(crl->crl->issuer); } return x ; } bool pki_crl::verify(pki_key *key) { bool ret=false; if (crl && crl->crl && key) { ret = (X509_CRL_verify(crl , key->getPubKey()) == 1); pki_ign_openssl_error(); } return ret ; } void pki_crl::setCrlNumber(a1int num) { ASN1_INTEGER *tmpser = num.get(); pki_openssl_error(); X509_CRL_add1_ext_i2d(crl, NID_crl_number, tmpser, 0, 0); ASN1_INTEGER_free(tmpser); pki_openssl_error(); } bool pki_crl::getCrlNumber(a1int *num) { int j; ASN1_INTEGER *i; i = (ASN1_INTEGER *)X509_CRL_get_ext_d2i(crl, NID_crl_number, &j, NULL); pki_openssl_error(); if (j == -1) return false; num->set(i); ASN1_INTEGER_free(i); return true; } x509v3ext pki_crl::getExtByNid(int nid) { extList el; x509v3ext e; el.setStack(crl->crl->extensions); for (int i=0; i< el.count(); i++){ if (el[i].nid() == nid) return el[i]; } return e; } QString pki_crl::printV3ext() { extList el; el.setStack(crl->crl->extensions); QString text = el.getHtml("<br>"); pki_openssl_error(); return text; } QVariant pki_crl::column_data(dbheader *hd) { switch (hd->id) { case HD_crl_signer: if (issuer) return QVariant(getIssuer()->getIntName()); else return QVariant(tr("unknown")); case HD_crl_revoked: return QVariant(numRev()); case HD_crl_lastUpdate: return QVariant(getLastUpdate().toSortable()); case HD_crl_nextUpdate: return QVariant(getNextUpdate().toSortable()); case HD_crl_crlnumber: a1int a; if (getCrlNumber(&a)) return QVariant(a.toDec()); return QVariant(); } return pki_x509name::column_data(hd); } QVariant pki_crl::getIcon(dbheader *hd) { return hd->id == HD_internal_name ? QVariant(*icon) : QVariant(); } void pki_crl::oldFromData(unsigned char *p, int size) { QByteArray ba((const char *)p, size); d2i(ba); if (ba.count() > 0) { my_error(tr("Wrong Size %1").arg(ba.count())); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_crl.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000003340�11753427512�0014731�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_CRL_H #define __PKI_CRL_H #include <iostream> #include <openssl/pem.h> #include "pki_x509.h" #include "x509name.h" #include "asn1time.h" #include "asn1int.h" class pki_crl: public pki_x509name { Q_OBJECT friend class pki_x509; protected: pki_x509 *issuer; X509_CRL *crl; public: pki_crl(const QString name = ""); /* destructor */ ~pki_crl(); void fromPEM_BIO(BIO *bio, QString name); void fload(const QString fname); QString getSigAlg(); void writeDefault(const QString fname); static QPixmap *icon; void createCrl(const QString d, pki_x509 *iss); void addRev(const x509rev &rev); void addExt(int nid, QString value); void write(QString fname); void addV3ext(const x509v3ext &e); void sign(pki_key *key, const EVP_MD *md = EVP_md5()); void writeCrl(const QString fname, bool pem = true); pki_x509 *getIssuer() { return issuer; } void setIssuer(pki_x509 *iss) { issuer = iss; } x509name getSubject() const; void setLastUpdate(const a1time &t); void setNextUpdate(const a1time &t); a1time getNextUpdate(); a1time getLastUpdate(); void fromData(const unsigned char *p, db_header_t *head); void oldFromData(unsigned char *p, int size); QByteArray toData(); int numRev(); bool verify(pki_key *pkey); x509rev getRev(int num); QString printV3ext(); x509v3ext getExtByNid(int nid); a1int getVersion(); QVariant column_data(dbheader *hd); QVariant getIcon(dbheader *hd); virtual QString getMsg(msg_type msg); void d2i(QByteArray &ba); QByteArray i2d(); void setCrlNumber(a1int num); bool getCrlNumber(a1int *num); BIO *pem(BIO *); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_evp.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000043626�11753427512�0015311�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_evp.h" #include "pass_info.h" #include "Passwd.h" #include "func.h" #include "db.h" #include "widgets/PwDialog.h" #include <openssl/rand.h> #include <openssl/evp.h> #include <openssl/pem.h> #include <QtGui/QProgressDialog> #include <QtGui/QApplication> #include <QtCore/QDir> Passwd pki_evp::passwd; Passwd pki_evp::oldpasswd; QString pki_evp::passHash = QString(); QPixmap *pki_evp::icon[2]= { NULL, NULL }; #ifndef OPENSSL_NO_EC EC_builtin_curve *pki_evp::curves = NULL; size_t pki_evp::num_curves = 0; unsigned char *pki_evp::curve_flags = NULL; #endif void pki_evp::init(int type) { key->type = type; class_name = "pki_evp"; ownPass = ptCommon; dataVersion=2; pkiType=asym_key; } QString pki_evp::removeTypeFromIntName(QString n) { if (n.right(1) != ")" ) return n; n.truncate(n.length() - 6); return n; } void pki_evp::setOwnPass(enum passType x) { EVP_PKEY *pk=NULL, *pk_back = key; int oldOwnPass = ownPass; if (ownPass == x || isPubKey()) return; try { pk = decryptKey(); if (pk == NULL) return; key = pk; ownPass = x; encryptKey(); } catch (errorEx &err) { if (pk) EVP_PKEY_free(pk); key = pk_back; ownPass = oldOwnPass; throw(err); } EVP_PKEY_free(pk_back); } void pki_evp::generate(int bits, int type, QProgressBar *progress, int curve_nid) { progress->setMinimum(0); progress->setMaximum(100); progress->setValue(50); switch (type) { case EVP_PKEY_RSA: RSA *rsakey; rsakey = RSA_generate_key(bits, 0x10001, inc_progress_bar, progress); if (rsakey) EVP_PKEY_assign_RSA(key, rsakey); break; case EVP_PKEY_DSA: DSA *dsakey; progress->setMaximum(500); dsakey = DSA_generate_parameters(bits, NULL, 0, NULL, NULL, inc_progress_bar, progress); DSA_generate_key(dsakey); if (dsakey) EVP_PKEY_assign_DSA(key, dsakey); break; #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: EC_KEY *eckey; EC_GROUP *group = EC_GROUP_new_by_curve_name(curve_nid); if (!group) break; eckey = EC_KEY_new(); if (eckey == NULL) { EC_GROUP_free(group); break; } EC_GROUP_set_asn1_flag(group, 1); if (EC_KEY_set_group(eckey, group)) { if (EC_KEY_generate_key(eckey)) { EVP_PKEY_assign_EC_KEY(key, eckey); EC_GROUP_free(group); break; } } EC_KEY_free(eckey); EC_GROUP_free(group); break; #endif } pki_openssl_error(); encryptKey(); } pki_evp::pki_evp(const pki_evp *pk) :pki_key(pk) { init(pk->key->type); pki_openssl_error(); ownPass = pk->ownPass; encKey = pk->encKey; } pki_evp::pki_evp(const QString name, int type ) :pki_key(name) { init(type); pki_openssl_error(); } pki_evp::pki_evp(EVP_PKEY *pkey) :pki_key() { init(); if (key) { EVP_PKEY_free(key); } key = pkey; } static bool EVP_PKEY_isPrivKey(EVP_PKEY *key) { switch (EVP_PKEY_type(key->type)) { case EVP_PKEY_RSA: return key->pkey.rsa->d ? true: false; case EVP_PKEY_DSA: return key->pkey.dsa->priv_key ? true: false; #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: return EC_KEY_get0_private_key(key->pkey.ec) ? true: false; #endif } return false; } QList<int> pki_evp::possibleHashNids() { QList<int> nids; switch (EVP_PKEY_type(key->type)) { case EVP_PKEY_RSA: nids << NID_md5 << NID_sha1 << NID_sha256 << NID_sha384 << NID_sha512 << NID_ripemd160; break; case EVP_PKEY_DSA: case EVP_PKEY_EC: nids << NID_sha1; } return nids; }; void pki_evp::openssl_pw_error(QString fname) { switch (ERR_peek_error() & 0xff000fff) { case ERR_PACK(ERR_LIB_PEM, 0, PEM_R_BAD_DECRYPT): case ERR_PACK(ERR_LIB_PEM, 0, PEM_R_BAD_PASSWORD_READ): case ERR_PACK(ERR_LIB_EVP, 0, EVP_R_BAD_DECRYPT): pki_ign_openssl_error(); throw errorEx(tr("Failed to decrypt the key (bad password) ")+ fname, class_name, E_PASSWD); } } void pki_evp::fromPEM_BIO(BIO *bio, QString name) { EVP_PKEY *pkey; int pos; pass_info p(XCA_TITLE, tr("Please enter the password to decrypt the private key.") + " " + name); pos = BIO_tell(bio); pkey = PEM_read_bio_PrivateKey(bio, NULL, PwDialog::pwCallback, &p); openssl_pw_error(name); if (!pkey){ pki_ign_openssl_error(); pos = BIO_seek(bio, pos); pkey = PEM_read_bio_PUBKEY(bio, NULL, PwDialog::pwCallback, &p); } if (pkey){ if (key) EVP_PKEY_free(key); key = pkey; if (EVP_PKEY_isPrivKey(key)) bogusEncryptKey(); setIntName(rmslashdot(name)); } openssl_error(name); } static void search_ec_oid(EVP_PKEY *pkey) { #ifndef OPENSSL_NO_EC if (pkey->type != EVP_PKEY_EC) return; EC_KEY *ec = pkey->pkey.ec; const EC_GROUP *ec_group = EC_KEY_get0_group(ec); EC_GROUP *builtin; if (!ec_group) return; if (EC_GROUP_get_curve_name(ec_group)) return; /* There is an EC_GROUP with a missing OID * because of explicit parameters */ for (size_t i=0; i<pki_evp::num_curves; i++) { int nid = pki_evp::curves[i].nid; builtin = EC_GROUP_new_by_curve_name(nid); if (EC_GROUP_cmp(builtin, ec_group, NULL) == 0) { EC_GROUP_set_curve_name((EC_GROUP *)ec_group, nid); EC_GROUP_set_asn1_flag((EC_GROUP *)ec_group, 1); EC_GROUP_free(builtin); break; } else { EC_GROUP_free(builtin); } } #endif } void pki_evp::fload(const QString fname) { pass_info p(XCA_TITLE, tr("Please enter the password to decrypt the private key from file:\n%1"). arg(compressFilename(fname))); pem_password_cb *cb = PwDialog::pwCallback; FILE *fp = fopen(QString2filename(fname), "r"); EVP_PKEY *pkey; pki_ign_openssl_error(); if (!fp) { fopen_error(fname); return; } pkey = PEM_read_PrivateKey(fp, NULL, cb, &p); try { openssl_pw_error(fname); } catch (errorEx &err) { fclose(fp); throw err; } if (!pkey) { pki_ign_openssl_error(); rewind(fp); pkey = d2i_PrivateKey_fp(fp, NULL); } if (!pkey) { pki_ign_openssl_error(); rewind(fp); pkey = d2i_PKCS8PrivateKey_fp(fp, NULL, cb, &p); } if (!pkey) { PKCS8_PRIV_KEY_INFO *p8inf; pki_ign_openssl_error(); rewind(fp); p8inf = d2i_PKCS8_PRIV_KEY_INFO_fp(fp, NULL); if (p8inf) { pkey = EVP_PKCS82PKEY(p8inf); PKCS8_PRIV_KEY_INFO_free(p8inf); } } if (!pkey) { pki_ign_openssl_error(); rewind(fp); pkey = PEM_read_PUBKEY(fp, NULL, cb, &p); } if (!pkey) { pki_ign_openssl_error(); rewind(fp); pkey = d2i_PUBKEY_fp(fp, NULL); } fclose(fp); if (pki_ign_openssl_error()) { if (pkey) EVP_PKEY_free(pkey); throw errorEx(tr("Unable to load the private key in file %1. Tried PEM and DER private, public and PKCS#8 key types.").arg(fname)); } if (pkey){ search_ec_oid(pkey); if (key) EVP_PKEY_free(key); key = pkey; if (EVP_PKEY_isPrivKey(key)) bogusEncryptKey(); setIntName(rmslashdot(fname)); } } void pki_evp::fromData(const unsigned char *p, db_header_t *head ) { int version, type, size; size = head->len - sizeof(db_header_t); version = head->version; QByteArray ba((const char*)p, size); if (key) EVP_PKEY_free(key); key = NULL; type = db::intFromData(ba); ownPass = db::intFromData(ba); if (version < 2) { d2i_old(ba, type); } else { d2i(ba); } pki_openssl_error(); encKey = ba; } EVP_PKEY *pki_evp::decryptKey() const { unsigned char *p; const unsigned char *p1; int outl, decsize; unsigned char iv[EVP_MAX_IV_LENGTH]; unsigned char ckey[EVP_MAX_KEY_LENGTH]; EVP_PKEY *tmpkey; EVP_CIPHER_CTX ctx; const EVP_CIPHER *cipher = EVP_des_ede3_cbc(); Passwd ownPassBuf; int ret; if (isPubKey()) { unsigned char *q; outl = i2d_PUBKEY(key, NULL); p = q = (unsigned char *)OPENSSL_malloc(outl); check_oom(q); i2d_PUBKEY(key, &p); p = q; tmpkey = d2i_PUBKEY(NULL, (const unsigned char**)&p, outl); OPENSSL_free(q); return tmpkey; } /* This key has its own password */ if (ownPass == ptPrivate) { pass_info pi(XCA_TITLE, tr("Please enter the password to decrypt the private key: '%1'").arg(getIntName())); ret = PwDialog::execute(&pi, &ownPassBuf, false); if (ret != 1) throw errorEx(tr("Password input aborted"), class_name); } else if (ownPass == ptBogus) { // BOGUS pass ownPassBuf = "Bogus"; } else { ownPassBuf = passwd; while (md5passwd(ownPassBuf) != passHash && sha512passwd(ownPassBuf, passHash) != passHash) { pass_info p(XCA_TITLE, tr("Please enter the database password for decrypting the key '%1'").arg(getIntName())); ret = PwDialog::execute(&p, &ownPassBuf, false); if (ret != 1) throw errorEx(tr("Password input aborted"), class_name); } } p = (unsigned char *)OPENSSL_malloc(encKey.count()); check_oom(p); pki_openssl_error(); p1 = p; memset(iv, 0, EVP_MAX_IV_LENGTH); memcpy(iv, encKey.constData(), 8); /* recover the iv */ /* generate the key */ EVP_BytesToKey(cipher, EVP_sha1(), iv, ownPassBuf.constUchar(), ownPassBuf.size(), 1, ckey, NULL); /* we use sha1 as message digest, * because an md5 version of the password is * stored in the database... */ EVP_CIPHER_CTX_init(&ctx); EVP_DecryptInit(&ctx, cipher, ckey, iv); EVP_DecryptUpdate(&ctx, p , &outl, (const unsigned char*)encKey.constData() +8, encKey.count() -8); decsize = outl; EVP_DecryptFinal(&ctx, p + decsize , &outl); decsize += outl; //printf("Decrypt decsize=%d, encKey_len=%d\n", decsize, encKey.count() -8); pki_openssl_error(); tmpkey = d2i_PrivateKey(key->type, NULL, &p1, decsize); pki_openssl_error(); OPENSSL_free(p); EVP_CIPHER_CTX_cleanup(&ctx); pki_openssl_error(); if (EVP_PKEY_type(tmpkey->type) == EVP_PKEY_RSA) RSA_blinding_on(tmpkey->pkey.rsa, NULL); return tmpkey; } QByteArray pki_evp::toData() { QByteArray ba; ba += db::intToData(key->type); ba += db::intToData(ownPass); ba += i2d(); ba += encKey; return ba; } EVP_PKEY *pki_evp::priv2pub(EVP_PKEY* key) { int keylen; unsigned char *p, *p1; EVP_PKEY *pubkey; keylen = i2d_PUBKEY(key, NULL); p1 = p = (unsigned char *)OPENSSL_malloc(keylen); check_oom(p); /* convert rsa/dsa/ec to Pubkey */ keylen = i2d_PUBKEY(key, &p); pki_openssl_error(); p = p1; pubkey = d2i_PUBKEY(NULL, (const unsigned char**)&p, keylen); OPENSSL_free(p1); pki_openssl_error(); return pubkey; } void pki_evp::encryptKey(const char *password) { int outl, keylen; EVP_PKEY *pkey1 = NULL; EVP_CIPHER_CTX ctx; const EVP_CIPHER *cipher = EVP_des_ede3_cbc(); unsigned char iv[EVP_MAX_IV_LENGTH], *punenc, *punenc1; unsigned char ckey[EVP_MAX_KEY_LENGTH]; Passwd ownPassBuf; /* This key has its own, private password */ if (ownPass == ptPrivate) { int ret; pass_info p(XCA_TITLE, tr("Please enter the password to protect the private key: '%1'"). arg(getIntName())); ret = PwDialog::execute(&p, &ownPassBuf, true); if (ret != 1) throw errorEx("Password input aborted", class_name); } else if (ownPass == ptBogus) { // BOGUS password ownPassBuf = "Bogus"; } else { if (password) { /* use the password parameter * if this is a common password */ ownPassBuf = password; } else { int ret = 0; ownPassBuf = passwd; pass_info p(XCA_TITLE, tr("Please enter the database password for encrypting the key")); while (md5passwd(ownPassBuf) != passHash && sha512passwd(ownPassBuf, passHash) != passHash ) { ret = PwDialog::execute(&p, &ownPassBuf, false); if (ret != 1) throw errorEx("Password input aborted", class_name); } } } /* Prepare Encryption */ memset(iv, 0, EVP_MAX_IV_LENGTH); RAND_pseudo_bytes(iv,8); /* Generate a salt */ EVP_BytesToKey(cipher, EVP_sha1(), iv, ownPassBuf.constUchar(), ownPassBuf.size(), 1, ckey, NULL); EVP_CIPHER_CTX_init (&ctx); pki_openssl_error(); /* reserve space for unencrypted and encrypted key */ keylen = i2d_PrivateKey(key, NULL); encKey.resize(keylen + EVP_MAX_KEY_LENGTH + 8); punenc1 = punenc = (unsigned char *)OPENSSL_malloc(keylen); check_oom(punenc); keylen = i2d_PrivateKey(key, &punenc1); pki_openssl_error(); memcpy(encKey.data(), iv, 8); /* store the iv */ /* * Now DER version of privkey is in punenc * and privkey is still in key */ /* do the encryption */ /* store key right after the iv */ EVP_EncryptInit(&ctx, cipher, ckey, iv); unsigned char *penc = (unsigned char *)encKey.data() +8; EVP_EncryptUpdate(&ctx, penc, &outl, punenc, keylen); int encKey_len = outl; EVP_EncryptFinal(&ctx, penc + encKey_len, &outl); encKey.resize(encKey_len + outl +8); /* Cleanup */ EVP_CIPHER_CTX_cleanup(&ctx); /* wipe out the memory */ memset(punenc, 0, keylen); OPENSSL_free(punenc); pki_openssl_error(); pkey1 = priv2pub(key); check_oom(pkey1); EVP_PKEY_free(key); key = pkey1; pki_openssl_error(); //CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF); //printf("Encrypt: encKey_len=%d\n", encKey_len); return; } void pki_evp::set_evp_key(EVP_PKEY *pkey) { if (key) free(key); key = pkey; } void pki_evp::bogusEncryptKey() { ownPass = ptBogus; encryptKey(); } pki_evp::~pki_evp() { } void pki_evp::writePKCS8(const QString fname, const EVP_CIPHER *enc, pem_password_cb *cb, bool pem) { EVP_PKEY *pkey; pass_info p(XCA_TITLE, tr("Please enter the password protecting the PKCS#8 key '%1'").arg(getIntName())); FILE *fp = fopen(QString2filename(fname), "w"); if (fp != NULL) { if (key) { pkey = decryptKey(); if (pkey) { if (pem) PEM_write_PKCS8PrivateKey(fp, pkey, enc, NULL, 0, cb, &p); else i2d_PKCS8PrivateKey_fp(fp, pkey, enc, NULL, 0, cb, &p); EVP_PKEY_free(pkey); } } fclose(fp); pki_openssl_error(); } else fopen_error(fname); } static int mycb(char *buf, int size, int, void *) { strncpy(buf, pki_evp::passwd, size); return strlen(pki_evp::passwd); } void pki_evp::writeDefault(const QString fname) { writeKey(fname + QDir::separator() + getIntName() + ".pem", EVP_des_ede3_cbc(), mycb, true); } void pki_evp::writeKey(const QString fname, const EVP_CIPHER *enc, pem_password_cb *cb, bool pem) { EVP_PKEY *pkey; pass_info p(XCA_TITLE, tr("Please enter the export password for the private key '%1'").arg(getIntName())); if (isPubKey()) { writePublic(fname, pem); return; } FILE *fp = fopen(QString2filename(fname), "w"); if (!fp) { fopen_error(fname); return; } if (key){ pkey = decryptKey(); if (pkey) { if (pem) { switch (pkey->type) { case EVP_PKEY_RSA: PEM_write_RSAPrivateKey(fp, pkey->pkey.rsa, enc, NULL, 0, cb, &p); break; case EVP_PKEY_DSA: PEM_write_DSAPrivateKey(fp, pkey->pkey.dsa, enc, NULL, 0, cb, &p); break; #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: PEM_write_ECPrivateKey(fp, pkey->pkey.ec, enc, NULL, 0, cb, &p); break; #endif default: PEM_write_PrivateKey(fp, pkey, enc, NULL, 0, cb, &p); } } else { i2d_PrivateKey_fp(fp, pkey); } EVP_PKEY_free(pkey); } pki_openssl_error(); } fclose(fp); } bool pki_evp::isPubKey() const { if (encKey.count() == 0) { return true; } return false; } int pki_evp::verify() { bool veri = false; return true; if (key->type == EVP_PKEY_RSA && isPrivKey()) { if (RSA_check_key(key->pkey.rsa) == 1) veri = true; } if (isPrivKey()) veri = true; pki_openssl_error(); return veri; } const EVP_MD *pki_evp::getDefaultMD() { const EVP_MD *md; switch (key->type) { case EVP_PKEY_RSA: md = EVP_sha1(); break; case EVP_PKEY_DSA: md = EVP_dss1(); break; #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: md = EVP_ecdsa(); break; #endif default: md = NULL; break; } return md; } QVariant pki_evp::getIcon(dbheader *hd) { if (hd->id != HD_internal_name) return QVariant(); int pixnum= isPubKey() ? 1 : 0; return QVariant(*icon[pixnum]); } QString pki_evp::md5passwd(QByteArray pass) { EVP_MD_CTX mdctx; QString str; int n; int j; unsigned char m[EVP_MAX_MD_SIZE]; EVP_DigestInit(&mdctx, EVP_md5()); EVP_DigestUpdate(&mdctx, pass.constData(), pass.size()); EVP_DigestFinal(&mdctx, m, (unsigned*)&n); for (j=0; j<n; j++) { char zs[4]; sprintf(zs, "%02X%c",m[j], (j+1 == n) ?'\0':':'); str += zs; } return str; } QString pki_evp::sha512passwd(QByteArray pass, QString salt) { EVP_MD_CTX mdctx; QString str; int n; int j; unsigned char m[EVP_MAX_MD_SIZE]; if (salt.length() <5) abort(); str = salt.left(5); pass = str.toAscii() + pass; EVP_DigestInit(&mdctx, EVP_sha512()); EVP_DigestUpdate(&mdctx, pass.constData(), pass.size()); EVP_DigestFinal(&mdctx, m, (unsigned*)&n); for (j=0; j<n; j++) { char zs[4]; sprintf(zs, "%02X",m[j]); str += zs; } return str; } void pki_evp::veryOldFromData(unsigned char *p, int size ) { unsigned char *sik, *pdec, *pdec1, *sik1; int outl, decsize; unsigned char iv[EVP_MAX_IV_LENGTH]; unsigned char ckey[EVP_MAX_KEY_LENGTH]; memset(iv, 0, EVP_MAX_IV_LENGTH); RSA *rsakey; EVP_CIPHER_CTX ctx; const EVP_CIPHER *cipher = EVP_des_ede3_cbc(); sik = (unsigned char *)OPENSSL_malloc(size); check_oom(sik); pki_openssl_error(); pdec = (unsigned char *)OPENSSL_malloc(size); if (pdec == NULL ) { OPENSSL_free(sik); check_oom(pdec); } pdec1=pdec; sik1=sik; memcpy(iv, p, 8); /* recover the iv */ /* generate the key */ EVP_BytesToKey(cipher, EVP_sha1(), iv, oldpasswd.constUchar(), oldpasswd.size(), 1, ckey, NULL); /* we use sha1 as message digest, * because an md5 version of the password is * stored in the database... */ EVP_CIPHER_CTX_init (&ctx); EVP_DecryptInit( &ctx, cipher, ckey, iv); EVP_DecryptUpdate( &ctx, pdec , &outl, p + 8, size -8 ); decsize = outl; EVP_DecryptFinal( &ctx, pdec + decsize , &outl ); decsize += outl; pki_openssl_error(); memcpy(sik, pdec, decsize); if (key->type == EVP_PKEY_RSA) { rsakey=d2i_RSAPrivateKey(NULL,(const unsigned char **)&pdec, decsize); if (pki_ign_openssl_error()) { rsakey = d2i_RSA_PUBKEY(NULL, (const unsigned char **)&sik, decsize); } pki_openssl_error(); if (rsakey) EVP_PKEY_assign_RSA(key, rsakey); } OPENSSL_free(sik1); OPENSSL_free(pdec1); EVP_CIPHER_CTX_cleanup(&ctx); pki_openssl_error(); encryptKey(); } void pki_evp::oldFromData(unsigned char *p, int size ) { int version, type; QByteArray ba; version = intFromData(ba); if (version != 1) { // backward compatibility veryOldFromData(p, size); return; } if (key) EVP_PKEY_free(key); key = NULL; type = intFromData(ba); ownPass = intFromData(ba); d2i_old(ba, type); pki_openssl_error(); encKey = ba; } ����������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_evp.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000004071�11753427512�0014745�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_EVP_H #define __PKI_EVP_H #include <QtCore/QString> #include <QtGui/QProgressBar> #include <openssl/rsa.h> #include <openssl/bn.h> #include <openssl/pem.h> #include <openssl/evp.h> #include "pki_key.h" #include "Passwd.h" #define CURVE_X962 1 #define CURVE_OTHER 2 class pki_evp: public pki_key { Q_OBJECT protected: QByteArray encKey; void init(int type = EVP_PKEY_RSA); void veryOldFromData(unsigned char *p, int size); void openssl_pw_error(QString fname); public: static QPixmap *icon[2]; static QString passHash; static Passwd passwd; static Passwd oldpasswd; static QString md5passwd(QByteArray pass); static QString sha512passwd(QByteArray pass, QString salt); #ifndef OPENSSL_NO_EC static EC_builtin_curve *curves; static size_t num_curves; static unsigned char *curve_flags; #endif void generate(int bits, int type, QProgressBar *progress); void generate(int bits, int type, QProgressBar *progress, int curve_nid); void setOwnPass(enum passType); pki_evp(const QString name = "", int type = EVP_PKEY_RSA); pki_evp(EVP_PKEY *pkey); void set_evp_key(EVP_PKEY *pkey); void encryptKey(const char *password = NULL); void bogusEncryptKey(); EVP_PKEY *decryptKey() const; pki_evp(const pki_evp *pk); /* destructor */ virtual ~pki_evp(); QList<int> possibleHashNids(); EVP_PKEY *priv2pub(EVP_PKEY* key); static QString removeTypeFromIntName(QString n); void fromPEM_BIO(BIO *bio, QString name); void fload(const QString fname); void writeDefault(const QString fname); void fromData(const unsigned char *p, db_header_t *head); void oldFromData(unsigned char *p, int size); QByteArray toData(); void writeKey(const QString fname, const EVP_CIPHER *enc, pem_password_cb *cb, bool pem); void writePKCS8(const QString fname, const EVP_CIPHER *enc, pem_password_cb *cb, bool pem); bool isPubKey() const; int verify(); const EVP_MD *getDefaultMD(); QVariant getIcon(dbheader *hd); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_key.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000014073�11753427512�0015301�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_key.h" #include "func.h" #include "db.h" #include <openssl/rand.h> #include <QtGui/QProgressDialog> #include <QtGui/QApplication> #include <QtCore/QDir> #include "widgets/PwDialog.h" pki_key::pki_key(const QString name) :pki_base(name) { key = EVP_PKEY_new(); ucount = 0; class_name = "pki_key"; } pki_key::pki_key(const pki_key *pk) :pki_base(pk->desc) { int keylen; unsigned char *der_key, *p; ucount = pk->ucount; keylen = i2d_PUBKEY(pk->key, NULL); p = der_key = (unsigned char *)OPENSSL_malloc(keylen); check_oom(der_key); i2d_PUBKEY(pk->key, &p); p = der_key; key = d2i_PUBKEY(NULL, (const unsigned char**)&p, keylen); OPENSSL_free(der_key); pki_openssl_error(); } pki_key::~pki_key() { if (key) EVP_PKEY_free(key); } void pki_key::d2i(QByteArray &ba) { EVP_PKEY *k = (EVP_PKEY*)d2i_bytearray(D2I_VOID(d2i_PUBKEY), ba); if (k) { EVP_PKEY_free(key); key = k; } } void pki_key::d2i_old(QByteArray &ba, int type) { if (key) EVP_PKEY_free(key); const unsigned char *p, *p1; p = p1 = (const unsigned char *)ba.constData(); key = d2i_PublicKey(type, NULL, &p1, ba.count()); ba = ba.mid(p1-p); pki_openssl_error(); } QByteArray pki_key::i2d() { return i2d_bytearray(I2D_VOID(i2d_PUBKEY), key); } QString pki_key::length() { if (key->type == EVP_PKEY_DSA && key->pkey.dsa->p == NULL) { return QString("???"); } return QString("%1 bit").arg(EVP_PKEY_bits(key)); } QString pki_key::getTypeString() { QString type; switch (EVP_PKEY_type(key->type)) { case EVP_PKEY_RSA: type = "RSA"; break; case EVP_PKEY_DSA: type = "DSA"; break; case EVP_PKEY_EC: type = "EC"; break; default: type = "---"; } return type; } QString pki_key::getMsg(msg_type msg) { /* * We do not construct english sentences (just a little bit) * from fragments to allow proper translations. * The drawback are all the slightly different duplicated messages * * %1 will be replaced by "RSA", "DSA", "EC" * %2 is the internal name of the key */ QString ktype = getTypeString(); if (isPubKey()) { switch (msg) { case msg_import: return tr("Successfully imported the %1 public key '%2'").arg(ktype); case msg_delete: return tr("Delete the %1 public key '%2'?").arg(ktype); default: break; } } else { switch (msg) { case msg_import: return tr("Successfully imported the %1 private key '%2'").arg(ktype); case msg_delete: return tr("Delete the %1 private key '%2'?").arg(ktype); case msg_create: return tr("Successfully created the %1 private key '%2'").arg(ktype); default: break; } } if (msg == msg_delete_multi) { /* %1: Number of keys; %2: list of keynames */ return tr("Delete the %1 keys: %2?"); } return pki_base::getMsg(msg); } QString pki_key::getIntNameWithType() { return QString("%1 (%2%3)").arg(getIntName()).arg(getTypeString()). arg(isPubKey() ? QString(" ") + tr("public key") : QString("")); } QString pki_key::removeTypeFromIntName(QString n) { int i; if (n.right(1) != ")" ) return n; i = n.lastIndexOf(" ("); if (i > 0) n.truncate(i); return n; } bool pki_key::isToken() { return false; } bool pki_key::isPrivKey() const { return !isPubKey(); } int pki_key::incUcount() { ucount++; return ucount; } int pki_key::decUcount() { ucount--; return ucount; } int pki_key::getUcount() { return ucount; } int pki_key::getKeyType() { return key->type; } QString pki_key::modulus() { if (key->type == EVP_PKEY_RSA) return BN2QString(key->pkey.rsa->n); return QString(); } QString pki_key::pubEx() { if (key->type == EVP_PKEY_RSA) return BN2QString(key->pkey.rsa->e); return QString(); } QString pki_key::subprime() { if (key->type == EVP_PKEY_DSA) return BN2QString(key->pkey.dsa->q); return QString(); } QString pki_key::pubkey() { if (key->type == EVP_PKEY_DSA) return BN2QString(key->pkey.dsa->pub_key); return QString(); } #ifndef OPENSSL_NO_EC int pki_key::ecParamNid() { if (key->type != EVP_PKEY_EC) return 0; return EC_GROUP_get_curve_name(EC_KEY_get0_group(key->pkey.ec)); } QString pki_key::ecPubKey() { QString pub; if (key->type == EVP_PKEY_EC) { EC_KEY *ec = key->pkey.ec; BIGNUM *pub_key = EC_POINT_point2bn(EC_KEY_get0_group(ec), EC_KEY_get0_public_key(ec), EC_KEY_get_conv_form(ec), NULL, NULL); if (pub_key) { pub = BN2QString(pub_key); BN_free(pub_key); } } return pub; } #endif bool pki_key::compare(pki_base *ref) { pki_key *kref = (pki_key *)ref; if (kref->getKeyType() != getKeyType()) return false; if (!kref || !kref->key || !key) return false; int r = EVP_PKEY_cmp(key, kref->key); pki_openssl_error(); return r == 1; } void pki_key::writePublic(const QString fname, bool pem) { FILE *fp = fopen(QString2filename(fname), "w"); if (fp == NULL) { fopen_error(fname); return; } if (pem) PEM_write_PUBKEY(fp, key); else i2d_PUBKEY_fp(fp, key); fclose(fp); pki_openssl_error(); } QString pki_key::BNoneLine(BIGNUM *bn) const { QString x; if (bn) { char *hex = BN_bn2hex(bn); x = hex; OPENSSL_free(hex); pki_openssl_error(); } return x; } QString pki_key::BN2QString(BIGNUM *bn) const { if (bn == NULL) return "--"; QString x=""; char zs[10]; int j; int size = BN_num_bytes(bn); unsigned char *buf = (unsigned char *)OPENSSL_malloc(size); check_oom(buf); BN_bn2bin(bn, buf); for (j = 0; j< size; j++) { sprintf(zs, "%02X%c",buf[j], ((j+1)%16 == 0) ? '\n' : j<size-1 ? ':' : ' '); x += zs; } OPENSSL_free(buf); pki_openssl_error(); return x; } QVariant pki_key::column_data(dbheader *hd) { QStringList sl; sl << tr("Common") << tr("Private") << tr("Bogus") << tr("PIN"); switch (hd->id) { case HD_key_type: return QVariant(getTypeString()); case HD_key_size: return QVariant(length()); case HD_key_use: return QVariant(getUcount()); case HD_key_passwd: if (isPubKey()) return QVariant(tr("No password")); if (ownPass<0 || ownPass>3) return QVariant("Holla die Waldfee"); return QVariant(sl[ownPass]); } return pki_base::column_data(hd); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_key.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000003374�11753427512�0014750�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_KEY_H #define __PKI_KEY_H #include <QtCore/QString> #include <QtGui/QProgressBar> #include <openssl/rsa.h> #include <openssl/bn.h> #include <openssl/pem.h> #include <openssl/evp.h> #include "pki_base.h" #define MAX_KEY_LENGTH 4096 class pki_key: public pki_base { Q_OBJECT protected: int ownPass; EVP_PKEY *key; QString BN2QString(BIGNUM *bn) const; QString BNoneLine(BIGNUM *bn) const; private: int ucount; // usage counter public: pki_key(const QString name = ""); pki_key(const pki_key *pk); virtual ~pki_key(); enum passType { ptCommon, ptPrivate, ptBogus, ptPin }; virtual EVP_PKEY *decryptKey() const { return NULL; } virtual QString length() const { return QString(); } virtual bool isPubKey() const { return true; } virtual const EVP_MD *getDefaultMD() { return NULL; } virtual bool isToken(); virtual QString getTypeString(void); virtual QString getIntNameWithType(void); virtual QList<int> possibleHashNids() { return QList<int>(); } virtual QString getMsg(msg_type msg); virtual QString length(); void writePublic(const QString fname, bool pem); bool compare(pki_base *ref); int getKeyType(); static QString removeTypeFromIntName(QString n); bool isPrivKey() const; int incUcount(); int decUcount(); int getUcount(); int getOwnPass(void) { return ownPass; } EVP_PKEY *getPubKey() { return key; } QVariant column_data(dbheader *hd); QString modulus(); QString pubEx(); QString subprime(); QString pubkey(); int ecParamNid(); QString ecPubKey(); void d2i(QByteArray &ba); void d2i_old(QByteArray &ba, int type); QByteArray i2d(); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_multi.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000007320�11753427512�0015640�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_multi.h" #include "pki_x509.h" #include "pki_key.h" #include "pki_x509req.h" #include "pki_pkcs7.h" #include "pki_pkcs12.h" #include "pki_crl.h" #include "load_obj.h" #include "exception.h" #include "func.h" #include "widgets/MainWindow.h" #include <QtCore/QList> pki_multi::pki_multi(const QString name) :pki_base(name) { multi.clear(); class_name="pki_multi"; } pki_multi::~pki_multi() { pki_base *pki; while ((pki = pull())) delete pki; } pki_base *pki_multi::pull() { if (multi.isEmpty()) return NULL; return multi.takeFirst(); } /* General PEM loader */ static pki_base *pkiByPEM(QString text, int *skip) { int pos; #define D5 "-----" #define BEGIN D5 "BEGIN " pos = text.indexOf(BEGIN); if (pos <0) { if (skip) *skip = text.length() - (sizeof(BEGIN)-1); return NULL; } if (skip) { *skip = pos; if (pos) /* if we are not at the beginning, retry */ return NULL; } text = text.remove(0, pos + sizeof(BEGIN)-1); if (text.startsWith(PEM_STRING_X509_OLD D5) || text.startsWith(PEM_STRING_X509 D5) || text.startsWith(PEM_STRING_X509_TRUSTED D5)) return new pki_x509(); if (text.startsWith(PEM_STRING_PKCS7 D5)) return new pki_pkcs7(); if (text.startsWith(PEM_STRING_X509_REQ_OLD D5) || text.startsWith(PEM_STRING_X509_REQ D5)) return new pki_x509req(); if (text.startsWith(PEM_STRING_X509_CRL D5)) return new pki_crl(); if (text.startsWith(PEM_STRING_EVP_PKEY D5) || text.startsWith(PEM_STRING_PUBLIC D5) || text.startsWith(PEM_STRING_RSA D5) || text.startsWith(PEM_STRING_RSA_PUBLIC D5) || text.startsWith(PEM_STRING_DSA D5) || text.startsWith(PEM_STRING_DSA_PUBLIC D5) || text.startsWith(PEM_STRING_ECDSA_PUBLIC D5) || text.startsWith(PEM_STRING_ECPRIVATEKEY D5) || text.startsWith(PEM_STRING_PKCS8 D5) || text.startsWith(PEM_STRING_PKCS8INF D5)) return new pki_evp(); return NULL; } void pki_multi::fload(const QString fname) { FILE * fp; BIO *bio = NULL; fp = fopen(QString2filename(fname), "r"); if (!fp) { fopen_error(fname); return; } bio = BIO_new_fp(fp, BIO_CLOSE); fromPEM_BIO(bio, fname); BIO_free(bio); }; #define BUFLEN 1024 void pki_multi::fromPEM_BIO(BIO *bio, QString name) { QString text; pki_base *item = NULL; char buf[BUFLEN]; int len, startpos; for (;;) { try { int pos = BIO_tell(bio); len = BIO_read(bio, buf, BUFLEN-1); buf[len] = '\0'; text = buf; item = pkiByPEM(text, &startpos); if (!item) { if (startpos <= 0) break; if (BIO_seek(bio, pos + startpos) == -1) throw errorEx(tr("Seek failed")); continue; } pos += startpos; if (BIO_seek(bio, pos) == -1) throw errorEx(tr("Seek failed")); item->fromPEM_BIO(bio, name); if (pos == BIO_tell(bio)) { /* No progress, do it manually */ if (BIO_seek(bio, pos + 1)) throw errorEx(tr("Seek failed")); printf("Could not load: %s\n", CCHAR(item->getClassName())); delete item; continue; } openssl_error(); multi.append(item); } catch (errorEx &err) { MainWindow::Error(err); if (item) delete item; item = NULL; } } } void pki_multi::probeAnything(const QString fname) { pki_base *item = NULL; load_base *lb; QList<load_base *> lbs; lbs << new load_cert() << new load_pkcs7() << new load_pkcs12() << new load_crl() << new load_req() << new load_key() << new load_temp(); foreach(lb, lbs) { try { item = lb->loadItem(fname); if (item) { multi.append(item); break; } } catch (errorEx &err) { if (err.info == E_PASSWD) { MainWindow::Error(err); break; } } } while (!lbs.isEmpty()) delete lbs.takeFirst(); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_multi.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001155�11753427512�0015305�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_MULTI_H #define __PKI_MULTI_H #include <openssl/pem.h> #include "pki_x509.h" #include "x509name.h" #include "asn1time.h" #include "asn1int.h" class pki_multi: public pki_base { Q_OBJECT protected: QList<pki_base*> multi; public: pki_multi(const QString name = ""); ~pki_multi(); void fromPEM_BIO(BIO *bio, QString name); void fload(const QString fname); void probeAnything(const QString fname); pki_base *pull(); int count() const { return multi.count(); } }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_pkcs12.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000007343�11753427512�0015616�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_pkcs12.h" #include "pass_info.h" #include "exception.h" #include "func.h" #include "widgets/PwDialog.h" #include <openssl/err.h> #include <QtGui/QMessageBox> pki_pkcs12::pki_pkcs12(const QString d, pki_x509 *acert, pki_evp *akey) :pki_base(d) { class_name="pki_pkcs12"; key = new pki_evp(akey); cert = new pki_x509(acert); certstack = sk_X509_new_null(); openssl_error(); } pki_pkcs12::pki_pkcs12(const QString fname) :pki_base(fname) { FILE *fp; Passwd pass; EVP_PKEY *mykey = NULL; X509 *mycert = NULL; key=NULL; cert=NULL; class_name="pki_pkcs12"; certstack = sk_X509_new_null(); pass_info p(XCA_TITLE, tr("Please enter the password to decrypt the PKCS#12 file:\n%1").arg(compressFilename(fname))); fp = fopen(QString2filename(fname), "rb"); if (fp) { PKCS12 *pkcs12 = d2i_PKCS12_fp(fp, NULL); fclose(fp); if (ign_openssl_error()) { if (pkcs12) PKCS12_free(pkcs12); throw errorEx(tr("Unable to load the PKCS#12 (pfx) file %1.").arg(fname)); } if (PKCS12_verify_mac(pkcs12, "", 0) || PKCS12_verify_mac(pkcs12, NULL, 0)) pass.clear(); else if (PwDialog::execute(&p, &pass) != 1) { /* cancel pressed */ PKCS12_free(pkcs12); throw errorEx("","", E_PASSWD); } PKCS12_parse(pkcs12, pass.constData(), &mykey, &mycert, &certstack); int error = ERR_peek_error(); if (ERR_GET_REASON(error) == PKCS12_R_MAC_VERIFY_FAILURE) { ign_openssl_error(); PKCS12_free(pkcs12); throw errorEx(getClassName(), tr("The supplied password was wrong (%1)").arg(ERR_reason_error_string(error)), E_PASSWD); } ign_openssl_error(); if (mycert) { if (mycert->aux && mycert->aux->alias) { alias = asn1ToQString(mycert->aux->alias); alias = QString::fromUtf8(alias.toAscii()); } cert = new pki_x509(mycert); if (alias.isEmpty()) { cert->autoIntName(); } else { cert->setIntName(alias); } alias = cert->getIntName(); } if (mykey) { key = new pki_evp(mykey); key->setIntName(alias + "_key"); key->bogusEncryptKey(); } PKCS12_free(pkcs12); } else fopen_error(fname); } pki_pkcs12::~pki_pkcs12() { if (sk_X509_num(certstack)>0) { // free the certs itself, because we own a copy of them sk_X509_pop_free(certstack, X509_free); } if (key) { delete(key); } if (cert) { delete(cert); } openssl_error(); } void pki_pkcs12::addCaCert(pki_x509 *ca) { if (!ca) return; sk_X509_push(certstack, X509_dup(ca->getCert())); openssl_error(); } void pki_pkcs12::writePKCS12(const QString fname) { Passwd pass; pass_info p(XCA_TITLE, tr("Please enter the password to encrypt the PKCS#12 file")); if (cert == NULL || key == NULL) { my_error(tr("No key or no Cert and no pkcs12")); } FILE *fp = fopen(QString2filename(fname), "wb"); if (fp != NULL) { if (PwDialog::execute(&p, &pass, true) != 1) { fclose(fp); return; } PKCS12 *pkcs12 = PKCS12_create(pass.data(), getIntName().toUtf8().data(), key->decryptKey(), cert->getCert(), certstack, 0, 0, 0, 0, 0); i2d_PKCS12_fp(fp, pkcs12); fclose (fp); openssl_error(); PKCS12_free(pkcs12); } else fopen_error(fname); } int pki_pkcs12::numCa() { int n= sk_X509_num(certstack); openssl_error(); return n; } pki_key *pki_pkcs12::getKey() { if (!key) return NULL; return new pki_evp(key); } pki_x509 *pki_pkcs12::getCert() { if (!cert) return NULL; return new pki_x509(cert); } pki_x509 *pki_pkcs12::getCa(int x) { pki_x509 *cert = NULL; X509 *crt = X509_dup(sk_X509_value(certstack, x)); if (crt) { cert = new pki_x509(crt); if (alias.isEmpty()) { cert->autoIntName(); } else { cert->setIntName(QString(alias + "_ca_%1").arg(x)); } } openssl_error(); return cert; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_pkcs12.h��������������������������������������������������������������������������0000664�0000000�0000000�00000001536�11753427512�0015261�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_PKCS12_H #define __PKI_PKCS12_H #include <iostream> #include <openssl/pem.h> #include <openssl/stack.h> #include <openssl/evp.h> #include <openssl/x509.h> #include <openssl/pkcs12.h> #include "pki_evp.h" #include "pki_x509.h" class pki_pkcs12: public pki_base { Q_OBJECT friend class pki_x509; friend class pki_evp; protected: QString alias; pki_x509 *cert; pki_evp *key; STACK_OF(X509) *certstack; public: pki_pkcs12(const QString d, pki_x509 *acert, pki_evp *akey); pki_pkcs12(const QString fname); ~pki_pkcs12(); void addCaCert(pki_x509 *acert); pki_key *getKey(); pki_x509 *getCert(); pki_x509 *getCa(int x); int numCa(); // number of ca certs; void writePKCS12(const QString fname); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_pkcs7.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000007546�11753427512�0015547�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_pkcs7.h" #include "func.h" #include "exception.h" pki_pkcs7::pki_pkcs7(const QString name) :pki_base(name) { p7 = PKCS7_new(); PKCS7_set_type(p7, NID_pkcs7_signed); PKCS7_content_new(p7, NID_pkcs7_data); class_name = "pki_pkcs7"; } pki_pkcs7::~pki_pkcs7() { if (p7) PKCS7_free(p7); } void pki_pkcs7::encryptFile(pki_x509 *crt, QString filename) { BIO *bio = NULL; bio = BIO_new_file(QString2filename(filename), "r"); openssl_error(); encryptBio(crt, bio); BIO_free(bio); } void pki_pkcs7::encryptBio(pki_x509 *crt, BIO *bio) { STACK_OF(X509) *certstack; if (!crt) return; certstack = sk_X509_new_null(); sk_X509_push(certstack, crt->getCert()); openssl_error(); if (p7) PKCS7_free(p7); p7 = PKCS7_encrypt(certstack, bio, EVP_des_ede3_cbc(), PKCS7_BINARY); openssl_error(); sk_X509_free(certstack); } void pki_pkcs7::signBio(pki_x509 *crt, BIO *bio) { pki_key *privkey; EVP_PKEY *pk; STACK_OF(X509) *certstack; if (!crt) return; privkey = crt->getRefKey(); if (!privkey) throw errorEx("No private key for signing found", class_name); certstack = sk_X509_new_null(); pki_x509 *signer = crt->getSigner(); if (signer == crt) signer = NULL; while (signer != NULL ) { sk_X509_push(certstack, signer->getCert()); openssl_error(); if (signer == signer->getSigner() ) signer = NULL; else signer = signer->getSigner(); } if (p7) PKCS7_free(p7); pk = privkey->decryptKey(); p7 = PKCS7_sign(crt->getCert(), pk, certstack, bio, PKCS7_BINARY); EVP_PKEY_free(pk); openssl_error(); sk_X509_free(certstack); } void pki_pkcs7::signFile(pki_x509 *crt, QString filename) { BIO *bio = NULL; if (!crt) return; bio = BIO_new_file(QString2filename(filename), "r"); openssl_error(); signBio(crt, bio); BIO_free(bio); } void pki_pkcs7::signCert(pki_x509 *crt, pki_x509 *contCert) { BIO *bio = NULL; if (!crt) return; bio = BIO_new(BIO_s_mem()); openssl_error(); i2d_X509_bio(bio, contCert->getCert()); signBio(crt, bio); BIO_free(bio); } void pki_pkcs7::writeP7(QString fname,bool PEM) { FILE *fp; fp = fopen(QString2filename(fname),"w"); if (fp != NULL) { if (p7){ if (PEM) PEM_write_PKCS7(fp, p7); else i2d_PKCS7_fp(fp, p7); openssl_error(); fclose(fp); } } else fopen_error(fname); } pki_x509 *pki_pkcs7::getCert(int x) { pki_x509 *cert; cert = new pki_x509(X509_dup(sk_X509_value(getCertStack(), x))); openssl_error(); cert->autoIntName(); return cert; } int pki_pkcs7::numCert() { int n= sk_X509_num(getCertStack()); openssl_error(); return n; } void pki_pkcs7::fromPEM_BIO(BIO *bio, QString name) { PKCS7 *_p7; _p7 = PEM_read_bio_PKCS7(bio, NULL, NULL, NULL); openssl_error(name); PKCS7_free(p7); p7 = _p7; setIntName(rmslashdot(name)); } void pki_pkcs7::fload(const QString fname) { FILE *fp; PKCS7 *_p7; fp = fopen(QString2filename(fname), "rb"); if (fp) { _p7 = PEM_read_PKCS7(fp, NULL, NULL, NULL); if (!_p7) { ign_openssl_error(); rewind(fp); _p7 = d2i_PKCS7_fp(fp, NULL); } fclose(fp); if (ign_openssl_error()) { if (_p7) PKCS7_free(_p7); throw errorEx(tr("Unable to load the PKCS#7 file %1. Tried PEM and DER format.").arg(fname)); } if (p7) PKCS7_free(p7); p7 = _p7; } else fopen_error(fname); } STACK_OF(X509) *pki_pkcs7::getCertStack() { STACK_OF(X509) *certstack = NULL; int i; if (p7 == NULL) return NULL; i = OBJ_obj2nid(p7->type); switch (i) { case NID_pkcs7_signed: certstack = p7->d.sign->cert; break; case NID_pkcs7_signedAndEnveloped: certstack = p7->d.signed_and_enveloped->cert; break; default: break; } openssl_error(); return certstack; } void pki_pkcs7::addCert(pki_x509 *crt) { if (p7 == NULL || crt == NULL) return; PKCS7_add_certificate(p7, crt->getCert()); openssl_error(); } ����������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_pkcs7.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001541�11753427512�0015201�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_PKCS7_H #define __PKI_PKCS7_H #include "pki_x509.h" class pki_pkcs7: public pki_base { Q_OBJECT friend class pki_x509; protected: PKCS7 *p7; STACK_OF(X509) *getCertStack(); void signBio(pki_x509 *crt, BIO * bio); void encryptBio(pki_x509 *crt, BIO * bio); public: pki_pkcs7(const QString name = ""); /* destructor */ virtual ~pki_pkcs7(); void signFile(pki_x509 *crt, QString filename); void signCert(pki_x509 *crt, pki_x509 *contCert); void encryptFile(pki_x509 *crt, QString filename); void writeP7(QString fname,bool PEM); void fromPEM_BIO(BIO *bio, QString name); void fload(const QString fname); pki_x509 *getCert(int x); void addCert(pki_x509 *crt); int numCert(); // number of certs; }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_scard.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000035511�11753427512�0015605�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 -2011 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_scard.h" #include "pass_info.h" #include "pk11_attribute.h" #include "exception.h" #include "db_base.h" #include "pkcs11.h" #include "x509name.h" #include "func.h" #include "db.h" #include "widgets/MainWindow.h" #include <openssl/rand.h> #include <openssl/bn.h> #include <QtGui/QProgressDialog> #include <QtGui/QApplication> #include <QtCore/QDir> #include <QtGui/QMessageBox> #include <QtCore/QThread> #include <ltdl.h> QPixmap *pki_scard::icon[1] = { NULL }; void pki_scard::init(void) { class_name = "pki_scard"; ownPass = ptPin; dataVersion = 2; pkiType = smartCard; card_serial = card_manufacturer = card_label = ""; card_model = slot_label = ""; } pki_scard::pki_scard(const QString name) :pki_key(name) { init(); } QString pki_scard::getMsg(msg_type msg) { /* * We do not construct english sentences from fragments * to allow proper translations. * * %1 will be replaced by the name of the smartcard */ switch (msg) { case msg_import: return tr("Successfully imported the token key '%1'"); case msg_delete: return tr("Delete the token key '%1'?"); case msg_create: return tr("Successfully created the token key '%1'"); /* %1: Number of ktemplates; %2: list of templatenames */ case msg_delete_multi: return tr("Delete the %1 keys: %2?"); } return pki_base::getMsg(msg); } EVP_PKEY *pki_scard::load_pubkey(pkcs11 &p11, CK_OBJECT_HANDLE object) const { unsigned long keytype; EVP_PKEY *pkey = NULL; pk11_attr_ulong type(CKA_KEY_TYPE); p11.loadAttribute(type, object); keytype = type.getValue(); switch (keytype) { case CKK_RSA: { RSA *rsa = RSA_new(); pk11_attr_data n(CKA_MODULUS); p11.loadAttribute(n, object); rsa->n = n.getBignum(); pk11_attr_data e(CKA_PUBLIC_EXPONENT); p11.loadAttribute(e, object); rsa->e = e.getBignum(); pkey = EVP_PKEY_new(); EVP_PKEY_assign_RSA(pkey, rsa); break; } case CKK_DSA: { DSA *dsa = DSA_new(); pk11_attr_data p(CKA_PRIME); p11.loadAttribute(p, object); dsa->p = p.getBignum(); pk11_attr_data q(CKA_SUBPRIME); p11.loadAttribute(q, object); dsa->q = q.getBignum(); pk11_attr_data g(CKA_BASE); p11.loadAttribute(g, object); dsa->g = g.getBignum(); pk11_attr_data pub(CKA_VALUE); p11.loadAttribute(pub, object); dsa->pub_key = pub.getBignum(); pkey = EVP_PKEY_new(); EVP_PKEY_assign_DSA(pkey, dsa); break; } #ifndef OPENSSL_NO_EC case CKK_EC: { unsigned long s; const unsigned char *p; EC_KEY *ec = EC_KEY_new(); pk11_attr_data grp(CKA_EC_PARAMS); p11.loadAttribute(grp, object); s = grp.getValue(&p); EC_GROUP *group = d2i_ECPKParameters(NULL, &p, s); EC_GROUP_set_asn1_flag(group, 1); EC_KEY_set_group(ec, group); pki_openssl_error(); pk11_attr_data pt(CKA_EC_POINT); p11.loadAttribute(pt, object); BIGNUM *bn = pt.getBignum(); BN_CTX *ctx = BN_CTX_new(); EC_POINT *point = EC_POINT_bn2point(group, bn, NULL, ctx); EC_KEY_set_public_key(ec, point); BN_CTX_free(ctx); pki_openssl_error(); pkey = EVP_PKEY_new(); EVP_PKEY_assign_EC_KEY(pkey, ec); break; } #endif default: throw errorEx(QString("Unsupported CKA_KEY_TYPE: %1\n").arg(keytype)); } pki_openssl_error(); return pkey; } void pki_scard::load_token(pkcs11 &p11, CK_OBJECT_HANDLE object) { tkInfo ti = p11.tokenInfo(); card_label = ti.label(); card_manufacturer = ti.manufacturerID(); card_serial = ti.serial(); card_model = ti.model(); pk11_attr_data id(CKA_ID); p11.loadAttribute(id, object); if (id.getAttribute()->ulValueLen > 0) { BIGNUM *cka_id = id.getBignum(); object_id = BNoneLine(cka_id); BN_free(cka_id); } try { pk11_attr_data label(CKA_LABEL); p11.loadAttribute(label, object); slot_label = label.getText(); } catch (errorEx &err) { printf("No PubKey Label: %s\n", err.getCString()); // ignore } if (slot_label.isEmpty()) { try{ x509name xn; pk11_attr_data subj(CKA_SUBJECT); p11.loadAttribute(subj, object); QByteArray der = subj.getData(); xn.d2i(der); slot_label = xn.getMostPopular(); pki_openssl_error(); } catch (errorEx &err) { printf("No Pubkey Subject: %s\n", err.getCString()); // ignore } } EVP_PKEY *pkey = load_pubkey(p11, object); if (pkey) { if (key) EVP_PKEY_free(key); key = pkey; } setIntName(slot_label); pki_openssl_error(); } pk11_attr_data pki_scard::getIdAttr() const { pk11_attr_data id(CKA_ID); if (object_id.isEmpty()) return id; BIGNUM *bn = NULL; BN_hex2bn(&bn, CCHAR(object_id)); id.setBignum(bn, true); return id; } void pki_scard::deleteFromToken() { slotid slot; if (!prepare_card(&slot)) return; deleteFromToken(slot); } pk11_attlist pki_scard::objectAttributes(bool priv) const { unsigned long cka_class = priv ? CKO_PRIVATE_KEY : CKO_PUBLIC_KEY; pk11_attlist attrs(pk11_attr_ulong(CKA_CLASS, cka_class)); attrs << getIdAttr(); if (EVP_PKEY_type(key->type) == EVP_PKEY_RSA) { attrs << pk11_attr_data(CKA_MODULUS, key->pkey.rsa->n, false); } return attrs; } void pki_scard::deleteFromToken(slotid slot) { pkcs11 p11; p11.startSession(slot, true); tkInfo ti = p11.tokenInfo(); if (QMessageBox::question(NULL, XCA_TITLE, tr("Delete the private key '%1' from the token '%2 (#%3)' ?"). arg(getIntName()).arg(ti.label()).arg(ti.serial()), QMessageBox::Yes|QMessageBox::No) != QMessageBox::Yes) return; if (p11.tokenLogin(card_label, false).isNull()) return; pk11_attlist atts = objectAttributes(true); QList<CK_OBJECT_HANDLE> priv_objects = p11.objectList(atts); atts = objectAttributes(false); QList<CK_OBJECT_HANDLE> pub_objects = p11.objectList(atts); p11.deleteObjects(priv_objects); p11.deleteObjects(pub_objects); } int pki_scard::renameOnToken(slotid slot, QString name) { pkcs11 p11; p11.startSession(slot, true); QList<CK_OBJECT_HANDLE> objs; if (p11.tokenLogin(card_label, false).isNull()) return 0; pk11_attr_data label(CKA_LABEL, name.toUtf8()); /* Private key */ pk11_attlist attrs = objectAttributes(true); objs = p11.objectList(attrs); if (!objs.count()) return 0; p11.storeAttribute(label, objs[0]); /* Public key */ attrs = objectAttributes(false); objs = p11.objectList(attrs); if (objs.count()) p11.storeAttribute(label, objs[0]); return 1; } void pki_scard::store_token(slotid slot, EVP_PKEY *pkey) { pk11_attlist pub_atts; pk11_attlist priv_atts; QList<CK_OBJECT_HANDLE> objects; if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) throw errorEx(tr("only RSA keys can be stored on tokens")); RSA *rsakey = pkey->pkey.rsa; pub_atts << pk11_attr_ulong(CKA_CLASS, CKO_PUBLIC_KEY) << pk11_attr_ulong(CKA_KEY_TYPE, CKK_RSA) << pk11_attr_data(CKA_MODULUS, rsakey->n, false); priv_atts << pk11_attr_ulong(CKA_CLASS, CKO_PRIVATE_KEY) << pk11_attr_ulong(CKA_KEY_TYPE, CKK_RSA) << pk11_attr_data(CKA_MODULUS, rsakey->n, false); pkcs11 p11; p11.startSession(slot, true); QList<CK_OBJECT_HANDLE> objs = p11.objectList(pub_atts); if (objs.count() == 0) objs = p11.objectList(priv_atts); if (objs.count() != 0) { QMessageBox::information(NULL, XCA_TITLE, tr("This Key is already on the token")); load_token(p11, objs[0]); return; } pk11_attr_data new_id = p11.findUniqueID(CKO_PUBLIC_KEY); pub_atts << pk11_attr_bool(CKA_TOKEN, true) << pk11_attr_data(CKA_LABEL, getIntName().toUtf8()) << pk11_attr_bool(CKA_PRIVATE, false) << new_id << pk11_attr_data(CKA_PUBLIC_EXPONENT, rsakey->e, false) << pk11_attr_bool(CKA_WRAP, true) << pk11_attr_bool(CKA_ENCRYPT, true) << pk11_attr_bool(CKA_VERIFY, true); priv_atts << pk11_attr_bool(CKA_TOKEN, true) << pk11_attr_bool(CKA_PRIVATE, true) << pk11_attr_data(CKA_LABEL, desc.toUtf8()) << new_id << pk11_attr_data(CKA_PUBLIC_EXPONENT, rsakey->e, false) << pk11_attr_data(CKA_PRIVATE_EXPONENT, rsakey->d, false) << pk11_attr_data(CKA_PRIME_1, rsakey->p, false) << pk11_attr_data(CKA_PRIME_2, rsakey->q, false) << pk11_attr_data(CKA_EXPONENT_1, rsakey->dmp1, false) << pk11_attr_data(CKA_EXPONENT_2, rsakey->dmq1, false) << pk11_attr_data(CKA_COEFFICIENT, rsakey->iqmp, false) << pk11_attr_bool(CKA_UNWRAP, true) << pk11_attr_bool(CKA_DECRYPT, true) << pk11_attr_bool(CKA_SIGN, true); tkInfo ti = p11.tokenInfo(); if (p11.tokenLogin(ti.label(), false).isNull()) throw errorEx(tr("PIN input aborted")); p11.createObject(pub_atts); p11.createObject(priv_atts); pub_atts.reset(); pub_atts << pk11_attr_ulong(CKA_CLASS, CKO_PUBLIC_KEY) << pk11_attr_ulong(CKA_KEY_TYPE, CKK_RSA) << new_id << pk11_attr_data(CKA_MODULUS, rsakey->n, false); objs = p11.objectList(pub_atts); if (objs.count() == 0) throw errorEx(tr("Unable to find copied key on the token")); load_token(p11, objs[0]); } QList<int> pki_scard::possibleHashNids() { QList<int> nids; int i; for (i=0; i< mech_list.count(); i++) { switch (mech_list[i]) { case CKM_MD5_RSA_PKCS: nids << NID_md5; break; case CKM_DSA_SHA1: #ifndef OPENSSL_NO_EC case CKM_ECDSA_SHA1: #endif case CKM_SHA1_RSA_PKCS: nids << NID_sha1; break; case CKM_SHA256_RSA_PKCS: nids << NID_sha256; break; case CKM_SHA384_RSA_PKCS: nids << NID_sha384; break; case CKM_SHA512_RSA_PKCS: nids << NID_sha512; break; case CKM_RIPEMD160_RSA_PKCS: nids << NID_ripemd160; break; } } if (nids.count() == 0) { nids << NID_md5 << NID_sha1 << NID_sha256 << NID_sha384 << NID_sha512 << NID_ripemd160; } return nids; } const EVP_MD *pki_scard::getDefaultMD() { if (mech_list.contains(CKM_SHA1_RSA_PKCS)) return EVP_sha1(); if (mech_list.contains(CKM_DSA_SHA1)) return EVP_dss1(); #ifndef OPENSSL_NO_EC if (mech_list.contains(CKM_ECDSA_SHA1)) return EVP_ecdsa(); #endif if (mech_list.contains(CKM_SHA512_RSA_PKCS)) return EVP_sha512(); if (mech_list.contains(CKM_SHA384_RSA_PKCS)) return EVP_sha384(); if (mech_list.contains(CKM_SHA256_RSA_PKCS)) return EVP_sha256(); if (mech_list.contains(CKM_RIPEMD160_RSA_PKCS)) return EVP_ripemd160(); if (mech_list.contains(CKM_MD5_RSA_PKCS)) return EVP_md5(); /* Last resort */ return EVP_sha1(); } /* Assures the correct card is inserted and * returns the slot ID in slot true on success */ bool pki_scard::prepare_card(slotid *slot, bool verifyPubkey) const { pkcs11 p11; slotidList p11_slots; int i; if (!pkcs11::loaded()) return false; while (1) { p11_slots = p11.getSlotList(); for (i=0; i<p11_slots.count(); i++) { pkcs11 myp11; tkInfo ti = myp11.tokenInfo(p11_slots[i]); if (ti.label() == card_label && ti.serial() == card_serial) { break; } } if (i < p11_slots.count()) break; QString msg = tr("Please insert card: %1 %2 [%3] with Serial: %4"). arg(card_manufacturer).arg(card_model). arg(card_label).arg(card_serial); int r = QMessageBox::warning(NULL, XCA_TITLE, msg, QMessageBox::Cancel | QMessageBox::Ok); if (r == QMessageBox::Cancel) { return false; } } *slot = p11_slots[i]; if (!verifyPubkey) return true; QList<CK_OBJECT_HANDLE> objects; p11.startSession(p11_slots[i]); pk11_attlist cls (pk11_attr_ulong(CKA_CLASS, CKO_PUBLIC_KEY)); cls << getIdAttr(); objects = p11.objectList(cls); for (int j=0; j< objects.count(); j++) { CK_OBJECT_HANDLE object = objects[j]; EVP_PKEY *pkey = load_pubkey(p11, object); if (EVP_PKEY_cmp(key, pkey) == 1) return true; if (!object_id.isEmpty()) QMessageBox::warning(NULL, XCA_TITLE, tr("Public Key missmatch. Please re-import card")); } return false; } class keygenThread: public QThread { public: errorEx err; pk11_attr_data id; QString name; int size; pkcs11 *p11; void run() { try { id = p11->generateRSAKey(name, size); } catch (errorEx &e) { err = e; } } }; void pki_scard::generateKey_card(slotid slot, int size, QProgressBar *bar) { pk11_attlist atts; pkcs11 p11; p11.startSession(slot, true); tkInfo ti = p11.tokenInfo(); if (p11.tokenLogin(ti.label(), false).isNull()) return; keygenThread kt; kt.name = getIntName(); kt.size = size; kt.p11 = &p11; kt.start(); while (!kt.wait(20)) { inc_progress_bar(0, 0, bar); } if (!kt.err.isEmpty()) throw errorEx(kt.err); atts << pk11_attr_ulong(CKA_CLASS, CKO_PUBLIC_KEY) << kt.id; QList<CK_OBJECT_HANDLE> objects = p11.objectList(atts); if (objects.count() != 1) printf("OBJECTS found: %d\n",objects.count()); if (objects.count() == 0) throw errorEx(tr("Unable to find generated key on card")); load_token(p11, objects[0]); } pki_scard::~pki_scard() { } QByteArray pki_scard::toData() { QByteArray ba; ba += db::stringToData(card_serial); ba += db::stringToData(card_manufacturer); ba += db::stringToData(card_label); ba += db::stringToData(slot_label); ba += db::stringToData(card_model); ba += db::stringToData(object_id); ba += db::intToData(mech_list.count()); for (int i=0; i<mech_list.count(); i++) ba += db::intToData(mech_list[i]); ba += i2d(); return ba; } void pki_scard::fromData(const unsigned char *p, db_header_t *head ) { int version, size; size = head->len - sizeof(db_header_t); version = head->version; QByteArray ba((const char*)p, size); card_serial = db::stringFromData(ba); card_manufacturer = db::stringFromData(ba); card_label = db::stringFromData(ba); slot_label = db::stringFromData(ba); card_model = db::stringFromData(ba); if (version < 2) card_model.clear(); object_id = db::stringFromData(ba); int count = db::intFromData(ba); mech_list.clear(); for (int i=0; i<count; i++) mech_list << db::intFromData(ba); d2i(ba); if (ba.count() > 0) { my_error(tr("Wrong Size %1").arg(ba.count())); } } bool pki_scard::isPubKey() const { return false; } QString pki_scard::getTypeString(void) { return tr("Token %1").arg(pki_key::getTypeString()); } EVP_PKEY *pki_scard::decryptKey() const { slotid slot_id; QString pin, key_id; if (!prepare_card(&slot_id)) throw errorEx(tr("Failed to find the key on the token")); pkcs11 *p11 = new pkcs11(); p11->startSession(slot_id); pin = p11->tokenLogin(card_label, false); if (pin.isNull()) { delete p11; throw errorEx(tr("Invalid Pin for the token")); } pk11_attlist atts = objectAttributes(true); QList<CK_OBJECT_HANDLE> priv_objects = p11->objectList(atts); if (priv_objects.count() != 1) throw errorEx(tr("Failed to find the key on the token")); EVP_PKEY *pkey = p11->getPrivateKey(key, priv_objects[0]); if (!pkey) delete p11; pki_openssl_error(); return pkey; } void pki_scard::changePin() { slotid slot; if (!prepare_card(&slot)) return; pkcs11 p11; p11.changePin(slot, false); } void pki_scard::changeSoPin() { slotid slot; if (!prepare_card(&slot)) return; pkcs11 p11; p11.changePin(slot, true); } void pki_scard::initPin() { slotid slot; if (!prepare_card(&slot)) return; pkcs11 p11; p11.initPin(slot); } int pki_scard::verify() { return true; } bool pki_scard::isToken() { return true; } QVariant pki_scard::getIcon(dbheader *hd) { return hd->id == HD_internal_name ? QVariant(*icon[0]) : QVariant(); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_scard.h���������������������������������������������������������������������������0000664�0000000�0000000�00000004100�11753427512�0015240�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_SCARD_H #define __PKI_SCARD_H #include <QtCore/QString> #include <openssl/pem.h> #include <openssl/evp.h> #include "pkcs11.h" #include "pki_key.h" class pki_scard: public pki_key { Q_OBJECT protected: QString card_serial; QString card_manufacturer; QString card_model; QString card_label; QString slot_label; QString object_id; QList<CK_MECHANISM_TYPE> mech_list; void init(void); public: pki_scard(const QString name); virtual ~pki_scard(); static QPixmap *icon[1]; void load_token(pkcs11 &p11, CK_OBJECT_HANDLE object); bool prepare_card(slotid *slot, bool verifyPubkey=true) const; void fromData(const unsigned char *p, db_header_t *head); QByteArray toData(); bool isPubKey() const; QString getTypeString(void); QString getManufacturer() const { return card_manufacturer; } QString getSerial() const { return card_serial; } QString getModel() const { return card_model; } QString getLabel() const { return slot_label; } QString getId() const { return object_id; } pk11_attr_data getIdAttr() const; QString getCardLabel() const { return card_label; } EVP_PKEY *decryptKey() const; QString scardLogin(pkcs11 &p11, bool so, bool force=false)const; void changePin(); void initPin(); void changeSoPin(); int verify(); bool isToken(); QVariant getIcon(dbheader *hd); QList<CK_MECHANISM_TYPE> getMech_list() { return mech_list; } pk11_attlist objectAttributes(bool priv) const; void setMech_list(QList<CK_MECHANISM_TYPE> ml) { mech_list = ml; }; QList<int> possibleHashNids(); EVP_PKEY *load_pubkey(pkcs11 &p11, CK_OBJECT_HANDLE object) const; const EVP_MD *getDefaultMD(); void generateKey_card(slotid slot, int size, QProgressBar *bar); void deleteFromToken(); void deleteFromToken(slotid slot); void store_token(slotid slot, EVP_PKEY *pkey); virtual int renameOnToken(slotid slot, QString name); virtual QString getMsg(msg_type msg); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_temp.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000027713�11753427512�0015463�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_temp.h" #include "func.h" #include "db.h" #include "exception.h" #include "widgets/MainWindow.h" #include <QtCore/QDir> QPixmap *pki_temp::icon= NULL; pki_temp::pki_temp(const pki_temp *pk) :pki_x509name(pk->desc) { class_name = pk->class_name; dataVersion=pk->dataVersion; pkiType=pk->pkiType; xname=pk->xname; subAltName=pk->subAltName; issAltName=pk->issAltName; crlDist=pk->crlDist; authInfAcc=pk->authInfAcc; certPol=pk->certPol; nsCertType=pk->nsCertType; nsComment=pk->nsComment; nsBaseUrl=pk->nsBaseUrl; nsRevocationUrl=pk->nsRevocationUrl; nsCARevocationUrl=pk->nsCARevocationUrl; nsRenewalUrl=pk->nsRenewalUrl; nsCaPolicyUrl=pk->nsCaPolicyUrl; nsSslServerName=pk->nsSslServerName; ca=pk->ca; bcCrit=pk->bcCrit; keyUseCrit=pk->keyUseCrit; eKeyUseCrit=pk->eKeyUseCrit; subKey=pk->subKey; authKey=pk->authKey; pathLen=pk->pathLen; validN=pk->validN; validM=pk->validM; validMidn=pk->validMidn; keyUse=pk->keyUse; eKeyUse=pk->eKeyUse; adv_ext=pk->adv_ext; noWellDefined=pk->noWellDefined; } pki_temp::pki_temp(const QString d) :pki_x509name(d) { class_name = "pki_temp"; dataVersion=6; pkiType=tmpl; subAltName=""; issAltName=""; crlDist=""; authInfAcc=""; certPol=""; nsCertType=0; nsComment="xca certificate"; nsBaseUrl=""; nsRevocationUrl=""; nsCARevocationUrl=""; nsRenewalUrl=""; nsCaPolicyUrl=""; nsSslServerName=""; ca=0; bcCrit=false; keyUseCrit=false; eKeyUseCrit=false; subKey=false; authKey=false; validMidn=false; pathLen=""; validN=365; validM=0; keyUse=0; eKeyUse=""; adv_ext=""; noWellDefined=false; } QString pki_temp::getMsg(msg_type msg) { /* * We do not construct english sentences from fragments * to allow proper translations. * * %1 will be replaced by the internal name of the template */ switch (msg) { case msg_import: return tr("Successfully imported the XCA template '%1'"); case msg_delete: return tr("Delete the XCA template '%1'?"); case msg_create: return tr("Successfully created the XCA template '%1'"); /* %1: Number of ktemplates; %2: list of templatenames */ case msg_delete_multi: return tr("Delete the %1 XCA templates: %2?"); } return pki_base::getMsg(msg); } x509name pki_temp::getSubject() const { return xname; } static int bitsToInt(extList &el, int nid, bool *crit) { int ret = 0, i = el.idxByNid(nid); if (i != -1) { if (crit) *crit = el[i].getCritical(); ASN1_BIT_STRING *bits; bits = (ASN1_BIT_STRING *)el[i].d2i(); for (int j=0; j<9; j++) { if (ASN1_BIT_STRING_get_bit(bits, j)) ret |= 1 << j; } el.removeAt(i); } return ret; } extList pki_temp::fromCert(pki_x509super *cert_or_req) { int i; x509name n; extList el = cert_or_req->getV3ext(); nsComment = ""; n = cert_or_req->getSubject(); for (i=0; i<EXPLICIT_NAME_CNT; i++) { int nid = NewX509::name_nid[i]; QString ne = n.popEntryByNid(nid); if (!ne.isNull()) xname.addEntryByNid(nid, ne); } for (int i=0; i<n.entryCount(); i++) { int nid = n.nid(i); if (nid != NID_undef) xname.addEntryByNid(nid, n.getEntry(i)); } el.genConf(NID_subject_alt_name, &subAltName, &adv_ext); el.genConf(NID_issuer_alt_name, &issAltName, &adv_ext); el.genConf(NID_crl_distribution_points, &crlDist, &adv_ext); el.genConf(NID_info_access, &authInfAcc, &adv_ext); el.genConf(NID_netscape_comment, &nsComment); el.genConf(NID_netscape_base_url, &nsBaseUrl); el.genConf(NID_netscape_revocation_url, &nsRevocationUrl); el.genConf(NID_netscape_ca_revocation_url, &nsCARevocationUrl); el.genConf(NID_netscape_renewal_url, &nsRenewalUrl); el.genConf(NID_netscape_ca_policy_url, &nsCaPolicyUrl); el.genConf(NID_netscape_ssl_server_name, &nsSslServerName); QString r; if (el.genConf(NID_basic_constraints, &r)) { QStringList sl = r.split(","); if (sl.contains("critical")) bcCrit = true; ca = sl.contains("CA:TRUE") ? 1 : 2; pathLen = sl.filter("pathlen:").join("").mid(8, -1); } else { bcCrit = false; ca = 0; } authKey = el.delByNid(NID_authority_key_identifier); subKey = el.delByNid(NID_subject_key_identifier); nsCertType = bitsToInt(el, NID_netscape_cert_type, NULL); /* bit 4 is unused. Move higher bits down. */ nsCertType = (nsCertType & 0xf) | ((nsCertType & 0xf0) >> 1); keyUse = bitsToInt(el, NID_key_usage, &keyUseCrit); el.genConf(NID_ext_key_usage, &eKeyUse); if (eKeyUse.startsWith("critical,")) { eKeyUseCrit = true; eKeyUse = eKeyUse.mid(9, -1); } el.genGenericConf(&adv_ext); if (cert_or_req->getType() == x509) { pki_x509 *cert = (pki_x509*)cert_or_req; if (cert->getNotAfter().isUndefined()) { noWellDefined = true; } else { a1time notBefore = cert->getNotBefore(); a1time notAfter = cert->getNotAfter(); if (notBefore.toPlain().endsWith("000000Z") && notAfter.toPlain().endsWith("235959Z")) { validMidn = true; } int diff = notBefore.daysTo(notAfter); validM = 0; if (diff > 60) { validM = 1; diff /= 30; if (diff > 24) { validM = 2; diff /= 12; } } validN = diff; } } return el; } void pki_temp::fromData(const unsigned char *p, db_header_t *head ) { int version, size; size = head->len - sizeof(db_header_t); version = head->version; fromData(p, size, version); } static QString old_eKeyUse2QString(int old) { QStringList sl; NIDlist eku_nid = *MainWindow::eku_nid; for (int i=0; i<eku_nid.count(); i++) { if (old & (1<<i)) { sl << OBJ_nid2sn(eku_nid[i]); } } return sl.join(", "); } void pki_temp::fromData(const unsigned char *p, int size, int version) { QByteArray ba((const char*)p, size); destination = db::stringFromData(ba); bcCrit = db::boolFromData(ba); keyUseCrit = db::boolFromData(ba); eKeyUseCrit = db::boolFromData(ba); subKey = db::boolFromData(ba); authKey = db::boolFromData(ba); ca = db:: intFromData(ba); if (version > 5) { pathLen = db::stringFromData(ba); } else { pathLen = QString::number(db::intFromData(ba)); if (pathLen == "0") pathLen = ""; } validN = db::intFromData(ba); validM = db::intFromData(ba); keyUse = db::intFromData(ba); if (version > 4) { eKeyUse = db::stringFromData(ba); } else { int old = db::intFromData(ba); eKeyUse = old_eKeyUse2QString(old); } nsCertType = db::intFromData(ba); subAltName = db::stringFromData(ba); issAltName = db::stringFromData(ba); crlDist = db::stringFromData(ba); nsComment = db::stringFromData(ba); nsBaseUrl = db::stringFromData(ba); nsRevocationUrl = db::stringFromData(ba); nsCARevocationUrl = db::stringFromData(ba); nsRenewalUrl = db::stringFromData(ba); nsCaPolicyUrl = db::stringFromData(ba); nsSslServerName = db::stringFromData(ba); xname.d2i(ba); authInfAcc = db::stringFromData(ba); certPol = db::stringFromData(ba); validMidn = db::boolFromData(ba); if (version>2) adv_ext = db::stringFromData(ba); if (version>3) noWellDefined = db::boolFromData(ba); if (ba.count() > 0) { my_error(tr("Wrong Size %1").arg(ba.count())); } } QByteArray pki_temp::toData() { QByteArray ba; ba += db::stringToData(destination); ba += db::boolToData(bcCrit); ba += db::boolToData(keyUseCrit); ba += db::boolToData(eKeyUseCrit); ba += db::boolToData(subKey); ba += db::boolToData(authKey); ba += db::intToData(ca); ba += db::stringToData(pathLen); ba += db::intToData(validN); ba += db::intToData(validM); ba += db::intToData(keyUse); ba += db::stringToData(eKeyUse); ba += db::intToData(nsCertType); ba += db::stringToData(subAltName); ba += db::stringToData(issAltName); ba += db::stringToData(crlDist); ba += db::stringToData(nsComment); ba += db::stringToData(nsBaseUrl); ba += db::stringToData(nsRevocationUrl); ba += db::stringToData(nsCARevocationUrl); ba += db::stringToData(nsRenewalUrl); ba += db::stringToData(nsCaPolicyUrl); ba += db::stringToData(nsSslServerName); ba += xname.i2d(); ba += db::stringToData(authInfAcc); ba += db::stringToData(certPol); ba += db::boolToData(validMidn); ba += db::stringToData(adv_ext); ba += db::boolToData(noWellDefined); return ba; } void pki_temp::writeDefault(const QString fname) { writeTemp(fname + QDir::separator() + getIntName() + ".xca"); } void pki_temp::writeTemp(QString fname) { QByteArray data, header; FILE *fp = fopen(QString2filename(fname),"w"); if (fp == NULL) { fopen_error(fname); return; } data = toData(); header = db::intToData(data.count()); header += db::intToData(dataVersion); header += data; fwrite_ba(fp, header, fname); fclose(fp); } void pki_temp::fload(QString fname) { int size, s, version; const int hsize = 2 * sizeof(uint32_t); char buf[hsize]; unsigned char *p; FILE *fp = fopen(QString2filename(fname),"r"); bool oldimport = false; if (fp == NULL) { fopen_error(fname); return; } if (fread(buf, hsize, 1, fp) != 1) { fclose(fp); my_error(tr("Template file content error (too small): %1"). arg(fname)); } QByteArray header(buf, hsize); QByteArray backup = header; size = db::intFromData(header); version = db::intFromData(header); if (size > 65535 || size <0) { /* oldimport templates are prepended by its size in host endianess. Set fp after the first int and recover the size */ fseek(fp, sizeof(int), SEEK_SET); size = intFromData(backup); if (size > 65535 || size <0) { fclose(fp); my_error(tr("Template file content error (bad size): %1 ").arg(fname)); } oldimport = true; } p = (unsigned char *)OPENSSL_malloc(size); if (p) { if ((s=fread(p, 1, size, fp)) != size) { OPENSSL_free(p); fclose(fp); my_error(tr("Template file content error (bad length) :%1").arg(fname)); } } if (oldimport) oldFromData(p, size); else fromData(p, size, version); OPENSSL_free(p); setIntName(rmslashdot(fname)); fclose(fp); } pki_temp::~pki_temp() { } bool pki_temp::compare(pki_base *) { // we don't care if templates with identical contents // are stored in the database ... return false; } QVariant pki_temp::column_data(dbheader *hd) { switch (hd->id) { case HD_temp_type: return QVariant(destination); } return pki_x509name::column_data(hd); } QVariant pki_temp::getIcon(dbheader *hd) { return hd->id == HD_internal_name ? QVariant(*icon) : QVariant(); } void pki_temp::oldFromData(unsigned char *p, int size) { int version; QByteArray ba((const char*)p, size); version=intFromData(ba); intFromData(ba); /* type */ if (version == 1) { ca = 2; bool mca = intFromData(ba); if (mca) ca = 1; } bcCrit=db::boolFromData(ba); keyUseCrit=db::boolFromData(ba); eKeyUseCrit=db::boolFromData(ba); subKey=db::boolFromData(ba); authKey=db::boolFromData(ba); db::boolFromData(ba); db::boolFromData(ba); if (version >= 2) { ca = intFromData(ba); } pathLen = QString::number(db::intFromData(ba)); if (pathLen == "0") pathLen = ""; validN = intFromData(ba); validM = intFromData(ba); keyUse=intFromData(ba); int old=db::intFromData(ba); eKeyUse = old_eKeyUse2QString(old); nsCertType=intFromData(ba); if (version == 1) { xname.addEntryByNid(OBJ_sn2nid("C"), db::stringFromData(ba)); xname.addEntryByNid(OBJ_sn2nid("ST"), db::stringFromData(ba)); xname.addEntryByNid(OBJ_sn2nid("L"), db::stringFromData(ba)); xname.addEntryByNid(OBJ_sn2nid("O"), db::stringFromData(ba)); xname.addEntryByNid(OBJ_sn2nid("OU"), db::stringFromData(ba)); xname.addEntryByNid(OBJ_sn2nid("CN"), db::stringFromData(ba)); xname.addEntryByNid(OBJ_sn2nid("Email"),db::stringFromData(ba)); } subAltName=db::stringFromData(ba); issAltName=db::stringFromData(ba); crlDist=db::stringFromData(ba); nsComment=db::stringFromData(ba); nsBaseUrl=db::stringFromData(ba); nsRevocationUrl=db::stringFromData(ba); nsCARevocationUrl=db::stringFromData(ba); nsRenewalUrl=db::stringFromData(ba); nsCaPolicyUrl=db::stringFromData(ba); nsSslServerName=db::stringFromData(ba); // next version: if (version >= 2) { xname.d2i(ba); } if (version >= 3) { authInfAcc=db::stringFromData(ba); certPol=db::stringFromData(ba); validMidn=db::boolFromData(ba); } if (ba.count() > 0) { my_error(tr("Wrong Size %1").arg(ba.count())); } } �����������������������������������������������������xca_0.9.3/lib/pki_temp.h����������������������������������������������������������������������������0000664�0000000�0000000�00000002537�11753427512�0015125�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_TEMP_H #define __PKI_TEMP_H #include "pki_base.h" #include "x509name.h" #include "asn1time.h" #include "pki_x509.h" class pki_temp: public pki_x509name { Q_OBJECT protected: int dataSize(); public: static QPixmap *icon; x509name xname; QString subAltName, issAltName, crlDist, authInfAcc, certPol; QString nsComment, nsBaseUrl, nsRevocationUrl, nsCARevocationUrl, nsRenewalUrl, nsCaPolicyUrl, nsSslServerName, destination, adv_ext, eKeyUse, pathLen; bool bcCrit, keyUseCrit, eKeyUseCrit, subKey, authKey, validMidn, noWellDefined; int nsCertType, keyUse, ca; int validN, validM; // methods extList fromCert(pki_x509super *cert_or_req); pki_temp(const pki_temp *pk); pki_temp(const QString d = QString()); void fload(const QString fname); void writeDefault(const QString fname); ~pki_temp(); void fromData(const unsigned char *p, int size, int version); void fromData(const unsigned char *p, db_header_t *head ); void oldFromData(unsigned char *p, int size); QByteArray toData(); bool compare(pki_base *ref); void writeTemp(QString fname); QVariant column_data(dbheader *hd); QVariant getIcon(dbheader *hd); virtual QString getMsg(msg_type msg); x509name getSubject() const; }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_x509.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000047626�11753427512�0015230�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_x509.h" #include "pki_evp.h" #include "pki_scard.h" #include "func.h" #include "base.h" #include "exception.h" #include "pass_info.h" #include "widgets/MainWindow.h" #include <QtGui/QMessageBox> #include <QtCore/QDir> #include <openssl/rand.h> bool pki_x509::dont_colorize_expiries = false; QPixmap *pki_x509::icon[6] = { NULL, NULL, NULL, NULL, NULL, NULL }; pki_x509::pki_x509(X509 *c) :pki_x509super() { init(); cert = c; pki_openssl_error(); } pki_x509::pki_x509(const pki_x509 *crt) :pki_x509super(crt->desc) { init(); cert = X509_dup(crt->cert); pki_openssl_error(); psigner = crt->psigner; setRefKey(crt->getRefKey()); trust = crt->trust; efftrust = crt->efftrust; revoked = crt->revoked; caSerial = crt->caSerial; caTemplate = crt->caTemplate; crlDays = crt->crlDays; crlExpiry = crt->crlExpiry; isrevoked = isrevoked; pki_openssl_error(); } pki_x509::pki_x509(const QString name) :pki_x509super(name) { init(); cert = X509_new(); X509_set_version(cert, 2); pki_openssl_error(); } QString pki_x509::getMsg(msg_type msg) { /* * We do not construct english sentences from fragments * to allow proper translations. * The drawback are all the slightly different duplicated messages * * %1 will be replaced by the internal name of the certificate */ switch (msg) { case msg_import: return tr("Successfully imported the certificate '%1'"); case msg_delete: return tr("Delete the certificate '%1'?"); case msg_create: return tr("Successfully created the certificate '%1'"); /* %1: Number of certs; %2: list of cert ames */ case msg_delete_multi: return tr("Delete the %1 certificates: %2?"); } return pki_base::getMsg(msg); } void pki_x509::fromPEM_BIO(BIO *bio, QString name) { X509 *_cert; _cert = PEM_read_bio_X509(bio, NULL, NULL, NULL); openssl_error(name); X509_free(cert); cert = _cert; autoIntName(); if (getIntName().isEmpty()) setIntName(rmslashdot(name)); trust = 1; efftrust = 1; } void pki_x509::fload(const QString fname) { FILE *fp = fopen(QString2filename(fname), "r"); X509 *_cert; if (!fp) { fopen_error(fname); return; } _cert = PEM_read_X509(fp, NULL, NULL, NULL); if (!_cert) { pki_ign_openssl_error(); rewind(fp); _cert = d2i_X509_fp(fp, NULL); } fclose(fp); if (pki_ign_openssl_error() ) { if (_cert) X509_free(_cert); throw errorEx(tr("Unable to load the certificate in file %1. Tried PEM and DER certificate.").arg(fname)); } X509_free(cert); cert = _cert; autoIntName(); if (getIntName().isEmpty()) setIntName(rmslashdot(fname)); trust = 1; efftrust = 1; } pki_x509::~pki_x509() { if (cert) { X509_free(cert); } pki_openssl_error(); } void pki_x509::init() { psigner = NULL; trust = 0; efftrust = 0; revoked = a1time::now(); caSerial = 1; caTemplate = ""; crlDays = 30; crlExpiry = a1time::now(); class_name = "pki_x509"; cert = NULL; isrevoked = false; dataVersion = 3; pkiType = x509; randomSerial = false; revoke_reason = ""; } void pki_x509::setSerial(const a1int &serial) { if (cert->cert_info->serialNumber != NULL ) { ASN1_INTEGER_free(cert->cert_info->serialNumber); } cert->cert_info->serialNumber = serial.get(); pki_openssl_error(); } a1int pki_x509::getSerial() const { a1int a(X509_get_serialNumber(cert)); return a; } #define SERIAL_LEN 8 a1int pki_x509::getIncCaSerial() { unsigned char buf[SERIAL_LEN]; if (!randomSerial) return caSerial++; RAND_pseudo_bytes(buf, SERIAL_LEN); a1int serial; serial.setRaw(buf, SERIAL_LEN); return serial; } a1int pki_x509::hashInfo(const EVP_MD *md) const { unsigned char digest[EVP_MAX_MD_SIZE]; unsigned len = 0; if (!ASN1_item_digest(ASN1_ITEM_rptr(X509_CINF), md, (char*)cert->cert_info,digest,&len)) pki_openssl_error(); a1int a; a.setRaw(digest,len); return a; } a1int pki_x509::getQASerial(const a1int &secret) const { ASN1_INTEGER *hold = cert->cert_info->serialNumber; cert->cert_info->serialNumber = secret.get(); a1int ret = hashInfo(EVP_md5()); ASN1_INTEGER_free(cert->cert_info->serialNumber); cert->cert_info->serialNumber = hold; return ret; } void pki_x509::load_token(pkcs11 &p11, CK_OBJECT_HANDLE object) { QString desc; pk11_attr_ulong type(CKA_CERTIFICATE_TYPE); p11.loadAttribute(type, object); if (type.getValue() != CKC_X_509) throw errorEx(QString("Unsupported Certificate type %1" ).arg(type.getValue())); try { pk11_attr_data label(CKA_LABEL); p11.loadAttribute(label, object); desc = label.getText(); } catch(errorEx &err) { printf("No Cert Label: %s\n", err.getCString()); // IGNORE } pk11_attr_data x509(CKA_VALUE); p11.loadAttribute(x509, object); QByteArray der = x509.getData(); d2i(der); if (desc.isEmpty()) { try { x509name xn; pk11_attr_data subj(CKA_SUBJECT); p11.loadAttribute(subj, object); QByteArray der = subj.getData(); xn.d2i(der); desc = xn.getMostPopular(); pki_openssl_error(); } catch(errorEx &err) { printf("No Cert Subject: %s\n", err.getCString()); // IGNORE } } setIntName(desc); pki_openssl_error(); } void pki_x509::d2i(QByteArray &ba) { X509 *c = (X509*)d2i_bytearray(D2I_VOID(d2i_X509), ba); if (c) { X509_free(cert); cert = c; } } QByteArray pki_x509::i2d() { return i2d_bytearray(I2D_VOID(i2d_X509), cert); } void pki_x509::store_token(bool alwaysSelect) { pki_scard *card = NULL; slotid slot; x509name xname; QList<CK_OBJECT_HANDLE> objects; pkcs11 p11; if (!privkey || !privkey->isToken() || alwaysSelect) { if (!p11.selectToken(&slot, NULL)) return; } else { card = (pki_scard *)privkey; if (!card->prepare_card(&slot)) return; } pk11_attlist p11_atts; p11_atts << pk11_attr_ulong(CKA_CLASS, CKO_CERTIFICATE) << pk11_attr_ulong(CKA_CERTIFICATE_TYPE, CKC_X_509) << pk11_attr_data(CKA_VALUE, i2d()); p11.startSession(slot, true); QList<CK_OBJECT_HANDLE> objs = p11.objectList(p11_atts); if (objs.count() != 0) { QMessageBox::warning(NULL, XCA_TITLE, tr("This certificate is already on the security token")); return; } p11_atts << pk11_attr_bool(CKA_TOKEN, true) << pk11_attr_bool(CKA_PRIVATE, false) << pk11_attr_data(CKA_SUBJECT, getSubject().i2d()) << pk11_attr_data(CKA_LABEL, desc.toUtf8()) << (card ? card->getIdAttr() : p11.findUniqueID(CKO_CERTIFICATE)); if (p11.tokenLogin(p11.tokenInfo().label(), false).isNull()) return; p11.createObject(p11_atts); } void pki_x509::deleteFromToken() { pki_scard *card = (pki_scard *)privkey; slotidList p11_slots; if (!pkcs11::loaded()) return; if (privkey && privkey->isToken()) { slotid slot; if (!card->prepare_card(&slot)) return; p11_slots << slot; } else { pkcs11 p11; p11_slots = p11.getSlotList(); } for (int i=0; i<p11_slots.count(); i++) { deleteFromToken(p11_slots[i]); } } pk11_attlist pki_x509::objectAttributes() { pk11_attlist attrs; attrs << pk11_attr_ulong(CKA_CLASS, CKO_CERTIFICATE) << pk11_attr_ulong(CKA_CERTIFICATE_TYPE, CKC_X_509) << pk11_attr_data(CKA_VALUE, i2d()); return attrs; } void pki_x509::deleteFromToken(slotid slot) { pkcs11 p11; p11.startSession(slot, true); pk11_attlist atts = objectAttributes(); QList<CK_OBJECT_HANDLE> objs = p11.objectList(atts); if (!objs.count()) return; tkInfo ti = p11.tokenInfo(); if (QMessageBox::question(NULL, XCA_TITLE, tr("Delete the certificate '%1' from the token '%2 (#%3)'?"). arg(getIntName()).arg(ti.label()).arg(ti.serial()), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } if (p11.tokenLogin(ti.label(), false).isNull()) return; p11.deleteObjects(objs); } int pki_x509::renameOnToken(slotid slot, QString name) { pkcs11 p11; p11.startSession(slot, true); pk11_attlist attrs = objectAttributes(); QList<CK_OBJECT_HANDLE> objs = p11.objectList(attrs); if (!objs.count()) return 0; pk11_attr_data label(CKA_LABEL, name.toUtf8()); tkInfo ti = p11.tokenInfo(); if (p11.tokenLogin(ti.label(), false).isNull()) return 0; p11.storeAttribute(label, objs[0]); return 1; } bool pki_x509::verifyQASerial(const a1int &secret) const { return getQASerial(secret) == getSerial(); } void pki_x509::setNotBefore(const a1time &a) { a1time t(a); X509_set_notBefore(cert, t.get_utc()); } void pki_x509::setNotAfter(const a1time &a) { a1time t(a); X509_set_notAfter(cert, t.get_utc()); } a1time pki_x509::getNotBefore() const { a1time a(X509_get_notBefore(cert)); return a; } a1time pki_x509::getNotAfter() const { a1time a(X509_get_notAfter(cert)); return a; } x509name pki_x509::getSubject() const { x509name x(cert->cert_info->subject); pki_openssl_error(); return x; } x509name pki_x509::getIssuer() const { x509name x(cert->cert_info->issuer); pki_openssl_error(); return x; } void pki_x509::setSubject(const x509name &n) { if (cert->cert_info->subject != NULL) X509_NAME_free(cert->cert_info->subject); cert->cert_info->subject = n.get(); } void pki_x509::setIssuer(const x509name &n) { if ((cert->cert_info->issuer) != NULL) X509_NAME_free(cert->cert_info->issuer); cert->cert_info->issuer = n.get(); } void pki_x509::addV3ext(const x509v3ext &e) { if (!e.isValid()) return; X509_EXTENSION *ext = e.get(); X509_add_ext(cert, ext, -1); X509_EXTENSION_free(ext); pki_openssl_error(); } void pki_x509::delSigner(pki_base *s) { if (s == psigner) psigner = NULL; } bool pki_x509::canSign() { BASIC_CONSTRAINTS *bc; int crit; if (!privkey || privkey->isPubKey()) return false; if (privkey->isToken() && !pkcs11::loaded()) return false; bc = (BASIC_CONSTRAINTS *)X509_get_ext_d2i(cert, NID_basic_constraints, &crit, NULL); pki_openssl_error(); if (!bc || !bc->ca) return false; return true; } bool pki_x509::hasExtension(int nid) { return getV3ext().idxByNid(nid) != -1; } void pki_x509::sign(pki_key *signkey, const EVP_MD *digest) { EVP_PKEY *tkey; if (!signkey) { my_error(tr("There is no key for signing !")); } tkey = signkey->decryptKey(); pki_openssl_error(); X509_sign(cert, tkey, digest); pki_openssl_error(); EVP_PKEY_free(tkey); pki_openssl_error(); } void pki_x509::fromData(const unsigned char *p, db_header_t *head) { int version, size; version = head->version; size = head->len - sizeof(db_header_t); QByteArray ba((const char*)p, size); d2i(ba); trust = db::intFromData(ba); isrevoked = db::boolFromData(ba); revoked.d2i(ba); caSerial.setHex(db::stringFromData(ba)); caTemplate = db::stringFromData(ba); crlDays = db::intFromData(ba); crlExpiry.d2i(ba); if (version > 1) randomSerial = db::boolFromData(ba); else randomSerial = false; if (version > 2) { crlNumber.setHex(db::stringFromData(ba)); revoke_reason = db::stringFromData(ba); invalDate.d2i(ba); } if (ba.count() > 0) { my_error(tr("Wrong Size %1").arg(ba.count())); } } QByteArray pki_x509::toData() { QByteArray ba; ba += i2d(); // cert ba += db::intToData(trust); ba += db::boolToData(isrevoked); ba += revoked.i2d(); // revokation date // the serial if this is a CA ba += db::stringToData(caSerial.toHex()); // the name of the template to use for signing ba += db::stringToData(caTemplate); // version 3 ba += db::intToData(crlDays); // the CRL period ba += crlExpiry.i2d(); // last CRL date ba += db::boolToData(randomSerial); ba += db::stringToData(crlNumber.toHex()); ba += db::stringToData(revoke_reason); ba += invalDate.i2d(); pki_openssl_error(); return ba; } void pki_x509::writeDefault(const QString fname) { writeCert(fname + QDir::separator() + getIntName() + ".crt", true, false); } void pki_x509::writeCert(const QString fname, bool PEM, bool append) { FILE *fp; const char *p = "w"; if (append) p = "a"; fp = fopen(QString2filename(fname), p); if (fp != NULL) { if (cert){ if (PEM) PEM_write_X509(fp, cert); else i2d_X509_fp(fp, cert); } fclose(fp); pki_openssl_error(); } else fopen_error(fname); } BIO *pki_x509::pem(BIO *b) { if (!b) b = BIO_new(BIO_s_mem()); PEM_write_bio_X509(b, cert); return b; } bool pki_x509::cmpIssuerAndSerial(pki_x509 *refcert) { bool ret = X509_issuer_and_serial_cmp(cert, refcert->cert); pki_openssl_error(); return ret; } bool pki_x509::verify(pki_x509 *signer) { if (psigner == signer) return true; if ((psigner != NULL )||( signer == NULL)) return false; X509_NAME *subject = X509_get_subject_name(signer->cert); X509_NAME *issuer = X509_get_issuer_name(cert); pki_openssl_error(); if (X509_NAME_cmp(subject, issuer)) { return false; } EVP_PKEY *pub = X509_get_pubkey(signer->cert); if (!pub) { pki_ign_openssl_error(); return false; } int i = X509_verify(cert, pub); pki_ign_openssl_error(); if (i>0) { psigner = signer; return true; } return false; } pki_key *pki_x509::getPubKey() const { EVP_PKEY *pkey = X509_get_pubkey(cert); pki_ign_openssl_error(); if (pkey == NULL) return NULL; pki_evp *key = new pki_evp(pkey); pki_openssl_error(); return key; } void pki_x509::setPubKey(pki_key *key) { X509_set_pubkey(cert, key->getPubKey()); } QString pki_x509::fingerprint(const EVP_MD *digest) { int j; QString fp=""; char zs[4]; unsigned int n; unsigned char md[EVP_MAX_MD_SIZE]; X509_digest(cert, digest, md, &n); pki_openssl_error(); for (j=0; j<(int)n; j++) { sprintf(zs, "%02X%c",md[j], (j+1 == (int)n) ?'\0':':'); fp += zs; } return fp; } bool pki_x509::checkDate() { a1time n, b, a; n = a1time::now(), b = getNotBefore(); a = getNotAfter(); if (!a.isValid() || !b.isValid()) return false; if (!a.isUndefined() && (a < n)) return false; if (b > n) return false; pki_openssl_error(); return true; } extList pki_x509::getV3ext() { extList el; el.setStack(cert->cert_info->extensions); return el; } x509v3ext pki_x509::getExtByNid(int nid) { extList el = getV3ext(); int i = el.idxByNid(nid); if (i == -1) return x509v3ext(); return el[i]; } pki_x509 *pki_x509::getSigner() { return (pki_x509 *)psigner; } int pki_x509::getTrust() { if (trust > 2) trust = 2; if (trust < 0) trust = 0; return trust; } void pki_x509::setTrust(int t) { if (t>=0 && t<=2) trust = t; } int pki_x509::getEffTrust() { if (efftrust > 2) efftrust = 2; if (efftrust < 0) efftrust = 0; return efftrust; } void pki_x509::setEffTrust(int t) { if (t>= 0 && t<= 2) efftrust = t; } bool pki_x509::isRevoked() { return isrevoked ; } void pki_x509::setRevoked(bool rev, a1time inval, QString reason) { if (rev) { setEffTrust(0); revoked = a1time::now(); pki_openssl_error(); revoke_reason = reason; invalDate = inval; } isrevoked = rev; pki_openssl_error(); } a1time &pki_x509::getRevoked() { return revoked; } void pki_x509::setRevoked(const a1time &when) { isrevoked = true; revoked = when; setEffTrust(0); setTrust(0); pki_openssl_error(); } int pki_x509::calcEffTrust() { int mytrust = trust; if (mytrust != 1) { efftrust = mytrust; return mytrust; } if (isRevoked()) { efftrust = 0; return 0; } if (getSigner() == this && trust == 1) { // inherit trust, but self signed trust=0; efftrust=0; return 0; } //we must look at the parent certs pki_x509 *signer = getSigner(); while (mytrust == 1 && signer && signer != this) { mytrust = signer->getTrust(); signer = signer->getSigner(); } if (mytrust == 1) mytrust = 0; efftrust = mytrust; return mytrust; } void pki_x509::setCrlExpiry(const a1time &time) { crlExpiry = time; pki_openssl_error(); } x509rev pki_x509::getRev(bool reason) { x509rev a; a.setDate(getRevoked()); a.setSerial(getSerial()); if (reason) { a.setReason(revoke_reason); a.setInvalDate(invalDate); } return a; } bool pki_x509::caAndPathLen(bool *ca, a1int *pathlen, bool *hasLen) { x509v3ext e = getExtByNid(NID_basic_constraints); if (e.nid() != NID_basic_constraints) return false; BASIC_CONSTRAINTS *bc = (BASIC_CONSTRAINTS *)e.d2i(); if (hasLen) *hasLen = bc->pathlen ? true : false; if (pathlen && bc->pathlen) pathlen->set(bc->pathlen); if (ca) *ca = bc->ca; BASIC_CONSTRAINTS_free(bc); return true; } QVariant pki_x509::column_data(dbheader *hd) { QString truststatus[] = { tr("Not trusted"), tr("Trust inherited"), tr("Always Trusted") }; switch (hd->id) { case HD_cert_serial: return QVariant(getSerial().toHex()); case HD_cert_notBefore: return QVariant(getNotBefore().toSortable()); case HD_cert_notAfter: return QVariant(getNotAfter().toSortable()); case HD_cert_trust: return QVariant(truststatus[getTrust()]); case HD_cert_revokation: if (isRevoked()) return QVariant(getRevoked().toSortable()); else if (canSign()) return QVariant(tr("CRL expires: %1"). arg(crlExpiry.toSortable())); return QVariant(); case HD_cert_md5fp: return QVariant(fingerprint(EVP_md5())); case HD_cert_sha1fp: return QVariant(fingerprint(EVP_sha1())); case HD_cert_ca: { a1int len; bool ca, haslen; if (caAndPathLen(&ca, &len, &haslen)) { if (ca && haslen) return QVariant(len.toDec()); if (!ca) return QVariant(tr("No")); else return QVariant(tr("Yes")); } return QVariant(""); } } return pki_x509super::column_data(hd); } QVariant pki_x509::getIcon(dbheader *hd) { int pixnum = 0; bool ca; pki_key *k; switch (hd->id) { case HD_cert_ca: if (!caAndPathLen(&ca, NULL, NULL)) return QVariant(); if (!ca) return QVariant(); pixnum = 5; break; case HD_internal_name: k = getRefKey(); if (k && k->isPrivKey()) { pixnum += 1; } if (calcEffTrust() == 0){ pixnum += 2; } break; default: return QVariant(); } return QVariant(*icon[pixnum]); } QString pki_x509::getSigAlg() { QString alg = OBJ_nid2ln(OBJ_obj2nid(cert->sig_alg->algorithm)); return alg; } const EVP_MD *pki_x509::getDigest() { return EVP_get_digestbyobj(cert->sig_alg->algorithm); } QVariant pki_x509::bg_color(dbheader *hd) { #define BG_RED QBrush(QColor(255, 0, 0)) #define BG_YELLOW QBrush(QColor(255,255, 0)) #define BG_CYAN QBrush(QColor(127,255,212)) if (dont_colorize_expiries) return QVariant(); a1time nb, na, now, certwarn; nb = getNotBefore(); na = getNotAfter(); now = a1time::now(); int lifetime = nb.secsTo(na); /* warn after 4/5 certificate lifetime */ certwarn = na.addSecs(- lifetime /5); switch (hd->id) { case HD_cert_notBefore: if (nb > now || !nb.isValid() || nb.isUndefined()) return QVariant(BG_RED); break; case HD_cert_notAfter: { if (na.isUndefined()) return QVariant(BG_CYAN); if (na < now) return QVariant(BG_RED); if (certwarn < now) return QVariant(BG_YELLOW); break; } case HD_cert_revokation: if (canSign()) { QDateTime crlwarn, crlex; crlex = crlExpiry; crlwarn = crlex.addSecs(-2 *60*60*24); if (crlex < now) return QVariant(BG_RED); if (crlwarn < now || !crlex.isValid()) return QVariant(BG_YELLOW); } } return QVariant(); } void pki_x509::oldFromData(unsigned char *p, int size) { int version, sRev, sLastCrl; QByteArray ba((char*)p, size); X509 *cert_sik = cert; cert = NULL; version = intFromData(ba); if (version >=1 && version <= 5) { intFromData(ba); /* sCert */ d2i(ba); trust = intFromData(ba); sRev = intFromData(ba); if (sRev) { if (version != 3) isrevoked = true; revoked.d2i(ba); } else { isrevoked = false; revoked = a1time::now(); } if (version == 1) { caTemplate=""; caSerial=1; crlExpiry=a1time::now(); crlDays=30; } if (version >= 2 ) { if (version >= 5) caSerial.setHex(db::stringFromData(ba)); else { int i = intFromData(ba); if (i>=0) caSerial = i; else { caSerial = getSerial(); ++caSerial; } } caTemplate = db::stringFromData(ba); } if (version >= 3 ) { crlDays = intFromData(ba); sLastCrl = intFromData(ba); if (sLastCrl) { crlExpiry.d2i(ba); } } // version 4 saves a NULL as revoked // version 3 did save a recent date :-(( } else { // old version d2i(ba); revoked = NULL; trust = 1; efftrust = 1; } if (cert) X509_free(cert_sik); else cert = cert_sik; if (ba.count() > 0) { my_error(tr("Wrong Size %1").arg(ba.count())); } } ����������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_x509.h����������������������������������������������������������������������������0000664�0000000�0000000�00000007246�11753427512�0014667�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_X509_H #define __PKI_X509_H #include <stdio.h> #include <openssl/x509.h> #include <openssl/x509v3.h> #include <openssl/pem.h> #include "pki_key.h" #include "pki_x509req.h" #include "pki_x509super.h" #include "asn1time.h" #include "asn1int.h" #include "x509rev.h" #include "x509v3ext.h" #include "pkcs11.h" class pki_x509 : public pki_x509super { Q_OBJECT private: pki_x509 *psigner; a1time revoked, crlExpiry, invalDate; bool isrevoked, randomSerial; int trust; int efftrust; a1int caSerial; a1int crlNumber; int crlDays; QString caTemplate; X509 *cert; QString revoke_reason; void init(); public: static QPixmap *icon[6]; static bool dont_colorize_expiries; pki_x509(X509 *c); pki_x509(const pki_x509 *crt); pki_x509(const QString name = ""); ~pki_x509(); void fload(const QString fname); void load_token(pkcs11 &p11, CK_OBJECT_HANDLE object); void store_token(bool alwaysSelect); void fromPEM_BIO(BIO *bio, QString name); void writeDefault(const QString fname); a1int hashInfo(const EVP_MD *md) const; a1int getQASerial(const a1int &secret) const; bool verifyQASerial(const a1int &secret) const; void setSerial(const a1int &serial); a1int getSerial() const; void setNotBefore(const a1time &a); void setNotAfter(const a1time &a); a1time getNotBefore() const; a1time getNotAfter() const; x509name getSubject() const; x509name getIssuer() const; void setSubject(const x509name &n); void setIssuer(const x509name &n); bool caAndPathLen(bool *ca, a1int *pathlen, bool *hasLen); QByteArray toData(); void fromData(const unsigned char *p, db_header_t *head); void oldFromData(unsigned char *p, int size); bool canSign(); void writeCert(const QString fname, bool PEM, bool append = false); bool verify(pki_x509 *signer); pki_key *getPubKey() const; void setPubKey(pki_key *key); pki_x509 *getSigner(); void delSigner(pki_base *s); QString fingerprint(const EVP_MD *digest); extList getV3ext(); bool checkDate(); void addV3ext(const x509v3ext &e); void sign(pki_key *signkey, const EVP_MD *digest); X509 *getCert() { return cert; } int getTrust(); void setTrust(int t); int getEffTrust(); void setEffTrust(int t); void setRevoked(bool rev, a1time inval = a1time(), QString reason = QString()); void setRevoked(const a1time &when); a1time &getRevoked(); bool isRevoked(); int calcEffTrust(); a1int getIncCaSerial(); a1int getCaSerial() { return caSerial; } void setCaSerial(a1int s) { caSerial = s; } a1int getIncCrlNumber() { return ++crlNumber; } void setTemplate(QString s) { if (s.length() > 0) caTemplate = s; } QString getTemplate() { return caTemplate; } void setCrlDays(int s) { if (s > 0) crlDays = s; } int getCrlDays() { return crlDays; } bool usesRandomSerial() { return randomSerial; } void setUseRandomSerial(bool r) { randomSerial = r; } pk11_attlist objectAttributes(); void setCrlExpiry(const a1time &time); bool hasExtension(int nid); bool cmpIssuerAndSerial(pki_x509 *refcert); void updateView(); x509rev getRev(bool reason = true); QString getSigAlg(); x509v3ext getExtByNid(int nid); const EVP_MD *getDigest(); QVariant column_data(dbheader *hd); QVariant getIcon(dbheader *hd); QByteArray i2d(); void d2i(QByteArray &ba); void deleteFromToken(); void deleteFromToken(slotid slot); virtual QString getMsg(msg_type msg); virtual int renameOnToken(slotid slot, QString name); BIO *pem(BIO *); virtual QVariant bg_color(dbheader *hd); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_x509req.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000022714�11753427512�0015727�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_x509.h" #include "pki_evp.h" #include "func.h" #include "x509name.h" #include "exception.h" #include <openssl/bio.h> #include <openssl/err.h> #include <QtCore/QDir> QPixmap *pki_x509req::icon[4] = { NULL, NULL, NULL, NULL }; pki_x509req::pki_x509req(const QString name) : pki_x509super(name) { privkey = NULL; class_name = "pki_x509req"; request = X509_REQ_new(); pki_openssl_error(); spki = NULL; dataVersion=1; pkiType=x509_req; done = false; } pki_x509req::~pki_x509req() { if (request) X509_REQ_free(request); if (spki) NETSCAPE_SPKI_free(spki); pki_openssl_error(); } void pki_x509req::createReq(pki_key *key, const x509name &dn, const EVP_MD *md, extList el) { int bad_nids[] = { NID_subject_key_identifier, NID_authority_key_identifier, NID_issuer_alt_name, NID_undef }; EVP_PKEY *privkey = NULL; if (key->isPubKey()) { my_error(tr("Signing key not valid (public key)")); return; } X509_REQ_set_version(request, 0L); X509_REQ_set_pubkey(request, key->getPubKey()); setSubject(dn); pki_openssl_error(); for(int i=0; bad_nids[i] != NID_undef; i++) el.delByNid(bad_nids[i]); el.delInvalid(); if (el.count() > 0) { STACK_OF(X509_EXTENSION) *sk; sk = el.getStack(); X509_REQ_add_extensions(request, sk); sk_X509_EXTENSION_pop_free(sk, X509_EXTENSION_free); } pki_openssl_error(); privkey = key->decryptKey(); X509_REQ_sign(request, privkey, md); pki_openssl_error(); EVP_PKEY_free(privkey); } QString pki_x509req::getMsg(msg_type msg) { /* * We do not construct english sentences from fragments * to allow proper translations. * The drawback are all the slightly different duplicated messages * * %1 will be replaced by either "SPKAC" or "PKCS#10" * %2 will be replaced by the internal name of the request */ QString type = isSpki() ? "SPKAC" : "PKCS#10"; switch (msg) { case msg_import: return tr("Successfully imported the %1 certificate request '%2'").arg(type); case msg_delete: return tr("Delete the %1 certificate request '%2'?").arg(type); case msg_create: return tr("Successfully created the %1 certificate request '%2'").arg(type); /* %1: Number of requests; %2: list of request names */ case msg_delete_multi: return tr("Delete the %1 certificate requests: %2?"); } return pki_base::getMsg(msg); } void pki_x509req::fromPEM_BIO(BIO *bio, QString name) { X509_REQ *req; req = PEM_read_bio_X509_REQ(bio, NULL, NULL, NULL); openssl_error(name); X509_REQ_free(request); request = req; autoIntName(); if (getIntName().isEmpty()) setIntName(rmslashdot(name)); } void pki_x509req::fload(const QString fname) { FILE *fp = fopen(QString2filename(fname), "r"); X509_REQ *_req; int ret = 0; if (fp != NULL) { _req = PEM_read_X509_REQ(fp, NULL, NULL, NULL); if (!_req) { pki_ign_openssl_error(); rewind(fp); _req = d2i_X509_REQ_fp(fp, NULL); } fclose(fp); // SPKAC if (!_req) { pki_ign_openssl_error(); ret = load_spkac(fname); } if (ret || pki_ign_openssl_error()) { if (_req) X509_REQ_free(_req); throw errorEx(tr("Unable to load the certificate request in file %1. Tried PEM, DER and SPKAC format.").arg(fname)); } } else { fopen_error(fname); return; } if (_req) { X509_REQ_free(request); request = _req; } autoIntName(); if (getIntName().isEmpty()) setIntName(rmslashdot(fname)); openssl_error(fname); } void pki_x509req::d2i(QByteArray &ba) { X509_REQ *r= (X509_REQ*)d2i_bytearray(D2I_VOID(d2i_X509_REQ), ba); if (r) { X509_REQ_free(request); request = r; } } void pki_x509req::d2i_spki(QByteArray &ba) { NETSCAPE_SPKI *s = (NETSCAPE_SPKI*)d2i_bytearray( D2I_VOID(d2i_NETSCAPE_SPKI), ba); if (s) { NETSCAPE_SPKI_free(spki); spki = s; } } QByteArray pki_x509req::i2d() { return i2d_bytearray(I2D_VOID(i2d_X509_REQ), request); } QByteArray pki_x509req::i2d_spki() { return i2d_bytearray(I2D_VOID(i2d_NETSCAPE_SPKI), spki); } void pki_x509req::fromData(const unsigned char *p, db_header_t *head ) { int size; size = head->len - sizeof(db_header_t); oldFromData((unsigned char *)p, size); } void pki_x509req::addAttribute(int nid, QString content) { if (content.isEmpty()) return; ASN1_STRING *a = QStringToAsn1(content, nid); X509_REQ_add1_attr_by_NID(request, nid, a->type, a->data, a->length); ASN1_STRING_free(a); openssl_error(QString("'%1' (%2)").arg(content).arg(OBJ_nid2ln(nid))); } x509name pki_x509req::getSubject() const { x509name x(X509_REQ_get_subject_name(request)); pki_openssl_error(); return x; } void pki_x509req::setSubject(const x509name &n) { if (request->req_info->subject != NULL) X509_NAME_free(request->req_info->subject); request->req_info->subject = n.get(); } bool pki_x509req::isSpki() const { return spki != NULL; } QByteArray pki_x509req::toData() { QByteArray ba; ba += i2d(); if (spki) { ba += i2d_spki(); } pki_openssl_error(); return ba; } void pki_x509req::writeDefault(const QString fname) { writeReq(fname + QDir::separator() + getIntName() + ".csr", true); } void pki_x509req::writeReq(const QString fname, bool pem) { FILE *fp = fopen(QString2filename(fname), "w"); if (fp) { if (request){ if (pem) PEM_write_X509_REQ(fp, request); else i2d_X509_REQ_fp(fp, request); } fclose(fp); pki_openssl_error(); } else fopen_error(fname); } BIO *pki_x509req::pem(BIO *b) { if (!b) b = BIO_new(BIO_s_mem()); PEM_write_bio_X509_REQ(b, request); return b; } int pki_x509req::verify() { EVP_PKEY *pkey = X509_REQ_get_pubkey(request); bool x; if (spki) { x = NETSCAPE_SPKI_verify(spki, pkey) > 0; } else { x = X509_REQ_verify(request,pkey) > 0; } pki_ign_openssl_error(); EVP_PKEY_free(pkey); return x; } pki_key *pki_x509req::getPubKey() const { EVP_PKEY *pkey = X509_REQ_get_pubkey(request); pki_ign_openssl_error(); if (pkey == NULL) return NULL; pki_evp *key = new pki_evp(pkey); pki_openssl_error(); return key; } QString pki_x509req::getSigAlg() { ASN1_OBJECT *o; if (spki) { o = spki->spkac->pubkey->algor->algorithm; } else { o = request->sig_alg->algorithm; } return QString(OBJ_nid2ln(OBJ_obj2nid(o))); } extList pki_x509req::getV3ext() { extList el; STACK_OF(X509_EXTENSION) *sk; sk = X509_REQ_get_extensions(request); el.setStack(sk); sk_X509_EXTENSION_pop_free(sk, X509_EXTENSION_free); return el; } /*! Load a spkac FILE into this request structure. The file format follows the conventions understood by the 'openssl ca' command. (see: 'man ca') */ int pki_x509req::load_spkac(const QString filename) { QFile file; x509name subject; EVP_PKEY *pktmp = NULL; pki_ign_openssl_error(); file.setFileName(filename); if (!file.open(QIODevice::ReadOnly)) return 1; while (!file.atEnd()) { int idx, nid; QByteArray line = file.readLine(); if (line.size() == 0) continue; idx = line.indexOf('='); if (idx == -1) goto err; QString type = line.left(idx).trimmed(); line = line.mid(idx+1).trimmed(); idx = type.lastIndexOf(QRegExp("[:,\\.]")); if (idx != -1) type = type.mid(idx+1); if ((nid = OBJ_txt2nid(CCHAR(type))) == NID_undef) { if (type != "SPKAC") goto err; pki_ign_openssl_error(); spki = NETSCAPE_SPKI_b64_decode(line, line.size()); if (!spki) goto err; /* Now extract the key from the SPKI structure and check the signature. */ pktmp = NETSCAPE_SPKI_get_pubkey(spki); if (pktmp == NULL) goto err; if (NETSCAPE_SPKI_verify(spki, pktmp) != 1) goto err; } else { // gather all values in the x509name subject. subject.addEntryByNid(nid, filename2QString(line.constData())); } } if (!pktmp) goto err; setSubject(subject); X509_REQ_set_pubkey(request, pktmp); EVP_PKEY_free(pktmp); return 0; err: if (pktmp) EVP_PKEY_free(pktmp); if (spki) { NETSCAPE_SPKI_free(spki); spki = NULL; } return 1; } ASN1_IA5STRING *pki_x509req::spki_challange() { if (spki) { if (spki->spkac->challenge->length >0) return spki->spkac->challenge; } return NULL; } static QString getAttribute(X509_REQ *req, int nid) { int n; n = X509_REQ_get_attr_by_NID(req, nid, -1); if (n == -1) return QString(""); X509_ATTRIBUTE *att = X509_REQ_get_attr(req, n); if (!att) return QString(""); if (att->single) return asn1ToQString(att->value.single->value.asn1_string); int count = sk_ASN1_TYPE_num(att->value.set); QStringList ret; for (int j=0; j<count; j++) { ret << asn1ToQString(sk_ASN1_TYPE_value(att->value.set, j)-> value.asn1_string); } return ret.join(", "); } QVariant pki_x509req::column_data(dbheader *hd) { switch (hd->id) { case HD_req_signed: return QVariant(done ? tr("Signed") : tr("Unhandled")); case HD_req_unstr_name: return getAttribute(request, NID_pkcs9_unstructuredName); case HD_req_chall_pass: return getAttribute(request, NID_pkcs9_challengePassword); } return pki_x509super::column_data(hd); } QVariant pki_x509req::getIcon(dbheader *hd) { int pixnum = -1; pki_key *k; switch (hd->id) { case HD_internal_name: pixnum = 0; k = getRefKey(); if (k && k->isPrivKey()) pixnum = 1; if (spki != NULL) pixnum = 2; break; case HD_req_signed: if (done) pixnum = 3; break; } if (pixnum == -1) return QVariant(); return QVariant(*icon[pixnum]); } void pki_x509req::oldFromData(unsigned char *p, int size) { QByteArray ba((const char *)p, size); privkey = NULL; d2i(ba); if (ba.count() > 0) d2i_spki(ba); if (ba.count() > 0) { my_error(tr("Wrong Size %1").arg(ba.count())); } } ����������������������������������������������������xca_0.9.3/lib/pki_x509req.h�������������������������������������������������������������������������0000664�0000000�0000000�00000003370�11753427512�0015371�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_X509REQ_H #define __PKI_X509REQ_H #include <openssl/x509.h> #include <openssl/pem.h> #include "pki_key.h" #include "x509v3ext.h" #include "pki_x509super.h" #include "x509name.h" class pki_x509; class pki_x509req : public pki_x509super { Q_OBJECT private: //loading spkac file and convert it to a request int load_spkac(const QString filename); //for checking spkac content-fields int fix_data(int nid, int *type); protected: X509_REQ *request; NETSCAPE_SPKI *spki; bool done; public: extList getV3ext(); static QPixmap *icon[4]; pki_x509req(QString name = ""); void fromPEM_BIO(BIO *bio, QString name); void fload(const QString fname); void writeDefault(const QString fname); ~pki_x509req(); void fromData(const unsigned char *p, db_header_t *head); void oldFromData(unsigned char *p, int size); QByteArray toData(); x509name getSubject() const; bool isSpki() const; void writeReq(const QString fname, bool pem); X509_REQ *getReq() { return request; } void addAttribute(int nid, QString content); int verify(); pki_key *getPubKey() const; void createReq(pki_key *key, const x509name &dn, const EVP_MD *md, extList el); QString getSigAlg(); void setSubject(const x509name &n); /* SPKAC special functions */ ASN1_IA5STRING *spki_challange(); QVariant column_data(dbheader *hd); QVariant getIcon(dbheader *hd); void setDone(bool d = true) { done = d; } bool getDone() { return done; } virtual QString getMsg(msg_type msg); void d2i(QByteArray &ba); void d2i_spki(QByteArray &ba); QByteArray i2d(); QByteArray i2d_spki(); BIO *pem(BIO *); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/pki_x509super.cpp���������������������������������������������������������������������0000664�0000000�0000000�00000005673�11753427512�0016303�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "func.h" #include "oid.h" #include "pki_x509super.h" pki_x509super::pki_x509super(const QString name) : pki_x509name(name) { privkey = NULL; } pki_x509super::~pki_x509super() { if (privkey) privkey->decUcount(); privkey = NULL; } pki_key *pki_x509super::getRefKey() const { return privkey; } void pki_x509super::setRefKey(pki_key *ref) { if (ref == NULL || privkey != NULL ) return; pki_key *mk = getPubKey(); if (mk == NULL) return; if (ref->compare(mk)) { // this is our key privkey = ref; ref->incUcount(); } delete mk; } void pki_x509super::delRefKey(pki_key *ref) { if (ref != privkey || ref == NULL) return; ref->decUcount(); privkey = NULL; } QVariant pki_x509super::column_data(dbheader *hd) { if (hd->id == HD_x509key_name) { if (!privkey) return QVariant(""); return QVariant(privkey->getIntName()); } if (hd->type == dbheader::hd_v3ext) { extList el = getV3ext(); int idx = el.idxByNid(hd->id); if (idx == -1) return QVariant(""); return QVariant(el[idx].getValue(false)); } return pki_x509name::column_data(hd); } static QString oid_sect() { QString ret; int i, max = OBJ_new_nid(0); for (i=first_additional_oid; i < max; i++) { const char *sn = OBJ_nid2sn(i); if (!sn) break; ret += QString("%1 = %2\n"). arg(OBJ_nid2sn(i)). arg(OBJ_obj2QString(OBJ_nid2obj(i), 1)); } if (!ret.isEmpty()) { ret = QString("oid_section = xca_oids\n\n" "[ xca_oids ]\n") + ret + "\n"; } return ret; } void pki_x509super::opensslConf(QString fname) { QString extensions; extList el = getV3ext(); x509name n = getSubject(); el.genGenericConf(&extensions); QString name = n.taggedValues(); QString final = oid_sect(); final += QString("[ req ]\n" "default_bits = 1024\n" "default_keyfile = privkey.pem\n" "distinguished_name = xca_dn\n" "x509_extensions = xca_extensions\n" "req_extensions = xca_extensions\n" "string_mask = MASK:0x%3\n" "utf8 = yes\n" "prompt = no\n\n" "[ xca_dn ]\n" "%1\n" "[ xca_extensions ]\n" "%2").arg(name).arg(extensions). arg(ASN1_STRING_get_default_mask(), 0, 16); FILE *fp = fopen(QString2filename(fname),"w"); if (fp == NULL) { fopen_error(fname); return; } QByteArray ba = final.toUtf8(); fwrite_ba(fp, ba, fname); fclose(fp); } // Start class pki_x509name pki_x509name::pki_x509name(const QString name) : pki_base(name) { } void pki_x509name::autoIntName() { x509name subject = getSubject(); setIntName(subject.getMostPopular()); } QVariant pki_x509name::column_data(dbheader *hd) { switch (hd->id) { case HD_subject_name: return QVariant(getSubject().oneLine( XN_FLAG_ONELINE & ~ASN1_STRFLGS_ESC_MSB)); case HD_subject_hash: return QVariant(getSubject().hash()); default: if (hd->type == dbheader::hd_x509name) return QVariant(getSubject().getEntryByNid(hd->id)); } return pki_base::column_data(hd); } ���������������������������������������������������������������������xca_0.9.3/lib/pki_x509super.h�����������������������������������������������������������������������0000664�0000000�0000000�00000002053�11753427512�0015735�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_X509SUPER_H #define __PKI_X509SUPER_H #include <openssl/x509.h> #include <openssl/pem.h> #include "pki_key.h" #include "x509name.h" #include "x509v3ext.h" class pki_x509name : public pki_base { public: pki_x509name(const QString name = ""); virtual x509name getSubject() const { return x509name(); }; void autoIntName(); QVariant column_data(dbheader *hd); }; class pki_x509super : public pki_x509name { Q_OBJECT protected: pki_key *privkey; public: pki_x509super(const QString name = ""); virtual ~pki_x509super(); virtual int verify() { return -1; }; virtual pki_key *getPubKey() const { return NULL; }; virtual extList getV3ext() { return extList(); }; virtual QString getSigAlg() { return QString(); } pki_key *getRefKey() const; void setRefKey(pki_key *ref); void delRefKey(pki_key *ref); QVariant column_data(dbheader *hd); void opensslConf(QString fname); }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/x509name.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000011430�11753427512�0015206�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include <QtGui/QMessageBox> #include "x509name.h" #include "base.h" #include "func.h" #include <openssl/asn1.h> #include <openssl/err.h> #include "exception.h" x509name::x509name() { xn = X509_NAME_new(); } x509name::x509name(const X509_NAME *n) { xn = X509_NAME_dup((X509_NAME *)n); } x509name::x509name(STACK_OF(X509_NAME_ENTRY) *entries) { X509_NAME *n = X509_NAME_new(); STACK_OF(X509_NAME_ENTRY) *ba = n->entries; xn = NULL; n->entries = entries; set(n); n->entries = ba; X509_NAME_free(n); } x509name::x509name(const x509name &n) { xn = NULL; set(n.xn); } x509name::~x509name() { X509_NAME_free(xn); } x509name &x509name::set(const X509_NAME *n) { if (xn != NULL) X509_NAME_free(xn); xn = X509_NAME_dup((X509_NAME *)n); return *this; } QString x509name::oneLine(unsigned long flags) const { QString ret; long l; const char *p; BIO *mem = BIO_new(BIO_s_mem()); X509_NAME_print_ex(mem, xn, 0, flags); l = BIO_get_mem_data(mem, &p); ret = ret.fromUtf8(p,l); BIO_free(mem); return ret; } QString x509name::getEntryByNid(int nid) const { int i = X509_NAME_get_index_by_NID(xn, nid, -1); if (i < 0) return QString::null; return getEntry(i); } QString x509name::getMostPopular() const { static const int nids[] = { NID_commonName, NID_pkcs9_emailAddress, NID_organizationalUnitName, NID_organizationName }; int pos = -1; for (unsigned i = 0; i < ARRAY_SIZE(nids) && pos < 0; i++) { pos = X509_NAME_get_index_by_NID(xn, nids[i], -1); } if (pos < 0) pos = 0; return getEntry(pos); } QString x509name::getEntry(int i) const { QString ret; ASN1_STRING *d; if ( i<0 || i>entryCount() ) return ret; d = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(xn,i)); return asn1ToQString(d); } QString x509name::getEntryTag(int i) const { QString s = QObject::tr("Invalid"); ASN1_STRING *d; if (i<0 || i>=entryCount()) i = entryCount() - 1; d = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(xn,i)); if (!d) return s; s = ASN1_tag2str(d->type); return s; } QString x509name::popEntryByNid(int nid) { int i = X509_NAME_get_index_by_NID(xn, nid, -1); if (i < 0) return QString::null; QString n = getEntry(i); X509_NAME_delete_entry(xn, i); return n; } QString x509name::hash() const { return QString("%1").arg(X509_NAME_hash(xn), 8, 16, QChar('0')); } QStringList x509name::entryList(int i) const { QStringList sl; int n = nid(i); if (n == NID_undef) { QString oid = getOid(i); sl << oid << oid; } else { sl << OBJ_nid2sn(n) << OBJ_nid2ln(n); } sl << getEntry(i) << getEntryTag(i); return sl; } int x509name::nid(int i) const { X509_NAME_ENTRY *ne; ne = sk_X509_NAME_ENTRY_value(xn->entries, i); if (ne == NULL) return NID_undef; return OBJ_obj2nid(ne->object); } QString x509name::getOid(int i) const { X509_NAME_ENTRY *ne; ne = sk_X509_NAME_ENTRY_value(xn->entries, i); if (ne == NULL) return QString(); return OBJ_obj2QString(ne->object, 1); } void x509name::d2i(QByteArray &ba) { X509_NAME *n = (X509_NAME*)d2i_bytearray(D2I_VOID(d2i_X509_NAME), ba); if (n) { X509_NAME_free(xn); xn = n; } } QByteArray x509name::i2d() { return i2d_bytearray(I2D_VOID(i2d_X509_NAME), xn); } bool x509name::operator == (const x509name &x) const { return (X509_NAME_cmp(xn, x.xn) == 0); } x509name &x509name::operator = (const x509name &x) { set(x.xn); return *this; } int x509name::entryCount() const { return X509_NAME_entry_count(xn); } int x509name::getNidByName(const QString &nid_name) { return OBJ_txt2nid(nid_name.toAscii()); } QString x509name::checkLength() const { ASN1_STRING_TABLE *tab; int i, max = entryCount(); QString warn; for (i=0; i<max; i++) { int n = nid(i); QString entry; tab = ASN1_STRING_TABLE_get(n); if (!tab) continue; entry = getEntry(i); if (tab->minsize > entry.size()) { warn += QObject::tr("%1 is shorter than %2 bytes: '%3'"). arg(OBJ_nid2ln(n)).arg(tab->maxsize).arg(entry); warn += "\n"; } if ((tab->maxsize != -1) && (tab->maxsize < entry.size())) { warn += QObject::tr("%1 is longer than %2 bytes: '%3'"). arg(OBJ_nid2ln(n)).arg(tab->maxsize).arg(entry); warn += "\n"; } } return warn; } QString x509name::taggedValues() const { int i, max = entryCount(); QString ret; for (i=0; i<max; i++) { int n = nid(i); ret += QString("%1.%2=%3\n"). arg(i).arg(OBJ_nid2sn(n)).arg(getEntry(i)); } return ret; } void x509name::addEntryByNid(int nid, const QString entry) { if (entry.isEmpty()) return; ASN1_STRING *a = QStringToAsn1(entry, nid); X509_NAME_add_entry_by_NID(xn, nid, a->type, a->data, a->length, -1, 0); ASN1_STRING_free(a); openssl_error(QString("'%1' (%2)").arg(entry).arg(OBJ_nid2ln(nid))); } X509_NAME *x509name::get() const { return X509_NAME_dup(xn); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/x509name.h����������������������������������������������������������������������������0000664�0000000�0000000�00000002247�11753427512�0014661�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __X509NAME_H #define __X509NAME_H #include <QtCore/QString> #include <QtCore/QStringList> #include <openssl/x509.h> class x509name { private: X509_NAME *xn; public: x509name(); x509name(const X509_NAME *n); x509name(const x509name &n); x509name(STACK_OF(X509_NAME_ENTRY) *entries); ~x509name(); x509name &set(const X509_NAME *n); QString oneLine(unsigned long flags = XN_FLAG_ONELINE) const; int nid(int i) const; QString getOid(int i) const; QByteArray i2d(); void d2i(QByteArray &ba); QStringList entryList(int i) const; QString getEntryByNid(int nid ) const; QString getEntry(int i) const; QString getEntryTag(int i) const; int entryCount() const; x509name &operator = (const x509name &x); bool operator == (const x509name &x) const; static int getNidByName(const QString &nid_name); void addEntryByNid(int nid, const QString entry); QString checkLength() const; QString popEntryByNid(int nid); X509_NAME *get() const; QString getMostPopular() const; QString taggedValues() const; QString hash() const; }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/x509rev.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000010745�11753427512�0015072�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "x509rev.h" #include "base.h" #include "func.h" #include <openssl/x509v3.h> #include <QtCore/QStringList> #ifndef CRL_REASON_UNSPECIFIED #define CRL_REASON_UNSPECIFIED 0 #define CRL_REASON_KEY_COMPROMISE 1 #define CRL_REASON_CA_COMPROMISE 2 #define CRL_REASON_AFFILIATION_CHANGED 3 #define CRL_REASON_SUPERSEDED 4 #define CRL_REASON_CESSATION_OF_OPERATION 5 #define CRL_REASON_CERTIFICATE_HOLD 6 #define CRL_REASON_REMOVE_FROM_CRL 8 #define CRL_REASON_PRIVILEGE_WITHDRAWN 9 #define CRL_REASON_AA_COMPROMISE 10 #endif static ENUMERATED_NAMES crl_reasons[] = { {CRL_REASON_UNSPECIFIED, "Unspecified", "unspecified"}, {CRL_REASON_KEY_COMPROMISE, "Key Compromise", "keyCompromise"}, {CRL_REASON_CA_COMPROMISE, "CA Compromise", "CACompromise"}, {CRL_REASON_AFFILIATION_CHANGED, "Affiliation Changed", "affiliationChanged"}, {CRL_REASON_SUPERSEDED, "Superseded", "superseded"}, {CRL_REASON_CESSATION_OF_OPERATION, "Cessation Of Operation", "cessationOfOperation"}, {CRL_REASON_CERTIFICATE_HOLD, "Certificate Hold", "certificateHold"}, {CRL_REASON_REMOVE_FROM_CRL, "Remove From CRL", "removeFromCRL"}, {CRL_REASON_PRIVILEGE_WITHDRAWN, "Privilege Withdrawn", "privilegeWithdrawn"}, {CRL_REASON_AA_COMPROMISE, "AA Compromise", "AACompromise"}, {-1, NULL, NULL} }; QStringList x509rev::crlreasons() { QStringList l; for (int i=0; crl_reasons[i].lname; i++) l << crl_reasons[i].lname; return l; } static X509_REVOKED *X509_REVOKED_dup(const X509_REVOKED *n) { int len; X509_REVOKED *ret; unsigned char *buf, *p; len = i2d_X509_REVOKED((X509_REVOKED *)n, NULL); buf = (unsigned char *)OPENSSL_malloc(len); p = buf; i2d_X509_REVOKED((X509_REVOKED *)n, &p); p = buf; ret = d2i_X509_REVOKED(NULL, (const unsigned char **)&p, len); OPENSSL_free(buf); return(ret); } x509rev::x509rev() { rev = X509_REVOKED_new(); } x509rev::x509rev(const X509_REVOKED *n) { rev = X509_REVOKED_dup(n); } x509rev::x509rev(const x509rev &n) { rev = NULL; set(n.rev); } x509rev::~x509rev() { X509_REVOKED_free(rev); } x509rev &x509rev::set(const X509_REVOKED *n) { if (rev != NULL) X509_REVOKED_free(rev); rev = X509_REVOKED_dup(n); return *this; } bool x509rev::operator == (const x509rev &x) const { return (getSerial() == x.getSerial() && getDate() == x.getDate()); } x509rev &x509rev::operator = (const x509rev &x) { set(x.rev); return *this; } void x509rev::setSerial(const a1int &i) { if (rev->serialNumber != NULL) ASN1_INTEGER_free(rev->serialNumber); rev->serialNumber = i.get(); } void x509rev::setDate(const a1time &a) { a1time t(a); X509_REVOKED_set_revocationDate(rev, t.get_utc()); } a1int x509rev::getSerial() const { a1int a(rev->serialNumber); return a; } a1time x509rev::getDate() const { a1time t(rev->revocationDate); return t; } void x509rev::setInvalDate(const a1time &date) { a1time t(date); X509_REVOKED_add1_ext_i2d(rev, NID_invalidity_date, t.get(), 0, 0); openssl_error(); } void x509rev::setReason(const QString &reason) { /* RFC says to not add the extension if it is "unspecified" */ if (reason == crl_reasons[0].lname) return; ASN1_ENUMERATED *a = ASN1_ENUMERATED_new(); openssl_error(); for (int i=0; crl_reasons[i].lname; i++) { if (reason == crl_reasons[i].lname) { ASN1_ENUMERATED_set(a, crl_reasons[i].bitnum); break; } } openssl_error(); X509_REVOKED_add1_ext_i2d(rev, NID_crl_reason, a, 0, 0); openssl_error(); ASN1_ENUMERATED_free(a); } QString x509rev::getReason() const { ASN1_ENUMERATED *reason; int j, r; reason = (ASN1_ENUMERATED *)X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, &j, NULL); openssl_error(); if (j == -1) return QString(crl_reasons[0].lname); r = ASN1_ENUMERATED_get(reason); openssl_error(); ASN1_ENUMERATED_free(reason); for (int i=0; crl_reasons[i].lname; i++) { if (r == crl_reasons[i].bitnum) { return QString(crl_reasons[i].lname); } } return QString(); } a1time x509rev::getInvalDate() const { ASN1_TIME *at; a1time a; int j; at = (ASN1_TIME *)X509_REVOKED_get_ext_d2i(rev, NID_invalidity_date, &j, NULL); openssl_error(); if (j == -1) { a.setUndefined(); return a; } a.set(at); ASN1_GENERALIZEDTIME_free(at); return a; } X509_REVOKED *x509rev::get() const { return X509_REVOKED_dup(rev); } ���������������������������xca_0.9.3/lib/x509rev.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000001526�11753427512�0014534�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __X509REV_H #define __X509REV_H #include <QtCore/QString> #include <openssl/x509.h> #include "asn1time.h" #include "asn1int.h" class x509rev { private: X509_REVOKED *rev; public: x509rev(); x509rev(const X509_REVOKED *n); x509rev(const x509rev &n); ~x509rev(); static QStringList crlreasons(); x509rev &set(const X509_REVOKED *n); x509rev &operator = (const x509rev &x); bool operator == (const x509rev &x) const; void setSerial(const a1int &i); void setDate(const a1time &t); a1int getSerial() const; a1time getDate() const; void setInvalDate(const a1time &date); a1time getInvalDate() const; void setReason(const QString &reason); QString getReason() const; X509_REVOKED *get() const; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/lib/x509v3ext.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000046634�11753427512�0015355�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "x509v3ext.h" #include "x509name.h" #include "asn1int.h" #include "func.h" #include <openssl/x509v3.h> #include <openssl/stack.h> #include <QtCore/QStringList> #include "base.h" x509v3ext::x509v3ext() { ext = X509_EXTENSION_new(); } x509v3ext::x509v3ext(const X509_EXTENSION *n) { ext = X509_EXTENSION_dup((X509_EXTENSION *)n); } x509v3ext::x509v3ext(const x509v3ext &n) { ext = NULL; set(n.ext); } x509v3ext::~x509v3ext() { X509_EXTENSION_free(ext); } x509v3ext &x509v3ext::set(const X509_EXTENSION *n) { if (ext != NULL) X509_EXTENSION_free(ext); ext = X509_EXTENSION_dup((X509_EXTENSION *)n); return *this; } x509v3ext &x509v3ext::create(int nid, const QString &et, X509V3_CTX *ctx) { if (ext) { X509_EXTENSION_free(ext); ext = NULL; } if (!et.isEmpty()) { ext = X509V3_EXT_conf_nid(NULL, ctx, nid, (char*)CCHAR(et)); } if (!ext) ext = X509_EXTENSION_new(); else { if (ctx && ctx->subject_cert) { STACK_OF(X509_EXTENSION) **sk; sk = &ctx->subject_cert->cert_info->extensions; X509v3_add_ext(sk, ext, -1); } } return *this; } int x509v3ext::nid() const { ASN1_OBJECT *obj = X509_EXTENSION_get_object(ext); return OBJ_obj2nid(obj); } void *x509v3ext::d2i() const { return X509V3_EXT_d2i(ext); } x509v3ext &x509v3ext::operator = (const x509v3ext &x) { set(x.ext); return *this; } QString x509v3ext::getObject() const { return OBJ_obj2QString(X509_EXTENSION_get_object(ext)); } int x509v3ext::getCritical() const { return X509_EXTENSION_get_critical(ext); } QString x509v3ext::getValue(bool html) const { QString text = ""; int ret; char *p = NULL; BIO *bio = BIO_new(BIO_s_mem()); ret = X509V3_EXT_print(bio, ext, X509V3_EXT_DEFAULT, 0); if (ret) { long len = BIO_get_mem_data(bio, &p); text = QString::fromLocal8Bit(p, len); } BIO_free(bio); if (html) { text.replace(QRegExp("&"), "&"); text.replace(QRegExp("<"), "<"); text.replace(QRegExp(">"), ">"); text.replace(QRegExp("\n"), "<br>\n"); } return text.trimmed(); } static QString vlist2Section(QStringList vlist, QString tag, QString *sect) { /* Check for commas in the text */ if (!vlist.join("").contains(",")) return vlist.join(", "); *sect += QString("\n[%1_sect]\n").arg(tag); for (int i=0; i<vlist.count(); i++) { QString s = vlist[i]; int eq = s.indexOf(":"); *sect += QString("%1.%2=%3\n").arg(s.left(eq)). arg(i).arg(s.mid(eq+1)); } return QString("@%1_sect\n").arg(tag); } bool x509v3ext::parse_ia5(QString *single, QString *adv) const { ASN1_STRING *str = (ASN1_STRING *)d2i(); QString ret; if (!str) return false; ret = QString(asn1ToQString(str)); if (single) *single = ret; else if (adv) *adv = QString("%1=%2\n").arg(OBJ_nid2sn(nid())).arg(ret) +*adv; ASN1_STRING_free(str); return true; } static const char *asn1Type2Name(int type) { #define ASN1_GEN_STR(x,y) { x,y } struct { const char *strnam; int tag; } tags[] = { ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN), ASN1_GEN_STR("NULL", V_ASN1_NULL), ASN1_GEN_STR("INT", V_ASN1_INTEGER), ASN1_GEN_STR("ENUM", V_ASN1_ENUMERATED), ASN1_GEN_STR("OID", V_ASN1_OBJECT), ASN1_GEN_STR("UTC", V_ASN1_UTCTIME), ASN1_GEN_STR("GENTIME", V_ASN1_GENERALIZEDTIME), ASN1_GEN_STR("OCT", V_ASN1_OCTET_STRING), ASN1_GEN_STR("BITSTR", V_ASN1_BIT_STRING), ASN1_GEN_STR("UNIV", V_ASN1_UNIVERSALSTRING), ASN1_GEN_STR("IA5", V_ASN1_IA5STRING), ASN1_GEN_STR("UTF8", V_ASN1_UTF8STRING), ASN1_GEN_STR("BMP", V_ASN1_BMPSTRING), ASN1_GEN_STR("VISIBLE", V_ASN1_VISIBLESTRING), ASN1_GEN_STR("PRINTABLE", V_ASN1_PRINTABLESTRING), ASN1_GEN_STR("T61", V_ASN1_T61STRING), ASN1_GEN_STR("GENSTR", V_ASN1_GENERALSTRING), ASN1_GEN_STR("NUMERIC", V_ASN1_NUMERICSTRING), }; for (unsigned i=0; i< ARRAY_SIZE(tags); i++) { if (tags[i].tag == type) return tags[i].strnam; } return NULL; } static bool asn1TypePrintable(int type) { switch (type) { case V_ASN1_IA5STRING: case V_ASN1_UTF8STRING: case V_ASN1_BMPSTRING: case V_ASN1_VISIBLESTRING: case V_ASN1_PRINTABLESTRING: case V_ASN1_T61STRING: case V_ASN1_GENERALSTRING: return true; } return false; } static QString ipv6_from_binary(const unsigned char *p) { QString ip; int i, skip =0, skiplen = 0, skippos =0; /* find largest gap */ for (i = 0; i < 17; i += 2) { if (i==16 || (p[i] | p[i +1])) { if (skiplen < skip) { skiplen = skip; skippos = i - skip; } skip = 0; } else { skip += 2; } } for (i = 0, skip = 0; i < 16; i += 2) { int x = p[i] << 8 | p[i+1]; skip += skippos == i; switch (!x*4 + skip) { case 5: // skip first 0 skip = 2; ip += ":"; case 6: // skip next 0 break; default: // no reduction skip = 0; ip += QString("%1%2").arg(i? ":" : "").arg(x,0,16); } } if (skip == 2) ip += ":"; return ip; } static bool genName2conf(GENERAL_NAME *gen, QString tag, QString *single, QString *sect) { unsigned char *p; QString ret; switch (gen->type) { case GEN_EMAIL: ret = "email:%1"; break; case GEN_DNS: ret = "DNS:%1"; break; case GEN_URI: ret = "URI:%1"; break; case GEN_DIRNAME: { tag += "_dirname"; x509name xn(gen->d.dirn); *sect += QString("\n[%1]\n"). arg(tag); *sect += xn.taggedValues(); *single = QString("dirName:") + tag; return true; } case GEN_IPADD: p = gen->d.ip->data; if (gen->d.ip->length == 4) { *single = QString("IP:%1.%2.%3.%4"). arg(p[0]).arg(p[1]).arg(p[2]).arg(p[3]); return true; } else if(gen->d.ip->length == 16) { *single = "IP:" + ipv6_from_binary(gen->d.ip->data); return true; } return false; case GEN_RID: *single = QString("RID:%1"). arg(OBJ_obj2QString(gen->d.rid)); return true; case GEN_OTHERNAME: { int type = gen->d.otherName->value->type; ASN1_STRING *a; a = gen->d.otherName->value->value.asn1_string; if (asn1TypePrintable(type)) { *single = QString("otherName:%1;%2:%3"). arg(OBJ_obj2QString(gen->d.otherName->type_id)). arg(asn1Type2Name(type)). arg(asn1ToQString(a, true)); } else { *single = QString("otherName:%1;FORMAT:HEX,%2"). arg(OBJ_obj2QString(gen->d.otherName->type_id)). arg(asn1Type2Name(type)); for (int i=0; i<a->length; i++) { *single += QString(":%1"). arg((int)(a->data[i]), 2, 16, QChar('0')); } } return true; } default: return false; } if (!ret.isEmpty()) *single = ret.arg(asn1ToQString(gen->d.ia5, true)); return true; } static bool genNameStack2conf(STACK_OF(GENERAL_NAME) *gens, QString tag, QString *single, QString *sect) { int i; QStringList sl; for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) { QString one; if (!genName2conf(sk_GENERAL_NAME_value(gens, i), QString("%1_%2").arg(tag).arg(i), &one, sect)) { return false; } sl << one; } *single = vlist2Section(sl, tag, sect); return true; } QString x509v3ext::parse_critical() const { return QString(getCritical() ? "critical," : ""); } bool x509v3ext::parse_generalName(QString *single, QString *adv) const { bool retval = true; QString sect, ret; QString tag = OBJ_nid2sn(nid()); STACK_OF(GENERAL_NAME) *gens = (STACK_OF(GENERAL_NAME) *)d2i(); if (!genNameStack2conf(gens, tag, &ret, §)) retval = false; else if (sect.isEmpty() && single) { *single = parse_critical() + ret; } else if (adv) { *adv = QString("%1=%2\n").arg(tag). arg(parse_critical() +ret) + *adv + sect; } sk_GENERAL_NAME_free(gens); return retval; } bool x509v3ext::parse_eku(QString *single, QString *adv) const { EXTENDED_KEY_USAGE *eku = (EXTENDED_KEY_USAGE *)d2i(); QStringList sl; int i; for (i = 0; i < sk_ASN1_OBJECT_num(eku); i++) { sl << QString(OBJ_obj2sn(sk_ASN1_OBJECT_value(eku, i))); } QString r = parse_critical() + sl.join(", "); if (single) *single = r; else if (adv) *adv = QString("%1=%2\n").arg(OBJ_nid2sn(nid())).arg(r) + *adv; EXTENDED_KEY_USAGE_free(eku); return true; } bool x509v3ext::parse_ainfo(QString *single, QString *adv) const { bool retval = true; QString sect, ret; QString tag = OBJ_nid2sn(nid()); QStringList sl; int i; AUTHORITY_INFO_ACCESS *ainfo = (AUTHORITY_INFO_ACCESS *)d2i(); for (i = 0; i < sk_ACCESS_DESCRIPTION_num(ainfo); i++) { QString one; ACCESS_DESCRIPTION *desc = sk_ACCESS_DESCRIPTION_value(ainfo, i); if (!genName2conf(desc->location, QString("%1_%2").arg(tag).arg(i), &one, §)) { retval = false; break; } sl << QString("%1;%2").arg(OBJ_obj2sn(desc->method)).arg(one); } if (retval) { ret = vlist2Section(sl, tag, §); if (sect.isEmpty() && sk_ACCESS_DESCRIPTION_num(ainfo) == 1 && single) { *single = parse_critical() + ret; } else if (adv) { *adv = QString("%1=%2\n").arg(tag). arg(parse_critical() + ret) + *adv + sect; } } AUTHORITY_INFO_ACCESS_free(ainfo); return retval; } static const BIT_STRING_BITNAME reason_flags[] = { {0, "", "unused"}, {1, "", "keyCompromise"}, {2, "", "CACompromise"}, {3, "", "affiliationChanged"}, {4, "", "superseded"}, {5, "", "cessationOfOperation"}, {6, "", "certificateHold"}, {7, "", "privilegeWithdrawn"}, {8, "", "AACompromise"}, {-1, NULL, NULL} }; static QString parse_bits(const BIT_STRING_BITNAME *flags, ASN1_BIT_STRING *str) { const BIT_STRING_BITNAME *pbn; QStringList r; for (pbn = flags; pbn->sname; pbn++) { if (ASN1_BIT_STRING_get_bit(str, pbn->bitnum)) r << QString(pbn->sname); } return r.join(", "); } bool x509v3ext::parse_Crldp(QString *single, QString *adv) const { QString othersect; QStringList crldps; const char *sn = OBJ_nid2sn(nid()); STACK_OF(DIST_POINT) *crld = (STACK_OF(DIST_POINT)*)d2i(); if (sk_DIST_POINT_num(crld) == 1 && single) { DIST_POINT *point = sk_DIST_POINT_value(crld, 0); if (point->distpoint && !point->reasons && !point->CRLissuer && !point->distpoint->type) { QString sect, ret; if (!genNameStack2conf(point->distpoint->name.fullname, "", &ret, §)) goto could_not_parse; if (sect.isEmpty()) { if (single) *single = parse_critical() +ret; else if (adv) *adv = QString("%1=%2\n").arg(sn). arg(parse_critical() +ret) +*adv; return true; } } } for(int i = 0; i < sk_DIST_POINT_num(crld); i++) { DIST_POINT *point = sk_DIST_POINT_value(crld, i); QString tag = QString("crlDistributionPoint%1_sect").arg(i); QString crldpsect = QString("\n[%1]\n").arg(tag); if (point->distpoint) { if (!point->distpoint->type) { QString ret; if (!genNameStack2conf(point->distpoint->name.fullname, tag + "_fullname", &ret, &othersect)) goto could_not_parse; crldpsect += "fullname=" + ret +"\n"; } else { QString mysect = tag + "_relativename"; x509name xn(point->distpoint->name.relativename); crldpsect += "relativename=" + mysect + "\n"; othersect += QString("\n[%1]\n").arg(mysect) + xn.taggedValues(); } } if (point->reasons) { crldpsect += QString("reasons=%1\n"). arg(parse_bits(reason_flags, point->reasons)); } if (point->CRLissuer) { QString ret; if (genNameStack2conf(point->CRLissuer, tag +"_crlissuer", &ret, &othersect)) goto could_not_parse; crldpsect += "CRLissuer=" + ret + "\n"; } crldps << tag; othersect = crldpsect + othersect; } sk_DIST_POINT_free(crld); if (crldps.size() == 0) return true; if (adv) { *adv = QString("%1=%2\n").arg(sn). arg(parse_critical() + crldps.join(", ")) + *adv + othersect; #if OPENSSL_VERSION_NUMBER < 0x10000000L *adv = QString( "\n" "# This syntax only works for openssl >= 1.0.0\n" "# But this is %1\n" "# ").arg(OPENSSL_VERSION_TEXT) + *adv; #endif } return true; could_not_parse: sk_DIST_POINT_free(crld); return false; } static void gen_cpol_notice(QString tag, USERNOTICE *notice, QString *adv) { *adv += QString("\n[%1]\n").arg(tag); if (notice->exptext) { *adv += QString("explicitText=%1\n"). arg(asn1ToQString(notice->exptext, true)); } if (notice->noticeref) { NOTICEREF *ref = notice->noticeref; QStringList sl; int i; *adv += QString("organization=%1\n"). arg(asn1ToQString(ref->organization, true)); for (i = 0; i < sk_ASN1_INTEGER_num(ref->noticenos); i++) { a1int num(sk_ASN1_INTEGER_value(ref->noticenos, i)); sl << num.toDec(); } if (sl.size()) *adv += QString("noticeNumbers=%1\n"). arg(sl.join(", ")); } } static bool gen_cpol_qual_sect(QString tag, POLICYINFO *pinfo, QString *adv) { QString polsect = QString("\n[%1]\n").arg(tag); QString noticetag, _adv; STACK_OF(POLICYQUALINFO) *quals = pinfo->qualifiers; int i; if (!adv) adv = &_adv; polsect += QString("policyIdentifier=%1\n"). arg(OBJ_obj2QString(pinfo->policyid)); for (i = 0; i < sk_POLICYQUALINFO_num(quals); i++) { POLICYQUALINFO *qualinfo = sk_POLICYQUALINFO_value(quals, i); switch (OBJ_obj2nid(qualinfo->pqualid)) { case NID_id_qt_cps: polsect += QString("CPS.%1=%2\n").arg(i). arg(asn1ToQString(qualinfo->d.cpsuri, true)); break; case NID_id_qt_unotice: noticetag = QString("%1_notice%2_sect").arg(tag).arg(i); polsect += QString("userNotice.%1=@%2\n").arg(i). arg(noticetag); gen_cpol_notice(noticetag, qualinfo->d.usernotice, adv); break; default: return false; } } *adv = polsect + *adv; return true; } bool x509v3ext::parse_certpol(QString *, QString *adv) const { bool retval = true; QStringList pols; QString myadv; STACK_OF(POLICYINFO) *pol = (STACK_OF(POLICYINFO) *)d2i(); int i; for (i = 0; i < sk_POLICYINFO_num(pol); i++) { POLICYINFO *pinfo = sk_POLICYINFO_value(pol, i); if (!pinfo->qualifiers) { pols << OBJ_obj2QString(pinfo->policyid); continue; } QString tag = QString("certpol%1_sect").arg(i); pols << QString("@") + tag; if (!gen_cpol_qual_sect(tag, pinfo, &myadv)) { retval = false; break; } } if (retval && adv) *adv = QString("certificatePolicies=ia5org,%1\n"). arg(pols.join(", ")) + *adv + myadv; sk_POLICYINFO_free(pol); return retval; } bool x509v3ext::parse_bc(QString *single, QString *adv) const { BASIC_CONSTRAINTS *bc = (BASIC_CONSTRAINTS *)d2i(); QString ret = a1int(bc->pathlen).toDec(); if (!ret.isEmpty()) ret = ",pathlen:" + ret; ret = parse_critical() + (bc->ca ? "CA:TRUE" : "CA:FALSE") + ret; if (single) *single = ret; else if (adv) *adv = QString("%1=%2\n").arg(OBJ_nid2sn(nid())).arg(ret) +*adv; BASIC_CONSTRAINTS_free(bc); return true; } static const BIT_STRING_BITNAME key_usage_type_table[] = { {0, "Digital Signature", "digitalSignature"}, {1, "Non Repudiation", "nonRepudiation"}, {2, "Key Encipherment", "keyEncipherment"}, {3, "Data Encipherment", "dataEncipherment"}, {4, "Key Agreement", "keyAgreement"}, {5, "Certificate Sign", "keyCertSign"}, {6, "CRL Sign", "cRLSign"}, {7, "Encipher Only", "encipherOnly"}, {8, "Decipher Only", "decipherOnly"}, {-1, NULL, NULL} }; static const BIT_STRING_BITNAME ns_cert_type_table[] = { {0, "SSL Client", "client"}, {1, "SSL Server", "server"}, {2, "S/MIME", "email"}, {3, "Object Signing", "objsign"}, {4, "Unused", "reserved"}, {5, "SSL CA", "sslCA"}, {6, "S/MIME CA", "emailCA"}, {7, "Object Signing CA", "objCA"}, {-1, NULL, NULL} }; bool x509v3ext::parse_bitstring(QString *single, QString *adv) const { ASN1_BIT_STRING *bs; const BIT_STRING_BITNAME *bnames; int n = nid(); switch (n) { case NID_key_usage: bnames = key_usage_type_table; break; case NID_netscape_cert_type: bnames = ns_cert_type_table; break; default: return false; } bs = (ASN1_BIT_STRING *)d2i(); QString ret = parse_critical() + parse_bits(bnames, bs); if (single) *single = ret; else if (adv) *adv = QString("%1=%2\n").arg(OBJ_nid2sn(nid())).arg(ret) +*adv; ASN1_BIT_STRING_free(bs); return true; } bool x509v3ext::parse_sKeyId(QString *, QString *adv) const { if (adv) *adv = QString("%1=hash\n").arg(OBJ_nid2sn(nid())) + *adv; return true; } bool x509v3ext::parse_aKeyId(QString *, QString *adv) const { QStringList ret; AUTHORITY_KEYID *akeyid = (AUTHORITY_KEYID *)d2i(); if (akeyid->keyid) ret << "keyid"; if (akeyid->issuer) ret << "issuer"; if (adv) *adv = QString("%1=%2\n").arg(OBJ_nid2sn(nid())). arg(ret.join(", ")) + *adv; AUTHORITY_KEYID_free(akeyid); return true; } bool x509v3ext::parse_generic(QString *, QString *adv) const { QString der, obj; int n = nid(); if (n == NID_undef) obj = OBJ_obj2QString(X509_EXTENSION_get_object(ext)); else obj = OBJ_nid2sn(n); ASN1_OCTET_STRING *v = ext->value; for (int i=0; i<v->length; i++) der += QString(":%1").arg((int)(v->data[i]), 2, 16, QChar('0')); if (adv) *adv = QString("%1=%2DER%3\n").arg(obj). arg(parse_critical()).arg(der) + *adv; return true; } bool x509v3ext::genConf(QString *single, QString *adv) const { int n = nid(); switch (n) { case NID_crl_distribution_points: return parse_Crldp(single, adv); case NID_subject_alt_name: case NID_issuer_alt_name: return parse_generalName(single, adv); case NID_info_access: return parse_ainfo(single, adv); case NID_ext_key_usage: return parse_eku(single, adv); case NID_certificate_policies: return parse_certpol(single, adv); case NID_netscape_comment: case NID_netscape_base_url: case NID_netscape_revocation_url: case NID_netscape_ca_revocation_url: case NID_netscape_renewal_url: case NID_netscape_ca_policy_url: case NID_netscape_ssl_server_name: return parse_ia5(single, adv); case NID_basic_constraints: return parse_bc(single, adv); case NID_key_usage: case NID_netscape_cert_type: return parse_bitstring(single, adv); case NID_subject_key_identifier: return parse_sKeyId(single, adv); case NID_authority_key_identifier: return parse_aKeyId(single, adv); default: return parse_generic(single, adv); } return false; } QString x509v3ext::getHtml() const { QString html; html = "<b><u>" + getObject(); if (getCritical() != 0) html += " <font color=\"red\">critical</font>"; html += ":</u></b><br><tt>" + getValue(true) + "</tt>"; return html; } X509_EXTENSION *x509v3ext::get() const { return X509_EXTENSION_dup(ext); } bool x509v3ext::isValid() const { return ext->value->length > 0 && OBJ_obj2nid(ext->object) != NID_undef; } /*************************************************************/ bool extList::genConf(int nid, QString *single, QString *adv) { int i = idxByNid(nid); if (i != -1) { if (at(i).genConf(single, adv)) removeAt(i); ign_openssl_error(); return true; } return false; } void extList::genGenericConf(QString *adv) { for (int i=0; i< size();) { if (at(i).genConf(NULL, adv) || at(i).parse_generic(NULL, adv)) removeAt(i); else i++; ign_openssl_error(); } } void extList::setStack(STACK_OF(X509_EXTENSION) *st, int start) { clear(); int cnt = sk_X509_EXTENSION_num(st); x509v3ext e; for (int i=start; i<cnt; i++) { e.set(sk_X509_EXTENSION_value(st,i)); append(e); } } STACK_OF(X509_EXTENSION) *extList::getStack() { STACK_OF(X509_EXTENSION) *sk; sk = sk_X509_EXTENSION_new_null(); for (int i=0; i< count(); i++) { sk_X509_EXTENSION_push(sk, operator[](i).get()); } return sk; } QString extList::getHtml(const QString &sep) { x509v3ext e; QStringList s; for (int i=0; i< size(); i++) s << at(i).getHtml(); QString a = s.join(sep); return a; } bool extList::delByNid(int nid) { for(int i = 0; i< size(); i++) { if (at(i).nid() == nid) { removeAt(i); return true; } } return false; } int extList::idxByNid(int nid) { for(int i = 0; i< size(); i++) { if (at(i).nid() == nid) { return i; } } return -1; } int extList::delInvalid(void) { int removed=0; for(int i = 0; i<size(); i++) { if (!at(i).isValid()) { removeAt(i); removed=1; i--; } } return removed; } ����������������������������������������������������������������������������������������������������xca_0.9.3/lib/x509v3ext.h���������������������������������������������������������������������������0000664�0000000�0000000�00000003643�11753427512�0015013�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __X509V3EXT_H #define __X509V3EXT_H #include <QtCore/QList> #include <QtCore/QStringList> #include <openssl/x509.h> #include <openssl/x509v3.h> class QString; class x509v3ext { private: X509_EXTENSION *ext; public: x509v3ext(); x509v3ext(const X509_EXTENSION *n); x509v3ext(const x509v3ext &n); ~x509v3ext(); x509v3ext &set(const X509_EXTENSION *n); x509v3ext &create(int nid, const QString &et, X509V3_CTX *ctx = NULL); x509v3ext &operator = (const x509v3ext &x); // bool operator == (const x509v3ext &x) const; QString getObject() const; int getCritical() const; QString getValue(bool html=false) const; QString getHtml() const; X509_EXTENSION *get() const; bool isValid() const; int nid() const; void *d2i() const; bool genConf(QString *single, QString *adv) const; bool parse_generic(QString *single, QString *adv) const; protected: QString parse_critical() const; bool parse_certpol(QString *single, QString *adv) const; bool parse_ainfo(QString *single, QString *adv) const; bool parse_Crldp(QString *single, QString *adv) const; bool parse_eku(QString *single, QString *adv) const; bool parse_generalName(QString *single, QString *adv) const; bool parse_ia5(QString *single, QString *adv) const; bool parse_bc(QString *single, QString *adv) const; bool parse_bitstring(QString *single, QString *adv) const; bool parse_sKeyId(QString *single, QString *adv) const; bool parse_aKeyId(QString *single, QString *adv) const; }; class extList : public QList<x509v3ext> { public: void setStack(STACK_OF(X509_EXTENSION) *st, int start=0); STACK_OF(X509_EXTENSION) *getStack(); QString getHtml(const QString &sep); bool delByNid(int nid); int delInvalid(); int idxByNid(int nid); bool genConf(int nid, QString *single, QString *adv = NULL); void genGenericConf(QString *adv); }; #endif ���������������������������������������������������������������������������������������������xca_0.9.3/macdeployqt/������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11753427512�0014711�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/macdeployqt/.gitignore��������������������������������������������������������������������0000664�0000000�0000000�00000000030�11753427512�0016672�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Makefile.qt macdeployqt ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/macdeployqt/Makefile����������������������������������������������������������������������0000664�0000000�0000000�00000000435�11753427512�0016353�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ifeq ($(TOPDIR),) TOPDIR=.. endif all: macdeployqt macdeployqt: Makefile.qt main.cpp shared.cpp shared.h $(MAKE) -f Makefile.qt Makefile.qt: macdeployqt.pro $(QMAKE) -spec macx-g++ -o $@ $< clean: rm -f *.o Makefile.qt macdeployqt distclean: clean include $(TOPDIR)/Local.mak �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/macdeployqt/macdeployqt.pro���������������������������������������������������������������0000664�0000000�0000000�00000000230�11753427512�0017750�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������TEMPLATE = app TARGET = macdeployqt DEPENDPATH += . INCLUDEPATH += . # Input SOURCES += main.cpp shared.cpp CONFIG += qt warn_on CONFIG -= app_bundle ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/macdeployqt/main.cpp����������������������������������������������������������������������0000664�0000000�0000000�00000006025�11753427512�0016344�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**************************************************************************** ** ** Copyright (C) 2007 Trolltech ASA. All rights reserved. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #include "shared.h" int main(int argc, char **argv) { QString appBundlePath; if (argc > 1) appBundlePath = QString::fromLocal8Bit(argv[1]); if (argc < 2 || appBundlePath.startsWith("-")) { qDebug() << "Usage: macdeployqt app-bundle [-no-plugins] [-dmg]"; qDebug() << ""; qDebug() << "macdeployqt creates self-contained application bundles that"; qDebug() << "contains the Qt frameworks and plugins used by the application."; qDebug() << ""; qDebug() << "Only frameworks in use are copied into the bundle."; qDebug() << "Plugins related to a framework are copied in with the"; qDebug() << "framework. The accessibilty, image formats, and text codec"; qDebug() << "plugins are always copied, unless \"-no-plugins\" is specified."; qDebug() << ""; qDebug() << "See the \"Deploying an Application on Qt/Mac\" typic in the"; qDebug() << "documentation for more information about deployment on Mac OS X."; return 0; } if (appBundlePath.endsWith("/")) appBundlePath.chop(1); DeploymentInfo deploymentInfo = deployQtFrameworks(appBundlePath); bool plugins = true; bool dmg = false; for (int i = 2; i < argc; ++i) { QByteArray argument = QByteArray(argv[i]); if (argument == QByteArray("-no-plugins")) plugins = false; if (argument == QByteArray("-dmg")) dmg = true; } if (plugins) { if (deploymentInfo.qtPath.isEmpty()) { QString sysroot = getenv("SYSROOT"); deploymentInfo.pluginPath = sysroot + "/Developer/Applications/Qt/plugins"; // Assume binary package. } else deploymentInfo.pluginPath = deploymentInfo.qtPath + "/plugins"; qDebug() << "Deploying plugins from" << deploymentInfo.pluginPath; deployPlugins(appBundlePath, deploymentInfo); createQtConf(appBundlePath); } if (dmg) { qDebug() << "Creating disk image (.dmg) for" << appBundlePath; createDiskImage(appBundlePath); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/macdeployqt/shared.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000047461�11753427512�0016677�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**************************************************************************** ** ** Copyright (C) 2007 Trolltech ASA. All rights reserved. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #include <QString> #include <QStringList> #include <QDebug> #include <iostream> #include <QProcess> #include <QDir> #include <QRegExp> #include <QSet> #include <QDirIterator> #include "shared.h" using std::cout; using std::endl; bool operator==(const FrameworkInfo &a, const FrameworkInfo &b) { return ((a.frameworkPath == b.frameworkPath) && (a.binaryPath == b.binaryPath)); } QDebug operator<<(QDebug debug, const FrameworkInfo &info) { debug << "Framework directory" << info.frameworkDirectory << "\n"; debug << "Framework name" << info.frameworkName << "\n"; debug << "Framework path" << info.frameworkPath << "\n"; debug << "Binary directory" << info.binaryDirectory << "\n"; debug << "Binary name" << info.binaryName << "\n"; debug << "Binary path" << info.binaryPath << "\n"; debug << "Version" << info.version << "\n"; debug << "Install name" << info.installName << "\n"; debug << "Deployed install name" << info.deployedInstallName << "\n"; debug << "Source file Path" << info.sourceFilePath << "\n"; debug << "Deployed Directtory (relative to bundle)" << info.destinationDirectory << "\n"; return debug; } const QString bundleFrameworkDirectory = "Contents/Frameworks"; const QString bundleBinaryDirectory = "Contents/MacOS"; inline QDebug operator<<(QDebug debug, const ApplicationBundleInfo &info) { debug << "Application bundle path" << info.path << "\n"; debug << "Binary path" << info.binaryPath << "\n"; return debug; } bool copyFilePrintStatus(const QString &from, const QString &to) { if (QFile::copy(from, to)) { //qDebug() << "copied" << from << "to" << to; return true; } else { qDebug() << "ERROR: file copy failed from" << from << "to" << to; return false; } } FrameworkInfo parseOtoolLibraryLine(const QString &line) { FrameworkInfo info; QString trimmed = line.trimmed(); QString sysroot = getenv("SYSROOT"); if (trimmed.isEmpty()) return info; // Don't deploy system libraries. if (trimmed.startsWith("/System/Library/") || (trimmed.startsWith("/usr/lib/") && trimmed.contains("libQt") == false) // exception for libQtuitools and libQtlucene || trimmed.startsWith("@executable_path")) return info; enum State {QtPath, FrameworkName, DylibName, Version, End}; State state = QtPath; int part = 0; QString name; QString qtPath; // Split the line into [Qt-path]/lib/qt[Module].framework/Versions/[Version]/ QStringList parts = trimmed.split("/"); while (part < parts.count()) { const QString currentPart = parts.at(part).simplified() ; //qDebug() << "currentPart" << currentPart; ++part; if (currentPart == "") continue; if (state == QtPath) { // Check for library name part if (part < parts.count() && parts.at(part).contains(".dylib ")) { state = DylibName; info.installName += "/" + (qtPath + "lib/").simplified(); info.frameworkDirectory = info.installName; state = DylibName; continue; } else if (part < parts.count() && parts.at(part).endsWith(".framework")) { info.installName += "/" + (qtPath + "lib/").simplified(); info.frameworkDirectory = info.installName; state = FrameworkName; continue; } else if (trimmed.startsWith("/") == false) { // If the line does not contain a full path, the app is using a binary Qt package. if (currentPart.contains(".framework")) { info.frameworkDirectory = sysroot + "/Library/Frameworks/"; state = FrameworkName; } else { info.frameworkDirectory = "/usr/lib/"; state = DylibName; } --part; continue; } qtPath += (currentPart + "/"); } if (state == FrameworkName) { // remove ".framework" name = currentPart; name.chop(QString(".framework").length()); info.frameworkName = currentPart; state = Version; ++part; continue; } if (state == DylibName) { name = currentPart.split(" (compatibility").at(0); info.frameworkName = name; info.installName += info.frameworkName; info.deployedInstallName = "@executable_path/../Frameworks/" + info.frameworkName; info.binaryName = name; info.frameworkPath = info.frameworkDirectory + info.frameworkName; info.sourceFilePath = info.frameworkPath; info.destinationDirectory = bundleFrameworkDirectory + "/"; state = End; ++part; continue; } else if (state == Version) { info.version = currentPart; info.binaryDirectory = "Versions/" + info.version; info.binaryName = name; info.binaryPath = "/" + info.binaryDirectory + "/" + info.binaryName; info.installName += info.frameworkName + info.binaryPath; info.deployedInstallName = "@executable_path/../Frameworks/" + info.frameworkName + info.binaryPath; info.frameworkPath = info.frameworkDirectory + info.frameworkName; info.sourceFilePath = info.frameworkPath + info.binaryPath; info.destinationDirectory = bundleFrameworkDirectory + "/" + info.frameworkName + "/" + info.binaryDirectory; state = End; } else if (state == End) { break; } } return info; } QString findAppBinary(const QString &appBundlePath) { QString appName = QFileInfo(appBundlePath).completeBaseName(); QString binaryPath = appBundlePath + "/Contents/MacOS/" + appName; if (QFile::exists(binaryPath)) return binaryPath; qDebug() << "Error: Could not find bundle binary for" << appBundlePath; return QString(); } QList<FrameworkInfo> getQtFrameworks(const QStringList &otoolLines) { QList<FrameworkInfo> libraries; foreach(const QString line, otoolLines) { FrameworkInfo info = parseOtoolLibraryLine(line); if (info.frameworkName.isEmpty() == false) { libraries.append(info); } } return libraries; } QList<FrameworkInfo> getQtFrameworks(const QString &path) { QProcess otool; char *p = getenv("OTOOL"); otool.start(p ? p : "otool", QStringList() << "-L" << path); otool.waitForFinished(); if (otool.exitCode() != 0) { qDebug() << "OTOOLERROR " << otool.readAllStandardError(); } QString output = otool.readAllStandardOutput(); QStringList outputLines = output.split("\n"); outputLines.removeFirst(); // remove line containing the binary path if (path.contains(".framework") || path.contains(".dylib")) outputLines.removeFirst(); // frameworks and dylibs lists themselves as a dependency. return getQtFrameworks(outputLines); } // copies everything _inside_ sourcePath to destinationPath void recursiveCopy(const QString &sourcePath, const QString &destinationPath) { QDir().mkpath(destinationPath); QStringList files = QDir(sourcePath).entryList(QStringList() << "*", QDir::Files | QDir::NoDotAndDotDot); foreach (QString file, files) { const QString fileSourcePath = sourcePath + "/" + file; const QString fileDestinationPath = destinationPath + "/" + file; copyFilePrintStatus(fileSourcePath, fileDestinationPath); } QStringList subdirs = QDir(sourcePath).entryList(QStringList() << "*", QDir::Dirs | QDir::NoDotAndDotDot); foreach (QString dir, subdirs) { recursiveCopy(sourcePath + "/" + dir, destinationPath + "/" + dir); } } QString copyFramework(const FrameworkInfo &framework, const QString path) { const QString from = framework.sourceFilePath; const QString toDir = path + "/" + framework.destinationDirectory; const QString to = toDir + "/" + framework.binaryName; if (QFile::exists(from) == false) { //qDebug() << "ERROR: no file at" << from; return QString(); } QDir dir; if (dir.mkpath(toDir) == false) { qDebug() << "ERROR: could not create destination directory" << to; return QString(); } if (QFile::exists(to)) { //qDebug() << framework.frameworkName << "already deployed, skip"; return QString(); } copyFilePrintStatus(from, to); const QString resourcesSourcePath = framework.frameworkPath + "/Resources"; const QString resourcesDestianationPath = path + "/Contents/Frameworks/" + framework.frameworkName + "/Resources"; recursiveCopy(resourcesSourcePath, resourcesDestianationPath); return to; } void runInstallNameTool(QStringList options) { QProcess installNametool; char *p = getenv("NAME_TOOL"); installNametool.start(p ? p : "install_name_tool", options); installNametool.waitForFinished(); if (installNametool.exitCode() != 0) { qDebug() << installNametool.readAllStandardError(); qDebug() << installNametool.readAllStandardOutput(); } } void changeIdentification(const QString &id, const QString &binaryPath) { // qDebug() << "change identification on" << binaryPath << id; runInstallNameTool(QStringList() << "-id" << id << binaryPath); } void changeInstallName(const QString &oldName, const QString &newName, const QString &binaryPath) { // qDebug() << "change install name on" << binaryPath << oldName << newName; runInstallNameTool(QStringList() << "-change" << oldName << newName << binaryPath); } /* Deploys the the listed frameworks listed into an app bundle. The frameworks are searched for dependencies, which are also deployed. (deploying Qt3Support will also deploy QtNetwork and QtSql for example.) Returns a DeploymentInfo structure containing the Qt path used and a a list of actually deployed frameworks. */ DeploymentInfo deployQtFrameworks(QList<FrameworkInfo> frameworks, const QString &bundlePath, const QString &binaryPath) { QStringList copiedFrameworks; DeploymentInfo deploymenInfo; while (frameworks.isEmpty() == false) { const FrameworkInfo framework = frameworks.takeFirst(); copiedFrameworks.append(framework.frameworkName); // Get the qt path from one of the Qt frameworks; if (deploymenInfo.qtPath == QString() && framework.frameworkName.contains("Qt") && framework.frameworkDirectory.contains("/lib")) { deploymenInfo.qtPath = framework.frameworkDirectory; deploymenInfo.qtPath.chop(5); // remove "/lib/" } //qDebug() << "deploy" << framework.frameworkName; if (framework.installName.startsWith("/@executable_path/")) { //qDebug() << framework.frameworkName << "already deployed, skipping."; continue; } // Install_name_tool the new id into the binary changeInstallName(framework.installName, framework.deployedInstallName, binaryPath); // Copy farmework to app bundle. const QString deployedBinaryPath = copyFramework(framework, bundlePath); // Skip the rest if already was deployed. if (deployedBinaryPath == QString()) continue; // Install_name_tool it a new id. changeIdentification(framework.deployedInstallName, deployedBinaryPath); // Check for framework dependencies QList<FrameworkInfo> dependencies = getQtFrameworks(deployedBinaryPath); foreach (FrameworkInfo dependency, dependencies) { //qDebug() << "dependent framework" << dependency.installName << deployedBinaryPath; changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath); // Deploy framework if neccesary. if (copiedFrameworks.contains(dependency.frameworkName) == false && frameworks.contains(dependency) == false) { frameworks.append(dependency); } } } deploymenInfo.deployedFrameworks = copiedFrameworks; return deploymenInfo; } DeploymentInfo deployQtFrameworks(const QString &appBundlePath) { ApplicationBundleInfo applicationBundle; applicationBundle.path = appBundlePath; applicationBundle.binaryPath = findAppBinary(appBundlePath); return deployQtFrameworks(getQtFrameworks(applicationBundle.binaryPath), applicationBundle.path, applicationBundle.binaryPath); } void deployPlugins(const ApplicationBundleInfo &appBundleInfo, const QString &pluginSourcePath, const QString pluginDestinationPath, DeploymentInfo deploymentInfo) { QStringList plugins = QDir(pluginSourcePath).entryList(QStringList() << "*.dylib"); if (plugins.isEmpty() == false) { QDir dir; dir.mkpath(pluginDestinationPath); } foreach (QString pluginName, plugins) { // Skip some Qt plugins based on what frameworks were deployed: //qDebug() << pluginSourcePath << deploymentInfo.pluginPath; if (pluginSourcePath.contains(deploymentInfo.pluginPath)) { QStringList deployedFrameworks = deploymentInfo.deployedFrameworks; // Skip the debug versions of the plugins if (pluginName.endsWith("_debug.dylib")) continue; // Skip the designer plugins if (pluginSourcePath.contains("plugins/designer")) continue; // SKip the opengl graphicssystem if (pluginName.contains("graphicssystem")) continue; // Deploy accessibility for Qt3Support only if the Qt3Support.framework is in use if (deployedFrameworks.indexOf("Qt3Support.framework") == -1 && pluginName.contains("accessiblecompatwidgets")) continue; // Deploy the svg icon plugin if QtSVG.framework is in use. if (deployedFrameworks.indexOf("QtSVG.framework") == -1 && pluginName.contains("svg")) continue; // Deploy the phonon plugins if phonon.framework is in use if (deployedFrameworks.indexOf("phonon.framework") == -1 && pluginName.contains("phonon")) continue; // Deploy the sql plugins if QtSql.framework is in use if (deployedFrameworks.indexOf("QtSql.framework") == -1 && pluginName.contains("sql")) continue; // Deploy the script plugins if QtScript.framework is in use if (deployedFrameworks.indexOf("QtScript.framework") == -1 && pluginName.contains("script")) continue; } const QString sourcePath = pluginSourcePath + "/" + pluginName; const QString destinationPath = pluginDestinationPath + "/" + pluginName; if (copyFilePrintStatus(sourcePath, destinationPath)) { // Special case for the phonon plugin: CoreVideo is not available as a separate framework // on panther, link against the QuartzCore framework instead. (QuartzCore contians CoreVideo.) if (pluginName.contains("libphonon_qt7")) { changeInstallName("/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo", "/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore", destinationPath); } //qDebug() << "deploy plugin depedencies:"; QList<FrameworkInfo> frameworks = getQtFrameworks(destinationPath); //qDebug() << frameworks; deployQtFrameworks(frameworks, appBundleInfo.path, destinationPath); //qDebug() << "deploy plugin depedencies done"; } } // foreach plugins QStringList subdirs = QDir(pluginSourcePath).entryList(QStringList() << "*", QDir::Dirs | QDir::NoDotAndDotDot); foreach (const QString &subdir, subdirs) deployPlugins(appBundleInfo, pluginSourcePath + "/" + subdir, pluginDestinationPath + "/" + subdir, deploymentInfo); } void createQtConf(const QString &appBundlePath) { QByteArray contents = "[Paths]\nPlugins = plugins\n"; QString filePath = appBundlePath + "/Contents/Resources/"; QString fileName = filePath + "qt.conf"; QDir().mkpath(filePath); QFile qtconf(fileName); if (qtconf.exists()) { qDebug() << ""; qDebug() << "Warning:" << fileName << "already exists, will not overwrite."; qDebug() << "To make sure the plugins are loaded from the correct location,"; qDebug() << "please make sure qt.conf contains the following lines:"; qDebug() << contents; qDebug() << ""; return; } qtconf.open(QIODevice::WriteOnly); if (qtconf.write(contents) != -1) { qDebug() << ""; qDebug() << "Created configuration file:" << fileName; qDebug() << "This file sets the plugin search path to" << appBundlePath + "/Contents/plugins"; qDebug() << ""; } } void deployPlugins(const QString &appBundlePath, DeploymentInfo deploymentInfo) { ApplicationBundleInfo applicationBundle; applicationBundle.path = appBundlePath; applicationBundle.binaryPath = findAppBinary(appBundlePath); const QString pluginDestinationPath = appBundlePath + "/" + "Contents/plugins"; //qDebug() << ""; //qDebug() << "recursively copying plugins from" << deploymentInfo.pluginPath << "to" << pluginDestinationPath; deployPlugins(applicationBundle, deploymentInfo.pluginPath, pluginDestinationPath, deploymentInfo); } void changeQtFrameworks(const QList<FrameworkInfo> frameworks, const QString &appBinaryPath, const QString &absoluteQtPath) { //qDebug() << "Changing" << appBinaryPath << "to link against Qt in" << absoluteQtPath; QString finalQtPath = absoluteQtPath; if (absoluteQtPath.startsWith("/Library/Frameworks") == false) finalQtPath += "/lib/"; foreach (FrameworkInfo framework, frameworks) { const QString oldBinaryId = framework.installName; const QString newBinaryId = finalQtPath + framework.frameworkName + framework.binaryPath; //qDebug() << "Changing" << oldBinaryId << "to" << newBinaryId; changeInstallName(oldBinaryId, newBinaryId, appBinaryPath); } } void changeQtFrameworks(const QString appPath, const QString &qtPath) { const QString appBinaryPath = findAppBinary(appPath); const QList<FrameworkInfo> qtFrameworks = getQtFrameworks(appBinaryPath); const QString absoluteQtPath = QDir(qtPath).absolutePath(); changeQtFrameworks(qtFrameworks, appBinaryPath, absoluteQtPath); } void createDiskImage(const QString &appBundlePath) { QString appBaseName = appBundlePath; appBaseName.chop(4); // remove ".app" from end QString dmgName = appBaseName + ".dmg"; QFile dmg(dmgName); dmg.remove(); // More dmg options can be found in the hdiutil man page. QString options = QString("create %1.dmg -srcfolder %1.app -format UDZO -volname %1").arg(appBaseName); QProcess hdutil; hdutil.start("hdiutil", options.split(' ')); hdutil.waitForFinished(-1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/macdeployqt/shared.h����������������������������������������������������������������������0000664�0000000�0000000�00000005620�11753427512�0016333�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**************************************************************************** ** ** Copyright (C) 2007 Trolltech ASA. All rights reserved. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef MAC_DEPLOMYMENT_SHARED_H #define MAC_DEPLOMYMENT_SHARED_H #include <QString> #include <QStringList> #include <QDebug> class FrameworkInfo { public: QString frameworkDirectory; QString frameworkName; QString frameworkPath; QString binaryDirectory; QString binaryName; QString binaryPath; QString version; QString installName; QString deployedInstallName; QString sourceFilePath; QString destinationDirectory; }; bool operator==(const FrameworkInfo &a, const FrameworkInfo &b); QDebug operator<<(QDebug debug, const FrameworkInfo &info); class ApplicationBundleInfo { public: QString path; QString binaryPath; }; class DeploymentInfo { public: QString qtPath; QString pluginPath; QStringList deployedFrameworks; }; inline QDebug operator<<(QDebug debug, const ApplicationBundleInfo &info); void changeQtFrameworks(const QString appPath, const QString &qtPath); void changeQtFrameworks(const QList<FrameworkInfo> frameworks, const QString &appBinaryPath, const QString &qtPath); FrameworkInfo parseOtoolLibraryLine(const QString &line); QString findAppBinary(const QString &appBundlePath); QList<FrameworkInfo> getQtFrameworks(const QString &path); QList<FrameworkInfo> getQtFrameworks(const QStringList &otoolLines); QString copyFramework(const FrameworkInfo &framework, const QString path); DeploymentInfo deployQtFrameworks(const QString &appBundlePath); DeploymentInfo deployQtFrameworks(QList<FrameworkInfo> frameworks, const QString &bundlePath, const QString &binaryPath); void createQtConf(const QString &appBundlePath); void deployPlugins(const QString &appBundlePath, DeploymentInfo deploymentInfo); void changeIdentification(const QString &id, const QString &binaryPath); void changeInstallName(const QString &oldName, const QString &newName, const QString &binaryPath); QString findAppBinary(const QString &appBundlePath); void createDiskImage(const QString &appBundlePath); #endif ����������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/�������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11753427512�0013322�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/CA.xca�������������������������������������������������������������������������������0000664�0000000�0000000�00000000104�11753427512�0014275�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������<�������������� ������`����p���xca certificate�������0������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/HTTPS_client.xca���������������������������������������������������������������������0000664�0000000�0000000�00000000104�11753427512�0016252�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������<�������������m������� �������xca certificate�������0������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/HTTPS_server.xca���������������������������������������������������������������������0000664�0000000�0000000�00000000104�11753427512�0016302�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������<�������������m��������������xca certificate�������0������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/Info.plist���������������������������������������������������������������������������0000664�0000000�0000000�00000002773�11753427512�0015303�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleExecutable</key> <string>xca</string> <key>CFBundleGetInfoString</key> <string>Created by Qt/QMake</string> <key>CFBundleIconFile</key> <string>xca-mac-icon.icns</string> <key>CFBundleIdentifier</key> <string>de.hohnstaedt.xca</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleSignature</key> <string>cxca</string> <key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeExtensions</key> <array> <string>xdb</string> </array> <key>CFBundleTypeIconFile</key> <string>xca-mac-icon.icns</string> <key>CFBundleTypeMIMETypes</key> <array> <string>application/x-xca-database</string> </array> <key>CFBundleTypeName</key> <string>XCA Database</string> <key>CFBundleTypeRole</key> <string>Editor</string> <key>LSIsAppleDefaultForType</key> <true/> </dict> <dict> <key>CFBundleTypeExtensions</key> <array> <string>xca</string> </array> <key>CFBundleTypeIconFile</key> <string>xca-mac-icon.icns</string> <key>CFBundleTypeMIMETypes</key> <array> <string>application/x-xca-template</string> </array> <key>CFBundleTypeName</key> <string>XCA Template</string> <key>CFBundleTypeRole</key> <string>Editor</string> <key>LSIsAppleDefaultForType</key> <true/> </dict> </array> </dict> </plist> �����xca_0.9.3/misc/Makefile�����������������������������������������������������������������������������0000664�0000000�0000000�00000001332�11753427512�0014761�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ SRCPATH=$(VPATH)/ all: include $(TOPDIR)/Rules.mak install: install -m 755 -d $(destdir)$(prefix)/share/xca/ \ $(destdir)$(prefix)/share/applications \ $(destdir)$(prefix)/share/mime/packages install -m 644 $(SRCPATH)*.txt $(SRCPATH)*.xca \ $(destdir)$(prefix)/share/xca install -m 644 $(SRCPATH)xca.desktop $(destdir)$(prefix)/share/applications install -m 644 $(SRCPATH)xca.xml $(destdir)$(prefix)/share/mime/packages if test -z "$(destdir)"; then \ update-mime-database $(prefix)/share/mime || :; \ update-desktop-database || :; \ fi app: mkdir -p $(APPDIR)/Resources install -m 644 $(SRCPATH)Info.plist $(SRCPATH)PkgInfo $(APPDIR) install -m 644 $(SRCPATH)*.txt $(SRCPATH)*.xca $(APPDIR)/Resources ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/PkgInfo������������������������������������������������������������������������������0000664�0000000�0000000�00000000011�11753427512�0014572�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������APPLcxca �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/aia.txt������������������������������������������������������������������������������0000664�0000000�0000000�00000000132�11753427512�0014611�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Do not edit this file, rather use /etc/xca/aia.txt or $HOME/.xca/aia.txt OCSP caIssuers ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/build-mac.sh�������������������������������������������������������������������������0000775�0000000�0000000�00000001656�11753427512�0015526�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh -e do_openssl() { openssl="openssl-1.0.1c" test -f "$openssl".tar.gz || curl http://openssl.org/source/"$openssl".tar.gz > "$openssl".tar.gz tar zxf "$openssl".tar.gz (cd $openssl #./Configure darwin64-x86_64-cc shared --prefix=$OPENSSLINSTALLDIR ./config shared --prefix=$OPENSSLINSTALLDIR make && make install ) chmod 755 $OPENSSLINSTALLDIR/lib/*.dylib } # define the installation dir and the path to the new library # it will be installed locally in the home directory export OPENSSLINSTALLDIR=$HOME/instopenssl export DYLD_LIBRARY_PATH=$OPENSSLINSTALLDIR/lib #export QTDIR=$HOME/QtSDK/Desktop/Qt/4.8.1/gcc XCA_DIR="`dirname $0`" XCA_DIR="`cd $XCA_DIR/.. && pwd`" doc=$XCA_DIR/doc/xca-doc.tgz test -f $doc || curl http://git.hohnstaedt.de/xca-doc.tgz > $doc do_openssl # configure XCA and build the DMG file rm -rf xca-macbuild mkdir xca-macbuild cd xca-macbuild $XCA_DIR/configure $OPENSSLINSTALLDIR make -j5 xca.dmg ����������������������������������������������������������������������������������xca_0.9.3/misc/build-w32.sh�������������������������������������������������������������������������0000775�0000000�0000000�00000002512�11753427512�0015371�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh -e XCA_DIR="`dirname $0`" XCA_DIR="`cd $XCA_DIR/.. && pwd`" XCA_BUILD="`pwd`"/xca_build LIBTOOL_DIR="libtool-2.2.6b" LIBTOOL_GZ="${LIBTOOL_DIR}".tar.gz LIBTOOL_DL="http://ftp.gnu.org/gnu/libtool/${LIBTOOL_GZ}" OPENSSL_DIR="openssl-1.0.1c" OPENSSL_GZ="${OPENSSL_DIR}".tar.gz OPENSSL_DL="http://openssl.org/source/${OPENSSL_GZ}" OPENSSL_PATCH="$XCA_DIR/misc/openssl-1.0.0-mingw32-cross.patch" unpack() { eval "dir=\${$1_DIR} gz=\${$1_GZ} dl=\${$1_DL} PATCH=\${$1_PATCH}" test -f "$gz" || curl "$dl" -o "$gz" echo "Building '$dir'" rm -rf "$dir" tar -zxf "$gz" cd "$dir" if test -f "$PATCH"; then patch -p1 < "$PATCH" test ! -x bootstrap || ./bootstrap fi } do_openssl() {( unpack OPENSSL sh ms/mingw32-cross.sh )} do_libtool() {( unpack LIBTOOL ./configure --host i586-mingw32msvc --prefix ${INSTALL_DIR} make && make install )} do_XCA() {( mkdir -p $XCA_BUILD cd $XCA_BUILD $XCA_DIR/configure.w32 make -j5 USE_HOSTTOOLS=no )} if ! test -f db_dump.exe; then if ! curl "http://git.hohnstaedt.de/db_dump.exe" -o "db_dump.exe"; then echo db_dump.exe missing exit 1 fi fi if ! test -f mingwm10.dll; then if ! zcat /usr/share/doc/mingw32-runtime/mingwm10.dll.gz >mingwm10.dll; then echo missing mingwm10.dll exit 1 fi fi export INSTALL_DIR=`pwd`/install do_openssl do_libtool do_XCA ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/delspace.sh��������������������������������������������������������������������������0000775�0000000�0000000�00000000153�11753427512�0015440�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh for i in $@; do cp "$i" /tmp/x cat /tmp/x |sed 's/[ \t]*$//' |sed 's/ *\t/\t/' > "$i" done ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/dn.txt�������������������������������������������������������������������������������0000664�0000000�0000000�00000000343�11753427512�0014464�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Do not edit this file, rather use /etc/xca/dn.txt or $HOME/.xca/dn.txt C ST L O OU CN emailAddress SN title description name givenName initials dnQualifier role generationQualifier x500UniqueIdentifier pseudonym serialNumber ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/eku.txt������������������������������������������������������������������������������0000664�0000000�0000000�00000000466�11753427512�0014655�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Do not edit this file, rather use /etc/xca/eku.txt or $HOME/.xca/eku.txt serverAuth clientAuth codeSigning emailProtection timeStamping msCodeInd msCodeCom msCTLSign msSGC msEFS nsSGC msEFSFR ipsecEndSystem ipsecTunnel ipsecUser iKEIntermediate msSmartcardLogin OCSPSigning id-kp-eapOverPPP id-kp-eapOverLAN ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/oids.txt�����������������������������������������������������������������������������0000664�0000000�0000000�00000001602�11753427512�0015020�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Do not edit this file, add your own OIDs in /etc/xca/oids.txt # or $HOME/.xca # OID short name long name 1.3.6.1.4.1.311.20.2: dom: Domain Controller 1.3.6.1.4.1.311.21.1: MsCaV: Microsoft CA Version 1.3.6.1.4.1.311.20.2.3: msUPN: Microsoft Universal Principal Name 1.3.6.1.4.1.311.10.3.4.1:msEFSFR: Microsoft EFS File Recovery 1.3.6.1.5.5.8.2.2: iKEIntermediate: IP security end entity 1.3.6.1.5.5.7.3.1: serverAuth: Microsoft Server 1.3.6.1.5.5.7.3.2: clientAuth: Microsoft Client 1.3.6.1.4.1.311.20.2.2: msSmartcardLogin: Smart Card Logon 2.5.4.44: generationQualifier: generation Qualifier 2.5.4.45: x500UniqueIdentifier: x500 Unique Identifier 2.5.4.65: pseudonym: pseudonym 0.2.262.1.10.7.20: nameDistinguisher: Name distinguisher # RFC 4334 1.3.6.1.5.5.7.3.13: id-kp-eapOverPPP: EAP over PPP 1.3.6.1.5.5.7.3.14: id-kp-eapOverLAN: EAP over Lan ������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/openssl-0.9.8-mingw32-cross.patch����������������������������������������������������0000664�0000000�0000000�00000013374�11753427512�0021123�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������diff -Nur openssl-0.9.8e.orig/crypto/pqueue/pqueue.c openssl-0.9.8e/crypto/pqueue/pqueue.c --- openssl-0.9.8e.orig/crypto/pqueue/pqueue.c 2005-06-28 14:53:33.000000000 +0200 +++ openssl-0.9.8e/crypto/pqueue/pqueue.c 2007-04-05 10:31:26.000000000 +0200 @@ -199,10 +199,10 @@ return found; } -#if PQ_64BIT_IS_INTEGER void pqueue_print(pqueue_s *pq) { +#if PQ_64BIT_IS_INTEGER pitem *item = pq->items; while(item != NULL) @@ -210,8 +210,8 @@ printf("item\t" PQ_64BIT_PRINT "\n", item->priority); item = item->next; } - } #endif + } pitem * pqueue_iterator(pqueue_s *pq) diff -Nur openssl-0.9.8e.orig/ms/mingw32-cross.sh openssl-0.9.8e/ms/mingw32-cross.sh --- openssl-0.9.8e.orig/ms/mingw32-cross.sh 1970-01-01 01:00:00.000000000 +0100 +++ openssl-0.9.8e/ms/mingw32-cross.sh 2009-11-05 10:07:58.000000000 +0100 @@ -0,0 +1,45 @@ +#!/bin/sh +# Mingw32 on Linux + GNU as +# --------------------------- + +CROSS=i586-mingw32msvc- + +sh Configure mingw $@ + +if echo $@ | grep 'no-asm' >/dev/null 2>&1; then + echo No assembler will be used +else + echo Generating x86 for GNU assember + for name in `find -name "*586.pl"` ./crypto/x86cpuid.pl; do + n=`basename $name` + t=`echo $n | sed 's/\.pl/-win32.s/'` + echo Creating $t from $n + (cd `dirname $name` && perl $n gaswin > $t ) + done +fi + +echo Generating makefile +perl util/mkfiles.pl >MINFO +perl util/mk1mf.pl gaswin $@ Mingw32-cross >ms/mingw32-cross.mak + +echo Generating DLL definition files +perl util/mkdef.pl 32 libeay >ms/libeay32.def +perl util/mkdef.pl 32 ssleay >ms/ssleay32.def + +echo Building the libraries +make -f ms/mingw32-cross.mak CROSS=${CROSS} + +echo Generating the DLLs and input libraries +${CROSS}dllwrap --dllname libeay32.dll --output-lib out/libeay32.a --def ms/libeay32.def out/libcrypto.a -lwsock32 -lgdi32 + +${CROSS}dllwrap --dllname libssl32.dll --output-lib out/libssl32.a --def ms/ssleay32.def out/libssl.a out/libeay32.a + +if test -n "${INSTALL_DIR}"; then + mkdir -p ${INSTALL_DIR}/bin ${INSTALL_DIR}/lib ${INSTALL_DIR}/include + cp -r outinc/openssl ${INSTALL_DIR}/include + cp *.dll ${INSTALL_DIR}/bin + cp out/*.a ${INSTALL_DIR}/lib +fi + +echo Done compiling OpenSSL + diff -Nur openssl-0.9.8e.orig/util/mk1mf.pl openssl-0.9.8e/util/mk1mf.pl --- openssl-0.9.8e.orig/util/mk1mf.pl 2006-11-30 14:04:43.000000000 +0100 +++ openssl-0.9.8e/util/mk1mf.pl 2007-04-05 10:30:27.000000000 +0200 @@ -35,6 +35,7 @@ "VC-CE", "Microsoft eMbedded Visual C++ 3.0 - Windows CE ONLY", "VC-NT", "Microsoft Visual C++ [4-6] - Windows NT ONLY", "Mingw32", "GNU C++ - Windows NT or 9x", + "Mingw32-cross", "GNU C++ Linux cross compiling", "Mingw32-files", "Create files with DOS copy ...", "BC-NT", "Borland C++ 4.5 - Windows NT", "linux-elf","Linux elf", @@ -141,6 +142,10 @@ { require 'Mingw32.pl'; } +elsif ($platform eq "Mingw32-cross") + { + require 'Mingw32-cross.pl'; + } elsif ($platform eq "Mingw32-files") { require 'Mingw32f.pl'; diff -Nur openssl-0.9.8e.orig/util/pl/Mingw32-cross.pl openssl-0.9.8e/util/pl/Mingw32-cross.pl --- openssl-0.9.8e.orig/util/pl/Mingw32-cross.pl 1970-01-01 01:00:00.000000000 +0100 +++ openssl-0.9.8e/util/pl/Mingw32-cross.pl 2007-04-05 10:30:27.000000000 +0200 @@ -0,0 +1,95 @@ +#!/usr/local/bin/perl +# +# Mingw32.pl -- Mingw +# + +$o='/'; +$cp='cp'; +$rm='rm -f'; +$mkdir='mkdir -p'; + +# C compiler stuff + +$cc='$(CROSS)gcc'; +if ($debug) + { $cflags="-DL_ENDIAN -DDSO_WIN32 -g2 -ggdb -DCURSOR_SHOWING=1"; } +else + { $cflags="-DL_ENDIAN -DDSO_WIN32 -fomit-frame-pointer -O3 -march=i586 -Wall -DCURSOR_SHOWING=1 -DOPENSSL_BN_ASM_PART_WORDS"; } + +if ($gaswin and !$no_asm) + { + $bn_asm_obj='$(OBJ_D)//bn-586-win32.o'; + $bn_asm_src='crypto/bn/asm/bn-586-win32.s'; + $bnco_asm_obj='$(OBJ_D)/co-586-win32.o'; + $bnco_asm_src='crypto/bn/asm/co-586-win32.s'; + $des_enc_obj='$(OBJ_D)/crypt586-win32.o $(OBJ_D)/des-586-win32.o'; + $des_enc_src='crypto/des/asm/crypt586-win32.s crypto/des/asm/des-586-win32.s'; + $bf_enc_obj='$(OBJ_D)/bf-586-win32.o'; + $bf_enc_src='crypto/bf/asm/bf-586-win32.s'; +# $cast_enc_obj='$(OBJ_D)/cast-586-win32.o'; +# $cast_enc_src='crypto/cast/asm/cast-586-win32.s'; + $rc4_enc_obj='$(OBJ_D)/rc4-586-win32.o'; + $rc4_enc_src='crypto/rc4/asm/rc4-586-win32.s'; + $rc5_enc_obj='$(OBJ_D)/rc5-586-win32.o'; + $rc5_enc_src='crypto/rc5/asm/rc5-586-win32.s'; + $md5_asm_obj='$(OBJ_D)/md5-586-win32.o'; + $md5_asm_src='crypto/md5/asm/md5-586-win32.s'; + $rmd160_asm_obj='$(OBJ_D)/rmd-586-win32.o'; + $rmd160_asm_src='crypto/ripemd/asm/rmd-586-win32.s'; + $sha1_asm_obj='$(OBJ_D)/sha1-586-win32.o'; + $sha1_asm_src='crypto/sha/asm/sha1-586-win32.s'; + $cpuid_asm_obj='$(OBJ_D)\x86cpuid-win32.o'; + $cpuid_asm_src='crypto/x86cpuid-win32.s'; + $cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM"; + } + + +$obj='.o'; +$ofile='-o '; + +# EXE linking stuff +$link='${CC}'; +$lflags='${CFLAGS}'; +$efile='-o '; +$exep='.exe'; +$ex_libs="-lwsock32 -lgdi32"; + +# static library stuff +$mklib='$(CROSS)ar r'; +$mlflags=''; +$ranlib='$(CROSS)ranlib'; +$plib='lib'; +$libp=".a"; +$shlibp=".a"; +$lfile=''; + +$asm='$(CROSS)as'; +$afile='-o '; + +sub do_lib_rule + { + local($obj,$target,$name,$shlib)=@_; + local($ret,$_,$Name); + + $target =~ s/\//$o/g if $o ne '/'; + $target="$target"; + ($Name=$name) =~ tr/a-z/A-Z/; + + $ret.="$target: \$(${Name}OBJ)\n"; + $ret.="\trm -f $target\n"; + $ret.="\t\$(MKLIB) $target \$(${Name}OBJ)\n"; + $ret.="\t\$(RANLIB) $target\n\n"; + } + +sub do_link_rule + { + local($target,$files,$dep_libs,$libs)=@_; + local($ret,$_); + + $file =~ s/\//$o/g if $o ne '/'; + $n=&bname($target); + $ret.="$target: $files $dep_libs\n"; + $ret.="\t\$(LINK) ${efile}$target \$(LFLAGS) $files $libs\n\n"; + return($ret); + } +1; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/openssl-1.0.0-mingw32-cross.patch����������������������������������������������������0000664�0000000�0000000�00000006656�11753427512�0021110�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- openssl-1.0.0.orig/ms/mingw32-cross.sh 1970-01-01 01:00:00.000000000 +0100 +++ openssl-1.0.0/ms/mingw32-cross.sh 2010-04-10 10:22:33.000000000 +0200 @@ -0,0 +1,37 @@ +#!/bin/sh +# Mingw32 on Linux + GNU as +# --------------------------- + +set -e + +CROSS=i586-mingw32msvc- + +sh ./Configure mingw $@ + +echo Generating makefile +perl util/mkfiles.pl >MINFO +perl util/mk1mf.pl gaswin $@ Mingw32-cross >ms/mingw32-cross.mak + +echo Generating DLL definition files +perl util/mkdef.pl 32 libeay >ms/libeay32.def +perl util/mkdef.pl 32 ssleay >ms/ssleay32.def + +echo Building the libraries +make -f ms/mingw32-cross.mak CROSS=${CROSS} + +echo Generating the DLLs and input libraries +${CROSS}dllwrap --dllname libeay32.dll --output-lib out/libeay32.a --def ms/libeay32.def out/libcrypto.a -lwsock32 -lgdi32 + +${CROSS}dllwrap --dllname libssl32.dll --output-lib out/libssl32.a --def ms/ssleay32.def out/libssl.a out/libeay32.a + +echo "Done compiling OpenSSL" + +if test -n "${INSTALL_DIR}"; then + echo "Installing OpenSSL to '${INSTALL_DIR}'" + mkdir -p ${INSTALL_DIR}/bin ${INSTALL_DIR}/lib ${INSTALL_DIR}/include + cp -r outinc/openssl ${INSTALL_DIR}/include + cp *.dll ${INSTALL_DIR}/bin + cp out/*.a ${INSTALL_DIR}/lib +fi + + --- openssl-1.0.0.orig/util/mk1mf.pl 2009-09-20 14:47:04.000000000 +0200 +++ openssl-1.0.0/util/mk1mf.pl 2010-04-10 09:28:56.000000000 +0200 @@ -67,6 +67,7 @@ "VC-CE", "Microsoft eMbedded Visual C++ 3.0 - Windows CE ONLY", "VC-NT", "Microsoft Visual C++ [4-6] - Windows NT ONLY", "Mingw32", "GNU C++ - Windows NT or 9x", + "Mingw32-cross", "GNU C++ Linux cross compiling", "Mingw32-files", "Create files with DOS copy ...", "BC-NT", "Borland C++ 4.5 - Windows NT", "linux-elf","Linux elf", @@ -181,6 +182,10 @@ { require 'Mingw32.pl'; } +elsif ($platform eq "Mingw32-cross") + { + require 'Mingw32-cross.pl'; + } elsif ($platform eq "Mingw32-files") { require 'Mingw32f.pl'; --- openssl-1.0.0.orig/util/pl/Mingw32-cross.pl 1970-01-01 01:00:00.000000000 +0100 +++ openssl-1.0.0/util/pl/Mingw32-cross.pl 2010-04-10 10:24:35.000000000 +0200 @@ -0,0 +1,74 @@ +#!/usr/local/bin/perl +# +# Mingw32.pl -- Mingw +# + +$o='/'; +$cp='cp'; +$rm='rm -f'; +$mkdir='mkdir -p'; + +# C compiler stuff + +$asmtype="gaswin"; + +$cc='$(CROSS)gcc'; +if ($debug) + { $cflags="-DL_ENDIAN -DDSO_WIN32 -g2 -ggdb"; } +else + { $cflags="-DL_ENDIAN -DDSO_WIN32 -fomit-frame-pointer -O3 -march=i686 -Wall"; } + +if ($gaswin and !$no_asm) + { $cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM -DOPENSSL_BN_ASM_PART_WORDS"; } + + +$obj='.o'; +$ofile='-o '; + +# EXE linking stuff +$link='${CC}'; +$lflags='${CFLAGS}'; +$efile='-o '; +$exep='.exe'; +$ex_libs="-lwsock32 -lgdi32"; + +# static library stuff +$mklib='$(CROSS)ar r'; +$mlflags=''; +$ranlib='$(CROSS)ranlib'; +$plib='lib'; +$libp=".a"; +$shlibp=".a"; +$lfile=''; + +$asm='$(CROSS)as'; +$afile='-o '; + + +sub do_lib_rule + { + local($obj,$target,$name,$shlib)=@_; + local($ret,$_,$Name); + + $target =~ s/\//$o/g if $o ne '/'; + $target="$target"; + ($Name=$name) =~ tr/a-z/A-Z/; + + $ret.="$target: \$(${Name}OBJ)\n"; + $ret.="\trm -f $target\n"; + $ret.="\t\$(MKLIB) $target \$(${Name}OBJ)\n"; + $ret.="\t\$(RANLIB) $target\n\n"; + } + +sub do_link_rule + { + local($target,$files,$dep_libs,$libs)=@_; + local($ret,$_); + + $file =~ s/\//$o/g if $o ne '/'; + $n=&bname($target); + $ret.="$target: $files $dep_libs\n"; + $ret.="\t\$(LINK) ${efile}$target \$(LFLAGS) $files $libs\n\n"; + return($ret); + } +1; ����������������������������������������������������������������������������������xca_0.9.3/misc/release.txt��������������������������������������������������������������������������0000664�0000000�0000000�00000001416�11753427512�0015505�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Release schedule cheat sheet - Test, test, test - Test again - Check - ign_openssl_error() - for TRACE - xca.nsi -> lzma - update translation and xca.pro (qmake-qt4 -o makefile && make) - update VERSION and changelog.txt and .pad files - git tag -a RELEASE.${VERSION} - make TVERSION=${VERSION} dist - try to compile xca-${VERSION}.tar.gz (again) - build windows setup.exe - (create releasenotes.txt) - git push git.hohnstaedt.de; git push sf.net; git push github - upload to sf.net: setup.exe xca.tar.gz changelog.txt releasenotes.txt - update xca.hohnstaedt.de: o md5sums o Current version o changelog scp changelog git.hohnstaedt.de:/var/cache/git/projects/changelog.txt - write release-mail to xca mailinglist - update info on freshmeat.net, heise.de ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/xca.desktop��������������������������������������������������������������������������0000664�0000000�0000000�00000001145�11753427512�0015471�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Desktop Entry] Encoding=UTF-8 Name=XCA Type=Application Comment=A graphical user interface for handling and issuing X.509 compliant Certificates Comment[de]=Eine graphische Oberfläche zur Erstellung von X.509 konformen Zertifikaten Comment[fi]=Graafinen X.509-varmenteiden hallintatyökalu Comment[fr]=Création et gestion de certificats conformes à la norme X.509 Exec=xca %F Icon=xca-32x32.xpm Terminal=false Categories=Application;Utility;Qt; MimeType=application/x-xca-database;application/x-xca-template;application/x-x509-ca-cert;application/pkcs10;application/x-pkcs7-certificates;application/x-pkcs12; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/xca.nsi������������������������������������������������������������������������������0000775�0000000�0000000�00000024630�11753427512�0014620�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ; This is the .nsi script for creating the nullsoft windows installer ; The name of the installer Name "XCA" Caption "XCA ${VERSION} Setup" OutFile "setup_xca-${VERSION}.exe" InstallDir $PROGRAMFILES\xca ; Registry key to check for directory (so if you install again, it will ; overwrite the old one automatically) InstallDirRegKey HKLM SOFTWARE\xca "Install_Dir" SetCompressor /SOLID lzma ;----------------------------------- !include "MUI.nsh" !define MUI_ABORTWARNING !define MUI_FINISHPAGE_TEXT $(DESC_donation) !define MUI_FINISHPAGE_NOREBOOTSUPPORT !define MUI_FINISHPAGE_RUN "$INSTDIR\xca.exe" ;----------------------------------- ; Pagelist !insertmacro MUI_PAGE_LICENSE "${TOPDIR}/COPYRIGHT" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_RESERVEFILE_LANGDLL !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "German" ;----------------------------------- ; The stuff to install Section "xca (required)" SecMain ClearErrors UserInfo::GetName IfErrors Win9x UserInfo::GetAccountType Pop $0 StrCmp $0 "Admin" 0 Win9x SetShellVarContext all Goto done Win9x: SetShellVarContext current done: ; Set output path to the installation directory. SetOutPath $INSTDIR ; Put files there File "xca.exe" File "${TOPDIR}/misc\dn.txt" File "${TOPDIR}/misc\eku.txt" File "${TOPDIR}/misc\oids.txt" File "${TOPDIR}/misc\aia.txt" File "${TOPDIR}/misc\*.xca" File "doc\*.html" File "${BDIR}\mingwm10.dll" File "${QTDIR}\bin\QtGui4.dll" File "${QTDIR}\bin\QtCore4.dll" File /nonfatal "${QTDIR}\bin\libgcc_s_dw2-1.dll" File "${INSTALLDIR}\bin\libltdl-7.dll" File "${INSTALLDIR}\bin\libeay32.dll" ; delete unneeded engine Delete "$INSTDIR\libp11-1.dll" Delete "$INSTDIR\engine_pkcs11.dll" ; remove old images ; Write the installation path into the registry WriteRegStr HKLM SOFTWARE\xca "Install_Dir" "$INSTDIR" ; Write the uninstall keys for Windows WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "DisplayName" "XCA (remove only)" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteUninstaller "uninstall.exe" SectionEnd ;---------------------------------------- Section "Start Menu Shortcuts" SecShortcut CreateDirectory "$SMPROGRAMS\xca" CreateShortCut "$SMPROGRAMS\xca\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 CreateShortCut "$SMPROGRAMS\xca\xca.lnk" "$INSTDIR\xca.exe" "" "$INSTDIR\xca.exe" 0 SectionEnd ;---------------------------------------- Function dump_old_db FindFirst $0 $1 $2\*.db loop: StrCmp $1 "" done Exec '"$INSTDIR\db_dump.exe" -f "$2\$1.dump" "$2\$1"' MessageBox MB_OK "Dumping $2\$1 to $2\$1.dump" FindNext $0 $1 Goto loop done: FunctionEnd Section "Update" SecUpdate SetOutPath $INSTDIR File "${BDIR}\db_dump.exe" SetShellVarContext current StrCpy $2 "$APPDATA\xca" Call dump_old_db SetShellVarContext all StrCpy $2 "$APPDATA\xca" Call dump_old_db StrCpy $2 "$INSTDIR" Call dump_old_db SectionEnd Section "Translations" SecTrans File /nonfatal "lang\*.qm" File /nonfatal "${QTDIR}\translations\qt_de.qm" File /nonfatal "${QTDIR}\translations\qt_es.qm" File /nonfatal "${QTDIR}\translations\qt_ru.qm" File /nonfatal "${QTDIR}\translations\qt_fr.qm" SectionEnd ;---------------------------------------- Section "File association" SecFiles ReadRegStr $1 HKCR ".xdb" "" StrCmp $1 "" NoBackup1 StrCmp $1 "xca_db" NoBackup1 WriteRegStr HKCR ".xdb" "backup_val" $1 NoBackup1: WriteRegStr HKCR ".xdb" "" "xca_db" ReadRegStr $0 HKCR "xca_db" "" StrCmp $0 "" 0 Skip1 WriteRegStr HKCR "xca_db" "" "XCA database" WriteRegStr HKCR "xca_db\shell" "" "open" WriteRegStr HKCR "xca_db\DefaultIcon" "" "$INSTDIR\xca.exe,1" WriteRegStr HKCR "xca_db\shell\open\command" "" '$INSTDIR\xca.exe -d "%1"' Skip1: ReadRegStr $1 HKCR ".xca" "" StrCmp $1 "" NoBackup2 StrCmp $1 "xca_template" NoBackup2 WriteRegStr HKCR ".xca" "backup_val" $1 NoBackup2: WriteRegStr HKCR ".xca" "" "xca_template" ReadRegStr $0 HKCR "xca_template" "" StrCmp $0 "" 0 Skip2 WriteRegStr HKCR "xca_template" "" "XCA Template" WriteRegStr HKCR "xca_template\shell" "" "open" WriteRegStr HKCR "xca_template\DefaultIcon" "" "$INSTDIR\xca.exe,2" WriteRegStr HKCR "xca_template\shell\open\command" "" '$INSTDIR\xca.exe -t "%1"' Skip2: ReadRegStr $1 HKCR ".pem" "" StrCmp $1 "" NoBackup3 StrCmp $1 "pem_file" NoBackup3 WriteRegStr HKCR ".pem" "backup_val" $1 NoBackup3: WriteRegStr HKCR ".pem" "" "pem_file" ReadRegStr $0 HKCR "pem_file" "" StrCmp $0 "" 0 Skip3 WriteRegStr HKCR "pem_file" "" "Privacy Enhanced Mail" WriteRegStr HKCR "pem_file\shell" "" "open" WriteRegStr HKCR "pem_file\DefaultIcon" "" "$INSTDIR\xca.exe,0" WriteRegStr HKCR "pem_file\shell\open\command" "" '$INSTDIR\xca.exe -P "%1"' Skip3: ReadRegStr $1 HKCR ".crt" "" StrCmp $1 "" +3 WriteRegStr HKCR "$1\shell\open_xca" "" "Open with XCA" WriteRegStr HKCR "$1\shell\open_xca\command" "" '$INSTDIR\xca.exe -c "%1"' ReadRegStr $1 HKCR ".crl" "" StrCmp $1 "" +3 WriteRegStr HKCR "$1\shell\open_xca" "" "Open with XCA" WriteRegStr HKCR "$1\shell\open_xca\command" "" '$INSTDIR\xca.exe -l "%1"' ReadRegStr $1 HKCR ".pfx" "" StrCmp $1 "" +3 WriteRegStr HKCR "$1\shell\open_xca" "" "Open with XCA" WriteRegStr HKCR "$1\shell\open_xca\command" "" '$INSTDIR\xca.exe -p "%1"' ReadRegStr $1 HKCR ".p7b" "" StrCmp $1 "" +3 WriteRegStr HKCR "$1\shell\open_xca" "" "Open with XCA" WriteRegStr HKCR "$1\shell\open_xca\command" "" '$INSTDIR\xca.exe -7 "%1"' System::Call 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)' SectionEnd ; uninstall stuff ;---------------------------------------- Section "Uninstall" ; remove registry keys DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" DeleteRegKey HKLM "SOFTWARE\xca" DeleteRegKey HKCU "SOFTWARE\xca" ; remove files Delete $INSTDIR\xca.exe Delete $INSTDIR\db_dump.exe Delete $INSTDIR\key.ico Delete $INSTDIR\key.xpm Delete $INSTDIR\*.dll Delete $INSTDIR\*.xca Delete $INSTDIR\*.txt Delete $INSTDIR\*.qm Delete $INSTDIR\*.html Delete $INSTDIR\*.png ; MUST REMOVE UNINSTALLER, too Delete $INSTDIR\uninstall.exe RMDir $INSTDIR ClearErrors UserInfo::GetName IfErrors Win9x UserInfo::GetAccountType Pop $0 StrCmp $0 "Admin" 0 Win9x SetShellVarContext all Goto done Win9x: SetShellVarContext current done: ;-------------------------------------- ReadRegStr $1 HKCR ".xdb" "" StrCmp $1 "xca_db" 0 Skip ReadRegStr $1 HKCR ".xdb" "backup_val" StrCmp $1 "" 0 Restore DeleteRegKey HKCR ".xdb" Goto Skip Restore: WriteRegStr HKCR ".xdb" "" $1 Skip: DeleteRegValue HKCR ".xdb" "backup_val" DeleteRegKey HKCR "xca_db" ;-------------------------------------- ReadRegStr $1 HKCR ".xca" "" StrCmp $1 "xca_template" 0 Skip1 ReadRegStr $1 HKCR ".xca" "backup_val" StrCmp $1 "" 0 Restore1 DeleteRegKey HKCR ".xca" Goto Skip1 Restore1: WriteRegStr HKCR ".xca" "" $1 Skip1: DeleteRegValue HKCR ".xca" "backup_val" DeleteRegKey HKCR "xca_template" ;-------------------------------------- ReadRegStr $1 HKCR ".pem" "" StrCmp $1 "pem_file" 0 Skip2 ReadRegStr $1 HKCR ".pem" "backup_val" StrCmp $1 "" 0 Restore2 DeleteRegKey HKCR ".pem" Goto Skip2 Restore2: WriteRegStr HKCR ".pem" "" $1 Skip2: DeleteRegValue HKCR ".pem" "backup_val" DeleteRegKey HKCR "pem_file" ;-------------------------------------- ReadRegStr $1 HKCR ".crt" "" StrCmp $1 "" +2 DeleteRegKey HKCR "$1\shell\open_xca" ReadRegStr $1 HKCR ".crl" "" StrCmp $1 "" +2 DeleteRegKey HKCR "$1\shell\open_xca" ReadRegStr $1 HKCR ".pfx" "" StrCmp $1 "" +2 DeleteRegKey HKCR "$1\shell\open_xca" ReadRegStr $1 HKCR ".p7b" "" StrCmp $1 "" +2 DeleteRegKey HKCR "$1\shell\open_xca" System::Call 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)' ; remove shortcuts, if any. Delete "$SMPROGRAMS\xca\*.*" ; remove directories used. RMDir "$SMPROGRAMS\xca" SectionEnd ;----------------------------------- ;Descriptions ;Language strings LangString DESC_SecMain ${LANG_ENGLISH} "XCA main application." LangString DESC_SecMain ${LANG_GERMAN} "XCA Applikation." LangString DESC_SecShortcut ${LANG_ENGLISH} "Shortcuts on the desktop and the menu." LangString DESC_SecShortcut ${LANG_GERMAN} "Programmgruppe auf dem Desktop und im Menu." LangString DESC_SecUpdate ${LANG_ENGLISH} "Dumps an old database <= 0.5.1 into an ASCII format, that can be imported by the current Version of XCA." LangString DESC_SecUpdate ${LANG_GERMAN} "Exportiert eine alte Datenbank <= 0.5.1 in ein ASCII format, das mit dieser Version von XCA importiert werden kann." LangString DESC_SecFiles ${LANG_ENGLISH} "File association for *.xdb *.xca *.pem and 'open with' for *.crt *.crl *.pfx *.p7b *.cer" LangString DESC_SecFiles ${LANG_GERMAN} "Registrierung der Dateiendung *.xdb *.xca *.pem und 'open with' fr *.crt *.crl *.pfx *.p7b *.cer" LangString DESC_SecTrans ${LANG_ENGLISH} "Translations for german, russian, spanish, french and russian." LangString DESC_SecTrans ${LANG_GERMAN} "bersetzungen in deutsch, russisch, spanisch und franzsisch." ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecMain} $(DESC_SecMain) !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcut} $(DESC_SecShortcut) !insertmacro MUI_DESCRIPTION_TEXT ${SecUpdate} $(DESC_SecUpdate) !insertmacro MUI_DESCRIPTION_TEXT ${SecFiles} $(DESC_SecFiles) !insertmacro MUI_DESCRIPTION_TEXT ${SecTrans} $(DESC_SecTrans) !insertmacro MUI_FUNCTION_DESCRIPTION_END LangString DESC_Donation ${LANG_ENGLISH} \ "Please consider donating for XCA.\r\n\r\n\ If this application saves you time and money, consider returning \ a small share back to me." LangString DESC_Donation ${LANG_GERMAN} \ "Bitte ziehen Sie eine Spende in Betracht.\r\n\r\n\ Wenn Ihnen dieses Programm Zeit und Geld spart, \ ziehen Sie bitte die Mglichkeit in Betracht mir einen kleinen \ Teil davon abzugeben." ;----------------------------------- Function .onInit !insertMacro MUI_LANGDLL_DISPLAY FunctionEnd Function un.onInit !insertMacro MUI_UNGETLANGUAGE FunctionEnd ; eof ��������������������������������������������������������������������������������������������������������xca_0.9.3/misc/xca.rc�������������������������������������������������������������������������������0000775�0000000�0000000�00000000101�11753427512�0014416�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������IDI_APPICON ICON DISCARDABLE "img\key.ico" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/misc/xca.xml������������������������������������������������������������������������������0000664�0000000�0000000�00000000560�11753427512�0014620�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'> <mime-type type="application/x-xca-database"> <comment>XCA database</comment> <glob pattern="*.xdb"/> </mime-type> <mime-type type="application/x-xca-template"> <comment>XCA template</comment> <glob pattern="*.xca"/> </mime-type> </mime-info> ������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/test/�������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11753427512�0013346�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/test/create_key.pl������������������������������������������������������������������������0000775�0000000�0000000�00000001765�11753427512�0016032�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl use X11::GUITest qw/StartApp WaitWindowViewable SendKeys SetInputFocus WaitWindowClose GetInputFocus GetWindowName GetChildWindows/; my $xcaId; my $password = "ThisIsMyPassword"; my $db = "__x.xdb"; sub new_key { my $id; my ($name, $size, $type) = @_; print "name=$name, size=$size, Type=$type\n"; SendKeys("%(n)"); $id = WaitWindowViewable(); SendKeys($name ."{TAB}" .$size ."{TAB}". $type ."{ENT}"); WaitWindowClose($id, 100); } StartApp("./xca"); ($xcaId) = WaitWindowViewable("X Certificate and Key management"); printf "XCA id: $xcaId\n"; SendKeys("%(fo)"); WaitWindowViewable("Open XCA Database"); SendKeys($db . "{ENT}"); WaitWindowViewable("Password"); SendKeys($password ."{ENT}"); for ($i=0; $i<500; $i++) { my $len=int(rand(3200)) + 1024; new_key("rsa_key-$len", $len, "r"); $len=int(rand(1500)) + 1024; new_key("dsa_key-$len", $len, "d"); new_key("ec_key-$len", $len, "e"); } SendKeys("%({F4})"); WaitWindowClose($xcaId, 10); exec("lib/db_dump", $db); �����������xca_0.9.3/test/im_export_key.pl���������������������������������������������������������������������0000775�0000000�0000000�00000002136�11753427512�0016566�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl use strict; use warnings; use X11::GUITest qw/StartApp WaitWindowViewable SendKeys SetInputFocus WaitWindowClose GetInputFocus GetWindowName GetChildWindows ClickWindow/; my $xcaId; my $password = "ThisIsMyPassword"; my $db = "__x.xdb"; unlink $db; sub new_key { my $id; my ($name, $size, $type) = @_; print "name=$name, size=$size, Type=$type\n"; SendKeys("%(i)"); $id = WaitWindowViewable("New key"); SendKeys($name ."{TAB}" .$size ."{TAB}". $type ."{ENT}"); WaitWindowClose($id, 10); } StartApp("./xca $db"); ($xcaId) = WaitWindowViewable("X Certificate and Key management"); printf "XCA id: $xcaId\n"; WaitWindowViewable("Password"); SendKeys($password . "{TAB}" . $password . "{ENT}"); SendKeys("%(i)"); my $id = WaitWindowViewable("Import RSA key"); SendKeys("{BS 20}" . "test/key.pem" . "{ENT}"); WaitWindowClose($id, 10); system("xev -id $xcaId &"); ClickWindow($xcaId); SendKeys("{SPACE}"); #ClickWindow($xcaId, 100, 110); #ClickWindow($xcaId, 200, 110); #ClickWindow($xcaId, 300, 110); #SendKeys("%({F4})"); #WaitWindowClose($xcaId, 10); #exec("lib/db_dump", $db); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/test/opendb.pl����������������������������������������������������������������������������0000775�0000000�0000000�00000001271�11753427512�0015156�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl use X11::GUITest qw/StartApp WaitWindowViewable SendKeys GetInputFocus GetWindowName WaitWindowClose/; my $password = "ThisIsMyPassword"; my $db = "__x.xdb"; unlink $db; StartApp("./xca"); my ($xcaId) = WaitWindowViewable("X Certificate and Key management"); SendKeys("%(fn)"); WaitWindowViewable("Open XCA Database"); SendKeys($db . "{ENT}"); WaitWindowViewable("New Password"); SendKeys($password . "{TAB}" . $password . "{ENT}"); SendKeys("%(fc)"); SendKeys("%(fo)"); WaitWindowViewable("Open XCA Database"); SendKeys($db . "{ENT}"); WaitWindowViewable("Password"); SendKeys($password ."{ENT}"); SendKeys("%({F4})"); WaitWindowClose($xcaId, 10); exec("lib/db_dump", $db); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/���������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11753427512�0013004�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/.gitignore�����������������������������������������������������������������������������0000664�0000000�0000000�00000000004�11753427512�0014766�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������*.h ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/About.ui�������������������������������������������������������������������������������0000664�0000000�0000000�00000007003�11753427512�0014415�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<ui version="4.0" > <class>About</class> <widget class="QDialog" name="About" > <property name="geometry" > <rect> <x>0</x> <y>0</y> <width>561</width> <height>392</height> </rect> </property> <property name="windowTitle" > <string/> </property> <layout class="QVBoxLayout" > <property name="spacing" > <number>6</number> </property> <property name="leftMargin" > <number>8</number> </property> <property name="topMargin" > <number>8</number> </property> <property name="rightMargin" > <number>8</number> </property> <property name="bottomMargin" > <number>8</number> </property> <item> <layout class="QHBoxLayout" > <property name="spacing" > <number>6</number> </property> <property name="leftMargin" > <number>0</number> </property> <property name="topMargin" > <number>0</number> </property> <property name="rightMargin" > <number>0</number> </property> <property name="bottomMargin" > <number>0</number> </property> <item> <widget class="QLabel" name="image1" > <property name="minimumSize" > <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize" > <size> <width>95</width> <height>40</height> </size> </property> <property name="text" > <string/> </property> <property name="scaledContents" > <bool>true</bool> </property> </widget> </item> <item> <spacer> <property name="orientation" > <enum>Qt::Horizontal</enum> </property> <property name="sizeType" > <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" > <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="button" > <property name="text" > <string>Done</string> </property> </widget> </item> <item> <spacer> <property name="orientation" > <enum>Qt::Horizontal</enum> </property> <property name="sizeType" > <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" > <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image" > <property name="minimumSize" > <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize" > <size> <width>95</width> <height>40</height> </size> </property> <property name="text" > <string/> </property> <property name="scaledContents" > <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QTextBrowser" name="textbox" /> </item> </layout> </widget> <resources/> <connections> <connection> <sender>button</sender> <signal>clicked()</signal> <receiver>About</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel" > <x>270</x> <y>28</y> </hint> <hint type="destinationlabel" > <x>213</x> <y>18</y> </hint> </hints> </connection> </connections> </ui> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/CaProperties.ui������������������������������������������������������������������������0000664�0000000�0000000�00000011647�11753427512�0015754�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>CaProperties</class> <widget class="QDialog" name="CaProperties"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>487</width> <height>320</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QLabel" name="TextLabel1"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>CA Properties</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QGroupBox" name="certName"> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="1"> <widget class="QLineEdit" name="serial"/> </item> <item row="1" column="0"> <widget class="QCheckBox" name="randomSerial"> <property name="text"> <string>Use random Serial numbers</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>Days until next CRL issuing</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QSpinBox" name="days"/> </item> <item row="3" column="0"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Default template</string> </property> </widget> </item> <item row="3" column="1"> <widget class="QComboBox" name="temp"/> </item> <item row="0" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Next serial for signing</string> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <resources/> <connections> <connection> <sender>randomSerial</sender> <signal>clicked(bool)</signal> <receiver>serial</receiver> <slot>setDisabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>39</x> <y>141</y> </hint> <hint type="destinationlabel"> <x>271</x> <y>111</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>CaProperties</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>341</x> <y>291</y> </hint> <hint type="destinationlabel"> <x>292</x> <y>254</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>CaProperties</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>445</x> <y>292</y> </hint> <hint type="destinationlabel"> <x>445</x> <y>237</y> </hint> </hints> </connection> </connections> </ui> �����������������������������������������������������������������������������������������xca_0.9.3/ui/CertDetail.ui��������������������������������������������������������������������������0000664�0000000�0000000�00000027731�11753427512�0015375�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>CertDetail</class> <widget class="QDialog" name="CertDetail"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>450</width> <height>448</height> </rect> </property> <property name="windowTitle"> <string/> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="headerLabel"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>Details of the Certificate</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QTabWidget" name="tabwidget"> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="unnamed"> <attribute name="title"> <string>S&tatus</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>9</number> </property> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QFrame" name="frame"> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QGridLayout"> <property name="margin"> <number>9</number> </property> <property name="spacing"> <number>6</number> </property> <item row="3" column="1"> <widget class="CopyLabel" name="sigAlgo"/> </item> <item row="2" column="1"> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="ClickLabel" name="privKey"/> </item> <item> <widget class="QLabel" name="serialLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Serial</string> </property> </widget> </item> <item> <widget class="CopyLabel" name="serialNr"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>The serial number of the certificate</string> </property> </widget> </item> </layout> </item> <item row="0" column="1"> <widget class="QLineEdit" name="descr"> <property name="toolTip"> <string>The internal name of the certificate in the database</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="TextLabel2"> <property name="text"> <string>Internal name</string> </property> </widget> </item> <item row="1" column="1"> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="ClickLabel" name="signature"/> </item> <item> <widget class="ClickLabel" name="trustState"/> </item> </layout> </item> <item row="3" column="0"> <widget class="QLabel" name="TextLabel1_2_2"> <property name="text"> <string>Signature algorithm</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="signedLabel"> <property name="text"> <string>Signature</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="TextLabel6"> <property name="text"> <string>Key</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="fingerprints"> <property name="title"> <string>Fingerprints</string> </property> <layout class="QGridLayout"> <property name="margin"> <number>8</number> </property> <property name="spacing"> <number>6</number> </property> <item row="1" column="0"> <widget class="QLabel" name="TextLabel2_2"> <property name="text"> <string>SHA1</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="TextLabel1_2"> <property name="text"> <string>MD5</string> </property> </widget> </item> <item row="1" column="1"> <widget class="CopyLabel" name="fpSHA1"> <property name="toolTip"> <string>A SHA-1 hashsum of the certificate</string> </property> </widget> </item> <item row="0" column="1"> <widget class="CopyLabel" name="fpMD5"> <property name="toolTip"> <string>An md5 hashsum of the certificate</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="validity"> <property name="title"> <string>Validity</string> </property> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="CopyLabel" name="notBefore"> <property name="toolTip"> <string>The time since the certificate is valid</string> </property> </widget> </item> <item> <widget class="CopyLabel" name="notAfter"> <property name="toolTip"> <string>The time until the certificate is valid</string> </property> </widget> </item> <item> <widget class="ClickLabel" name="dateValid"> <property name="text"> <string/> </property> </widget> </item> </layout> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="unnamed_1"> <attribute name="title"> <string>&Subject</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>11</number> </property> <item> <widget class="DistName" name="subject" native="true"/> </item> </layout> </widget> <widget class="QWidget" name="tab"> <attribute name="title"> <string>&Issuer</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>11</number> </property> <item> <widget class="DistName" name="issuer" native="true"/> </item> </layout> </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>Attributes</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QWidget" name="attributes" native="true"/> </item> </layout> </widget> <widget class="QWidget" name="unnamed_2"> <attribute name="title"> <string>&Extensions</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QTextEdit" name="v3extensions"> <property name="readOnly"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QPushButton" name="showExt"> <property name="text"> <string>Show config</string> </property> </widget> </item> </layout> </widget> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>ClickLabel</class> <extends>QLabel</extends> <header>widgets/clicklabel.h</header> </customwidget> <customwidget> <class>DistName</class> <extends>QWidget</extends> <header>widgets/distname.h</header> <container>1</container> </customwidget> <customwidget> <class>CopyLabel</class> <extends>QLabel</extends> <header>widgets/clicklabel.h</header> </customwidget> </customwidgets> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>CertDetail</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>369</x> <y>422</y> </hint> <hint type="destinationlabel"> <x>235</x> <y>405</y> </hint> </hints> </connection> </connections> </ui> ���������������������������������������xca_0.9.3/ui/CertExtend.ui��������������������������������������������������������������������������0000664�0000000�0000000�00000023162�11753427512�0015414�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>CertExtend</class> <widget class="QDialog" name="CertExtend"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>760</width> <height>288</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QLabel" name="capt"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>Certificate renewal</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>78</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QLabel" name="TextLabel1"> <property name="text"> <string>This will create a new certificate as a copy of the old one with a new serial number and adjusted validity values.</string> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>368</width> <height>16</height> </size> </property> </spacer> </item> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>Validity</string> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <layout class="QGridLayout"> <property name="margin"> <number>0</number> </property> <property name="spacing"> <number>6</number> </property> <item row="0" column="0"> <widget class="QLabel" name="TextLabel1_2"> <property name="text"> <string>Not before</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="TextLabel2_4"> <property name="text"> <string>Not after</string> </property> </widget> </item> <item row="0" column="1"> <widget class="Validity" name="notBefore"> <property name="calendarPopup"> <bool>true</bool> </property> </widget> </item> <item row="1" column="1"> <widget class="Validity" name="notAfter"> <property name="calendarPopup"> <bool>true</bool> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Time range</string> </property> <layout class="QGridLayout" name="gridLayout_1"> <item row="0" column="0" colspan="2"> <widget class="QLineEdit" name="validNumber"/> </item> <item row="0" column="2"> <widget class="QComboBox" name="validRange"> <item> <property name="text"> <string>Days</string> </property> </item> <item> <property name="text"> <string>Months</string> </property> </item> <item> <property name="text"> <string>Years</string> </property> </item> </widget> </item> <item row="0" column="3"> <widget class="QPushButton" name="applyTime"> <property name="text"> <string>Apply</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QCheckBox" name="midnightCB"> <property name="text"> <string>Midnight</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QCheckBox" name="checkBox"> <property name="text"> <string>Local time</string> </property> </widget> </item> <item row="1" column="2" colspan="2"> <widget class="QCheckBox" name="noWellDefinedExpDate"> <property name="text"> <string>No well-defined expiration</string> </property> </widget> </item> </layout> </widget> </item> </layout> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>368</width> <height>16</height> </size> </property> </spacer> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <layoutdefault spacing="6" margin="9"/> <customwidgets> <customwidget> <class>Validity</class> <extends>QDateTimeEdit</extends> <header>widgets/validity.h</header> <container>1</container> <slots> <slot>hideTimeCheck(int)</slot> <slot>localTime(int)</slot> </slots> </customwidget> </customwidgets> <tabstops> <tabstop>validNumber</tabstop> <tabstop>validRange</tabstop> <tabstop>midnightCB</tabstop> <tabstop>applyTime</tabstop> </tabstops> <resources/> <connections> <connection> <sender>midnightCB</sender> <signal>stateChanged(int)</signal> <receiver>notAfter</receiver> <slot>hideTimeCheck(int)</slot> <hints> <hint type="sourcelabel"> <x>456</x> <y>193</y> </hint> <hint type="destinationlabel"> <x>231</x> <y>187</y> </hint> </hints> </connection> <connection> <sender>noWellDefinedExpDate</sender> <signal>clicked(bool)</signal> <receiver>notAfter</receiver> <slot>setDisabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>738</x> <y>193</y> </hint> <hint type="destinationlabel"> <x>351</x> <y>194</y> </hint> </hints> </connection> <connection> <sender>midnightCB</sender> <signal>stateChanged(int)</signal> <receiver>notBefore</receiver> <slot>hideTimeCheck(int)</slot> <hints> <hint type="sourcelabel"> <x>456</x> <y>193</y> </hint> <hint type="destinationlabel"> <x>239</x> <y>157</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>CertExtend</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>124</x> <y>253</y> </hint> <hint type="destinationlabel"> <x>28</x> <y>255</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>CertExtend</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>217</x> <y>257</y> </hint> <hint type="destinationlabel"> <x>74</x> <y>220</y> </hint> </hints> </connection> <connection> <sender>midnightCB</sender> <signal>clicked(bool)</signal> <receiver>checkBox</receiver> <slot>setDisabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>421</x> <y>182</y> </hint> <hint type="destinationlabel"> <x>487</x> <y>176</y> </hint> </hints> </connection> <connection> <sender>checkBox</sender> <signal>stateChanged(int)</signal> <receiver>notBefore</receiver> <slot>localTime(int)</slot> <hints> <hint type="sourcelabel"> <x>518</x> <y>189</y> </hint> <hint type="destinationlabel"> <x>344</x> <y>151</y> </hint> </hints> </connection> <connection> <sender>checkBox</sender> <signal>stateChanged(int)</signal> <receiver>notAfter</receiver> <slot>localTime(int)</slot> <hints> <hint type="sourcelabel"> <x>505</x> <y>190</y> </hint> <hint type="destinationlabel"> <x>334</x> <y>191</y> </hint> </hints> </connection> </connections> </ui> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/CrlDetail.ui���������������������������������������������������������������������������0000664�0000000�0000000�00000024167�11753427512�0015220�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>CrlDetail</class> <widget class="QDialog" name="CrlDetail"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>488</width> <height>352</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QWidget" name="widget" native="true"/> </item> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="TextLabel1"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>Details of the Revocation list</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QTabWidget" name="tabview"> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="unnamed"> <attribute name="title"> <string>&Status</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QFrame" name="frame"> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QGridLayout"> <property name="margin"> <number>8</number> </property> <property name="spacing"> <number>6</number> </property> <item row="2" column="1"> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="ClickLabel" name="signCheck"/> </item> <item> <widget class="QLabel" name="TextLabel1_3"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Version</string> </property> </widget> </item> <item> <widget class="CopyLabel" name="version"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> </widget> </item> </layout> </item> <item row="2" column="0"> <widget class="QLabel" name="TextLabel6"> <property name="text"> <string>Signature</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="TextLabel4"> <property name="text"> <string>Signed by</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="TextLabel2"> <property name="text"> <string>Name</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QLineEdit" name="descr"> <property name="toolTip"> <string>The internal name of the CRL in the database</string> </property> </widget> </item> <item row="1" column="1"> <widget class="ClickLabel" name="issuerIntName"/> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>issuing dates</string> </property> <layout class="QGridLayout"> <property name="margin"> <number>8</number> </property> <property name="spacing"> <number>6</number> </property> <item row="1" column="0"> <widget class="QLabel" name="TextLabel2_2"> <property name="text"> <string>Next Update</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="TextLabel1_2"> <property name="text"> <string>Last Update</string> </property> </widget> </item> <item row="1" column="1"> <widget class="CopyLabel" name="nUpdate"/> </item> <item row="0" column="1"> <widget class="CopyLabel" name="lUpdate"/> </item> </layout> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="Widget9"> <attribute name="title"> <string>&Issuer</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>11</number> </property> <item> <widget class="DistName" name="issuer" native="true"/> </item> </layout> </widget> <widget class="QWidget" name="unnamed_1"> <attribute name="title"> <string>&Extensions</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>11</number> </property> <item> <widget class="QTextEdit" name="v3extensions"> <property name="acceptDrops"> <bool>false</bool> </property> <property name="readOnly"> <bool>true</bool> </property> </widget> </item> </layout> </widget> <widget class="QWidget" name="tab"> <attribute name="title"> <string>&Revocation list</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>11</number> </property> <item> <widget class="QTreeWidget" name="certList"> <property name="alternatingRowColors"> <bool>true</bool> </property> <property name="selectionMode"> <enum>QAbstractItemView::NoSelection</enum> </property> <property name="rootIsDecorated"> <bool>false</bool> </property> <property name="uniformRowHeights"> <bool>true</bool> </property> <column> <property name="text"> <string>0</string> </property> </column> </widget> </item> </layout> </widget> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>ClickLabel</class> <extends>QLabel</extends> <header>widgets/clicklabel.h</header> </customwidget> <customwidget> <class>DistName</class> <extends>QWidget</extends> <header>widgets/distname.h</header> <container>1</container> </customwidget> <customwidget> <class>CopyLabel</class> <extends>QLabel</extends> <header>widgets/clicklabel.h</header> </customwidget> </customwidgets> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>CrlDetail</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>349</x> <y>321</y> </hint> <hint type="destinationlabel"> <x>169</x> <y>308</y> </hint> </hints> </connection> </connections> </ui> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/ExportDialog.ui������������������������������������������������������������������������0000664�0000000�0000000�00000016343�11753427512�0015753�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>ExportDialog</class> <widget class="QDialog" name="ExportDialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>510</width> <height>277</height> </rect> </property> <property name="windowTitle"> <string/> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="label"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>458</width> <height>16</height> </size> </property> </spacer> </item> <item> <widget class="QFrame" name="frame_2"> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QGridLayout"> <property name="margin"> <number>8</number> </property> <property name="spacing"> <number>6</number> </property> <item row="1" column="3"> <widget class="QToolButton" name="fileBut"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>...</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="TextLabel14"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Filename</string> </property> </widget> </item> <item row="1" column="1" colspan="2"> <widget class="QLineEdit" name="filename"/> </item> <item row="0" column="0" colspan="2"> <widget class="QLabel" name="filenameLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Please enter the filename</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QFrame" name="frame"> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="QLabel" name="formatLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string/> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> </item> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="TextLabel1"> <property name="text"> <string>Export Format</string> </property> </widget> </item> <item> <widget class="QComboBox" name="exportFormat"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <widget class="QFrame" name="extraFrame"> <property name="frameShape"> <enum>QFrame::StyledPanel</enum> </property> <property name="frameShadow"> <enum>QFrame::Raised</enum> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>458</width> <height>16</height> </size> </property> </spacer> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <tabstops> <tabstop>filename</tabstop> <tabstop>fileBut</tabstop> <tabstop>exportFormat</tabstop> </tabstops> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>ExportDialog</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>358</x> <y>304</y> </hint> <hint type="destinationlabel"> <x>232</x> <y>274</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>ExportDialog</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>463</x> <y>300</y> </hint> <hint type="destinationlabel"> <x>130</x> <y>280</y> </hint> </hints> </connection> </connections> </ui> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/ExportKey.ui���������������������������������������������������������������������������0000664�0000000�0000000�00000002721�11753427512�0015277�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>ExportKey</class> <widget class="QFrame" name="ExportKey"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>116</height> </rect> </property> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLabel" name="TextLabel2"> <property name="text"> <string>When exporting the private key it should be encrypted.</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="exportPrivate"> <property name="toolTip"> <string>When exporting the private part, it should be encrypted.</string> </property> <property name="text"> <string>E&xport the private part of the Key too</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="exportPkcs8"> <property name="text"> <string>Export as PKCS#8</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="encryptKey"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>&Encrypt the Key with a password</string> </property> </widget> </item> </layout> </widget> <resources/> <connections/> </ui> �����������������������������������������������xca_0.9.3/ui/Help.ui��������������������������������������������������������������������������������0000664�0000000�0000000�00000006006�11753427512�0014235�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<ui version="4.0" > <author></author> <comment></comment> <exportmacro></exportmacro> <class>Help</class> <widget class="QDialog" name="Help" > <property name="geometry" > <rect> <x>0</x> <y>0</y> <width>737</width> <height>619</height> </rect> </property> <property name="windowTitle" > <string/> </property> <layout class="QVBoxLayout" > <property name="margin" > <number>8</number> </property> <property name="spacing" > <number>6</number> </property> <item> <layout class="QHBoxLayout" > <property name="margin" > <number>0</number> </property> <property name="spacing" > <number>6</number> </property> <item> <widget class="QPushButton" name="back" > <property name="text" > <string><<</string> </property> <property name="autoDefault" > <bool>true</bool> </property> </widget> </item> <item> <widget class="QPushButton" name="forward" > <property name="text" > <string>>></string> </property> <property name="autoDefault" > <bool>true</bool> </property> </widget> </item> <item> <spacer> <property name="orientation" > <enum>Qt::Horizontal</enum> </property> <property name="sizeType" > <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" > <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="buttonOk" > <property name="text" > <string>&Done</string> </property> <property name="autoDefault" > <bool>true</bool> </property> <property name="default" > <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QTextBrowser" name="textbox" /> </item> </layout> </widget> <resources/> <connections> <connection> <sender>buttonOk</sender> <signal>clicked()</signal> <receiver>Help</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel" > <x>668</x> <y>26</y> </hint> <hint type="destinationlabel" > <x>520</x> <y>19</y> </hint> </hints> </connection> <connection> <sender>forward</sender> <signal>clicked()</signal> <receiver>textbox</receiver> <slot>forward()</slot> <hints> <hint type="sourcelabel" > <x>128</x> <y>33</y> </hint> <hint type="destinationlabel" > <x>189</x> <y>161</y> </hint> </hints> </connection> <connection> <sender>back</sender> <signal>clicked()</signal> <receiver>textbox</receiver> <slot>backward()</slot> <hints> <hint type="sourcelabel" > <x>57</x> <y>25</y> </hint> <hint type="destinationlabel" > <x>61</x> <y>254</y> </hint> </hints> </connection> </connections> </ui> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/ImportMulti.ui�������������������������������������������������������������������������0000664�0000000�0000000�00000011735�11753427512�0015637�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>ImportMulti</class> <widget class="QDialog" name="ImportMulti"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>516</width> <height>477</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout" name="_2"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="heading"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>Import PKI Items</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QListView" name="listView"/> </item> <item> <widget class="QFrame" name="frame"> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPushButton" name="butOk"> <property name="text"> <string>Import &All</string> </property> </widget> </item> <item> <widget class="QPushButton" name="butImport"> <property name="text"> <string>&Import</string> </property> </widget> </item> <item> <widget class="QPushButton" name="butCancel"> <property name="text"> <string>&Done</string> </property> </widget> </item> <item> <widget class="QPushButton" name="butRemove"> <property name="text"> <string>&Remove from list</string> </property> </widget> </item> <item> <widget class="QPushButton" name="butDetails"> <property name="text"> <string>Details</string> </property> </widget> </item> <item> <widget class="QPushButton" name="deleteToken"> <property name="text"> <string>Delete from token</string> </property> </widget> </item> <item> <widget class="QPushButton" name="renameToken"> <property name="text"> <string>Rename on token</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>204</width> <height>21</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="slotInfo"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="frameShape"> <enum>QFrame::Box</enum> </property> </widget> </item> </layout> </widget> </item> </layout> </item> </layout> </widget> <resources/> <connections> <connection> <sender>butCancel</sender> <signal>clicked()</signal> <receiver>ImportMulti</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>373</x> <y>131</y> </hint> <hint type="destinationlabel"> <x>287</x> <y>358</y> </hint> </hints> </connection> </connections> </ui> �����������������������������������xca_0.9.3/ui/KeyDetail.ui���������������������������������������������������������������������������0000664�0000000�0000000�00000020133�11753427512�0015215�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>KeyDetail</class> <widget class="QDialog" name="KeyDetail"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>532</width> <height>438</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QWidget" name="widget" native="true"/> </item> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="tlHeader"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string/> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QLabel" name="TextLabel1"> <property name="text"> <string>Name</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="keyDesc"> <property name="toolTip"> <string>The internal name of the key used by xca</string> </property> <property name="maxLength"> <number>32767</number> </property> </widget> </item> </layout> </item> <item> <widget class="QGroupBox" name="cardBox"> <property name="title"> <string>Security token</string> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>Manufacturer</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QLineEdit" name="cardManufacturer"> <property name="readOnly"> <bool>true</bool> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Serial</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="cardSerial"> <property name="readOnly"> <bool>true</bool> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="keyBox"> <property name="title"> <string>Key</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QLabel" name="tlPubEx"> <property name="text"> <string>Public Exponent</string> </property> </widget> </item> <item> <widget class="CopyLabel" name="keyPubEx"/> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::MinimumExpanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="TextLabel3"> <property name="text"> <string>Keysize</string> </property> </widget> </item> <item> <widget class="CopyLabel" name="keyLength"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QLabel" name="tlPrivEx"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Private Exponent</string> </property> </widget> </item> <item> <widget class="ClickLabel" name="keyPrivEx"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Ignored"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> </widget> </item> </layout> </item> <item> <widget class="QLabel" name="tlModulus"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Modulus</string> </property> </widget> </item> <item> <widget class="QTextBrowser" name="keyModulus"> <property name="font"> <font> <family>Monospace</family> </font> </property> <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <property name="horizontalScrollBarPolicy"> <enum>Qt::ScrollBarAlwaysOff</enum> </property> <property name="acceptRichText"> <bool>false</bool> </property> <property name="textInteractionFlags"> <set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> </property> <property name="openLinks"> <bool>false</bool> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>ClickLabel</class> <extends>QLabel</extends> <header>widgets/clicklabel.h</header> </customwidget> <customwidget> <class>CopyLabel</class> <extends>QLabel</extends> <header>widgets/clicklabel.h</header> </customwidget> </customwidgets> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>KeyDetail</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>485</x> <y>405</y> </hint> <hint type="destinationlabel"> <x>258</x> <y>379</y> </hint> </hints> </connection> </connections> </ui> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/MainWindow.ui��������������������������������������������������������������������������0000664�0000000�0000000�00000041217�11753427512�0015424�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>702</width> <height>511</height> </rect> </property> <widget class="QWidget" name="centralWidget"> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>9</number> </property> <item> <widget class="QTabWidget" name="tabView"> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="RSATab"> <attribute name="title"> <string>Private Keys</string> </attribute> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="XcaTreeView" name="keyView"/> </item> <item> <widget class="QFrame" name="keyButtons"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPushButton" name="BNnewKey"> <property name="text"> <string>&New Key</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNexportKey"> <property name="text"> <string>&Export</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNimportKey"> <property name="text"> <string>&Import</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNimportPFX"> <property name="text"> <string>Import PFX (PKCS#12)</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNdetailsKey"> <property name="text"> <string>&Show Details</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNdeleteKey"> <property name="text"> <string>&Delete</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="bigKey"> <property name="minimumSize"> <size> <width>200</width> <height>94</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="CertTab"> <attribute name="title"> <string>Certificate signing requests</string> </attribute> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="XcaTreeView" name="reqView"/> </item> <item> <widget class="QFrame" name="reqButtons"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="QPushButton" name="BNnewReq"> <property name="text"> <string>&New Request</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNexportReq"> <property name="text"> <string>&Export</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNimportReq"> <property name="text"> <string>&Import</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNdetailsReq"> <property name="text"> <string>&Show Details</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNdeleteReq"> <property name="text"> <string>&Delete</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="bigCsr"> <property name="minimumSize"> <size> <width>200</width> <height>94</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="ReqTab"> <attribute name="title"> <string>Certificates</string> </attribute> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="XcaTreeView" name="certView"/> </item> <item> <widget class="QFrame" name="certButtons"> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>11</number> </property> <item> <widget class="QPushButton" name="BNnewCert"> <property name="text"> <string>&New Certificate</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNexportCert"> <property name="text"> <string>&Export</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNimportCert"> <property name="text"> <string>&Import</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNdetailsCert"> <property name="text"> <string>&Show Details</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNdeleteCert"> <property name="text"> <string>&Delete</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNimportPKCS12"> <property name="text"> <string>Import &PKCS#12</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNimportPKCS7"> <property name="text"> <string>Import P&KCS#7</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNviewState"> <property name="text"> <string>Plain View</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="bigCert"> <property name="minimumSize"> <size> <width>200</width> <height>94</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="CATab"> <attribute name="title"> <string>Templates</string> </attribute> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="XcaTreeView" name="tempView"> <property name="alternatingRowColors"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QFrame" name="tempButtons"> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>11</number> </property> <item> <widget class="QPushButton" name="BNnewTemp"> <property name="text"> <string>&New template</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNchangeTemp"> <property name="text"> <string>Ch&ange Template</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNdeleteTemp"> <property name="text"> <string>&Delete</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNimportTemp"> <property name="text"> <string>&Import</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNexportTemp"> <property name="text"> <string>&Export</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="bigTemp"> <property name="minimumSize"> <size> <width>200</width> <height>94</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="unnamed"> <attribute name="title"> <string>Revocation lists</string> </attribute> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>9</number> </property> <item> <widget class="XcaTreeView" name="crlView"/> </item> <item> <widget class="QFrame" name="crlButtons"> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>9</number> </property> <item> <widget class="QPushButton" name="BNexportCrl"> <property name="text"> <string>&Export</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNimportCrl"> <property name="text"> <string>&Import</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNdetailsCrl"> <property name="text"> <string>&Show Details</string> </property> </widget> </item> <item> <widget class="QPushButton" name="BNdeleteCrl"> <property name="text"> <string>&Delete</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="bigRev"> <property name="minimumSize"> <size> <width>200</width> <height>94</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> </widget> </item> </layout> </widget> </widget> <customwidgets> <customwidget> <class>XcaTreeView</class> <extends>QTreeView</extends> <header>widgets/XcaTreeView.h</header> </customwidget> </customwidgets> <resources/> <connections/> </ui> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/Makefile�������������������������������������������������������������������������������0000664�0000000�0000000�00000000633�11753427512�0014446�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ifeq ($(TOPDIR),) TOPDIR=.. BUILD=.. endif UI_H = ui_About.h ui_CaProperties.h ui_CertDetail.h ui_CertExtend.h \ ui_CrlDetail.h ui_ExportDialog.h ui_ExportKey.h ui_Help.h \ ui_ImportMulti.h ui_KeyDetail.h ui_MainWindow.h ui_NewCrl.h \ ui_NewKey.h ui_NewX509.h ui_Options.h ui_PwDialog.h ui_Revoke.h \ ui_SelectToken.h ui_TrustState.h ui_v3ext.h ui_SearchPkcs11.h include $(TOPDIR)/Rules.mak ui: $(UI_H) �����������������������������������������������������������������������������������������������������xca_0.9.3/ui/NewCrl.ui������������������������������������������������������������������������������0000664�0000000�0000000�00000022714�11753427512�0014543�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>NewCrl</class> <widget class="QDialog" name="NewCrl"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>451</width> <height>503</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="TextLabel1"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>Create CRL</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Dates</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QGridLayout" name="gridLayout_2"> <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>last update</string> </property> </widget> </item> <item row="0" column="1"> <widget class="Validity" name="lastUpdate"> <property name="calendarPopup"> <bool>true</bool> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_2"> <property name="text"> <string>next update</string> </property> </widget> </item> <item row="1" column="1"> <widget class="Validity" name="nextUpdate"> <property name="calendarPopup"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0" colspan="2"> <widget class="QLineEdit" name="validNumber"/> </item> <item row="0" column="2"> <widget class="QComboBox" name="validRange"> <item> <property name="text"> <string>Days</string> </property> </item> <item> <property name="text"> <string>Months</string> </property> </item> <item> <property name="text"> <string>Years</string> </property> </item> </widget> </item> <item row="1" column="0"> <widget class="QCheckBox" name="midnightCB"> <property name="text"> <string>Midnight</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QCheckBox" name="checkBox"> <property name="text"> <string>Local time</string> </property> </widget> </item> <item row="1" column="2"> <widget class="QPushButton" name="applyTime"> <property name="text"> <string>Apply</string> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_3"> <property name="title"> <string>Hashing algorithm</string> </property> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="hashBox" name="hashAlgo"/> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>Extensions</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QCheckBox" name="authKeyId"> <property name="text"> <string>Authority key identifier</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="subAltName"> <property name="text"> <string>Subject alternative name</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="crlNumber"> <property name="text"> <string>CRL Number</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QCheckBox" name="revokationReasons"> <property name="text"> <string>Revokation reasons</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> </layout> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>21</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>Validity</class> <extends>QDateTimeEdit</extends> <header>widgets/validity.h</header> <container>1</container> <slots> <slot>hideTimeCheck(int)</slot> <slot>localTime(int)</slot> </slots> </customwidget> <customwidget> <class>hashBox</class> <extends>QComboBox</extends> <header>widgets/hashBox.h</header> </customwidget> </customwidgets> <tabstops> <tabstop>authKeyId</tabstop> <tabstop>subAltName</tabstop> </tabstops> <resources/> <connections> <connection> <sender>midnightCB</sender> <signal>stateChanged(int)</signal> <receiver>nextUpdate</receiver> <slot>hideTimeCheck(int)</slot> <hints> <hint type="sourcelabel"> <x>77</x> <y>220</y> </hint> <hint type="destinationlabel"> <x>233</x> <y>149</y> </hint> </hints> </connection> <connection> <sender>midnightCB</sender> <signal>stateChanged(int)</signal> <receiver>lastUpdate</receiver> <slot>hideTimeCheck(int)</slot> <hints> <hint type="sourcelabel"> <x>97</x> <y>220</y> </hint> <hint type="destinationlabel"> <x>233</x> <y>118</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>NewCrl</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>310</x> <y>478</y> </hint> <hint type="destinationlabel"> <x>70</x> <y>459</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>NewCrl</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>404</x> <y>474</y> </hint> <hint type="destinationlabel"> <x>179</x> <y>454</y> </hint> </hints> </connection> <connection> <sender>checkBox</sender> <signal>stateChanged(int)</signal> <receiver>nextUpdate</receiver> <slot>localTime(int)</slot> <hints> <hint type="sourcelabel"> <x>212</x> <y>207</y> </hint> <hint type="destinationlabel"> <x>188</x> <y>145</y> </hint> </hints> </connection> <connection> <sender>checkBox</sender> <signal>stateChanged(int)</signal> <receiver>lastUpdate</receiver> <slot>localTime(int)</slot> <hints> <hint type="sourcelabel"> <x>216</x> <y>204</y> </hint> <hint type="destinationlabel"> <x>209</x> <y>114</y> </hint> </hints> </connection> <connection> <sender>midnightCB</sender> <signal>clicked(bool)</signal> <receiver>checkBox</receiver> <slot>setDisabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>54</x> <y>208</y> </hint> <hint type="destinationlabel"> <x>184</x> <y>211</y> </hint> </hints> </connection> </connections> </ui> ����������������������������������������������������xca_0.9.3/ui/NewKey.ui������������������������������������������������������������������������������0000664�0000000�0000000�00000014530�11753427512�0014550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>NewKey</class> <widget class="QDialog" name="NewKey"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>449</width> <height>297</height> </rect> </property> <property name="windowTitle"> <string>New key</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="TextLabel6"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>New key</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="text"> <string/> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QLabel" name="TextLabel1"> <property name="text"> <string>Please give a name to the new key and select the desired keysize</string> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Key properties</string> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0" colspan="2"> <widget class="QLabel" name="TextLabel5"> <property name="text"> <string>Name</string> </property> </widget> </item> <item row="0" column="2" rowspan="2"> <widget class="QLineEdit" name="keyDesc"> <property name="minimumSize"> <size> <width>0</width> <height>0</height> </size> </property> <property name="maximumSize"> <size> <width>32767</width> <height>32767</height> </size> </property> <property name="toolTip"> <string>The internal name of the new key</string> </property> <property name="text"> <string>New Key</string> </property> </widget> </item> <item row="2" column="2"> <widget class="QComboBox" name="keyType"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> </widget> </item> <item row="5" column="2"> <widget class="QComboBox" name="curveBox"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> </widget> </item> <item row="5" column="1"> <widget class="QLabel" name="curveLabel"> <property name="text"> <string>Curve</string> </property> </widget> </item> <item row="4" column="1"> <widget class="QLabel" name="keySizeLabel"> <property name="text"> <string>Keysize</string> </property> </widget> </item> <item row="4" column="2"> <widget class="QComboBox" name="keyLength"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>Usually 1024 or 2048 bit keys are used</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QLabel" name="TextLabel1_2"> <property name="text"> <string>Keytype</string> </property> </widget> </item> </layout> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>351</width> <height>16</height> </size> </property> </spacer> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <tabstops> <tabstop>keyDesc</tabstop> <tabstop>keyType</tabstop> <tabstop>keyLength</tabstop> <tabstop>curveBox</tabstop> </tabstops> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>NewKey</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>303</x> <y>274</y> </hint> <hint type="destinationlabel"> <x>173</x> <y>248</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>NewKey</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>408</x> <y>270</y> </hint> <hint type="destinationlabel"> <x>56</x> <y>236</y> </hint> </hints> </connection> </connections> </ui> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/NewX509.ui�����������������������������������������������������������������������������0000664�0000000�0000000�00000165324�11753427512�0014475�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>NewX509</class> <widget class="QDialog" name="NewX509"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>712</width> <height>613</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout" name="_4"> <item> <widget class="QLabel" name="capt"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>Create</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QTabWidget" name="tabWidget"> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="tab_0"> <attribute name="title"> <string>Source</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>16</height> </size> </property> </spacer> </item> <item> <widget class="QGroupBox" name="requestBox"> <property name="title"> <string>Signing request</string> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>9</number> </property> <item> <widget class="QWidget" name="reqWidget" native="true"> <layout class="QGridLayout"> <property name="margin"> <number>0</number> </property> <property name="spacing"> <number>6</number> </property> <item row="0" column="1"> <widget class="QComboBox" name="reqList"> <property name="whatsThis"> <string>A certificate signing request can be signed, even if the private key of the request is not available. This is the intention of a CSR: Getting signed by a CA certificate, whoes certificate of course must be in the database Of course you need the private key of the CSR if you want to create a self-signed cert from it.</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QPushButton" name="showReqBut"> <property name="text"> <string>Show request</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QCheckBox" name="fromReqCB"> <property name="text"> <string>Sign this Certificate signing &request</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QCheckBox" name="copyReqExtCB"> <property name="text"> <string>Copy extensions from the request</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item row="2" column="0"> <widget class="QCheckBox" name="reqSubChange"> <property name="text"> <string>Modify subject of the request</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QWidget" name="attrWidget" native="true"> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> </layout> </widget> </item> </layout> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>16</height> </size> </property> </spacer> </item> <item> <widget class="QGroupBox" name="signerBox"> <property name="title"> <string>Signing</string> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>9</number> </property> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QRadioButton" name="selfSignRB"> <property name="text"> <string>Create a &self signed certificate with the serial</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QLineEdit" name="serialNr"> <property name="toolTip"> <string>If you leave this blank the serial 00 will be used</string> </property> <property name="text"> <string>1</string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QRadioButton" name="foreignSignRB"> <property name="text"> <string>Use &this Certificate for signing</string> </property> </widget> </item> <item> <widget class="QComboBox" name="certList"> <property name="toolTip"> <string>All certificates in your database that can create valid signatures</string> </property> <property name="whatsThis"> <string>This list contains all certificates with the CA-flag set to true and whoes private key is present in the key-database. If this list is disabled, you only can create a self-signed certificate.</string> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>16</height> </size> </property> </spacer> </item> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="label"> <property name="text"> <string>Signature algorithm</string> </property> </widget> </item> <item> <widget class="hashBox" name="hashAlgo"/> </item> </layout> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>16</height> </size> </property> </spacer> </item> <item> <widget class="QGroupBox" name="templBox"> <property name="title"> <string>Template for the new certificate</string> </property> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QComboBox" name="tempList"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>All available templates</string> </property> <property name="whatsThis"> <string>This list contains all templates from the toplevel template Tab</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>13</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="applyExtensions"> <property name="text"> <string>Apply extensions</string> </property> </widget> </item> <item> <widget class="QPushButton" name="applySubject"> <property name="text"> <string>Apply subject</string> </property> </widget> </item> <item> <widget class="QPushButton" name="applyTemplate"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Apply all</string> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>16</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="tab_1"> <attribute name="title"> <string>Subject</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>9</number> </property> <item> <widget class="QGroupBox" name="distNameBox"> <property name="toolTip"> <string>Distinguished name</string> </property> <property name="title"> <string notr="true">Distinguished name</string> </property> <layout class="QVBoxLayout" name="_2"> <item> <layout class="QGridLayout" name="_3"> <item row="3" column="3"> <widget class="QLineEdit" name="emailAddress"> <property name="maxLength"> <number>60</number> </property> </widget> </item> <item row="0" column="2"> <widget class="QLabel" name="LorganisationName"> <property name="toolTip"> <string>Organisation</string> </property> <property name="buddy"> <cstring>organisationName</cstring> </property> </widget> </item> <item row="0" column="1"> <widget class="QLineEdit" name="description"> <property name="toolTip"> <string>This name is only used internally and does not appear in the resulting certificate</string> </property> <property name="maxLength"> <number>100</number> </property> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="countryName"> <property name="toolTip"> <string>Must be exactly 2 letter of size (DE, UK)</string> </property> <property name="maxLength"> <number>2</number> </property> </widget> </item> <item row="2" column="3"> <widget class="QLineEdit" name="commonName"> <property name="maxLength"> <number>64</number> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="LcountryName"> <property name="toolTip"> <string>Country code</string> </property> <property name="buddy"> <cstring>countryName</cstring> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="LstateOrProvinceName"> <property name="toolTip"> <string>State or Province</string> </property> <property name="buddy"> <cstring>stateOrProvinceName</cstring> </property> </widget> </item> <item row="2" column="1"> <widget class="QLineEdit" name="stateOrProvinceName"/> </item> <item row="3" column="0"> <widget class="QLabel" name="LlocalityName"> <property name="toolTip"> <string>Locality</string> </property> <property name="buddy"> <cstring>localityName</cstring> </property> </widget> </item> <item row="1" column="2"> <widget class="QLabel" name="LorganisationalUnitName"> <property name="toolTip"> <string>Organisational unit</string> </property> <property name="buddy"> <cstring>organisationalUnitName</cstring> </property> </widget> </item> <item row="3" column="2"> <widget class="QLabel" name="LemailAddress"> <property name="toolTip"> <string>E-Mail address</string> </property> <property name="buddy"> <cstring>emailAddress</cstring> </property> </widget> </item> <item row="3" column="1"> <widget class="QLineEdit" name="localityName"/> </item> <item row="1" column="3"> <widget class="QLineEdit" name="organisationalUnitName"/> </item> <item row="0" column="0"> <widget class="QLabel" name="TextLabel1_3_2_2"> <property name="text"> <string>Internal name</string> </property> <property name="buddy"> <cstring>description</cstring> </property> </widget> </item> <item row="0" column="3"> <widget class="QLineEdit" name="organisationName"/> </item> <item row="2" column="2"> <widget class="QLabel" name="LcommonName"> <property name="toolTip"> <string>Common name</string> </property> <property name="buddy"> <cstring>commonName</cstring> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="Line1_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="kvView" name="extDNlist"> <attribute name="horizontalHeaderDefaultSectionSize"> <number>200</number> </attribute> <attribute name="horizontalHeaderStretchLastSection"> <bool>true</bool> </attribute> </widget> </item> <item> <layout class="QVBoxLayout" name="verticalLayout_5"> <item> <widget class="QPushButton" name="extDNadd"> <property name="text"> <string>Add</string> </property> </widget> </item> <item> <widget class="QPushButton" name="extDNdel"> <property name="text"> <string>Delete</string> </property> </widget> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </item> </layout> </item> <item> <widget class="QLabel" name="extDNinfo"> <property name="frameShape"> <enum>QFrame::Panel</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="privKeyBox"> <property name="title"> <string>Private key</string> </property> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>9</number> </property> <item> <widget class="QComboBox" name="keyList"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>This list only contains unused keys</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="usedKeysToo"> <property name="text"> <string>Used keys too</string> </property> </widget> </item> <item> <widget class="QPushButton" name="genKeyBut"> <property name="text"> <string>&Generate a new key</string> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>Extensions</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="_6"> <item> <widget class="QGroupBox" name="groupBox_8"> <property name="toolTip"> <string>Basic constraints</string> </property> <property name="title"> <string notr="true">Basic constraints</string> </property> <layout class="QGridLayout" name="gridLayout_7"> <item row="0" column="0"> <widget class="QLabel" name="TextLabel2_2_3"> <property name="text"> <string>Type</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QComboBox" name="basicCA"> <property name="toolTip"> <string>If this will become a CA certificate or not</string> </property> <property name="whatsThis"> <string>Set this to TRUE if you want to create a CA certificate that signs other certificates. This is always set to FALSE for client or server certificates. In most cases self-signed certificates are CA certificates. Self-signed non-CA certificates are unusual although they are possible.</string> </property> <item> <property name="text"> <string>Not defined</string> </property> </item> <item> <property name="text"> <string>Certification Authority</string> </property> </item> <item> <property name="text"> <string>End Entity</string> </property> </item> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="TextLabel3_2_2"> <property name="text"> <string>Path length</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="basicPath"> <property name="toolTip"> <string>How much CAs may be below this.</string> </property> <property name="whatsThis"> <string>If this is left empty the pathlen is not included in the certificate. Otherwise it distinguishes the count of chained CA certificates below this one. A pathlen of 0 means, that this certificate may not issue other sub-CA certificates. Although it can do it, all chain-checking algorithms in e.g. your browser or openssl will (should) fail.</string> </property> </widget> </item> <item row="1" column="2"> <widget class="QCheckBox" name="bcCritical"> <property name="toolTip"> <string>The basic constraints should always be critical</string> </property> <property name="text"> <string notr="true">&Critical</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="keyIdentBox"> <property name="toolTip"> <string>Key identifier</string> </property> <property name="title"> <string notr="true">Key identifier</string> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="QCheckBox" name="subKey"> <property name="toolTip"> <string>Creates a hash of the key following the PKIX guidelines</string> </property> <property name="text"> <string notr="true">&Subject Key Identifier</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="authKey"> <property name="toolTip"> <string>Copy the Subject Key Identifier from the issuer</string> </property> <property name="whatsThis"> <string>If this box is checked an attempt is made to copy the subject key identifier from the signing certificate. It also copies the issuer and serial number from the issuer certificate. Normally this will only be done if the keyid option fails.</string> </property> <property name="text"> <string notr="true">&Authority Key Identifier</string> </property> </widget> </item> </layout> </widget> </item> </layout> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item> <widget class="QWidget" name="timewidget" native="true"> <property name="enabled"> <bool>true</bool> </property> <layout class="QHBoxLayout" name="horizontalLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QGroupBox" name="validityBox"> <property name="title"> <string>Validity</string> </property> <layout class="QGridLayout" name="gridLayout_1"> <item row="0" column="0"> <widget class="QLabel" name="TextLabel1_2_3_2"> <property name="text"> <string>Not before</string> </property> </widget> </item> <item row="0" column="1"> <widget class="Validity" name="notBefore"> <property name="calendarPopup"> <bool>true</bool> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="TextLabel2_4_2"> <property name="text"> <string>Not after</string> </property> </widget> </item> <item row="1" column="1"> <widget class="Validity" name="notAfter"> <property name="calendarPopup"> <bool>true</bool> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="rangeBox"> <property name="title"> <string>Time range</string> </property> <layout class="QGridLayout" name="gridLayout_2"> <item row="0" column="0" colspan="2"> <widget class="QLineEdit" name="validNumber"/> </item> <item row="0" column="2"> <widget class="QComboBox" name="validRange"> <item> <property name="text"> <string>Days</string> </property> </item> <item> <property name="text"> <string>Months</string> </property> </item> <item> <property name="text"> <string>Years</string> </property> </item> </widget> </item> <item row="0" column="3"> <widget class="QPushButton" name="applyTime"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Apply</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QCheckBox" name="midnightCB"> <property name="toolTip"> <string>Set the time to 00:00:00 and 23:59:59 respectively</string> </property> <property name="text"> <string>Midnight</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QCheckBox" name="checkBox"> <property name="text"> <string>Local time</string> </property> </widget> </item> <item row="1" column="2" colspan="2"> <widget class="QCheckBox" name="noWellDefinedExpDate"> <property name="text"> <string>No well-defined expiration</string> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item> <layout class="QGridLayout" name="gridLayout_12"> <item row="0" column="0"> <widget class="QLabel" name="TextLabel1_2_2_3"> <property name="toolTip"> <string>subject alternative name</string> </property> <property name="text"> <string notr="true">subject alternative name</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QLabel" name="subAltIco"> <property name="minimumSize"> <size> <width>20</width> <height>20</height> </size> </property> <property name="maximumSize"> <size> <width>20</width> <height>20</height> </size> </property> <property name="text"> <string/> </property> </widget> </item> <item row="0" column="2" colspan="2"> <widget class="QLineEdit" name="subAltName"> <property name="toolTip"> <string>DNS: IP: URI: email: RID:</string> </property> <property name="whatsThis"> <string>The subject alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name) , RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</string> </property> </widget> </item> <item row="0" column="4"> <widget class="QPushButton" name="editSubAlt"> <property name="text"> <string>Edit</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="TextLabel1_2_2_2"> <property name="toolTip"> <string>issuer alternative name</string> </property> <property name="text"> <string notr="true">issuer alternative name</string> </property> </widget> </item> <item row="1" column="2" colspan="2"> <widget class="QLineEdit" name="issAltName"> <property name="toolTip"> <string>DNS: IP: URI: email: RID:</string> </property> <property name="whatsThis"> <string>The issuer alternative name extension allows various literal values to be used. These include "email" (an email address) , "URI" a uniform resource indicator, "DNS" (a DNS domain name), RID (a registered ID: OBJECT IDENTIFIER) and IP (an IP address). Examples: email:my@other.address, IP: 1.1.1.1 , URI:http://my.url.here/ email:my@other.address, RID:1.2.3.4, DNS: ns.server.tld</string> </property> </widget> </item> <item row="1" column="4"> <widget class="QPushButton" name="editIssAlt"> <property name="text"> <string>Edit</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="TextLabel1_2_3_2_3"> <property name="toolTip"> <string>CRL distribution point</string> </property> <property name="text"> <string notr="true">CRL distribution point</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QLabel" name="crlDistIco"> <property name="minimumSize"> <size> <width>20</width> <height>20</height> </size> </property> <property name="maximumSize"> <size> <width>20</width> <height>20</height> </size> </property> <property name="text"> <string/> </property> </widget> </item> <item row="2" column="2" colspan="2"> <widget class="QLineEdit" name="crlDist"> <property name="toolTip"> <string>URI:</string> </property> <property name="whatsThis"> <string>This is a multi-valued extension that supports all the literal options of subject alternative name. Of the few software packages that currentlyi nterpret this extension most only interpret the URI option. Currently each option will set a new DistributionPoint with the fullName field set to the given value. Other fields like cRLissuer and reasons cannot currently be set or displayed: at this time no examples were available that used these fields. If you see this extension with <UNSUPPORTED> when you attempt to print it out or it doesn't appear to display correctly then let steve know, including the certificate (mail steve at openssl dot org) . Examples: URI:http://www.myhost.com/myca.crl URI:http://www.my.com/my.crl, URI:http://www.oth.com/my.crl</string> </property> </widget> </item> <item row="2" column="4"> <widget class="QPushButton" name="editCrlDist"> <property name="text"> <string>Edit</string> </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="TextLabel1_2_3_2_2_3"> <property name="toolTip"> <string>Authority Info Access</string> </property> <property name="text"> <string notr="true">Authority Info Access</string> </property> </widget> </item> <item row="3" column="1"> <widget class="QLabel" name="authInfAccIco"> <property name="minimumSize"> <size> <width>20</width> <height>20</height> </size> </property> <property name="maximumSize"> <size> <width>20</width> <height>20</height> </size> </property> <property name="text"> <string/> </property> </widget> </item> <item row="3" column="2"> <widget class="QComboBox" name="aiaOid"> <property name="toolTip"> <string>can be altered by the file "aia.txt"</string> </property> </widget> </item> <item row="3" column="3"> <widget class="QLineEdit" name="authInfAcc"> <property name="toolTip"> <string>DNS: IP: URI: email: RID:</string> </property> <property name="whatsThis"> <string>The authority information access extension gives details about how to access certain information relating to the CA. Its syntax is accessOID;location where 'location' has the same syntax as subject alternative name (except that email:copy is not supported). accessOID can be any valid OID but only certain values are meaningful for example OCSP and caIssuers. OCSP gives the location of an OCSP responder: this is used by Netscape PSM and other software. Example: OCSP;URI:http://ocsp.my.host/ caIssuers;URI:http://my.ca/ca.html</string> </property> </widget> </item> <item row="3" column="4"> <widget class="QPushButton" name="editAuthInfAcc"> <property name="text"> <string>Edit</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QLabel" name="issAltIco"> <property name="minimumSize"> <size> <width>20</width> <height>20</height> </size> </property> <property name="maximumSize"> <size> <width>20</width> <height>20</height> </size> </property> <property name="text"> <string/> </property> </widget> </item> </layout> </item> </layout> </widget> <widget class="QWidget" name="tab_3"> <attribute name="title"> <string>Key usage</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QGroupBox" name="groupBox_12"> <property name="title"> <string>Key usage</string> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="QCheckBox" name="kuCritical"> <property name="text"> <string notr="true">&Critical</string> </property> </widget> </item> <item> <widget class="QListWidget" name="keyUsage"> <property name="selectionMode"> <enum>QAbstractItemView::MultiSelection</enum> </property> <property name="selectionBehavior"> <enum>QAbstractItemView::SelectRows</enum> </property> <item> <property name="text"> <string notr="true">Digital Signature</string> </property> </item> <item> <property name="text"> <string notr="true">Non Repudiation</string> </property> </item> <item> <property name="text"> <string notr="true">Key Encipherment</string> </property> </item> <item> <property name="text"> <string notr="true">Data Encipherment</string> </property> </item> <item> <property name="text"> <string notr="true">Key Agreement</string> </property> </item> <item> <property name="text"> <string notr="true">Certificate Sign</string> </property> </item> <item> <property name="text"> <string notr="true">CRL Sign</string> </property> </item> <item> <property name="text"> <string notr="true">Encipher Only</string> </property> </item> <item> <property name="text"> <string notr="true">Decipher Only</string> </property> </item> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_11"> <property name="title"> <string>Extended key usage</string> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="QCheckBox" name="ekuCritical"> <property name="text"> <string notr="true">C&ritical</string> </property> </widget> </item> <item> <widget class="QListWidget" name="ekeyUsage"> <property name="selectionMode"> <enum>QAbstractItemView::MultiSelection</enum> </property> <property name="selectionBehavior"> <enum>QAbstractItemView::SelectRows</enum> </property> </widget> </item> </layout> </widget> </item> </layout> </item> </layout> </widget> <widget class="QWidget" name="tab_4"> <attribute name="title"> <string>Netscape</string> </attribute> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QListWidget" name="nsCertType"> <property name="selectionMode"> <enum>QAbstractItemView::MultiSelection</enum> </property> <item> <property name="text"> <string notr="true">SSL Client</string> </property> </item> <item> <property name="text"> <string notr="true">SSL Server</string> </property> </item> <item> <property name="text"> <string notr="true">S/MIME</string> </property> </item> <item> <property name="text"> <string notr="true">Object Signing</string> </property> </item> <item> <property name="text"> <string notr="true">SSL CA</string> </property> </item> <item> <property name="text"> <string notr="true">S/MIME CA</string> </property> </item> <item> <property name="text"> <string notr="true">Object Signing CA</string> </property> </item> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="nsImg"> <property name="minimumSize"> <size> <width>107</width> <height>107</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> </layout> </item> <item> <layout class="QGridLayout" name="gridLayout_3"> <property name="margin"> <number>0</number> </property> <property name="spacing"> <number>6</number> </property> <item row="3" column="1"> <widget class="QLineEdit" name="nsRenewalUrl"/> </item> <item row="4" column="1"> <widget class="QLineEdit" name="nsCaPolicyUrl"/> </item> <item row="2" column="0"> <widget class="QLabel" name="TextLabel2_2_4"> <property name="toolTip"> <string>CA Revocation URL</string> </property> <property name="text"> <string notr="true">CA Revocation URL</string> </property> </widget> </item> <item row="5" column="1"> <widget class="QLineEdit" name="nsSslServerName"/> </item> <item row="1" column="0"> <widget class="QLabel" name="TextLabel4_2_2_3"> <property name="toolTip"> <string>Revocation URL</string> </property> <property name="text"> <string notr="true">Revocation URL</string> </property> </widget> </item> <item row="5" column="0"> <widget class="QLabel" name="TextLabel7_2_3"> <property name="toolTip"> <string>SSL server name</string> </property> <property name="text"> <string notr="true">SSL server name</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QLineEdit" name="nsBaseUrl"/> </item> <item row="2" column="1"> <widget class="QLineEdit" name="nsCARevocationUrl"/> </item> <item row="3" column="0"> <widget class="QLabel" name="TextLabel3_2_4"> <property name="toolTip"> <string>Certificate renewal URL</string> </property> <property name="text"> <string notr="true">Certificate renewal URL</string> </property> </widget> </item> <item row="6" column="0"> <widget class="QLabel" name="TextLabel8"> <property name="toolTip"> <string>Comment</string> </property> <property name="text"> <string notr="true">Comment</string> </property> </widget> </item> <item row="4" column="0"> <widget class="QLabel" name="TextLabel6_2_3"> <property name="toolTip"> <string>CA policy URL</string> </property> <property name="text"> <string notr="true">CA policy URL</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="TextLabel1_3_2_3"> <property name="toolTip"> <string>Base URL</string> </property> <property name="text"> <string notr="true">Base URL</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="nsRevocationUrl"/> </item> <item row="6" column="1"> <widget class="QLineEdit" name="nsComment"> <property name="toolTip"> <string>If you know a more pretty one tell me</string> </property> </widget> </item> </layout> </item> </layout> <widget class="QWidget" name="widget_3_2" native="true"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>100</width> <height>30</height> </rect> </property> </widget> <widget class="QWidget" name="widget_5" native="true"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>100</width> <height>30</height> </rect> </property> </widget> </widget> <widget class="QWidget" name="Seite"> <attribute name="title"> <string>Advanced</string> </attribute> <layout class="QVBoxLayout"> <item> <widget class="QTextEdit" name="nconf_data"/> </item> <item> <layout class="QHBoxLayout"> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="adv_validate"> <property name="text"> <string>Validate</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> </layout> </widget> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>Validity</class> <extends>QDateTimeEdit</extends> <header>widgets/validity.h</header> <container>1</container> <slots> <slot>hideTimeCheck(int)</slot> <slot>localTime(int)</slot> </slots> </customwidget> <customwidget> <class>hashBox</class> <extends>QComboBox</extends> <header>widgets/hashBox.h</header> </customwidget> <customwidget> <class>kvView</class> <extends>QTableView</extends> <header>widgets/kvView.h</header> <slots> <slot>addKvRow()</slot> <slot>deleteCurrentRow()</slot> </slots> </customwidget> </customwidgets> <tabstops> <tabstop>tabWidget</tabstop> <tabstop>fromReqCB</tabstop> <tabstop>reqList</tabstop> <tabstop>copyReqExtCB</tabstop> <tabstop>showReqBut</tabstop> <tabstop>selfSignRB</tabstop> <tabstop>serialNr</tabstop> <tabstop>foreignSignRB</tabstop> <tabstop>certList</tabstop> <tabstop>tempList</tabstop> <tabstop>applyTemplate</tabstop> <tabstop>description</tabstop> <tabstop>countryName</tabstop> <tabstop>stateOrProvinceName</tabstop> <tabstop>localityName</tabstop> <tabstop>organisationName</tabstop> <tabstop>organisationalUnitName</tabstop> <tabstop>commonName</tabstop> <tabstop>emailAddress</tabstop> <tabstop>extDNadd</tabstop> <tabstop>extDNdel</tabstop> <tabstop>keyList</tabstop> <tabstop>genKeyBut</tabstop> <tabstop>basicCA</tabstop> <tabstop>basicPath</tabstop> <tabstop>bcCritical</tabstop> <tabstop>subKey</tabstop> <tabstop>authKey</tabstop> <tabstop>validNumber</tabstop> <tabstop>validRange</tabstop> <tabstop>midnightCB</tabstop> <tabstop>applyTime</tabstop> <tabstop>subAltName</tabstop> <tabstop>editSubAlt</tabstop> <tabstop>issAltName</tabstop> <tabstop>editIssAlt</tabstop> <tabstop>crlDist</tabstop> <tabstop>editCrlDist</tabstop> <tabstop>aiaOid</tabstop> <tabstop>authInfAcc</tabstop> <tabstop>editAuthInfAcc</tabstop> <tabstop>kuCritical</tabstop> <tabstop>keyUsage</tabstop> <tabstop>ekuCritical</tabstop> <tabstop>ekeyUsage</tabstop> <tabstop>nsCertType</tabstop> <tabstop>nsBaseUrl</tabstop> <tabstop>nsRevocationUrl</tabstop> <tabstop>nsCARevocationUrl</tabstop> <tabstop>nsRenewalUrl</tabstop> <tabstop>nsCaPolicyUrl</tabstop> <tabstop>nsSslServerName</tabstop> <tabstop>nsComment</tabstop> </tabstops> <resources/> <connections> <connection> <sender>noWellDefinedExpDate</sender> <signal>clicked(bool)</signal> <receiver>notAfter</receiver> <slot>setDisabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>595</x> <y>341</y> </hint> <hint type="destinationlabel"> <x>203</x> <y>342</y> </hint> </hints> </connection> <connection> <sender>fromReqCB</sender> <signal>clicked(bool)</signal> <receiver>reqList</receiver> <slot>setEnabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>292</x> <y>147</y> </hint> <hint type="destinationlabel"> <x>402</x> <y>147</y> </hint> </hints> </connection> <connection> <sender>extDNdel</sender> <signal>clicked()</signal> <receiver>extDNlist</receiver> <slot>deleteCurrentRow()</slot> <hints> <hint type="sourcelabel"> <x>622</x> <y>284</y> </hint> <hint type="destinationlabel"> <x>57</x> <y>251</y> </hint> </hints> </connection> <connection> <sender>extDNadd</sender> <signal>clicked()</signal> <receiver>extDNlist</receiver> <slot>addKvRow()</slot> <hints> <hint type="sourcelabel"> <x>622</x> <y>252</y> </hint> <hint type="destinationlabel"> <x>57</x> <y>251</y> </hint> </hints> </connection> <connection> <sender>selfSignRB</sender> <signal>toggled(bool)</signal> <receiver>serialNr</receiver> <slot>setEnabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>275</x> <y>301</y> </hint> <hint type="destinationlabel"> <x>679</x> <y>313</y> </hint> </hints> </connection> <connection> <sender>foreignSignRB</sender> <signal>toggled(bool)</signal> <receiver>certList</receiver> <slot>setEnabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>279</x> <y>344</y> </hint> <hint type="destinationlabel"> <x>388</x> <y>332</y> </hint> </hints> </connection> <connection> <sender>midnightCB</sender> <signal>stateChanged(int)</signal> <receiver>notBefore</receiver> <slot>hideTimeCheck(int)</slot> <hints> <hint type="sourcelabel"> <x>384</x> <y>341</y> </hint> <hint type="destinationlabel"> <x>203</x> <y>311</y> </hint> </hints> </connection> <connection> <sender>midnightCB</sender> <signal>stateChanged(int)</signal> <receiver>notAfter</receiver> <slot>hideTimeCheck(int)</slot> <hints> <hint type="sourcelabel"> <x>384</x> <y>341</y> </hint> <hint type="destinationlabel"> <x>203</x> <y>342</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>NewX509</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>557</x> <y>584</y> </hint> <hint type="destinationlabel"> <x>285</x> <y>570</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>NewX509</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>643</x> <y>587</y> </hint> <hint type="destinationlabel"> <x>405</x> <y>566</y> </hint> </hints> </connection> <connection> <sender>checkBox</sender> <signal>stateChanged(int)</signal> <receiver>notAfter</receiver> <slot>localTime(int)</slot> <hints> <hint type="sourcelabel"> <x>451</x> <y>329</y> </hint> <hint type="destinationlabel"> <x>290</x> <y>328</y> </hint> </hints> </connection> <connection> <sender>checkBox</sender> <signal>stateChanged(int)</signal> <receiver>notBefore</receiver> <slot>localTime(int)</slot> <hints> <hint type="sourcelabel"> <x>459</x> <y>337</y> </hint> <hint type="destinationlabel"> <x>268</x> <y>301</y> </hint> </hints> </connection> <connection> <sender>midnightCB</sender> <signal>clicked(bool)</signal> <receiver>checkBox</receiver> <slot>setDisabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>350</x> <y>333</y> </hint> <hint type="destinationlabel"> <x>447</x> <y>337</y> </hint> </hints> </connection> </connections> </ui> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/Options.ui�����������������������������������������������������������������������������0000664�0000000�0000000�00000015163�11753427512�0015004�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Options</class> <widget class="QDialog" name="Options"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>494</width> <height>529</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QLabel" name="TextLabel1"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>XCA Options</string> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Mandatory subject entries</string> </property> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QComboBox" name="extDNobj"/> </item> <item> <widget class="QListWidget" name="extDNlist"/> </item> </layout> </item> <item> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QPushButton" name="extDNadd"> <property name="text"> <string>Add</string> </property> </widget> </item> <item> <widget class="QPushButton" name="extDNdel"> <property name="text"> <string>Delete</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </item> </layout> </widget> </item> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="label_3"> <property name="text"> <string>Default hash algorithm</string> </property> </widget> </item> <item> <widget class="hashBox" name="hashAlgo"/> </item> </layout> </item> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="label"> <property name="text"> <string>String types</string> </property> </widget> </item> <item> <widget class="QComboBox" name="mbstring"/> </item> </layout> </item> <item> <widget class="QCheckBox" name="suppress"> <property name="text"> <string>Suppress success messages</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="noColorize"> <property name="text"> <string>Don't colorize expired certificates</string> </property> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>PKCS#11 provider</string> </property> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QListWidget" name="pkcs11List"/> </item> <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPushButton" name="addButton"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Add</string> </property> </widget> </item> <item> <widget class="QPushButton" name="removeButton"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Remove</string> </property> </widget> </item> <item> <widget class="QPushButton" name="searchPkcs11"> <property name="text"> <string>Search</string> </property> </widget> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>77</width> <height>17</height> </size> </property> </spacer> </item> </layout> </item> </layout> </widget> </item> <item> <widget class="Line" name="line"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>hashBox</class> <extends>QComboBox</extends> <header>widgets/hashBox.h</header> </customwidget> </customwidgets> <tabstops> <tabstop>hashAlgo</tabstop> </tabstops> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>Options</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>370</x> <y>406</y> </hint> <hint type="destinationlabel"> <x>109</x> <y>380</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>Options</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>447</x> <y>394</y> </hint> <hint type="destinationlabel"> <x>194</x> <y>374</y> </hint> </hints> </connection> </connections> </ui> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/PwDialog.ui����������������������������������������������������������������������������0000664�0000000�0000000�00000010172�11753427512�0015052�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>PwDialog</class> <widget class="QDialog" name="PwDialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>264</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="layout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="title"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> </widget> </item> <item> <spacer name="spc"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QFrame" name="frame_2"> <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QLabel" name="description"/> </item> </layout> </widget> </item> <item> <widget class="QFrame" name="frame"> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QLabel" name="label"/> </item> <item row="0" column="1"> <widget class="QLineEdit" name="passA"> <property name="echoMode"> <enum>QLineEdit::Password</enum> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="repeatLabel"/> </item> <item row="1" column="1"> <widget class="QLineEdit" name="passB"> <property name="echoMode"> <enum>QLineEdit::Password</enum> </property> </widget> </item> <item row="2" column="0" colspan="2"> <widget class="QCheckBox" name="takeHex"> <property name="toolTip"> <string>The password is parsed as 2-digit hex code. It must have an even number of digits (0-9 and a-f)</string> </property> <property name="text"> <string>Take as HEX string</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>clicked(QAbstractButton*)</signal> <receiver>PwDialog</receiver> <slot>buttonPress(QAbstractButton*)</slot> <hints> <hint type="sourcelabel"> <x>63</x> <y>221</y> </hint> <hint type="destinationlabel"> <x>102</x> <y>21</y> </hint> </hints> </connection> </connections> <slots> <slot>buttonPress(QAbstractButton*)</slot> </slots> </ui> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/Revoke.ui������������������������������������������������������������������������������0000664�0000000�0000000�00000005263�11753427512�0014604�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Revoke</class> <widget class="QDialog" name="Revoke"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>195</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Revokation details</string> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>Invalid since</string> </property> </widget> </item> <item row="0" column="1"> <widget class="Validity" name="invalid"> <property name="calendarPopup"> <bool>true</bool> </property> </widget> </item> <item row="1" column="1"> <widget class="QCheckBox" name="checkBox"> <property name="text"> <string>Local time</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Revokation reason</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QComboBox" name="reason"/> </item> </layout> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> <set>QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>Validity</class> <extends>QDateTimeEdit</extends> <header>widgets/validity.h</header> <container>1</container> <slots> <slot>hideTimeCheck(int)</slot> <slot>localTime(int)</slot> </slots> </customwidget> </customwidgets> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>Revoke</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>236</x> <y>185</y> </hint> <hint type="destinationlabel"> <x>157</x> <y>164</y> </hint> </hints> </connection> <connection> <sender>checkBox</sender> <signal>stateChanged(int)</signal> <receiver>invalid</receiver> <slot>localTime(int)</slot> <hints> <hint type="sourcelabel"> <x>244</x> <y>82</y> </hint> <hint type="destinationlabel"> <x>244</x> <y>55</y> </hint> </hints> </connection> </connections> </ui> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/SearchPkcs11.ui������������������������������������������������������������������������0000664�0000000�0000000�00000007755�11753427512�0015551�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>SearchPkcs11</class> <widget class="QDialog" name="SearchPkcs11"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>480</width> <height>378</height> </rect> </property> <property name="windowTitle"> <string>Dialog</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QFrame" name="frame_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QLabel" name="TextLabel14"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Directory</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QLineEdit" name="filename"/> </item> <item row="0" column="2"> <widget class="QToolButton" name="fileBut"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>...</string> </property> </widget> </item> <item row="1" column="0" colspan="2"> <widget class="QCheckBox" name="subdirs"> <property name="text"> <string>include sub directorys</string> </property> </widget> </item> <item row="1" column="2"> <widget class="QPushButton" name="search"> <property name="text"> <string>Search</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QLabel" name="currFile"> <property name="text"> <string notr="true"/> </property> <property name="textFormat"> <enum>Qt::PlainText</enum> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QListWidget" name="liblist"> <property name="editTriggers"> <set>QAbstractItemView::NoEditTriggers</set> </property> <property name="showDropIndicator" stdset="0"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Open</set> </property> </widget> </item> </layout> </widget> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>clicked(QAbstractButton*)</signal> <receiver>SearchPkcs11</receiver> <slot>buttonPress(QAbstractButton*)</slot> <hints> <hint type="sourcelabel"> <x>229</x> <y>362</y> </hint> <hint type="destinationlabel"> <x>368</x> <y>104</y> </hint> </hints> </connection> <connection> <sender>liblist</sender> <signal>itemDoubleClicked(QListWidgetItem*)</signal> <receiver>SearchPkcs11</receiver> <slot>loadItem(QListWidgetItem*)</slot> <hints> <hint type="sourcelabel"> <x>339</x> <y>279</y> </hint> <hint type="destinationlabel"> <x>368</x> <y>225</y> </hint> </hints> </connection> </connections> <slots> <slot>buttonPress(QAbstractButton*)</slot> <slot>loadItem(QListWidgetItem*)</slot> </slots> </ui> �������������������xca_0.9.3/ui/SelectToken.ui�������������������������������������������������������������������������0000664�0000000�0000000�00000007113�11753427512�0015565�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>SelectToken</class> <widget class="QDialog" name="SelectToken"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>369</width> <height>162</height> </rect> </property> <property name="windowTitle"> <string>Select Token</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="TextLabel6"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>Security token</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="text"> <string/> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QLabel" name="TextLabel1"> <property name="text"> <string>Please select the security token</string> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> <item> <widget class="QComboBox" name="tokenBox"/> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>351</width> <height>16</height> </size> </property> </spacer> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>SelectToken</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>222</x> <y>138</y> </hint> <hint type="destinationlabel"> <x>90</x> <y>114</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>SelectToken</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>331</x> <y>129</y> </hint> <hint type="destinationlabel"> <x>144</x> <y>103</y> </hint> </hints> </connection> </connections> </ui> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/TrustState.ui��������������������������������������������������������������������������0000664�0000000�0000000�00000011360�11753427512�0015466�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>TrustState</class> <widget class="QDialog" name="TrustState"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>435</width> <height>288</height> </rect> </property> <property name="windowTitle"> <string/> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QLabel" name="TextLabel1"> <property name="font"> <font> <family>Arial</family> <pointsize>14</pointsize> <weight>50</weight> <italic>false</italic> <bold>false</bold> <underline>false</underline> <strikeout>false</strikeout> </font> </property> <property name="text"> <string>Set trustment of the Certificate</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="image"> <property name="minimumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="maximumSize"> <size> <width>95</width> <height>40</height> </size> </property> <property name="text"> <string/> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item> <widget class="ClickLabel" name="certName"/> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Trustment</string> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>8</number> </property> <item> <widget class="QRadioButton" name="trust0"> <property name="text"> <string>&Never trust this certificate</string> </property> </widget> </item> <item> <widget class="QRadioButton" name="trust1"> <property name="text"> <string>Only &trust this certificate, if we trust the signer</string> </property> </widget> </item> <item> <widget class="QRadioButton" name="trust2"> <property name="text"> <string>&Always trust this certificate</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>ClickLabel</class> <extends>QLabel</extends> <header>widgets/clicklabel.h</header> </customwidget> </customwidgets> <tabstops> <tabstop>trust0</tabstop> <tabstop>trust1</tabstop> <tabstop>trust2</tabstop> </tabstops> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>TrustState</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>286</x> <y>264</y> </hint> <hint type="destinationlabel"> <x>83</x> <y>245</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>TrustState</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>386</x> <y>260</y> </hint> <hint type="destinationlabel"> <x>430</x> <y>85</y> </hint> </hints> </connection> </connections> </ui> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/ui/v3ext.ui�������������������������������������������������������������������������������0000664�0000000�0000000�00000010752�11753427512�0014421�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>v3ext</class> <widget class="QDialog" name="v3ext"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>473</width> <height>233</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QCheckBox" name="critical"> <property name="text"> <string notr="true">Critical</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="kvView" name="tab"/> </item> <item> <widget class="QLabel" name="infoLabel"> <property name="frameShape"> <enum>QFrame::Panel</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> </widget> </item> </layout> </item> <item> <layout class="QVBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QPushButton" name="addEntry"> <property name="text"> <string>Add</string> </property> </widget> </item> <item> <widget class="QPushButton" name="delEntry"> <property name="text"> <string>Delete</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </item> </layout> </item> <item> <layout class="QHBoxLayout"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QPushButton" name="apply"> <property name="text"> <string>Apply</string> </property> </widget> </item> <item> <widget class="QPushButton" name="validate"> <property name="text"> <string>Validate</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="cancel"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Cancel</string> </property> </widget> </item> </layout> </item> </layout> </widget> <customwidgets> <customwidget> <class>kvView</class> <extends>QTableView</extends> <header>widgets/kvView.h</header> <slots> <slot>addKvRow()</slot> <slot>deleteCurrentRow()</slot> </slots> </customwidget> </customwidgets> <resources/> <connections> <connection> <sender>cancel</sender> <signal>clicked()</signal> <receiver>v3ext</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>375</x> <y>221</y> </hint> <hint type="destinationlabel"> <x>227</x> <y>150</y> </hint> </hints> </connection> <connection> <sender>delEntry</sender> <signal>clicked()</signal> <receiver>tab</receiver> <slot>deleteCurrentRow()</slot> <hints> <hint type="sourcelabel"> <x>323</x> <y>51</y> </hint> <hint type="destinationlabel"> <x>222</x> <y>52</y> </hint> </hints> </connection> <connection> <sender>addEntry</sender> <signal>clicked()</signal> <receiver>tab</receiver> <slot>addKvRow()</slot> <hints> <hint type="sourcelabel"> <x>307</x> <y>31</y> </hint> <hint type="destinationlabel"> <x>270</x> <y>30</y> </hint> </hints> </connection> </connections> </ui> ����������������������xca_0.9.3/widgets/����������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11753427512�0014035�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/CertDetail.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000013115�11753427512�0016562�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "CertDetail.h" #include "MainWindow.h" #include "distname.h" #include "clicklabel.h" #include "lib/func.h" #include <QtGui/QLabel> #include <QtGui/QPushButton> #include <QtGui/QLineEdit> #include <QtGui/QMessageBox> CertDetail::CertDetail(QWidget *parent) :QDialog(parent) { setupUi(this); setWindowTitle(XCA_TITLE); descr->setReadOnly(true); showConf = false; } void CertDetail::on_showExt_clicked() { if (showConf) { showConf = false; v3extensions->document()->setHtml(exts); showExt->setText(tr("Show config")); } else { showConf = true; v3extensions->document()->setPlainText(conf); showExt->setText(tr("Show extensions")); } } void CertDetail::setX509super(pki_x509super *x) { descr->setText(x->getIntName()); // examine the key pki_key *key= x->getRefKey(); if (key) { privKey->setText(key->getIntName()); if (key->isPrivKey()) { privKey->setGreen(); } else { privKey->setRed(); } } else { privKey->setText(tr("Not available")); privKey->setDisabled(true); privKey->disableToolTip(); } // details of the subject subject->setX509name(x->getSubject()); // V3 extensions extList el = x->getV3ext(); if (el.count() == 0) { tabwidget->removeTab(4); } else { exts = el.getHtml("<br>"); el.genGenericConf(&conf); v3extensions->document()->setHtml(exts); } // Algorithm sigAlgo->setText(x->getSigAlg()); } void CertDetail::setCert(pki_x509 *cert) { image->setPixmap(*MainWindow::certImg); headerLabel->setText(tr("Details of the certificate")); try { setX509super(cert); // No attributes tabwidget->removeTab(3); // examine the signature if ( cert->getSigner() == NULL) { signature->setText(tr("Signer unknown")); signature->setDisabled(true); signature->disableToolTip(); } else if ( cert == cert->getSigner()) { signature->setText(tr("Self signed")); signature->setGreen(); signature->disableToolTip(); } else { signature->setText(cert->getSigner()->getIntName()); signature->setGreen(); } // check trust state trustState->disableToolTip(); if (cert->getEffTrust() == 0) { trustState->setText(tr("Not trusted")); trustState->setRed(); } else { trustState->setText(tr("Trusted")); trustState->setGreen(); } // the serial serialNr->setText(cert->getSerial().toHex()); // details of the issuer issuer->setX509name(cert->getIssuer()); // The dates notBefore->setText(cert->getNotBefore().toPretty()); notBefore->setToolTip(cert->getNotBefore().toPrettyGMT()); notAfter->setText(cert->getNotAfter().toPretty()); notAfter->setToolTip(cert->getNotAfter().toPrettyGMT()); // validation of the Date dateValid->disableToolTip(); if (cert->isRevoked()) { dateValid->setText(tr("Revoked: ") + cert->getRevoked().toPretty()); dateValid->setRed(); dateValid->setToolTip(cert->getRevoked().toPrettyGMT()); } else if (!cert->checkDate()) { dateValid->setText(tr("Not valid")); dateValid->setRed(); } else { dateValid->setGreen(); dateValid->setText(tr("Valid")); } // the fingerprints fpMD5->setText(cert->fingerprint(EVP_md5())); fpSHA1->setText(cert->fingerprint(EVP_sha1())); openssl_error(); } catch (errorEx &err) { QMessageBox::warning(this, XCA_TITLE, err.getString()); } } void CertDetail::setReq(pki_x509req *req) { image->setPixmap(*MainWindow::csrImg); headerLabel->setText(tr("Details of the certificate signing request")); try { setX509super(req); // No issuer tabwidget->removeTab(2); // verification if (!req->verify() ) { signature->setRed(); signature->setText("Failed"); } else { signature->setGreen(); if (req->isSpki()) { signature->setText("SPKAC"); } else { signature->setText("PKCS#10"); } } signature->disableToolTip(); trustState->hide(); fingerprints->hide(); validity->hide(); serialLabel->hide(); serialNr->hide(); // The non extension attributes int cnt = X509_REQ_get_attr_count(req->getReq()); int added = 0; QGridLayout *attrLayout = new QGridLayout(attributes); attrLayout->setAlignment(Qt::AlignTop); attrLayout->setSpacing(6); attrLayout->setMargin(11); for (int i = 0; i<cnt; i++) { int nid; QLabel *label; X509_ATTRIBUTE *att = X509_REQ_get_attr(req->getReq(), i); nid = OBJ_obj2nid(att->object); if (X509_REQ_extension_nid(nid)) { continue; } label = new QLabel(this); label->setText(QString(OBJ_nid2ln(nid))); label->setToolTip(QString(OBJ_nid2sn(nid))); attrLayout->addWidget(label, i, 0); added++; if (att->single) { label = labelFromAsn1String(att->value.single->value.asn1_string); attrLayout->addWidget(label, i, 1); continue; } int count = sk_ASN1_TYPE_num(att->value.set); for (int j=0; j<count; j++) { label = labelFromAsn1String(sk_ASN1_TYPE_value(att->value.set, j)->value.asn1_string); attrLayout->addWidget(label, i, j +1); } } ASN1_IA5STRING *chal = req->spki_challange(); if (chal) { QLabel *label; label = new QLabel(this); label->setText(QString("SPKI Challenge String")); attrLayout->addWidget(label, 0, 0); label = labelFromAsn1String(chal); attrLayout->addWidget(label, 0, 1); added++; } if (!added) { tabwidget->removeTab(2); } openssl_error(); } catch (errorEx &err) { QMessageBox::warning(this, tr(XCA_TITLE), err.getString()); } } QLabel *CertDetail::labelFromAsn1String(ASN1_STRING *s) { QLabel *label; label = new CopyLabel(this); label->setText(asn1ToQString(s)); label->setToolTip(QString(ASN1_tag2str(s->type))); return label; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/CertDetail.h����������������������������������������������������������������������0000664�0000000�0000000�00000001145�11753427512�0016227�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __CERTDETAIL_H #define __CERTDETAIL_H #include "ui_CertDetail.h" #include "lib/pki_x509req.h" #include "lib/pki_x509.h" class pki_x509; class CertDetail: public QDialog, public Ui::CertDetail { Q_OBJECT bool showConf; QString conf, exts; QLabel *labelFromAsn1String(ASN1_STRING *s); void setX509super(pki_x509super *x); public: CertDetail( QWidget *parent); void setCert(pki_x509 *cert); void setReq(pki_x509req *req); private slots: void on_showExt_clicked(); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/CertExtend.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000004677�11753427512�0016624�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "CertExtend.h" #include "lib/base.h" #include "lib/func.h" #include "widgets/validity.h" #include "widgets/MainWindow.h" #include <QtGui/QLabel> #include <QtGui/QLineEdit> #include <QtGui/QComboBox> #include <QtGui/QCheckBox> #include <QtGui/QMessageBox> CertExtend::CertExtend(QWidget *parent, pki_x509 *s) :QDialog(parent) { setupUi(this); setWindowTitle(XCA_TITLE); image->setPixmap(*MainWindow::certImg); validNumber->setText("1"); validRange->setCurrentIndex(2); on_applyTime_clicked(); signer = s; notAfter->setEndDate(true); } void CertExtend::on_applyTime_clicked() { notAfter->setDiff(notBefore, validNumber->text().toInt(), validRange->currentIndex()); } void CertExtend::accept() { if (notBefore->getDate() < signer->getNotBefore()) { QString text = tr("The certificate will be earlier valid than the signer. This is probably not what you want."); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, text, QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Edit times")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); msg.addButton(QMessageBox::Apply)->setText(tr("Continue rollout")); msg.addButton(QMessageBox::Yes)->setText(tr("Adjust date and continue")); switch (msg.exec()) { case QMessageBox::Ok: case QMessageBox::Cancel: return; case QMessageBox::Close: reject(); return; case QMessageBox::Apply: break; case QMessageBox::Yes: notBefore->setDate(signer->getNotBefore()); } } if (notAfter->getDate() > signer->getNotAfter() && !noWellDefinedExpDate->isChecked()) { QString text = tr("The certificate will be longer valid than the signer. This is probably not what you want."); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, text, QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Edit times")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); msg.addButton(QMessageBox::Apply)->setText(tr("Continue rollout")); msg.addButton(QMessageBox::Yes)->setText(tr("Adjust date and continue")); switch (msg.exec()) { case QMessageBox::Ok: case QMessageBox::Cancel: return; case QMessageBox::Close: reject(); return; case QMessageBox::Apply: break; case QMessageBox::Yes: notAfter->setDate(signer->getNotAfter()); } } QDialog::accept(); } �����������������������������������������������������������������xca_0.9.3/widgets/CertExtend.h����������������������������������������������������������������������0000664�0000000�0000000�00000000673�11753427512�0016261�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __CERTEXTEND_H #define __CERTEXTEND_H #include "ui_CertExtend.h" #include "lib/pki_x509.h" class pki_key; class CertExtend: public QDialog, public Ui::CertExtend { Q_OBJECT pki_x509 *signer; public: CertExtend(QWidget *parent, pki_x509 *s); public slots: void on_applyTime_clicked(); void accept(); }; #endif ���������������������������������������������������������������������xca_0.9.3/widgets/CrlDetail.cpp���������������������������������������������������������������������0000664�0000000�0000000�00000005057�11753427512�0016413�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "CrlDetail.h" #include "MainWindow.h" #include "lib/pki_crl.h" #include "widgets/distname.h" #include "widgets/clicklabel.h" #include <QtGui/QLabel> #include <QtGui/QTextEdit> #include <QtGui/QLineEdit> CrlDetail::CrlDetail(MainWindow *mainwin) :QDialog(mainwin) { mw = mainwin; setupUi(this); setWindowTitle(tr(XCA_TITLE)); certList->clear(); certList->setColumnCount(3); QStringList sl; sl << tr("Name") << tr("Serial") << tr("Revocation") << tr("Reason") << tr("Invalidation"); certList->setHeaderLabels(sl); image->setPixmap(*MainWindow::revImg); descr->setReadOnly(true); } void CrlDetail::setCrl(pki_crl *crl) { int numc, i; pki_x509 *iss, *rev; x509rev revit; x509v3ext e1, e2; QStringList sl; iss = crl->getIssuer(); signCheck->disableToolTip(); if (iss != NULL) { issuerIntName->setText(iss->getIntName()); issuerIntName->setGreen(); pki_key *key = iss->getPubKey(); if (crl->verify(key)) { signCheck->setText(crl->getSigAlg()); signCheck->setGreen(); } else { signCheck->setText(tr("Failed")); signCheck->setRed(); } if (key) delete key; } else { issuerIntName->setText(tr("Unknown signer")); issuerIntName->setDisabled(true); issuerIntName->disableToolTip(); signCheck->setText(tr("Verification not possible")); signCheck->setDisabled(true); } descr->setText(crl->getIntName()); lUpdate->setText(crl->getLastUpdate().toPretty()); lUpdate->setToolTip(crl->getLastUpdate().toPrettyGMT()); nUpdate->setText(crl->getNextUpdate().toPretty()); nUpdate->setToolTip(crl->getNextUpdate().toPrettyGMT()); version->setText((++crl->getVersion()).toHex()); issuer->setX509name(crl->getSubject()); numc = crl->numRev(); for (i=0; i<numc; i++) { QTreeWidgetItem *current; a1time a; revit = crl->getRev(i); rev = mw->certs->getByIssSerial(iss, revit.getSerial()); certList->setColumnCount(5); current = new QTreeWidgetItem(certList); if (rev != NULL) { current->setText(0, rev->getIntName() ); } else { current->setText(0, tr("Unknown certificate")); } current->setIcon(0, *pki_x509::icon[2]); current->setText(1, revit.getSerial().toHex()) ; current->setText(2, revit.getDate().toSortable()); current->setText(3, revit.getReason()); a = revit.getInvalDate(); if (!a.isUndefined()) current->setText(4, a.toSortable()); } for (i=0; i<5; i++) certList->resizeColumnToContents(i); certList->setSortingEnabled(true); v3extensions->document()->setHtml(crl->printV3ext()); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/CrlDetail.h�����������������������������������������������������������������������0000664�0000000�0000000�00000000606�11753427512�0016053�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __CRLDETAIL_H #define __CRLDETAIL_H #include "ui_CrlDetail.h" class pki_crl; class MainWindow; class CrlDetail: public QDialog, public Ui::CrlDetail { Q_OBJECT private: MainWindow *mw; public: CrlDetail(MainWindow *mainwin); void setCrl(pki_crl *crl); }; #endif ��������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/ExportDialog.cpp������������������������������������������������������������������0000664�0000000�0000000�00000003103�11753427512�0017137�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "ExportDialog.h" #include "lib/base.h" #include <QtGui/QComboBox> #include <QtGui/QLineEdit> #include <QtGui/QFileDialog> #include <QtGui/QPushButton> #include <QtGui/QMessageBox> #include <QtCore/QStringList> ExportDialog::ExportDialog(QWidget *parent, QString fname) :QDialog(parent) { setupUi(this); filename->setText(fname); setWindowTitle(XCA_TITLE); } void ExportDialog::on_fileBut_clicked() { QString s = QFileDialog::getSaveFileName(this, QString(), filename->text(), filter, NULL, QFileDialog::DontConfirmOverwrite); if (!s.isEmpty()) { QDir::convertSeparators(s); filename->setText(s); } } void ExportDialog::on_exportFormat_activated(int selected) { QString fn = filename->text(); if (selected <0 || selected >= suffixes.size()) return; foreach(QString suffix, suffixes) { if (fn.endsWith(QString(".") +suffix)) { fn = fn.left(fn.length() -suffix.length()) + suffixes[selected]; break; } } filename->setText(fn); } bool ExportDialog::mayWriteFile(const QString &fname) { if (QFile::exists(fname)) { QMessageBox msg(QMessageBox::Warning, XCA_TITLE, tr("The file: '%1' already exists!").arg(fname)); msg.addButton(QMessageBox::Ok)->setText( tr("Overwrite")); msg.addButton(QMessageBox::Cancel)->setText( tr("Do not overwrite")); if (msg.exec() != QMessageBox::Ok) { return false; } } return true; } void ExportDialog::accept() { if (mayWriteFile(filename->text())) QDialog::accept(); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/ExportDialog.h��������������������������������������������������������������������0000664�0000000�0000000�00000004153�11753427512�0016612�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __EXPORTDIALOG_H #define __EXPORTDIALOG_H #include "ui_ExportDialog.h" class ExportDialog: public QDialog, public Ui::ExportDialog { Q_OBJECT protected: QStringList suffixes; QString filter; public: ExportDialog(QWidget *parent, QString fname); static bool mayWriteFile(const QString &fname); public slots: void on_fileBut_clicked(); void on_exportFormat_activated(int); void accept(); }; class ExportDer: public ExportDialog { Q_OBJECT public: ExportDer(QWidget *parent, QString fname, QString _filter) :ExportDialog(parent, fname) { QStringList sl; sl << "PEM" << "DER"; exportFormat->addItems(sl); suffixes << "pem" << "der"; filter = _filter + ";;" + tr("All files ( * )"); formatLabel->setText(tr( "DER is a binary format\n" "PEM is a base64 encoded DER file\n")); } }; class ExportCert: public ExportDialog { Q_OBJECT public: ExportCert(QWidget *parent, QString fname, bool hasKey) :ExportDialog(parent, fname) { QStringList sl; sl << "PEM" << "PEM with Certificate chain" << "PEM all trusted Certificates" << "PEM all Certificates" << "DER" << "PKCS #7" << "PKCS #7 with Certificate chain" << "PKCS #7 all trusted Certificates" << "PKCS #7 all Certificates"; if (hasKey) { sl << "PKCS #12" << "PKCS #12 with Certificate chain" << "PEM Cert + key" << "PEM Cert + PKCS8 key"; } exportFormat->addItems(sl); suffixes << "crt" << "crt" << "crt" << "crt" << "cer" << "p7b" << "p7b" << "p7b" << "p7b" << "p12" << "p12" << "pem" << "pem"; filter = tr("X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )"); formatLabel->setText(tr( "DER is a binary format of the Certificate\n" "PEM is a base64 encoded Certificate\n" "PKCS#7 is an official Certificate exchange format\n" "PKCS#12 is an encrypted official Key-Certificate exchange format\n")); filenameLabel->setText(tr( "Please enter the filename for the certificate.")); label->setText(tr("Certifikate export")); } }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/ExportKey.cpp���������������������������������������������������������������������0000664�0000000�0000000�00000003230�11753427512�0016471�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2009 Christian Hohnstaedt. * * All rights reserved. */ #include "ExportKey.h" #include "lib/base.h" #include <QtGui/QCheckBox> #include <QtGui/QComboBox> #include <QtCore/QStringList> ExportKey::ExportKey(QWidget *parent, QString fname, bool onlypub) :ExportDialog(parent, fname) { onlyPub = onlypub; QStringList sl; sl << "PEM" << "DER"; exportFormat->addItems(sl); suffixes << "pem" << "der"; filter = tr("Private keys ( *.pem *.der *.pk8 );;All files ( * )"); formatLabel->setText(tr( "DER is a binary format of the key without encryption\n" "PEM is a base64 encoded key with optional encryption\n" "PKCS#8 is an encrypted official Key-exchange format")); filenameLabel->setText(tr( "Please enter the filename for the key.")); Ui::ExportKey::setupUi(extraFrame); if (onlyPub) { label->setText(tr("Public key export")); extraFrame->hide(); } else { label->setText(tr("Key export")); exportPrivate->setChecked(true); connect(exportPkcs8, SIGNAL(stateChanged(int)), this, SLOT(canEncrypt())); connect(exportPrivate, SIGNAL(stateChanged(int)), this, SLOT(canEncrypt())); connect(exportFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(canEncrypt())); canEncrypt(); } } void ExportKey::canEncrypt() { if (exportPrivate->isChecked()) { exportPkcs8->setEnabled(true); } else { exportPkcs8->setEnabled(false); exportPkcs8->setChecked(false); } if ((exportFormat->currentText() == "PEM" && exportPrivate->isChecked()) || (exportPkcs8->isEnabled() && exportPkcs8->isChecked())) { encryptKey->setEnabled(true); } else { encryptKey->setDisabled(true); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/ExportKey.h�����������������������������������������������������������������������0000664�0000000�0000000�00000000650�11753427512�0016141�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __EXPORTKEY_H #define __EXPORTKEY_H #include "ui_ExportKey.h" #include "ExportDialog.h" class ExportKey: public ExportDialog, public Ui::ExportKey { Q_OBJECT private: bool onlyPub; public: ExportKey(QWidget *parent, QString fname, bool onlypub); public slots: void canEncrypt(); }; #endif ����������������������������������������������������������������������������������������xca_0.9.3/widgets/ImportMulti.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000020412�11753427512�0017025�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "ImportMulti.h" #include "MainWindow.h" #include "lib/pki_base.h" #include "lib/pki_pkcs7.h" #include "lib/pki_pkcs12.h" #include "lib/pki_crl.h" #include "lib/pki_multi.h" #include "lib/pki_scard.h" #include "lib/pki_evp.h" #include "widgets/CrlDetail.h" #include "widgets/CertDetail.h" #include "widgets/KeyDetail.h" #include <QtGui/QPushButton> #include <QtGui/QMessageBox> #include <QtGui/QLabel> #include <QtGui/QInputDialog> #include <QtCore/QUrl> ImportMulti::ImportMulti(MainWindow *parent) :QDialog(parent) { mainwin = parent; setupUi(this); setWindowTitle(XCA_TITLE); image->setPixmap(*MainWindow::certImg); listView->setEditTriggers(QAbstractItemView::NoEditTriggers); mcont = new db_token(QString(), parent); listView->setModel(mcont); listView->setIconSize(pki_evp::icon[0]->size()); listView->setSelectionMode(QAbstractItemView::ExtendedSelection); connect( listView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(on_butDetails_clicked())); deleteToken->hide(); renameToken->hide(); slotInfo->hide(); setAcceptDrops(true); } void ImportMulti::tokenInfo(slotid s) { slot = s; mcont->setSlot(slot); deleteToken->show(); renameToken->show(); slotInfo->show(); listView->setEditTriggers(QAbstractItemView::EditKeyPressed); pkcs11 p11; QString info = p11.driverInfo(slot); tkInfo ti = p11.tokenInfo(slot); info += tr("\nName: %1\nModel: %2\nSerial: %3"). arg(ti.label()).arg(ti.model()).arg(ti.serial()); slotInfo->setText(info); image->setPixmap(*MainWindow::scardImg); heading->setText(tr("Manage security token")); setAcceptDrops(false); } void ImportMulti::addItem(pki_base *pki) { if (!pki) return; QString cn = pki->getClassName(); if (cn == "pki_x509" || cn == "pki_evp" || cn == "pki_x509req" || cn == "pki_crl" || cn == "pki_temp" || cn == "pki_scard") { mcont->inToCont(pki); } else if (cn == "pki_pkcs7") { pki_pkcs7 *p7 = ( pki_pkcs7 *)pki; for (int i=0; i<p7->numCert(); i++) { addItem(p7->getCert(i)); } delete p7; } else if (cn == "pki_pkcs12") { pki_pkcs12 *p12 = ( pki_pkcs12 *)pki; addItem(p12->getKey()); addItem(p12->getCert()); for (int i=0; i<p12->numCa(); i++) { addItem(p12->getCa(i)); } delete p12; } else if (cn == "pki_multi") { pki_multi *pm = (pki_multi*)pki; pki_base *inner; while ((inner = pm->pull())) addItem(inner); delete pm; } else { QMessageBox::warning(this, XCA_TITLE, tr("The type of the Item '%1' is not recognized"). arg(cn)); } } void ImportMulti::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) event->acceptProposedAction(); } void ImportMulti::dropEvent(QDropEvent *event) { QList<QUrl> urls = event->mimeData()->urls(); QUrl u; QStringList failed; pki_multi *pki = new pki_multi(); foreach(u, urls) { QString s = u.toLocalFile(); int count = pki->count(); pki->probeAnything(s); if (pki->count() == count) failed << s; } importError(failed); addItem(pki); event->acceptProposedAction(); } void ImportMulti::on_butRemove_clicked() { QItemSelectionModel *selectionModel = listView->selectionModel(); QModelIndexList indexes = selectionModel->selectedIndexes(); QModelIndex index; QString items; foreach(index, indexes) { if (index.column() != 0) continue; mcont->remFromCont(index); pki_base *pki = static_cast<pki_base*>(index.internalPointer()); delete pki; } } void ImportMulti::on_butOk_clicked() { while (mcont->rootItem->childCount()) { QModelIndex idx = mcont->index(0, 0, QModelIndex()); import(idx); } accept(); } void ImportMulti::on_butImport_clicked() { QItemSelectionModel *selectionModel = listView->selectionModel(); QModelIndexList indexes = selectionModel->selectedIndexes(); QModelIndex index; foreach(index, indexes) { if (index.column() != 0) continue; import(index); } } void ImportMulti::on_deleteToken_clicked() { QItemSelectionModel *selectionModel = listView->selectionModel(); QModelIndexList indexes = selectionModel->selectedIndexes(); QModelIndex index; QString items; foreach(index, indexes) { if (index.column() != 0) continue; pki_base *pki = static_cast<pki_base*>(index.internalPointer()); try { pki->deleteFromToken(slot); mcont->remFromCont(index); delete pki; } catch (errorEx &err) { mainwin->Error(err); } } } void ImportMulti::on_renameToken_clicked() { QItemSelectionModel *selectionModel = listView->selectionModel(); QModelIndexList indexes = selectionModel->selectedIndexes(); QModelIndex index; QString items; foreach(index, indexes) { if (index.column() != 0) continue; listView->edit(index); break; } } static db_base *select_db(QString cn) { if (cn == "pki_x509") return MainWindow::certs; if (cn == "pki_evp") return MainWindow::keys; if (cn == "pki_scard") return MainWindow::keys; if (cn == "pki_x509req") return MainWindow::reqs; if (cn == "pki_crl") return MainWindow::crls; if (cn == "pki_temp") return MainWindow::temps; return NULL; } pki_base *ImportMulti::import(QModelIndex &idx) { pki_base *pki = static_cast<pki_base*>(idx.internalPointer()); db_base *db; if (!pki) return NULL; if (!mainwin->keys) { mainwin->load_database(); } QString cn = pki->getClassName(); mcont->remFromCont(idx); if (!mainwin->keys) { delete pki; return NULL; } if (cn == "pki_evp") ((pki_evp*)pki)->setOwnPass(pki_evp::ptCommon); db = select_db(cn); if (!db) { QMessageBox::warning(this, XCA_TITLE, tr("The type of the Item '%1' is not recognized"). arg(cn)); delete pki; return NULL; } return db->insert(pki); } void ImportMulti::on_butDetails_clicked() { QItemSelectionModel *selectionModel = listView->selectionModel(); QModelIndex index; if (!selectionModel->selectedIndexes().count()) return; index = selectionModel->selectedIndexes().first(); pki_base *pki = static_cast<pki_base*>(index.internalPointer()); if (!pki) return; QString cn = pki->getClassName(); try { if (cn == "pki_x509"){ CertDetail *dlg; dlg = new CertDetail(mainwin); dlg->setCert((pki_x509 *)pki); dlg->exec(); delete dlg; } else if (cn == "pki_evp" || cn == "pki_scard") { KeyDetail *dlg; dlg = new KeyDetail(mainwin); dlg->setKey((pki_key *)pki); dlg->exec(); delete dlg; } else if (cn == "pki_x509req") { CertDetail *dlg; dlg = new CertDetail(mainwin); dlg->setReq((pki_x509req *)pki); dlg->exec(); delete dlg; } else if (cn == "pki_crl") { CrlDetail *dlg; dlg = new CrlDetail(mainwin); dlg->setCrl((pki_crl *)pki); dlg->exec(); delete dlg; } else if (cn == "pki_temp") { QMessageBox::warning(this, XCA_TITLE, tr("Details of the item '%1' cannot be shown"). arg(cn)); } else QMessageBox::warning(this, XCA_TITLE, tr("The type of the item '%1' is not recognized"). arg(cn)); } catch (errorEx &err) { mainwin->Error(err); } } ImportMulti::~ImportMulti() { QModelIndex idx = listView->currentIndex(); while (idx != QModelIndex()) { mcont->remFromCont(idx); pki_base *pki = static_cast<pki_base*>(idx.internalPointer()); delete pki; idx = listView->currentIndex(); } listView->setModel(NULL); delete mcont; } int ImportMulti::entries() { return mcont->rootItem->childCount(); } void ImportMulti::importError(QStringList failed) { if (failed.count() == 1) { QMessageBox::information(this, XCA_TITLE, tr("The file '%1' did not contain PKI data"). arg(failed[0])); } else if (failed.count() > 1) { QMessageBox::information(this, XCA_TITLE, tr("The %1 files: '%2' did not contain PKI data"). arg(failed.count()). arg(failed.join("', '"))); } } void ImportMulti::execute(int force, QStringList failed) { importError(failed); /* if there is nothing to import don't pop up */ if (entries() == 0) { accept(); return; } /* if there is only 1 item and force is 0 import it silently */ if (entries() == 1 && force == 0) { QModelIndex idx = mcont->index(0, 0, QModelIndex()); pki_base *pki = import(idx); if (pki && !pki_base::suppress_messages) QMessageBox::information(this, XCA_TITLE, pki->getMsg(pki_base::msg_import). arg(pki->getIntName())); accept(); return; } /* the behaviour for more than one item */ exec(); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/ImportMulti.h���������������������������������������������������������������������0000664�0000000�0000000�00000002020�11753427512�0016465�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __IMPORTMULTI_H #define __IMPORTMULTI_H #include "ui_ImportMulti.h" #include "lib/db_token.h" #include "lib/db_base.h" #include <QtCore/QList> class pki_x509; class pki_key; class ImportMulti: public QDialog, private Ui::ImportMulti { Q_OBJECT private: slotid slot; db_token *mcont; MainWindow *mainwin; void importError(QStringList failed); public: ImportMulti(MainWindow *parent); ~ImportMulti(); void addItem(pki_base *pki); pki_base *getSelected(); pki_base *import(QModelIndex &idx); void execute(int force=0, QStringList failed = QStringList()); int entries(); void tokenInfo(slotid s); void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); public slots: void on_butRemove_clicked(); void on_butImport_clicked(); void on_butDetails_clicked(); void on_butOk_clicked(); void on_deleteToken_clicked(); void on_renameToken_clicked(); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/KeyDetail.cpp���������������������������������������������������������������������0000664�0000000�0000000�00000004521�11753427512�0016416�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "KeyDetail.h" #include "MainWindow.h" #include "lib/pki_evp.h" #include "lib/pki_scard.h" #include "widgets/distname.h" #include "widgets/clicklabel.h" #include <QtGui/QLabel> #include <QtGui/QPushButton> #include <QtGui/QLineEdit> KeyDetail::KeyDetail(QWidget *parent) :QDialog(parent) { setupUi(this); setWindowTitle(tr(XCA_TITLE)); image->setPixmap(*MainWindow::keyImg); keyDesc->setReadOnly(true); } #ifndef OPENSSL_NO_EC static QString CurveComment(int nid) { for (size_t i=0; i<pki_evp::num_curves; i++) { if (pki_evp::curves[i].nid == nid) return QString(pki_evp::curves[i].comment); } return QString(); } #endif void KeyDetail::setKey(pki_key *key) { keyDesc->setText(key->getIntName()); keyLength->setText(key->length()); keyPrivEx->disableToolTip(); if (!key->isToken()) cardBox->hide(); tlHeader->setText(tr("Details of the %1 key").arg(key->getTypeString())); if (key->isPubKey()) { keyPrivEx->setText(tr("Not available")); keyPrivEx->setRed(); } else if (key->isToken()) { image->setPixmap(*MainWindow::scardImg); pki_scard *card = (pki_scard *)key; cardBox->setTitle(tr("Token") +" [" +card->getCardLabel() +"]"); cardManufacturer->setText(card->getManufacturer() + " " + card->getModel()); cardSerial->setText(card->getSerial()); keyPrivEx->setText(tr("Security token ID:%1").arg(card->getId())); keyBox->setTitle(tr("Key") + " [" + card->getLabel() + "]"); } else { keyPrivEx->setText(tr("Available")); keyPrivEx->setGreen(); } switch (key->getKeyType()) { case EVP_PKEY_RSA: keyPubEx->setText(key->pubEx()); keyModulus->setText(key->modulus()); break; case EVP_PKEY_DSA: tlPubEx->setText(tr("Sub prime")); tlModulus->setText(tr("Public key")); tlPrivEx->setText(tr("Private key")); keyPubEx->setText(key->subprime()); keyModulus->setText(key->pubkey()); break; #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: int nid; nid = key->ecParamNid(); tlModulus->setText(tr("Public key")); tlPrivEx->setText(tr("Private key")); tlPubEx->setText(tr("Curve name")); keyPubEx->setText(OBJ_nid2sn(nid)); keyPubEx->setToolTip(CurveComment(nid)); keyModulus->setText(key->ecPubKey()); break; #endif default: tlHeader->setText(tr("Unknown key")); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/KeyDetail.h�����������������������������������������������������������������������0000664�0000000�0000000�00000000527�11753427512�0016065�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2009 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __KEYDETAIL_H #define __KEYDETAIL_H #include "ui_KeyDetail.h" class pki_key; class KeyDetail: public QDialog, private Ui::KeyDetail { Q_OBJECT public: KeyDetail(QWidget *parent); void setKey(pki_key *key); }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/MW_database.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000025544�11753427512�0016722�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "MainWindow.h" #include "lib/exception.h" #include "lib/pki_evp.h" #include "lib/pki_scard.h" #include <QtCore/QDir> #include <QtGui/QStatusBar> #include <QtGui/QMessageBox> #include "lib/db_base.h" #include "lib/func.h" #include "widgets/ImportMulti.h" int MainWindow::init_database() { int ret = 2; fprintf(stderr, "Opening database: %s\n", QString2filename(dbfile)); keys = NULL; reqs = NULL; certs = NULL; temps = NULL; crls = NULL; certView->setRootIsDecorated(db_x509::treeview); try { ret = initPass(); if (ret == 2) return ret; keys = new db_key(dbfile, this); reqs = new db_x509req(dbfile, this); certs = new db_x509(dbfile, this); temps = new db_temp(dbfile, this); crls = new db_crl(dbfile, this); } catch (errorEx &err) { Error(err); dbfile = ""; return ret; } mandatory_dn = ""; string_opt = QString("MASK:0x2002"); ASN1_STRING_set_default_mask_asc((char*)CCHAR(string_opt)); hashBox::resetDefault(); pkcs11path = getDefaultPkcs11Lib(); workingdir = QDir::currentPath(); setOptFlags((QString())); try { pkcs11_lib p(pkcs11path); } catch (errorEx &e) { pkcs11path = QString(); } connect( keys, SIGNAL(newKey(pki_key *)), certs, SLOT(newKey(pki_key *)) ); connect( keys, SIGNAL(delKey(pki_key *)), certs, SLOT(delKey(pki_key *)) ); connect( keys, SIGNAL(newKey(pki_key *)), reqs, SLOT(newKey(pki_key *)) ); connect( keys, SIGNAL(delKey(pki_key *)), reqs, SLOT(delKey(pki_key *)) ); connect( certs, SIGNAL(connNewX509(NewX509 *)), this, SLOT(connNewX509(NewX509 *)) ); connect( reqs, SIGNAL(connNewX509(NewX509 *)), this, SLOT(connNewX509(NewX509 *)) ); connect( reqs, SIGNAL(newCert(pki_x509req *)), certs, SLOT(newCert(pki_x509req *)) ); connect( temps, SIGNAL(newCert(pki_temp *)), certs, SLOT(newCert(pki_temp *)) ); connect( temps, SIGNAL(newReq(pki_temp *)), reqs, SLOT(newItem(pki_temp *)) ); keyView->setIconSize(pki_evp::icon[0]->size()); reqView->setIconSize(pki_x509req::icon[0]->size()); certView->setIconSize(pki_x509::icon[0]->size()); tempView->setIconSize(pki_temp::icon->size()); crlView->setIconSize(pki_crl::icon->size()); keyView->setModel(keys); reqView->setModel(reqs); certView->setModel(certs); tempView->setModel(temps); crlView->setModel(crls); try { db mydb(dbfile); char *p; if (!mydb.find(setting, "workingdir")) { if ((p = (char *)mydb.load(NULL))) { workingdir = p; free(p); } } mydb.first(); if (!mydb.find(setting, "pkcs11path")) { if ((p = (char *)mydb.load(NULL))) { pkcs11path = p; free(p); } } mydb.first(); if (!mydb.find(setting, "default_hash")) { if ((p = (char *)mydb.load(NULL))) { hashBox::setDefault(p); free(p); } } mydb.first(); if (!mydb.find(setting, "mandatory_dn")) { if ((p = (char *)mydb.load(NULL))) { mandatory_dn = p; free(p); } } // what a stupid idea.... mydb.first(); if (!mydb.find(setting, "multiple_key_use")) { mydb.erase(); } mydb.first(); if (!mydb.find(setting, "string_opt")) { if ((p = (char *)mydb.load(NULL))) { string_opt = p; free(p); } } mydb.first(); if (!mydb.find(setting, "suppress")) { if ((p = (char *)mydb.load(NULL))) { QString x = p; free(p); if (x == "1") pki_base::suppress_messages = 1; } } mydb.first(); if (!mydb.find(setting, "optionflags")) { if ((p = (char *)mydb.load(NULL))) { setOptFlags((QString(p))); free(p); } } ASN1_STRING_set_default_mask_asc((char*)CCHAR(string_opt)); mydb.first(); if (!mydb.find(setting, "mw_geometry")) { db_header_t h; if ((p = (char *)mydb.load(&h))) { if (h.version == 1) { QByteArray ba; ba = QByteArray::fromRawData(p, h.len); int w, h, i; w = db::intFromData(ba); h = db::intFromData(ba); i = db::intFromData(ba); resize(w,h); if (i != -1) tabView->setCurrentIndex(i); } free(p); } } } catch (errorEx &err) { Error(err); return ret; } setWindowTitle(tr(XCA_TITLE)); setItemEnabled(true); if (pki_evp::passwd.isNull()) QMessageBox::information(this, XCA_TITLE, tr("Using or exporting private keys will not be possible without providing the correct password")); dbindex->setText(tr("Database") + ":" + dbfile); load_engine(); return ret; } void MainWindow::dump_database() { QString dirname = QFileDialog::getExistingDirectory(this, tr(XCA_TITLE), getPath()); if (dirname.isEmpty()) return; QDir d(dirname); if ( ! d.exists() && !d.mkdir(dirname)) { errorEx err("Could not create '" + dirname + "'"); MainWindow::Error(err); return; } printf("Dumping to %s\n", CCHAR(dirname)); try { keys->dump(dirname); certs->dump(dirname); temps->dump(dirname); crls->dump(dirname); reqs->dump(dirname); } catch (errorEx &err) { MainWindow::Error(err); } } void MainWindow::undelete() { ImportMulti *dlgi = new ImportMulti(this); db_header_t head; db mydb(dbfile); for (mydb.first(DBFLAG_OUTDATED); !mydb.eof(); mydb.next(DBFLAG_OUTDATED)) { mydb.get_header(&head); if (head.flags & DBFLAG_DELETED) { pki_base *item; unsigned char *p = NULL; QString name = QString::fromUtf8(head.name); switch (head.type) { case asym_key: item = new pki_evp(name); break; case x509_req: item = new pki_x509req(name); break; case x509: item = new pki_x509(name); break; case revokation: item = new pki_crl(name); break; case tmpl: item = new pki_temp(name); break; case smartCard: item = new pki_scard(name); break; default: continue; } try { p = mydb.load(&head); item->fromData(p, &head); dlgi->addItem(item); } catch (errorEx &err) { Error(err); delete item; } free(p); } } if (dlgi->entries() > 0) { dlgi->execute(1); } else { QMessageBox::information(this, XCA_TITLE, tr("No deleted items found")); } delete dlgi; } int MainWindow::open_default_db() { if (!dbfile.isEmpty()) return 0; FILE *fp = fopen(QString2filename(getUserSettingsDir() + QDir::separator() + "defaultdb"), "r"); if (!fp) return 0; char buff[256]; size_t len = fread(buff, 1, 255, fp); fclose(fp); buff[len] = 0; dbfile = filename2QString(buff).trimmed(); if (QFile::exists(dbfile)) return init_database(); return 0; } void MainWindow::default_database() { QFileInfo fi(dbfile); QString dir = getUserSettingsDir(); FILE *fp; QDir d; d.mkpath(dir); fp = fopen(QString2filename(dir +QDir::separator() +"defaultdb"), "w"); if (fp) { QByteArray ba; ba = filename2bytearray(fi.canonicalFilePath() + "\n"); fwrite(ba.constData(), ba.size(), 1, fp); fclose(fp); } } void MainWindow::close_database() { QByteArray ba; if (!dbfile.isEmpty()) { ba += db::intToData(size().width()); ba += db::intToData(size().height()); ba += db::intToData(tabView->currentIndex()); db mydb(dbfile); mydb.set((const unsigned char *)ba.constData(), ba.size(), 1, setting, "mw_geometry"); } setItemEnabled(false); dbindex->clear(); keyView->setModel(NULL); reqView->setModel(NULL); certView->setModel(NULL); tempView->setModel(NULL); crlView->setModel(NULL); if (crls) delete(crls); if (reqs) delete(reqs); if (certs) delete(certs); if (temps) delete(temps); if (keys) delete(keys); reqs = NULL; certs = NULL; temps = NULL; keys = NULL; pki_evp::passwd.cleanse(); pki_evp::passwd = QByteArray(); if (!crls) return; crls = NULL; try { db mydb(dbfile); mydb.shrink( DBFLAG_OUTDATED | DBFLAG_DELETED ); } catch (errorEx &err) { MainWindow::Error(err); } pkcs11::remove_libs(); enableTokenMenu(pkcs11::loaded()); } /* Asymetric Key buttons */ void MainWindow::on_BNnewKey_clicked(void) { if (keys) keys->newItem(); } void MainWindow::on_BNdeleteKey_clicked(void) { if (keys) keys->deleteSelectedItems(keyView); } void MainWindow::on_BNdetailsKey_clicked(void) { if (keys) keys->showSelectedItems(keyView); } void MainWindow::on_BNimportKey_clicked(void) { if (keys) keys->load(); } void MainWindow::on_BNexportKey_clicked(void) { if (keys) keys->storeSelectedItems(keyView); } void MainWindow::on_keyView_doubleClicked(const QModelIndex &m) { if (keys) keys->showItem(keyView->getIndex(m)); } void MainWindow::on_reqView_doubleClicked(const QModelIndex &m) { if (reqs) reqs->showItem(reqView->getIndex(m)); } void MainWindow::on_certView_doubleClicked(const QModelIndex &m) { if (certs) certs->showItem(certView->getIndex(m)); } void MainWindow::on_tempView_doubleClicked(const QModelIndex &m) { if (temps) temps->showItem(tempView->getIndex(m)); } void MainWindow::on_crlView_doubleClicked(const QModelIndex &m) { if (crls) crls->showItem(crlView->getIndex(m)); } void MainWindow::on_BNimportPFX_clicked(void) { if (certs) certs->loadPKCS12(); } /* Certificate request buttons */ void MainWindow::on_BNnewReq_clicked(void) { if (reqs) reqs->newItem(); } void MainWindow::on_BNdeleteReq_clicked(void) { if (reqs) reqs->deleteSelectedItems(reqView); } void MainWindow::on_BNdetailsReq_clicked(void) { if (reqs) reqs->showSelectedItems(reqView); } void MainWindow::on_BNimportReq_clicked(void) { if (reqs) reqs->load(); } void MainWindow::on_BNexportReq_clicked(void) { if(reqs) reqs->storeSelectedItems(reqView); } /* Certificate buttons */ void MainWindow::on_BNnewCert_clicked(void) { if (certs) certs->newItem(); } void MainWindow::on_BNdeleteCert_clicked(void) { if (certs) certs->deleteSelectedItems(certView); } void MainWindow::on_BNdetailsCert_clicked(void) { if (certs) certs->showSelectedItems(certView); } void MainWindow::on_BNimportCert_clicked(void) { if (certs) certs->load(); } void MainWindow::on_BNexportCert_clicked(void) { if(certs) certs->storeSelectedItems(certView); } void MainWindow::on_BNimportPKCS12_clicked(void) { if(certs) certs->loadPKCS12(); } void MainWindow::on_BNimportPKCS7_clicked(void) { if(certs) certs->loadPKCS7(); } void MainWindow::on_BNviewState_clicked(void) { if(certs) certs->changeView(); certView->setRootIsDecorated(db_x509::treeview); } /* Template buttons */ void MainWindow::on_BNdeleteTemp_clicked(void) { if (temps) temps->deleteSelectedItems(tempView); } void MainWindow::on_BNchangeTemp_clicked(void) { if (temps) temps->showSelectedItems(tempView); } void MainWindow::on_BNimportTemp_clicked(void) { if (temps) temps->load(); } void MainWindow::on_BNexportTemp_clicked(void) { if(temps) temps->storeSelectedItems(tempView); } void MainWindow::on_BNnewTemp_clicked(void) { if (temps) temps->newItem(); } /* CRL buttons */ void MainWindow::on_BNdeleteCrl_clicked(void) { if (crls) crls->deleteSelectedItems(crlView); } void MainWindow::on_BNimportCrl_clicked(void) { if (crls) crls->load(); } void MainWindow::on_BNexportCrl_clicked(void) { if (crls) crls->storeSelectedItems(crlView); } void MainWindow::on_BNdetailsCrl_clicked(void) { if(crls) crls->showSelectedItems(crlView); } ������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/MW_help.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000011727�11753427512�0016104�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "MainWindow.h" #include <QtGui/QApplication> #include <QtGui/QMimeSource> #include <QtGui/QPixmap> #include <QtGui/QLabel> #include "ui_About.h" #include "ui_Help.h" #include "lib/func.h" void MainWindow::cmd_version() { fprintf(stderr, XCA_TITLE " Version " VER "\n"); exitApp = 1; } void MainWindow::cmd_help(const char* msg) { exitApp = 1; fprintf(stderr, XCA_TITLE " Version " VER "\n" "\n" " -v show version information and exit\n" " -h shows this help screen and exit\n" " -k expect all following non-option arguments to be RSA keys\n" " -r expect all following non-option arguments to be\n" " Certificate signing requests or SPKAC requests\n" " -c expect all following non-option arguments to be Certificates\n" " -p expect all following non-option arguments to be PKCS#12 files\n" " -7 expect all following non-option arguments to be PKCS#7 files\n" " -l expect all following non-option arguments to be Revocation lists\n" " -t expect all following non-option arguments to be XCA templates\n" " -P expect all following non-option arguments to be PEM encoded 'thingies'\n" " -d expect the following argument to be the database name to use\n" " -x Exit after processing all commandline options\n\n"); if(msg) { fprintf(stderr, "Cmdline Error: %s\n", msg); } } void MainWindow::about() { Ui::About ui; QDialog *about = new QDialog(this, 0); QString openssl, qt, cont, version; openssl = SSLeay_version(SSLEAY_VERSION); qt = qVersion(); if (openssl != OPENSSL_VERSION_TEXT || qt != QT_VERSION_STR) { version = QString("<table border=0 width=500><tr>" "<td>Compile time:</td>" "<td>"OPENSSL_VERSION_TEXT"</td>" "<td>QT version: "QT_VERSION_STR"</td>" "</tr><tr>" "<td>Run time:</td>" "<td>%1</td>" "<td>QT version: %2</td>" "</tr></table>").arg(openssl).arg(qt); } else { version = QString("%1<br>QT version: %2").arg(openssl).arg(qt); } ui.setupUi(about); cont = QString( "<p><h3><center><u>XCA</u></center></h3>" "<p>Copyright 2001 - 2012 by Christian Hohnstädt\n" "<p>Version : <b>" VER "</b>" "<p>%1" "<hr><table border=0>" "<tr><th align=left>Christian Hohnstädt</th><td><u><christian@hohnstaedt.de></u></td></tr>" "<tr><td></td><td>Programming, Translation and Testing</td></tr>" "<tr><th align=left>Kerstin Steinhauff</th><td><u><tine@kerstine.de></td></u></tr>" "<tr><td></td><td>Arts and Graphics</td></tr>" "<tr><th align=left>Ilya Kozhevnikov</th><td><u><ilya@ef.unn.ru></u></td></tr>" "<tr><td></td><td>Windows registry stuff</td></tr>" "<tr><th align=left>Wolfgang Glas</th><td><u><wolfgang.glas@ev-i.at></u></td></tr>" "<tr><td></td><td>SPKAC support and Testing</td></tr>" "<tr><th align=left>Geoff Beier</th><td><u><geoffbeier@gmail.com></u></td></tr>" "<tr><td></td><td>MAC OSX support and Testing</td></tr>" "</table><hr><center><u><b>General support</b></u></center>" "<p><table>" "<tr><td><b>Mark Foster</b></td><td><u><mark@foster.cc></u></td></tr>" "<tr><td><b>Thorsten Weiss</b></td><td><u><weiss2@gmx.de></u></td></tr>" "<tr><td><b>Oobj</b></td><td><u><www.oobj.com.br></u></td></tr>" "<tr><td><b>Frank Isemann</b></td><td><u><isemannf@firflabs.net></u></td></tr>" "</table><hr><center><u><b>Translations</b></u></center>" "<p><table>" "<tr><th>German</th><td>Christian Hohnstädt</td></tr>" "<tr><th>Russian</th><td>Pavel Belly <pavel.belly@gmail.com></td></tr>" "<tr><th>French</th><td>Patrick Monnerat <Patrick.Monnerat@datasphere.ch></td></tr>" "</table>"). arg(version); about->setWindowTitle(XCA_TITLE); ui.image->setPixmap( *keyImg ); ui.image1->setPixmap( *certImg ); ui.textbox->setHtml(cont); about->exec(); delete about; } void MainWindow::donations() { Ui::About ui; QDialog *d = new QDialog(this, 0); ui.setupUi(d); QString cont; cont.sprintf("<p><h3><center><u>XCA</u></center></h3>" "<p>This program is free software." "<p>It doesn't bother you with Pop-Ups, Countdown-Timers, " "commercials or any type of 'Register Now' buttons. " "Nor are there any constraints or any limited functionality." "<p>Everybody who wants to support my work at XCA may use " "my PayPal account: <b><christian@hohnstaedt.de></b> " "for a donation." "<p>Every donator will in return be honored in the about dialog " "of the next version." ); d->setWindowTitle(tr(XCA_TITLE)); ui.image->setPixmap( *keyImg ); ui.image1->setPixmap( *certImg ); ui.textbox->setHtml(cont); d->exec(); } void MainWindow::help() { QDialog *h = new QDialog(this, 0); QString path, uri; Ui::Help ui; ui.setupUi(h); path = QString("file://"); #ifdef WIN32 path += "/"; #endif path += getDocDir() + "/"; #ifdef WIN32 path = path.replace("\\","/"); #endif uri = path + "xca.html"; ui.textbox->setSource(QUrl(uri)); ui.textbox->setSearchPaths(QStringList(path)); h->setWindowTitle(tr(XCA_TITLE)); h->show(); } �����������������������������������������xca_0.9.3/widgets/MW_menu.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000015771�11753427512�0016123�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "MainWindow.h" #include "PwDialog.h" #include "Options.h" #include "lib/load_obj.h" #include "lib/pass_info.h" #include "lib/pkcs11.h" #include "lib/pki_evp.h" #include "lib/pki_scard.h" #include "lib/func.h" #include "ui_Options.h" #include "widgets/hashBox.h" #include <QtGui/QApplication> #include <QtGui/QClipboard> #include <QtGui/QMenuBar> #include <QtGui/QMessageBox> void MainWindow::init_menu() { QMenu *file, *help, *import, *token; file = menuBar()->addMenu(tr("&File")); file->addAction(tr("&New DataBase"), this, SLOT(new_database()), QKeySequence::New); file->addAction(tr("&Open DataBase"), this, SLOT(load_database()), QKeySequence::Open); file->addAction(tr("Generate DH parameter"), this, SLOT(generateDHparam())); acList += file->addAction(tr("Set as default DataBase"), this, SLOT(default_database())); acList += file->addAction(tr("&Close DataBase"), this, SLOT(close_database()), QKeySequence(QKeySequence::Close)); acList += file->addAction(tr("&Dump DataBase"), this, SLOT(dump_database())); acList += file->addAction(tr("C&hange DataBase password"), this, SLOT(changeDbPass())); acList += file->addAction(tr("&Import old db_dump"), this, SLOT(import_dbdump())); acList += file->addAction(tr("&Undelete items"), this, SLOT(undelete())); file->addSeparator(); acList += file->addAction(tr("Options"), this, SLOT(setOptions())); file->addSeparator(); file->addAction(tr("Exit"), qApp, SLOT(quit()), Qt::ALT+Qt::Key_F4); import = menuBar()->addMenu(tr("I&mport")); import->addAction(tr("Keys"), this, SLOT(on_BNimportKey_clicked()) ); import->addAction(tr("Requests"), this, SLOT(on_BNimportReq_clicked()) ); import->addAction(tr("Certificates"), this, SLOT(on_BNimportCert_clicked()) ); import->addAction(tr("PKCS#12"), this, SLOT(on_BNimportPKCS12_clicked()) ); import->addAction(tr("PKCS#7"), this, SLOT(on_BNimportPKCS7_clicked()) ); import->addAction(tr("Template"), this, SLOT(on_BNimportTemp_clicked()) ); import->addAction(tr("Revocation list"), this, SLOT(on_BNimportCrl_clicked()) ); import->addAction(tr("PEM file"), this, SLOT(loadPem()) ); import->addAction(tr("paste PEM file"), this, SLOT(pastePem()) ); token = menuBar()->addMenu(tr("&Token")); token->addAction(tr("&Manage Security token"), this, SLOT(manageToken())); token->addAction(tr("&Init Security token"), this, SLOT(initToken())); token->addAction(tr("&Change PIN"), this, SLOT(changePin()) ); token->addAction(tr("Change &SO PIN"), this, SLOT(changeSoPin()) ); token->addAction(tr("Init PIN"), this, SLOT(initPin()) ); help = menuBar()->addMenu(tr("&Help") ); help->addAction(tr("&Content"), this, SLOT(help()), QKeySequence::HelpContents); help->addAction(tr("&About"), this, SLOT(about()) ); help->addAction(tr("Donations"), this, SLOT(donations()) ); wdList += import; scardList += token; } int MainWindow::changeDB(QString fname) { if (fname.isEmpty()) return 1; close_database(); homedir = fname.mid(0, fname.lastIndexOf(QDir::separator())); dbfile = fname; return init_database(); } void MainWindow::new_database() { load_db l; QString selectedFilter; QString fname = QFileDialog::getSaveFileName(this, l.caption, homedir, l.filter, &selectedFilter, QFileDialog::DontConfirmOverwrite); // make sure that, if the 3 letter extension was left selected // in Qt's OS X file open dialog, // the filename actually ends with that extension. // Otherwise usability breaks in jarring ways. changeDB(getFullFilename(fname, selectedFilter)); } void MainWindow::load_database() { load_db l; QString fname = QFileDialog::getOpenFileName(this, l.caption, homedir, l.filter); changeDB(fname); } void MainWindow::import_dbdump() { extern int read_dump(const char *, db_base **, char *, int); Passwd pass; char buf[50]; db_base *dbl[] = { keys, reqs, certs, temps, crls }; if (!keys) return; QString file = QFileDialog::getOpenFileName(this, tr(XCA_TITLE), homedir, tr("Database dump ( *.dump );;All files ( * )")); if (file.isEmpty()) return; pass_info p(tr("Import password"), tr("Please enter the password of the old database"), this); if (PwDialog::execute(&p, &pass) != 1) return; try { read_dump(CCHAR(file), dbl, buf, sizeof(buf)); if (pki_evp::md5passwd(pass) != buf) { int ret = QMessageBox::warning(this, tr(XCA_TITLE), tr("Password verification error. Ignore keys ?"), tr("Import anyway"), tr("Cancel")); if (ret) return; } pki_evp::oldpasswd = pass; read_dump(CCHAR(file), dbl, NULL, 0); pki_evp::oldpasswd.cleanse(); } catch (errorEx &err) { Error(err); } } void MainWindow::setOptions() { Options *opt = new Options(this); opt->setDnString(mandatory_dn); opt->setStringOpt(string_opt); opt->setupPkcs11Provider(pkcs11path); opt->suppress->setCheckState( pki_base::suppress_messages ? Qt::Checked : Qt::Unchecked); opt->noColorize->setCheckState( pki_x509::dont_colorize_expiries ? Qt::Checked : Qt::Unchecked); if (!opt->exec()) { delete opt; enableTokenMenu(pkcs11::loaded()); return; } QString alg = opt->hashAlgo->currentHashName(); db mydb(dbfile); mydb.set((const unsigned char *)CCHAR(alg), alg.length()+1, 1, setting, "default_hash"); hashBox::setDefault(alg); mandatory_dn = opt->getDnString(); mydb.set((const unsigned char *)CCHAR(mandatory_dn), mandatory_dn.length()+1, 1, setting, "mandatory_dn"); QString flags = getOptFlags(); pki_base::suppress_messages = opt->suppress->checkState(); pki_x509::dont_colorize_expiries = opt->noColorize->checkState(); if (flags != getOptFlags()) { flags = getOptFlags(); mydb.set((const unsigned char *)(CCHAR(flags)), flags.length()+1, 1, setting, "optionflags"); mydb.first(); if (!mydb.find(setting, "suppress")) mydb.erase(); } if (opt->getStringOpt() != string_opt) { string_opt = opt->getStringOpt(); ASN1_STRING_set_default_mask_asc((char *)CCHAR(string_opt)); mydb.set((const unsigned char *)CCHAR(string_opt), string_opt.length()+1, 1, setting,"string_opt"); } QString newpath = opt->getPkcs11Provider(); if (newpath != pkcs11path) { pkcs11path = newpath; mydb.set((const unsigned char *) CCHAR(pkcs11path), pkcs11path.length()+1, 1,setting, "pkcs11path"); } enableTokenMenu(pkcs11::loaded()); delete opt; } /* Documentation of the flags field: * S: Suppress success messages * C: Don't colorize success messages */ void MainWindow::setOptFlags(QString flags) { int s = flags.size(), i; QByteArray b = flags.toAscii(); pki_base::suppress_messages = false; pki_x509::dont_colorize_expiries = false; for (i=0; i<s; i++) { switch (b[i]) { case 'S': pki_base::suppress_messages = true; break; case 'C': pki_x509::dont_colorize_expiries = true; break; default: abort(); } } } QString MainWindow::getOptFlags() { QString flags; if (pki_base::suppress_messages) flags += "S"; if (pki_x509::dont_colorize_expiries) flags += "C"; return flags; } �������xca_0.9.3/widgets/MainWindow.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000047144�11753427512�0016627�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ //#define MDEBUG #include "MainWindow.h" #include "ImportMulti.h" #include "lib/Passwd.h" #include <openssl/rand.h> #include <QtGui/QApplication> #include <QtGui/QClipboard> #include <QtGui/QMessageBox> #include <QtGui/QLabel> #include <QtGui/QPushButton> #include <QtGui/QListView> #include <QtGui/QLineEdit> #include <QtGui/QTextBrowser> #include <QtGui/QStatusBar> #include <QtCore/QList> #include <QtGui/QInputDialog> #include "lib/exception.h" #include "lib/pki_evp.h" #include "lib/pki_scard.h" #include "lib/pki_pkcs12.h" #include "lib/pki_multi.h" #include "lib/load_obj.h" #include "lib/pass_info.h" #include "lib/func.h" #include "lib/pkcs11.h" #include "ui_About.h" #include "PwDialog.h" QPixmap *MainWindow::keyImg = NULL, *MainWindow::csrImg = NULL, *MainWindow::certImg = NULL, *MainWindow::tempImg = NULL, *MainWindow::nsImg = NULL, *MainWindow::revImg = NULL, *MainWindow::appIco = NULL, *MainWindow::scardImg = NULL, *MainWindow::doneIco = NULL, *MainWindow::warnIco = NULL; db_key *MainWindow::keys = NULL; db_x509req *MainWindow::reqs = NULL; db_x509 *MainWindow::certs = NULL; db_temp *MainWindow::temps = NULL; db_crl *MainWindow::crls = NULL; NIDlist *MainWindow::eku_nid = NULL; NIDlist *MainWindow::dn_nid = NULL; NIDlist *MainWindow::aia_nid = NULL; QString MainWindow::mandatory_dn; static const int x962_curve_nids[] = { NID_X9_62_prime192v1, NID_X9_62_prime192v2, NID_X9_62_prime192v3, NID_X9_62_prime239v1, NID_X9_62_prime239v2, NID_X9_62_prime239v3, NID_X9_62_prime256v1, NID_X9_62_c2pnb163v1, NID_X9_62_c2pnb163v2, NID_X9_62_c2pnb163v3, NID_X9_62_c2pnb176v1, NID_X9_62_c2tnb191v1, NID_X9_62_c2tnb191v2, NID_X9_62_c2tnb191v3, NID_X9_62_c2pnb208w1, NID_X9_62_c2tnb239v1, NID_X9_62_c2tnb239v2, NID_X9_62_c2tnb239v3, NID_X9_62_c2pnb272w1, NID_X9_62_c2pnb304w1, NID_X9_62_c2tnb359v1, NID_X9_62_c2pnb368w1, NID_X9_62_c2tnb431r1 }; static const int other_curve_nids[] = { NID_sect163k1, NID_sect163r2, NID_sect233k1, NID_sect233r1, NID_sect283k1, NID_sect283r1, NID_sect409k1, NID_sect409r1, NID_sect571k1, NID_sect571r1, NID_secp224r1, NID_secp384r1, NID_secp521r1 }; static void init_curves() { #ifndef OPENSSL_NO_EC pki_evp::num_curves = EC_get_builtin_curves(NULL, 0); pki_evp::curves = (EC_builtin_curve*)OPENSSL_malloc( (int)(sizeof(EC_builtin_curve) *pki_evp::num_curves)); if (!pki_evp::curves) return; EC_get_builtin_curves(pki_evp::curves, pki_evp::num_curves); pki_evp::curve_flags = (unsigned char *)OPENSSL_malloc(pki_evp::num_curves); if (!pki_evp::curve_flags) return; for (size_t i=0; i< pki_evp::num_curves; i++) { size_t j; pki_evp::curve_flags[i] = 0; for (j=0; j<ARRAY_SIZE(x962_curve_nids); j++) { if (x962_curve_nids[j] == pki_evp::curves[i].nid) { pki_evp::curve_flags[i] = CURVE_X962; break; } } if (pki_evp::curve_flags[i]) continue; for (j=0; j<ARRAY_SIZE(other_curve_nids); j++) { if (other_curve_nids[j] == pki_evp::curves[i].nid) { pki_evp::curve_flags[i] = CURVE_OTHER; break; } } } #endif } void MainWindow::enableTokenMenu(bool enable) { foreach(QWidget *w, scardList) { w->setEnabled(enable); } } void MainWindow::load_engine() { try { pkcs11::load_libs(pkcs11path, false); } catch (errorEx &err) { Error(err); } enableTokenMenu(pkcs11::loaded()); } static QByteArray fileNameEncoderFunc(const QString &fileName) { return filename2bytearray(fileName); } static QString fileNAmeDecoderFunc(const QByteArray &localFileName) { return filename2QString(localFileName.constData()); } MainWindow::MainWindow(QWidget *parent ) :QMainWindow(parent) { QFile::setEncodingFunction(fileNameEncoderFunc); QFile::setDecodingFunction(fileNAmeDecoderFunc); dbindex = new QLabel(); dbindex->setFrameStyle(QFrame::Plain | QFrame::NoFrame); dbindex->setMargin(6); statusBar()->addWidget(dbindex, 1); setupUi(this); setWindowTitle(tr(XCA_TITLE)); wdList << keyButtons << reqButtons << certButtons << tempButtons << crlButtons; init_menu(); setItemEnabled(false); init_images(); homedir = getHomeDir(); init_curves(); #ifdef MDEBUG CRYPTO_malloc_debug_init(); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); fprintf(stderr, "malloc() debugging on.\n"); #endif ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); /* read in all our own OIDs */ initOIDs(); eku_nid = read_nidlist("eku.txt"); dn_nid = read_nidlist("dn.txt"); aia_nid = read_nidlist("aia.txt"); setAcceptDrops(true); } void MainWindow::dropEvent(QDropEvent *event) { QList<QUrl> urls = event->mimeData()->urls(); QUrl u; ImportMulti *dlgi = new ImportMulti(this); QStringList failed; foreach(u, urls) { QString s = u.toLocalFile(); pki_multi *pki = probeAnything(s); if (pki && !pki->count()) failed << s; dlgi->addItem(pki); } dlgi->execute(1, failed); delete dlgi; event->acceptProposedAction(); } void MainWindow::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) event->acceptProposedAction(); } void MainWindow::setItemEnabled(bool enable) { foreach(QWidget *w, wdList) { w->setEnabled(enable); } foreach(QAction *a, acList) { a->setEnabled(enable); } enableTokenMenu(pkcs11::loaded()); } /* creates a new nid list from the given filename */ NIDlist *MainWindow::read_nidlist(QString name) { NIDlist nl; name = QDir::separator() + name; #ifndef WIN32 /* first try $HOME/xca/ */ nl = readNIDlist(getUserSettingsDir() + name); #if !defined(Q_WS_MAC) if (nl.count() == 0){ /* next is /etx/xca/... */ nl = readNIDlist(QString(ETC) + name); } #endif #endif if (nl.count() == 0) { /* look at /usr/(local/)share/xca/ */ nl = readNIDlist(getPrefix() + name); } return new NIDlist(nl); } void MainWindow::init_images() { keyImg = loadImg("bigkey.png"); csrImg = loadImg("bigcsr.png"); certImg = loadImg("bigcert.png"); tempImg = loadImg("bigtemp.png"); nsImg = loadImg("netscape.png"); revImg = loadImg("bigcrl.png"); scardImg = loadImg("bigscard.png"); appIco = loadImg("key.xpm"); doneIco = loadImg("done.png"); warnIco = loadImg("warn.png"); bigKey->setPixmap(*keyImg); bigCsr->setPixmap(*csrImg); bigCert->setPixmap(*certImg); bigTemp->setPixmap(*tempImg); bigRev->setPixmap(*revImg); setWindowIcon(*appIco); pki_evp::icon[0] = loadImg("key.png"); pki_evp::icon[1] = loadImg("halfkey.png"); pki_scard::icon[0] = loadImg("scard.png"); pki_x509req::icon[0] = loadImg("req.png"); pki_x509req::icon[1] = loadImg("reqkey.png"); pki_x509req::icon[2] = loadImg("spki.png"); pki_x509req::icon[3] = doneIco; pki_x509::icon[0] = loadImg("validcert.png"); pki_x509::icon[1] = loadImg("validcertkey.png"); pki_x509::icon[2] = loadImg("invalidcert.png"); pki_x509::icon[3] = loadImg("invalidcertkey.png"); pki_x509::icon[4] = loadImg("revoked.png"); pki_x509::icon[5] = doneIco; pki_temp::icon = loadImg("template.png"); pki_crl::icon = loadImg("crl.png"); } void MainWindow::read_cmdline() { int cnt = 1, opt = 0, force_load = 0; char *arg = NULL; exitApp = 0; QStringList failed; ImportMulti *dlgi = new ImportMulti(this); while (cnt < qApp->argc()) { arg = qApp->argv()[cnt]; if (arg[0] == '-') { // option opt = 1; switch (arg[1]) { case 'c': case 'r': case 'k': case 'p': case '7': case 'l': case 't': case 'P': break; case 'd': force_load=1; break; case 'v': cmd_version(); opt=0; break; case 'x': exitApp = 1; opt=0; break; case 'h': cmd_help(NULL); opt=0; break; default: cmd_help(CCHAR(tr("no such option: %1").arg(arg))); } if (arg[2] != '\0' && opt==1) { arg+=2; } else { cnt++; continue; } } QString file = filename2QString(arg); if (force_load) { if (changeDB(file) == 2) exitApp = 1; force_load = 0; } else { int ret; pki_multi *pki = probeAnything(file, &ret); if (!pki && ret == 2) exitApp = 1; if (pki && !pki->count()) failed << file; dlgi->addItem(pki); } cnt++; } dlgi->execute(1, failed); /* force showing of import dialog */ if (dlgi->result() == QDialog::Rejected) exitApp = 1; delete dlgi; } void MainWindow::loadPem() { load_pem l; if (keys) keys->load_default(l); } bool MainWindow::pastePem(QString text) { bool success = false; QByteArray pemdata = text.toAscii(); BIO *b = BIO_QBA_mem_buf(pemdata); check_oom(b); pki_multi *pem = NULL; ImportMulti *dlgi = NULL; try { pem = new pki_multi(); dlgi = new ImportMulti(this); pem->fromPEM_BIO(b, QString("paste")); success = pem->count() != 0; dlgi->addItem(pem); pem = NULL; dlgi->execute(1); } catch (errorEx &err) { Error(err); } if (dlgi) delete dlgi; if (pem) delete pem; BIO_free(b); return success; } void MainWindow::pastePem() { Ui::About ui; QClipboard *cb = QApplication::clipboard(); QString text; text = cb->text(QClipboard::Selection); if (text.isEmpty()) text = cb->text(QClipboard::Clipboard); if (!text.isEmpty()) if (pastePem(text)) return; QDialog *input = new QDialog(this, 0); ui.setupUi(input); delete ui.textbox; QTextEdit *textbox = new QTextEdit(input); ui.vboxLayout->addWidget(textbox); ui.button->setText(tr("Import PEM data")); input->setWindowTitle(XCA_TITLE); textbox->setPlainText(text); if (input->exec()) text = textbox->toPlainText(); delete input; if (!text.isEmpty()) pastePem(text); } void MainWindow::initToken() { bool ok; if (!pkcs11::loaded()) return; try { pkcs11 p11; slotid slot; Passwd pin; int ret; if (!p11.selectToken(&slot, this)) return; tkInfo ti = p11.tokenInfo(slot); QString slotname = QString("%1 (#%2)"). arg(ti.label()).arg(ti.serial()); pass_info p(XCA_TITLE, tr("Please enter the original SO PIN (PUK) of the token '%1'"). arg(slotname) + "\n" + ti.pinInfo()); p.setPin(); if (ti.tokenInitialized()) { ret = PwDialog::execute(&p, &pin, false); } else { p.setDescription(tr("Please enter the new SO PIN (PUK) of the token '%1'"). arg(slotname) + "\n" + ti.pinInfo()); ret = PwDialog::execute(&p, &pin, true); } if (ret != 1) return; QString label = QInputDialog::getText(this, XCA_TITLE, tr("The new label of the token '%1'"). arg(slotname), QLineEdit::Normal, QString(), &ok); if (!ok) return; p11.initToken(slot, pin.constUchar(), pin.size(), label); } catch (errorEx &err) { Error(err); } } void MainWindow::changePin(bool so) { if (!pkcs11::loaded()) return; try { pkcs11 p11; slotid slot; if (!p11.selectToken(&slot, this)) return; p11.changePin(slot, so); } catch (errorEx &err) { Error(err); } } void MainWindow::changeSoPin() { changePin(true); } void MainWindow::initPin() { if (!pkcs11::loaded()) return; try { pkcs11 p11; slotid slot; if (!p11.selectToken(&slot, this)) return; p11.initPin(slot); } catch (errorEx &err) { Error(err); } } void MainWindow::manageToken() { pkcs11 p11; slotid slot; pki_scard *card = NULL; pki_x509 *cert = NULL; ImportMulti *dlgi = NULL; if (!pkcs11::loaded()) return; try { if (!p11.selectToken(&slot, this)) return; ImportMulti *dlgi = new ImportMulti(this); dlgi->tokenInfo(slot); QList<CK_OBJECT_HANDLE> objects; QList<CK_MECHANISM_TYPE> ml = p11.mechanismList(slot); if (ml.count() == 0) ml << CKM_SHA1_RSA_PKCS; pk11_attlist atts(pk11_attr_ulong(CKA_CLASS, CKO_PUBLIC_KEY)); p11.startSession(slot); objects = p11.objectList(atts); for (int j=0; j< objects.count(); j++) { card = new pki_scard(""); try { card->load_token(p11, objects[j]); card->setMech_list(ml); dlgi->addItem(card); } catch (errorEx &err) { Error(err); delete card; } card = NULL; } atts.reset(); atts << pk11_attr_ulong(CKA_CLASS, CKO_CERTIFICATE) << pk11_attr_ulong(CKA_CERTIFICATE_TYPE,CKC_X_509); objects = p11.objectList(atts); for (int j=0; j< objects.count(); j++) { cert = new pki_x509(""); try { cert->load_token(p11, objects[j]); cert->setTrust(2); dlgi->addItem(cert); } catch (errorEx &err) { Error(err); delete cert; } cert = NULL; } if (dlgi->entries() == 0) { tkInfo ti = p11.tokenInfo(); QMessageBox::information(this, XCA_TITLE, tr("The token '%1' did not contain any keys or certificates"). arg(ti.label())); } else { dlgi->execute(true); } } catch (errorEx &err) { Error(err); } if (card) delete card; if (cert) delete cert; if (dlgi) delete dlgi; } MainWindow::~MainWindow() { close_database(); ERR_free_strings(); EVP_cleanup(); OBJ_cleanup(); if (eku_nid) delete eku_nid; if (dn_nid) delete dn_nid; if (aia_nid) delete aia_nid; delete dbindex; #ifdef MDEBUG fprintf(stderr, "Memdebug:\n"); CRYPTO_mem_leaks_fp(stderr); #endif } QString makeSalt(void) { unsigned char rand[2]; char saltbuf[10]; RAND_bytes(rand, 2); snprintf(saltbuf, 10, "S%02X%02X", rand[0], rand[1]); return QString(saltbuf); } void MainWindow::changeDbPass() { Passwd pass; pass_info p(tr("New Password"), tr("Please enter the new password " "to encrypt your private keys in the database-file"), this); if (PwDialog::execute(&p, &pass, true) != 1) return; QString tempn = dbfile + "{new}"; try { if (!QFile::copy(dbfile, tempn)) throw errorEx("Could not create temporary file: " + tempn); QString passhash = updateDbPassword(tempn, pass); QFile new_file(tempn); db mydb(dbfile); mydb.mv(new_file); close_database(); pki_evp::passHash = passhash; pki_evp::passwd = pass; init_database(); } catch (errorEx &ex) { QFile::remove(tempn); Error(ex); } } QString MainWindow::updateDbPassword(QString newdb, Passwd pass) { db mydb(newdb); QString salt = makeSalt(); QString passhash = pki_evp::sha512passwd(pass, salt); mydb.set((const unsigned char *)CCHAR(passhash), passhash.length()+1, 1, setting, "pwhash"); QList<pki_evp*> klist; mydb.first(); while (mydb.find(asym_key, QString()) == 0) { QString s; pki_evp *key; unsigned char *p; db_header_t head; p = mydb.load(&head); if (!p) { printf("Load was empty !\n"); goto next; } key = new pki_evp(); if (key->getVersion() < head.version) { printf("Item[%s]: Version %d " "> known version: %d -> ignored\n", head.name, head.version, key->getVersion() ); free(p); delete key; goto next; } key->setIntName(QString::fromUtf8(head.name)); try { key->fromData(p, &head); } catch (errorEx &err) { err.appendString(key->getIntName()); Error(err); delete key; key = NULL; } free(p); if (key && key->getOwnPass() == pki_key::ptCommon && !key->isPubKey()) { EVP_PKEY *evp = key->decryptKey(); key->set_evp_key(evp); key->encryptKey(pass.constData()); klist << key; } else if (key) delete key; next: if (mydb.next()) break; } for (int i=0; i< klist.count(); i++) { pki_evp *key = klist[i]; QByteArray ba = key->toData(); mydb.set((const unsigned char*)ba.constData(), ba.count(), key->getVersion(), key->getType(), key->getIntName()); delete key; } return passhash; } int MainWindow::initPass() { db mydb(dbfile); char *pass; pki_evp::passHash = QString(); QString salt; int ret; pass_info p(tr("New Password"), tr("Please enter a password, " "that will be used to encrypt your private keys " "in the database file:\n%1"). arg(compressFilename(dbfile)), this); if (!mydb.find(setting, "pwhash")) { if ((pass = (char *)mydb.load(NULL))) { pki_evp::passHash = pass; free(pass); } } if (pki_evp::passHash.isEmpty()) { ret = PwDialog::execute(&p, &pki_evp::passwd, true, true); if (ret != 1) return ret; salt = makeSalt(); pki_evp::passHash = pki_evp::sha512passwd(pki_evp::passwd,salt); mydb.set((const unsigned char *)CCHAR(pki_evp::passHash), pki_evp::passHash.length()+1, 1, setting, "pwhash"); } else { ret = 0; while (pki_evp::sha512passwd(pki_evp::passwd, pki_evp::passHash) != pki_evp::passHash) { if (ret) QMessageBox::warning(this, XCA_TITLE, tr("Password verify error, please try again")); p.setTitle(tr("Password")); p.setDescription(tr("Please enter the password for unlocking the database:\n%1").arg(compressFilename(dbfile))); ret = PwDialog::execute(&p, &pki_evp::passwd, false, true); if (ret != 1) { pki_evp::passwd = QByteArray(); return ret; } if (pki_evp::passHash.left(1) == "S") continue; /* Start automatic update from md5 to salted sha512 * if the password is correct. my md5 hash does not * start with 'S', while my new hash does. */ if (pki_evp::md5passwd(pki_evp::passwd) == pki_evp::passHash ) { salt = makeSalt(); pki_evp::passHash = pki_evp::sha512passwd( pki_evp::passwd, salt); mydb.set((const unsigned char *)CCHAR( pki_evp::passHash), pki_evp::passHash.length() +1, 1, setting, "pwhash"); } } } if (pki_evp::passwd.isNull()) pki_evp::passwd = ""; return 1; } void MainWindow::Error(errorEx &err) { if (err.isEmpty()) return; QString msg = tr("The following error occured:") + "\n" + err.getString(); QMessageBox box(QMessageBox::Warning, XCA_TITLE, msg, QMessageBox::Ok, NULL); box.addButton(QMessageBox::Apply)->setText(tr("Copy to Clipboard")); if (box.exec() == QMessageBox::Apply) { QClipboard *cb = QApplication::clipboard(); if (cb->supportsSelection()) cb->setText(msg, QClipboard::Selection); else cb->setText(msg); } } QString MainWindow::getPath() { return workingdir; } void MainWindow::setPath(QString str) { db mydb(dbfile); workingdir = str; mydb.set((const unsigned char *)CCHAR(str), str.length()+1, 1, setting, "workingdir"); } void MainWindow::connNewX509(NewX509 *nx) { connect( nx, SIGNAL(genKey(QString)), keys, SLOT(newItem(QString)) ); connect( keys, SIGNAL(keyDone(QString)), nx, SLOT(newKeyDone(QString)) ); connect( nx, SIGNAL(showReq(QString)), reqs, SLOT(showItem(QString))); } void MainWindow::importAnything(QString file) { ImportMulti *dlgi = new ImportMulti(this); QStringList failed; pki_multi *pki = probeAnything(file); if (pki && !pki->count()) failed << file; dlgi->addItem(pki); dlgi->execute(1, failed); delete dlgi; } pki_multi *MainWindow::probeAnything(QString file, int *ret) { pki_multi *pki = new pki_multi(); try { if (file.endsWith(".xdb")) { try { int r; db mydb(file); mydb.verify_magic(); r = changeDB(file); delete pki; if (ret) *ret = r; return NULL; } catch (errorEx &err) { } } pki->probeAnything(file); } catch (errorEx &err) { Error(err); } return pki; } void MainWindow::generateDHparam() { DH *dh = NULL; FILE *fp = NULL; QProgressBar *bar = NULL; bool ok; int num = QInputDialog::getDouble(this, XCA_TITLE, tr("Diffie-Hellman parameters are needed for different applications, but not handled by XCA.\nPlease enter the DH parameter bits"), 1024, 1024, 4096, 0, &ok); if (!ok) return; try { QStatusBar *status = statusBar(); bar = new QProgressBar(); check_oom(bar); bar->setMinimum(0); bar->setMaximum(100); status->addPermanentWidget(bar, 1); dh = DH_generate_parameters(num, 2, inc_progress_bar, bar); status->removeWidget(bar); openssl_error(); QString fname = QString("%1/dh%2.pem").arg(homedir).arg(num); fname = QFileDialog::getSaveFileName(this, QString(), fname, "All files ( * )", NULL); if (fname == "") throw errorEx(""); fp = fopen(QString2filename(fname), "w"); if (fp == NULL) { throw errorEx(tr("Error opening file: '%1': %2"). arg(fname).arg(strerror(errno))); } PEM_write_DHparams(fp, dh); openssl_error(); } catch (errorEx &err) { Error(err); } if (dh) DH_free(dh); if (fp) fclose(fp); if (bar) delete bar; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/MainWindow.h����������������������������������������������������������������������0000664�0000000�0000000�00000007443�11753427512�0016272�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __MAINWINDOW_H #define __MAINWINDOW_H #include "NewX509.h" #include "ui_MainWindow.h" #include "lib/db_key.h" #include "lib/db_x509req.h" #include "lib/db_x509.h" #include "lib/db_temp.h" #include "lib/db_crl.h" #include "lib/exception.h" #include "lib/oid.h" #include "lib/Passwd.h" #include <QtGui/QPixmap> #include <QtGui/QFileDialog> #include <QtGui/QMenuBar> #include <QtCore/QList> #define DBFILE "xca.xdb" class db_x509; class pki_multi; class MainWindow: public QMainWindow, public Ui::MainWindow { Q_OBJECT private: QString workingdir; QString string_opt; QString pkcs11path; QList<QWidget*> wdList; QList<QWidget*> scardList; QList<QAction*> acList; protected: void init_images(); void init_menu(); int force_load; NIDlist *read_nidlist(QString name); QLabel *statusLabel; QString homedir; int changeDB(QString fname); void setOptFlags(QString flags); QString getOptFlags(); public: static db_x509 *certs; static db_x509req *reqs; static db_key *keys; static db_temp *temps; static db_crl *crls; static QPixmap *keyImg, *csrImg, *certImg, *tempImg, *nsImg, *revImg, *appIco, *scardImg, *doneIco, *warnIco; static NIDlist *eku_nid, *dn_nid, *aia_nid; static QString mandatory_dn; int exitApp; QString dbfile; QLabel *dbindex; MainWindow(QWidget *parent); virtual ~MainWindow(); void loadSettings(); void saveSettings(); int initPass(); void read_cmdline(); void load_engine(); static void Error(errorEx &err); void cmd_version(); void cmd_help(const char* msg); QString getPath(); void setPath(QString path); bool mkDir(QString dir); void setItemEnabled(bool enable); QString updateDbPassword(QString newdb, Passwd pass); void enableTokenMenu(bool enable); pki_multi *probeAnything(QString file, int *ret = NULL); void importAnything(QString file); void dropEvent(QDropEvent *event); void dragEnterEvent(QDragEnterEvent *event); int open_default_db(); public slots: int init_database(); void new_database(); void load_database(); void close_database(); void dump_database(); void default_database(); void connNewX509(NewX509 *nx); void about(); void donations(); void help(); void import_dbdump(); void undelete(); void loadPem(); bool pastePem(QString text); void pastePem(); void changeDbPass(); private slots: void setOptions(); void manageToken(); void initToken(); void changePin(bool so=false); void changeSoPin(); void initPin(); void generateDHparam(); void on_keyView_doubleClicked(const QModelIndex &m); void on_reqView_doubleClicked(const QModelIndex &m); void on_certView_doubleClicked(const QModelIndex &m); void on_tempView_doubleClicked(const QModelIndex &m); void on_crlView_doubleClicked(const QModelIndex &m); void on_BNnewKey_clicked(); void on_BNdeleteKey_clicked(); void on_BNdetailsKey_clicked(); void on_BNimportKey_clicked(); void on_BNexportKey_clicked(); void on_BNimportPFX_clicked(); void on_BNnewReq_clicked(); void on_BNdeleteReq_clicked(); void on_BNdetailsReq_clicked(); void on_BNimportReq_clicked(); void on_BNexportReq_clicked(); void on_BNnewCert_clicked(); void on_BNdeleteCert_clicked(); void on_BNdetailsCert_clicked(); void on_BNimportCert_clicked(); void on_BNexportCert_clicked(); void on_BNimportPKCS12_clicked(); void on_BNimportPKCS7_clicked(); void on_BNviewState_clicked(); void on_BNnewTemp_clicked(); void on_BNdeleteTemp_clicked(); void on_BNchangeTemp_clicked(); void on_BNimportTemp_clicked(); void on_BNexportTemp_clicked(); void on_BNdeleteCrl_clicked(); void on_BNdetailsCrl_clicked(); void on_BNimportCrl_clicked(); void on_BNexportCrl_clicked(); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/Makefile��������������������������������������������������������������������������0000664�0000000�0000000�00000000667�11753427512�0015506�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ifeq ($(TOPDIR),) TOPDIR=.. BUILD=.. endif MOC_NAMES=MainWindow KeyDetail clicklabel XcaTreeView ExportKey NewX509 \ validity v3ext distname CertDetail CertExtend PwDialog \ ImportMulti CrlDetail ExportDialog hashBox Options NewKey kvView \ NewCrl SearchPkcs11 NAMES=$(MOC_NAMES) NewX509_ext MW_menu MW_help MW_database OBJS=$(patsubst %,moc_%.o,$(MOC_NAMES)) $(patsubst %,%.o,$(NAMES)) include $(TOPDIR)/Rules.mak sinclude .depend �������������������������������������������������������������������������xca_0.9.3/widgets/NewCrl.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000002051�11753427512�0015731�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2010 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "NewCrl.h" #include "lib/base.h" #include "lib/func.h" #include "widgets/validity.h" #include "widgets/MainWindow.h" #include <QtGui/QLabel> #include <QtGui/QLineEdit> #include <QtGui/QComboBox> #include <QtGui/QCheckBox> #include <QtGui/QMessageBox> NewCrl::NewCrl(QWidget *parent, pki_x509 *signer) :QDialog(parent) { setupUi(this); setWindowTitle(XCA_TITLE); image->setPixmap(*MainWindow::revImg); validNumber->setText(QString::number(signer->getCrlDays())); validRange->setCurrentIndex(0); on_applyTime_clicked(); nextUpdate->setEndDate(true); pki_key *key = signer->getRefKey(); hashAlgo->setKeyType(key->getKeyType()); hashAlgo->setupHashes(key->possibleHashNids()); if (signer->hasExtension(NID_subject_alt_name)) subAltName->setEnabled(true); else subAltName->setEnabled(false); } void NewCrl::on_applyTime_clicked() { nextUpdate->setDiff(lastUpdate, validNumber->text().toInt(), validRange->currentIndex()); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/NewCrl.h��������������������������������������������������������������������������0000664�0000000�0000000�00000000574�11753427512�0015406�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __NEWCRL_H #define __NEWCRL_H #include "ui_NewCrl.h" #include "lib/pki_x509.h" class pki_key; class NewCrl: public QDialog, public Ui::NewCrl { Q_OBJECT public: NewCrl(QWidget *parent, pki_x509 *signer); public slots: void on_applyTime_clicked(); }; #endif ������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/NewKey.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000010230�11753427512�0015737�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "NewKey.h" #include "MainWindow.h" #include "lib/pki_evp.h" #include "widgets/distname.h" #include "widgets/clicklabel.h" #include "lib/pkcs11.h" #include <QtGui/QLabel> #include <QtGui/QPushButton> #include <QtGui/QLineEdit> struct typelist { const char *name; int type; }; static const struct typelist typeList[] = { { "RSA", EVP_PKEY_RSA }, { "DSA", EVP_PKEY_DSA }, #ifndef OPENSSL_NO_EC { "EC", EVP_PKEY_EC }, #endif }; class keyListItem { protected: const struct typelist *tl; public: bool card; QString printname; slotid slot; keyListItem(pkcs11 *p11, slotid nslot, CK_MECHANISM_TYPE m) { // assert(m == CKM_RSA_PKCS_KEY_PAIR_GEN); slot = nslot; CK_MECHANISM_INFO mechinfo; p11->mechanismInfo(slot, m, &mechinfo); tkInfo ti = p11->tokenInfo(slot); tl = typeList; //idx of EVP_PKEY_RSA printname = QString("%1 #%2 (%3 Key of %4 - %5 bits)"). arg(ti.label()).arg(ti.serial()). arg(tl->name). arg(mechinfo.ulMinKeySize). arg(mechinfo.ulMaxKeySize); card = true; } keyListItem(const struct typelist *t=typeList) { tl = t; printname = QString(tl->name); card = false; slot = slotid(); } keyListItem(const keyListItem &k) { tl = k.tl; printname = k.printname; card = k.card; slot = k.slot; } int type() { return tl->type; } }; Q_DECLARE_METATYPE(keyListItem); NewKey::NewKey(QWidget *parent, QString name) :QDialog(parent) { static const char* const sizeList[] = { "1024", "2048", "4096" }; size_t i; QStringList curve_x962, curve_other; slotidList p11_slots; QList<keyListItem> keytypes; setupUi(this); setWindowTitle(tr(XCA_TITLE)); image->setPixmap(*MainWindow::keyImg); if (!name.isEmpty()) keyDesc->setText(name); keyLength->setEditable(true); for (i=0; i < ARRAY_SIZE(sizeList); i++ ) { keyLength->addItem(QString(sizeList[i]) + " bit"); } for (i=0; i < ARRAY_SIZE(typeList); i++ ) { keyListItem gk(typeList +i); keytypes << gk; } #ifndef OPENSSL_NO_EC for (i = 0; i<pki_evp::num_curves; i++) { const char *desc = pki_evp::curves[i].comment; const char *sn = OBJ_nid2sn(pki_evp::curves[i].nid); if (!sn) continue; if (desc == NULL) desc = "---"; QString p = QString(sn) + ": " + desc; switch (pki_evp::curve_flags[i]) { case CURVE_X962: curve_x962 << p; break; case CURVE_OTHER: curve_other << p; break; } } curveBox->addItems(curve_x962); curveBox->addItems(curve_other); #endif keyLength->setCurrentIndex(0); keyDesc->setFocus(); if (pkcs11::loaded()) try { pkcs11 p11; p11_slots = p11.getSlotList(); foreach(slotid slot, p11_slots) { QList<CK_MECHANISM_TYPE> ml = p11.mechanismList(slot); if (ml.contains(CKM_RSA_PKCS_KEY_PAIR_GEN)) { keyListItem tk(&p11, slot, CKM_RSA_PKCS_KEY_PAIR_GEN); keytypes << tk; } } } catch (errorEx &err) { p11_slots.clear(); } for (int i=0; i<keytypes.count(); i++) { QVariant q; q.setValue(keytypes[i]); keyType->addItem(keytypes[i].printname, q); } buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Create")); } void NewKey::on_keyType_currentIndexChanged(int idx) { bool curve_enabled; curve_enabled = (typeList[idx].type == EVP_PKEY_EC); curveBox->setVisible(curve_enabled); curveLabel->setVisible(curve_enabled); keySizeLabel->setVisible(!curve_enabled); keyLength->setVisible(!curve_enabled); } static keyListItem currentKey(QComboBox *keyType) { QVariant q = keyType->itemData(keyType->currentIndex()); return q.value<keyListItem>(); } int NewKey::getKeytype() { return currentKey(keyType).type(); } int NewKey::getKeysize() { if (getKeytype() == EVP_PKEY_EC) return -1; QString size = keyLength->currentText(); size.replace(QRegExp("[^0-9]"), ""); return size.toInt(); } int NewKey::getKeyCurve_nid() { if (getKeytype() != EVP_PKEY_EC) return -1; QString desc = curveBox->currentText(); desc.replace(QRegExp("^(X9.62) "), ""); desc.replace(QRegExp(":.*"), ""); return OBJ_sn2nid(CCHAR(desc)); } bool NewKey::isToken() { keyListItem k = currentKey(keyType); return k.card; } slotid NewKey::getKeyCardSlot() { keyListItem k = currentKey(keyType); return k.slot; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/NewKey.h��������������������������������������������������������������������������0000664�0000000�0000000�00000001010�11753427512�0015400�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __NEWKEY_H #define __NEWKEY_H #include "ui_NewKey.h" #include "lib/pkcs11_lib.h" #include <QtCore/QStringList> class NewKey: public QDialog, public Ui::NewKey { Q_OBJECT public: NewKey(QWidget *parent, QString name); int getKeytype(); int getKeysize(); int getKeyCurve_nid(); slotid getKeyCardSlot(); bool isToken(); public slots: void on_keyType_currentIndexChanged(int); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/NewX509.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000071074�11753427512�0015671�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "NewX509.h" #include <QtGui/QCheckBox> #include <QtGui/QComboBox> #include <QtGui/QRadioButton> #include <QtGui/QMessageBox> #include <QtGui/QLineEdit> #include <QtGui/QLabel> #include <QtGui/QPixmap> #include <QtGui/QPushButton> #include <QtGui/QValidator> #include "MainWindow.h" #include "v3ext.h" #include "lib/x509name.h" #include "lib/db_key.h" #include "lib/db_x509req.h" #include "lib/db_x509.h" #include "lib/db_temp.h" #include "lib/oid.h" #include "lib/func.h" int NewX509::name_nid[] = { NID_countryName, NID_stateOrProvinceName, NID_localityName, NID_organizationName, NID_organizationalUnitName, NID_commonName, NID_pkcs9_emailAddress }; NewX509::NewX509(QWidget *parent) :QDialog(parent) { int i; eku_nid = *MainWindow::eku_nid; dn_nid = *MainWindow::dn_nid; aia_nid = *MainWindow::aia_nid; attr_nid << NID_pkcs9_unstructuredName << NID_pkcs9_challengePassword; QStringList keys; setupUi(this); /* temporary storage for creating temporary X509V3_CTX */ ctx_cert = NULL; for (i=0; i < dn_nid.count(); i++) keys << QString(OBJ_nid2ln(dn_nid[i])); extDNlist->setKeys(keys); extDNlist->setInfoLabel(extDNinfo); connect(extDNlist->itemDelegateForColumn(1), SIGNAL(setupLineEdit(const QString &, QLineEdit *)), this, SLOT(setupExtDNwidget(const QString &, QLineEdit *))); connect(subAltName, SIGNAL(textChanged(const QString &)), this, SLOT(checkSubAltName(const QString &))); connect(issAltName, SIGNAL(textChanged(const QString &)), this, SLOT(checkIssAltName(const QString &))); connect(crlDist, SIGNAL(textChanged(const QString &)), this, SLOT(checkCrlDist(const QString &))); connect(authInfAcc, SIGNAL(textChanged(const QString &)), this, SLOT(checkAuthInfAcc(const QString &))); setWindowTitle(XCA_TITLE); for (i=0; i<tabWidget->count(); i++) { tabnames << tabWidget->tabText(i); } nsImg->setPixmap(*MainWindow::nsImg); serialNr->setValidator(new QRegExpValidator(QRegExp("[0-9a-fA-F]*"), this)); QStringList strings; // are there any useable private keys ? newKeyDone(""); // any PKCS#10 requests to be used ? strings = MainWindow::reqs->getDesc(); if (strings.isEmpty()) { fromReqCB->setDisabled(true); fromReqCB->setChecked(false); } else { reqList->insertItems(0, strings); } on_fromReqCB_clicked(); // How about signing certificates ? strings = MainWindow::certs->getSignerDesc(); if (strings.isEmpty()) { foreignSignRB->setDisabled(true); } else { certList->insertItems(0, strings); } #ifdef WG_QA_SERIAL selfQASignRB = new QRadioButton(signerBox); setTabOrder(serialNr, selfQASignRB); setTabOrder(selfQASignRB, foreignSignRB); selfQASignRB->setText(tr( "Create a &self signed certificate with a MD5-hashed QA serial")); QBoxLayout *l = (QBoxLayout *)signerBox->layout(); l->insertWidget(1, selfQASignRB); #endif // set dates to now and now + 1 year validNumber->setText("1"); validRange->setCurrentIndex(2); on_applyTime_clicked(); // settings for the templates .... strings.clear(); strings = MainWindow::temps->getDescPredefs(); tempList->insertItems(0, strings); // setup Extended keyusage for (i=0; i < eku_nid.count(); i++) ekeyUsage->addItem(OBJ_nid2ln(eku_nid[i])); // setup Authority Info Access for (i=0; i < aia_nid.count(); i++) aiaOid->addItem(OBJ_nid2ln(aia_nid[i])); // init the X509 v3 context X509V3_set_ctx(&ext_ctx, NULL , NULL, NULL, NULL, 0); X509V3_set_ctx_nodb(&ext_ctx); QList<QLabel *> nameLabel; nameLabel << LcountryName << LstateOrProvinceName << LlocalityName << LorganisationName << LorganisationalUnitName << LcommonName << LemailAddress; for(int i=0; i<nameLabel.count(); i++) { nameLabel[i]->setText(OBJ_nid2ln(name_nid[i])); QString tt = nameLabel[i]->toolTip(); nameLabel[i]->setToolTip(QString("[%1] %2"). arg(OBJ_nid2sn(name_nid[i])).arg(tt)); name_ptr[i] = (QLineEdit *)nameLabel[i]->buddy(); setupLineEditByNid(name_nid[i], name_ptr[i]); } // Setup Request Attributes if (attrWidget->layout()) delete attrWidget->layout(); QGridLayout *attrLayout = new QGridLayout(attrWidget); attrLayout->setAlignment(Qt::AlignTop); attrLayout->setSpacing(6); attrLayout->setMargin(0); attr_edit.clear(); for (i=0; i < attr_nid.count(); i++) { QLabel *label; QLineEdit *edit; int nid = attr_nid[i]; label = new QLabel(this); label->setText(QString(OBJ_nid2ln(nid))); label->setToolTip(QString(OBJ_nid2sn(nid))); edit = new QLineEdit(this); attr_edit << edit; attrLayout->addWidget(label, i, 0); attrLayout->addWidget(edit, i, 1); setupLineEditByNid(nid, edit); } // last polish on_certList_currentIndexChanged(0); certList->setDisabled(true); tabWidget->setCurrentIndex(0); attrWidget->hide(); pt = none; notAfter->setEndDate(true); } void NewX509::setRequest() { reqWidget->hide(); attrWidget->show(); signerBox->setEnabled(false); timewidget->setEnabled(false); capt->setText(tr("Create Certificate signing request")); authKey->setEnabled(false); setImage(MainWindow::csrImg); pt = x509_req; } NewX509::~NewX509() { if (ctx_cert) delete(ctx_cert); } void NewX509::setupExtDNwidget(const QString &s, QLineEdit *l) { setupLineEditByNid(OBJ_txt2nid(CCHAR(s)), l); } void NewX509::setupLineEditByNid(int nid, QLineEdit *l) { ASN1_STRING_TABLE *tab = ASN1_STRING_TABLE_get(nid); QValidator *validator = NULL; QStringList info; info << QString("[%1]").arg(OBJ_nid2sn(nid)); if (tab) { if (tab->minsize > 1) info << tr("minimum size: %1").arg(tab->minsize); if (tab->maxsize != -1) info << tr("maximum size: %1").arg(tab->maxsize); if (tab->mask == B_ASN1_PRINTABLESTRING) { info << tr("only a-z A-Z 0-9 '()+,-./:=?"); QRegExp rx("[a-zA-Z0-9'()+,-./:=?]+"); validator = new QRegExpValidator(rx, this); } else if (tab->mask == B_ASN1_IA5STRING) { info << tr("only 7-bit clean characters"); } } l->setToolTip(info.join(" ")); l->setValidator(validator); } void NewX509::addReqAttributes(pki_x509req *req) { for (int i=0; i < attr_nid.count(); i++) { req->addAttribute(attr_nid[i], attr_edit[i]->text()); } } void NewX509::setTemp(pki_temp *temp) { QString text = tr("Create"); if (temp->getIntName() != "--") { description->setText(temp->getIntName()); description->setDisabled(true); text = tr("Edit"); } capt->setText(text + " " + tr("XCA template")); tabWidget->removeTab(0); privKeyBox->setEnabled(false); validityBox->setEnabled(false); setImage(MainWindow::tempImg); pt = tmpl; } void NewX509::setCert() { capt->setText(tr("Create x509 Certificate")); setImage(MainWindow::certImg); pt = x509; } void NewX509::setImage(QPixmap *img) { image->setPixmap(*img); } void NewX509::defineTemplate(pki_temp *temp) { fromTemplate(temp); templateChanged(temp); } void NewX509::defineRequest(pki_x509req *req) { if (!req) return; fromReqCB->setEnabled(true); fromReqCB->setChecked(true); QString reqname = req->getIntName(); reqList->setCurrentIndex(reqList->findText(reqname)); on_fromReqCB_clicked(); } void NewX509::defineSigner(pki_x509 *defcert) { int index; // suggested from: Andrey Brindeew <abr@abr.pp.ru> if (defcert && defcert->canSign() ) { QString name = defcert->getIntName(); foreignSignRB->setChecked(true); certList->setEnabled(true); if ((index = certList->findText(name)) >= 0) { certList->setCurrentIndex(index); } if (!defcert->getTemplate().isEmpty()) { on_applyTemplate_clicked(); } } } static int lb2int(QListWidget *lb) { int i, x=0, c=lb->count(); QListWidgetItem *item; for (i=0; i<c; i++) { item = lb->item(i); if (lb->isItemSelected(item)){ x |= 1<<i; } } return x; } static void int2lb(QListWidget *lb, int x) { int i, c=lb->count(); QListWidgetItem *item; for (i=0; i<c; i++) { item = lb->item(i); lb->setItemSelected(item, (1<<i) & x); } } static void QString2lb(QListWidget *lb, QString x) { QStringList li = x.split(", "); QList<QListWidgetItem *> items; for (int i=0; i<li.size(); i++) { QString lname = OBJ_sn2ln(CCHAR(li[i])); items = lb->findItems(lname, Qt::MatchExactly); if (items.size() > 0) lb->setItemSelected(items[0], 1); } } static QString lb2QString(QListWidget *lb) { QStringList sl; for (int i=0; i<lb->count(); i++) { QListWidgetItem *item = lb->item(i); if (lb->isItemSelected(item)) { sl << QString(OBJ_ln2sn(CCHAR(item->text()))); } } return sl.join(", "); } void NewX509::subjectFromTemplate(pki_temp *temp) { if (temp) setX509name(temp->xname); } void NewX509::extensionsFromTemplate(pki_temp *temp) { if (!temp) return; subAltName->setText(temp->subAltName); issAltName->setText(temp->issAltName); crlDist->setText(temp->crlDist); setAuthInfAcc_string(temp->authInfAcc); nsComment->setText(temp->nsComment); nsBaseUrl->setText(temp->nsBaseUrl); nsRevocationUrl->setText(temp->nsRevocationUrl); nsCARevocationUrl->setText(temp->nsCARevocationUrl); nsRenewalUrl->setText(temp->nsRenewalUrl); nsCaPolicyUrl->setText(temp->nsCaPolicyUrl); nsSslServerName->setText(temp->nsSslServerName); int2lb(nsCertType, temp->nsCertType); basicCA->setCurrentIndex(temp->ca); bcCritical->setChecked(temp->bcCrit); kuCritical->setChecked(temp->keyUseCrit); ekuCritical->setChecked(temp->eKeyUseCrit); subKey->setChecked(temp->subKey); authKey->setChecked(temp->authKey); int2lb(keyUsage, temp->keyUse); QString2lb(ekeyUsage, temp->eKeyUse); validNumber->setText(QString::number(temp->validN)); validRange->setCurrentIndex(temp->validM); midnightCB->setChecked(temp->validMidn); basicPath->setText(temp->pathLen); nconf_data->document()->setPlainText(temp->adv_ext); noWellDefinedExpDate->setChecked(temp->noWellDefined); on_applyTime_clicked(); } void NewX509::fromTemplate(pki_temp *temp) { subjectFromTemplate(temp); extensionsFromTemplate(temp); } void NewX509::toTemplate(pki_temp *temp) { temp->setIntName(description->text()); temp->xname = getX509name(); temp->subAltName = subAltName->text(); temp->issAltName = issAltName->text(); temp->crlDist = crlDist->text(); temp->authInfAcc = getAuthInfAcc_string(); temp->nsComment = nsComment->text(); temp->nsBaseUrl = nsBaseUrl->text(); temp->nsRevocationUrl = nsRevocationUrl->text(); temp->nsCARevocationUrl = nsCARevocationUrl->text(); temp->nsRenewalUrl = nsRenewalUrl->text(); temp->nsCaPolicyUrl = nsCaPolicyUrl->text(); temp->nsSslServerName = nsSslServerName->text(); temp->nsCertType = lb2int(nsCertType); temp->ca = basicCA->currentIndex(); temp->bcCrit = bcCritical->isChecked(); temp->keyUseCrit = kuCritical->isChecked(); temp->eKeyUseCrit = ekuCritical->isChecked(); temp->subKey = subKey->isChecked(); temp->authKey = authKey->isChecked(); temp->keyUse = lb2int(keyUsage); temp->eKeyUse = lb2QString(ekeyUsage); temp->validN = validNumber->text().toInt(); temp->validM = validRange->currentIndex(); temp->pathLen = basicPath->text(); if (!temp->pathLen.isEmpty()) temp->pathLen = QString::number(temp->pathLen.toInt()); temp->validMidn = midnightCB->isChecked(); if (nconf_data->isReadOnly()) { temp->adv_ext = v3ext_backup; } else { temp->adv_ext = nconf_data->toPlainText(); } temp->noWellDefined = noWellDefinedExpDate->isChecked(); } void NewX509::on_fromReqCB_clicked() { bool request = fromReqCB->isChecked(); bool subj_tab_present = tabWidget->widget(1) == tab_1; bool subChange = reqSubChange->isChecked(); if (request && subj_tab_present && !subChange) tabWidget->removeTab(1); else if ((!request || subChange) && !subj_tab_present) tabWidget->insertTab(1, tab_1, tr("Subject")); reqList->setEnabled(request); copyReqExtCB->setEnabled(request); showReqBut->setEnabled(request); reqSubChange->setEnabled(request); switchHashAlgo(); } void NewX509::on_reqSubChange_clicked() { if (reqSubChange->isChecked()) { pki_x509req *req = getSelectedReq(); description->setText(req->getIntName()); setX509name(req->getSubject()); usedKeysToo->setEnabled(false); keyList->setEnabled(false); genKeyBut->setEnabled(false); } on_fromReqCB_clicked(); } void NewX509::on_keyList_currentIndexChanged(const QString &) { switchHashAlgo(); } void NewX509::on_reqList_currentIndexChanged(const QString &) { switchHashAlgo(); } void NewX509::switchHashAlgo() { pki_key *key; pki_x509super *sig; if (foreignSignRB->isChecked()) sig = getSelectedSigner(); else if (fromReqCB->isChecked()) sig = getSelectedReq(); else sig = NULL; key = sig ? sig->getRefKey() : getSelectedKey(); if (key) { hashAlgo->setKeyType(key->getKeyType()); hashAlgo->setupHashes(key->possibleHashNids()); } else { hashAlgo->setKeyType(EVP_PKEY_RSA); hashAlgo->setupAllHashes(); } } void NewX509::on_showReqBut_clicked() { QString req = reqList->currentText(); emit showReq(req); } void NewX509::on_genKeyBut_clicked() { QString name = description->text(); if (name.isEmpty()) name = commonName->text(); if (name.isEmpty()) name = emailAddress->text(); emit genKey(name); } void NewX509::on_certList_currentIndexChanged(int) { a1time snb, sna; pki_x509 *cert = getSelectedSigner(); switchHashAlgo(); if (!cert) return; QString templ = cert->getTemplate(); snb = cert->getNotBefore(); sna = cert->getNotAfter(); if (snb > notBefore->getDate()) notBefore->setDate(snb); if (sna < notAfter->getDate()) notAfter->setDate(sna); if (templ.isEmpty()) return; templateChanged(templ); } void NewX509::templateChanged(QString tempname) { int index; if (!tempList->isEnabled()) return; if ((index = tempList->findText(tempname)) <0) return; tempList->setCurrentIndex(index); } void NewX509::templateChanged(pki_temp *templ) { QString tempname = templ->getIntName(); templateChanged(tempname); } pki_temp *NewX509::currentTemplate() { if (!tempList->isEnabled()) return NULL; QString name = tempList->currentText(); if (name.isEmpty()) return NULL; return (pki_temp *)MainWindow::temps->getByName(name); } void NewX509::on_applyTemplate_clicked() { fromTemplate(currentTemplate()); } void NewX509::on_applySubject_clicked() { subjectFromTemplate(currentTemplate()); } void NewX509::on_applyExtensions_clicked() { extensionsFromTemplate(currentTemplate()); } void NewX509::on_foreignSignRB_toggled(bool) { switchHashAlgo(); } void NewX509::newKeyDone(QString name) { QStringList keys; private_keys = MainWindow::keys->get0KeyDesc(true); private_keys0 = MainWindow::keys->get0KeyDesc(false); keyList->clear(); if (usedKeysToo->isChecked()) keys = private_keys; else keys = private_keys0; keyList->insertItems(0, keys); if (name.isEmpty() && keys.count() >0) name = keys[0]; keyList->setCurrentIndex(keys.indexOf(name)); } void NewX509::on_usedKeysToo_toggled(bool) { QString cur = keyList->currentText(); QStringList keys; keyList->clear(); if (usedKeysToo->isChecked()) keys = private_keys; else keys = private_keys0; keyList->insertItems(0, keys); keyList->setCurrentIndex(keys.indexOf(cur)); } pki_key *NewX509::getSelectedKey() { QString name = pki_key::removeTypeFromIntName(keyList->currentText()); return (pki_key *)MainWindow::keys->getByName(name); } pki_x509 *NewX509::getSelectedSigner() { return (pki_x509 *)MainWindow::certs->getByName(certList->currentText()); } pki_x509req *NewX509::getSelectedReq() { return (pki_x509req *)MainWindow::reqs->getByName(reqList->currentText()); } x509name NewX509::getX509name(int _throw) { x509name x; int j, row, nid; try { for (j = 0; j<EXPLICIT_NAME_CNT; j++) { nid = name_nid[j]; x.addEntryByNid(nid, name_ptr[j]->text()); } row = extDNlist->rowCount(); for (j=0; j<row; j++) { QStringList l = extDNlist->getRow(j); nid = OBJ_txt2nid(CCHAR(l[0])); x.addEntryByNid(nid, l[1]); } } catch (errorEx &err) { if (!err.isEmpty()) { if (_throw) throw err; else QMessageBox::warning(this, XCA_TITLE, err.getString()); } } return x; } void NewX509::setX509name(const x509name &n) { int i,j; extDNlist->deleteAllRows(); for (j=0; j<EXPLICIT_NAME_CNT; j++) { name_ptr[j]->setText(""); } for (i=0, j=0; i< n.entryCount(); i++) { int nid = n.nid(i); QStringList sl = n.entryList(i); for ( ; j<EXPLICIT_NAME_CNT; j++) { if (nid == name_nid[j] && name_ptr[j]->text().isEmpty()) { name_ptr[j]->setText(sl[2]); break; } } if (j == EXPLICIT_NAME_CNT) { extDNlist->addRow(sl.mid(1, 2)); } } } void NewX509::on_applyTime_clicked() { notAfter->setDiff(notBefore, validNumber->text().toInt(), validRange->currentIndex()); } void NewX509::setupTmpCtx() { pki_x509 *signcert; pki_x509req *req = NULL; pki_key *key = NULL; a1int serial; QString errtxt; // initially create temporary ctx cert if (ctx_cert) delete(ctx_cert); ctx_cert = new pki_x509(); if (fromReqCB->isChecked()) { req = getSelectedReq(); ctx_cert->setSubject(req->getSubject()); if (req) key = req->getRefKey(); } else { ctx_cert->setSubject(getX509name()); key = getSelectedKey(); } if (key) ctx_cert->setPubKey(key); // Step 2 - select Signing if (foreignSignRB->isChecked()) { signcert = getSelectedSigner(); serial = signcert->getCaSerial(); } else { signcert = ctx_cert; ctx_cert->setIssuer(ctx_cert->getSubject()); serial.setHex(serialNr->text()); } ctx_cert->setSerial(serial); initCtx(ctx_cert, signcert, req); } void NewX509::editV3ext(QLineEdit *le, QString types, int n) { v3ext *dlg; dlg = new v3ext(this); setupTmpCtx(); dlg->addInfo(le, types.split(',' ), n, &ext_ctx); dlg->exec(); delete(dlg); } void NewX509::on_adv_validate_clicked() { if (!nconf_data->isReadOnly()) { /* switch from edit to display mode */ do_validateExtensions(); } else { /* switch back to edit mode */ undo_validateExtensions(); } } void NewX509::checkIcon(const QString &text, int nid, QLabel *img) { if (text.isEmpty()) { img->clear(); return; } ign_openssl_error(); switch (nid) { case NID_subject_alt_name: getSubAltName(); break; case NID_issuer_alt_name: getIssAltName(); break; case NID_crl_distribution_points: getCrlDist(); break; case NID_info_access: getAuthInfAcc(); break; } if (ign_openssl_error()) { img->setPixmap(*MainWindow::warnIco); return; } img->setPixmap(*MainWindow::doneIco); } void NewX509::checkSubAltName(const QString & text) { checkIcon(text, NID_subject_alt_name, subAltIco); } void NewX509::checkIssAltName(const QString & text) { checkIcon(text, NID_issuer_alt_name, issAltIco); } void NewX509::checkCrlDist(const QString & text) { checkIcon(text, NID_crl_distribution_points, crlDistIco); } void NewX509::checkAuthInfAcc(const QString & text) { checkIcon(text, NID_info_access, authInfAccIco); } int NewX509::do_validateExtensions() { QString result; int ret = 0; if (!nconf_data->isReadOnly()) { v3ext_backup = nconf_data->toPlainText(); } ret = validateExtensions(v3ext_backup, result); nconf_data->document()->setHtml(result); nconf_data->setReadOnly(true); adv_validate->setText(tr("Edit")); return ret; } void NewX509::undo_validateExtensions() { if (nconf_data->isReadOnly()) { nconf_data->document()->setPlainText(v3ext_backup); } nconf_data->setReadOnly(false); adv_validate->setText(tr("Validate")); } int NewX509::validateExtensions(QString nconf, QString &result) { int ret = 0; QStringList errors; extList el; ign_openssl_error(); setupTmpCtx(); if (fromReqCB->isChecked() && copyReqExtCB->isChecked()) { el = getSelectedReq()->getV3ext(); } if (el.size() > 0) { result = "<h2><center>"; result += tr("From PKCS#10 request") +"</center></h2><p>\n"; result += el.getHtml("<br>"); } try { el = getGuiExt(); el += getNetscapeExt(); el.delInvalid(); } catch (errorEx &err) { errors += err.getString(); el.clear(); } if (el.size() > 0) { if (!result.isEmpty()) result += "\n<hr>\n"; result += "<h2><center>"; result += tr("Other Tabs") + "</center></h2><p>\n"; result += el.getHtml("<br>"); } try { el = getAdvanced(); } catch (errorEx &err) { errors += err.getString(); el.clear(); } if (el.size() > 0) { if (!result.isEmpty()) result += "\n<hr>\n"; result += "<h2><center>"; result += tr("Advanced Tab") + "</center></h2><p>\n"; result += el.getHtml("<br>"); } if (errors.size()) { if (!result.isEmpty()) result += "\n<hr>\n"; result += "<h2><center>"; result += tr("Errors") + "</center></h2><p><ul><li>\n"; result += errors.join("</li><li>\n"); result += "</li></ul>"; ret = 1; } el = getExtDuplicates(); if (el.size() > 0) { QString errtxt; ret = 1; errtxt = "<h2><center><font color=\"red\">Error:</font>" "duplicate extensions:</center></h2><p><ul>\n"; for(int i = 0; i< el.size(); i++) { errtxt += "<li>" +el[i].getObject() +"</li>\n"; } errtxt += "</ul>\n<hr>\n"; result = errtxt + result; } ign_openssl_error(); return ret; } void NewX509::on_editSubAlt_clicked() { QString s = "URI,email,RID,DNS,IP,otherName"; editV3ext(subAltName, s, NID_subject_alt_name); } void NewX509::on_editIssAlt_clicked() { QString s = "URI,email,RID,DNS,IP,otherName,issuer"; editV3ext(issAltName, s, NID_issuer_alt_name); } void NewX509::on_editCrlDist_clicked() { editV3ext(crlDist, "URI", NID_crl_distribution_points); } void NewX509::on_editAuthInfAcc_clicked() { editV3ext(authInfAcc, "URI,email,RID,DNS,IP", NID_info_access); } void NewX509::on_tabWidget_currentChanged(int tab) { if (tabWidget->tabText(tab) == tabnames[5]) do_validateExtensions(); } QString NewX509::mandatoryDnRemain() { QStringList dnl = MainWindow::mandatory_dn.split(","); x509name n; int i; if (fromReqCB->isChecked() && !reqSubChange->isChecked()) n = getSelectedReq()->getSubject(); else n = getX509name(); for (i=0; i< n.entryCount(); i++) { int j = dnl.indexOf(QString(OBJ_nid2sn(n.nid(i)))); if (j>=0) dnl.removeAt(j); } return dnl.join(","); } void NewX509::gotoTab(int tab) { for (int i=0; i<tabWidget->count(); i++) { if (tabWidget->tabText(i) == tabnames[tab]) { tabWidget->setCurrentIndex(i); break; } } } void NewX509::accept() { x509name xn; on_tabWidget_currentChanged(0); try { xn = getX509name(1); } catch (errorEx &err) { gotoTab(1); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, err.getString(), QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); if (msg.exec() == QMessageBox::Close) { reject(); } return; } QString lenErr = xn.checkLength(); if (!lenErr.isEmpty()) { gotoTab(1); lenErr = tr("The following length restrictions of RFC3280 are violated:") + "\n" + lenErr; QMessageBox msg(QMessageBox::Warning, XCA_TITLE, lenErr, QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Edit subject")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); msg.addButton(QMessageBox::Apply)->setText(tr("Continue rollout")); switch (msg.exec()) { case QMessageBox::Ok: case QMessageBox::Cancel: return; case QMessageBox::Close: reject(); return; case QMessageBox::Apply: break; } } if (fromReqCB->isChecked() && !getSelectedReq()->verify()) { gotoTab(0); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, tr("The verification of the Certificate request failed.\nThe rollout should be aborted."), QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Continue anyway")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); if (msg.exec() == QMessageBox::Close) { reject(); } } if (description->text().isEmpty() && !fromReqCB->isChecked()) { if (commonName->text().isEmpty()) { gotoTab(1); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, tr("The internal name and the common name are empty.\nPlease set at least the internal name."), QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Edit name")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); if (msg.exec() == QMessageBox::Close) { reject(); } return; } else { description->setText(commonName->text()); } } if (keyList->count() == 0 && keyList->isEnabled() && !fromReqCB->isChecked()) { gotoTab(1); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, tr("There is no Key selected for signing."), QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Select key")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); if (msg.exec() == QMessageBox::Close) { reject(); } return; } QString unsetDN; if (pt != tmpl) unsetDN = mandatoryDnRemain(); if (!unsetDN.isEmpty()) { gotoTab(1); QString text = tr("The following distinguished name entries are empty:\n%1\nthough you have declared them as mandatory in the options menu.").arg(unsetDN); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, text, QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Edit subject")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); msg.addButton(QMessageBox::Apply)->setText(tr("Continue rollout")); switch (msg.exec()) { case QMessageBox::Ok: case QMessageBox::Cancel: return; case QMessageBox::Close: reject(); return; case QMessageBox::Apply: break; } } pki_x509 *signer = NULL; if (!selfSignRB->isChecked()) signer = getSelectedSigner(); pki_key *signkey = getSelectedKey(); if (signer) signkey = signer->getRefKey(); if ((!signkey || signkey->isPubKey()) && pt != tmpl) { QString txt; gotoTab(signer ? 0 : 1); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, tr("The key you selected for signing is not a private one."), QMessageBox::NoButton, this); txt = signer ? tr("Select other signer"):tr("Select other key"); msg.addButton(QMessageBox::Ok)->setText(txt); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); if (msg.exec() == QMessageBox::Close) { reject(); } return; } if (signer && notBefore->getDate() < signer->getNotBefore()) { gotoTab(2); QString text = tr("The certificate will be earlier valid than the signer. This is probably not what you want."); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, text, QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Edit dates")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); msg.addButton(QMessageBox::Apply)->setText(tr("Continue rollout")); msg.addButton(QMessageBox::Yes)->setText(tr("Adjust date and continue")); switch (msg.exec()) { case QMessageBox::Ok: case QMessageBox::Cancel: return; case QMessageBox::Close: reject(); return; case QMessageBox::Apply: break; case QMessageBox::Yes: notBefore->setDate(signer->getNotBefore()); } } if (signer && notAfter->getDate() > signer->getNotAfter() && !noWellDefinedExpDate->isChecked()) { gotoTab(2); QString text = tr("The certificate will be longer valid than the signer. This is probably not what you want."); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, text, QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Edit dates")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); msg.addButton(QMessageBox::Apply)->setText(tr("Continue rollout")); msg.addButton(QMessageBox::Yes)->setText(tr("Adjust date and continue")); switch (msg.exec()) { case QMessageBox::Ok: case QMessageBox::Cancel: return; case QMessageBox::Close: reject(); return; case QMessageBox::Apply: break; case QMessageBox::Yes: notAfter->setDate(signer->getNotAfter()); } } if (notBefore->getDate() > notAfter->getDate()) { gotoTab(2); QString text = tr("The certificate will be out of date before it becomes valid. You most probably mixed up both dates."); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, text, QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Edit dates")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); msg.addButton(QMessageBox::Apply)->setText("Continue rollout"); switch (msg.exec()) { case QMessageBox::Ok: case QMessageBox::Cancel: return; case QMessageBox::Close: reject(); return; case QMessageBox::Apply: break; } } if (do_validateExtensions()) { gotoTab(5); QString text = tr("The certificate contains invalid or duplicate extensions. Check the validation on the advanced tab."); QMessageBox msg(QMessageBox::Warning, XCA_TITLE, text, QMessageBox::NoButton, this); msg.addButton(QMessageBox::Ok)->setText(tr("Edit extensions")); msg.addButton(QMessageBox::Close)->setText(tr("Abort rollout")); msg.addButton(QMessageBox::Apply)->setText(tr("Continue rollout")); switch (msg.exec()) { case QMessageBox::Ok: case QMessageBox::Cancel: return; case QMessageBox::Close: reject(); return; case QMessageBox::Apply: break; } } QDialog::accept(); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/NewX509.h�������������������������������������������������������������������������0000664�0000000�0000000�00000007563�11753427512�0015340�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __NEWX509_H #define __NEWX509_H #include "ui_NewX509.h" #include "lib/oid.h" #include "lib/db.h" #include "widgets/kvView.h" #include <openssl/x509v3.h> #include <QtGui/QListWidget> class MainWindow; class extList; class pki_temp; class pki_x509req; class pki_x509; class pki_key; class QPixmap; class QListbox; class x509name; class x509v3ext; class extList; class NewX509: public QDialog, public Ui::NewX509 { Q_OBJECT private: NIDlist eku_nid; NIDlist dn_nid; NIDlist aia_nid; NIDlist attr_nid; QList<QLineEdit*> attr_edit; #define EXPLICIT_NAME_CNT 7 QLineEdit *name_ptr[EXPLICIT_NAME_CNT]; X509V3_CTX ext_ctx; void editV3ext(QLineEdit *le, QString types, int n); enum pki_type pt; void templateChanged(QString templatename); QString mandatoryDnRemain(); QStringList private_keys, private_keys0, tabnames; pki_x509 *ctx_cert; QString v3ext_backup; kvmodel *extDNmodel; extList getExtDuplicates(); void checkIcon(const QString &text, int nid, QLabel*img); public: static int name_nid[EXPLICIT_NAME_CNT]; QRadioButton *selfQASignRB; NewX509(QWidget *parent); virtual ~NewX509(); void initCtx(); void setRequest(); // reduce to request form void setTemp(pki_temp *temp); // reduce to template form void setCert(); // reduce to certificate form void toTemplate(pki_temp *temp); void fromTemplate(pki_temp *temp); void defineTemplate(pki_temp *temp); void defineRequest(pki_x509req *req); void defineSigner(pki_x509 *defcert); void templateChanged(pki_temp *templ); pki_key *getSelectedKey(); pki_x509 *getSelectedSigner(); pki_x509req *getSelectedReq(); x509name getX509name(int _throw = 0); void setX509name(const x509name &n); void setImage(QPixmap *image); void setAuthInfAcc_string(QString aia_txt); QString getAuthInfAcc_string(); x509v3ext getBasicConstraints(); x509v3ext getSubKeyIdent(); x509v3ext getAuthKeyIdent(); x509v3ext getKeyUsage(); x509v3ext getEkeyUsage(); x509v3ext getSubAltName(); x509v3ext getIssAltName(); x509v3ext getCrlDist(); x509v3ext getAuthInfAcc(); extList getGuiExt(); extList getNetscapeExt(); extList getAdvanced(); extList getAllExt(); void setupTmpCtx(); void initCtx(pki_x509 *subj, pki_x509 *iss, pki_x509req *req); void setExt(const x509v3ext &ext); void switchHashAlgo(); void addReqAttributes(pki_x509req *req); int checkExtDuplicates(); void subjectFromTemplate(pki_temp *temp); void extensionsFromTemplate(pki_temp *temp); pki_temp *currentTemplate(); void gotoTab(int tab); void setupLineEditByNid(int nid, QLineEdit *l); int validateExtensions(QString nconf, QString &result); int do_validateExtensions(); void undo_validateExtensions(); public slots: void on_fromReqCB_clicked(); void on_keyList_currentIndexChanged(const QString &); void on_reqList_currentIndexChanged(const QString &); void newKeyDone(QString name); void on_applyTime_clicked(); void on_editSubAlt_clicked(); void on_editIssAlt_clicked(); void on_editCrlDist_clicked(); void on_editAuthInfAcc_clicked(); void on_foreignSignRB_toggled(bool checked); void on_genKeyBut_clicked(); void on_showReqBut_clicked(); void on_certList_currentIndexChanged(int index); void on_applyTemplate_clicked(); void on_applySubject_clicked(); void on_applyExtensions_clicked(); void on_adv_validate_clicked(); void on_usedKeysToo_toggled(bool checked); void on_tabWidget_currentChanged(int idx); void on_reqSubChange_clicked(); void accept(); void setupExtDNwidget(const QString &s, QLineEdit *w); void checkSubAltName(const QString & text); void checkIssAltName(const QString & text); void checkCrlDist(const QString & text); void checkAuthInfAcc(const QString & text); signals: void genKey(QString); void showReq(QString req); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/NewX509_ext.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000017045�11753427512�0016547�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "NewX509.h" #include <QtGui/QCheckBox> #include <QtGui/QComboBox> #include <QtGui/QRadioButton> #include <QtGui/QLineEdit> #include <QtGui/QListWidget> #include <QtGui/QMessageBox> #include "MainWindow.h" #include "lib/x509v3ext.h" #include "lib/func.h" x509v3ext NewX509::getBasicConstraints() { QStringList cont; x509v3ext ext; QString ca[] = { "", "CA:TRUE", "CA:FALSE" }; if (basicCA->currentIndex() > 0) { if (bcCritical->isChecked()) cont << "critical"; cont << ca[basicCA->currentIndex()]; if (basicCA->currentIndex() == 1 && !basicPath->text().isEmpty()) { cont << QString("pathlen:") + QString::number(basicPath->text().toInt()); } ext.create(NID_basic_constraints, cont.join(", "), &ext_ctx); } return ext; } x509v3ext NewX509::getSubKeyIdent() { x509v3ext ext; if (subKey->isChecked()) ext.create(NID_subject_key_identifier, "hash", &ext_ctx); return ext; } x509v3ext NewX509::getAuthKeyIdent() { x509v3ext ext; if (!authKey->isChecked() || !authKey->isEnabled()) return ext; QString x = "keyid,issuer:always"; if (ext_ctx.issuer_cert && X509_get_ext_by_NID(ext_ctx.issuer_cert, NID_subject_key_identifier, -1) != -1) { x = "keyid:always,issuer:always"; } ext.create(NID_authority_key_identifier, x, &ext_ctx); return ext; } x509v3ext NewX509::getKeyUsage() { QString keyusage[] = { "digitalSignature", "nonRepudiation", "keyEncipherment", "dataEncipherment", "keyAgreement", "keyCertSign", "cRLSign", "encipherOnly", "decipherOnly" }; QStringList cont; x509v3ext ext; int rows = keyUsage->count(); for (int i=0; i<rows; i++) { if (keyUsage->isItemSelected(keyUsage->item(i))) { cont << keyusage[i]; } } if (kuCritical->isChecked() && cont.count() > 0) cont.prepend("critical"); ext.create(NID_key_usage, cont.join(", "), &ext_ctx); return ext; } x509v3ext NewX509::getEkeyUsage() { QStringList cont; x509v3ext ext; int rows = ekeyUsage->count(); for (int i=0; i<rows; i++) { //QListWidgetItem *li = ekeyUsage->item(i); //printf("rows = %d, ekeyUsage = %d, %p\n", rows, i, li); if (ekeyUsage->isItemSelected(ekeyUsage->item(i))) { cont << QString(OBJ_nid2sn(eku_nid[i])); } } if (ekuCritical->isChecked() && cont.count() > 0) cont.prepend("critical"); ext.create(NID_ext_key_usage, cont.join(", "), &ext_ctx); return ext; } x509v3ext NewX509::getSubAltName() { x509v3ext ext; QString s = subAltName->text(); if (pt == x509_req) { QStringList sn, sl = s.split(','); foreach (QString str, sl) { if (str != "email:copy") sn += str; } s = sn.join(","); } ext.create(NID_subject_alt_name, s, &ext_ctx); return ext; } x509v3ext NewX509::getIssAltName() { x509v3ext ext; QString s = issAltName->text(); if (pt == x509_req) { QStringList sn, sl = s.split(','); foreach (QString str, sl) { if (str != "issuer:copy") sn += str; } s = sn.join(","); } ext.create(NID_issuer_alt_name, s, &ext_ctx); return ext; } x509v3ext NewX509::getCrlDist() { x509v3ext ext; if (!crlDist->text().isEmpty()) { ext.create(NID_crl_distribution_points, crlDist->text(), &ext_ctx); } return ext; } QString NewX509::getAuthInfAcc_string() { QString rval=""; QString aia_txt = authInfAcc->text(); aia_txt = aia_txt.trimmed(); if (!aia_txt.isEmpty()) { rval = OBJ_nid2sn(aia_nid[aiaOid->currentIndex()]); rval += ";" + aia_txt; } openssl_error(); return rval; } void NewX509::setAuthInfAcc_string(QString aia_txt) { int nid, idx; idx = aia_txt.indexOf(';'); if (idx == -1) return; nid = OBJ_txt2nid(CCHAR(aia_txt.left(idx))); for (int i=0; i < aia_nid.count(); i++) { if (aia_nid[i] == nid) { aiaOid->setCurrentIndex(i); } } authInfAcc->setText(aia_txt.mid(idx +1)); } x509v3ext NewX509::getAuthInfAcc() { x509v3ext ext; QString aia_txt = getAuthInfAcc_string(); if (!aia_txt.isEmpty()) { ext.create(NID_info_access, aia_txt, &ext_ctx); } return ext; } extList NewX509::getAdvanced() { QString conf_str; CONF *conf; BIO *bio; extList elist; long err_line=0; STACK_OF(X509_EXTENSION) **sk, *sk_tmp = NULL; const char *ext_name = "default"; int ret, start; if (nconf_data->isReadOnly()) { conf_str = v3ext_backup; } else { conf_str = nconf_data->toPlainText(); } if (conf_str.isEmpty()) return elist; QByteArray cs = conf_str.toAscii(); bio = BIO_new_mem_buf(cs.data(), cs.length()); if (!bio) return elist; conf = NCONF_new(NULL); ret = NCONF_load_bio(conf, bio, &err_line); if (ret != 1) { BIO_free(bio); openssl_error(tr("Configfile error on line %1\n"). arg(err_line)); return elist; } if (ext_ctx.subject_cert) { sk = &ext_ctx.subject_cert->cert_info->extensions; start = *sk ? sk_X509_EXTENSION_num(*sk) : 0; } else { sk = &sk_tmp; start = 0; } X509V3_set_nconf(&ext_ctx, conf); if (X509V3_EXT_add_nconf_sk(conf, &ext_ctx, (char *)ext_name, sk)) { openssl_error(); } elist.setStack(*sk, start); if (sk == &sk_tmp) sk_X509_EXTENSION_pop_free(sk_tmp, X509_EXTENSION_free); X509V3_set_nconf(&ext_ctx, NULL); NCONF_free(conf); BIO_free(bio); openssl_error(); return elist; } extList NewX509::getGuiExt() { extList ne; ne << getBasicConstraints(); ne << getSubKeyIdent(); ne << getAuthKeyIdent(); ne << getKeyUsage(); ne << getEkeyUsage(); ne << getSubAltName(); ne << getIssAltName(); ne << getCrlDist(); ne << getAuthInfAcc(); openssl_error(); return ne; } extList NewX509::getAllExt() { extList ne; ne = getGuiExt(); ne += getAdvanced(); ne += getNetscapeExt(); return ne; } extList NewX509::getNetscapeExt() { QString certTypeList[] = { "client", "server", "email", "objsign", "sslCA", "emailCA", "objCA" }; QStringList cont; x509v3ext ext; extList el; int rows = nsCertType->count(); for (int i=0; i<rows; i++) { if (nsCertType->isItemSelected(nsCertType->item(i))) { cont << certTypeList[i]; } } el << ext.create(NID_netscape_cert_type, cont.join(", "), &ext_ctx); el << ext.create(NID_netscape_base_url, nsBaseUrl->text(), &ext_ctx); el << ext.create(NID_netscape_revocation_url, nsRevocationUrl->text(), &ext_ctx); el << ext.create(NID_netscape_ca_revocation_url, nsCARevocationUrl->text(), &ext_ctx); el << ext.create(NID_netscape_renewal_url, nsRenewalUrl->text(), &ext_ctx); el << ext.create(NID_netscape_ca_policy_url, nsCaPolicyUrl->text(), &ext_ctx); el << ext.create(NID_netscape_ssl_server_name, nsSslServerName->text(), &ext_ctx); el << ext.create(NID_netscape_comment, nsComment->text(), &ext_ctx); return el; } void NewX509::initCtx(pki_x509 *subj, pki_x509 *iss, pki_x509req *req) { X509 *s = NULL, *s1 = NULL; X509_REQ *r = NULL; if (subj) s1 = subj->getCert(); if (iss) s = iss->getCert(); if (req) r = req->getReq(); X509V3_set_ctx(&ext_ctx, s, s1, r, NULL, 0); } extList NewX509::getExtDuplicates() { int i, start, cnt, n1, n; x509v3ext e; STACK_OF(X509_EXTENSION) *sk; extList el_dup, el; QString olist; if (ext_ctx.subject_cert) { sk = ext_ctx.subject_cert->cert_info->extensions; } else return el_dup; el.setStack(sk, 0); if (fromReqCB->isChecked() && copyReqExtCB->isChecked()) { el += getSelectedReq()->getV3ext(); } cnt = el.size(); for (start=0; start < cnt; start++) { n1 = el[start].nid(); for (i = start+1; i<cnt; i++) { e = el[i]; n = e.nid(); if (n1 == n) { // DUPLICATE if (el_dup.idxByNid(n1) ==-1) el_dup << e; } } } return el_dup; } void NewX509::setExt(const x509v3ext &ext) { switch (ext.nid()) { case NID_basic_constraints: bcCritical->setChecked(ext.getCritical()); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/Options.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000007462�11753427512�0016205�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "lib/func.h" #include "Options.h" #include "SearchPkcs11.h" #include "lib/pki_scard.h" #include <openssl/objects.h> #include <QtGui/QMessageBox> #include <QtGui/QToolTip> Options::Options(MainWindow *parent) :QDialog(parent) { mw = parent; NIDlist dn_nid = *MainWindow::dn_nid; setWindowTitle(tr(XCA_TITLE)); setupUi(this); for (int i=0; i < dn_nid.count(); i++) extDNobj->addItem(OBJ_nid2ln(dn_nid[i])); string_opts << "MASK:0x2002" << "pkix" << "nombstr" << "utf8only" << "default"; QStringList s; s << tr("Printable string or UTF8 (default)") << tr("PKIX recommendation in RFC2459") << tr("No BMP strings, only printable and T61") << tr("UTF8 strings only (RFC2459)") << tr("All strings"); mbstring->addItems(s); searchP11 = NULL; } Options::~Options() { if (searchP11) delete searchP11; } void Options::on_extDNadd_clicked() { extDNlist->addItem(extDNobj->currentText()); } void Options::on_extDNdel_clicked() { extDNlist->takeItem(extDNlist->currentRow()); } void Options::setDnString(QString dn) { QStringList dnl; if (!dn.isEmpty()) dnl = dn.split(","); for (int i=0; i < dnl.count(); i++) { int nid = OBJ_sn2nid(CCHAR(dnl[i])); extDNlist->insertItem(0, OBJ_nid2ln(nid)); } } QString Options::getDnString() { QStringList dn; for (int j=0; j<extDNlist->count(); j++) { int nid = OBJ_ln2nid(CCHAR(extDNlist->item(j)->text())); dn << QString(OBJ_nid2sn(nid)); } return dn.join(","); } void Options::setStringOpt(const QString string_opt) { int index = string_opts.indexOf(string_opt); if (index < 0) index = 0; mbstring->setCurrentIndex(index); } QString Options::getStringOpt() { return string_opts[mbstring->currentIndex()]; } void Options::on_addButton_clicked(void) { load_pkcs11 l; QString fname; fname = QFileDialog::getOpenFileName(this, l.caption, getLibDir(), l.filter); addLib(fname); } void Options::addLib(QString fname) { pkcs11_lib *lib; QString status; fname = QFileInfo(fname).canonicalFilePath(); if (fname.isEmpty() || pkcs11::get_lib(fname)) return; try { lib = pkcs11::load_lib(fname, false); if (lib) status = lib->driverInfo(); } catch (errorEx &ex) { lib = NULL; status = ex.getString(); } status = status.trimmed(); QListWidgetItem *item = new QListWidgetItem(fname); item->setToolTip(status); if (lib) item->setIcon(*MainWindow::doneIco); pkcs11List->addItem(item); if (searchP11) QToolTip::showText(searchP11->mapToGlobal( QPoint(0,0)), status); } void Options::on_removeButton_clicked(void) { QListWidgetItem *item = pkcs11List->takeItem(pkcs11List->currentRow()); if (!item) return; try { pkcs11::remove_lib(item->text()); } catch (errorEx &err) { mw->Error(err); } } void Options::on_searchPkcs11_clicked(void) { if (!searchP11) { searchP11 = new SearchPkcs11(this, QString()); connect(searchP11, SIGNAL(addLib(QString)), this, SLOT(addLib(QString))); } searchP11->show(); } void Options::setupPkcs11Provider(QString list) { pkcs11_lib_list libs = pkcs11::get_libs(); foreach(pkcs11_lib *l, libs) { QListWidgetItem *item = new QListWidgetItem(l->filename()); try { item->setToolTip(l->driverInfo()); item->setIcon(*MainWindow::doneIco); } catch (errorEx &err) { mw->Error(err); } pkcs11List->addItem(item); } if (!list.isEmpty()) { foreach(QString libname, list.split('\n')) { if (libs.get_lib(libname)) continue; QListWidgetItem *item = new QListWidgetItem(libname); item->setToolTip(tr("Load failed")); pkcs11List->addItem(item); } } } QString Options::getPkcs11Provider() { QStringList prov; for (int j=0; j<pkcs11List->count(); j++) { prov << pkcs11List->item(j)->text(); } if (prov.count() == 0) return QString(""); return prov.join("\n"); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/Options.h�������������������������������������������������������������������������0000664�0000000�0000000�00000001600�11753427512�0015636�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 20012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __OPTIONS_H #define __OPTIONS_H #include "ui_Options.h" #include <QtGui/QDialog> #include "lib/base.h" #include "SearchPkcs11.h" #include "MainWindow.h" class Options: public QDialog, public Ui::Options { Q_OBJECT private: SearchPkcs11 *searchP11; QStringList string_opts; MainWindow *mw; public: Options(MainWindow *parent); ~Options(); void setupPkcs11Provider(QString list); void setStringOpt(const QString string_opt); QString getDnString(); QString getStringOpt(); QString getPkcs11Provider(); void setDnString(QString dn); public slots: void on_extDNadd_clicked(); void on_extDNdel_clicked(); void on_addButton_clicked(void); void on_removeButton_clicked(void); void on_searchPkcs11_clicked(void); void addLib(QString); }; #endif ��������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/PwDialog.cpp����������������������������������������������������������������������0000664�0000000�0000000�00000005153�11753427512�0016253�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "PwDialog.h" #include "lib/base.h" #include "lib/Passwd.h" #include "widgets/MainWindow.h" #include <QtGui/QLabel> #include <QtGui/QMessageBox> static int hex2bin(QString &x, Passwd *final) { bool ok = false; int len = x.length(); if (len % 2) return -1; len /= 2; final->clear(); for (int i=0; i<len; i++) { final->append((x.mid(i*2, 2).toInt(&ok, 16)) & 0xff); if (!ok) return -1; } return len; } int PwDialog::execute(pass_info *p, Passwd *passwd, bool write, bool abort) { PwDialog *dlg; int ret; dlg = new PwDialog(p, write); if (abort) dlg->addAbortButton(); ret = dlg->exec(); *passwd = dlg->getPass(); delete dlg; return ret; } int PwDialog::pwCallback(char *buf, int size, int rwflag, void *userdata) { int ret; pass_info *p = (pass_info *)userdata; PwDialog *dlg = new PwDialog(p, rwflag); ret = dlg->exec(); QByteArray pw = dlg->getPass(); size = MIN(size, pw.size()); memcpy(buf, pw.constData(), size); delete dlg; return ret == 1 ? size : 0; } PwDialog::PwDialog(pass_info *p, bool write) :QDialog(p->getWidget()) { pi = p; setupUi(this); image->setPixmap(pi->getImage()); description->setText(pi->getDescription()); title->setText(pi->getType()); if (!pi->getTitle().isEmpty()) setWindowTitle(pi->getTitle()); else setWindowTitle(XCA_TITLE); if (pi->getType() != "PIN") takeHex->hide(); setRW(write); } void PwDialog::setRW(bool write) { wrDialog = write; if (write) { label->setText(pi->getType()); repeatLabel->setText(tr("Repeat %1").arg(pi->getType())); label->show(); passA->show(); } else { repeatLabel->setText(pi->getType()); label->hide(); passA->hide(); } } void PwDialog::accept() { if (wrDialog && (passA->text() != passB->text())) { QMessageBox::warning(this, XCA_TITLE, tr("%1 missmatch").arg(pi->getType())); return; } QString pw = passB->text(); if (takeHex->isChecked()) { int ret = hex2bin(pw, &final); if (ret == -1) { QMessageBox::warning(this, XCA_TITLE, tr("Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it must consist of an even number of characters")); return; } } else { final = pw.toAscii(); } QDialog::accept(); } void PwDialog::buttonPress(QAbstractButton *but) { switch (buttonBox->standardButton(but)) { case QDialogButtonBox::Ok: accept(); break; case QDialogButtonBox::Cancel: reject(); break; case QDialogButtonBox::Abort: default: done(2); } } void PwDialog::addAbortButton() { buttonBox->addButton(tr("E&xit"), QDialogButtonBox::ResetRole); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/PwDialog.h������������������������������������������������������������������������0000664�0000000�0000000�00000001436�11753427512�0015720�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PWDIALOG_H #define __PWDIALOG_H #include <QtCore/QByteArray> #include "ui_PwDialog.h" #include "lib/Passwd.h" #include "lib/pki_x509.h" #include "lib/pass_info.h" class PwDialog: public QDialog, public Ui::PwDialog { Q_OBJECT private: bool wrDialog; Passwd final; pass_info *pi; public: PwDialog(pass_info *p, bool write = false); Passwd getPass() { return final; } void addAbortButton(); void setRW(bool write); static int execute(pass_info *p, Passwd *passwd, bool write = false, bool abort = false); static int pwCallback(char *buf, int size, int rwflag, void *userdata); public slots: void accept(); void buttonPress(QAbstractButton *but); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/SearchPkcs11.cpp������������������������������������������������������������������0000664�0000000�0000000�00000007366�11753427512�0016745�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "SearchPkcs11.h" #include "lib/base.h" #include "lib/func.h" #include "lib/pkcs11_lib.h" #include <QtGui/QComboBox> #include <QtGui/QLineEdit> #include <QtGui/QFileDialog> #include <QtGui/QPushButton> #include <QtGui/QMessageBox> #include <QtCore/QStringList> #include <QtCore/QFile> SearchPkcs11::SearchPkcs11(QWidget *parent, QString fname) :QDialog(parent) { setupUi(this); filename->setText(fname); setWindowTitle(XCA_TITLE); filename->setText(getLibDir()); searching = NULL; } SearchPkcs11::~SearchPkcs11() { if (searching) search->click(); } void SearchPkcs11::on_fileBut_clicked() { QString s = QFileDialog::getExistingDirectory(this, QString(XCA_TITLE), filename->text()); if (!s.isEmpty()) { QDir::convertSeparators(s); filename->setText(s); } } void SearchPkcs11::on_search_clicked() { if (searching) { return; } searching = new searchThread(filename->text(), getLibExtensions(), subdirs->isChecked()); liblist->clear(); connect(searching, SIGNAL(updateLibs(QString)), this, SLOT(updateLibs(QString))); connect(searching, SIGNAL(updateCurrFile(QString)), this, SLOT(updateCurrFile(QString))); connect(searching, SIGNAL(finished()), this, SLOT(finishSearch())); connect(search, SIGNAL(clicked()), searching, SLOT(cancelSearch())); search->setText("Cancel"); searching->start(); } void SearchPkcs11::finishSearch() { search->setText("Start"); currFile->setText(tr("The following files are possible PKCS#11 libraries")); if (!searching) return; searching->wait(1000); delete searching; searching = NULL; } void SearchPkcs11::buttonPress(QAbstractButton *but) { QList<QListWidgetItem *> libitems; QListWidgetItem *lib; switch (buttonBox->standardButton(but)) { case QDialogButtonBox::Ok: accept(); break; default: case QDialogButtonBox::Cancel: reject(); break; case QDialogButtonBox::Open: libitems = liblist->selectedItems(); foreach(lib, libitems) loadItem(lib); break; } } void SearchPkcs11::loadItem(QListWidgetItem *lib) { emit addLib(lib->text()); delete lib; } void SearchPkcs11::updateCurrFile(QString f) { int len = f.length(); QString reduced = f; QFontMetrics fm(currFile->font()); currFile->setToolTip(f); while ((currFile->width() < (fm.width(reduced) -10)) && (len > 0)) { len -= 10; reduced = compressFilename(f, len); } currFile->setText(reduced); currFile->update(); } void SearchPkcs11::updateLibs(QString f) { liblist->addItem(new QListWidgetItem(f)); liblist->update(); } searchThread::searchThread(QString _dir, QStringList _ext, bool _recursive) { dirname = _dir; ext = _ext; recursive = _recursive; keepOnRunning = true; } void searchThread::cancelSearch() { keepOnRunning = false; } bool searchThread::checkLib(QString file) { qint64 siz; int r = -1; QFile qf(file); siz = qf.size(); if (qf.open(QIODevice::ReadOnly)) { uchar *p = qf.map(0, siz); r = QByteArray::fromRawData((char*)p, siz) .indexOf("C_GetFunctionList"); qf.unmap(p); qf.close(); } return r != -1; } void searchThread::search(QString mydir) { QDir dir = QDir(mydir); QStringList files = dir.entryList( QStringList(ext), QDir::Files | QDir::Readable); while (!files.isEmpty() && keepOnRunning) { QString file = files.takeFirst(); if (file.isEmpty()) continue; file = mydir + QDir::separator() + file; emit updateCurrFile(file); if (checkLib(file)) emit updateLibs(file); } if (recursive && keepOnRunning) { QString d; QStringList dirs = dir.entryList(QStringList(), QDir::AllDirs | QDir::NoDotAndDotDot); foreach(d, dirs) { if (!keepOnRunning) break; QString s = mydir +QDir::separator() +d; emit updateCurrFile(s); search(s); } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/SearchPkcs11.h��������������������������������������������������������������������0000664�0000000�0000000�00000002245�11753427512�0016401�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __SEARCHPKCS11DIALOG_H #define __SEARCHPKCS11DIALOG_H #include <QtCore/QThread> #include "ui_SearchPkcs11.h" class SearchPkcs11; class searchThread: public QThread { Q_OBJECT protected: QString dirname; QStringList ext; bool recursive; bool keepOnRunning; bool checkLib(QString file); public: searchThread(QString _dir, QStringList _ext, bool _recursive); void search(QString mydir); void run() { search(dirname); } public slots: void cancelSearch(); signals: void updateCurrFile(QString f); void updateLibs(QString f); }; class SearchPkcs11: public QDialog, public Ui::SearchPkcs11 { Q_OBJECT protected: void searchDir(QString dirname, bool subdirs); searchThread *searching; public: SearchPkcs11(QWidget *parent, QString fname); ~SearchPkcs11(); public slots: void on_search_clicked(); void on_fileBut_clicked(); void buttonPress(QAbstractButton *but); void loadItem(QListWidgetItem *lib); void updateLibs(QString f); void updateCurrFile(QString f); void finishSearch(); signals: void addLib(QString); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/XcaTreeView.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000010723�11753427512�0016732�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #include "XcaTreeView.h" #include "lib/db_base.h" #include <QtCore/QAbstractItemModel> #include <QtGui/QAbstractItemView> #include <QtGui/QHeaderView> #include <QtGui/QContextMenuEvent> #include <QtCore/QVariant> XcaTreeView::XcaTreeView(QWidget *parent) :QTreeView(parent) { setHeader(new XcaHeaderView()); setAlternatingRowColors(true); setSelectionMode(QAbstractItemView::ExtendedSelection); setEditTriggers(QAbstractItemView::EditKeyPressed); setRootIsDecorated(false); setUniformRowHeights (true); //setAnimated(true); proxy = new XcaProxyModel(this); setSortingEnabled(true); proxy->setDynamicSortFilter(true); sortByColumn(0, Qt::AscendingOrder); basemodel = NULL; connect(header(), SIGNAL(sectionHandleDoubleClicked(int)), this, SLOT(resizeColumnToContents(int))); header()->setClickable(true); } XcaTreeView::~XcaTreeView() { delete proxy; } void XcaTreeView::contextMenuEvent(QContextMenuEvent * e) { if (!basemodel) return; basemodel->showContextMenu(e, getIndex(indexAt(e->pos()))); } void XcaTreeView::showHideSections() { if (!basemodel) return; int i, max = basemodel->columnCount(QModelIndex()); basemodel->colResizeStart(); for (i=0; i<max; i++) { if (basemodel->columnHidden(i)) header()->hideSection(i); else header()->showSection(i); } basemodel->colResizeEnd(); columnsResize(); } void XcaTreeView::setModel(QAbstractItemModel *model) { QByteArray ba; basemodel = (db_base *)model; proxy->setSourceModel(model); QTreeView::setModel(proxy); if (basemodel) { connect(basemodel, SIGNAL(resetHeader()), header(), SLOT(resetMoves())); connect(basemodel, SIGNAL(resetHeader()), this, SLOT(columnsResize())); connect(basemodel, SIGNAL(updateHeader()), this, SLOT(showHideSections())); connect(header(), SIGNAL(sectionMoved(int,int,int)), this, SLOT(sectionMoved(int,int,int))); connect(header(), SIGNAL(sectionResized(int,int,int)), basemodel, SLOT(sectionResized(int,int,int))); connect(header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), basemodel, SLOT(sortIndicatorChanged(int,Qt::SortOrder))); connect(basemodel, SIGNAL(columnsContentChanged()), this, SLOT(columnsResize())); connect(basemodel, SIGNAL(columnsContentChanged()), proxy, SLOT(invalidate())); connect(basemodel, SIGNAL(editItem(const QModelIndex &)), this, SLOT(editIdx(const QModelIndex &))); basemodel->initHeaderView(header()); } showHideSections(); } void XcaTreeView::headerEvent(QContextMenuEvent *e, int col) { basemodel->showHeaderMenu(e, col); } QModelIndex XcaTreeView::getIndex(const QModelIndex &index) { return proxy->mapToSource(index); } QModelIndex XcaTreeView::getProxyIndex(const QModelIndex &index) { return proxy->mapFromSource(index); } QModelIndexList XcaTreeView::getSelectedIndexes() { QItemSelection indexes = selectionModel()->selection(); return proxy->mapSelectionToSource(indexes).indexes(); } void XcaTreeView::columnsResize() { int cnt, i; if (!basemodel) return; cnt = basemodel->columnCount(QModelIndex()); basemodel->colResizeStart(); for (i=0; i<cnt; i++) { if (!basemodel->fixedHeaderSize(i)) { resizeColumnToContents(i); } } basemodel->colResizeEnd(); } void XcaTreeView::sectionMoved(int, int, int) { int cnt = header()->count(); for (int i=0; i<cnt; i++) { basemodel->setVisualIndex(i, header()->visualIndex(i)); } } void XcaTreeView::editIdx(const QModelIndex &idx) { edit(proxy->mapFromSource(idx)); } XcaProxyModel::XcaProxyModel(QWidget *parent) :QSortFilterProxyModel(parent) { } bool XcaProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { db_base *db = (db_base *)sourceModel(); if (!db) return QSortFilterProxyModel::lessThan(left, right); if (db->isNumericCol(left.column()) && db->isNumericCol(right.column())) { int diff; QString l = sourceModel()->data(left).toString(); QString r = sourceModel()->data(right).toString(); diff = l.size() - r.size(); if (diff<0) return true; else if (diff>0) return false; else return l < r; } return QSortFilterProxyModel::lessThan(left, right); } void XcaHeaderView::contextMenuEvent(QContextMenuEvent * e) { XcaTreeView *tv = (XcaTreeView *)parentWidget(); if (tv) tv->headerEvent(e, logicalIndexAt(e->pos())); } void XcaHeaderView::resetMoves() { for (int i=0; i<count(); i++) { if (i != visualIndex(i)) { moveSection(visualIndex(i), i); i=0; } } } ���������������������������������������������xca_0.9.3/widgets/XcaTreeView.h���������������������������������������������������������������������0000664�0000000�0000000�00000002530�11753427512�0016374�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __XCATREEVIEW_H #define __XCATREEVIEW_H #include <QtGui/QTreeView> #include <QtGui/QItemSelectionModel> #include <QtGui/QSortFilterProxyModel> #include <QtGui/QHeaderView> #include "lib/db_base.h" class db_base; class XcaHeaderView: public QHeaderView { Q_OBJECT public: XcaHeaderView() :QHeaderView(Qt::Horizontal) { setMovable(true); } void contextMenuEvent(QContextMenuEvent *e); public slots: void resetMoves(); }; class XcaTreeView: public QTreeView { Q_OBJECT protected: db_base *basemodel; QSortFilterProxyModel *proxy; public: XcaTreeView(QWidget *parent = 0); ~XcaTreeView(); void contextMenuEvent(QContextMenuEvent *e); void setModel(QAbstractItemModel *model); QModelIndex getIndex(const QModelIndex &index); QModelIndex getProxyIndex(const QModelIndex &index); QModelIndexList getSelectedIndexes(); void headerEvent(QContextMenuEvent *e, int col); public slots: void showHideSections(); void sectionMoved(int idx, int oldI, int newI); void columnsResize(); void editIdx(const QModelIndex &idx); }; class XcaProxyModel: public QSortFilterProxyModel { Q_OBJECT public: XcaProxyModel(QWidget *parent = 0); bool lessThan(const QModelIndex &left, const QModelIndex &right) const; }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/clicklabel.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000003046�11753427512�0016631�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #include "clicklabel.h" #include <QtGui/QToolTip> #include <QtGui/QPalette> #include <QtGui/QColor> ClickLabel::ClickLabel(QWidget *parent) :QLabel(parent) { QFont fnt( font() ); fnt.setBold(true); setFont( fnt ); setFrameShape( QLabel::Panel ); setFrameShadow( QLabel::Sunken ); setAlignment( Qt::AlignCenter ); setToolTip( tr("Double click for details") ); setAutoFillBackground(true); QPalette pal = palette(); QColor col = QColor(0xff, 0xff, 0xff); pal.setColor(QPalette::Normal, QPalette::Window, col ); pal.setColor(QPalette::Inactive, QPalette::Window, col ); setPalette( pal ); setTextFormat(Qt::PlainText); } void ClickLabel::mouseDoubleClickEvent ( QMouseEvent * e ) { QWidget::mouseDoubleClickEvent(e); emit doubleClicked(text()); } void ClickLabel::setColor(const QColor &col) { QPalette pal = palette(); pal.setColor(QPalette::Normal, QPalette::WindowText, col ); pal.setColor(QPalette::Inactive, QPalette::WindowText, col ); setPalette( pal ); } void ClickLabel::setRed() { setColor( QColor( 192, 32, 32) ); } void ClickLabel::setGreen() { setColor( QColor( 32, 192, 32) ); } void ClickLabel::disableToolTip() { setToolTip(QString()); } CopyLabel::CopyLabel(QWidget *parent) :QLabel(parent) { setFrameShape(QFrame::Panel); setFrameShadow(QFrame::Sunken); setTextFormat(Qt::PlainText); #if QT_VERSION >= 0x040200 setTextInteractionFlags( Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard ); #endif } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/clicklabel.h����������������������������������������������������������������������0000664�0000000�0000000�00000001116�11753427512�0016272�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __CLICKLABEL_H #define __CLICKLABEL_H #include <QtGui/QLabel> class QMouseEvent; class ClickLabel : public QLabel { Q_OBJECT public: ClickLabel(QWidget *parent); void setRed(); void setGreen(); void disableToolTip(); protected: void mouseDoubleClickEvent ( QMouseEvent * e ); void setColor(const QColor &col); signals: void doubleClicked(QString text); }; class CopyLabel : public QLabel { Q_OBJECT public: CopyLabel(QWidget *parent); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/distname.cpp����������������������������������������������������������������������0000664�0000000�0000000�00000003176�11753427512�0016354�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "distname.h" #include <QtGui/QLabel> #include <QtGui/QPushButton> #include <QtGui/QLineEdit> #include "lib/x509name.h" #include "lib/base.h" #include "widgets/clicklabel.h" DistName::DistName(QWidget* parent) : QWidget(parent) { DistNameLayout = new QGridLayout(); DistNameLayout->setAlignment(Qt::AlignTop); DistNameLayout->setSpacing(6); DistNameLayout->setMargin(11); QGridLayout *g = new QGridLayout(); g->setAlignment(Qt::AlignTop); g->setSpacing(6); g->setMargin(11); QVBoxLayout *v = new QVBoxLayout(this); v->setSpacing(6); v->setMargin(11); v->addLayout(DistNameLayout); v->addStretch(); v->addLayout(g); rfc2253 = new QLineEdit(this); rfc2253->setReadOnly(true); g->addWidget(new QLabel(QString("RFC 2253:"), this), 0, 0); g->addWidget(rfc2253, 0, 1); namehash = new QLineEdit(this); namehash->setReadOnly(true); g->addWidget(new QLabel(QString("Hash:"), this), 1, 0); g->addWidget(namehash, 1, 1); } void DistName::setX509name(const x509name &n) { QLabel *l1, *l2; QStringList sl; for (int i=0; i<n.entryCount(); i++) { l1 = new QLabel( this ); l2 = new CopyLabel( this ); l1->setTextFormat(Qt::PlainText); sl = n.entryList(i); l1->setText(sl[1]); if (l1->text().isEmpty()) l1->setText(sl[0]); l2->setText(sl[2]); l1->setToolTip(sl[0]); l2->setToolTip(sl[3]); DistNameLayout->addWidget( l1, i, 0 ); DistNameLayout->addWidget( l2, i, 1 ); } rfc2253->setText(n.oneLine(XN_FLAG_RFC2253)); rfc2253->setCursorPosition(0); namehash->setText(n.hash()); updateGeometry(); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/distname.h������������������������������������������������������������������������0000664�0000000�0000000�00000001000�11753427512�0016001�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __DISTNAME_H #define __DISTNAME_H #include <QtGui/QWidget> #include <QtGui/QGridLayout> class x509name; class QLabel; class QComboBox; class QLineEdit; class myGridlayout; class DistName : public QWidget { Q_OBJECT public: DistName(QWidget *parent); void setX509name(const x509name &n); protected: QGridLayout* DistNameLayout; QLineEdit *rfc2253; QLineEdit *namehash; }; #endif xca_0.9.3/widgets/hashBox.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000004011�11753427512�0016131�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2007 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #include "hashBox.h" #include "lib/base.h" static struct { const char *name; const EVP_MD *md; } hashalgos[] = { { "MD 5", EVP_md5() }, { "SHA 1", EVP_sha1() }, { "SHA 256", EVP_sha256() }, { "SHA 384", EVP_sha384() }, { "SHA 512", EVP_sha512() }, { "RIPEMD 160", EVP_ripemd160() }, }; QString hashBox::default_md = QString(); void hashBox::resetDefault() { /* SHA1 */ default_md = QString(hashalgos[1].name); } hashBox::hashBox(QWidget *parent) :QComboBox(parent) { setupAllHashes(); setDefaultHash(); } void hashBox::setKeyType(int type) { key_type = type; } const EVP_MD *hashBox::currentHash() { switch(key_type) { case EVP_PKEY_DSA: return EVP_dss1(); #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: return EVP_ecdsa(); #endif default: QString hash = currentText(); for (unsigned i=0; i<ARRAY_SIZE(hashalgos); i++) { if (hash == hashalgos[i].name) return hashalgos[i].md; } } return hashalgos[1].md; /* SHA1 as fallback */ } void hashBox::setCurrentString(QString md) { int idx = findText(md); if (idx != -1) { setCurrentIndex(idx); wanted_md = ""; } else { wanted_md = md; } } void hashBox::setupHashes(QList<int> nids) { QString md = currentText(); if (!wanted_md.isEmpty()) md = wanted_md; clear(); for (unsigned i=0; i<ARRAY_SIZE(hashalgos); i++) { if (nids.contains(hashalgos[i].md->type)) { addItem(QString(hashalgos[i].name)); } } setDefaultHash(); setCurrentString(md); } void hashBox::setupAllHashes() { QString md = currentText(); if (!wanted_md.isEmpty()) md = wanted_md; clear(); for (unsigned i=0; i<ARRAY_SIZE(hashalgos); i++) { addItem(QString(hashalgos[i].name)); } setCurrentString(md); } QString hashBox::currentHashName() { return currentText(); } void hashBox::setDefaultHash() { setCurrentString(default_md); } void hashBox::setCurrentAsDefault() { default_md = currentText(); } void hashBox::setDefault(QString def) { default_md = def; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/hashBox.h�������������������������������������������������������������������������0000664�0000000�0000000�00000001273�11753427512�0015605�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2007 - 2011 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __HASH_BOX_H #define __HASH_BOX_H #include <QtGui/QComboBox> #include <openssl/evp.h> class hashBox: public QComboBox { Q_OBJECT private: static QString default_md; QString wanted_md; int backup; int key_type; public: hashBox(QWidget *parent); void setKeyType(int type); const EVP_MD *currentHash(); QString currentHashName(); void setCurrentAsDefault(); void setDefaultHash(); void setupHashes(QList<int> nids); void setupAllHashes(); void setCurrentString(QString md); static void setDefault(QString def); static void resetDefault(); }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/kvView.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000013114�11753427512�0016014�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2010 Christian Hohnstaedt. * * All rights reserved. */ #include "lib/func.h" #include "widgets/kvView.h" #include <QtGui/QHeaderView> #include <QtGui/QLineEdit> QWidget *comboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const { QComboBox *editor = new QComboBox(parent); editor->addItems(keys); return editor; } void comboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString v = index.model()->data(index, Qt::EditRole).toString(); QComboBox *c = static_cast<QComboBox*>(editor); c->setCurrentIndex(c->findText(v)); } void comboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QComboBox *c = static_cast<QComboBox*>(editor); model->setData(index, c->currentText(), Qt::EditRole); } QWidget *lineDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const { return new QLineEdit(parent); } void lineDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString v, k; v = index.model()->data(index, Qt::EditRole).toString(); QModelIndex key = index.sibling(index.row(), 0); QLineEdit *l = static_cast<QLineEdit*>(editor); l->setText(v); if (key.isValid()) { k = key.model()->data(key, Qt::DisplayRole).toString(); emit setupLineEdit(k, l); } if (infoLabel) infoLabel->setText(k + ": " + l->toolTip()); } void lineDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QLineEdit *l = static_cast<QLineEdit*>(editor); model->setData(index, l->text(), Qt::EditRole); } kvmodel::kvmodel(QStringList &heads) { header = heads; myCols = heads.size(); } QStringList kvmodel::getRow(int i) { QStringList sl; sl << items[i*myCols] << items[i *myCols +1]; return sl; } void kvmodel::addRow(const QStringList &newrow) { int row = rowCount(QModelIndex()); beginInsertRows(QModelIndex(), row, row); for (int i = 0; i<myCols; i++) { if (i >= newrow.size()) items << QString(); else items << newrow[i].trimmed(); } endInsertRows(); } QVariant kvmodel::data(const QModelIndex &index, int role) const { int id = index.internalId(); QString s = items[id]; switch (role) { case Qt::EditRole: case Qt::DisplayRole: return QVariant(s); } return QVariant(); } QVariant kvmodel::headerData(int section, Qt::Orientation orientation, int role) const { if (role == Qt::DisplayRole) { if (orientation == Qt::Horizontal) return QVariant(header[section]); if (orientation == Qt::Vertical) return QVariant(section); } return QVariant(); } bool kvmodel::insertRows(int row, int count, const QModelIndex &) { beginInsertRows(QModelIndex(), row, row+count-1); for (int i=0; i< count *myCols; i++) { items.insert(row*myCols, QString()); } endInsertRows(); return true; } bool kvmodel::removeRows(int row, int count, const QModelIndex &) { beginRemoveRows(QModelIndex(), row, row+count-1); for (int i=0; i< count*myCols; i++) { items.removeAt(row*myCols); } endRemoveRows(); return true; } bool kvmodel::setData(const QModelIndex &index, const QVariant &value, int role) { if (index.isValid() && role == Qt::EditRole) { items[index.internalId()] = value.toString().trimmed(); emit dataChanged(index, index); return true; } return false; } void kvmodel::moveRow(int oldi, int newi) { QStringList line = items.mid(oldi*myCols, myCols); removeRows(oldi, 1); insertRows(newi, 1); for (int i=0; i<myCols; i++) items[newi*myCols +i] = line[i]; } kvView::kvView(QWidget *parent) :QTableView(parent) { QStringList sl; sl << tr("Type") << tr("Content"); initCols(sl); setSelectionMode(QAbstractItemView::ExtendedSelection); setSelectionBehavior(QAbstractItemView::SelectRows); setAlternatingRowColors(true); horizontalHeader()->setDefaultSectionSize(200); horizontalHeader()->setStretchLastSection(true); verticalHeader()->setMovable(true); verticalHeader()->setDefaultSectionSize(24); setEditTriggers(QAbstractItemView::AllEditTriggers); connect(verticalHeader(), SIGNAL(sectionMoved(int,int,int)), this, SLOT(moveRow(int,int,int))); infoLabel = NULL; initLineDelegate(); } void kvView::initCols(QStringList &heads) { QAbstractItemModel *m = model(); setModel(new kvmodel(heads)); delete m; } kvView::~kvView() { delete model(); } void kvView::initLineDelegate(int col) { lineDelegate *d = new lineDelegate(infoLabel, this); setItemDelegateForColumn(col, d); connect(static_cast<QItemDelegate*>(d), SIGNAL(closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)), this, SLOT(editorExited())); } void kvView::setKeys(const QStringList &k, int col) { if (!col) keys0 = k; comboDelegate *d = new comboDelegate(k, this); setItemDelegateForColumn(col, d); } void kvView::moveRow(int, int oldi, int newi) { static int moving = 0; if (moving) return; moving = 1; verticalHeader()->moveSection(newi, oldi); static_cast<kvmodel*>(model())->moveRow(oldi, newi); repaint(); moving = 0; } void kvView::addRow(const QStringList &newrow) { int max = MIN(model()->columnCount(QModelIndex()), newrow.size()); for (int i = 0; i<max; i++) { QString key = newrow[i].trimmed(); static_cast<kvDelegate*>(itemDelegateForColumn(i))->addKey(key); } static_cast<kvmodel*>(model())->addRow(newrow); } void kvView::addKvRow() { QString k; if (keys0.count() > 0) k = keys0[rowCount() % keys0.count()]; addRow(QStringList(k)); } void kvView::deleteCurrentRow() { model()->removeRows(currentIndex().row(), 1, QModelIndex()); } void kvView::editorExited() { if (infoLabel) infoLabel->clear(); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/kvView.h��������������������������������������������������������������������������0000664�0000000�0000000�00000007364�11753427512�0015473�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2010 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __KVVIEW_H #define __KVVIEW_H #include <QtCore/QAbstractItemModel> #include <QtGui/QTableView> #include <QtGui/QComboBox> #include <QtGui/QItemDelegate> #include <QtGui/QLabel> #include "lib/base.h" class kvView; class kvDelegate : public QItemDelegate { public: kvDelegate(QObject *parent) :QItemDelegate(parent) { } virtual void addKey(QString &) {}; }; class comboDelegate : public kvDelegate { QStringList keys; public: comboDelegate(QStringList k, QObject *parent = 0) :kvDelegate(parent) { keys = k; } void addKey(QString &key) { if (!key.isEmpty() && (keys.count() == 0 || !keys.contains(key))) keys << key; } QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { (void)index; editor->setGeometry(option.rect); } }; class lineDelegate : public kvDelegate { Q_OBJECT QLabel *infoLabel; public: lineDelegate(QLabel *lbl = 0, QObject *parent = 0) :kvDelegate(parent) { infoLabel = lbl; } QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { (void)index; editor->setGeometry(option.rect); } signals: void setupLineEdit(const QString &s, QLineEdit *l) const; }; class kvmodel: public QAbstractTableModel { QStringList items; QStringList header; int myCols; public: kvmodel(QStringList &heads); QStringList getRow(int i); void addRow(const QStringList &newrow); Qt::ItemFlags flags(const QModelIndex &index) const { return QAbstractTableModel::flags(index) | Qt::ItemIsEditable; } QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const { (void)parent; return createIndex(row, column, row*myCols +column); } QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()); bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()); int rowCount(const QModelIndex &parent) const { (void)parent; return items.count()/myCols; } int columnCount(const QModelIndex &parent) const { (void)parent; return myCols; } bool setData(const QModelIndex &index, const QVariant &value, int role); void moveRow(int oldi, int newi); }; class kvView: public QTableView { Q_OBJECT QStringList keys0; QLabel *infoLabel; public: kvView(QWidget *parent = 0); ~kvView(); int rowCount() { return model()->rowCount(QModelIndex()); } QStringList getRow(int i) { return static_cast<kvmodel*>(model())->getRow(i); } void addRow(const QStringList &newrow); void deleteAllRows() { model()->removeRows(0, rowCount(), QModelIndex()); } void setInfoLabel(QLabel *lbl, int col = 1) { infoLabel = lbl; initLineDelegate(col); } void initLineDelegate(int col = 1); void setKeys(const QStringList &k, int col = 0); void initCols(QStringList &heads); private slots: void moveRow(int logical, int oldi, int newi); void editorExited(); public slots: void addKvRow(); void deleteCurrentRow(); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/v3ext.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000012116�11753427512�0015613�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2005 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "v3ext.h" #include <QtGui/QLabel> #include <QtGui/QListWidget> #include <QtGui/QComboBox> #include <QtGui/QLineEdit> #include <QtGui/QHeaderView> #include <QtCore/QStringList> #include <QtGui/QMessageBox> #include "MainWindow.h" #include "lib/exception.h" // Complex regular expressions. #define BYTE_DEC "(?:25[0-5]|2[0-4]\\d|1\\d\\d|\\d{1,2})" #define IPV4_ADDR "(?:(?:" BYTE_DEC "\\.){3}" BYTE_DEC ")" #define SHORT_HEX "[0-9a-fA-F]{1,4}" #define IPV6_FORM0 "(?:(?:" SHORT_HEX ":){7}" SHORT_HEX ")" #define IPV6_FORM1 "(?::(?::" SHORT_HEX "){1,7})" #define IPV6_FORM2 "(?:" SHORT_HEX ":(?::" SHORT_HEX "){1,6})" #define IPV6_FORM3 "(?:(?:" SHORT_HEX ":){2}(?::" SHORT_HEX "){1,5})" #define IPV6_FORM4 "(?:(?:" SHORT_HEX ":){3}(?::" SHORT_HEX "){1,4})" #define IPV6_FORM5 "(?:(?:" SHORT_HEX ":){4}(?::" SHORT_HEX "){1,3})" #define IPV6_FORM6 "(?:(?:" SHORT_HEX ":){5}(?::" SHORT_HEX "){1,2})" #define IPV6_FORM7 "(?:(?:" SHORT_HEX ":){6}:" SHORT_HEX ")" #define IPV6_FORM8 "(?:(?:" SHORT_HEX ":){7}:)" #define IPV6_FORM9 "(?:::)" #define IPV6_V4_0 "(?:(?:" SHORT_HEX ":){6}" IPV4_ADDR ")" #define IPV6_V4_1 "(?::(?::" SHORT_HEX "){0,5}:" IPV4_ADDR ")" #define IPV6_V4_2 "(?:" SHORT_HEX ":(?::" SHORT_HEX "){0,4}:" IPV4_ADDR ")" #define IPV6_V4_3 "(?:(?:" SHORT_HEX ":){2}(?::" SHORT_HEX "){0,3}:" IPV4_ADDR ")" #define IPV6_V4_4 "(?:(?:" SHORT_HEX ":){3}(?::" SHORT_HEX "){0,2}:" IPV4_ADDR ")" #define IPV6_V4_5 "(?:(?:" SHORT_HEX ":){4}(?::" SHORT_HEX ")?:" IPV4_ADDR ")" #define IPV6_V4_6 "(?:(?:" SHORT_HEX ":){5}:" IPV4_ADDR ")" #define IPV6_ADDR "(?:" IPV6_FORM0 "|" IPV6_FORM1 "|" IPV6_FORM2 "|" \ IPV6_FORM3 "|" IPV6_FORM4 "|" IPV6_FORM5 "|" \ IPV6_FORM6 "|" IPV6_FORM7 "|" IPV6_FORM8 "|" \ IPV6_FORM9 "|" IPV6_V4_0 "|" IPV6_V4_1 "|" \ IPV6_V4_2 "|" IPV6_V4_3 "|" IPV6_V4_4 "|" \ IPV6_V4_5 "|" IPV6_V4_6 ")" v3ext::v3ext(QWidget *parent) :QDialog(parent) { setupUi(this); setWindowTitle(XCA_TITLE); tab->horizontalHeader()->setDefaultSectionSize(80); } void v3ext::addInfo(QLineEdit *myle, const QStringList &sl, int n, X509V3_CTX *ctx) { nid = n; le = myle; ext_ctx = ctx; tab->setKeys(sl); keys = sl; tab->setInfoLabel(infoLabel); connect(tab->itemDelegateForColumn(1), SIGNAL(setupLineEdit(const QString &, QLineEdit *)), this, SLOT(setupLineEdit(const QString &, QLineEdit *))); if (le && !le->text().trimmed().isEmpty()) addItem(le->text()); } void v3ext::addItem(QString list) { int i; QStringList sl; sl = list.split(','); if (sl[0] == "critical") { sl.takeFirst(); critical->setChecked(true); } for (i=0; i< sl.count(); i++) addEntry(sl[i]); } void v3ext::setupLineEdit(const QString &s, QLineEdit *l) { QString tt; QValidator *v = NULL; if (s == "email") { if (nid == NID_subject_alt_name) tt = tr("An email address or 'copy'"); else tt = tr("An email address"); } else if (s == "RID") { tt = tr("a registered ID: OBJECT IDENTIFIER"); QRegExp rx("[a-zA-Z0-9.]+"); v = new QRegExpValidator(rx, this); } else if (s == "URI") { tt = tr("a uniform resource indicator"); QRegExp rx("[a-z]+://.*"); v = new QRegExpValidator(rx, this); } else if (s == "DNS") { tt = tr("a DNS domain name"); } else if (s == "IP") { tt = tr("an IP address"); QRegExp rx(IPV4_ADDR "|" IPV6_ADDR); v = new QRegExpValidator(rx, this); } else if (s == "otherName") { tt = tr("Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'"); QRegExp rx("[a-zA-Z0-9.]+;.*"); v = new QRegExpValidator(rx, this); } else if (s == "issuer") { tt = tr("No editing. Only 'copy' allowed here"); l->setText(QString("copy")); l->setReadOnly(true); QRegExp rx("copy"); v = new QRegExpValidator(rx, this); } l->setToolTip(tt); l->setValidator(v); } /* for one TYPE:Content String */ void v3ext::addEntry(QString line) { int idx = line.indexOf(':'); QString type, value; if (idx == -1) { value = line; } else { type = line.left(idx); value = line.mid(idx+1); } if (!keys.contains(type)) { type = keys[0]; value = line; } tab->addRow(QStringList(type) << value); } QString v3ext::toString() { QStringList str; int i, row = tab->rowCount(); if (critical->isChecked()) str << "critical"; for (i=0; i<row; i++) { QStringList s = tab->getRow(i); str += s[0] + ":" +s[1]; } return str.join(","); } void v3ext::on_apply_clicked() { if (le) le->setText(toString()); __validate(false); accept(); } bool v3ext::__validate(bool showSuccess) { x509v3ext ext; QString str, error; if (nid==NID_info_access) { str = "OCSP;"; } str += toString(); ext.create(nid, str, ext_ctx); while (int i = ERR_get_error() ) { error += ERR_error_string(i ,NULL); error += "\n"; } if (!error.isEmpty()) { QMessageBox::warning(this, XCA_TITLE, tr("Validation failed:\n'%1'\n%2"). arg(str).arg(error)); return false; } if (showSuccess) { QMessageBox::information(this, XCA_TITLE, tr("Validation successful:\n'%1'"). arg(ext.getValue())); } return true; } void v3ext::on_validate_clicked() { __validate(true); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/v3ext.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001530�11753427512�0015256�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2005 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __V3EXT_H #define __V3EXT_H #include "ui_v3ext.h" #include "lib/pki_base.h" #include <QtGui/QLineEdit> #include <QtCore/QStringList> #include <openssl/x509v3.h> #include "widgets/kvView.h" class pki_x509; class pki_key; class v3ext: public QDialog, public Ui::v3ext { Q_OBJECT private: QLineEdit *le; int nid; X509V3_CTX *ext_ctx; bool __validate(bool showSuccess); QStringList keys; public: v3ext( QWidget *parent); void addItem(QString list); void addEntry(QString list); QString toString(); void addInfo(QLineEdit *myle, const QStringList &sl, int n, X509V3_CTX *ctx); public slots: void on_apply_clicked(); void on_validate_clicked(); void setupLineEdit(const QString &s, QLineEdit *l); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/widgets/validity.cpp����������������������������������������������������������������������0000664�0000000�0000000�00000004761�11753427512�0016376�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2003 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include "validity.h" #include <QtCore/QDateTime> #include "lib/asn1time.h" #include "lib/func.h" Validity::Validity( QWidget* parent ) : QDateTimeEdit( parent ) { endDate = false; setTimeSpec(Qt::UTC); setNow(); hideTime(false); connect(this, SIGNAL(timeChanged(const QTime &)), this, SLOT(setMyTime(const QTime &))); updateFormatString(); } Validity::~Validity() { } a1time Validity::getDate() const { a1time date(dateTime()); QTime time; if (midnight) { time = endDate ? QTime(23,59,59) : QTime(0,0,0); date.setTimeSpec(Qt::UTC); } else { time = date.time(); time.setHMS(time.hour(), time.minute(), 0); } date.setTime(time); return date; } void Validity::localTime(int state) { if (midnight) return; switch (state) { case Qt::Checked: setTimeSpec(Qt::LocalTime); setDateTime(dateTime().toLocalTime()); break; case Qt::Unchecked: setTimeSpec(Qt::UTC); setDateTime(dateTime().toUTC()); break; } updateFormatString(); setMyTime(time()); } void Validity::hideTimeCheck(int state) { switch (state) { case Qt::Checked: hideTime(true); break; case Qt::Unchecked: hideTime(false); break; } } void Validity::hideTime(bool hide) { if (hide) { if (!midnight && endDate) setDateTime(dateTime().addDays(-1)); midnight = true; } else { if (midnight && endDate) setDateTime(dateTime().addDays(1)); midnight = false; setTime(mytime); } updateFormatString(); } void Validity::updateFormatString() { QString formatDate = tr("yyyy-MM-dd hh:mm"); QString format; if (midnight) { if (!endDate) format = QTime(0,0,0).toString(formatDate); else format = QTime(23,59,59).toString(formatDate); } else { format = formatDate; } if (timeSpec() == Qt::UTC || midnight) { format += " 'GMT'"; } else { format+= " t"; } setDisplayFormat(format); } void Validity::setDate(const a1time &a) { setDateTime(a); } void Validity::setDiff(const Validity *start, int number, int range) { QDateTime dt = start->dateTime(); switch (range) { case 0: dt = dt.addDays(number); break; case 1: dt = dt.addMonths(number); break; case 2: dt = dt.addYears(number); break; } // one day less if we go from 0:00:00 to 23:59:59 if (midnight) dt = dt.addDays(-1); setDateTime(dt); setMyTime(start->mytime); } void Validity::setNow() { setDateTime(a1time::now()); setMyTime(time()); } void Validity::setMyTime(const QTime &time) { mytime = time; } ���������������xca_0.9.3/widgets/validity.h������������������������������������������������������������������������0000664�0000000�0000000�00000001352�11753427512�0016034�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2003 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __VALIDITY_H #define __VALIDITY_H #include <QtGui/QDateTimeEdit> #include <lib/asn1time.h> class Validity : public QDateTimeEdit { Q_OBJECT bool midnight, endDate; void updateFormatString(); protected: QTime mytime; public: Validity( QWidget* parent); ~Validity(); a1time getDate() const; void setDate(const a1time &a); void setDiff(const Validity *start, int number, int range); void hideTime(bool hide); void setEndDate(bool ed) { endDate = ed; } protected slots: void setMyTime(const QTime & time); public slots: void setNow(); void hideTimeCheck(int state); void localTime(int); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/xca.pro�����������������������������������������������������������������������������������0000664�0000000�0000000�00000011467�11753427512�0013675�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ TEMPLATE = app TARGET = xca DEPENDPATH += . lang lib ui widgets INCLUDEPATH += . lib widgets RESOURCES = img/imgres.rcc RC_FILE = img/w32res.rc macx { ICON = img/xca-mac-icon.icns CONFIG += release_and_debug XCA_RESOURCES.files = misc/oids.txt misc/aia.txt misc/CA.xca misc/dn.txt misc/eku.txt misc/HTTPS_client.xca misc/HTTPS_server.xca XCA_RESOURCES.files += lang/xca_de.qm lang/xca_es.qm XCA_RESOURCES.path = Contents/Resources QMAKE_BUNDLE_DATA += XCA_RESOURCES } LIBS += -lcrypto -lltdl QMAKE_CFLAGS = -Wno-unused-parameters # Input HEADERS += local.h \ lib/asn1int.h \ lib/asn1time.h \ lib/base.h \ lib/db_base.h \ lib/db_crl.h \ lib/db.h \ lib/db_key.h \ lib/db_temp.h \ lib/db_token.h \ lib/db_x509.h \ lib/db_x509req.h \ lib/db_x509super.h \ lib/exception.h \ lib/func.h \ lib/headerlist.h \ lib/load_obj.h \ lib/oid.h \ lib/opensc-pkcs11.h \ lib/pass_info.h \ lib/Passwd.h \ lib/pk11_attribute.h \ lib/pkcs11.h \ lib/pkcs11_lib.h \ lib/pki_base.h \ lib/pki_crl.h \ lib/pki_evp.h \ lib/pki_key.h \ lib/pki_multi.h \ lib/pki_pkcs12.h \ lib/pki_pkcs7.h \ lib/pki_scard.h \ lib/pki_temp.h \ lib/pki_x509.h \ lib/pki_x509req.h \ lib/pki_x509super.h \ lib/x509name.h \ lib/x509rev.h \ lib/x509v3ext.h \ widgets/CertDetail.h \ widgets/CertExtend.h \ widgets/clicklabel.h \ widgets/CrlDetail.h \ widgets/distname.h \ widgets/ExportDialog.h \ widgets/ExportKey.h \ widgets/hashBox.h \ widgets/ImportMulti.h \ widgets/KeyDetail.h \ widgets/kvView.h \ widgets/MainWindow.h \ widgets/NewCrl.h \ widgets/NewKey.h \ widgets/NewX509.h \ widgets/Options.h \ widgets/PwDialog.h \ widgets/v3ext.h \ widgets/validity.h \ widgets/SearchPkcs11.h \ widgets/XcaTreeView.h FORMS += ui/About.ui \ ui/CaProperties.ui \ ui/CertDetail.ui \ ui/CertExtend.ui \ ui/CrlDetail.ui \ ui/ExportDialog.ui \ ui/ExportKey.ui \ ui/Help.ui \ ui/ImportMulti.ui \ ui/KeyDetail.ui \ ui/MainWindow.ui \ ui/NewCrl.ui \ ui/NewKey.ui \ ui/NewX509.ui \ ui/Options.ui \ ui/PwDialog.ui \ ui/Revoke.ui \ ui/SelectToken.ui \ ui/TrustState.ui \ ui/SearchPkcs11.ui \ ui/v3ext.ui \ SOURCES += lib/asn1int.cpp \ lib/asn1time.cpp \ lib/db_base.cpp \ lib/db.cpp \ lib/db_crl.cpp \ lib/db_key.cpp \ lib/db_temp.cpp \ lib/db_token.cpp \ lib/db_x509.cpp \ lib/db_x509req.cpp \ lib/db_x509super.cpp \ lib/func.cpp \ lib/import.cpp \ lib/load_obj.cpp \ lib/main.cpp \ lib/oid.cpp \ lib/pass_info.cpp \ lib/Passwd.cpp \ lib/pk11_attribute.cpp \ lib/pkcs11.cpp \ lib/pkcs11_lib.cpp \ lib/pki_base.cpp \ lib/pki_crl.cpp \ lib/pki_evp.cpp \ lib/pki_key.cpp \ lib/pki_multi.cpp \ lib/pki_pkcs12.cpp \ lib/pki_pkcs7.cpp \ lib/pki_scard.cpp \ lib/pki_temp.cpp \ lib/pki_x509.cpp \ lib/pki_x509req.cpp \ lib/pki_x509super.cpp \ lib/x509name.cpp \ lib/x509rev.cpp \ lib/x509v3ext.cpp \ widgets/CertDetail.cpp \ widgets/CertExtend.cpp \ widgets/clicklabel.cpp \ widgets/CrlDetail.cpp \ widgets/distname.cpp \ widgets/ExportDialog.cpp \ widgets/ExportKey.cpp \ widgets/hashBox.cpp \ widgets/ImportMulti.cpp \ widgets/KeyDetail.cpp \ widgets/kvView.cpp \ widgets/MainWindow.cpp \ widgets/MW_database.cpp \ widgets/MW_help.cpp \ widgets/MW_menu.cpp \ widgets/NewCrl.cpp \ widgets/NewKey.cpp \ widgets/NewX509.cpp \ widgets/NewX509_ext.cpp \ widgets/Options.cpp \ widgets/PwDialog.cpp \ widgets/v3ext.cpp \ widgets/validity.cpp \ widgets/SearchPkcs11.cpp \ widgets/XcaTreeView.cpp TRANSLATIONS += lang/xca_de.ts lang/xca_es.ts lang/xca_ru.ts lang/xca.ts lang/xca_tr.ts lang/xca_fr.ts ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/xcf/��������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�11753427512�0013147�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/xcf/cert.xcf������������������������������������������������������������������������������0000664�0000000�0000000�00001153600�11753427512�0014614�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������gimp xcf file��� �������������������B��B�����������j������/��� gimp-comment�������Created with The GIMP�����������������������ݐ��p�1����������� ��������� E#revoked����������������������� ���������� ��������� ���������� ���������� ����������������������������������������j����������T������ ��������x���������� �������$��4��D��T��d��t����������&��6I��dH������� � � ��1|�T �vq� ��2�B�R�b�r�Ԃ�Ԓ�Ԣ�Բ��������������������������������������������������������������������������������������=��<�=��<��<��<�=��<��<�=�=�=��<�=�=�=��<�=�=��<�=�=�=��<�=��<�=��<�=�=��<�=��<�=�=��<��<��<�=��<��<��<��<��<��<�=��<�=�=�=��<��<��<��<�=��<�=��=�=�=�=�=��<�=��<��<�=��<��<��<��<��<��<�=��<�=��<�=��<��<�=�=�=�=�=��<��<�=�=��<��<�=��<��<�=��<��<��<��<��<��<�=�=��<�=�=�=��<��<�=��<��<��<�=��=��<��<��<��<��<�=�=�=�=�=�=��<��<�=�=�=�=�=��<�=�=�=�=�=�=�=�=��<�=�=�=��<��<��<��<��<�=�=��<��<��<��<��<�=��<��<�=�=�=��<��<��<��<��<�=��<����ϒte_cfv[* 2PY 9|݌. 5n. )% f �I�   )+#Z���#,Pp_C1($  x-�.2A˜Q& kov  'ܫ    l #z�  =  :Y� 4    | ![� N  F %{\    "q  C%:    LN�  �!V)  )"�,�$ w.  ,8*�/! ]/ 'A<(  0y( B E)  1#Sދ E!2  ^"WsN4  ^$_[h.7  Mlݿ.=   < o1   / w$    )~G   lހ     }U X�   yT ^���1@   vO����o  pL"�^"   da"�d��8'  fX�� r��v*  gl�n� #A�� 4z#   _w�h�!ڈ�/|  \t �U�)dѧ� #"  Vs�&�&dw�g#    [t ;e�;   da6 5|x �h  "sN |m�3{�By $:C=� D�   �0& %A8 U"    /yT[]^?� � g3  08   ίvQ  20 6  ̘Z  j! �- ���   ݘN  Y ��' ��  t cI �� ?�� W޿݃ � ��t G�c�� ��-˨o %&�����5g 5L� ����?e�l�S��� Mm�ާt�  ��Kn�zZN ���� Qj�tu ��  jW�߇� �� }E�B ' ��� 2ɼŨ� �ϓvheejtZ(!5Q_9|؎&  !%>k7 ! &b O  "*6! !!T�! ��$'0On`A30$  !  #uڻ3�!"-*?F� !"$ ip{  . k !'٘~  A  !EZ� 9!~� #[�)L I)y`!  &t = :  OU " R$  (--� v+  / <-�2'     \3!A5&     2w- C A)(   3/ Sڋ G8  _.TuQ8 \# a\n3?  H"nܿ#/= =' m.  1&w  *O  p!}     }W"X   vV_���+> vP!!��i  kK '�N  hc!�ۼj��;,iZ$��j�� 'x4   � gp#�j�=�7x!bx�d�*ߋ�3~" Yr�S�.\Ϊ�  Vt �/�/c{�`؀�"   [t �:f#� >  c` 3 ;~u  �g#   "lRvl�7}  ?w!  ':E8�D �  �1&   %@< W( �1xyKS^\>�  k,  ,8 ̪vS :*    0  ˓a  l$   $  ڛP�   Y#   *! s aM(   ;  Ձ    V  ڂ    qʃ N� e     ,˨o%� ڀ�,     7h 4M�       Df �k�  X   Mk�z� Gk��w\ ހ�O�   Zl�r s   n^ �   "~I�F *    %:ǽǧ� �ا}vy|p;#!%Afk &$%!(KޓB !'$  !#2P|42B@2#&"# !"'#!)8x�L "$(*(@L&&5&#'&*!n�'  � (<FTpvdWND!!�)&A�#3%2WaŨh!# #$.Jቅ !'*K݀� !|,(-=  R '$%%,Vh/G ##%"./#>t�%kZA_�!<;}  H/T"ed$�%lE@7 #L#/ N) :#N6�I8  /j8.KQC"  B6 J# [DE >5 aޒd>Xk. cxj6R6 j0%kc5K[[/$x@P_J-!"|M# <+%�2 3&,*[ /t)) *`$-k,  )_#+w�� =N-+`0*��+z4*W =��2k9,|h�l��ZJ *xc #��u� 9K)2w{%�q�0U�#JF!+t~�j�(@� 8=',l|�h�.@tײ1� '=* )iz�9� @tǁ�  m@. -ox  3Mv+  A62"3ri6 +N !jހ�231;Vzo�&D G-5?UJD�"R%�?19 D\@ c- $ISXdbA� !w/< 6I?   �ԳZB-: 2=:   ўc"t-A 1<5 ߡ[ h0B  -D%   |  t`=9  4X#    ݾۇ ';@  9l   ގ 5   #9υ [�  l. &  -IϪw 1"  �:!;   -Um7d�  /   ,Yl �r�  b     *Yx � �,    *[tf Z      cx y  }   �0u_ � '  8M E>    4D˿ʭ �?J�5� �.�9�� � ��� ��� ���.�`?�� ��� � �DZ� �O � � �# � � � J����� �)J��� .������� ���D�������O���������� ��� ��� ���p ��&���&��k�&��D'���%�9D��#�O��!�`����� p����� �� �� �� �� � �D�� ���� �J� � ��� �O� � �����D� � �����p�� �����?� � ���#��{ � � `��k��p��v�� �� �� �U��Z�� � �k 9�� #�� � �� #��� �� ��� ��O��� �p��U� ��������������p��v��������� ��U�� ��� ��ǭȵĽԹӹȱęЩ໛»ֺݽ֭׷پˠӻ@ܸϲۀ�ַpЭֿ´ҾǬȴҾƼ &ؿƴ1AɺͲߵ kͿ׺ϸ.ݱʸȸؾYָԾӯڿ϶ɰCȳ݀�ؿзwŨʳҲϩݺغRغٿtڿեĨ� ͣު˺W<.Ԩ޾ֺ2�'ǕܑⲤًܿ) �h۬㽞îӸ-�Wݽßȶɭ+*w˚Ďնӹm  '׹޳ޜǶQ B㮟մ9�3ނ注غ"'`ե ]Ե޺ #nȶjz!/ݢ��8J�]ĹDzcŰζ }߾ٵ# ʤݷ   2ὣހ�߃  SrȥN�  aYӭڍ# v=FظK��  #f?߿݀�׋"� �� 6hŬt; �4   T!wϳA0O  _ ߲�� �'K� l ' ��/ ! DϰO4  2 ߡ G' �m 61��R� � _f�� Q  �t <ȧ�� G �8 'ᬡ) �� Qʀ� w Y攓O�  �cݨ qɕp vѿS fɵ v̘�� |J a  I縝� }F i�DZŵľޙ澖лϸƱŲ́޻ٺҺ߀�ؼհ׹ֿǣѻ6¬׷ɲҹ rͯԽ܀�ƭŵѿ¾!/Ƶ; F˻ϵ !nܖӽι!0ʹȺ ]ۓջӾϯ ֻ˸Ű ! IǶԿϹܺ  y©ʴϲέٸԺ UѺܙؿ oؿϫ¨�̤ݪ˺[!@:ӫܲػ޿4�&ĖಧՍ- !�lڭ἟įθ) �V۽¢˶ǭ“* )xʛÏ۪Գλq,ӺݠƸM !$Aݶ߯Ѻ?$6ڌⶩӶ,�%+\ͨ_Թ#*sʺo{6ª��3K¿�#WŻIJ ců˶ !~յ(ϥٷ   3ݽ   QqǦJ   _[ùϭڋ#  x>FָJ -f Bݿ۳Ԍ* ! :eĭr? 2� T'wͲ?.P]"޵� ,M p1ê 4� %D̯R   5  8ܦ  A+iۣ6ؿ0 N�  _ۿf  E �t!Bŭ� L   >ـ@ '⨥)� U˄�  �u \ߓQ� eޣ u"Șo  z;^ f˶ u˙�s־I� c Qⷞ� tG� k��˸˼ĘտټʶȞijѯ«սíֱ׻ͤıӼIůغϳ¨sѰԿŸôɱθ®-2°ɸ+ Iξй" qҿ!$#9ͻ˽£   _ټ׶%$!!ĶҺɵ' # I˹Լ "#zįθڷ!#%г޿ٿ %aؿƩƬ  tĦڪǬ#Ψ㯚о\"H;װŘݾ6�&ɛ๬īڏ, �m߲çDzԿ0  �`è˧Ϲϲ,#+BРɖٺԻv" Aپ塮ʺ\1<\簤ؽO&3(C껪ԳB .Dlīѫ !+j׸ƾ!)@ιo~2L��9c&� cŻȸ!qƲҹ,ܺ5"ժݼ�! , @߁ * Z}˪O   ij¾ֱ-   TWغW   ;yS°ٓ) ,  G}!uȱwA 8�  d7շI!�  2X $i9㶦��   /M  )~Eĭ�   0  2!Xҳ^   0  ?+ð   C0 k!Lƹ< R&  1oíq  P#  �u*Vɫ�   J  @  .H泪%  Sϋ�  xޣ"1f㗕`  eŤݬ(  2Зu  v` /xϺǿ Р  uR�4m[侜� �uQ�#s@��=��<�D�;�<�;��9�:�9�9�8��6�7�6��4� 5� 4� 3��3�7�J�6�8�8�8��8��9�v�!�Uv��)�!���"�7��4� J�2� 2� /�D���� ���e� �� ���  ��� � �`��� � �� �� ���� ��� �4� �� ���� �� � � ��� � ��� �9�� � ��`� � � ��� �{� � k��� � � e��� ��ٲ៍ݾ±ҿƳ߫βïзĽͿøIJʷ̶Ѳ۴ڳѮ˭ѹŰȹս__݀�úm �ֽ׽q �rǯʺr�  ֿٻ�  +ҽߏŭ ŦͰ�  hܲ߻׺ɬ B͗£: ]۴ȵ�  mӮ۷�  iݳc  Mګϝ�  9ݹ�޽�  gϚЏ|ɤ�   M˓]��)ݾ 5і  "߀�ϱ fֵ&  &  )ͦG &ϲ ��  E<  ճc ��  Z9  $͖N� .�� R�  �݀�⾚w �� ^زJ� 4h|ٱg ����  ๯) @Z I۶H �S�� kǭ.( ڛ9 �� ��� * +�  5 ����� �N� Ű�� �j���8�� ��,Y���������  Ǜ/��b�����  S°lՓ����� 8�����hˮ��+��:`���n֧����[��X��� ���� �z�� mg���� ���� ��  l��� ���� �쥣ֶߞؾߘµ˵˳óʷƽøIJ̷˶ҳ׵ܳѬͯзijƹҼc%"ażp տ޺ؿl� �nȰɹr� ϼվ�  1ϽŰ Ƨ߂˭� eٶ׽Ĭ A͛ħ6 ^ڲʶ� mϨڷ� jٰ]  Qڮ۶ˠ� $:ܹ�  "iΞђɥ� Rʗ_��)ށ۾ 8͙ %ί fԱ& .  ,̥K *γ   IA  Ҷf � ];  +ڀ�͚T� 5 ĪR�  �῜z  � ]ֲM� 1h �xױi � ݺ) 8]  HַK  U  mDz5 #*  ܀�ݝ@ �    .   6  H� &Ǯ�n�  < ��5Z��  ʠ<  `� ����  U�� dҖ� �� 8� bǫ ̾)�� =e�� gթ�� �^�� S��� �� mh��� � h� �� �򥩥ởūƸ÷θϹɶκ»ùƽȷμл׸߹߹ִϳűԻȷɺh"*'^Ǿp v�qʶξv� ݿ� 2�DZ! ȫմ nἤ²Ȯ SҢƩ; mܷκ� .}խ߽�  (v⸖ħp�#,_ⱟר�"1K⿒ƞ�  $2qԣӕΪ�  !*ZЙd�<�«�   )>֛7϶  %)nڼ,BĴ    ;ѧU >Ը# �   OI   "׻p  �  cD� 2ҟZ� < "ĬW� �Ġ|  �  eճX�=n  �y۵m �  +޽6� O` BںO a tͱ4�4, ޤC  � .*++  .     V�:ƲƑ �n�  J  $"� Af  ��   (ͨ/ ]  �!Y±  bݗ�  #F�  aϳ� �3  $Cke׫� ��c $e�  ��� � 5up �� �  $r�  �  �7�6��4�4�5�7�7��5�6��5��4��3�4� )�2� ��D�� ��� �� ����� � � � � � ��k� �k� �� �� �� ��� � � �� � � �� � � �� 9�� � ��?9�� �� � � �� � � �� � � �� � � � �D � � � � � � � �ܸٺȽܮ;ܽοجͱëͮԶӺ¨̮݀�ѽҼᾩ˶ճ˷ķ䴕ɳ_fүn��Eѿ彡̫���+¾Z y³ٹŢƍɭl�˾͢˻U  ®/AÓģZ  4ǯژ   ι޲Dz@ H#  cس˰G Sż۳(  Ƴά bǾHoּ ܾ} �oj �߱  j VΨa  D  �Ʒ䶤�  : AѨL   �ճ�  'ƸD hȶ� �ʻ<  �л�  -Ÿ  �kk �Į�  ǵ   ҾǸ) ֻƹU  ռǶݩ  ѷȻ�ɺ��3� 9Ҵů�  ���AǮΰ�O̶Ʃه�  ��Q' [ӻ   �rߔ2 _ĵ  � e7 kù �1U qøzp  k yδ*�� �pp x׳ � ds c }xS% t ��T �ţxb^� � Uu��N �X�� �r��B �ףh�� /m��D ���� �[�Z~�  ��4��T\��uH� ���Q��Bʯr��  ��h����� �?��x������ �޲j����s������ ѫ�P������䤡DԼA�����,ؼ˾yγ5���� ����pУ ע������Ⱑd�ڻ׷ƾڱͿھ׭Ͷ¯ɯӶڀ�ԽͱѻѼܽǰش̴Ķ޶˴imԱx��M̿ݿȬ۶��4ds¶ԺŦď ǰt̥݀0˼X  1 @ǽå] 4˳ך   �λڲŰE  Iʾ*   dùڳDzI NȻ״,  ŴЪ¶ dO jԸڽƈ�  kk  �౭ q QͦbC   �Ź㶥�  ;   AΩM     �Թݓ�   %ùE   fǹ�   �ɺ ݡB    �λ�  -ȷ  iݳl �ǯ�    ƶ  $ Ѻ+   ʽ߽Z ڿȷ�  ηȺ�  !˽ȹ��)�  .ӷ�  =DZ˱ !ھ J˹ƪ׎ �[- Vҽ    �!s9 Zõ   d@   h¹    �1[ l¸yr  ݙo t͵/��� �lxuյ*   cy `  {xR7�  !v S%  �ĦeYSyL  �W�x @  �ϡi  2n G �` Z 5؁� U_ oI J�;ϯ|   e�  �  �A u���~��p�u� �  �ЪV �  ڪJֿJ  �%} δ9  � �fͤԦ$ � �}ݵ_�߻߻߶ñìòߴθŲѰ׻¿Ǫѯh¾ò˶ۺͺǺ滘̷txٶ�T´ϲ ��7j !{ɺܽɪȖ ҳy#÷Щ[  Ų<9Ɯƪj *ʶÿ٢$ Ӽ⸧�ιRK5   fú߸ϸPQ۹7     ɷұŻ �fQ f׿Ǩʎ� jq ³渰  {  ZҬj#J( ȼ꺫&C  @ҪY �غ�!  ,ɼP    i˺    �;J     ��    .ɼ  lƴv   �IJ�    ɹ   ǻ1   ̿]   ¼ʺ�  ҽȽ�   ˽��)�   .۷² ��   Bʹϴ  #�  Iҷʭޒ  � [5  P     �qD  ]Ǹ   ]I iƼ  �(^  oƼr    w  wԹ9��     �k  p۷1     e|  _' Z9 �  �  V+ �˩~i_� P I  �^� �} �B  �اn(  1t  D  �d Y  2� Sj �nP K� 9ϴ (   h�  ��   �GÝ�q ��  �x w� �� ح ^ � ܫQĭK �7ȇ Ӹ?  � �nץܧ-��  ߺh���#!��k����� � "� � $�� �$�� '��� �&� �� )��v )�� +�+�-�-��-�/�0�0� �/� 2� 2� 2� 2� 2� 3� �� �� � � � � ��� ��� � �� � � �Z �k� �� �Up� �� �p� �OU �` ��J �D �� �k � � � � � � �) � ��� � �O� � � � ��k� � � 9�#� � �� � �� � � �4� � � � �� � � #� ���_ƺ߫ҶƱݥȶѼб͜ƻ¸Ȥʬû֩ݿӴÛƹƵϳöȼھ͘ɾ߿ǫϪɰʚ׶ɵҲͽùҵۖİӷ¹Ѽܔ׸ż±ӷľ̻Ͱ´Ĺ̠۬ƴQƼɿۼŸξIõϴ0ڀ ³"ȶռ˵Įǻͺ�¼ϸ�ó�ɵȵ禲̸ʪր�ǷgٰͳĶɶɸT ة׿νǴL ͟ѳ׼Ź\�ΦƲѸխ�бڹ׺ŷĬ߉ĭϽԽƫ۽֠Ϳо֊ּʭؾ߹ظ\ģ HgX|vH�+<� Fޒ> ʥ~A QҸ#)   9ٻ��_'  )Կ��c!  ��#¡��1c� ���?ȫ��� �����ͳ��CX� ����¬�� �Y� �����4���~� �����xȥ��8&� ����� ƺ ���h ��^3���� 7ǵ�݀�ź۬ѹů٥ǵӼҴ߸¸̠ûÀ�˥ǯŻ٭IJ�ɨϵƖ¹˶ôζŸǿ׿͝Ǭ̥ͱʛԾ׹ȵҳ˽¹ն³Ӷ¹ϻٹŽո˻ͱޙú̢õZŻƾ£̻Oĵʹ:׾-ɷ¨սʵƻ6ͻ�¥̹�ƾأ�ɸĸʶƫǸlձ˵ɷ˸[֬ξƵ] ˟׀�̳Ҹųý`�̧ŰͷӪ�̳ٻ¸ĬоҽǮӀ�׻ǾϾ½Իɪ޹¾ֶ^ Fm^ zO�x(C ?E ̬KVи ,- <պ\)  &݄о ^!  1c   FǮ� � � �y˶7W� ��� �]����� 3���~� ���� rǤ 4&�  ��� ƻ�a^7��;ŵ�ĸ᯶ǰ־Ͷ߫˺պùСȲƿþ�ѭ˶ɿݲŹغǡſŨλĸԺͽưҞ°ʮӲ̸ӣúܻʹظƽؼĺȵ�پż©߾Ķ۽ƵýշƹȿƲҧǺaþȨ¬PǺɹƲҹ>ƴ߇ĭƸ.νôϺȲԿêſѽ�ۀ�ŸƷީ�νȻͽѰ˼wݶѸɻͺ̽e߬ހ�ȨIJλdԨѲӽʸĹp�ѫʷսúӴ�Էʼȹȯ�ɳéȳè¿ĩ˯忨ۼ_ǩ Co` vS w 'H" HM ҪT XӾ '9  0׿\0 Ĩ �[0  ʧ+o  >޵̳ + ��~Ӿ :h ���� !Ķ���e� �� :ܝ  �� ���wʬ /7�   �` a= A˹?��=��=��=��=��=��=��=��=��<��<�=�=�>��?��=��=��O��p��J������O�� �� ��� ������ �J�� �� �� �)p����������������꡸��������歳��쫴����ƿ��Ѿ��ͷ��̽��õ��н��uT^̾����Ķ�� 6��  Q��   ]�� 5��  Y��  �D��  O� B� R��  ]��  ?�� � ��  �����6� �� �`��o �� ���В< �/��мe  �z��ӿƬ`  �n��IJէO  �J��ĬΘ@  Yศ��¨ϋ@   7T����ӿǑI  `���̳ȃ+ (t7 ?��ȢРG   %u��ӷѼn( 4��⽨ĐA  *��ҵQ  ��֤߉ q����R( (V   E��ֱh ���  a��2x�  s��U JJ   ���t61   ��8��W2  -��z� �r$   2�1� �4�   /��n� O   ��ܾ.�  l�   �����������󣸱��⟞��֕��殮��箱��ݮ���ž�°��ɷ��ʼ��Ĵ�̼��wS`ƽ��$�ø��9�� N�� ^��  4� X��  ?�  J��  A�� H�� X��  7��  ��    ���D�   �_��ہ  ���ЙF  ���̹i   �u��ѿƧ_   n��òѣS%   �I��ıЛF  P۴��ѕJ    1S����ǘZ"   ^��εȇ1  &o6  <��ţТH   %p��ϸѺs,   4��ȓI  +��ؠӸY   ��֨  h��֩� ��֪T+'+a  F��ֲj ��� W��5�  m��[ �JT   ���u=8   ��<�Q3   '��w�  �m/   ,��?��-�   1��p�W  ��5�i   ���������롺��ܦ��֚��ꫨ��ⱸ��ﲸ��ź��÷��ô��л���Ⱥ���~_bĻ��%��ƻ��6�  R��  ]��6�� Z��  ;��  I�� =��  F��  �Q��   �A�� $��    ���^�    �J��    ���ԠL   ���տm    �|��òũf   p��ɷڬY!    �I��ɴ֨T    Pܸ��ŭ٣S   -M����öΟ^(   f � ��Ի·4   *p?  8��˫֨M    &q��սx4   7��ªϚN   )��֪f   ��� g���  ��[/!0g ;��n ���  X��8 �  q��[IT  ��z9B  ��A��E@    !��� �mE .��C��/� -��y�{f�! ��=�i)  ���`�9�e�8�9�8�7�J�4� 4� 3� 2� 1�0�/�.�-�-�,�v,�,��+��,�.�.��$��&�p D�'��*�.�) 1� �0�4 �2� ,�� *�� )�4�{ �&�� J�$�� %�� #��� "�� �k�� ��� �����������������=��<�=�=��<��<��<�=�=�=�=�=��<��<�=�=��<��<��<�=�r�<�6�=�`�<��<�=�=�=�=�=�=�=�=��<�=�=��<�=��<�=��<��<�=��<��?�=��<�=�=�=�=��<��<��<��<�=�=�=�=��<��<��<�=��<�=�p�<�4�=�]�<�=��<�=�=��<��<��<��<�=�=�=�=��<�=��<��<��<�=��<��<��?�=��<��<��<�=�=�=�=��<�=�=��<��<�=��<�=�=��<��<�=�~�<�?�=�a�<��<��<�=�=�=��<�=�=�=�=�=�=�=�=�=�=�=�=��<��<�@���<�>�� �H �� -%&щ�  � ?1̶Gތ   [Fռ-   uj Lŵ7   cHѲB    W]޼Q*Tq̮~ 7Q س�   6E ɧ I  2: ϲ˩vW ( #7 �ڼ}dR@% ��uɮ-�ɴuS;� ���3O%�ΰ~- ��� (�ղb#� ������ ԫ@2 �������   Q_�  ���  !)99  ��(]zoe^SA5)�� �  6n z � QoW-� � &:� �`� 6~G$   ! g� �] �$ލ€6  �� �W�E٣_  �nܾp,   �Ŝ\   -ކ!  ފ'  ً6ю7  �jдӛB�ԽЪkT´¼пƸ�?�P   2&#׿Ҋ�}   C&/˹R&  \GҾ'    skJ<   "i GҮ?    ([ \ڿQ  0W rʱ|    8Vش܀�  # =G ɩ#  I <? |γǨvS ( ';{پݵ}_VD)    xˮ5ƴ߀�xZ=�    8T.�ή{4     !.ҳ_%�  �ׯG7   R#e    )0@:  ��#Xy|nf\TC7+���  &:l z �Tƶq\3   "(;� �\�  4ĂG  %_� �U�ݽھ6      � �IFפX   �kݺn0   �yĜ^   .ވ!  )،9ѐ8 �kϳӞDѽίp\п·Ϳú�?�[   708ƺӖ��/ V(E̺Y8 p&W; "zWŸ@ /qV׵G  ;ehX B_|ε  Fc൳ !NZ˩&  K  EHԷδm >)B³ŽvhV>%    ˱>͹ĆpZ) !   4Gc3ϵ@�       52ڵr/  #%دFO   gހ�+�s       � 6DX@ ;nwphWK?,#�  4:@V   j̿rM  2@H_�q "" %QΎbA =7{� �l 9ɐO0  �� OVs4  sńS/  ϭp  # 1( <!ܛK$Ԛ?�oչ֥L ´Ҳr^˼ôƼ�?��� ���O� �����4&�v��&���&���%���%�` �9�&���&��U�#� �O��)k��9��U��J#�%���* ��, �� O#k`��v��v��)�����#��*�`J�.� 2� 5�7�9��9�<���   ٩� u/ &˷   wͧ  m$ ?;   hʜ"  �Z 3p XÒA  2 3۶ .Ṗh� G/  %߲� Føt ݭ��� QŨ¨  ٨�� N֮%  ˤ, � �:Ƴƽ1  qؿT�� +Yͬȱʼ% Xֽk��� ˮζ'   Xγu�� ݹ̳"  _Ŵk� פмr  V߶q �ӯگл�  UۮB| �챙 TŸ.�w �՟ۀ�]437 I FO� �� �2\s@{� �� �$  �j  6aԄ��- �޺� @�. {� ή �(KI ��  �� 2Э0 ��9J��  �Od�  LהO��� �   L� Nڿ�s �((AP!   87�oڈ�ܽ  �Ph�  �9 "x̨ܼm�  w'    C쥎b  D`Sتݚn   *Tֻ6� Tˢדւ>(7Tζ   vѵۨ݇­� >ܸжʺN�� PǤϸx`Yɨ̴͵ܵаֺ̹׸ǸƝĪôހ�ֶ̭íȫһͯƹͷ̴ȵյĮŴػҳɯıèޥ˵ͳЮε�?� ݯ� �y, *Ƕ/ |ϡ  r& <ƻjɟ& U ;oT“C  2  <ٵ/ܹk  � N½4$۵ � L¹r$۰�   Mի Mѿ"�Ǩ/ �@Ƴļ3t׿P 4\ʭŲļ$Yָf ʱͶ''Uα׀�q ٷ˴ ]ȸk  �֤̼q Tٷu  �ϯϻ  $Q֯D~ �뱜  %Tģ/�u �֣`856  M =R� �5[t   ?}�  �  �l} 9c֌�� ) ĭ �ۻ� K( z{�  ΰ ,EJ �� 4Ѯ, !4J�  �_k� IԘR   �   �M� Oq  'AR) �   <5�p܉�ھ*    �Qj�  �;*zڼ˥h�  tٲ+   ;־餔`Ka X֪ܚk 0SکԻ: YɢՐӃD5>V͸$  $wڀ�϶٥±�  A۹̷˻H��Jǥ˹s`Z˩˴̶ϳ˸ոַǹȞªõҴʰɮެϾʲŷϹ͸ƸѶìŷ׼Ӹdzòǫʶʶϭ˸�?� -߭�  �y8� Cͻ "~ԫ   p/�"P,tС*  ]�L{7bʔN  �  1I!F侟m   �_E?幥�   XȽz@ߴ�  bʰ�ҫ9ܬ  Xų.2Ϭ4 �H˹ǿ<+~ƥY  :fαͷ1�.k׼p $Ҳн63oϷx  !⾤ѹ8.uʹw ٭ޅv #mܶx شѾ  ,qܱC 񹞨݀�Ľ ,lȤ=�   ؤf>;7  a  Fc  "� �5i|  _  .  ��! �l XsՍ��  '�  ¯�⿦�4M �!   '*ҳ&  -�MX  �,Pհ8    JX� �bt�/a֝Z   "� �T� 1`ĩ {  +<Va2  3?�"9}ᐈ�,   �Wp�  �=(�>Ѫo4 1 (   $Uŝo#4$&0dg- *k߭⟛}3*FqުվD  -lϪܙܔT>KoѺ)/ֺƴŴ� Jһ;L��^ͨһĺzdcѮͻѷ׵ѻݿܼ˺ͣȮȶڻϴȵγôϷŮߺʻԼѶʼ�ٺʰʸۿؼεȶʯӸԼյԺ�?� � ��� � {� � ��� � � �� � �� � �� �O �� �� ��� ��� � �� � �� � �� � �� � � ����J � ���` �� �� ���D�� ���U�#� ��� Z� �e �� � ��� ������ ������ �O�� e���� ���� �� ��Z�5�8�:�#�����  ��� M��� +�� �� T��� '��� a�� ����{�� l��� 7 ���a�� q��� M�  E�� v�����e-��/�� ~����.�  �� ���&� +�� ���~�� 5 �� ����x"� H¿���� ����{,�� W����� ���� y d�� ��������� b�� �ſٺ�� ��� �Խ1��� ���{��� ���� ~���� x�� ������ ʤ��G� ������ 0��� ������A������������ e���Ϳ� ��  v��� x�����i� ��� �J_���� ����� �F��� ������ �=2���  �~w��� ���  �� �|:���U� �d�� !i͖<����o�� 7$��P��� <v+��� O_R��� N޺/h� ���� #ֻ� J)4G� Et/��bnj|߳�?�� ~� J�+ �  T� ,   [�)��yg׺��5  _��m� P  D r�f) 1 w��{0%  � ~) ) ��y" 5 ��x- I���x/  ^� �� v b � | h� �ľٻ�� � �м6�� �� � �� � v ����Ʀ��� M ��� +��� �� ?۹���  "�_��� �� ��  z�y p��� �Sd�   ���N� �   �>.  �~}�    }7��V   �e bЖ:s'     2# R�    <z0    Hb كW M/h #պ~{ Gߔ) 5J�  �Fw5��aȑު�?�� *�  H� 0  #�  O�� 0 �  ]� $    b� 6   i k� O.  M t�  c6 <  x�  ~:  &' �� 6  4 ��z1  < ��  xĽ3  O  ��  y< �  ^� ��  {1 g ��   �m ��    �> �� �  � � ��}�  ��  ʨ� _ ��  $�   ��  F��  $�e� ����  � r� |�� �[j ��� � �X �  �B:  �{� �� � @� �^ �g  +i؟C� �u% �   G+[     J0$  'XgY  Y4 p   %ؼ+ Q0  LX� �[}?��wҕ�?�� J� � � � � � � � � � �e �� � � �� � � �� �� � `�� 9�� � ?�� 9�� � � J�� � � k�� � � Z�� � � e�� � � � ?�� 9�� � � �� D�� �� e�� �� �� �� � �� �� � �� � �v �� � ���!�`��D!�k�� ��� � � ������Z�4� ��#� � 4� �D� �J 3� 6�8��;�?�*�Ҭ������ �� ͍Zֽ������ ��ԹT׻y��� ��ѸY �������ѱl������,���d� ǰ����3���A ���?���]�� r����\� ��5i��d�xݭ���FL� ��W��ȼ���Ie ��E�����Ž�JD� , ��.���*��  �UP������>ߠ��� y����޶���E��(0�������l|����GH��񭬬��K ��C!��Ƈ��� ��yׁ����t� ��ߵj�~��m> ��ۯթF�5i��y���k⺐!��[��* ���ᠡӉ �G����~� ��9֢;�LG�8� ��L翦!I��; ����Zجͥs4�(a���H� �����wȵW� f �Y� �����ɔ[� #� �{��G��� _�  .:���U}��'wz ����n΅  :F����  ��mŢ\�� Lk�� �YʼnI���� </��� G] �� +jU��+ۖ&��Mr� e$�� )Lw ��,�M}ﭜf*Cq�ȝކA+ !h稐Ě֧߸”ӨĦǣᾨ@�ϲ ��  ̎a£ � �ӹҿ\Һz �ͻ[ � � �ʴk�  � %�õfï�-�G�  " ?� b�   ٠vV�2n   jr۱� EV� Z �Ȼ� Hm#H��ý FC�(5  ,½  �NRٶ @ۤ�   yطI#5¹� g~�GJ�� V D$ �ĉ~s؄����p��ܵm |mA �ժH3mq� �j޻)\�4  ठϋ��L ��Aդ; �HM �� -� �P  &O 9 ��Wѩƣo9  /e��zL� �t³[�   i R�� �Ęb�   - �  @  f� "9��Vy +v{ k̈* 2I�  oȦb !It UŐK G$ E` /d옾S ~ג& Js�  c&2Py��.O~m.Iu� ɞ܍F0i䩕֫ØԩŧȤ�?�Ӷ� Θhä  � ׼^ � Ҿb �  ߌ� ūηt�  �  � Ÿk  Ƴ� +� S�  &7� i  Uߚ� .|*� lt� A^_��  Ft( �S� ��@N� 3>  2IJ�   �X^%  <� $ ݾ E� -;�� c� � �LW  ^  I0 Ƒ� t߁ۇ  q� �޾v oJ �ۀ�񰚟TAs�� p��c' g�;�⫣Ӑ�  �V �# DৱK  �NQ -Në  %U� :Tկɬv?��+h �{P� ���� �nʹZ�   s �T�� ��ϛk�  - �  �B�� i� ,@T -{ hӌ(  5P�   wͱm, �  My � ^ˌO E, J߾d "jV�   $/ I|   i3  /O��4-  Wq5Gx #ϣH1"k믖ųʠܭ˙ٮʬͩŮ�?� � � �� � � � � � � � � � � � � � � � � � � �U � �p � k�� � � � � � �#� � �� � � Z�� � � � � ��) � � � � � 4�� k� �4 � �� � �4 �� � � e�� � �� � �� � �� � �� � �� ?��v�� � ��O�� ��4p��.��� ������� �� �k�� �9� .����9��� ߗ� ��X����\¸Ї g� ���rɭԔ� .`� � ����ܶL� -qN����T���Ȧ�JX ����#k� ���� x��b����u! Z� ��x� ��\  ���} �( L  ���l 6 �< � =<  NV ۚa 5ڨU < Gǜ��bހ�6  >  nն���{) Ӳ����  ��M �MÝ� ��fc��  aӳ؜��� �  ˶ɦ� �y � ·ͫ���   �dٿ����3  0Ӷ̻nUc �ؽn �� � e���� �� 5ȧn ��VЍ ��Ͼ��e| �ݹ ���â �� ���eGvէ ���؏  �xt ��� ��jA ���g [  ����*���?F "- ��,3����� 4�  ��o6" ��L� V޾  �Dȱǥ`LFE?1  ��; 1y�  + �0خɱǛX  ��  �Qc514  c\ಟѴЎ? ��� tٺt<� 2ע­̩D ���3۬rJ~1(aŚ̷׹= ��XȢЯߴJ �&ԮǨݭHΛطd ހ�غĪN��ϰڣ۽ƴ˧жѷĜ�?�ٚ ��Z���� ]̈́ h� ���� qɰ͓� -g� �� , ��ڴH�/yU���^ � Ʀ�J^ �� q�   ݶ���!j  �u,W�z W! ڀ�� �  %'M �u > �F �  �@G J]   �b 9ة] !  D  Dǝ�b۴= ! z@nԷ� &t0 д��N �Q�`m�  �dҵ���  �!̳Ǧ�s  �ͯ�     �eĪԽ����<    6ϳμr���Gh 󶟤ؽҀ�q��  ijh�ݪ�  �5ɩs���TА�  ˾��e�ݺ�  �! ���cLxѭ��  �֑  �qu����nG  �j  _�� 0   7ۯF�(鿑3$ 4 �{ 8%�  gɃ3"  �N� U۾ BŵĩaSHF;*   � ;  0w� 0,ޮƱŗX    Lg11<  h \ݵʹόA  qն|8��1Ԧ˾ͯN *ٯvHׅ;.eşɵֿL  �]ȤҬݸV   !ڀ�ׯʥخ#AΟҹj ׻ŮQ�ϱ٤޿ɵȫ̴͸ٽ׿�?�   c_ƽב n,��  rβљ� @x��2 � ߻Q� 4|Tb   ͫ�Ml ��%v �� (u   x3\�   ]) ��   &5 K  �z N �P#"  � DƮSG߸j #  �q@஗* f#%  �NNͥ bF!* |I& tڽ� ! y>ֹ�  �  X Wɦ� bފx�    �kػ�  ��   �#ϽϬ�!!t   þձ�  1   �hŮĭ���D   ,վڀz�Tn  -ðs�  �   �Ʒs���   �<Ѱ�Pџ�  Ɨ��]� � ��Ǧ%����kP|ظ �  �ޛ �o~� ����hI �  �n e  � +   ?L�09 - 6 �ڃE.�   fЍ0.   �  Q�"^#  F̵˭dQBAB/   <! 4|��  8  5⵭ѹə^    Lj248 p�  cⷤҺ֘O  'yـ�޼~C��<٪ôҹd  B⹁YC9hʦԻ[% �_Υշa (ڵϮߺ66ަ֧ܽv޽Ƭ\2ӷ૦ɲʸ̰׽ջưƧ�?�� ��Z���� ��� � � �p � �e � � .��� � �� � �4 � � �O � � �{9� � � � � � ��� � 4���� � D���� � `��?�� � ����� ��� �4��k��� ���e � � � � � � �� ����? � �� �p����p�� ��)�� ���D��J������?�k��� ���� ���� ���� 4��5�8�:�[��  @�  ��  �   ��   `_  ��  1   )�   5  >�  :� O� � A� n�� G�   �� J�  �� N�  &� X� >�� ^� ^�� qq r�� ~V ��  5  �� "�� +� <�� 3� p� Hy�  "��  CP  @�� 92    F��  @,  @�� A   K�� I  N�� J   \�� R  R��.K  L��   M�����q  <���=�  (���<   ������U�i���ײ�y��  � f[ Bl��ކ �  b�ޤ* �� k��1 �� �N��C�  ��Ƀ6   �e��ۨ5�  ��ӟ> k��.� �7��I�(}�V� :�#  �� �  �� ]f  � 6 +��  -  @��  8!  P��  6�  i� B�  ��  E�  � L�  �� W�  @�� \�  Z��mu�  m�� wX   x�� C  ��(  �  +� 6��  8�   l��  9~�  � ;\   K�� >5   >��  ?7  I�� =&  B��  E K��  F S�� Q  M�� .U   M�� &  F��  �h 9�� >   '� =   �� �V    �g��  ι  �t��   ]]   Bp��#  (f��ߪ1   i��ݩ5 � �D��J�   |��dž8  �c��ܫA�  ��اDl�9� �4��R�&{�V�5�  �� �  ��  ]r�# $�  H  0��  3&  >��  4   N�� <�#l�� E�  ��  H�  ��  N� #�� R�  >�� ]�   Y�  l� %  n��  vf�' y�� R %  �� $0 � *� @��  -�  f��  B  %�� G[ 8�� =I  H�� ;A  8��  ?5  F��  D  G�� C   U��  T   O��  /] M�� '  L��k <�� ? -�A   ��Z   �e�  �  �s��  Xl   "Mz��/      ,j��: t��;  �L��R�    ��ѓF  l��ܵI�  %��کJ w�B� �=��U�"�V� � � �4 � � � � � � � � � � �� � U�� � � � � � � � ��� ���� v��O�� .�� � � � � � �� � !� � !� � !� � !� � !� � !� � !��9 !�� !��� !��� !� � !� #�� !� � � � ��� �#&��(��*�k�-�` 2� �4��6�:��q������������������������������������������������������������������������������������������������@�������D��� �������"��������� ���������E#rev����������������������� ���������� ���������� ���������� ���������� ����������������������������������������Y���������դ������ ��������`�l�x�݄������ ����d�t�ք�֔�֤�ִ�������z������� �0�@�ۧ�'�ܐ�ܠ�ܰ�������� �0�@�P��������������������������������������������������������������������������������������������������"�8�5� 2�0�� 6��'� �+� �*� �)� ��!��� ��� ��'�'��*� 7���<�<�<�.��,��������������� *�� 7�9�:�r�+� �)� ���� ���� � �� � �� ����� �� 4� 5��;����������8�+��+�� ��� ������ � ��� � ��� � � � ��;�:�9�9�/��*� �� ��������, ����$�� ������ ,��:��4� /���� ����'����� �����""�"� ��-�9�t�������#�5� 3� ���� �� "� � #��*�/�3� (�:��)���� %�"� � �#��#���#��<�<�<��3���� ��� ��� �$��&��*�9�����������������������������������������������������������+� �*� �*� �*� �*� �%�� %���*�*��/�0� ���������<�<�;�;������� � � � � �4 ��� ������� �������I�;�:�:�;�;��5��1�� -����������� ������������������������������������������������������������������������������������������������������������������������@�������D��� �������"��������� ��������� E#sealsign���������������������� ���������� ���������� ���������� ���������� �������������������������������������������������7������ �������[���������� �������'�7�G�W��� ��+�;�K�[���~�����������.�>�N�^�n�~������������������������������������������������������������� /� �'� ����������������������������������� �����������������������������������������������������������������=��=��=��=��=��=��=�� �������� �������������� � ���������� �������� �������� ������� ����� ������������������������������ ������������ �������������������������������������������������� ������������ ���� ����� ���������� ���� ���� ���� ����� ������� �� ����� �������� ����� ��� ������ �� ������ �� �������� ����� ������� ���������� �������� ���������� �������� ���������� ����� ��� ����� ��� � ����������������������������#���)����������=�>��=��=��=��=��=��=��=��=��=��=��=��=��=��<��=��������������������������������������������������������������������������������������������������������������������������������������������������������������������������@�������D��� �������"��������� ���������E#seal���������������������� ���������� ���������� ���������� ���������� ������������������������������������������������������� ��������p�p�p�p������ ����A�Q�����F�w����� � � ��$�'�'�4�9�>�G�G�H<�HL�H\�Hl�R)�Ru�R�i�p{�p�p�p������������ ?� �<�#�;�+:�:�4I�:�=R�:�#>S�:�"<J�:�"<E�:�#AG�:� -HN�:�dQ�;�6o�=�4�� ?��<��;�$1�:�,>�:�3E�:�4E�:�3>�:�3;�:�7;�:�'=A�:�UD�;�._�=�,�� ?��<��;�$1�:�,>�:�3E�:�4E�:�3>�:�3;�:�7;�:�'=A�:�UD�;�._�=�,���� ��  �7�&(,(%!�6�ENNF>4,( �3�Z]WME?944, �1�[Y`]VOG?;?D8,!�.�VcbdfaYOF@IMH>/ �,�U`cmprlbVKFMRMH9'�*�R[dqzypeZPLMRTOJ=,�(�PTdryyrg\PMSUSPC:, �&�Raoy~vj^RPUVQJ@4' �$�RT_mw|obWRTXQMC9-" �"�\V]jwznaXWXSNG=4*! �!�ug\gvse^[[UOJC:3+# � �'jjfsxjc_]WRMGA<5.% �!�fkq}tld^YUPLGC?:2,( � �Cfsy}tjd^YUQLJHGC@7* � �Nhxzof_[WUSOONF8* ��Pm{tld^YVTSPRUWSH9* � �4Suzph`[WTURRVYZWK7% � �@atld_XVUTQSX]_WD/$ ��!Dozpia[VTTRRW]cbU@-%  � �7Nttlf`YVUTSX`gkeR<,&#� �*R{|rkd^XUUSW`jqqeM7+'!� �,_xnha[WUTU\gqwsaG3,'�� �� �7� !%!�6�9AA92*%! �3�LNHA:4.+)$ �1�LJOMHA;4057.$�.�HRSSUPIA95<@;3' �,�HPR[]]YQF=9?C@;/�*�FLS^fe\SJB>?BDA=1# �(�DGS_dfd^UKA?BDD@5/#�'�DEQ]djkhbXMCADEA:3( �$�DGOZdkqof\PFCCE@<4," �"�NGNXblpomeZOGFFA=7/(! �!�bWMVblosqj^SLIHC>94-'" � �!ZYU`jpssncWPLJEA<73/*% �!�TZ_horsph_XQLGC>;863/)%! �!�9U^enrtsog^WPJFB?<<:97/# �!�BWdjqttrndZSLGDBA?@ACD<0#� �DZgpttqh^WPJFBA@?BGLI?1# � �+DaosstsncZTMGDAC?AGLONB/ � �6Pjpsutqh^WPJEBAA?CJQVO;( ��8]lrtusncZTMGDAC@AHPXZM8&� �.A`osutqh^WQKFBBAAIR[b]J3$ � � !Dfrttsne\VPJEBB@ER^gh\E."� �$OksutrlaXSMGDBABLZgnjX>*" �� �� �7� !%!�6�9AA92*%! �3�LNHA:4.+)$ �1�LJOMHA;4057.$�.�HRSSUPIA95<@;3' �,�HPR[]]YQF=9?C@;/�*�FLS^fe\SJB>?BDA=1# �(�DGS_dfd^UKA?BDD@5/#�'�DEQ]djkhbXMCADEA:3( �$�DGOZdkqof\PFCCE@<4," �"�NGNXblpomeZOGFFA=7/(! �!�bWMVblosqj^SLIHC>94-'" � �!ZYU`jpssncWPLJEA<73/*% �!�TZ_horsph_XQLGC>;863/)%! �!�9U^enrtsog^WPJFB?<<:97/# �!�BWdjqttrndZSLGDBA?@ACD<0#� �DZgpttqh^WPJFBA@?BGLI?1# � �+DaosstsncZTMGDAC?AGLONB/ � �6Pjpsutqh^WPJEBAA?CJQVO;( ��8]lrtusncZTMGDAC@AHPXZM8&� �.A`osutqh^WQKFBBAAIR[b]J3$ � � !Dfrttsne\VPJEBB@ER^gh\E."� �$OksutrlaXSMGDBABLZgnjX>*" ��������������������� �;� �:� �8� |�5� �2�r�1� ���� �<�:�9�8�6��3��/� �-�  �.--�3�/HZdheT;-,�-� ʶ~yqdXWM&.�*� ƶtcYV>K�(� s_[Z= �'�ĽytP2!�!�rüwP@?-�� ù|7 �� Z��Ļ} � � ɿݻu!�� Ǿr�� |ɻt��˿�Ȼ ��ɺ… �ǹ|�´׺��ɿޣ�굶|����� �  �+� �(� �%��$��"��� � �����     �������@��=��=��=��=��=��=��=��������������������������8q~rjd^XVURXdoz|oV</,$�!�U~xoid^XUTUbmx~zeG40,# �!�8hwmga\WUTalxnM643+�"�Ix}rjd^XUU^kwrT<571�!� +`wmfa\WUZkv|dG896*�"�@p|qic^XVXivnO<8;2�"�$U{vlea[WVctx[A9>7.�#�6fzphc^XW]s~bE9>@2�"�H{~tkea[WZl~dG;=D8#�#� *ixohc^YYf~~hM=<FC(!�#�Px|rid_ZY`xpU@;GE7 �"�4e~tke`[[atuXB<GK;!�#� Mytlgb^\`qtYB<DP9&�#�3jxqie`]aotYD=?V:.�$�"Swzrlga^_ku_H?=V81�$�;h~umfb^ak|~fJ?=Z68�$�"Vy~tmida`iz|dJ@=Y69�%�Fq~wqkfbbjx|eK@=Z2>�%�5c~xrmiecerybJ@=Y1<�%�#Uv{vpkfdgpzdK@>X,;�%�Dl}wqmiggnzvaJ@>W*7�&� 7d|~ysnigjqzxaK@>U%. �&� .[vxroljjmxw_J@>T''�&�(Om{~ytqmkkowx_JA?Q+�'�Cbv}zvrponpv}z_J@?N5�'�3Wo{zwsrpprw}zaJA?J; �(� 'Mgwzwtsrqrw}zdI@?I@ �(�C`qwvutsqrv{zfJ@?GD�)�:Whtvvtuttw{ziL@?GK�)�0O`nuvuuttw{zkN@?FN%�(�)FTgsuuvvuwzymP@?FP*�(�!8I^puvwwvwyyoS@>EZ-�(�+?VlsuwxwxzypW@>FVC�(�#9LfqvxyxxyxoYA>FVO�)�1B_nuxzxyzxn[C>EWB�)�,9VjtxzyywmZD=D[/�)�%1OgtxzzyzvlYC=B`0*�)�*GcrxzyywmZB;@a=�)� 'A_owxzzxvm]E;>]8�*�%;Zktxyyxul\H:=ZJ$�)� 3RgrwxxvsiZG;<WY)�*�)KbpuvwvqhXG8;Xd,�*�  A^nttusocTC8<\i2�*� ;[kqqlcSC5?_m4�*� 2Ugnopoi^N>5Cdc5�+� .Pcklmmh]M>2Gk^)�+� (K`ijlleZI:2OlG+�,�$H]egihcVH90VvB�-� BXadgf_TE60_F$�-�?T^`ba[OA3.L@�/�9OY^a`XL>2..�/�4JVY\ZSH;.(�0�/EPUYWOD7+%�1�*?LQTRK?3(#�2�%8CILJB90$�2� 0:@C@91) �2� %07:70("�2�$)+)# �2� !#! �3�  �3�  �4��4��7���-_quutpg\UOJEBB@FUcpsfM2%"�!�FhsuuslaXTOJEBACSamur\=*%" �!�-WpuvtogaXQLHDBAP_mxxeC+('!�"�=dsuurnf[TOJEBBN_lwziJ2)*&�!�#Nltvtpi`WPLHDBH]kx|tZ<,+)!�"�4]pvtrmdZSNJEBEZiw~zdC/+.(�"�Fgsttoh_VPLGDCRht~}nR6,/+$�#�,UortqkbYRNJECLguuV7,02(�"�;epssnf]UPLGDG_t~uZ;-/5,�#� "Vkqspi`XRNJEEWsu\@/.75�#�Bbmrqld\TOJGFOj~zfI2-76,�"�+Siprof]UOKGGPg|~jK3.8</�#�?dmqog^WRNJIOcz}jK4.5@.�#�(WiophaZTOKIOax|iL5.1E.&�$�Ebmojc\VRMKN[s|kR://E-'�$�0Uiolf^WQMJN[otY<//H+-�$� Gcmmf]WTQNOYmrX<0/G*.�%� 9\kmf`[VQNOZk~qX<0/H'2�%�+Rglhb\WTRQTdz}nU;0/H'1�%�E`kid_ZVRQU`t}nV<0/G#0 �%�8Yiifa\YVUW_mzkS;0/F". �&�.Reifb^YVTXbnwlS<0/E% �&� %Jagfb][YXY_jvlQ;0/C �&� @Zdfb_][YY_jtmQ<10B"�'�6Oaec`^]]ahqoP;00>+�'�*F[cca_`_`cjrpS;10<0 �(� =Taba`aacjroV:00:4 �(�6O[``abgnoX;0097�)�/GT]``addeino\=008<�)�(@MY_abddejnn^?008@ �(� !8CS]`befgimn_B008B# �(� .:KZ`cfggimlcC0/7K$ �(�#2DW^cfhijmmdI1/7F8 �)� -=R\bgiijllbL1/7HB �)�'4MYafjkkmlaM3/7G6�)�"-EVagjjklk`L4/5L'�)�&?R`fkllj_J4-3P(#�)�  8P_gjkkj_K3-2P3�)� 3M]dhkmliaO6,0M.�*� .HXbhjkkh^M8,0I>�)�'CTagikjf]L9,.HJ"�*� ;P_eijidZI8+.IT%�*� 5N]dfhgbWF5+0KX*�*� -JZadee_UD4(2P[,�+� (FX^acb]Q@0)5SS-�+�#AS\`aa[O>/':YO$�,�=QY]`_XL;,%@[<$�-�:OVZ\[VI:,%Hd9�-�5JSXZZRF7)&Q:�.�2FOSUTNB4'%@7�/�-BKRTTL>1&%'�/�)>HLOMG;-# �0�$9CJMKC7+!�1� 4?EHF?3(�2� .8>@>7.%�2�&0585.&�2�'-0-' �2� !#! �2� �3�  �3� �4�5�8���-_quutpg\UOJEBB@FUcpsfM2%"�!�FhsuuslaXTOJEBACSamur\=*%" �!�-WpuvtogaXQLHDBAP_mxxeC+('!�"�=dsuurnf[TOJEBBN_lwziJ2)*&�!�#Nltvtpi`WPLHDBH]kx|tZ<,+)!�"�4]pvtrmdZSNJEBEZiw~zdC/+.(�"�Fgsttoh_VPLGDCRht~}nR6,/+$�#�,UortqkbYRNJECLguuV7,02(�"�;epssnf]UPLGDG_t~uZ;-/5,�#� "Vkqspi`XRNJEEWsu\@/.75�#�Bbmrqld\TOJGFOj~zfI2-76,�"�+Siprof]UOKGGPg|~jK3.8</�#�?dmqog^WRNJIOcz}jK4.5@.�#�(WiophaZTOKIOax|iL5.1E.&�$�Ebmojc\VRMKN[s|kR://E-'�$�0Uiolf^WQMJN[otY<//H+-�$� Gcmmf]WTQNOYmrX<0/G*.�%� 9\kmf`[VQNOZk~qX<0/H'2�%�+Rglhb\WTRQTdz}nU;0/H'1�%�E`kid_ZVRQU`t}nV<0/G#0 �%�8Yiifa\YVUW_mzkS;0/F". �&�.Reifb^YVTXbnwlS<0/E% �&� %Jagfb][YXY_jvlQ;0/C �&� @Zdfb_][YY_jtmQ<10B"�'�6Oaec`^]]ahqoP;00>+�'�*F[cca_`_`cjrpS;10<0 �(� =Taba`aacjroV:00:4 �(�6O[``abgnoX;0097�)�/GT]``addeino\=008<�)�(@MY_abddejnn^?008@ �(� !8CS]`befgimn_B008B# �(� .:KZ`cfggimlcC0/7K$ �(�#2DW^cfhijmmdI1/7F8 �)� -=R\bgiijllbL1/7HB �)�'4MYafjkkmlaM3/7G6�)�"-EVagjjklk`L4/5L'�)�&?R`fkllj_J4-3P(#�)�  8P_gjkkj_K3-2P3�)� 3M]dhkmliaO6,0M.�*� .HXbhjkkh^M8,0I>�)�'CTagikjf]L9,.HJ"�*� ;P_eijidZI8+.IT%�*� 5N]dfhgbWF5+0KX*�*� -JZadee_UD4(2P[,�+� (FX^acb]Q@0)5SS-�+�#AS\`aa[O>/':YO$�,�=QY]`_XL;,%@[<$�-�:OVZ\[VI:,%Hd9�-�5JSXZZRF7)&Q:�.�2FOSUTNB4'%@7�/�-BKRTTL>1&%'�/�)>HLOMG;-# �0�$9CJMKC7+!�1� 4?EHF?3(�2� .8>@>7.%�2�&0585.&�2�'-0-' �2� !#! �2� �3�  �3� �4�5�8��������������������1� �.� |�+�J�*�6v�)� B�(�O�'�/�'� �'�¾�'�þ�'�վ�'�ջ�'� ֺ�'��(�ÿ�(�?�(� �(�0½�)�ÿ�*�w�*��+� ¾�,��,� »�-� �.�ƻ�/� ÷�0� �3� ͻ�4� �5� �6�r�:�<��<�W�<��=�2�� �8� W�7�+W�3�+ �0� �/�r �0�| �1�=�3�"�3�^ �3� �7�q �h�����,� �*��(��(��'��'�'�'��&��&��&��&��&��&��$��$��$��%�'�'��'�(�)��)��)� �*� �+� �,��.� �0� �0��5��5��6��8��9�;�<�=�=�=�>����;�:�9�8�6�3� .�-� ,� ,�+�,�-�,�-�.�/�/�0� '�ȿ䪫 �¸�ɾڜ�źۚ�÷ڕ�󿲬ޏ�۹�}�‰~Ύ¨ܘݧݖݧזΨ􈉈ߍ̦݌ǣ􆇆⋍Ģ򅄅߈á񄈋߆Ġ߆£󌉈å냂ᅈ¤¡ق숆́Ѐ¨ڂ®ŀςǻɁºȁż၃ž󰬪ށ貭ǂ¿κþݛ. J݁Ź�݌ ��E ��¼�� Z ü � �$� � q ��!u&�20�j �0�W �2� º ������e %!#$&%'()* ++ * )447             �v �� �% �%� �%�-�0� ����=�7�<�0�;�ӻr�8�}�8�"�7�+�6�oW �3�۬ �2�ݯ�1�}�1�ݼ�1��1�2�2�2�2� �1�3��2� �2�4�r�3��3� �4�ܯ �5�r�6�r�8�ȸr�������=��=��=��=��=�=�=�=�<�<�;�:�9�7�7�6�5�3�2�1�1�0�/�/�/�/�/�{/�e/�/�/�0�0�1�1�1�2� 2� 3� 5�7�<�~�����������<� �<��<�%=�50�5�0E:�4�''$$@TG�3� HLNMKP\S�1�'4LXcdb`^]Y�0�-4D[ellmlhc`\�/�455Ifonnmlie`�,�+DO\_hnooponlgb�+�)*5Qcidgoqoopmid�*�$@::;\ekoolopopoomid�*�DNLQ\msqroprqpoonkhd� �!$>ASctms{zvvsrsrppnmjhd��#!!#-;ObjXAk}z|zwuvusrssrplh��$XNNLOSVdr|~}|zyxxvtpmi�� )W]OF4Qkxss{}|{{xwsplh�� !+2?M[blv{~}||{zvsplh�� '/6D[m{}}zxtpnjf��$,5AN_q}}{wuqlieb��(/9DQ_mz~{wspljhfb`��%09BMXgt~ztqnkifbb^Z��"-6?HUamz~yuromiec`[\V�� (4<EP[gs~yvtqnkhd_^ZXU��$/6@JU`my~yxvtqnkfb^[XUU��)/;DOYfs~{xvtqolieb]XXST�� %)5?HS_my|xwtqnligd`\WUOQ�� %.8BMYfszvtqmkhgeb^[TOIG��!)3<GS_myztsnkgeca_[WNDE@��  $-6AMYfsxrqlgca_][WRHE?9��! '1;GS`lxwpoke`][YVRNKE@7��<� �<��<��<�,(�5�(91�4�!!5E;�3�<@A@>BLD�1� !+@JQRRONMJ�0�&+8LTZYZYVROL�/�+,,=U\[[ZYVSN�,�$8ALOU[\[\[ZXUP�+�##,CRWRT\\[Z[[ZXUQ�*�6102LSY\\X[[ZYXUQ�*�9AADK[_\][\]\[ZYXVTP� �47FSjaZ`ed``_\^\ZZXWVSQ��'2CT[I7Zn{xieeda``_][]\[YVS��JBB@BEIT`hnnxzyvqkggeecc`b``]ZXT�� #JPC<,EZkktqkf`agntwxxvtqnkjigedcca`\YVS��$*5AMS\dij~~|yupopqwwutsponmkjhffddb`]ZWT�� '-:N]itwwz~{xyxwvtrpqnmkhgffca^[WTR��%+6AQanv|z{{}{xvurspnkiggfa^ZVTQO��!&/8DQ^ku{{|{y|{xxuupokiea]ZVUSRNL��'/6@JXepx~|y|{vuqoje_[XVTRNNKG�� $+4;GS_ku|}~{vtpid_\YXUQOLHID�� *08CMYdox~zuqkea_\YVROKJHEC��%+4=HR^ju}~wsmfda_\XURNKHGDE�� &/8BLXdoz}uoieb_\ZWUQNJFFBD�� *3<FR^ju~ulhd`]ZXUSPMIED@B�� $-6@LXdp{~wkea]YWUSQOKHC@;:�� (0:FR^jv}vkca[WSRPNMIF?795��$+5@LXeqz|thb_ZTQNMKIFB;:4.�� '0:FS^jt~}wi`]YRNKJHEB><84-��<� �<��<��<�,(�5�(91�4�!!5E;�3�<@A@>BLD�1� !+@JQRRONMJ�0�&+8LTZYZYVROL�/�+,,=U\[[ZYVSN�,�$8ALOU[\[\[ZXUP�+�##,CRWRT\\[Z[[ZXUQ�*�6102LSY\\X[[ZYXUQ�*�9AADK[_\][\]\[ZYXVTP� �47FSjaZ`ed``_\^\ZZXWVSQ��'2CT[I7Zn{xieeda``_][]\[YVS��JBB@BEIT`hnnxzyvqkggeecc`b``]ZXT�� #JPC<,EZkktqkf`agntwxxvtqnkjigedcca`\YVS��$*5AMS\dij~~|yupopqwwutsponmkjhffddb`]ZWT�� '-:N]itwwz~{xyxwvtrpqnmkhgffca^[WTR��%+6AQanv|z{{}{xvurspnkiggfa^ZVTQO��!&/8DQ^ku{{|{y|{xxuupokiea]ZVUSRNL��'/6@JXepx~|y|{vuqoje_[XVTRNNKG�� $+4;GS_ku|}~{vtpid_\YXUQOLHID�� *08CMYdox~zuqkea_\YVROKJHEC��%+4=HR^ju}~wsmfda_\XURNKHGDE�� &/8BLXdoz}uoieb_\ZWUQNJFFBD�� *3<FR^ju~ulhd`]ZXUSPMIED@B�� $-6@LXdp{~wkea]YWUSQOKHC@;:�� (0:FR^jv}vkca[WSRPNMIF?795��$+5@LXeqz|thb_ZTQNMKIFB;:4.�� '0:FS^jt~}wi`]YRNKJHEB><84-����<� �:� �:� �8��7�*�7�5% �6�;*! �5�J5$ �4�UE0 �3�YP>*�4�[RH5!  �4�]TI9%�4�^UK:( �4�^WL<' �4�_XN=' �4�b[O?* �3�e]SC/!�3�c]SF5& �3�d]TH;+!!�3�b\SH>/&# �2�_[SG@2)# �2�ZUQG@/- �2�WPNG>2( �2�TPLFB) �2�QOJJ2% �2�NPI?1 �3�NKB8�4�GC7#�8�>6)�8�8+ �8�. �8�* �9���<��:� �:� �9� �7�# �7�, �6�0! �5�<, �4�F9(�3�HB3! �4�JC;+ �4�KD</ �4�LE</   �4�LE=0  �4�MF=1 �4�NI@2" �3�PJB6&�3�OKB8*�3�PJC:0# �3�OJB:2&�3�LHB94)#�2�HDA94'% �2�E@?92)! �2�C?=96" �2�A@<=) �2�?A;3( �3�?=7. �4�:7-�8�4-#�8�.$�8�%�9�"�9���<��:� �:� �9� �7�# �7�, �6�0! �5�<, �4�F9(�3�HB3! �4�JC;+ �4�KD</ �4�LE</   �4�LE=0  �4�MF=1 �4�NI@2" �3�PJB6&�3�OKB8*�3�PJC:0# �3�OJB:2&�3�LHB94)#�2�HDA94'% �2�E@?92)! �2�C?=96" �2�A@<=) �2�?A;3( �3�?=7. �4�:7-�8�4-#�8�.$�8�%�9�"�9��� ;�3����.��-�  �-�   �-�  �-�  �.� �.� �.� !�/� "%&!�0� !)+()%�1�  ).00/�1�  &,157�2� "'#$*/76�3� $-)(*3:�4�  -0++/8�4� '53/-4�5� -3822�7�#1996�7� %7D>�8�+@K�9� 0G�:� 0 r���0��.��.� �-� �-�   �.�  �.� /� �/� �0�  "!�1�  $&%%�2� #'*+�3�  !%++�3�# !(.�4� %&!!$-�5� *)%#(�6� %*,'(�7�'.-+�7�,71�8�"4<�9�':�:�' r���0��.��.� �-� �-�   �.�  �.� /� �/� �0�  "!�1�  $&%%�2� #'*+�3�  !%++�3�# !(.�4� %&!!$-�5� *)%#(�6� %*,'(�7�'.-+�7�,71�8�"4<�9�':�:�'�� @��=��;� �:� �7� �7� ���0� (! ��.�*,'# *�$21/-'%  �(�#.44630.*'$# �%�$%(-488641/,*(# ��.)'&+087651.,))'&%$$&'*)+'(%$"��/.-.6>ET^de`\TOLGEA>><;996511)+)��873368>EMTX[\[XWUSOLKHFCA?=<77/10��><::;=@CFHIJJIHIGGEEDCA@@=?:;574��=@C@@ABA@?>==>==>?@?AG;+  ��:BGGFECA?=;9:88776656678::8CJ<-% "!��7@HMMLJIFC@=;997755421//../-18<84.**&,��6<EMPPOMKHDA>;;976542/.,,*+*++,/0033220-3.��<;CFORRQOMJGDA>>;988521100/..--,,+,+,..2.0(*.��E@DBLSUUTRPMKHHECAACDCBA?=<:76320.,+**,//2.!$��LKJFIPUXYXVWVXWUTTVSSQPMLIHDC?=:7420,+)(()+,21 � �FSTQLMQW\]__^__^[YWVSRONKHEC@=<952/-*)'&&'), �� @��=��;��:� �8�  �7�  ��0� ��.�!" �*�'%$" �(�"((*'%#! �&�"'+*)(%"!   ��$ !%+*)(%#!!!" ��$#)06CLQRNJC?<96200..-,**&'!#"��,+(')+06<BFIIFEDA?<;975421/-,&)(��1/--/1357998988765442312./+-)��03512112210//.././/././00122324:0# ��.59787665420.,+*+)*))()())*+-.,6=1$��+28<;;:9741/-+**(('&%$#""#$#&-1.*%#" $ ��*/7<>><;9630.++*)(&&$"!  ! "%%')*))'%*% ��0/58?@@?=;8530..+*))&%$$##"!!"$%(&'!$&��7264<ABB@><:865310//1211//,,*('&$#"  "'&)%��>;<7:>CDDCBBCAA@@A??=<:96510-,*(%$"  "#))  � �9DCA==?EHIJJIJIHECB@?=;97420/,,*'%" !$ �� @��=��;��:� �8�  �7�  ��0� ��.�!" �*�'%$" �(�"((*'%#! �&�"'+*)(%"!   ��$ !%+*)(%#!!!" ��$#)06CLQRNJC?<96200..-,**&'!#"��,+(')+06<BFIIFEDA?<;975421/-,&)(��1/--/1357998988765442312./+-)��03512112210//.././/././00122324:0# ��.59787665420.,+*+)*))()())*+-.,6=1$��+28<;;:9741/-+**(('&%$#""#$#&-1.*%#" $ ��*/7<>><;9630.++*)(&&$"!  ! "%%')*))'%*% ��0/58?@@?=;8530..+*))&%$$##"!!"$%(&'!$&��7264<ABB@><:865310//1211//,,*('&$#"  "'&)%��>;<7:>CDDCBBCAA@@A??=<:96510-,*(%$"  "#))  � �9DCA==?EHIJJIJIHECB@?=;97420/,,*'%" !$ ������������#� WW �9� W�9�WW�9�jԗ �8� ݀�8� ݘ�8�|�5�++�5�l �6�|�7�q �7�Wݼ �8� j ������ � 6��<�;�;�:�:�9�8�8�8�6�6�5�4� 4� 4�3�4�4� 4�5�{6�7�7���������������������������" $)5?LWep|znkje^ZVTRQNHC:1��"%,7CQ\goz}ojid\VRPNKFA:3*��"((/5@N[gr||rjge\TOMJD=8-"��)+-2;FR^lzzqhheYMIGC?8,! ��(+-09ER_juzqhfaSHEB=73, ��'*,.4?LXdpz~vmea]QE?=;7.'��%(+.09FS^it}|vma[YQE:82.( ��&'+/3?KWbkuzx}|xph^TUPF3/.$& �� ""'+2;EPZdnqkwzwvrmeYOPQF0/&$��$-8@IS\cd`o~zurpmf^SLKOD.*#��%28AIRXZYcrwvuqnke_YOGHL?+%��,2:CKQSRYekmmkifaYPGCGB5& �� %-4=DJLLPY`dfgfaYPIFD>7(�� )/7>CFFHPX\]^[\VPE>61'�!� #,38<?ADIORTVXRLB3.+" �!� '059<>BEFHKOMGA5(" �!� "+059;>??@BAB>3  �"� "#(-/159:<<AB5* �$�  1+)*),/385#(% �&�!'**+)�'� �1��:� Z�� *3?KWcnt}xm_ZWRLHFDBA?;60'�� ",7DOYalvyp`YVRJEBA?=85/*"��%*4ANZdozxpdYVQKD?><61-&�� !"#'09EQ_lxwncXWRH>;964-$�� "#&-8ER\hs{}undXUOB:751-*%�� !#$)4@KWbnw|{sk`VPLA8320-% �� "$&-;FR\gquw{zwqj_SJHB8/,(%! ��!%)3?JU^inmw{usrme[OEEB8(%&��")0:CMWbfam~|vpmlhaXK?AA9'&��$-5>GPWXVdtwupkhfb[QF>>@8%! �� (.6>GMONYhmlkgda[SLC:8=2" �� "(08@EHGO[bdcb_\VND;8:6+��%*2:?ABFOWZ]^\WOE>:82*  ��  &-38;<?GORSTRRLF:2,( �!� #*/358;@FHKMOIB9+'#�!�  ',0258<=?BFD?7,! �!� #(-025667885* �#� "%'),023379-# �$�  *#""$(+/-" �&� ""##  �(� �2��:� Z�� *3?KWcnt}xm_ZWRLHFDBA?;60'�� ",7DOYalvyp`YVRJEBA?=85/*"��%*4ANZdozxpdYVQKD?><61-&�� !"#'09EQ_lxwncXWRH>;964-$�� "#&-8ER\hs{}undXUOB:751-*%�� !#$)4@KWbnw|{sk`VPLA8320-% �� "$&-;FR\gquw{zwqj_SJHB8/,(%! ��!%)3?JU^inmw{usrme[OEEB8(%&��")0:CMWbfam~|vpmlhaXK?AA9'&��$-5>GPWXVdtwupkhfb[QF>>@8%! �� (.6>GMONYhmlkgda[SLC:8=2" �� "(08@EHGO[bdcb_\VND;8:6+��%*2:?ABFOWZ]^\WOE>:82*  ��  &-38;<?GORSTRRLF:2,( �!� #*/358;@FHKMOIB9+'#�!�  ',0258<=?BFD?7,! �!� #(-025667885* �#� "%'),023379-# �$�  *#""$(+/-" �&� ""##  �(� �2��:� Z���&�:� �:� �}� �:��:� �}� �:��:� �}���<� �<� �=��?�<��<���<��<�����2HW\VOPU[`bbaa_`\ZXWUTQPMKHFC@?;961/,*)&%$$%'+*.&"��2M_aWQT[_aa`a``_^\ZXXUURQNLJHECA>;752.,(%#"#$%'-*4$! �� 2NcbYV\``baa``_^\ZYXVVSROMKIFEC@>971/)%#"!!$&)-'4!$��3Oac]_b`aa_`__\ZZYWVTRPNKJHFEB@:5.(%#" !! $#')'.'� �1O__]aZ`^a]__^[ZXVUSQPMLKIHFC>61/.,+)('&%#" !!'(/� �1KXS]U]\_^^__][ZXVTSPPNNMKHDB=<763300.-+*(&# #$-� �-FIVTV\\_]_`__]\\YXUUSQNKIEB?<9663210/.-+)'$"$&%�5BIVOY[]_]__`^]]ZVOKHED@><:86543210..,+)(%# +& ��)7AQTQY[^_^_^^_ZUOKFDBA>=;988766543210.-,*'%!(-# ��")CFRVVX[]__]YTOLIGEDAA>=;;9::9976655421//.,)%$"&+"' �� 0GNUZ]^]\YVRONIHHFFCD@A>><==<;:9987554432//-,(%')&,&��6@OZ]\\[\ZVTPMLKLIJGGEDCBABBA??>>=::997554432.+'**'1! ��.GQVX[]^][[XVSRQPNNMLLJKIJIJHEEB@@?>;;:850,(+)'+��/9GMRWZ]]^]\[YWUVUTTRSRRQPMMHEBCBCBB@=60*)-)"��$6:FITX[\]^]\[YXYXYXXYXVTUTUQQMLLMKF<4*)%6$�� #)4:HMTTZ\^_]]\]]^\]\]\]_`aa`_a\\]YXXZ[\\WQF?5-)5!"��  +1<CIMTX]^``a_a`ababbdfgedfggfghfeefhklnlh`[QE6.+*�� $+3<@GMSY\_`cdceefeffhihhihjjllmnprtvvupjbTF;2,�� (-78CFOTY[^bdffgigkilkmnppommllmnoqsuvutqlaVJ=3�� ")14=?JNUV\_cdehkmnnqqtuxyz|zzywttsrrstvwxxwrkaVJ>�� %*039AFNOV\abcgjpquxz}~~}~}}xtoe\NB�� !"'+07@HKQV\_`diopy{􅄃zukaTG� �$.289@GJPXYZ_cjox{|ul_Q� � !047;BGJOSUW\blswyx|{~~{ti[�� 8JHGJMNQXfkpoqsswvy{}{~|~|~|~}}|~|~~|vn`�� -CH>@BGJL\`edghjmmptwuwvwvwvxvwwvwvwxytnb�� 5?76:@EHSW[[]_`dcgknnonooppqrstusrokd��"--,06<CNY^]`_``abcfgghgghhikmopqqonkg��#'(-3>IVZ[[\]]^^`abbcbcegfeffghhjijjii�� !',37@INQSWWXWZ]__^^_bddbcdcdcdc�� #(-7CHJKPRRQTVYYZ\]^]^]]^]^]^]^�� #)-0349?GJKMPQRUUWVW W�  &-38;?CEKNNONONONONON�� #(-8>@AACBDCDD� #)+--.132455778����� � $#'')�0� �6� �8��9� �:���);GJD?>DGKLKKJIIEDBB??<;96521.-+)'$" $"'��(?MOF@BHKKJHEDBB??<<975310/-*(&$"!%#,��)@QOGDHKKMKLJJHHEDCB@@=<:864210-,('%!!$ +��*@NPJKMKLKKIJIHFCCBA?><;965432/-)& ! & � �(AMMJLGKJKHIHHGECBA?><;9865430,%#! &� �(=GAJBHHIIHIIGEDBA?><;:98641.+)'%$"" $� �%8:CBCHHJHIIHFCB@A><9652/-*''%$#"! �*5:D=EFHIHJJIHHEA:7521.-+)(&%$##!" !! �� ,3@B?FGJJKJEA:7310.-+*)(''%%$#"" %�� 57ACCGIILJHD@;86421..++))''(''&&%%$$#"!!$  ��&8=DHJIIGEB>;965523/1-/,,++)(('&%$$#"!!$ ��+3@GIJHIHFB@<998:6856332110.--,))((&%%$$#"  ! ( ��$9AEGHIKIIGEC@?>><<;;:99885410//-+**)&# "!#��%.8>BFJKJKIIGECBBA@A@A@A@A??>;<;<8774221.($ #�� */8;CGKKLIIGEEFFGFGFGFGGECDCD?@?@=;<;<<60( +�� !*/;?EEJLLMJKILJMJLJKKLOOQPPQMLLMHGHHJKMMID:4+$ *�� "(17<@FIMNNPOQNPOPQQRTVWVUWXWWXZXWWZ\``\UPG;,%""�� $)24<@FKMPQSTSVUVUWVWXYZZYYZZ\^__abfhjjid^VI;2'#�� %..8:CGLNQUVXXZ[Z]\^]_`bcb``__`abegijjif`VK?3*�� ")+35>BIJOSVXY[_`baddghkmnonmnjigfeefhjkmllf`WL?4��#(+07<CEKQUVW\_deimortwy{{|{|{|zyxutsrssrnheZQD8��  $(/7=AFKQTUY]deoquyy}}~~~}}||{zywupk`WI<� � '+.17>@FMNPTX_enputxyy|{}{}{}{}|}|{|{{zyvrkbUF� �'*-08<>DHJKQWahlnnqqttvwxxyxywxvqj^Q��-;;=ABELZ_ddfhhlloqsqtrtrtrtstsstsutsldV�� %69246;>@PTZX[\^aaejlkllmllmlmnojdW�� +2+*/59;FJNNQRSWW[`ccdeffhijjhgd`X��$""&+/7AKPORQSSTTVYZZ[[\^`bdefgfdc_\��$(1;FJKKMNNPORSTTUTVWYYZ[]]_^__^^��"'+09?ABFFGGJMPOOPTVVTUVUVU�� #*389;>AA@CFIJIKLNONONNOO� "$&'+17::<?@ADEFFGFGFGG� #&+-135;>=>>=?=?=?=?=?=�� "+01211323233� !""#$&%&'')(*�-� �0� �6� �8��9� �:���);GJD?>DGKLKKJIIEDBB??<;96521.-+)'$" $"'��(?MOF@BHKKJHEDBB??<<975310/-*(&$"!%#,��)@QOGDHKKMKLJJHHEDCB@@=<:864210-,('%!!$ +��*@NPJKMKLKKIJIHFCCBA?><;965432/-)& ! & � �(AMMJLGKJKHIHHGECBA?><;9865430,%#! &� �(=GAJBHHIIHIIGEDBA?><;:98641.+)'%$"" $� �%8:CBCHHJHIIHFCB@A><9652/-*''%$#"! �*5:D=EFHIHJJIHHEA:7521.-+)(&%$##!" !! �� ,3@B?FGJJKJEA:7310.-+*)(''%%$#"" %�� 57ACCGIILJHD@;86421..++))''(''&&%%$$#"!!$  ��&8=DHJIIGEB>;965523/1-/,,++)(('&%$$#"!!$ ��+3@GIJHIHFB@<998:6856332110.--,))((&%%$$#"  ! ( ��$9AEGHIKIIGEC@?>><<;;:99885410//-+**)&# "!#��%.8>BFJKJKIIGECBBA@A@A@A@A??>;<;<8774221.($ #�� */8;CGKKLIIGEEFFGFGFGFGGECDCD?@?@=;<;<<60( +�� !*/;?EEJLLMJKILJMJLJKKLOOQPPQMLLMHGHHJKMMID:4+$ *�� "(17<@FIMNNPOQNPOPQQRTVWVUWXWWXZXWWZ\``\UPG;,%""�� $)24<@FKMPQSTSVUVUWVWXYZZYYZZ\^__abfhjjid^VI;2'#�� %..8:CGLNQUVXXZ[Z]\^]_`bcb``__`abegijjif`VK?3*�� ")+35>BIJOSVXY[_`baddghkmnonmnjigfeefhjkmllf`WL?4��#(+07<CEKQUVW\_deimortwy{{|{|{|zyxutsrssrnheZQD8��  $(/7=AFKQTUY]deoquyy}}~~~}}||{zywupk`WI<� � '+.17>@FMNPTX_enputxyy|{}{}{}{}|}|{|{{zyvrkbUF� �'*-08<>DHJKQWahlnnqqttvwxxyxywxvqj^Q��-;;=ABELZ_ddfhhlloqsqtrtrtrtstsstsutsldV�� %69246;>@PTZX[\^aaejlkllmllmlmnojdW�� +2+*/59;FJNNQRSWW[`ccdeffhijjhgd`X��$""&+/7AKPORQSSTTVYZZ[[\^`bdefgfdc_\��$(1;FJKKMNNPORSTTUTVWYYZ[]]_^__^^��"'+09?ABFFGGJMPOOPTVVTUVUVU�� #*389;>AA@CFIJIKLNONONNOO� "$&'+17::<?@ADEFFGFGFGG� #&+-135;>=>>=?=?=?=?=?=�� "+01211323233� !""#$&%&'')(*�-� �0� �6� �8��9� �:�������;�'! �:�)% �9�.+)%�9�6.0*�9�:12,&�9�<332-�9�D944B�8�L>;-;:�7�SB9:$;�7�VF8A%3#�6�XN;69< �6�a\QJ>5,�4�gfb^VNB6-!�/�dcdca^WOA7.$ �-�]^^_]YOG?3( �-�WXYY[ZYUOF<.# �,�OPRSTVVTOG?3) �+�EGHLLOPQPMHB8/  �+�:=>ACFHJJGC=6(  �*�,0269<?BCFEC?90' �*�#'+.279=@A@?94*  �)� "'(,048:<=<83+$ �)�!#$&'),0347884/*#�(�!',/3541*'�)�  $.320+'! �,� !*/-&& �.� #$)& �.� "$" �/�  �0�  �1� �4��5��� �;�  �:� !�9�# �9�,&'#�9�0(($�9�2*)(%�9�:.*+6 �8�B41$11�7�H9/11�7�K;.6)�6�MB2-/1�6�UPF@4,%�4�\[WSKC8-& �/�VWURKD7.& �-�OPQRRPMD>5+!�-�GHIJLLMLID;3' �,�?@BDDFFGGB<5*"�+�568;<?@AB>;5-& �+�*-.03589::850*  �*�!#%'*,/135531,%�*�#%)*.0110,(! �)�!$&)+-..+'! �)�!$&')++)$! �)�"$'((&  �)�  %((&! �-� !%$ �.�  �/�  �0� �0�  �2� �5��5��� �;�  �:� !�9�# �9�,&'#�9�0(($�9�2*)(%�9�:.*+6 �8�B41$11�7�H9/11�7�K;.6)�6�MB2-/1�6�UPF@4,%�4�\[WSKC8-& �/�VWURKD7.& �-�OPQRRPMD>5+!�-�GHIJLLMLID;3' �,�?@BDDFFGGB<5*"�+�568;<?@AB>;5-& �+�*-.03589::850*  �*�!#%'*,/135531,%�*�#%)*.0110,(! �)�!$&)+-..+'! �)�!$&')++)$! �)�"$'((&  �)�  %((&! �-� !%$ �.�  �/�  �0� �0�  �2� �5��5���������������������������������������������������@�������D��� �������"��������� ���������E#text����������������������������� ���������� ���������� ���������� ���������� ����������������������������������������F���������q������ �������q�� ��%������ ����rV�rf�rv�r�r�r�r�r�r�r�r�s�s�vQ�y,�zW�zg�zw�z�z�z�z�|�$�A�Q�a�q��������������������������������������������������������������������������������������������������������������������<�,� �+���+���+�� +�����*�� ���<�<�<������� ������������������������ �������� ��������� ��������� ����������� �������������������������������������������������������� ��� ��� ���� ���� ��� �����������<�<�=��<��@������ � �� ���������������������������������������P��<�<�;�;�=��/��:��������������������������������������������������������������������������������������������������������������������������������������������������������������������(���9���5��4��4��3��,���+���*���(����������<�<�<�<�<�<�<�<�<�<�<�8�9�:��2����/�����/���0�����.���.���.����.����.����.�����-���.���/����7��8�����:�9�:�8����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������� ��� E���������'���'� ��'�� ����&� ����&� ��&� ������� ������������ ���������� �� ��������� ����������������������������������������������������������������� ��� ��� ��� ������� �&����1� ��������<�=��z����������������������������������������������������������������������������������������������������������������@�������D��� �������"��������� ���������E#band���������������������� ���������� ���������� ���������� ���������� ������������������������������������������������������� ����������������� ������,��(�8�H�X�h�x���H�X�h�x�������9�I�Y�i�y�Ɖ�M�-�p��e�u�������������� �^[Z�7�^\ZZ�7�^]ZY[�:�]XX[�:�]XWY�:�\XWX�;�YY�;� [�<� �<��=���^;�^9�^6� ^"� ��7� �7��:� �:� �:� �;� �;� �<� �<���;�9�6� "� ��7� �7��:� �:� �:� �;� �;� �<� �<���;�9�6� "� 2� 0�0�0�1� 3� 5� 6�8�9�:�;�<�>��=����7�6�5� 2�/�,�� @��8�ZYZ[]^�3�]\ZYXXZ]]^�0�]\^][ZYXXWX[]^^-�[__`^\ZYXYYXX[]^^*�[^_cdeb_[YXYZYXXZ\^^)�Z]`eiid`\ZYYZ[YYXY[\^^'�Z[`fiiea]ZYZ[ZZXWXZ\]^^%�[Z_dimnlhb^ZZ[[ZXWWXZ\]^^$�[^diosqkd_[Z[\ZYWWY[\]^^"�\]biosrpjd_\[\ZYXWWXY[\]^^!�]`horvtnf`^]][YXWWXY[\]]^!� `fmsvuqib_^][ZYXWWXY[[\\]^^ � dkruvsmgc`^\[YYXWWXXYZ[\\]]^^ �$iptwvrlgb`^\[ZYXXYY[\]^^ �+msxxuqjea^][[ZYYZZYZ[\]]^^��jrwwxtmgc`^\[ZZYZ[\[ZYYZ[\]]^� �(puvxvrkea^][Z[ZZ[\\ZYZZ[\]^�!�7rvxxungc`^\[[ZZ\]^\ZYYZ[[]^� �!otwyvrkeb_][ZZ[]__\YYZ\^^� �eqvxyungca^\[[ZZ\^ab_[YYZ]^^� �\iswxvrlfc`^\[[Z[^bdd_ZYXXY\^^� �mvxyupida_\[[Z[]aege^ZXXZ]^�� @��8� 4� 1�  -�  *�!##  )�%,*# '�(+,+% %�&,120*! $�$-4:7.$ "�!+6:95-# !�*5:?;3( !� %2;?>7,"  �".9>?:1)#  � )6=@>91)"  �$0;AA>8.%  �+9@AA<2)# !�!6=?A?9.&  "�.8=BA=3*# !�1;@B@9.& !�!5=BA=3*$!!� (:@A@90(#"&# "�/=BA>7-%  '*$ � @��8� 4� 1�  -�  *�!##  )�%,*# '�(+,+% %�&,120*! $�$-4:7.$ "�!+6:95-# !�*5:?;3( !� %2;?>7,"  �".9>?:1)#  � )6=@>91)"  �$0;AA>8.%  �+9@AA<2)# !�!6=?A?9.&  "�.8=BA=3*# !�1;@B@9.& !�!5=BA=3*$!!� (:@A@90(#"&# "�/=BA>7-%  '*$ � �� 4�/�,�*�'�$�#�!�� �!�"�� �$�%�$�$�#�#�"�#�"�#���������������������������������������������������������� ^1�^/�^.�^-�^.�^-�^-�^,�^-�^.�^.�^/�^0� ^1� ^1� ^1� ^1� ^1� ^2� ^1� ^1� ^1� ^1� ^2� ^2� ^1� ^2� ^2� ^2� ^2� ^3� ^3� ^3� ^3� ^3� ^3� ^4� ^4� ^4� ^4� ^4� ^4� ^4� ^4� ^4� ^4� ^4� ^4� ^4� ^4� ^5� ^5� ^5� ^5� ^5� ^5� ^5� ^5�^6�^6�^6�^6�^6�^/�� 1�/�.�-�.�-�-�,�-�.�.�/�0� 1� 1� 1� 1� 1� 2� 1� 1� 1� 1� 2� 2� 1� 2� 2� 2� 2� 3� 3� 3� 3� 3� 3� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 5� 5� 5� 5� 5� 5� 5� 5�6�6�6�6�6�/�� 1�/�.�-�.�-�-�,�-�.�.�/�0� 1� 1� 1� 1� 1� 2� 1� 1� 1� 1� 2� 2� 1� 2� 2� 2� 2� 3� 3� 3� 3� 3� 3� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 4� 5� 5� 5� 5� 5� 5� 5� 5�6�6�6�6�6�/��(�'�'�&�'�'�(�(�*�*�*�+�*�+�+�,�+�+�,�+�,�,�,�-�,�,�,�-�-�-�-�-�-�.�.�.�.�.�.�.�/�/�/�/�/�/�/�0�0�0�0�0�0�0�0�0� 1� 1� 1� 1� 1� 1� 1� -��&rwyxtmfb`^\[[Z\`diic\XXY[^�"�kuxyvpieb`^\[Z[_chkh_YXWXZ]^�!�qwyxtnida_][[Z_chmkbZWWX]^^�!� gtxyvsmfb`^\[[^bhmld[XWWX[^^�!�mwywuoida_][[\bgmni_YWWZ]^�"�dsywwrlfb_^\[\bgmplcZXWWY\^^�!�jwwtoic`_\[[_flpog]XWWX\^^�"�`ruwvqkeb_^\[]flqqj_XWWZ^^�#�Zjrwwsmhc`_\[\clqqj_YWWXX]^^�"�Zaotwuojea_^\\`lrqkaZWWXXY]^�"�\[hqwvqlfb`^\\^hprnd[WVXX[]�#�Z`otvtngc`^\]_gpspf\XWXYWY\�#�]Ziqutnhca_^]^eospf\WVWZWX[^�"�^Zbnttojfb`^]_dnsof\XWW[WV[^�$�[hqtqkgca_^^blsof^XWW[WVZ^^�#�Yantrnhda_^_bksrk`YWW\WV[^^�#�[issnhdb`_^bjsqj_YWW\WW[^^�$�Yepsnifca__biqrj`YWW\WW\^^$�_mrojfdb`_`fppi_XWW\XW\^^$�[hpolieca`aempi`YWW\WW]^^%�Ycnpmifdbaadjog^XWW[XX]^^%�Y`lonjgdbabejnh^YWW[YX]^^%�]hnnjfecbbdinh^XWVZYY]^^%�Zckmjgfdccdhlh^XWWZYZ^^%�X_hmkhfeddehki^XWWYY\^^&�X\dkkigfeefhkj_XWWXY\^^&�YZaikiggfefhkj`XWWXX\^^&�[X^eiihgfefhjj`XWWXX\^^'�X[aghhgghjjbYWWXY[^^'�XZ^dhhghjjbYWWXYY^^'�X[aghhghjicZWWXZY]^^'�XY^ehhidZWVW\Y]^^(�X[cghiihijie[WVX[X\^^(�YWY`fhiid\WWX[Z]^^(�ZXX^dhijiijid]WVW[Y[^^(�[XW[bgijiihc\WVW]W\^^)�YWZagijjijhc\WVW^Z]^^)�YXX_fijiihc\WVW^[^^)�ZXX^ehijjihc]XVV]Z^^)�ZXW\cgiigc]XVV\Z^^)�ZXWZafhiihfb\XWV[\]^^*�ZXY_eghhea\XVV\_\^^*�[YW^dggfd_[WVW]a[^^*�\ZW]beec_ZWVW^bZ^^*�][W[addedb^YVVW__Z^^+�\WZ_bcca]YWVXb^Z^^+�]XY^bbcc`\XVVZbZ\^^+�^XX]`aba_[XVV[fZ\^^+�^YW\_`a`^[WVV^YY]^^+�^ZW[^^__]YWVVYY[^^+�^ZWY\^_^\YWVVW[]^^+�^[WX[\]\ZXWVWY]^^�*�\WXZ[\[YWVWY]^^+�\WWYZ[ZYWVWZ^^+�]XVWXYXWVVX[^^+�]YWWVWY[^^+�]ZWWVWXZ\^^+�^[YWWVVWXY[\^^+�^\[YXXY[\]^^+�^]\ZZYYZ[\]]^^+�^]]\[[\]^�)�^]\] ^ �)�^] ^�*�^(��� 8ABA<2("&-, �"� ,=BB@7-&"%-0) �!�6ACA<3-% $-40"� &<BB?:2("$,42" "�1?CA=6,%#-57+ �"�!9CA?90(""+5:3   "�,>@A<5,$+3:7(  �"�8=A>8/'!*4<;. �#� *9?@;3*#%4;;/ #�3<@=6-&! 3=<0  �"�)7>>91)"-<>5$  �#�2;?<3*#+;?9(  �#� ,7=<4+%!(9?9( �"�2;=5.'"'8?8( �$�*7<70*$ #4?9* �#�2;93+$ #1@>2  $�,9:3*%""/?=0  %� $694-(# ".==0  $�185/)%"):;.  $�*761,'#  &5;.  %� "462-(%" !&08, %�053/*%" "(07- %�*33.)'$#"&.6- %�#/2/+(%##&-4. &� +1/,)'&%',30 &�%//-*)'').30 &�,.-+*)()-30  &� &,,+*)((,10  '� ),+*+**-11" '�%+,++**-00$ '� )++,,-00$ '�&+,--,-//' (� #),-.-.0/(  (�(+..-.//' (� %+-//0.&  (�"*././/.% )�)-/0//-$ )�(.//-% )� &,./0/-& )� #*-./.,%  )� )-./-*# *�'+--)" *� %)+,+' *�#'())%  *�!%'('#  +�#%&&" +�!#%%   +�!#" $+�  !! +�  +� +� ,�  +�  +�  +� +� +�+� +�+�+�+�,��� 8ABA<2("&-, �"� ,=BB@7-&"%-0) �!�6ACA<3-% $-40"� &<BB?:2("$,42" "�1?CA=6,%#-57+ �"�!9CA?90(""+5:3   "�,>@A<5,$+3:7(  �"�8=A>8/'!*4<;. �#� *9?@;3*#%4;;/ #�3<@=6-&! 3=<0  �"�)7>>91)"-<>5$  �#�2;?<3*#+;?9(  �#� ,7=<4+%!(9?9( �"�2;=5.'"'8?8( �$�*7<70*$ #4?9* �#�2;93+$ #1@>2  $�,9:3*%""/?=0  %� $694-(# ".==0  $�185/)%"):;.  $�*761,'#  &5;.  %� "462-(%" !&08, %�053/*%" "(07- %�*33.)'$#"&.6- %�#/2/+(%##&-4. &� +1/,)'&%',30 &�%//-*)'').30 &�,.-+*)()-30  &� &,,+*)((,10  '� ),+*+**-11" '�%+,++**-00$ '� )++,,-00$ '�&+,--,-//' (� #),-.-.0/(  (�(+..-.//' (� %+-//0.&  (�"*././/.% )�)-/0//-$ )�(.//-% )� &,./0/-& )� #*-./.,%  )� )-./-*# *�'+--)" *� %)+,+' *�#'())%  *�!%'('#  +�#%&&" +�!#%%   +�!#" $+�  !! +�  +� +� ,�  +�  +�  +� +� +�+� +�+�+�+�,���"�!�"�!�"�!� � � � � �� � � ��� � �� � �!�!�!� �!�!�!�!�"�"�"�#�#�#�#�#�$�$�$�$�$�$�$�%�%�%�%�%�&�&�&�&�&�&�'�'�'�'�'�'�(��������������������������������������������������?�^�=�^�<�^<�^;�^\�9�^][�8�^[Y�7�^ZX�6�\[ZZ[\ZX�5�[XXWZ[Y�4�ZWZZYZ][�3�XZ\__^]\�1�[Z]`bbcba_^]�0�YXY`ccba`^�/�Z[]^accddca_�,�YY[_a_`cdccdca`�+�YXX]_accbccdcdca`�*�[Z[]beddccddccba`�'�]^dcbehgffeddcba_�!�\ZZ\^_]\`gophghgfefeddcba��]\\[[\\_bdffkprqnkiihhgffedcba�� &,,' ��beiigdcceimpqrqpoljjiihggfedcba�� 8JTYYU]^_``binsqqpmkjklopponnllkjihggfedcb`�� ,MZ[[Z[]`dhiiloquwustutrpqpoonmllkjjihggfedcba`� � ,R\[[^bgknnoprsswyyvusrqpnnllkjihggfedcba__� �^^]\\[[\^aejnoppopty~{wurqoommjjhhfedcaa``_^� �^\[]_chloqqpps{~yvtrpomljihfdcba``__^\� �^]\[[\^aejnqturqyyutrpolkjhedcbb`__^]]\� �^]\[[\]_cglqtvwuxzvtrpmkiheddcba`_^^]\[� �-\^^]]\\[[\^aejnsvyx{~wtroljheeddcba`^^]\[[� �-\^^]]\[[\]_cglquxzzytrokhfeddcba`_^]\\[[� �'V^^]\[[\^aejotxzz~}urpkgeedbba``_^]\\Z[� �K^^]\[]_chmrvyz|~vqolfddbaa``_^^][[ZZ� � 9^^]\[\^aejptwy{wqokfdcaa`__^^]\ZYY �^ W^^]\[]_chlqtwy}{snjecca__^^]]\[ZYY�^9]^^]]\[[\^aeinqtx||tnkebba_^]]\[[ZZ�Y?��=��<�<�;�:�9��7��6� �5� �4�  �3� �1�  �0�   �/�   ! �,� !! �+�   �*�  �'�  ##!! �!� )-%##! �� #,0/,($$#"!! ����!!"(,//..,)%$$#! �� $--,+)&%&',--,*('&%$"!! �� "'*/421243/-/.--*)((&%$"!! �� &)')),./599;;74310-,+))'%#"! � � &+,,)*19AGNMF>:730--**&&#!� � ").10-*/<MUYVND=9620/+*'%!� � &-255/-9O[YTOF=9741/+)&!� � "*169949KVYXSL@:751.*&"�� &.59=9>ITZXUOE;751,(#�� "+38=?>GQWZYUL?851*% �� '/7<??ENV[ZXQE:52*# �� #,3;>?BKTXYUQG;41," �� (07<?AGQTVSQK?51*" � ��� $+38<@EMQTRNLC70*  � ��� &/39=CIOQPLJE:1,! ?��=��<�<�;�:�9��7��6� �5� �4�  �3� �1�  �0�   �/�   ! �,� !! �+�   �*�  �'�  ##!! �!� )-%##! �� #,0/,($$#"!! ����!!"(,//..,)%$$#! �� $--,+)&%&',--,*('&%$"!! �� "'*/421243/-/.--*)((&%$"!! �� &)')),./599;;74310-,+))'%#"! � � &+,,)*19AGNMF>:730--**&&#!� � ").10-*/<MUYVND=9620/+*'%!� � &-255/-9O[YTOF=9741/+)&!� � "*169949KVYXSL@:751.*&"�� &.59=9>ITZXUOE;751,(#�� "+38=?>GQWZYUL?851*% �� '/7<??ENV[ZXQE:52*# �� #,3;>?BKTXYUQG;41," �� (07<?AGQTVSQK?51*" � ��� $+38<@EMQTRNLC70*  � ��� &/39=CIOQPLJE:1,! ��<�=�<�;�:�9�9�7�7�6�5� 5� 3� 2� 1� /�.�,�+�)�%���!�%�)�-�/ �1 �4 �5�7�7�7�6 �4 �4 �2 �1 �/�.�^8�^8�^7�^7�^7�^7�^7�^7�^7�^8�^8�^7�^7�^7�^7�^7�^6�^6�^6�^5� ^5� ^5� ^4� ^3� ^3� ^2� ^1� ^1� ^1� ^1� ^1�] ^1�\]^ ^1�[\]^ ^1�Z\\]]^^1�YZ[\]^^1�XZ[\]^^1�WYZ\\]^^1�WXYZ\]^^0�YWWXZ\\]^^0�[XVXZ[\]^]^^0�\ZWWXZ\]]^0�]ZXWXZ\]^]^^0�][XWWY[]]^0�^[YWWY[]]^0�^[YWWY[\]^^0�^\YWWYZ\]]^^0�_]ZWWYZ[[\^^0�`][XWXZ[[\]^^0�_][XWXYY\^^0�_][YWWXXZ]^^0�_][XWWXXZ]^^0�^][XWWXZ\]^^1�\[ZXXWWXZ\]]^�1�\ZZXWWXYZ[]]�2�[ZYXXYZ[\]^�2�ZYXYZ[\\]�3�ZY\]^�3�ZY[^]]^�4�YXZ]^^5�YXY\]^^5�Y[]]^^5�YZ[]^^6�YZ\]^^6��8�8�7�7�7�7�7�7�7�8�8�7�7�7�7�7�6�6�6�5� 5� 5� 4� 3� 3� 2� 1� 1� 1� 1� 1� 1� 1� 1� 1� 1� 1� 1�  0� 0�  0� 0�0� 0� 0� 0� 0� 0� 0� 0� 0� 0� 1� 2� 3� 3� 4� 4� 5� 5�5�5�6�6��8�8�7�7�7�7�7�7�7�8�8�7�7�7�7�7�6�6�6�5� 5� 5� 4� 3� 3� 2� 1� 1� 1� 1� 1� 1� 1� 1� 1� 1� 1� 1�  0� 0�  0� 0�0� 0� 0� 0� 0� 0� 0� 0� 0� 0� 1� 2� 3� 3� 4� 4� 5� 5�5�5�6�6�� 2� 2� 2� 1� 2� 2� 2� 2� 2� 2� 2� 1� 1� 1� 1� 1� 0�0�/�/�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�/�/�/�/�/�0�0� 1� 1� 1� 1� 1� 2� 2� 3� 3��^1�+�^,�^�*�^�*�^5�)�^J �)�^�)�^'�)�^/�*�^8�*�^+�^+�^+�^,�^+�^+�^*�^*�^)�^)�^)�^(�^'�^'�^'�^'�^&�^&�^%�^$�^$�^#�^#�^#�^#�^$�^%�^%�^&�^&�^'�^]^�&� ^]^]]^]]\(� ^]\]\(�^]\[\\[�(�^]\\Z[[\\[�(�^]\[YZZ[Z*�^]\[[ZYYZYZZ*�^]\[[ZYXXY,�^\ZYXXWWX.�^]\ZYYXXWWVVWVW�.�^\[ZXXWV0�^]\ZYWWVU1�^\YWVVWVUUV�1�^]ZXVVUVU�2�^\YWVUVVUU4�^[XVUUVUU�4�^][XVUU6�^]ZWUU7�^\YWUU8�^\YVUWV�8�]\YVVX�:�\XVW�;�\XV�-�,�,�,�,�,�+�+�,�,�+�+�+�,�+�+�*�*�)�)�)�(�'�'�'�'�&�&�%�$�$�#�#�#�#�$�%�%�&�&�'�'�(�(�)�)�*� *� ,� .�/��/�1� �1� �2� �3� �4� �5� �6� �7�  �8� �:��;��-�,�,�,�,�,�+�+�,�,�+�+�+�,�+�+�*�*�)�)�)�(�'�'�'�'�&�&�%�$�$�#�#�#�#�$�%�%�&�&�'�'�(�(�)�)�*� *� ,� .�/��/�1� �1� �2� �3� �4� �5� �6� �7�  �8� �:��;��(�'�'�'�(�'�'�'�&�&�&�&�&�&�&�%�%�$�$�#�#�"�!�!�!�!�!� � ���� � �!�!�!�"�"�#�$�$�%�%�&�'�(�)�*�+�,�-�-�.�0�1� 2� 3� 5� 5� 6�8�9�@�^�=�^=�^<�^;�^:�^8�^6� ^4� ^1�]^ ^/�\]^^+�[]^^)�ZYYZ\^^'�ZYWXY\]^^%�YWVWX[\]^]^^"�YXVUVWXYZ[[\\]] ^�XVWXYYZZ[\]^^�WVUVUVVWYZZ[\\]^ ^�VUVVUVUVUVVWXYZZ[\[[Z[[]^�UVVUVUUVVW XZ[]^^�UVWZ^``^]ZYXWWVWVWVXY[]^^�UVWXZ[\]\[[ZZYXXWWVWVWVWZ\^ ^�VUVWXWVUVVZ^ ^� VUVVWVVZ\[[\\]^^�UVWWVUVUVVWXVVWXXYZ\]^^ �UVWXXWV U VWVWW[]^^ �UVWXYYXWVVUVUUVWX[]^^�UVWYYXWWVVUVUUVUVVWY\^ ^�WVVXZZYXW VUVUUVUVW[^ ^�XWYZ[\[[Z[ZZYYXXWWVVUUV\[\\]^^�WZZYXXY[]]^^\[ZYXXWWVVUVUXWYZY]^^�@��=�=�<�;�:�8�6� 4� 1�/�+�)�'�%�"��� �  �   � !"  �    �     �          �          �       �     �    �    �  � �@��=�=�<�;�:�8�6� 4� 1�/�+�)�'�%�"��� �  �   � !"  �    �     �          �          �       �     �    �    �  � ���=�=�=�;�:�8�7� 5� 3� 1�/� ,�)�&�#��"� � �(�+�-�/�2 �4 �5 �7�8�9�:�;�=�>�9�����������������������������������������^M^^]\]]\[[\_bginruz~~}wplgba`_^]\\[[ZY�O^^]\]\[[\]_bfjnsy}~zzwplhb``_]\\[[ZZYZ��J]^^]]\\[]_cglrwz}{yxuplhc``_]\[[ZZ[\��M]^^]\\[\^afkotw{}~zvusokgc``_][[ZZYYZ[\]��Y^^]\\[\^`dhmqsw{|xsrqnjgc`_^\[ZZYZ]^��H^^]\\[]_bfjmosxzvqpomieb_^]\ZZYZZ[]^��/\^]\\[\^`dgijovwtolljheb^]]\ZZ[]^^��T^^\\[\^adffjstqliihfc`^\\[ZZ[Z\]^^��B^^]]\[[\]_bcaenomjgfedb_][[\ZZ[Z[\]^^��)[^]]\[[\]__^bhjigedcb`^\[[Z[\]]^^�� O^]]^]]\[[\]_cfeecba_^\[Z[[ZZ[\]]^^�5\^]][Z[\[\_abbaa`^\[ZZ[\]]^^�U^^]^\[ZZ[\^_``^\[ZZ[Z]]^^�A]^^]^\[ZZ[\]]^]]\[ZYY[\^^�#[^^][ZYYZ[\[ZYY[Y]^^�Q^^][ZZYYZYZ[\^^�D^^][YXXYXYYZ[[\[Z\]^^�<^^]\ZYXXYZ[[]\\^^��;]^^]WXWWXWXXY[ZZ[\]]^^ �<]^^\YXWWYZ[\]]\\]]^!�8]^ ^\[[\[\^^"�/]^^#�'X^^%�K^^&�^9\^^&�^ N^^(� ,R^^*� ,N^^,� ^^.�^ ^1� ^1� ^2� ^3� ^4�^6�^7�^9�^9�^;�^��� "&.5;AGMOLIIG?3-$  ��  (08?EIMLHDC>4-&  �� ",5<BFJJEB@=4,&  ��  *29=BFHC>;92,$ �� &-48>DEA:861*$ �� ").18@C>754/)" � $(*2<>;3/.,'! � "")7:6.*)($ � "030+&$#   � (+)&#!  � $##   �  �  �  �  �  �  � !�"�  #�$�%�'�&���&���+�-�.�/� 1� 1� 2� 3� 4�6�7�9�9�;���� "&.5;AGMOLIIG?3-$  ��  (08?EIMLHDC>4-&  �� ",5<BFJJEB@=4,&  ��  *29=BFHC>;92,$ �� &-48>DEA:861*$ �� ").18@C>754/)" � $(*2<>;3/.,'! � "")7:6.*)($ � "030+&$#   � (+)&#!  � $##   �  �  �  �  �  �  � !�"�  #�$�%�'�&���&���+�-�.�/� 1� 1� 2� 3� 4�6�7�9�9�;���'-�.�.�-�,�,�,�+�*�*�*�)�)�(�(�'�&�%�$�#� �� �!�!"�%�'� (�)�*�,�-�/�0� 1� 2� 3� 4�6�8�9�:�;�<�<�<�`�Z[\]^^6�[\]^^7�]^^7�^8�^9�^9�^:�^;�^<�^=�^� ~�6�7�7�8�9�9�:�;�<�=�� ~�6�7�7�8�9�9�:�;�<�=�� ~� 4� 4� 4� 5�6�6�7�9�9�:�;�;�<�=�� ~�>�X�=�\��>��=���>��=���:�;�<�=�>���VW[][YYZ\^__^]\[[ZZYYXXWWVVUVWXZX]^^�XVY^_[YZ\^__^_^^]\[[ZZYYXXWWVVUVWVWVVWWXYZ]^^�XVY`_\[]^^__^]\\[[ZYXXWWVVUVWXWXZ\^^�YVY_`]^_^__^]\\[ZYYXWWVUVWXWZ[^^�VY^^]_\^^_]^^\[ZYXWVUUVWXW\^^�VX[Z]Z]]^^]\\[[ZZYYXXWVVU UVW[]^^�VWX[Z[]]^]^^]\[ZZYXXWVV UVWXYZ[]]^^�VWW[Y\\]^]^^]\[YXWVV UTUTUUVWVY[]]^�VWZZY\\^^\ZYXWVVUVWXZ]]^^�XWZ[[\]^^]\ZYXWWVVUVWXY\]^^��XY[\]^]]\[YYXWWVUVUUVWWXWY]^^�� Y\]]\]\[ZYXXWXWW V UVWWXWY]^��[[\]^]\\[[ZZYYXXWXWXWWVUVWWXW\^��5[\]]^]]\\[Z[ZZYXWVWVWVVWXYZ^�� FZ\\]]^]]\\[\[\[[\[[Z[Z[YYXYXWVVWX\^��  +XYZZ\]^^]]^]]^_^_]]\[[\][ZXWWYZ�� FWXYZ[]^^_^_^__`aa``aa`acdca^]ZXWWX�� TWWYZ\]^^_`_``a`aabbabbcdefghhgeb_[XWW� 9VWWYZ\\^_`aabacbccddeedcdefghhgfc_[XWV��  EWVXY[[]^_``acddfghijjkjjiggfghiihfc_[XW�� LWWXYY[]__abefhijlmopqqrqrqrppnnmmlmlligd`]YW� � !"MWWXYZ[]^^`bdejknpprrsttsrqponmjgc_[X� �$NWWXYZ\\^_bdikmmnppqqrqrqrqrrqponkgc^Z� � �YWWXXYZ[[]_cfijikkmmnoopopoonomkgb]��]ZWXXYZ\`cedeffhhjklkmkmkmlmllmlmmkhd^��]ZWWXVWWXXY]^``aabddegihihihihihiihihiijgd_��]\XVWVVWXZ[\]]^^`_acddedeefghgfec`��]ZXWVVWY\^]^^_abcdeeffedca��\[YWWVVX[\\]^_`aa`aab�][ZXWWVVWXYZZ[[\]^^_``_`_`_`_��^]\ZYXWWVWWXXYZZYZ[\\]^]^]]^]^]^]^��]\\ZYYXWWVVWXXYYZ[[�^]]\\[[ZYXWVVWXY Y�^]]\]\\[ZZYWWVVWVVWVWW�^][XWW V�^][[ZYXWV��^]\[ZYY�*� ^]\[ZZ�3�^\[[ZY�4�^]\[Z�<�]\��   �  �!    �!   � � � �  �   �   �     �      ��    ��   ��   ��   ��   "#"!"#""#$""$%(('# ��   ! "!"!#"##$$#$$%&&'')),-//-)$ ��  !"#$%$&%'&((**)((''()+-.//.+& ��   !"$'')(++-.02332/.-,,+,-//10/+& ��  #&*+/1368:<>=>=>=>=;:87656551,)! � �  !$)*348;<??@AABAA@@??>>=<;973.&� � �  %)1377:;;>=?=?=?=?>?>=>==<;84.'� �� ',01244778::;:9:84-$��"%))+,-/024647575757676676775/(��  "!##%''*.0/001002.)��   #'))*)*+-.-,)'!��  "#"##$#%'(**+,,*)&#��  !""#$$&%&&%%��      ��  �  �   �    �� ����"+�4�5� =��   �  �!    �!   � � � �  �   �   �     �      ��    ��   ��   ��   ��   "#"!"#""#$""$%(('# ��   ! "!"!#"##$$#$$%&&'')),-//-)$ ��  !"#$%$&%'&((**)((''()+-.//.+& ��   !"$'')(++-.02332/.-,,+,-//10/+& ��  #&*+/1368:<>=>=>=>=;:87656551,)! � �  !$)*348;<??@AABAA@@??>>=<;973.&� � �  %)1377:;;>=?=?=?=?>?>=>==<;84.'� �� ',01244778::;:9:84-$��"%))+,-/024647575757676676775/(��  "!##%''*.0/001002.)��   #'))*)*+-.-,)'!��  "#"##$#%'(**+,,*)&#��  !""#$$&%&&%%��      ��  �  �   �    �� ����"+�4�5� =�� l�=�=�;�;�:�8�8�/�4�.� 2� 2� 1� 0 � / � . �.�-�-�,�,�,�!�*�*�)�(�(�!�%��&�&�&�%�� 8�<�@���^�=�^=�^<�^:�^9�^8�^7�^7� ^5� ^4� ^4�[]^^3�YZ\]^^2�WXY[^^2�WY\^^1�WXZ^^0�WVVY^^0�WVVW^ ^/�WVVWX\^ ^.�YWVWWX]^ ^-�ZWVWXWZ^ ^-�[XVWXVW\^ ^,�\YWVW\W]^ ^,�_]ZXWWYY]^ ^+�a_^[YWWYZ\]]^^+�`_`__^[YWWXY[\]^^*�]^^]\YXWWXZ\]^^*�[\[YWWVXZ\]^^)�YZ[ZYXWVWXZ]]^^'�WXYXWVVWY[]^^'�VWXWVWZ[]^^&�VWVWYZ]^^&�XW VXY]]^^%�YXXWWV VWY\]^^%�YXXWWVWY\\^^%�YZYXWVVWXY[\]^^%�\][YWWVVWXY[\]^^&�^][YXWVVWWXYY[\]^^-�\ZXWWXYZ[]]^^/�[YXWXXYZ]]^^1�YXYZ\]]^1�[ZY[\\]]^^2�[\\]]^^4� ^4� ^6�^9�^:�^'����=�=�<�:�9�8�7�7� 5� 4� 4� 3� 2�2�1�0� 0�  /�   .�   -�   -�  ,�   ,�  +�#  +� ! *� *� )� '� '�  &�  &�  %� %� %�%�&�-�/�1� 1� 2� 4� 4� 6�9�:�'����=�=�<�:�9�8�7�7� 5� 4� 4� 3� 2�2�1�0� 0�  /�   .�   -�   -�  ,�   ,�  +�#  +� ! *� *� )� '� '�  &�  &�  %� %� %�%�&�-�/�1� 1� 2� 4� 4� 6�9�:�'��=�=�<�:�9�8�8�7�6�6� 4� 4� 3� 2� 1�1�0�/�.�-�,�,�+�+�*�)�(�(�'�&�%�%�$�$�$�#�#�"�"�"�"�"�"�$�(�+�-�.�/�0�2� 5� 6�8�:�:�������������������������������������������������@�������D��� �������"��������� ���������E#Paper���������������������� ���������� ���������� ���������� ���������� �������������������������������������������������y������ ��������P�\�h�t������ ����9�I�O��(���.�2�2�2�A@�o$���Ɇ�I������<�[�~8�L��ְ�������� �0�@������������ G�=� 3�.�-�)�*�&��#�#� �#� � �$�&�%�$�#�"� ���� �� ��!��"��"�� G�=� 3�.�-�)�*�&��#�#� �#� � �$�&�%�$�#�"�!�����!�"�#��"� G�=� 3�.�-�)�*�&��#�#� �#� � �$�&�%�$�#�"�!��� �!��!��"��"���\Wgd6�.�𨚒adoQ�%�f̿�$� �!���T ��T��4���ԡi6��x�Y/��)گG��!ީD� �w#ľx%� �G$� �5(�!u)�C�%�'$�A#�e"� 8!����n�Q��ٮV��P��<��� ��;� 5� ���������Nd."%5    ��෇bR% ��МgUV7& ��սd_Q?/)$ � �Ǵmi]I81+! ��ʵvrfZWSI>1# ��ɺqXF?9.& ؽyoc[[VG0* ��;� 5�� ���������Nd."%5    ��෇bR% ��МgUV7& ��սd_Q?/)$ � �Ǵmi]I81+! ��ʵvrfZWSI>1# ��ɺqXF?9.& ؽyoc[[VG0* ��;� 5�� �������;M$)��골kNA ��ڷ~SDF/! ��tSPE7*$  � �役x]ZQ?2+& ��⽾|gcZOLI@7+ ��ݼ{dM>72)  �⺻xkcWPPLJ?*$ � �<�s�:�~# �6�ƜsS2 �1�ؾV7�.�i7�*� ь8  �!�ýnS6.)% �� ƿs[? ���϶sV4��թzX5��ɡ]@$  ��Ѡb=1-18EOI- ��ij~Ê{fɩʿ��<���<���<���9/# �6�‰mn^2-(  �-�گƈ�{�1��)� ��� ���ƹ{�1��)�  ��� �ɾ��Ӿ{�1��)� ��� �򭠗�񸷷� >��7�"L�2�@�.�3Ty�#�Rɳ帓K�� =fݿ�-آ� � 7[|  � (E � М ѕҷ  �9�6�4�1�-�*��� �� ����������� � �� f�� ��8�6�4�1��,��)��� ������������� � ��a�� ��8�6�4��0��,��)��� 븺����⸻����䶸��뻼��� ��� I�󷶶峲뵴㻼㹸󰯯䰯״갯��:��7��5�l켌�2� _ݿA!�0� eӸ/� (-�[*�X%� V"� 9�!F�� $F �� H �� D� � >�� OŖ��`5ߪíИ`V   �8�2� /�-�+�)�&�#� ��!�#� � �� � ��� � 򿼽ɾ𹺼Ӱ籰��8�2�/�-�+�)�&�#�  � � ���� �� � � � ��  ��֜վ𹺼Ӱ籰��8�2�/�-�+�)�&�#� ��𸻹���� �� � � � �� ��¾    꽾 综ݺ۷´񯰯ï𺼽ȭᯰ̪⯰˧宯ʤ۞ˠ笭̜ȗΚΖϘ픓⟡��9�1^)�1�wſO�+� (D~U�)�QȯU�$� Hj�!�8j � �P ��kC��8q ��'Cj�F��{-� �CmG � �!~F#� �̥y#T� �Ϧ. &+��ͫ  �A��¹; ��ʞzo`�Ɍf(�㼌pVյC nO3       !"#$%&'''� ���=��=�=�=�<�;�;�;�:�9�9�8�7�6�5�4� 3� 2� 1� 1� 0� /�/�.� ���=��=�=�=�<�;�;�;�:�9�9�8�7�6�5�4� 3� 2� 1� 1� 0� /�/�.� ���=��=�=�=�<�;�;�;�:�9�9�8��6��5��4�4�3�2�1�1�0� /�/� .����=��=� �<��<��<�9�;�2�;�?�;��:�1�:� �9��9��8�U�8�[�7��E�6��!�5�f�4� .�3�U�3�#�2�r�2��]�1��O�1��t�0��Ǘ�/��8�.���-� -�-� �,� �+� �*� �*� <�)�"�(��'�����������������$��$��$��%��&��'��'��)� �*� �*� �,��,��-��.��.��.��/��/��0��1��1��2��2��2��2�*�2�ľ�3�_�4�3}�4� f}�5�$r�6�8z�6�3�8��8��9�;�;�<�<�-� �'��'��'���������������� ��)����6����=���=��� 6��� )��� ��� ��� �� �� �� � ��� ������ ��� � ��� ���$��$��$��%��&��'��'��)��*��*��,� �,� �-� �.� �.��.��/��/��0��1��1�ܲ�2��2��2��2�)�2��3�[�4�1y�4� by�5�"n�6�6t�6�1�8��8��9�;�;�<�<�-� �'��'��'���������������� ��'����3����:���:��� 4��� '��� ��� ��� �� �� �� � ��� ������ ��� � ��� ���$�%�%��%��&��'�(��)��*��*��,� �,� .� �.� �.��.� �/��/�󪫪�0�󫳭�1�򶞢�1�򶥅�2�󜓠�2�󢤑�2��2��2��3�E�4�%[5�IZ�5�R7�)W�6�%�8��8��9�;�;�<�<�-� �'��'��'���������������� ������'����,���,��� '��� ��� ��� ��� �� �� �� � ��� ������ ��� � ��� ������� ��!��!�+�"�$� �#�T �$�0֋0�%�o�%�t%�&�Y�'�=�(�ސ?�)�ݢ�*��+��+��-��-��.��.��/��0��0�2��2��2��3��3��3��4��5��5��6�7� .�EH;. /&�E~#�4P`t �Se ��9��I��i��*|��L��g��@ ��= ��9ف ��. � �%u: � �z � �B � � % � �9b � �x�� �� �� �3׼�� � x�� �0$%� �^�� �� �żz򾼻禥ݤþ ¾ ½¾ÿ򨦧  ſ¼þþ ¾ ¾ݝþ驧Ŀ ¿|uȿgļ ݟT6Ľ۟Jýڞ�Ŀ����ſ�Ŀ�¼� �żz 踹߷¿񽾼򯮮ÿ½ 󪩪Ŀÿ 赳¿밮¾󷴴 ľþþ ſſ𬩨Ŀȝ񟞟 þvǾoĽc ݟQĽ4û۟G۞�¾�ÿ���Ŀ�ÿ�¼��ſٹ|~ulpﱲ𷸹ľ鷸˴鷹鯰Ѵ󳴴δ먧ⲳƳᱲ󱰰쭬ߧ𹶲乸궴ﲰ결 ஬쟜ⶴḶﹸ𗔔繸긷ḷܷⷶﵴ蛚 괵 𵳯 봰 㴳ⲯ󏐐򰭫񲯪񱭨󯳲赴讉ݑY䑒T ┕K=ԑ' 5갮�巶�񣢣��񶴲��ﷸ󡟟��丷�践� 巺��ⷺ�ƿ   !499988777, & ! !!    ""&%%('&()'%%      pY\PBKRavD:0$�$�⛐|!彼ٸ㻺ޯ 񭬬 =y񡠠  靜  %"坜ߞ󞝝  죤pY\PBKRavD:0$�$�⛐|   ߦ 顢%?0⠟  %)  '%"坜ߞ󞝝  죤bMOD:BJWfly:0(�$�܊||pupou}밯üɾƿ̷Ϭ̣򫬬š⠣۟험 . '4>1    鎏돐ꑒ向   䑐񖕕Ւ󔒒ܔ┕陘򘙚񚛝񚙙  瞝󜞝񔕖󝞝󕔖"  ?;; � *Nn¿¿ڣĽ֡򷶴󯮭!(|<92/)   򞝝       䝞  띞  󣢢 硢򣢢᪩ � )Ml¿¿Ľ֡󯮭"851("             䝞  띞  󣢢 硢򣢢᪩ �9R츹ſﺸ ߽򹸸𻺹¿𴲰Ӿגג      󓒒ߔ󒓔򏐐Ў 폎�6.,"  򒑑񑒒󙘘옙왘왚虘𚛜𙚘 團򛜜𜞝ݡ뜞 㜞眝鞝𞝜 뢎  &+�60, % ٺٳ񽼻ﵴ ⧦$*.l8501-*%""    򡣤񠣤񞝜  򟞞  󢡢󪩪 򧨨 &* - .32ٺٳ񽼻ﵴ ⧦$*.-9621-*'#"        񠣤񞜜  򟞞  󢡢󪩪 򧨨 &* - .32򶵵鮭㨦𠞞䤥 얕!)/<52.&!򏐐 򎐐􏐐鏐 񐏎򐏎򐎎 򓒒򓒒 򔕖 𖘙씖 񝞟ᖗ󨥘򨧧򔕕󧦧򗖗薗 򧦦 殮𚛛랟 #󥣢%'+9s366 $'* .2469 𧩪޵䯱줢Чݨ֡뢣١렟ܡ柠埡⟠硣론㠡ޝ렠ڭ쟟֞ۥꞞѠ鞞ͣ睞Π坞ɠ睞ؠ랟㟞⟟򠡣៟桢򡢥ݡ꺼ڧ軾ة׫֭֮й֯춷د𵳳ٱ紵ۭ쳲߫簯߫仼ެ笭ذت浶֪񬭭㴵ת𴶵ת۰תԫ֪ګت̫۪૬ݪѬު Ԯު ѭݪ ܪ Ѯڪ𭮯ڪ׮٪նڪӫϫ𧩪޵䯱줢񧨩᪫ݨ֡񥧥١렟ڞ柠 埡ݝ졡 硣㠡ޝܭ쟟̥֞ꞞѠ鞞ͣ睞Π坞ɠ睞ؠ랟㟞⟟򠡣៟桢򡢥ݡ꺼ڧ軾ة׫֭֮й֯춷د𵳳ٱ紵ۭ쳲߫簯߫仼ެ笭ذت浶֪񬭭괵֪𴶵֪װתث֪ޫت櫬۪㫬ݪѬު Ԯު ѭݪ ԰ܪ Ѯڪ𭮯ڪ׮٪Ȭ٪تӫϫ䚙ȓӘÒΔ’Ԓ¾ ޑ  ޏ򵷶󏑓提ۏ⏐向둓񸹺 ޑ 呓㒔蔕򖘘갱咓哔벳𓔕𓔕簱训鱰믛񩪪橪񪨨󩪫󪩪𥦧򨧨ꦧ릥礣򧦦饧碣ۢ 뢣#颣&(񤥧(򫪪&飥%$頻#!𫬬 ꩫ妧復뮭񭮮󨩪(())** ( ( ( ' )+,*//01122287786;;<==>~<::;B,�+�*� (� '� '� &� &� %� $� #� "� "�!�!� � ������������������������ ���������� � � � � � � � � � � � � � �,�+�*� (� '� '� &� &� %� $� #� "� "�!�!� � ������������������������ �� �� �� � � � ����� � � � � � � � � � � � � � � ,� +�*� (� '� '� &� &� %� $� #� "� "�񽿾!� !�] � � �󼽿 � � � � �󽻼 �󹺻 � � � �򴵷 �ﱲ � � � �챲 �밲 �뱳 �ﱳ��붷 �ﻺ�򹺻�굴��鳲��챳 Ǹ��챳 ÿ� �𳴵� �봵� �ﵶ�쵷�񶸺�󸹻 � �鼽 � �ﻼ � �궷 �羿 � � �򾼽 �󴶸 � �󭮯 �/�&��%��$� �$� �#� �"� �!� T�!� ,� � �� �� �� ��m����������~����U��+��a��;��&�� ��M����5��~������������)������� �� � � �� � � �H� �� �� �� �� �����I���� r�� m��  ��  ?��  �� ��  �� ��  ��  ��  &�� A������������������ ��� � ��� ��� � �� �� � ��� ��� ��� ��� ��� �� � �� ���*���� � � ���+�+�*�(���&���%��$��"��!��������� �� "� � %� �� ��� � ��� ��� � �� �� � ��� ��� ��� ��� ��� �� � �� ���*���� � � ���+�+�*�(���&���%��$��"��!�������������"� �%� �� ��� � ��� ��� � �� �� � ��� ��� ��� ��� ��� �� � �� ���*���� � � ���+�+�*�(���&���%��$��"��!�������������"� �%� �� � {��� �� �� 1�� D �� S� ��; �� ��s ��4 ��& ��0 �� V��Ƕ����8 � � � �� �%*� �/*� �)� �+'F� �%3� �$P� �#�!� ����Ҳ�㲂�ݓX)�  � Ǹ�%����ÿ� �ň�)i���� I���2��0��ü �ſ��¼��Ŀ��񥤣�ÿ��ÿ��ʰ�氯��׮�����¸۽yvWVUYISS^epo|��ǢbP;:*&!*2DNPRcmq}}qjkkljhgc_`hmpx��֧pUB494*  !"$/;GWji[TRLFIMLLSYTMN�!� #$(./-.0.--,(%""�(� �-�  ���¼ � ľ����ý����¿��ÿ��¿���乶���   ¾¿¶~ĩxrmkNMLPCJKV^fht}��ƻ|XG54&!&-@IKM[fluukegfgedb_\\ejmt��ydL:/3.%   !,8CRccVPNHCEJIIOTQKJ�!�  "',,+,-,**+*'#!!�(�  �-� ���ż ��Ḽ�廼��𢟝��貱��⯮�豰򝛚�򥤣�𥤢��󳲲��쮭� �鯰�찯�� 򳰭     󵴳  렙ѪҨ{roba`b]__b_cfjkorvy|~||{{}|~Ҫ~|trYTPO:98<267@ELMU]`ajmlnrrprtiba_`dhk��ᨠle_\B4'&".679DKPVWOKKIHFCDJOQV��ܧpZK8+"%"  *2<JI?:951366;>;78�!�   �(� �-���    #(&%#$&%�&&&'(&&#"  ¿ſ͹ù{��ήιylTOLKG@9./228HPT]hmou���� /Rje_kʙoaUHIL]gk  #'1��$01$��󣢢󟠠窱䪫𫬭잟񫬫񠟟󟡟򮯮ퟠ󡢠򥧦𧨧거񯮮乺붷󻼼ߵ[!괹򁉉OG>@B957956AJP[kor   '**3<CGWku~ ��� "(-?VZXs �'� ��󣢢󟠠窱䪫𫬭잟񫬫񠟟󟡟򮯮읟󡢠򥧦򶫪𧨧찯ݲ䵶򸷸 󽼽 ꯵KE=>@946855AJPZkor~   '**3<CGWku~ ��� "(-?VZXs �'� ��󘗘󜛚󛜜ߡ쓔󥤤꒑٧锕ۜ𧦦랝򟜚ߝ𩪪󩨨誩쫪񠡡ࡠ裢檫¨詨çç󳲲麼¥̪ģ©Ţ”𪫪޷Ã󳴳nt|맪𶵶㻼^ddhppmt|z{ﹺپ82-/0)')+((18<DQTV_mps~   '.36BPW`k~ ��� !.@DAVilk�'� ���=:742 / '#"%),06533 3 4Y=򾾽ǿ~{|tuvaWJ?91(-354GX\b9<:6.'#'IsïŲlfw �&E̿gJ5+ �� Ѽ�.�ȸĽ�1�ٶvk`p��󧦧򭬬'  緳︷ ] ��� � -_w�� ���"��%��)��-��0� 8�@�󧦧򭬬'  緳︷ ﶵ긷 ��� � -_w�� ���"��%��)��-��0�8�@� # 3𨦥.򩧦%󭫫󬫩󭬭뭯񮭭󪫫񨮮򸺺躹󼻻Ӿ ⽾𾿿𾿿ٽ��� �"HZ�� ��"��%��)��-��0�8�@�kS=5 , ( 30=  ɻXMWʌaIH:ImsྲzY`jhG��?ٳy7(��粨C*��jK ��ւrK ��ǘzk[8�� !=tƉshD � 's੠]N5!�.Ns{O�%�0f�)� #Af�4�&E�?�20/. ?<=6740,)) ӯ0-ﹸպؿ  ��� ��!�M�20/. ?<=6740,)) ӯ0-ﹸպؿ    �� ��� �M�779=;86666400-񨩨- 򫪪ܫ誫󵴵ﰯݫ뮭󹸹󯮯ﻺ񹸹 򶷸�� ��!�M�<8/ ,$  ( /$I& ɛoB- ����5�:�鵸Ȭ󮰱򶸸궸깸ح򫪫河백训񫬬󰱳 򷹹ﰱ  µĶ𵶷Ʒ 쵶ɸ鵶͸ Ѹպػ Կܾ       ('��K�򫬭鵸Ȭ󮰱򶸸궸깸ح򫪫河백训񫬬󰱳 򷹹ﰱ  µĶ𵶷Ʒ 쵶ɸ鵶͸ Ѹպػ Կܾ      '&��K�󣤤;::97867879   룤򣤥橪媬檫ꧨɯ۪&񳵵'&󶷶 񹸸 羿 溻 ¿ 󹸷𼽼 ﹼ ���K�;9752-* & # )%!      ('�)Y=:� � � � � � � �ٿ � �ٿ �ٽ �ۿ �پ �ݾ �ݾ �ؿ � � � � � � ���� � ��������������� � ������� � "� #�$�&�*�,�/� 2� 5�� � � � � � � �׿ � �ٿ �ݽ � �׾ �澿 �ھ � �ؿ� �� �� �� �� �� � ����� �� ���������������� � �������������!��"� �#� �%�*�,�/� 2� 5��磌 � �馨 �򭬭 �򦧧¿ �򩪬¿ �󩫫¿ � �𧨩 �ꤥ �򧨪 � �񼽼 � � � � �񥦨 � �󩫫� �󪬭� �� � � �� �� �������񿾿���� ���� ������𾿾� � �������������!��"��#��%�*�,�/� 2� 5�� M�� +�� �� �� ~�� v�� �� �� �� r�� �� �� �� �� � � � � � � �� �  �  � � � � � �� �� �� �ښ��q��a����1������] ����%��9�� �� (��i7�� �� |�� ���� �!�$��%� �'� ի�*�}c�,�ƍ5�0�]1 �1�E'�:������������������������������������������������������������������������������������������������@�������D��� �������"���������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/xcf/icons.xcf�����������������������������������������������������������������������������0000664�0000000�0000000�00000040411�11753427512�0014764�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������gimp xcf file����@���@����������������B��B�����������r��������������K��� gimp-comment�������Created with The GIMP����gimp-image-grid�������(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ������������� ��z����@����S��+K��2�����������@���@������ Pasted Layer���������������������� ���������� ���������� ���������� ���������� ����������������������������������������n����������{�������@���@������������@���@�������;BZ3�5�NlqvvpskD�1� G�/�r .�,�:s T �*�8e~ �)�@qx?�(�{n%p[�^�90���#��#����>hxtxG<,^WK�k@Q~�y�5UA���(� �g��|oU{Ꮛjjk^nrlonl]`iko8p*lUfC6QF�� ���9o7MZFnTbt� �8�� po;zPag� �>��oyNJlcceccf ��>��(mq^#qm9� �>K��[wy23aM� �@e,+4Nl yk:vxuoNNMNNB9BNNIMNN4� �pwz0H_kho3�#�1{{���$�couT�)�.mt3�*�-t�+�1 o�-�SP�0�GF�6�(1GGF$�*��<C[4�5�OmsxxrtlD�1� H�/�s .�,�;t U �*�9f �)�Asz@�(�|o&r\�_�90���#��$����?jzuyH=-`YL�m@R�z�6UB���)� �h��~qW|ᑍlkl_otnppm_ajmq9r*mVgD7RG�� ���9q8O[GoV cu� �8��!qp<|Qch� �?��p{OKmedfeeh ��?��(os_$rn:� �?L��\x{24bN� �Ag-,4Pn {l:wywqNNOB:CNNINNO5� �qy|0I`mjq4�#�2||���$�dpwU�)�/ou4�*�-v �+�2 q�-�UP�0�HG�6�)2HHG%�*��?G^8�5�Ttzy|sI�1� M�/�y 2�,�?{ Z �*�=l �)�EzD�(�v(ya�c�<2���$��%����Cq}MA0f_N�qCV��8YD���*� �n��x\ᚕqpqdtyruurcfoqv;w,rZlG8UJ�� ���=x<SaKvZ򔒔gz� �;��#xw@Vil� �C��w TPtiikjjm ��C��+uze& xs<� �CP��a67hR� �Dm0/8Uu s>~wSRRSF=FRRMRRS7� �x3Nfsqx8�#�5�� �$�jw~Z�)�1u}7�*�0} �+�5 x�-�!ZU�0�MK�6�+6MML(�*��_] E�4�Դ�0�)H�.�+�+� K�)� F�)��(������J��R&�� aȣ`Y}4DD9BH� �T<r_� ���1� �)��)��*��(��*��'��*��@'� �*󴎬� ��#�A"�#�2�(��*� =�+� w�-�k�/�!d�3�7kz(�(����@���@������ E#revoked����������������������� ���������� ��������� ���������� ���������� ����������������������������������������j���������� h�������@���@����� |�������@���@�� �����@��4�;�0��+� ���� �)���%����d��e��!� ��!�!����$������"$���"�� ��� ��� *-������ ��\��O �� ��( +$�� $�!�#�� l �����# 1��O  $ g ""  �� �� ��m4� + %[ � }� ��/�+ - ; �    *  ��J   " C O  <  �9��:&       ��/�� ���  �    ��� ���$u���/��8 (�% =�#�)��4�������5��!�8���j� ��>��9�;�5��.� ���� � /���0��&��e��f��)�#��'�'�� ��+���� ��$!'���)�� ������, #0������ ��^��N !����)-%�� (� &�%�� `�����& (��L  & r! %   �"� ��#��e 5�0 'Z   �d���.�71? �     +$��E&F O  E  �6��8'      ��.��$��� �    ��� ���%m���1��>%�( >�#�)��5�����$��8��#�8���k� ��S��E�9��B��4� �!�� � �0*#B���2��/#��l��m��.' )*�&��&�&��"��.����/��+-)*���'��! !������5*-7�� ���� ��^��V ����3"71��+� .�) �� F�����+��R"#* 0  ) #  �#� ��'��n&! B� 3 6\   �$U���7�M#$<Y  *� $   ,%��I' $/)J U    N"�7��@2#      ��7��'�))�'� �     ��&� �!��.��#�4��Y-�0A�#�/��L���#��3��>��%�8�!��v� �� �<�]�;K���� �!�3KI5��KA[�#�em��%��o��>��Xt>Lx��K��:��`��C%xe��x�y�?��Ck\2��cټQ��T,OōjOFw�Jy��7ż$��WVEΔ�hr@Gj W҇{/V�s“��Eaߎ�S~U Y>UC,ތ��aa7' [AуMЖqT /r�� w6+<ܹ\q0C6hp)^ /IY��O�G0�<*�,�"ڏ@}_jsSK�%�3����4��� �_ �:�� ����@���@������E#rev����������������������� ���������� ���������� ���������� ���������� ����������������������������������������Y�����������������@���@�����0�������@���@��@�����������A�:�4Nqd >7! �*=�,�LJ'Zou5cljg�,�_)c?]ؙwW3k<�-�2 cte-Ke0 3J6F�,�$=d&�o\8-s\A�,�/P)86:~v7�,�M54�� 4�t&�.�`pj Sj;ko{B� ����@���@������ E#sealsign���������������������� ���������� ���������� ���������� ���������� ���������������������������������������������������������@���@������������@���@�������������"$%3�8�gDpF1U;�6�]aWh#:'�5�I8rg] �5�ck%j_KU�5�a*|?7Z�7� 8GUW5 �8�� ����@���@������E#seal���������������������� ���������� ���������� ���������� ���������� ���������������������������������������������������������@���@������������@���@���������9�o=��*�2���tzmV�3�g��jf�3�5›ƚ�3�yɢ��h�0�g}9�1�}ťn�2�ZIӬ9�1���aĽ[_ �.� H@��K&&+_'��>�,�z}��P{��'�2��;��<�f_�;�QD@�:�N��E� �����.�&�:�/ǫRH@�4� G�3�<�2�E�2�A�1�>�2�o�0�"�3�-�Tq�� GNo} �/�4(���0�$��<�?R�:�\�;�9(� T����@���@������E#text���������������������� ���������� ���������� ���������� ���������� ����������������������������������������F����������d�������@���@�����x�������@���@������������V�8N���� �-�4^$/ZI/  IL�-�NFM^jRbrz`gt �+�6#'Q' ;BYZCUQ�+������,�)DWC�4{ �� J:�-�`MgYG%aU:-�-�Wg\rw~iQ�1� � 8�7 ";H&� ����@���@������ New Layer������������������������������ ���������� ���������� ���������� ���������� ����������������������������������������o�����������������@���@������������@���@��%����M�x��µ}~vn��Ӿ}zwu{��ȵ}zxuqnki_��Ĭzw��¾���x��µ}~vn��Ӿ}zwu{��ȵ}zxuqnki_��Ĭzw��¾�T�xt��µ}~vn��Ӿ}zwu{��ȵ}zxuqnki_��Ĭzw��¾{��M�į}zuqlgbWK7��ǹ{wrmjea]WTaKFBb]YTOIC5+!��¿{wsnie`\XSOKFB>95TNHB;9.)/��ÿ{wrnjea\XSOKFB=941,'$>820��{wr|uplgT>9YTOJD?80��{w~}zupfc^[SK���į}zuqlgbWK7��ǹ{wrmjea]WTaKFBb]YTOIC5+!��¿{wsnie`\XSOKFB>95TNHB;9.)/��ÿ{wrnjea\XSOKFB=941,'$>820��{wr|uplgT>9YTOJD?80��{w~}zupfc^[SK�T�į}zuqlgbWK71��ǹ{wrmjea]WTaKFBb]YTOIC5+!��¿{wsnie`\XSOKFB>95TNHB;9.)/��ÿ{wrnjea\XSOKFB=941,'$>820��{wr|uplgT>9YTOJD?80��{w~}zupfc^[SK8��M�¿}zvspmhda\WOD1��zwtomiea^[WTQMJFU?<8YUQNJC?2(!��տ~zwsolheb^ZWTPMJFB?<951.LHD?68.)/��ɴzwsplieb^[XTQMIGC?<851.+'$ ;620��źolifb^}zvsogd`\K52QNIE@<50��¾fbl{zwspmid[XURKE���¿}zvspmhda\WOD1��zwtomiea^[WTQMJFU?<8YUQNJC?2(!��տ~zwsolheb^ZWTPMJFB?<951.LHD?68.)/��ɴzwsplieb^[XTQMIGC?<851.+'$ ;620��źolifb^}zvsogd`\K52QNIE@<50��¾fbl{zwspmid[XURKE�T�տ¿}zvspmhda\WOD1,��zwtomiea^[WTQMJFU?<8YUQNJC?2(!��տ~zwsolheb^ZWTPMJFB?<951.LHD?68.)/��ɴzwsplieb^[XTQMIGC?<851.+'$ ;620��źolifb^}zvsogd`\K52QNIE@<50��չ¾fbl{zwspmid[XURKE4��M�.?QdwȺwdQ?.��4d(՛d4��N2N��N2N��4d(՛d4��.?QdwȺwdQ?.���.?QdwȺwdQ?.��4d(՛d4��N2N��N2N��4d(՛d4��.?QdwȺwdQ?.�T� '@WlǻlW@' ��>s(Ǡs>��2��2��>s(Ǡs>�� '@WlǻlW@' �����@���@������E#band���������������������� ���������� ���������� ���������� ���������� ��������������������������������������������������+�������@���@�����,�������@���@��,�����-D8&���1�*��%JI@*�2�9� ��BkZK �3�>B��Yc^A�2�1SQ#��"�/lcT�1�?T;��ReY;�1�DN:�� 9hX;�1�GI2��+*fW6�1�IJ+��_V7�0�PC��MV=�0�Q?��2GYE��/�BA��6>_R�.��;=��%2`U�,���.@;��_ZE���*�AR8��'M`U6�+�"@ZT<��#2^_U<8 �$�!E=DNb`TE��!MY[ZP?6(����$T]}td_J7����*HUXY[RE8� �)Uexr^Z?��%��%AS\XVYTB�'��;]cfZI+����;V[WUVYG���<V\YC#���� ��AXade`\G���CI]G��� ���"L`egd[Z,��FD?��� � ��-:CL[[YU�� ��� �j�(>-"*@_#�"� ��+�<� ��� �;��3���+ �3���, �2���.# �3���"%�3���)�3��&�3���2�� �1���1�=��/�����1� ���-� ����+�� ���� �=2��� �$�?4����  ��� �!� ��#���#((�!���� '-)� ���� �5����� �� �;��3���+ �3���, �2���.# �3���"%�3���)�3��&�3���2�� �1���1�=��/�����1� ���-� ����+�� ���� �=2��� �$�?4����  ��� �!� ��#���#((�!���� '-)� ���� �5����� � �'EA;#�8�bm�3�I��*�2�| ��6�1�Y_��g�1� ��8�0�R���0�#<���0�".��l�0�"#��>�0�"ũ���0�+щ�� �/�>|�� Z�/�sy��}�-�Kw��.�)�Mx��E!�$�*Nwo��;ĀD�!�N��M9�!�J"� �BQ�!�Q� �8=� �)]� �6��G��\��-��^�� ]"��%.X����/ˀ�<� �����@���@������E#Paper���������������������� ���������� ���������� ���������� ���������� ��������������������������������������������������3y�������@���@�����3�������@���@��3����4�5�:�v ���'�gM��`k�!�Vg>��N}����6o����%ໟ{$��b~�� ��nռN� �I^�� � �*��sûm����ƺb��j��ý񝠬����Oȵn��ȷt�P� �.fIJ󯴹� �Lħ򭳾M� �+}h׻䢣� �佮kջ� �ir𬭭l� �߯¿S� �8�ޒ� �;��.�PK4argjtԦ�"�@YدT��q�&�Lm|ŵǶC��'� �4�3�:�p ���'�dK��\f�!�RVg=��Jx����-}o����$ճt"��`~�� ��i̶N� �D^�� � �(��nžûm����ǻb��f��¼񝠬����Kȴn�� Ƶ栟t�N� �-b󯴹� �H򭳾M� �(wcзغ䢣� �ٴgտҹ� �融dmʿ𬭭k� �ߧ¿K� �6�ସݑ� �8��(�Gz}C.[lbhrԦ�"�@YٮR��q�&�JhyǶC��&� �4�&�:�Rm���'�L8o ��EL�!�;ANˬ-��8jjaY����!\hVpž����qqdW�� E^Ŀ³`����N}tzhE� �2fitqƩG��� ���R|œR����`J��K��됏ɻq����8ˣR��m햜ɌW�:� �"J{i� �6~;� �Y|J񡠤ȉc� �a|fM򡢣Ȏi� �euiJRĂP� �}c8� �(�nĿm� �*���5[]f1"BOIMVi{}�"� -Ag=��V�&�4KXlsvswuy3��� �p� �7�$r=����W��d7�� <6��NnC* ��%7X��pN0#  +HReu~��b��"H��3%��r  ��%N3� �i� �!� �32� �_0� �\ +� � � �E C� � IkUhyd��;';fz _�%�):ZotK�-� M��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/xcf/key.xcf�������������������������������������������������������������������������������0000664�0000000�0000000�00000172514�11753427512�0014453�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������gimp xcf file����������������������B��B�������������������������S��� gimp-comment�������Created with The GIMP����gimp-image-grid������(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 32.000000) (yspacing 32.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) �������������������³��$������������������� Schatten����������������������� ���������� ���������� ���������� ���������� ���������������������������������������� ����������s���������������������������������4��a��q����������X�� ��7��X��c��c��c��f]��������#��3��C��S��c��s������������=����=����=���� �� ���*�#m}gys@CWz[!�#� oƙl:� �Aݼ:��zl<� �� vٵ]/",��-RݲTQ:��PĿлU3��1;ȪpL ��pasяv4 ��CLzЩ7��$^{¹ƚr8��eƺuF6��_¿qiD��\]Z�� "ǻ{B�� 'vϼq(��bûqP��lnlX@ ��b軄n:�� �� ���*�#m}gys@CWz[!�#� oƙl:� �Aݼ:��zl<� �� vٵ]/",��-RݲTQ:��PĿлU3��1;ȪpL ��pasяv4 ��CLzЩ7��$^{¹ƚr8��eƺuF6��_¿qiD��\]Z�� "ǻ{B�� 'vϼq(��bûqP��lnlX@ ��b軄n:�� �� ���*�#m}gys@CWz[!�#� oƙl:� �Aݼ:��zl<� �� vٵ]/",��-RݲTQ:��PĿлU3��1;ȪpL ��pasяv4 ��CLzЩ7��$^{¹ƚr8��eƺuF6��_¿qiD��\]Z�� "ǻ{B�� 'vϼq(��bûqP��lnlX@ ��b軄n:�� Z������(�!& �#�$$)(+9IKA<9:;4&!95�!� %,7?8EVfgaUNIJKH=17LK$��  %5DFO_mwxulaZY]^bd`d];�� "!#.:IR`o|upkdd`[\ipdG-��#! %,,5HT[iw~{tnpxxfP?+�� '14?M[epy~obK>,�� +:IWemwhJ=?4" ��%8Ocqw}jF/# ��$9Qhw}xvt}znZE2 �� &;Uky}tsnjq|p`K<. �� *=Vjuyywqqkfwmj`V@2)% ��,AVcotw~{xzul`f|f\LI8/#  ��-CS`ls{~riqusddpvqbNC>0+&"  ��.@N\ht}n_[egkwplhXF;4,'&$# �� -<FRbwzp\X\\agql]PE;1*()()  �� (6?N_tl]YZY^chg^SC93/-/01)0& �� /6C^zg\[_dihbVF>8407:<65/6*+������������������������������������������>��<��;��;��:� Q�:� �:� w�9�*|p�9� 28lp�8� "-7�8�'$�8�<�9� �;��<��=�� �>��<��;��;��:� Q�:� �:� w�9�*|p�9� 28lp�8� "-7�8�'$�8�<�9� �;��<��=�� �>��<��;��;��:� Q�:� �:� w�9�*|p�9� 28lp�8� "-7�8�'$�8�<�9� �;��<��=�� �?��<��<��<��=��=�� �*ߡdF%��bثkN6��ⰁY;��ֺn;,��vI��tC��㘷κd$��𚣾ԻǦ ��Л̲Ƨ��xҙ厉k��\pļ[jFQ� �?ˏ^G+$� �fz�uvqz ��z���"PXs2'\WRFMJi\��W��5E_��;; 9hiZ+f��!� ���@JMt����9靈ଜ�)�$Qy�+� F!vob�,��g[icGM]~�-���0>E> �$=N??�2���� �*ߡdF%��bثkN6��ⰁY;��ֺn;,��vI��tC��㘷κd$��𚣾ԻǦ ��Л̲Ƨ��xҙ厉k��\pļ[jFQ� �?ˏ^G+$� �fz�uvqz ��z���"PXs2'\WRFMJi\��W��5E_��;; 9hiZ+f��!� ���@JMt����9靈ଜ�)�$Qy�+� F!vob�,��g[icGM]~�-���0>E> �$=N??�2���� �*ߡdF%��bثkN6��ⰁY;��ֺn;,��vI��tC��㘷κd$��𚣾ԻǦ ��Л̲Ƨ��xҙ厉k��\pļ[jFQ� �?ˏ^G+$� �fz�uvqz ��z���"PXs2'\WRFMJi\��W��5E_��;; 9hiZ+f��!� ���@JMt����9靈ଜ�)�$Qy�+� F!vob�,��g[icGM]~�-���0>E> �$=N??�2���� ��#-E]xumi^cgf`WLE?;6<@DB@7&1I4%��%:Ros^jk`_\WLKID9<HLLFG>=@88+"�� 4J\oxynXcneWVSNJF@96EQRJGDLRK:13* �� ->P_bcuaJJMPIE;315,1AIBFFMQUOD=3+ �� (6GI|v\q_\gnD?EDC2%- &.3748DHPKHE>5%! �� ,9Je|R<WqYPD3:=@8#((18<BCACADB/$ ��$<]uzN=GEU^=001>A0%+/56799?D7,  �� <krQ9EE=326169<*"',02149<<0+ �� 8olWFD7'#49)!%)-125:<62) �� *[IOp];(&  "$*05;:957*,#��K/4`fB*   %*2:9:7675,<4���3#"C1$</! ++.3778:=>;KO��3  �,=44564=ELPZ<���������%2A53/2>KSXKO#�,� &-:50-/?MTQ50A�+� -7*+7.3@P=8N,!1�*�#A4)4;J5 .G!�+�2*0K8  &2�-�-.  �,�� �1���� �����3�$&/($##�/�BL`>jf]QWk\P'��Y�"�9KT_js|~q ��[�� B>i`x�&� fntrvûN�%�O̳ƻԕd�%� )Ľ5�&�sƿC����>rͿ[�>��uŮ�`��^Ҿ0%��,f{ϻmF-/2 ��IZyͫ}fp^ �� )Yk~۾TC��(RhؽR�� +Mvص\��.^۵BF��@t̡a#H�� 2Xg˷Q&7��$?`_r¥V#$��67d{ͼoX0 �� <Uqosʸ|l��(RgcpƵmC�� Sd[unøv!6��$U`Zżf);��;OSܡĽa#+�� "VrkFswī7*��@ZZ�Ȱx&����Q&�fίt&�"�s �� {͡f2�$�/>��Vwy͓K)�)�IbuݸK&�)�DDjضoC�)�Upץv3$�(�AuЌbE�(�$|ܻ\W�*�Nڼ}(�+�%zŨ �*�F޸>�*�xjf�*� A}skr̿L�)�dtaXiŮ�)�0SG6E`ϻ�)� &"@{{�)� *_yrvhrt~{M�(�ATi`eMOeX`]Zij9�(��*DLJF(cSDH;7I]L�,�!4!3(OTJ.5408B?�,�" 5E93,B:<������3�$&/($##�/�BL`>jf]QWk\P'��Y�"�9KT_js|~q ��[�� B>i`x�&� fntrvûN�%�O̳ƻԕd�%� )Ľ5�&�sƿC����>rͿ[�>��uŮ�`��^Ҿ0%��,f{ϻmF-/2 ��IZyͫ}fp^ �� )Yk~۾TC��(RhؽR�� +Mvص\��.^۵BF��@t̡a#H�� 2Xg˷Q&7��$?`_r¥V#$��67d{ͼoX0 �� <Uqosʸ|l��(RgcpƵmC�� Sd[unøv!6��$U`Zżf);��;OSܡĽa#+�� "VrkFswī7*��@ZZ�Ȱx&����Q&�fίt&�"�s �� {͡f2�$�/>��Vwy͓K)�)�IbuݸK&�)�DDjضoC�)�Upץv3$�(�AuЌbE�(�$|ܻ\W�*�Nڼ}(�+�%zŨ �*�F޸>�*�xjf�*� A}skr̿L�)�dtaXiŮ�)�0SG6E`ϻ�)� &"@{{�)� *_yrvhrt~{M�(�ATi`eMOeX`]Zij9�(��*DLJF(cSDH;7I]L�,�!4!3(OTJ.5408B?�,�" 5E93,B:<������3�$&/($##�/�BL`>jf]QWk\P'��Y�"�9KT_js|~q ��[�� B>i`x�&� fntrvûN�%�O̳ƻԕd�%� )Ľ5�&�sƿC����>rͿ[�>��uŮ�`��^Ҿ0%��,f{ϻmF-/2 ��IZyͫ}fp^ �� )Yk~۾TC��(RhؽR�� +Mvص\��.^۵BF��@t̡a#H�� 2Xg˷Q&7��$?`_r¥V#$��67d{ͼoX0 �� <Uqosʸ|l��(RgcpƵmC�� Sd[unøv!6��$U`Zżf);��;OSܡĽa#+�� "VrkFswī7*��@ZZ�Ȱx&����Q&�fίt&�"�s �� {͡f2�$�/>��Vwy͓K)�)�IbuݸK&�)�DDjضoC�)�Upץv3$�(�AuЌbE�(�$|ܻ\W�*�Nڼ}(�+�%zŨ �*�F޸>�*�xjf�*� A}skr̿L�)�dtaXiŮ�)�0SG6E`ϻ�)� &"@{{�)� *_yrvhrt~{M�(�ATi`eMOeX`]Zij9�(��*DLJF(cSDH;7I]L�,�!4!3(OTJ.5408B?�,�" 5E93,B:<��*������)����$��   �-�  �)�  "$$!!!�)�  &%'(%!!�(� #+*+--*#�(�  !%..01231-  ���� %*12258641.' ���� #*45779:9620,  �$� !*3887;<<;970)&  �"� #-587:<>><;74.+- �� &-359<??>;660) �� &-36:@BAA>97996&  ��#)28>ACECA>99:<3." ��".5=@DHEC?=;9=:50.%"(.+�� %/8<AFGEC?=;<;;8530,.0"���� %38=EIJGC?;;:<=>753/( ���� '26:MTKCA==:;::>@>=6."��� &'T_WIB=;:78:;:BE>3+ � � AcdOG?:8678<;>ED<2( �!�  'Mn^OC><96779<AD?91'���9d_[EEB?:6856A??;80&��HT]B&9DE;3358=<::5.& �":M< ;R?,,28558:4+&&�� �.6G2$",0/28:3**,%�#�&�� $$'4981-10*�$��� '49502560�%��� $37335;>/�&��� (1853:CB+�.� "4458BJC�-� $'+58@JM:�.�-*-3<FQN4�/�&)./4:OVO-�/� ",035@KYG! �.�$)03AHMS># �/� !%)<JRNQA!�.� 3JNNOQL*�.� %AQJFKJN9�-� 3HGB7<MB6�-��875-(&7E( �-��� #&1%�/�� �0�    �/� �/��2���8���������4�&m8�� )\;�3�}r+0~�2�LZ~�/� s滺�.� �,�s�(�"XhKu�"�s}pSI9gw�!�䭚�!�{�#�|�#��"�>~�"�>r�"�t�"��!�z髩Io�"�,T?a_�m�Od��H`�/�ZBR"�,�l$DG�*�fgzfcC(�&�dɹ}jA. �!�K~ľl^[G! ��>jǹj?.)����'iľ~kD0G`(8BD!][sWRRZ^]PH( (tпǽP|Sw Zu QN�:��������Νz\H) 1Vh��+-����+�>YO?�"������RbCku~S_*)&�� `rX-"$C0 M<ĄlnlhT,���&*[Jly}y~s#X׿yZR ld9F55XL Q}α̻ƻ½�-h��%`�(hý�<ɻ�P 1ʬǥ棛 (_|>W?���p{��� -�� 5�������4�&m8�� )\;�3�}r+0~�2�LZ~�/� s滺�.� �,�s�(�"XhKu�"�s}pSI9gw�!�䭚�!�{�#�|�#��"�>~�"�>r�"�t�"��!�z髩Io�"�,T?a_�m�Od��H`�/�ZBR"�,�l$DG�*�fgzfcC(�&�dɹ}jA. �!�K~ľl^[G! ��>jǹj?.)����'iľ~kD0G`(8BD!][sWRRZ^]PH( (tпǽP|Sw Zu QN�:��������Νz\H) 1Vh��+-����+�>YO?�"������RbCku~S_*)&�� `rX-"$C0 M<ĄlnlhT,���&*[Jly}y~s#X׿yZR ld9F55XL Q}α̻ƻ½�-h��%`�(hý�<ɻ�P 1ʬǥ棛 (_|>W?���p{��� -�� 5�������4�&m8�� )\;�3�}r+0~�2�LZ~�/� s滺�.� �,�s�(�"XhKu�"�s}pSI9gw�!�䭚�!�{�#�|�#��"�>~�"�>r�"�t�"��!�z髩Io�"�,T?a_�m�Od��H`�/�ZBR"�,�l$DG�*�fgzfcC(�&�dɹ}jA. �!�K~ľl^[G! ��>jǹj?.)����'iľ~kD0G`(8BD!][sWRRZ^]PH( (tпǽP|Sw Zu QN�:��������Νz\H) 1Vh��+-����+�>YO?�"������RbCku~S_*)&�� `rX-"$C0 M<ĄlnlhT,���&*[Jly}y~s#X׿yZR ld9F55XL Q}α̻ƻ½�-h��%`�(hý�<ɻ�P 1ʬǥ棛 (_|>W?���p{��� -�� 5�����5����5� � �4�"!  �0� 0=A4""*>@/�/�0O__XMU\MI5�-� ,%&Gdet||wphu&�)��,#6RQfvL�"���  /GL_s| �!�12%(;GRZirG%2�!�;c^J=48EMZgmpzbV �#�ZtlmqqrxY �#�j}tnlsȳh�#�,h|zqe]am}Żj5�"�-c{sjdkvla(�"�  Y|umpwjJ[%�"�GrxcI[ki`_YLUTYldNL11DX8%3�!�)\_A! B[`U+ 5=3�"�$4#%A1����o����1�+%�1�!18,*1! ��,�!(=@9<A</�+� &18BEIOJ?/�(� /8CKRXYUO?2/$ �&�&1<HU_aba^XNE8( #� )8BNXcinppkbWMC:2,$ ������ 0GS[dnuz{vqnhc\SKB930-+%   #8Pdnuz|vrlgd_]WMC=734.-2;CGECHHJLKKHEA=8632/,)(' 1DZlx~藕xpgb_aeegmxxz{zxuoie`YSOIEA=< ?Whu䙖|z{{xsmhc^YTQN8N^gr}zvrolhca^[XV��5LI5Lt~wsrpkhc`_][XW��#E96lffv~|}Ǵ~ox{wurmid`][ZX��$%$YH]nvyU<9Vk~έpxlb[Z[YVRPONM��%�%%55��5]NPf_Ge϶|iyuzxhU?35;>@@:79;��%)?PZKw~Wyw|]]XnjSRHM[X>(��%%BM1BM1@f]@Z]5 04 � �%%��%%���6�  ��� �� �-#  !�������']J533/68*" ����   � BofRHKKDC=6-"  !!""�� "K{kaWYWSTNF?AFED>2,-7<72)',(&$$" "$" !%,.-)')+*)(&&(''�� Huxsicedge`^dlib\YYZRRQK>5:DDA;940*'%(--/533650.++-/.-.,.�� 'Gsyqrvwz|zy|{zyzwpkmnga_XQIED=6-'" ")372+)-540))+,./++-��)e|xuuxyyvtvzwtsocTIMNI</&" !&/3/)'-55+&$(.00..0�Twg}zyxx{zvvy~ywyytk\[^XG?3("!%.-07328658/()2./023� =oquK7Du}xv}||~~|{{|tipsY/")0# -$'@C,(3+2%(-0� 9U]@/Rqwfhxfbegyygeyyxw`tu= ,%.AB (E$ )4�)&/"PKC]L.;]f_^lmYczR:bsLW/%���#��#���%3%%YW'?JWaC3_U34:J �,�%�5B  3�4��� ��ʷ£}qY)�0�Ȣm �/�ӶR�/�țmO:�.�ɞTK@0�.�Α/�/�|�4�縄oliZJ'�*�˪fzhV �(�ɮY]`K�'�ܳڹ( �4��1��1�KA FC>9!B# �.�~}zv3 �  <<E��ڿɃ��ļݒ��k��̠��˘]��ٯjk5��ݖOW��ݶQ(��ŵi��X9Ocf.>������ ��ʷ£}qY)�0�Ȣm �/�ӶR�/�țmO:�.�ɞTK@0�.�Α/�/�|�4�縄oliZJ'�*�˪fzhV �(�ɮY]`K�'�ܳڹ( �4��1��1�KA FC>9!B# �.�~}zv3 �  <<E��ڿɃ��ļݒ��k��̠��˘]��ٯjk5��ݖOW��ݶQ(��ŵi��X9Ocf.>������ ��ʷ£}qY)�0�Ȣm �/�ӶR�/�țmO:�.�ɞTK@0�.�Α/�/�|�4�縄oliZJ'�*�˪fzhV �(�ɮY]`K�'�ܳڹ( �4��1��1�KA FC>9!B# �.�~}zv3 �  <<E��ڿɃ��ļݒ��k��̠��˘]��ٯjk5��ݖOW��ݶQ(��ŵi��X9Ocf.>������ �� 3�#!  �1�:960-($ �/�KHGEB<2*(�/�SRROH>8*�0�VUUWWN=% �3�WUSY^V?$�4�MKQRNI0 �1�:9?@;899<&�/�&$#�.� �� ����4�  ��   ��)**,-,,*'$! "$#"��02469::840-*'$#"##"##&,/1010--*# ��/136677530-)&&$$#"##'*.//-143* ��24699761.*'%$$%$##&',.0029:% ��8:<>ACDC@=94/++**()*-/257:<3/;��/,*-7<930473.+,& $*'&,'1F3 $<��%$7@1(9:1  21 /7/3��"1 ��%$��������������������������9� 2�9� -W�9� 6Kx�9�U�9�wy�9�#mr�9�h�9�"w�:� c�9� G�9�N�:�]�:�U�:�V�:� 0r�:�:j�:�#G�=��<��<�-�<�9� ����9� 2�9� -W�9� 6Kx�9�U�9�wy�9�#mr�9�h�9�"w�:� c�9� G�9�N�:�]�:�U�:�V�:� 0r�:�:j�:�#G�=��<��<�-�<�9� ����9� 2�9� -W�9� 6Kx�9�U�9�wy�9�#mr�9�h�9�"w�:� c�9� G�9�N�:�]�:�U�:�V�:� 0r�:�:j�:�#G�=��<��<�-�<�9� ���<��;��;��=��;��;��;� �<��<� �<� �;� �;� �<��<��=�� ����:�%�:�8>6�:�bG:.�����|TGJ(�����慎vpn&������ ��ݨ^Z3IF  /RN;9  "*7<��Ϯǔq]R8lwvDEb=9j\bpn ��׹ø<$()��֙ƿĹxuF/,2 ��ӾҼo_n]*��ѿy{i@" ��տtS,x~_��îɷq ��ıq��ч:��e::��^:IR&��vq}+��Ta@��IcoG��K^4 �� �LjL�L0� � M~dbwK��Swa7� � B]tʾq]=� � =uʷM!� �Ryλt � �(@kԹqbJ� �=`ִ) ��?hĤS&�� ,HuϹ{��>^ǿft��A[I"CJmù����#/]l+3��q��z��Y��+99S|�%]l�� Db� ;^a��5p��Z^5>p�/i�_*H����r𭻨ɾ�$�ehWtMmyxtaP�+�4"T>>,)Yrdcq`+�-��7# �6�������:�%�:�8>6�:�bG:.�����|TGJ(�����慎vpn&������ ��ݨ^Z3IF  /RN;9  "*7<��Ϯǔq]R8lwvDEb=9j\bpn ��׹ø<$()��֙ƿĹxuF/,2 ��ӾҼo_n]*��ѿy{i@" ��տtS,x~_��îɷq ��ıq��ч:��e::��^:IR&��vq}+��Ta@��IcoG��K^4 �� �LjL�L0� � M~dbwK��Swa7� � B]tʾq]=� � =uʷM!� �Ryλt � �(@kԹqbJ� �=`ִ) ��?hĤS&�� ,HuϹ{��>^ǿft��A[I"CJmù����#/]l+3��q��z��Y��+99S|�%]l�� Db� ;^a��5p��Z^5>p�/i�_*H����r𭻨ɾ�$�ehWtMmyxtaP�+�4"T>>,)Yrdcq`+�-��7# �6�������:�%�:�8>6�:�bG:.�����|TGJ(�����慎vpn&������ ��ݨ^Z3IF  /RN;9  "*7<��Ϯǔq]R8lwvDEb=9j\bpn ��׹ø<$()��֙ƿĹxuF/,2 ��ӾҼo_n]*��ѿy{i@" ��տtS,x~_��îɷq ��ıq��ч:��e::��^:IR&��vq}+��Ta@��IcoG��K^4 �� �LjL�L0� � M~dbwK��Swa7� � B]tʾq]=� � =uʷM!� �Ryλt � �(@kԹqbJ� �=`ִ) ��?hĤS&�� ,HuϹ{��>^ǿft��A[I"CJmù����#/]l+3��q��z��Y��+99S|�%]l�� Db� ;^a��5p��Z^5>p�/i�_*H����r𭻨ɾ�$�ehWtMmyxtaP�+�4"T>>,)Yrdcq`+�-��7# �6������=��<��;� �:� �� �����# �������0&&   �(7.-0'    �� -6?<6/+*( (..'&$&&(" "# ��;HHA?=60*%""/8>DBACBBAE@:1*! ��&$+IMLKDA7/,-/6=HOUY[Z_^ZUI<4/(" ����.8,7MPKG@;5//13>GV`chpqmh`VNF==4&��.6:3BMHC=84059=ASZcjtwutolgb^VK>1+  ��&0<B8GFC=::;>EHPZ`ekrvxvutqojcQ@4)&�� ,:>C;HLKHKHNNZbfiorvxwwtsoh]N=/#!!' ��//6@G@OY]V[Xakpqtrrqmmoqplg^VG8((.0��""/<IQDZahciorqqokhdcfhigb[TK?3*%'/9E&�� )<JTZJainqqmjgbaa`aa^[VQJC:755=B;29 ��  5HY_`Pgonlgecbca_]\YVTQMICGDFIJ:' $1#��%DRceeWlqnigjkfb]YUTTRPPUVXSRF6.;97482 �� !5LUbhi\qzsqnid_YVUVVWY]bba`[NPOMQQLU[>��,5@P_ed`ovomhd``^]\\`gjhec_[`fa]]bbW,�� 2>GNRZcgonlhgffdcafjnpmkgbdhgcaa^\C0 �� %+09>EP]djkmnnjiimqssplkbY\b\YWVJ@/��  &.5?LZcjptsrstwxutrmge^UPQPNKHA4'" �� "/:@KYcovz~{xrkif\]TMCGDC=5.+&!�� !+6=CO\ju}yrh_ZVTTKE>>:43.,(�� %0=MV_gq{zqe[UTPKIC@<83.-(# �� #-7DOU[jwpf[SQMHDA>><5/)&$! �� ",7@FO^kzsg^UNMJE@<:@<0-(% ��� �  '4FN\kx{uj`UOONIE=;<I=30)$ ��� � ';JXZyzqqj^TPSSYLKE>BSH@5-%   �� (:2jlnhc^g`VUSY`eZVPFQfXM@31,"!��LJR8:MTV^\WZ]clpedkspi[[REA620-+& ##"'*3�� 1(BHNY[^_`gnzx}wlcTJJGA:635:<BRD��'.6BTgadmlpx~ulc]URSNQVcnmn�� &AXglkpyztrtpnkt�� -@]foyvy��+LS\jsy~��@A<BS`px��31 :Wiv~��:Unyx}�� Pirk[Rbhwsuhis}}z��"IN/2=233CJ=JIFXQIFVT^_^XVURP��.+� '"(*,-&(&0-,$ ����   �)���5����*� # !1&�4�  �6����=�_RW��1�2�ζ{N��/�-�ŚT(}�-�Խ{?�-�V�.�Y�/�q�0�ݶ/�/�٨?(�-�ԠI�,�ְ�,�Ͷ�,�ɶk �,�纷̏+ �,�ܺxc9�.�򦤰{`V0#/�K_ZofbTG6 �0�   �2��6���*� # !1&�4�  �6����=�_RW��1�2�ζ{N��/�-�ŚT(}�-�Խ{?�-�V�.�Y�/�q�0�ݶ/�/�٨?(�-�ԠI�,�ְ�,�Ͷ�,�ɶk �,�纷̏+ �,�ܺxc9�.�򦤰{`V0#/�K_ZofbTG6 �0�   �2��6���*� # !1&�4�  �6����=�_RW��1�2�ζ{N��/�-�ŚT(}�-�Խ{?�-�V�.�Y�/�q�0�ݶ/�/�٨?(�-�ԠI�,�ְ�,�Ͷ�,�ɶk �,�纷̏+ �,�ܺxc9�.�򦤰{`V0#/�K_ZofbTG6 �0�   �2��6�������-�):+�#�-�,*.6APP/"L=%�.�DKOOWc@6 Rk]G �.�elb[XdZkiw~q^,�/�ttlqov~sC�0�}}T �/�񓈆}~rb-�.�~q_`R= �-�}tk\J::B9(�-�vffmcJ01/##) �.�n`VFEB1 �/�D?:1 �0�3�6���z�����������������������������������������������������������������������������������������������d�������d���2�������2������������������Text����������������������������� ���������� ���������� ���������� ���������� �����������������������������������������������������������������������������������8��N��d��z��������P��I��g��w��������q���������� ������������������ �3� �3� �3���?�?�?���?�?�?���?�?�?���?�?�?���?�?�?�������� ��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��1� ��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��1� ��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��1���������{�;�:�:�:�:�:�:�<�>�:�:�;�<�<�;�<�;�<�<�:�=�:�:�:�<�:�:�:�<�:�:�:�:�;�:�:�:���9���9�:�:�<�;�:�:�:�:�:�:�=�:�:�:���9����������:�:�:�<�<�:�<�<�<�<�:��� ��!��.�-�-�-�-���-����,��5��5��5����"����!��!��!��#��-� �-���:�%���$���!���!�� �#�� �"���"���!��� ��� �� � �� � ��� �!���!��$��"�� #� � $� �%���� �� �!�� �!�� �#���#���!�� ��!� � !� �$� �&��������������������������������� ��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��1� ��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��1� ��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��1���������:�:�:�<�;�:�:�<�<�<�;�<�;�:�:�:���9���9�:�:�=�:�:�:���9���9�:�:�=��������� �'���)�� %����� ���!���"�� �#�� �"�� �!��� �<�;�:�:�<�:��:�:�<�:��=��=�=�:�:�:�<�<���������������������������������� ��=��=��=��=��=��=��=��1� ��=��=��=��=��=��=��=��1� ��=��=��=��=��=��=��=��1���������������������������������������������������������d�������d���2�������2������������������Text 1����������������������� ���������� ���������� ���������� ���������� ���������������������������������������������������������������������������������^��t����a��w��������M���� ����*��:��J������z����������6��F��V��f��v������?�?�?���?�?�?� 5�<�9�7�7�7��7�9��9��9���6� 5� 4��4��4��4��?�?�?� �(��&��%��%� �'� �)� �+� ������� � �5� ,�?�?�?���?�?�?���?�?�?�����������=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=����=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=����=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=���������4�:�:�:�;�<�=�>��>�>�>�>�>�6�9�7�6� 5� 4���3�:�:�:�:�:�:�;�<�=�<�:�;�=�?��<�5����4�=�<�;�;�<�=�>�������� � 8�:�<�<�<�=�=�<�;�9�9������ ��!��#�%�&�*�,�)��>��>�>�>�>�=�<�;�.�� �/���/�� +�� )�� (��'��&���%���$���$��$��"��"� �"� � "� ��%��%��%�� ��&��)��(���'���'���%����$����#�����$� ��%� ��3� *��� )�� )�� (�� ����������������������������������=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=���������:�>�=�=�9�7�5��5��5��5���6�9�;�;�;�<�=�=�>�>�>�>��������� �(� � �� � � � �!�#�'�+�� .�:�:�:�:�:�2� 2� 2� 1�.�-�� 2��1��0��/� �.� �.� �.� �.� �.�� �<�;�;�:�:�;�<�=�>��a����������������������������������=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=���������������������������������������������������������d�������d���2�������2������������������Rand���������������������� ���������� ���������� ���������� ���������� ��������������������������������������������������[��������������{����›��§�������������#����+��A��W��m����������q������+����E��%��j��������/��?��O��_��o������?�?�?���<�<�<�=����?�?�?� %� ��!�4�7�8�9�8�9�9�9�9�:�;�;�;�;�;�;�;�;�;�;�<�>�?�?�?� ��>�>�>�:�>�<�>�?�=���>�?��>�?��=�?�=�>�>�>�>�>��=�>�>�>�>�>� �?�?�?���?�?�?���?�?�?�����������=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=����=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=����=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=�;�=��<�<�<�=�<�<�=�<�<�=�<�<�<�<�=�<�=�=�=��=��<�=��=��=��=����2���3���3���3���2��3���3���4���4���5���4��4���5���5���5���5���5���5���5���5���5���5���5���4���4���3���3���2���2���1���1�� �1�� ��0��=��=��=��=�� ���������)��%� �$��"�� �����=�=�=�=�>�=�=�=�=�=�=�=�=�=��=��=��=�=�=�=�=�<�<�;�<�;�����������!��#��&� �)�%�������4�>��=�>��=�>��=�>��=�>��=��=�>��=��=��=�<�>�� �������� �2����1� �0� ��"�� � � �� � ����� ���������������������� �����(� �)�� ���<�.�9�<�<�=��=��=��=��=��=�>�>�>�9�+�9�=��<��=��=��=��=��=�?��=�?�8���������������������������������������������� ����������������� ������ ������� ������ ����� ������� ��� �� �-���?@�?�?@�?�?���?��������;����!��������������������%��������$��������,����"�3���3������2������3�����2��� �1>��=�>��=�>�>�>�>�>�>�=��;>�<�<�<�<��7<�<�<�<�<�<�<�<�<�<��,<�<����������=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�1��=��=��=��=�>��>��=��=�>��=��=��=�>��=�>��>��=��=��=�>��=�>��=�>��=�>�?�>������������=�>�>�>�>�>�>�>�>�>�>�>�=�=�=�=�<�<�;�;�<�>�=�=�>�<�:�<�;� �������>�<�<�<�=�=�=��=��<�=��=��<�=�=��<�=��<�<�<�=�<�=�<�=�<�=�<�<�<�<�;�;�:�:�9�:�9�:�:�:�;�:�:�9�7�7�8�:�7�1� ���������$�<��;�<��&� ��0��6��9� *���������� 3���&���������'�<�<��&���������=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=���������������������������������������������������������d�������d���2�������2������������������ Schlüssel���������������������� ���������� ���������� ���������� ���������� ��������������������������������������������������Z��������������z����� ���������������s���������� ����y��Թ��֮��ہ����������}��)����6���������������������<�;�;�:��<�;�;�:��<�;�;�:���<�<�<�;� e� ���#�&�)�+�- �/ �0 �2 �3�4�5�6�7�8�9�:�;�<�~ e� ���#�&�)�+�- �/ �0 �2 �3�4�5�6�7�8�9�:�;�<�~ e� ���#�&�)�+�- �/ �0 �2 �3�4�5�6�7�8�9�:�;�<�~ e� ��#�&�)�,�-�0 �1 �2 �4 �5�6�7�8�9�:�;�<�=� @�=�9�5 �2 �-�*�(�&�$�#�!� �� �"�#�%�'�(�*�+�,�-�/� 0� 1�  @�=�9�5 �2 �-�*�(�&�$�#�!� �� �"�#�%�'�(�*�+�,�-�/� 0� 1�  @�=�9�5 �2 �-�*�(�&�$�#�!� �� �"�#�%�'�(�*�+�,�-�/� 0� 1�  @��=�9� 5� 2�-�*�(�&�$�#�!� � �!�#�$�&�'�)�*�,�-�.�/�1 �2 �3 ���������������������;�:�:�9�9�8�8�8�7�7�6�6�6�5�5�4�4�4�4�3� 3� 3� 3� 2� 2� 2� 2� 2��2��3��3��3��4��5��6��6��7��6��6��6��6��6��6��6��6���4���4��5��6��6��6��6��6��6��5���3��3��2��1��0� �0� �/� 0� 0� ;�:�:�9�9�8�8�8�7�7�6�6�6�5�5�4�4�4�4�3� 3� 3� 3� 2� 2� 2� 2� 2��2��3��3��3��4��5��6��6��7��6��6��6��6��6��6��6��6���4���4��5��6��6��6��6��6��6��5���3��3��2��1��0� �0� �/� 0� 0� ;�:�:�9�9�8�8�8�7�7�6�6�6�5�5�4�4�4�4�3� 3� 3� 3� 2� 2� 2� 2� 2��2��3��3��3��4��5��6��6��7��6��6��6��6��6��6��6��6���4���4��5��6��6��6��6��6��6��5���3��3��2��1��0� �0� �/� 0� 0� ;�:�:�9�9�8�8�8�7�7�6�6�6�5� 5� 4� 4� 4� 4� 3� 3� 3� 3� 2� 2� 2� 2� 2� 2� 4� 4� 4� 5�6�6�6�8�7�7�7�7�7�7�7�7���4���4� 5�6�6�6�6�6�6�6���3� 3� 2� 1�0�0�0�0�0�Ð�-��(��$��#�!� ������ � � � � � � � �� �� �� �� �� �� � � �������� � �!��#��&��)��'Ò�-��(��$��#�!� ������ � � � � � � � �� �� �� �� �� �� � � �������� � �!��#��&��)��'Û�-��(��$��#�!� ������ � � � � � � � �� �� �� �� �� �� � � �������� � �!��#��&��)��'�.�*�%�#�"�!�!� � �� � � � � � � � � � � � � � � � ���� � � �!�"�"�$�(�*�-�)2� 3� 4�5�5�6�6�7�7�8�8�8�8�9�9�9�9�;�>�=�=�=� 2� 3� 4�5�5�6�6�7�7�8�8�8�8�9�9�9�9�;�>�=�=�=� 2� 3� 4�5�5�6�6�7�7�8�8�8�8�9�9�9�9�;�>�=�=�=� 4 �5 �5 �6�6�7�7�8�8�9�9�9�:�:�:�:�<� Q�5��2� �0� �.� � � � �� ������ ����� ��������������� � �<��;�;=��Ɛ9��8�9�:�;�;�;�;�;�;�;�:�9�89��Ő:��9�:�;�;�;�;�;�;�;�:�9�89�?Q�5��2� �0� �.� � � � �� ������ ����� ��������������� � �<��;�;=��ƒ9��8�9�:�;�;�;�;�;�;�;�:�9�89��Œ:��9�:�;�;�;�;�;�;�;�:�9�89�?Q�5��2� �0� �.� � � � �� ������ ����� ��������������� � �<��;�;=��ƛ9��8�9�:�;�;�;�;�;�;�;�:�9�89��ś:��9�:�;�;�;�;�;�;�;�:�9�89�?Q�5� 2� 1�/� � �� � �� ��% ��'� �*� � K��������������������������������������� ����������� ���� ���������� ���� �,�?��?�@?��?��?�?��������������������������������������� ����������� ���� ���������� ���� �,�?��?�@?��?��?�?��������������������������������������� ����������� ���� ���������� ���� �,�?��?�@?��?��?�?��������� ���� � ����� �� ����� �� ������ �!���-� �<���!����������������������������� �!� ��!���!���#��#��/� /� 0� 0� 1� 2� 3� 4�5�6�7�8�:�8�7�6�6�4�3� 2� 1� 0� /� .�-�,�+�*�)�)�'��<���!����������������������������� �!� ��!���!���#��#��/� /� 0� 0� 1� 2� 3� 4�5�6�7�8�:�8�7�6�6�4�3� 2� 1� 0� /� .�-�,�+�*�)�)�'��<���!����������������������������� �!� ��!���!���#��#��/� /� 0� 0� 1� 2� 3� 4�5�6�7�8�:�8�7�6�6�4�3� 2� 1� 0� /� .�-�,�+�*�)�)�'��<���!����� ����������� �!�"��"��#��#��/�0�0�1 �1 �2 �3 �4 �5 �6�7�8�9�:�9�8�7�6�5 �4 �3 �2 �1 �0�/�.�-�,�+�*�)�(������0� 0� 0� 0� 1� 1� 1� 2� 2� 2� 3� 3� 4�4�5�5�5�5�6�6�7�7�8�9�9�:�;�<�<�>�0� 0� 0� 0� 1� 1� 1� 2� 2� 2� 3� 3� 4�4�5�5�5�5�6�6�7�7�8�9�9�:�;�<�<�>�0� 0� 0� 0� 1� 1� 1� 2� 2� 2� 3� 3� 4�4�5�5�5�5�6�6�7�7�8�9�9�:�;�<�<�>�0�0�0�0�1� 1� 1� 2� 2� 2� 3� 3� 4� 4� 5� 5� 5� 5� 6�6�7�7�8�9�9�:�;�<�=�>�����2 ��=�<��;�;�:�9�8�7�5�5 �3 �2 �1 �0 �/�-�,�*�(�%�#��$�'�*�/� 3 ���2 ��=�<��;�;�:�9�8�7�5�5 �3 �2 �1 �0 �/�-�,�*�(�%�#��$�'�*�/� 3 ���2 ��=�<��;�;�:�9�8�7�5�5 �3 �2 �1 �0 �/�-�,�*�(�%�#��$�'�*�/� 3 � �m�=�=�=�<�;�:�9�7�7 �5 �4 �3 �2 �1�/�.�,�+�(�&�#�$�'�*�/�3� ��<�:�;�;�:�:�:�:�:�9�9�8�8�8�7�7�6�6�5�5�5�4�4�3� 3� 2� 1� 0� 0� .�-�,�+�)�(�&�%�"� ��� �"�$�&�* �/ �1�3��<�:�;�;�:�:�:�:�:�9�9�8�8�8�7�7�6�6�5�5�5�4�4�3� 3� 2� 1� 0� 0� .�-�,�+�)�(�&�%�"� ��� �"�$�&�* �/ �1�3��<�:�;�;�:�:�:�:�:�9�9�8�8�8�7�7�6�6�5�5�5�4�4�3� 3� 2� 1� 0� 0� .�-�,�+�)�(�&�%�"� ��� �"�$�&�* �/ �1�3�>�=�<�<�<�;�;�;�;�:�:�9�9�9�8�8�7�7�6�6�6�5 �5 �4 �4 �3 �2 �1 �1 �0�.�-�,�+�)�(�&�%�"� � �"�$�&�*�/� 1� 3���%��$�%�&�' � �2��7��:� k�%��$�%�&�' � �2��7��:� k�%��$�%�&�' � �2��7��:� k�$�&�&�(�3� 8�;� k��?�@�?�@�?�@�@�&�%�%�Z&�%�%�Z&�%�%�Z'�&�%Z�����������������������������������������������d�������d���2�������2������������������ Hintergrund����������������������� ���������� ���������� ���������� ���������� ������������������������������������������������������������������(��4��@�����������h��x����������������������(��8��H��X��h��x����������������������������������������������������������������������������������������������������������������������������������������������d�������d���2�������2�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca_0.9.3/xcf/smartcard.xcf�������������������������������������������������������������������������0000664�0000000�0000000�00000062241�11753427512�0015636�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������gimp xcf file�������^����������������B��B�����������E��������������H���jpeg-settings������� U����gimp-image-grid������(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 32.000000) (yspacing 32.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ���������������'l��+��X�����������y��� ������Serial���������������������� ���������� ���������� ���������� ���������� �������������������N������������������� ��������������#���gimp-text-layer������(text "982845235693219567941432") (font "Sans") (font-size 8.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode dynamic) (box-unit pixels) ������������������y��� ��������������y��� ����d���������y=�ii�k�ii��%���k�Z���y=�Z��44�44��?�44������?��@���㰲 ��44��@��?��44��A�44�+��Q��A��<�Q�6����<��A��8�TR��J+�TR�u��P��J+��U��P���8��U��J�� �44�m-��44��K�m-��E��K�44�� ��E�m-�������T�}�T�>|��}���:�:�:�q�k���y=����y=��%����%��Z�k�����44��� ��t�44��������@��?������Q�6��C��+����+��<��A�+����8��P���$��8�u����u��U��J+���� ��K�44��|�� �����E�m-����T�>|��?���������}��p����<����������@���@������ Pasted Layer���������������������� ���������� ���������� ���������� ���������� ����������������Q���������������������������������������@���@������������@���@������1�~yX��1���-���+�p��)�`ؾd�(�v�'�lq�'�m�&�n�&�p�&�p�&�p�"�e� �� �{���͊���͈���߼͈���v͆���W޳˅���?ܲ˄�����ڰ̃�� �˨ٯ̃���Ԁ�ح˂��� ۇj֮Ƀ�� �@؏ǾԬȂ�� �٫Ɂ�� �ڒȀ�� �ʲ~�� �٘�� �«|�� �{�� �y���x���ְv���݂`best���ϕiiYANmt���te��/׷r���˯w��>p���M������� C���Ѹ����Z�����f���l���Qk���\���F���ܨ���_m���M���ކ}���ǐI���uܕw���ܙ#���ȝ7���ﶡE���Ħ+���dضq �� �p¾z(��"�PZ��$ �$?F, ��(�*�/ �$1�~yX��1���-���+�p��)�`ؾd�(�v�'�lq�'�m�&�n�&�p�&�p�&�p�"�e� �� �{���͊���͈���͈���v͆���W߳˅���?ݳ˄�����۱̃�� �˨ٰ̃���Ԁ�خ˂��� ۈk׮Ƀ�� �@ؐȿլȂ�� �٫Ɂ�� �ړȀ�� �ʳ~�� �٘�� �«|�� �{�� �y���x���ְv���݂`best���ϕiiYANmt���te��/׷r���˯w��>p���M������� C���Ѹ����Z�����f���l���Qk���\���F���ܨ���_m���M���ކ}���ǐI���uܕw���ܙ#���ȝ7���ﶡE���Ħ+���dضq �� �p¾z(��"�PZ��$ �$?F, ��(�*�/ �$1�~yX��1���-���+�p��)�`ؾd�(�v�'�lq�'�m�&�n�&�p�&�p�&�p�"�e� �� �{���͊���͈���߼͈���v͆���W޳˅���?ܲ˄�����ڰ̃�� �˨ٯ̃���Ԁ�ح˂��� ۆi֮Ƀ�� �@؏ǾԬȂ�� �٪Ɂ�� �ڑȀ�� �ɱ~�� �ٗ�� �|�� �{�� �y���x���ְv���݂`best���ϕiiYANmt���te��/׷r���˯w��>p���M������� C���Ѹ����Z�����f���l���Qk���\���F���ܨ���_m���M���ކ}���ǐI���uܕw���ܙ#���ȝ7���ﶡE���Ħ+���dضq �� �p¾z(��"�PZ��$ �$?F, ��(�*�/ �$2� �0�\a�.�Z�,� ) �*�M`{ B �)�e�(�l�'� p�'�q�&� r�&� 't�&�wt�$�hj�!�dy}=� �5��O)��wb;�� fD%��<fF)��MiF*��VkF*��* #lF*���-L|nF*��Syrkd> 2pF*� �UޤsF)� �w#vF)� �-$xF)� �e${F)� �$F)� � y$E)� �N$E)� �$E)� �$E)� � !#E)��#E)�� "E)��.ةE)��rWGDJYE)�� !H0"&8RE(�� *. :[F)��1G )P|.��6�� #! ��9j ��:|F ��8 ! ��5\ ��/W�� (OC��D.��7_# ��)N;��<a(��)L8��7W\$ �� !?]~-��&Dl2��)D^n4 ��'@XS0 � �!7Mb r@* �"� *=N_gD1�%�)8EPW^x`RI=/! �'� (06:;:72+# �+�  �0��$����@���������ID card����������������������� ���������� ���������� ���������� ���������� ����������������O���%���������������������������gimp-text-layer�������(text "ID card") (font "Sans") (font-size 18.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode dynamic) (box-unit pixels) �����������)+�������@��������)?�������@�����)O�����������n �*���4�)���� _�(���� ��oM��EC�� ��! ����R���3���������sd9��2��B��68������[� ���I��F��H������ ��t�� �� �� ����S�� ���� �� ���� ~��Z��W���F��H����^��ra8�O"���67���4���������i � �tM����! �@�������^������Chip���������������������� ���������� ���������� ���������� ���������� ��������������������������������������������������,M����������^�����,i��W��W����������^��,��E��K��O ��O0��U(��VV��W������ * � * � * � * � * � * � * � * � * � * �4 �4 �4 �4 �4 �4 �4 �4 � � � A    -� � =1]m!/x~N� � ì)oY^ � � -$gj� � \R� �SV �H� �d7E �dU&MNRTSQNMLOQQSx �dg= �elU �`jY �`jW �_E𙠧V� �](X\ZZWUSSUTFRn7:<566:@� �`fVV� �bjVZ� �blV`� �dmTY� �enUV� �cmVT� �bk US� �bkUT� �_`ڪWQ� �b!=B=::<@GJKLAU>\txyxutvw� �_WYBex}|zyy{� �bjYT� �dl\W� �fndW� �eniU� �cmiT� �cljS� �ajkS� �_fiQ� �]8|􋌋rgA� �^9qrkjjkijibUCg1ESSVTQMKJ� �bhiJ� �ckhL� �eohO� �docN� �di<RXWWXXWXXfiff]?� �c\뱡񊉆tA�� * � * � * � * � * � * � * � * � * � * �4 �4 �4 �4 �4 �4 �4 �4 �� � @� �� &� � 9,W|g*swG� � ì(iPT� � +!\a� � ZE� �N I �>� �a/9 �aMBCCBBFHGJMLMMk� �_`0� �bfJ� �_fM �agH �`CsIϻ� �_&QOOPPOOLJGGHD3Gf443.24224� �ae٢NM� �bhPM� �ahQN� �_eNG� �_eOI� �_fMJ �`fMJ� �ahNJ �_^ԠLJ� �a97557;BEGJ6F;]rpoqpqrq� �_U깳K9_nolnnoo �`gKJ� �ahOJ� �agVI� �`fZH� �`fYH� �afYH� �bhXG� �ceZG� �a8w}e\<� �`8ke_^^_]]VK3X)AKDFHGEB?� �beٙXC� �bfWH �ahWI �_gUI� �`a/HONKHIHIKKIW\ZZP5 �aU틌}~}}h7�� * � * � * � * � * � * � * � * � * � * �4 �4 �4 �4 �4 �4 �4 �4 � � � :��� )� � ; )FNPMIEHHJYP=JFHIIJ=� � ' ;w||~}y{z~(,q|}zyyz|wwt� � ) U{pfbeiihgkns!x{noigffgffdbfgghfiji� � ] FogfddejyOcmeiodeffeffdcefiijihf� �,nffiUxh_beZaggfggfegifghh �~a~khhfbi v|mefi^gllklkklnmlghfefhi� �]{lfggfkk|ywy||}}zwljfccehk� �]*}cbeddedfow  crjdbbehl� �]1|`_baadcbcluOUUVYYU[_\XXYXXVMnlkdcbehk� �_5}`cffefdjqptomnmhpssrsstrpmgeefhj� �_8iillkjjkls}!mhdbcb^dffeffgjihihgghh �`>rpqqrqwzggdcgheeffecadejiihgf� �e*PDEFFGJSSOON mddfklhghhghffhjqp\Xcfefddi� �i%#""#! #pecfjhaceghedchmy8� �`>ysttwutv~hcbgkibceghedbioqYt{~vuvql� �Z.spgcdegghhilxr`]aglicdegheddhoq\pztihgfi� �Z*nhfeffhgikjjmc_cdhkicdegheddgoohtpj`cb]b� �].qiighiijldbgghigabeghedchqikunh^adch� �^2ulgeffghnikmihhf`beghedchojilgb\bgfh� �^/rjgghiol!qqiffaceghedchojhiebahmii� �]-qhdbbcdnm"qogdegedeghedchokkmhghoqjg� �]1xqjggfggmiljcafjjfeghedchojjkfflja^� �`9zywvvtwz{wofjf__ekkfeghfddholqwtutywnm� �j"'(%#ke\^dhgeeghfeejpp.22324301� �b6nkb__^XPNPTY!nf__ehedeghfeejqr:47757765� �]7|soonopr|nfbcghddeghfeejpnr~ywuz|yz� �[-skiggihgfhsi!mhggiicdeghfeejql`ijc]bhfh� �\,mefgghgflY$kijijhcdeghfeejpnjoib]chhj� �^/qidcciS$kjkkhcdeghfdejoolnhb\agej� �_3umgeejT$jiijkhcdeghfdekqmopke_cgfj� �^1unjhhnW$khghjicdeghfdfjpgklie^bebe� �\,qlgffgr\%kgefhhcdeghfdfiqckkhbeeac� �[1}ytrrsrrvh$ghgdfieedcefedhre!uvxwruvqr� �]==@@?AJ^D"bolccjihc^aghcdokSOSRNS^ae� �\.(()&(&nsnfejkic`bhhcdom#"$%"#!� �];{yyz|{vu^%kjjeeinmgbejicdol#wwyutywop� �[3sfdccdcedcdgP&ohca__fnkfhmlefpjkjpminnhi� �\0yfbbcdgY.ujib]enkfhmlefpiiikhcggcf� �]/uafhhiijkkjlW.~}uorxvns|shife`cdad� �^/ydabbdepe "(%'$!/..79qmliejkhh� �`-{idccdeeiyMGG@GLHGHFCFK?:<F?vmjgchkh�hZ�f ��%�(�*�*�*�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+�+��f<#u:OZ9un8c8+V7j"77"7+7,7+7+7ʺ#7ABEC<7̾#7,7.7,7+7*7+7.7,7wu{7y{{td7(7,7+7-7-7-7-7+7"7GILLF7%7+7+7-7+7%7��b< p:MT9nh8[8%U7f 777%7%7$7#778::97 77%7$7$7%7'7&7%7#7qmpwz7psqj_7"7&7$7%7%7%7%7$77?AAB> 7ɽ 7&7%7&7%7 7��[< n:d#S9z: j8eos+8hypT8kfm97kdfrX 7qfXfj 7ofZak7lf_fl7igell7ghkrp7jlnqn7 7ihnrr7ignww7cbgqt7lsu7mnlrv7da]fn 7a\X`j 7fe_en7~|7656:A 71010,7yuz{7filtx7fbcnr7gfdkq7lkflr7lkeip7hg_fo7tpkpu7f`a`_ 7 7popp7a`fpo 7dglvv7los|7[Ybov7[\dpn 7�=��:��9�9�9�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8��� (� (� (� (� (� (� (� (� (� (�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(��� (� (� (� (� (� (� (� (� (� (�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(��� (� (� (� (� (� (� (� (� (� (�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(����������� �f:V� �~m �] P� � X݉\� � %%E� � ݣ# lvF� � 4,Oy r;cuJ� � Ӏ-    � �� �4 �4 �4 �4 �4 �4 �4 �4 � * � * � * � * � * � * � * � * � * � *�� �c4M� �|b� �YF� � T ԁS� � #! ܅<� � ݣ"ai9� � / &Kuh/[~lD� � ւ.  ������ � � �4 �4 �4 �4 �4 �4 �4 �4 � * � * � * � * � * � * � * � * � * � *�� �dtphffhingemziowogmkgkstrr~a"tfdb]cfdg� �|Z|jfhhijihfgoibgtehnhafdafnmfj{D!ufb_]aece� �ӽ)ofhlonkgcbhhghjhhihgjfdjnibjyAunggdcfgd� � LUvgde`abdfhkllkjkc\\qyD srokhgiijl� �  S~wkd]^chlgddbim`YgN]qgfbaab`dl� �  =|~urv|xttsvvz}v:o|wstqruwwm� � 1 '@FCDHJIIHHIHD>;E>DWNHJIGIGIH8� � })���� ����� � � �4 �4 �4 �4 �4 �4 �4 �4 � * � * � * � * � * � * � * � * � * � *���+�+�+�*�*�D(�(�'�D f̪̪f�?�7s$7+S7`8q`8O R9!d:Q<��7o!7'P7[8j\8KM9`:N<��fgn~X7dgv87YazvM8fu1 8|<Y8['O9 ^:P<��8�8�8�9��8�:�;�=��~�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(� (� (� (� (� (� (� (� (� (� ��(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(� (� (� (� (� (� (� (� (� (� ��(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(� (� (� (� (� (� (� (� (� (� ��������������d���/�������2�������������^������Card����������������������������� ���������� ���������� ���������� ���������� ��������������������������������������������������X����������^�����X��d��d����������^��X��\��\��`��`��b��b��dy������.R�0R �1R �2R �3R �3R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R��.Z�0Z �1Z �2Z �3Z �3Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z��.y�0y �1y �2y �3y �3y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y��.�0 �1 �2 �3 �3 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4��@R��@Z��@y��@��R.�R,�R+�R*�R)�R)�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(���Z.�Z,�Z+�Z*�Z)�Z)�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(���y.�y,�y+�y*�y)�y)�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(���.�,�+�*�)�)�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(��������� �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �4R �3R �3R �2R �1R�0R�.R�� �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �4Z �3Z �3Z �2Z �1Z�0Z�.Z�� �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �4y �3y �3y �2y �1y�0y�.y�� �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �4 �3 �3 �2 �1�0�.��R��Z��y����R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R(�R)�R)�R*�R+�R,�R��Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z(�Z)�Z)�Z*�Z+�Z,�Z��y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y(�y)�y)�y*�y+�y,�y��(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�)�)�*�+�,��������������d���/�������2����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������