pax_global_header00006660000000000000000000000064126062051640014514gustar00rootroot0000000000000052 comment=3173bdba961ecd6137420d890eb74e456e5cfa92 xca-1.3.2/000077500000000000000000000000001260620516400122725ustar00rootroot00000000000000xca-1.3.2/.gitignore000066400000000000000000000002561260620516400142650ustar00rootroot00000000000000.depend .depend .build-stamp *.o *.obj *.rej *.orig *.dll *.h.gch moc_* Local.mak local.h xca xca.exe setup.exe aclocal.m4 autom4te.cache/ config.log config.status configure xca-1.3.2/AUTHORS000066400000000000000000000002111260620516400133340ustar00rootroot00000000000000Christian Hohnstädt Programming, translation, testing Kerstin Steinhauff Arts, Graphics xca-1.3.2/COPYRIGHT000066400000000000000000000032601260620516400135660ustar00rootroot00000000000000 Copyright (C) 2001 - 2015 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-1.3.2/INSTALL000066400000000000000000000045021260620516400133240ustar00rootroot00000000000000 -------------------=[ XCA ]=--------------------- A graphical user interface to OpenSSL. Requirements: ============== for compilation, you need the following Libraries: QT >= 4.6.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: -------------- When cloning the git sources the autoconf configure script must be assembled by calling $ ./bootstrap The officially published sources already come with a configure script. To build, just do the following steps: $ ./configure; make -j6; 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 are in the freshly unpacked xca-1.1.0 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/ configure allows to set the openssl and QT installation dir. $ ./configure --help shows all options. It writes all found settings to "Local.mak" and "local.h" 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 snapshot : Creates a current snapshot from the local git repository xca.app : Creates the MacOSX xca.app xca.dmg : Creates the MacOSX Disk image xca_db_stat: Creates the database analyzer 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-1.3.2/INSTALL.mac000066400000000000000000000044131260620516400140640ustar00rootroot00000000000000 This is a short overview of how to build XCA for MAC OSX Please drop me a mail if you experience problems.. There are 2 ways to compile XCA on MAC: 1) Simple local not very but a little portable build. Use the locally installed OpenSSL library 2) Use an up-to-date OpenSSL library 1.0.Xy and build a 32 bit binary that should run even on "Leopard" This is what I do for the official XCA .dmg releases It is more complicated than 1) Required tools for 1) and 2): a) XCODE Only the < 200MB "Command Line Tools for Xcode" are required to build XCA, not the complete 2GB Xcode binary. b) Qt Framework 4 (Qt 5 does not work with XCA, yet) For 1) install the qt-mac-carbon-opensource-4.x.y.dmg For 2) we need to compile Qt from source, see below 1) Simple local not very but a little portable build Run $ ./configure && make -j4 which should result in an xca-1.x.y-.dmg 2) More portable 32 bit app with an up-to-date OpenSSL Read below for using the misc/mac-build.sh script Define an installation directory export INSTALL_DIR="$HOME/src/install" a) Compile qt-everywhere-opensource-src-4.8.x with the following command: ./configure -no-qt3support -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -arch x86 -opensource -release -prefix $INSTALL_DIR/Qt485 b) Compile OpenSSL 1.0.Xy # define the installation dir and the path to the new library # it will be installed locally in you home directory export DYLD_LIBRARY_PATH=$INSTALL_DIR/lib # configure openssl ./config shared --prefix=$INSTALL_DIR # 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 c) Compile ibtool-2.2.6b ./configure --prefix ${INSTALL_DIR} && make -j5 && make install d) Compile XCA: # configure XCA and build the DMG file export CXXFLAGS="-arch i386 -I${INSTALL_DIR}/include -L${INSTALL_DIR}/lib" ./configure --with-openssl="$INSTALL_DIR" --with-qt="$INSTALL_DIR/Qt485" make -j5 I do the steps b) - d) with the misc/build-mac.sh script xca-1.3.2/INSTALL.qmake000066400000000000000000000012631260620516400144220ustar00rootroot00000000000000 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 creates the makefile. I recommend "makefile" to not overwrite "Makefile" and also assures, that it is used instead of the original Makefile. (At least on debian the qmake command is "qmake-qt4") Now you need to create the file Local.h $ cat >local.h <mingwm10.dll translate the QT language files $ lrelease-qt4 ../qt/4.6.2/translations/qt_*.ts create the setup.exe $ make setup.exe xca-1.3.2/Local.mak.in000066400000000000000000000012021260620516400144160ustar00rootroot00000000000000 # WARNING: This file will be overwritten by configure # @configure_input@ export TOPDIR=@abs_srcdir@ export VERSION=@PACKAGE_VERSION@ CPPFLAGS=-DXCA_PREFIX=\"${xca_prefix}\" -DETC=\"@sysconfdir@\" -DDOCDIR=\"@docdir@\" @CXXFLAGS@ CFLAGS=-Wall -Wextra -O2 LIBS=@LIBS@ MOC=@QT_MOC@ UIC=@QT_UIC@ RCC=@QT_RCC@ LRELEASE=@QT_LRELEASE@ CC=@CXX@ STRIP=@STRIP@ DOCTOOL=@DOCTOOL@ MACDEPLOYQT=@MACDEPLOYQT@ DARWIN=@DARWIN@ PACKAGE_TARNAME=@PACKAGE_TARNAME@ HOST=linux prefix=@prefix@ exec_prefix=@exec_prefix@ docdir=@docdir@ htmldir=@htmldir@ mandir=@mandir@ bindir=@bindir@ datarootdir=@datarootdir@ xca_prefix=${datarootdir}/${PACKAGE_TARNAME} xca-1.3.2/Makefile000066400000000000000000000116531260620516400137400ustar00rootroot00000000000000# # 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 ifeq ($(TOPDIR),) TOPDIR=. endif VPATH=$(TOPDIR) SUBDIRS=lib widgets img misc OBJECTS=$(patsubst %, %/.build-stamp, $(SUBDIRS)) INSTDIR=misc lang doc img INSTTARGET=$(patsubst %, install.%, $(INSTDIR)) APPTARGET=$(patsubst %, app.%, $(INSTDIR)) DMGSTAGE=$(BUILD)/xca-$(VERSION) MACTARGET=$(DMGSTAGE)-$(DARWIN)${EXTRA_VERSION} APPDIR=$(DMGSTAGE)/xca.app/Contents OSSLSIGN_OPT=sign -pkcs12 "$(HOME)"/Christian_Hohnstaedt.p12 -askpass \ -n "XCA $(VERSION)" -i https://sourceforge.net/projects/xca/ \ -t http://time.certum.pl -h sha2 -verbose all: xca_db_stat$(SUFFIX) ifeq ($(SUFFIX), .exe) all: setup$(SUFFIX) export CFLAGS_XCA_DB_STAT=-mconsole 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) $(CPPFLAGS) $(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)/$* xca_db_stat$(SUFFIX): lib/.build-stamp $(MAKE) -C lib -f $(TOPDIR)/lib/Makefile \ VPATH=$(TOPDIR)/lib $@ cp lib/$@ $@ $(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 misc -name "*.o" \ -o -name ".build-stamp" \ -o -name ".depend" \ -o -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 xca_db_stat$(SUFFIX) *.dmg rm -rf xca-$(VERSION)* distclean: clean rm -f local.h Local.mak config.log config.status dist: $(TARGET).tar.gz $(TARGET).tar: test ! -z "$(TVERSION)" git archive --format=tar --prefix=$(TARGET)/ $(TAG) > _$@ V=`tar xf _$@ -O $(TARGET)/VERSION` && \ test "$(TVERSION)" = "$$V" && echo "$$V" > VERSION ./bootstrap "$(TARGET)" tar -rf _$@ "$(TARGET)/configure" rm -rf "$(TARGET)" mv _$@ $@ $(TARGET).tar.gz: $(TARGET).tar gzip -9 < $^ > $@ snapshot: HASH=$$(git rev-parse HEAD) && \ git archive --format=tar --prefix=xca-$${HASH}/ HEAD | \ gzip -9 > xca-$${HASH}.tar.gz install: xca$(SUFFIX) xca_db_stat$(SUFFIX) $(INSTTARGET) install -m 755 -d $(destdir)$(bindir) install -m 755 xca $(destdir)$(bindir) install -m 755 xca_db_stat $(destdir)$(bindir) $(STRIP) $(destdir)$(bindir)/xca setup.exe: setup_xca-$(VERSION).exe setup_xca-$(VERSION).exe: xca$(SUFFIX) xca_db_stat$(SUFFIX) do.doc do.lang setup_xca-$(VERSION).exe: misc/xca.nsi for binary in xca$(SUFFIX) xca_db_stat$(SUFFIX); do \ $(STRIP) xca$(SUFFIX); \ if test -n "$(OSSLSIGN)"; then \ $(OSSLSIGN) $(OSSLSIGN_OPT) -in $${binary} -out $${binary}.signed && \ mv $${binary}.signed $${binary}; \ fi; \ done $(MAKENSIS) -DINSTALLDIR=$(INSTALL_DIR) -DQTDIR=$(QTDIR) \ -DVERSION=$(VERSION) -DBDIR=$(BDIR) -DTOPDIR=$(TOPDIR)\ -NOCD -V2 -DEXTRA_VERSION=${EXTRA_VERSION} $< if test -n "$(OSSLSIGN)"; then \ $(OSSLSIGN) $(OSSLSIGN_OPT) -in $@ -out setup.tmp && mv setup.tmp $@; \ fi $(DMGSTAGE): xca$(SUFFIX) xca_db_stat$(SUFFIX) 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 install -m 755 xca_db_stat $(DMGSTAGE)/xca.app/Contents/MacOS $(STRIP) $(DMGSTAGE)/xca.app/Contents/MacOS/xca $(STRIP) $(DMGSTAGE)/xca.app/Contents/MacOS/xca_db_stat $(MAKE) $(APPTARGET) cp -r $(DMGSTAGE)/xca.app/Contents/Resources/*.html $(DMGSTAGE)/manual ln -s xca.html $(DMGSTAGE)/manual/index.html $(MACDEPLOYQT) $(DMGSTAGE)/xca.app codesign -s "Open Source Developer, Christian Hohnstaedt" $(DMGSTAGE)/xca.app xca.dmg: $(MACTARGET).dmg xca.app: $(DMGSTAGE) $(MACTARGET).dmg: $(DMGSTAGE) hdiutil create -ov -srcfolder $< $@ trans: $(MAKE) -C lang po2ts lupdate-qt4 -locations relative $(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: $(TOPDIR)/configure Local.mak.in $(TOPDIR)/configure xca-1.3.2/README.md000066400000000000000000000034061260620516400135540ustar00rootroot00000000000000# XCA -- X Certificate and Key Management ## __Release Notes__ * Make a backup copy of your database! * Send bugs to christian@hohnstaedt.de ## __Changelog:__ ### xca 1.3.2 * Gentoo Bug #562288 linking fails * Add OID resolver, move some Menu items to "Extra" * SF. Bug. #81 Make xca qt5 compatible * SF. Bug. #107 error:0D0680A8:asn1 encoding * Don't validate notBefore and notAfter if they are disabled. ### xca 1.3.1 * Fix endless loop while searching for a signer of a CRL ### xca 1.3.0 * Update to OpenSSL 1.0.2d for Windows and MAC * SF Bug #105 1.2.0 OS X Retina Display Support * Digitaly sign Windows and MAC binaries with a valid certificate * Refactor the context menu. Exporting many selected items the clipboard or a PEM file now works. Certificate renewal and revocation now be performed on a batch of certificates. * Feat. Reg. #83 Option to revoke old certificate when renewing * Refactor revocation handling. All revocation information is with the CA and may be modified. certificates may now be deleted from the database * Support nameConstraints, policyMappings, InhibitAnyPolicy, PolicyConstraint (OSCP)noCheck when transforming certificates to templates or OpenSSL configs * Fix SF Bug #104 Export to template introduces spaces * Add option for disabling legacy Netscape extensions * Support exporting SSH2 public key to the clipboard * SF Bug #102 Weak entropy source used for key generation: /dev/random, mouse/kbd entropy, token RNG * SF Feat. Req. #80 Create new certificate, on existing certificate, same for requests * Add Cert/Req Column for Signature Algorithm * SF Feat. Req. #81 Show key size in New Certificate dialog * Distinguish export from transform: Export writes to an external file, Transform generates another XCA item xca-1.3.2/Rules.mak000066400000000000000000000016061260620516400140610ustar00rootroot00000000000000include $(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) for i in $(patsubst %, $(shell pwd)/%, $(OBJS)); do echo $$i; done > $@ @$(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: .PHONY: .build-stamp xca-1.3.2/VERSION000066400000000000000000000000061260620516400133360ustar00rootroot000000000000001.3.2 xca-1.3.2/bootstrap000077500000000000000000000002251260620516400142340ustar00rootroot00000000000000#!/bin/sh if test -n "$1"; then mkdir -p "$1" O="$1/" fi O="${O}configure" aclocal -Im4 autoconf -o $O rm -f aclocal.m4 rm -rf autom4te.cache/ xca-1.3.2/changelog000066400000000000000000000474541260620516400141620ustar00rootroot00000000000000xca 1.3.2 Sat Oct 10 2015 * Gentoo Bug #562288 linking fails * Add OID resolver, move some Menu items to "Extra" * SF. Bug. #81 Make xca qt5 compatible * SF. Bug. #107 error:0D0680A8:asn1 encoding * Don't validate notBefore and notAfter if they are disabled. xca 1.3.1 Fri Aug 21 2015 * Fix endless loop while searching for a signer of a CRL xca 1.3.0 Thu Aug 11 2015 * Update to OpenSSL 1.0.2d for Windows and MAC * SF Bug #105 1.2.0 OS X Retina Display Support * Digitaly sign Windows and MAC binaries with a valid certificate * Refactor the context menu. Exporting many selected items to the clipboard or a PEM file now works. Certificate renewal and revocation may now be performed on a batch of certificates. * Feat. Reg. #83 Option to revoke old certificate when renewing * Refactor revocation handling. All revocation information is stored with the CA and may be modified. Revoked certificates may now be deleted from the database * Support nameConstraints, policyMappings, InhibitAnyPolicy, PolicyConstraint and (OSCP)noCheck when transforming certificates to templates or OpenSSL configs * Fix SF Bug #104 Export to template introduces spaces * Add option for disabling legacy Netscape extensions * Support exporting SSH2 public key to the clipboard * SF Bug #102 Weak entropy source used for key generation: Use /dev/random, mouse/kbd entropy, token RNG * SF Feat. Req. #80 Create new certificate, based on existing certificate, same for requests * Add Cert/Req Column for Signature Algorithm * SF Feat. Req. #81 Show key size in New Certificate dialog * Distinguish export from transform: - Export writes to an external file, - Transform generates another XCA item xca 1.2.0 Sat Mar 21 2015 * Update to OpenSSL 1.0.2a for Windows and MAC drop brainpool extra builds * Use CTRL +/- to change the font size in the view * Add Row numbering for easy item counting * Support SSH2 public key format for import and export * Add support for SHA-224 * add "xca extract" to export items from the database on the commandline xca 1.1.0 Sat Nov 22 2014 * SF Bug #79 Template export from WinXP cannot be imported in Linux and Mac OS X * Support for Brainpool windows and MacOSX binaries * SF Feat. Req. #70 ability to search certificates * SF Feat. Req. #75 show SHA-256 digest * RedHat Bug #1164340 - segfault when viewing a RHEL entitlement certificate * Database hardening - Delete invalid items (on demand) - Be more tolerant against database errors - Gracefully handle and repair corrupt databases - Add "xca_db_stat(.exe)" binary to all installations * Translation updates * Optionally allow hash algos not supported by the token * Select whether to translate established x509 terms * Finish Token EC and DSA support - generate, import, export, sign * SF Feat. Req. #57 More options for Distinguished Name * Switch to autoconf for the configure script * SF Feature Req. #76 Export private keys to clipboard * EC Keys: show Curve name in table * Support EC key generation on PKCS#11 token * PKCS#11: Make EC and RSA signatures work * PKCS#11: Fix reading EC keys from card * SF Bug #82 Certificate Creation out of Spec * SF Bug #95 XCA 1.0 only runs in French on a UK English Mac xca 1.0.0 Wed Oct 22 2014 * SF Bug #89 Validating CRL distribution point results in error * SF Feature Req. #69 Create "Recent databases..." file menu item * SF Bug #75 authorityInfoAccess set error * SF Bug #88 Minor spelling error * SF Bug #87 Unable to set default key length The Key generation dialog now allows to remember the current settings * Do not interpret HTML tags in message boxes * Overwite extensions from the PKCS#10 request by local extensions This avoids duplication errors and allows to overwrite some extensions from the request * SF Bug #78 replace path separators in export filenames * SF Feature Req. #71 Add KDC Authentication OIDs to default files * SF Bug #82 Certificate Creation out of Spec * Add Croatian translation * SF Bug #83 Inappropriate gcc argument order in configure script xca 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-1.3.2/configure.ac000066400000000000000000000143731260620516400145700ustar00rootroot00000000000000AC_INIT([X Certificate and Key management], m4_esyscmd([tr -d '\n' < VERSION]), [christian@hohnstaedt.de], [xca], [http://xca.hohnstaedt.de]) AC_MSG_NOTICE([ ***************************************************]) AC_MSG_NOTICE([ * ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_MSG_NOTICE([ ***************************************************]) AC_PROG_CXX AC_LANG(C++) AC_CHECK_TOOL(STRIP, [strip], [:]) DVERSION="`${CXX} --version | grep apple-darwin || :`" case "$DVERSION" in *-apple-darwin14*) DARWIN="Yosemite" ;; *-apple-darwin13*) DARWIN="Mavericks" ;; *-apple-darwin12*) DARWIN="Mountain Lion" ;; *-apple-darwin11*) DARWIN="Lion" ;; *-apple-darwin10*) DARWIN="SnowLeopard" ;; *-apple-darwin9*) DARWIN="Leopard" ;; *-apple-darwin?) AC_MSG_ERROR([echo Unsupported Mac OSX version $DVERSION]) ;; esac if test -n "${DARWIN}"; then AC_MSG_NOTICE([Mac OSX ${DARWIN} detected]) CXXFLAGS="${CXXFLAGS} -pipe -gdwarf-2" fi AC_SUBST([DARWIN]) AC_SUBST([MACDEPLOYQT]) export PKG_CONFIG_PATH export LD_LIBRARY_PATH if test -n "$DARWIN"; then export DYLD_LIBRARY_PATH fi if test "$srcdir" != "."; then if test -r "$srcdir"/Local.mak || test -r "$srcdir"/local.h; then AC_ERROR([The source directory (${srcdir}) contains a 'Local.mak' or 'local.h' file. They must be removed before building here.]) fi fi # Detect the OpenSSL libraries and header ######################################### AC_ARG_WITH([openssl], AS_HELP_STRING([--with-openssl], [Select the OpenSSL installation directory]), [ if test -d "$withval"; then _OPENSSLDIR="$withval" else AC_MSG_WARN([OpenSSL directory '$withval' does not exist or is not a directory]) fi ], [_OPENSSLDIR="$OPENSSLDIR"]) if test -n "${_OPENSSLDIR}" && test -d "${_OPENSSLDIR}"; then _OPENSSLDIR=`cd ${_OPENSSLDIR} && pwd` PKG_CONFIG_PATH="${_OPENSSLDIR}/lib/pkgconfig:${PKG_CONFIG_PATH}" LD_LIBRARY_PATH="${_OPENSSLDIR}/lib:${LD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="${_OPENSSLDIR}/lib:${DYLD_LIBRARY_PATH}" fi PKG_CHECK_MODULES([OpenSSL], [libcrypto >= 0.9.8], [ ], [ OpenSSL_LIBS=" -lcrypto "; AC_MSG_WARN([OpenSSL pkg-config failed, using fallback defaults (${OpenSSL_LIBS})]); ] ) OPENSSL_LIBS="$OpenSSL_LIBS" OPENSSL_CFLAGS="$OpenSSL_CFLAGS" # Detect the Qt libraries and header #################################### AC_ARG_WITH([qt], AS_HELP_STRING([--with-qt], [Select the Qt installation directory]), [ if test -d "$withval"; then _QTDIR="$withval" else AC_MSG_WARN([Qt directory '$withval' does not exist or is not a directory]) fi ], [_QTDIR="${QTDIR}"]) if test -n "${_QTDIR}" && test -d "${_QTDIR}"; then _QTDIR=`cd ${_QTDIR} && pwd` PKG_CONFIG_PATH="${_QTDIR}/lib/pkgconfig:${PKG_CONFIG_PATH}" LD_LIBRARY_PATH="${_QTDIR}/lib:${LD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="${_QTDIR}/lib:${DYLD_LIBRARY_PATH}" fi PKG_CHECK_MODULES(Qt5, [Qt5Core >= 5.0, Qt5Widgets >= 5.0], [ _QT_HOST_BINS="`pkg-config --variable=host_bins Qt5Core`" QT_MOC="${_QT_HOST_BINS}/moc" QT_UIC="${_QT_HOST_BINS}/uic" if test -n "$DARWIN"; then FRAMEDIR=`pkg-config --variable=libdir Qt5Core` Qt5_CFLAGS="$Qt5_CFLAGS -F${FRAMEDIR} -I${FRAMEDIR}/QtCore.framework/Headers -I${FRAMEDIR}/QtGui.framework/Headers -I${FRAMEDIR}/QtWdgets.framework/Headers" fi QT_VERSION=5 QT_CFLAGS="${Qt5_CFLAGS} -fPIC" QT_LIBS="${Qt5_LIBS}" ], [ PKG_CHECK_MODULES(Qt4, [QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0], [ QT_MOC="`pkg-config --variable=moc_location QtCore`" QT_UIC="`pkg-config --variable=uic_location QtCore`" if test -n "${QT_MOC}"; then _QT_HOST_BINS="`dirname ${QT_MOC}`" fi if test -n "$DARWIN"; then FRAMEDIR=`pkg-config --variable=libdir QtCore` Qt4_CFLAGS="$Qt4_CFLAGS -F${FRAMEDIR} -I${FRAMEDIR}/QtCore.framework/Headers -I${FRAMEDIR}/QtGui.framework/Headers" fi QT_VERSION=4 QT_CFLAGS="${Qt4_CFLAGS}" QT_LIBS="${Qt4_LIBS}" ], [ if test -z "$DARWIN"; then QT_LIBS=" -lQtCore -lQtGui " else QT_LIBS=" -framework QtGui -framework QtCore " fi AC_MSG_WARN([Qt pkg-config failed, using fallback defaults (${QT_LIBS})]); ]) ]) AC_SUBST([QT_CFLAGS]) AC_SUBST([QT_LIBS]) # Setup MOC UIC RCC LRELEASE with absolute PATH if test "x${QT_MOC}" = "x"; then QT_MOC="`which moc-qt${QT_VERSION} || which moc`" fi if test "x${QT_UIC}" = "x"; then QT_UIC="`which uic-qt${QT_VERSION} || which uic`" fi QT_BIN_PATH="${_QT_HOST_BINS}:$PATH" AC_PATH_PROG([QT_LRELEASEQT], [lrelease-qt${QT_VERSION}], , [$QT_BIN_PATH]) if test "x${QT_LRELEASEQT}" = "x"; then AC_PATH_PROG([QT_LRELEASE], [lrelease], [lrelease], [$QT_BIN_PATH]) else QT_LRELEASE="$QT_LRELEASEQT" fi AC_PATH_PROG([QT_RCCQT], [rcc-qt${QT_VERSION}], , [$QT_BIN_PATH]) if test "x${QT_RCCQT}" = "x"; then AC_PATH_PROG([QT_RCC], [rcc], [rcc], [$QT_BIN_PATH]) else QT_RCC="$QT_RCCQT" fi if test -n "$DARWIN"; then AC_PATH_PROG([MACDEPLOYQT], [macdeployqt], [macdeployqt], [$QT_BIN_PATH]) fi AC_SUBST([QT_MOC]) AC_SUBST([QT_UIC]) AC_SUBST([QT_LRELEASE]) AC_SUBST([QT_RCC]) # The dyn_loader library libltdl ################################## AC_CHECK_LIB(ltdl, lt_dlopen, , [ echo "ERROR: Library 'ltdl' with symbol 'lt_dlopen' not found." echo " Try installing the package 'libltdl-dev' or 'libtool'" exit 1 ]) AC_CHECK_HEADER(ltdl.h, , [ echo "ERROR: Header 'ltdl.h' not found." echo " Try installing the package 'libltdl-dev' or 'libtool'" exit 1 ]) # Finally collect the compiler flags ##################################### CXXFLAGS="${CXXFLAGS} ${OPENSSL_CFLAGS} ${QT_CFLAGS}" LIBS="${LIBS} ${OPENSSL_LIBS} ${QT_LIBS}" # Just give it a try ..... ########################## XCA_COMPILE_TEST() AX_CHECK_GNU_MAKE() # linuxdoc application detection ################################## AC_CHECK_PROGS([DOCTOOL], [linuxdoc sgml2html], [":"]) AC_SUBST([DOCTOOL]) case "$DOCTOOL" in linuxdoc) DOCTOOL="linuxdoc -B html";; sgml2html) DOCTOOL="sgml2html -s 1";; :) if test "${srcdir}" != "."; then mkdir -p doc cp ${srcdir}/doc/xca-doc.tgz doc/ fi AC_MSG_WARN(['linuxdoc' or 'sgml2html' not found, using pre-compiled documentation]) ;; esac # Setup done. Write local.h and Local.mak ############################################ AC_CONFIG_HEADERS(local.h) AC_CONFIG_LINKS(Makefile:Makefile) AC_OUTPUT([Local.mak]) xca-1.3.2/configure.w32000077500000000000000000000042531260620516400146170ustar00rootroot00000000000000#!/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 if test -x "`which osslsigncode`" && test -f "${HOME}/Christian_Hohnstaedt.p12"; then OSSLSIGN=osslsigncode 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/QtGui -I\$(QTDIR)/include/QtCore -I\$(QTDIR)/include/QtWidgets -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 UIC=uic RCC=rcc LRELEASE=lrelease endif CC=\$(CROSS)gcc LD=\$(CROSS)ld STRIP=\$(CROSS)strip WINDRES=\$(CROSS)windres SUFFIX=.exe DOCTOOL=linuxdoc -B html OSSLSIGN=$OSSLSIGN prefix= basedir= EOF cat > local.h <$@ 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)] $@" $(DOCTOOL) $< >/dev/null install: $(doc) install -m 755 -d $(destdir)$(htmldir) \ $(destdir)$(mandir)/man1 install -m 644 xca*.html $(destdir)$(htmldir) install *.1.gz $(destdir)/$(mandir)/man1 app: xca.html mkdir -p $(APPDIR)/Resources install -m 644 xca*.html $(APPDIR)/Resources xca-1.3.2/doc/xca-doc.tgz000066400000000000000000000560221260620516400151100ustar00rootroot00000000000000#5U\{sFsUEHاXgV7I^] !9+@| 0 )Z[y;3Sc˃ak/^sWy9v_^u{zvv;qb3r>ETy>u+`P_]ۏg8h9sqw:a=nz'xSO\ }qݿyx=obps=^j\xLZ n·H}uҦb,'-cVZVbb.thVlFr&ܕ9Lh %itq *ʐ&:PSqh3egy-7|!Wfax{9j]H82bwkՠQ:/!0wh~v$2p9~A"=MRu(ø%•YE~ 2Rď AXS4jD2) pCsǮAB #p@#$Z#dKXP%B5IzLe;YS`}WxHݴĿ3+7"9.ʝj3s&r,hH %~QMoP6wf)I|!6vm|W;~ }Ww!f!.AOCB=v> vwjN;sTg >n#seX{ Zl|KFqh*ITHd6 Dh_Fԡ7a#-@jƶl o_f# A[ "C}it3Yɰ*n@qlO8@9?nlq󮳋ygTZ23Zfz7 "rhW0"!@ӕDX@jPNߑ{@g!S$̄* ̊@Vve`:iK 5rN3g/X s g/6nƾ{}_ ;L3L}3M}Lny>Cؿ;4(V2gL"jRLu zK OPH>V߂ xH~KQI3[eॢv31Pwgi8jh溕쒕fSd7Lm YyO=eB&uޡ`._*!!ڹlh3*Y&| ̆p FUK-ֻB%ht:)Ahv :\9ro5_d}i# |#5bxpAi[4mG ZŻŽ B)XW o y L L?Ni7(~7Bަ<fLUr}#3U&t4{DNCq +@;|#@z\ ZXtP a% x_iE j Ѿh@Xك3Ѭ#=N E*1jOS\98Q-g w94Vs(vʷ BNl6aawi]'>ʛ[[\MrXc},c>w31NBL`FBM?94X'RcRo %81(Cbj8dK`$&"-,W\T5CG*`)s/R̜P 'O=NZ}J@l*ӶPpB%Բe\ʈ%(pl@Rr9f!)I)#I;%\2QӚ/]ɔ^¢| Ȫԭx3/j&#&Z a.Ag܌c `6ϕثp{%*KeJLr%4+ViP f)Vp8nZ8{C{cfzFbxfxAp>seA-gM'L^nXypۗanu0ABpW*~yV"~c t:LבHTvqMl_Ϧ&.M$EM܌~euq+|p3CG>޽׻GchWEoMPՀ:=$79G 8& r݇ad5XwvJ?0]CSEܐ 횭i~P8IkϟG|[R˧{݅EU٧Q*gLԟMd;؜$^,zUCKaBk Vb<X1KiJ077FJ0f L9!N?D7[vG$a]qr]t {6o[\uc4"KQƾ DayR&J}^ CRc8jZonxE76@;Ц2`"'6R|q/< Mg2汾_ˤ nVF&غ̬'hlM wȬ6X͞U\„@3Q~PmEĜBGbB!(VW IE- t)Gd1>TTc-T"a#z^*e(BWGfEXb( Kě`YK:m"NN{>`SڌnkA}U1&b&YIas&"lkFDH XbR̮[qZZVE)@bx0*U06=­/nAu&%V QHI[erbUV0MyXrxϲu= ns|}y6Woߗ|e(W &`x$Xg:ǟv+ԣ+g8,>cE <35QxƔaJ4{{ҴluQL B4'AH>k <<`QqFKE>\ND8 T@i|9P+2 'qxgTi@;F.#1r-J\NBZk9Rt+y^S) O#nܷQpf=LW}8aS(p8Tda/1r?L58W&gܑ͡jm}:`]\1O4u)b6{8 '#DgN8PLDLNXdkU6[90zɨNc*L~ %-A=mQZ[$E @t$i̚m挪,ZAf/ bZXUO\p[ jKtl6 w)|\fU հˀHY%b/eć5|tqKUע(1rMv#u[ ,]J;Jh'O@:b^3U8YI;;:w6D8'fmKg$d,~Q 0.fsjGʆυP=Krwqip6V9i lf7-R,Ү>j3@YA`Dl{,V|,KNZ5D8c2'ڧ8<=fBx{ۭ?ݒQ cj$ZO6\Lx r/{r~-naryC/(c)&c%nlƦ-e{wm upkA=҉ brߞͣ^aD8#4- 1hDf5I썞ozHcW۰ Ll&M4.ίGb: ˬ˚=@>J 9&28Vr]c @QX170sAU\3-T 0EXN>*^eM ,7l#X֊Jz6":WٍrՒbJիpH"c2q|xgtө~)­N4 EڶZި$\0sz,*ؠ}n 简zƷR3 ߺi'KݛƝb&3=- B(5YIl qF%2EXF3oc2W͎2]fd@G吸~X): `ӥf1V9Ot{L +]eРZxYa@ 8h1 7hzTY@mnW g7x3rٻ洵d>S5OlI' Y%anB",9Z;μɭctt>[MTj4eM7mbhӷR0⋦)۱26:S=wG78^VjUzTx4븨*NE)#щb/u:U= [Uκ6iw[箹|(]D>[rwR}ڌl;P=u&b:l&@S[S.􊢴T?Vq}]9מO::\Nܼ*v{|nm֚Ƶrƍ12JFk;hz\Nfd_5gcsxŒ ^\闋Yb^.Ke${a/^,mh5Wj))c'`36,X'\/eUǩjmQVVjUXWZ*}6j[SzV5yϥag/Noϛz’jtՑyYc#菝Yts˒sTR٭6' Xc]oÔj4p9:)w4vbn*/F@|e1.޹z3av7~|q[gm:"ݏߚ}r9Enn7RA^5S|U ϭWn jrmE^?zglIgF۬پכ]g )?srB${n*coG~'C/cДP|S˺JeozPj^gv<U7ΧMXqś}RHrٍT]h+/`alj/r| e<Rj߹TKհ:K}GjXW_qwѠ%.w71yvJGuq\-l?v]5>RQ;])w1B@-^7c4sZiuy7[Xn;j%NZ4Fӏi)-}ЉJϤN~Ԛ=pT+vѷ^.5s-zr| d\Y/}ԠOrdjXZِɗQ^Ɨܻ֢o$Яe]*]C~dX].=?8^`v{?-?,OL`tQ/8yY)OЁv *a.l_}H2s[F'o)wOY[b8qq\1C .py= zA2MAh;.pMD a=0B(#A=aZ7<|r+PMI㹚0#fyH(@=A3AB6VT'dd>,,(T K毝 IL B2#el6de zb]e៨$ӚX; IA_9vqka}l+gE"C"bbnhBE|K#wiT4?x`ȒȰt.3F6V8;r3;|A0tfAg9j6@LfTv\p#7]ҵHC *sIH{|Cs6h0 ,ӿW߸PjQPx4 X^N|[fC!b2Bʗ'* Avs<= PA "r{–uھ5d|%L-]4xM#%cZ>aT<5V>p`pUnfz=7C5$I$}$nX>P 7K/qn76b[}xgp2УbRMJZN$Yf׾|6y/Т;s-@ D$gx Gk䈸X IhtN15S49{P\t8}1 $!vBFS:0Of4Y!98z:ir+Y)\S!.[@QD]$fXժ=e6[wFY/j_k:iTk6l:ۖ6iP Y[ґbG@iee-S6AҴ :VfD f˖Fð:F_[Z TTn}jbMhK@cVLкuŔ]ݲtU6, \֡EYӛ6"ؠk0e(\7 lfh' Odk~ubOxB!x(R->E,E`J7@Zawm]Zed条7޲X]K?l*R>]@Am4mh5%8Á*G^-q[M*eRDtDz$l1hh^U K?Ӱ)fkz>f MlT$|g`yaz˄H8isc6BbP߳{(/ac4sE36pg!:>Q=nMUCxh,KX9V >l0BD9cz߸6ovC} ףۊ"I1qT+ = ЄPNяE78"5TWMO:W^??_ (_'yT jOP䭤OQ*5$Jf$*]+8q, ̝ \(a-vd lьÜUʳi %ը+ih *ԎKN)b蓆%B".bruR9Q>B) : r8ANHa'$xW &0$@5z"SR /fY/Y|74FZ8xҘX̗Lb)IJ)N1l(ePa.`veQɂ^E0!1 =Sp,.Lp?ҸPWn!C0ga* z\>\Q,CQT_6I'AF0mפc#@ϙ$<(N|E]R[{@++Q2(_xn2ICYM!Z̓58~vIĺG5c0H砱L;Z CMmEpy/&E":1#Y.aNÍYKbK/mݛ74,Y/P D =O-Jeؗ$-=u 0gINYsñ`,XRZ̋|OHSw/w;ÿoh,I6]/|&p<\mfE\4W1̚ BgNWP(ڛI֨D&=;e|Ox`b@*Zl5Dن\q(! )T>,i! L+@@+#f.3Gȅ wUROwjD^.4Hg^L,DʍuyRg'7k:L2ga_iِ@Bo<`|O7OǠ|Y#+0Ier'Eq%)Bx?[TZ稳9KC% S+3L=o??i+7lcW,+%0!'eW>XGGMzGtu[rMzxDdnݟvb l g j'HuHM.6k|/E0ӯ0~V8C~? SoC%)P- eiW/Dr:Lly$ {_D0/LnޝJhVwKُGs  Sg1KkHV#0㈨ W]) xi 9@Hk|aw CG~1ǢfnĴ+ -,lA?7{3P8P$t7D?)E2)͹)qpzچ#'Ou#u"-Qv:mo|Q-\3F. YFCAO!&>a_0^[\"-ҭ~ɗZLnX%ά)La Li9;8%-ѲWp 0D)_'r269$eE)Y (БL$ a)ȯ ZΊ:o,a`z>_rqD TtEf=B.E 3q$e | r㘋Ff#41y9hʤɍ:wnl%H"V"saj@ dEnxrz/ъ,y\#{21rCiH idB!EqՂ>"> i0p(ʜyņ5~ w$/1"@Ӽ+初z|?q8:;P)|Pj6v@>@8sl$ݻ*e.ak"041e7hIvȞ|8L=ݔMǴ_bI;+Cy9{ 3(yT*RbSc]JK wQRh58vbZ%:C(QKC3 !4}z^!'qoxyR Ol x :ep|&ǗIxrwmI2$%z "bˆ%or=#r$LqxҲ]3w,rĒSӏz 4P24jFqqt`{nلP$< \iJ-KYd_i{0-( Q`.c"!?)%!8$ǎN[ɺM7KN@8oI#\ ؀ זHS1gH 8 A(AG #m8+!Brʂ.@Ͳiaۖ~p_7 @,9Ż3̬.G 1 v)C+]1+& *5C zF/L#U.][xAC)Zt󑰽j[Xcn"zǼp,>oLϑ-ce~ q|d_غ%23:_ 4cr}4Xo|\Kc6Kճ :$\$sr$3k.w+ 0^p"-SDF0 $TcjroKXin?m谴;]@@VHLl!&B!}.K0G`"FY̾ fTbܐZ\WZO!]-saf|\G PQZ! 'pXxB Zf1IVĚ$u#c+>9jRi),EǠn8T7S84mx-fW~Z6tq)t4\in$ (hθ7V:lcTd5kd<I'%=N-24ܕP1?r8\|K_c)GH$R-cS?璓j(U-:{oU¾ 䰨 ^qZn\ (^l"҃*Wk~3/y(>3RzCt)}ieI\ֆFIA 0gX~ ^n'd`-ll D:6ESbL { Lч ^Q0AU0[/[U}=ہOF'25:)%:)S?R%$vg= -(pi \/V x\˳k[[iz/v=7]x2qi(h(Ƹkz<¢ ,z+],]xg[ O#h{RC*k͢ItfUqEvdr'[H0) j &r B$ta$tA*+{G 3/?)PN ʄh<&G hϥ 9xɁЪ$m˰G.nEP{ xQF`]d ܗGAjY>z ˜yEZiWW2^Đ>0]]A $הe63[C~ʟsw̏+"Rkj:[ڻ_L-4GǍESk \aXSKZ-P_1+AF%zr6.+Au{; D='!5kX\cCPAܢ,H|/ڮhKW1'HU.xCoɇ(P'r̈#oc@,Pq͹ Ȑ.X@ҭ (h8@,bʅ6^c0-)j\TZçI=1{b"p IĵgV)5+-J>Un7Tnc[ U'rA0P[gglgߨCqeQ@ey1L)$6$w1a0"y/e `k(ݺ.N *sݜT=3u|.T^n?N+9N +m%նٙg+QdĿS`'h=NUh֤g;yC?6$8kfgtmPSx+=֝~ovͿ{A!\c$?O`gO4ؚ-CMYC?<==(h9]X]ۯ2`o8ul cG9z} ϟ,aйn^KeLq:c?$㠕[-Wg&-:^:;D=tgBBP B C胦0$տ ֈG?!Б`E3Iq;NX q P$T ,=5N CK 8Q1p~oyeתWMM#bȐ-Q9?Cqv}Cwiy19,|X;5b6fz"# W;BEF*y-\tjO6_#C2:\ 8XY)n'=(V$}RF- 3)=T^Bu",~PJP N (I+lP~` z+>.FshYp7K7T6>!@z;_EF'wqs:cwSrٚnqϡd֚@&Uyt1(̻/[tY9t0fVvxUyw(QGA- ͰaTz-k%d1ۦQLEg+bKM{r^r\{9]Vلog@_豹#BXb ut~"_ Ok0R?;@zRdtOBjٴ#U xCB\uWsĘ=xw9읤Xx /_QhC&\ư-F'؛wFU25f<.+<(tX/f(swv.hfјM<CReC8ΈYư.L:f2foGwrus =\ W#xԷ4)mt}w48 ,SSvVd x@[`XpN%.d[ ?kbYKqGI0J@L2 +ŌCGc,h'P.&PBHuZгczB o! y-d[ZM'x n" \د0<2t" - NT7$7Ve{Dj.nj,=߅wRcR,ׅ^m];JJ'. `]$Un6sЇ}>o O7eaXS ! H̒դGh~ SZ6S?{Ŀ\%):|FC$j~kFtQn3+Jj>)B8kي$~]RFȸPq0|/ `bvdOYq4S PW Bvg5X@ -.+Jh\g˹dI WXQ.!aڂ P& Ӈ=l)'"WvK6:9O|[ME&M P_ĬtYĜn78rՇLE $f(06 "ぬ|}sFp*A{fbB_l%oS6lFUچ~9CBS{iژܻ:298 o^v=Up(FT tcL(OJ1 \9wo!O1Ʃ=v^N~ج{x4-˖,UTSYW4"FIAtډv>KБCZ.NGh+ׅjuM\t5gHzyS1=#gW݄:2|N.J\UvFo ɺ;~Err ̅Cօv('Tl'6 #×^ uEKZuNFpԬ(ø4B[c"&"ݼ|zKHDc.áwm;yr!f+EļGG8`wF 5-aL{1 f/ 9ڢz,3 +CXCG Fy^OCM5Y8tkR/!-6y2]t+ H%sjs#TJX~Qtiqf-Z{UYcj%ЙM7{iɥǼbF+}w\2q~,}$cL6u-M,ai "OU-l0N77/jD?2&G46Cp;IڨQK,a Y6gUu=?w$ h Dve&.lju aʛ J6}{V?O?'3́,K[L`e5'AK0a:( GKThxGvQa~u ί] Xi>iJW1Zbƻ(%t>78ݶ*"5 Xr&+DM@S^/(sT Yl{ (WqASd`6 )UizB*CjfD6H0|= qP^U6bsXIk4L5?s]N;vIʹ(k*eY'C%$0 RZ d9)c "I-;pxBBpqN0Ea OP* E =7\>iL4!t^Fz1Y^Bp?|Ak@Gdi@!R,@s$31 YsuIJ6gv .薪 BT00&M:yָ`[AX@cK ~@.n1!*h X9 L)HWeևϙ7{ 8LpH:Y 2V&o#r%O 1kM ࠈ{ aT&O]tXbŗڭxvzNn9ICql{`o-'L! 9U> [BǤ|7.l2)SF݀⣛3 gk,y|@Iv^ &uАϭas=W΁54%Ή)%MXq߻W0?aٰ J-Sd^~۬AGh[PQ3.*-oõyYBnA5I ?l0'Wô# w SnxJtV?psi~ڼHcJn,vאX~ Lv_fk5)~.˻3V9l'oblH6 ^p~[%lYtڦ'O3rs[  K3>w"0 ,hQ%ȿ=C?Ym<{,4WSfIR_g't6;j;x5+퀣j^3[̀@}V=s`k s(V8;.ӗDzK`\ g _rK'r԰٨7&68iY*NTwN 8r:RłR aj gya>-+`Oc4;brB*#]h`;6Ǜ٪L$;x?0b p{fM0_Z1HDQn0KTr _.Tz ɇlutRzf6Ca`n CNX!c9fm~C]}LTB>bw.6Ly~Ɯ/M0dmm/e 1R_`Tݲ49ĹxCșx1!(Vʝ: umR|xLw죢zN9VZ Aj)=' Ai*51W@"qXmERvԦaWV@]Ƨ#$O >QXe.A#BG>=buUez4a5*eTa@&']EjˀetRm(H]SGȢ9q}6} [(V zutW;({ձ)4Pmlƞ5k̍s~U%bS;‘2i`j䍀0kbaaa[tCl |p u0XEz}3*TpKw'|ڽK_t+uM]/쇂O,P*ta(=!LPeBNx?Ԟ;8dmg[ckS>+Xtx~*<>[CĐ#ЉO`>c u2+4F]{C.:{k0vU{sf-47Z:z6 c,e<6vݔjRcQcn؋&+_s(.DS%_efN ~a6x#8!4ȮzBXC8L}%pKaJj7:H}+~娷ym7nm7bg8#PrN,1=]H sI$1ZLqkQ?8עz>+AY~&sAI҈I:5Wn$* ZsIEI6%r5)g$`N,IiF[/f7:$q¨/~Lg{|9BɄb۷(iP)]o+EǴb ;*C_VMjNm58-ܜ9[l. jQg0'Y6|ssvF=eFMA, QH5mR;/լ/ci/ _^AԔ((1 xqQrc{ uu_.!& K[xyn6vAN>wS]R^Nao$i+Qhr[À@BP !‡V_N32b'Y \"Ax!(> UPJhpUwIՃ,' W(LH%In/6$!ޢ ǻܻWx ? 4'63/𾘇 Ϳֵ!쌌 `i1Ú@7FpJs&7ZWpOS8fLLNshbOetpc]"ʾ bE1qfR=و'(CDؒѕ*UE}9Q=,FV3c}*xb ><=piy>K;:$U7m1kq{$dQc~Ϗc> ϟ*%GhExH"|Bbk4%jsv X~Vfˇɷ$>Y>Xcg(,ACb<># OK!3oM BE(~遽ty wj[k)PKPM&[õõL)pvRqZF`ݫO*_"> 6ue9OGFfˇ|b'/I4[OWa kIqH+hzEf,HW\NF󲲕4V#- tp@/y9^Ĥ!^G+jR=$Vrcj/ A2Z#4B)M4XQN\tDz<&-FĔ*@y@|DhYL 2l 66y?~@ۛ 0_MUԝ~og+8/Dp HdԁG|!)gl?j^0iؼe؄¶z)䰎. `76]#69-'sPV2M.-z!Њ,KLb4br8k3ab4{`b{@lmcHCrbދA &/~"l~ٓcr9wރ=&iVrΫE6f<03bլ-ƚsX)bz+K6$tj5C,BN@# }`Q($,M+qW}l&SkDp5ц<dNMjE6gdCF&٘شHgאv]Ƅ s.5b !ت͆(jM-F!Uk}Qk&[#$c5z .MtZ;F؉fbwZb@-*y|̳(I}N9kI!Euô bLG%UV1V D|$>*BuC-k";D15V53|ZWTGc ?ʉo΋.<}Dׇi|&bn'VNF!lͣAyVXTUQú0TEm"°AVgEVI~NH.0^Ң*Džyry@e5 #'V1NT`uS3xyK1}Qү 6 {4[^PGukL> r^UlzQ9Gx'{Mz^K^^/*ĘgMYz\q{H5~4ս 9CAb|_WnTQսoUejG=B鷫{X .RI .RI .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 revocation 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. .TP .B xca extract extracts the item with internal name .I and the type .I cert .I req or .I crl from the database .I database in PEM format to .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-1.3.2/doc/xca.sgml000066400000000000000000001646621260620516400145150ustar00rootroot00000000000000
XCA - X Certificate and key management <author>(c) by Christian Hohnstädt, <tt>christian@hohnstaedt.de</tt> <date>August 2015 - Version 1.3.1 <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 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 test certificates or if all private keys are on security 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 (as long as the columns are not reordered by the user). <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 - 2015 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 </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. <p> <sect1>Extracting items <p> On the command line xca may be called with the first argument "extract". <tt>xca extract <database> <type> <name></tt> extracts the item with internal name <name> and the type <tt>cert</tt> <tt>req</tt> or <tt>crl</tt> from the database in PEM format to <STDOUT> <p> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <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, SSH public 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 may 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>_1</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. Certificate signing requests can be deleted when they got signed, because they are not needed anymore. The request can be recovered from the resulting certificate by transforming 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. <sect1>Searching Items <p> The displayed list of items can be reduced by the search-input at the bottom right. It affects all tabs. It does not only search inside the displayed columns but the whole content of the items. It searches the internal name, issuer, subject, extensions, PKCS#10 attributes and token provider. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <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, you may opt to use SHA1. The default signing algorithm may be selected by the <em>Options</em> menu. <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. Alternatively the subject-alternative-name extension may be used to define additional DNS names, even wildcards. In this case the CommonName must be repeated here, because Web servers disregard the CommonName in case ithe subject-alternative-name extension exists. 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. <p> The list of the 7 explicit distinguished name entries may be adjusted in the options dialog at <ref id="expDN" name="Explicit subject entries"> <p> <sect2>Private Key <p> Keys can be generated here "on the fly" 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 three 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. When applying time ranges, the expiry date (not after) is calculated by taking the currently configured start date (not before) and adding the 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> Adding more than one AuthorityInfoAccess entry is also possible here: <tscreen><verb> authorityInfoAccess=@aia_sect [aia_sect] OCSP;URI.1=http://www.some.responder.org/ OCSP;URI.2=http://www.some.other-responder.org/ caIssuers;URI.3=http://server.whatever.org/cert-path caIssuers;URI.4=ldap://server.whatever.org/xxx,yyy </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. Up to version 1.0.0 only RSA keys on security tokens were supported. Since version 1.1.0 XCA also supports EC and DSA private keys on security tokens. <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. The ECC token support was tested with the www.cardcontact.de ECC tokens. The OpenDNSSEC SoftHSMv2 was used as PKCS#11 reference implementation to test all the token algorithms and certificate and key download functionality to the token. <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 to be used by XCA. 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. If the Card reader supports a secure PIN input by a builtin keyboard, it will be used by XCA and it will not ask for the PIN but waits for the Pin-pad input. 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, sign imported certificate requests or generate CRLs <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 <item>www.cardcontact.de OpenSC branch supports RSA and EC Keys. Downloading keys to the token is not supported. <item>OpenDNSSEC SoftHSMv2 supports all mechanisms in software. A great reference to test the PKCS#11 library interface. </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 key. 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. When creating new requests or certificates the list of available keys is reduced to the keys with a use counter of 0. This can be overridden by the checkbox next to the key list. <p> When importing an EC key with explicit curve parameters, the corresponding curve OID is searched and set if found. <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 and many others. <p> EC Brainpool curves are also supported when linking with OpenSSL 1.0.2. <p> 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> When checking the <tt>Remember as default</tt> box, the settings (Key-type, key-size or EC curve) will be remembered and preset for the next key generation dialog. This option is not available when generating token keys. <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. <p> In case of EC keys generated on a token, the list of possible curves is restricted based on informations provided by the token (Key size and FP/F2M). The token may support even less ECParameters / OIDs. When selecting an EC curve not supported by the token an error will occure. Please consult the documentation of the provider of the PKCS#11 library. <sect1>Key Export <p> Keys can be exported by either selecting the key and pressing <em>Export</em> or by using the context-menu. It may be chosen to export the key to the clipboard as PEM public, SSH2 public or unencrypted PEM private format. In case of a file export a dialogbox opens where next to the filename one of the following formats may be selected: <itemize> <item><bf>PEM public</bf> the public part of the key in PEM format <item><bf>DER public</bf> the public part of the key in DER format <item><bf>SSH2 public</bf> the public part of the key in SSH2 format <item><bf>PEM private</bf> the private key unencrypt in PEM format <item><bf>PKCS#8 encrypted</bf> the encrypted private key in PKCS#8 format <item><bf>DER private</bf> the private key in binary DER format <item><bf>PEM encrypted</bf> the private key in PEM format with an OpenSSL specific extensions for encryption <item><bf>PKCS#8 unencrypted</bf> the private key unencrypted in PKCS#8 format </itemize> The filename is the internal name plus a <tt>pem</tt>, <tt>der</tt>, <tt>pk8</tt> or <tt>pub</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 without knowing the private key. This includes personal information, they 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. <p> It is not necessary to generate a request prior to signing it by your CA or before self-signing it. Simply start generating the certificate directly. People using the OpenSSL command line tools, are used to generate a request with "openssl req -new ..." and then signing it . This is not necessary with XCA. <p> <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> Writes all selected requests in PEM format to the Clipboard. <item><bf>File</bf> Write the request into a file in PEM or DER format. <item><bf>OpenSSL config</bf> Create and store an OpenSSL config file which can be used to generate a similar request with openssl (openssl req -new -config <file>) </itemize> <sect1>Request Transformation <p> A request transformation creates a new database entry based on the selected request <itemize> <item><bf>Template</bf> Create a XCA template with the values of the request. <item><bf>Public Key</bf> Extract the public key from the request and store it in the Private Keys Tab. <item><bf>Similar Request</bf> Starts the Certificate input dialog preset with all values from the current request to create a new request. </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 all selected certificates to the 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>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>OpenSSL config</bf> Create an OpenSSL config file from the content 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 Transformation <p> A certificate transformation creates a new database entry based on the selected certificate. <itemize> <item><bf>Public Key</bf> Extract the public key from the certificate and store it in the Private Keys Tab. <item><bf>Request</bf> Create a PKCS#10 request by using the data from the certificate. The private key of the certificate must be available for this option. <item><bf>Similar Certificate</bf> Starts the Certificate input dialog preset with all values from the current certificate to create a new certificate. <item><bf>Template</bf> Create a XCA template with the values of the request. </itemize> <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 and reason will be stored with the CA certificate. If more than one unrevoked certificate of the same issuer is selected, all of them will be revoked at once with the same revocation date and reason. The context menu shows this by adding the number of selected certificates in squared brackets. <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. Use the <tt>Revoke old certificate</tt> checkbox to automatically revoke the old certificate. If more than one certificate of the same issuer is selected, all of them will be renewed at once with the same validity dates. The context menu shows this by adding the number of selected certificates in squared brackets. <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. <item><bf>Manage revocations</bf> Displays all revocations and allows to manipulate them. </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. </itemize> <sect2>Manage revocations <p> Non existing certificates may be revoked by adding the serial number of the certificate. Since version 1.3.0 it is not required anymore to keep revoked certificates in the database, because the revocation information is stored together with the CA certificate. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <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>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>Translate established x509 terms <p> It is usually more clear to read "commonName" instead of e.g (german) "Allgemeine Bezeichnung". Same is true for "Extended key usage" or "Basic constraints". With this setting the translated terms are shown and the ToolTip of the entry shows the established term. If not set, the established term will be displayed and the ToolTip contains the translation. <p> <sect1>Only use hashes supported by the token when signing with a token key <p> The PKCS#11 token does probably not support all possible hashes for a signature operation. I.e. the EC and DSA signing algorithms are currently only defined with SHA1 in the PKCS#11 specification. XCA does the hashing part of the digital signature in software outside the token and uses the token to sign the hash. That's why XCA may use additional hashing algorithms like ecdsaWithSha256. If other applications that probably use the token hashing algorithms shall use the token, this option should be set. <p> <sect1>Disable legacy Netscape extensions <p> With this option set the input and use of the legacy Netscape extensions will be suppressed. The certificate input dialog has no Netscape tab, the request and certificate columns don't show the Netscape extensions and when applying a template or converting certificates, the Netscape extensions are removed. However, the details of certificates and requests still show the netscape extensions if they exist. <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>Explicit subject entries<label id="expDN"> <p> This list may be used to change the list of the usual 7 distinguished name entries shown in the subject tab of the Certificate / Request / Template generation dialog to better fit ones needs. <p> <sect1>PKCS#11 provider <p> Here you can select the path to one or more PKCS#11 libraries on your system. If the list is empty, the <tt>Token</tt> menu will be unavailable. <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <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. Alternatively, you may export an existing Certificate or Certificate signing request to a template by the Export-context menu of the item. </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-1.3.2/doc/xca_db_stat.1�������������������������������������������������������������������������0000664�0000000�0000000�00000002335�12606205164�0015377�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.TH XCA_DB_STAT 1 .SH NAME xca_db_stat \- XCA database analyse tool .br A small application to display the contents of an XCA database .SH SYNOPSIS .B xca_db_stat <database name> .br .B xca_db_stat .RI [ -h / --help ] .br .SH "DESCRIPTION" This tool reads an XCA database and dumps the meta data of the different chunks.The XCA database is actually only a collection of different chunks containing keys, certificates, certificate signing requests, templates and CRLs. Each chunk is prefixed by a header containing a magic, the total length, the version of the chunk, the PKI type and the internal name. How to read the contents of a chunk depends on the type and the version. .br .br The header format is: .br typedef struct { .br uint32_t magic; /* 0xcadb1969 */ .br uint32_t len; /* length of this entry */ .br uint16_t headver; /* Header version, currently 1 */ .br uint16_t type; /* PKI type */ .br uint16_t version; /* version of the chunk */ .br uint16_t flags; /* deleted(1) outdated(2) */ .br char name[80]; /* name of the entry */ .br } db_header_t ; .SH AUTHOR This manual page was written by Christian Hohnstaedt <christian@hohnstaedt.de> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/img/��������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12606205164�0013046�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/img/.gitignore����������������������������������������������������������������������������0000664�0000000�0000000�00000000022�12606205164�0015030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������img.rc imgres.cpp ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/img/Makefile������������������������������������������������������������������������������0000664�0000000�0000000�00000001377�12606205164�0014516�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-1.3.2/img/bigcert.bmp���������������������������������������������������������������������������0000664�0000000�0000000�00000065772�12606205164�0015206�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMk������6���(���y���9���� �����k�� �� �������������R���8�������(��i��)\_���m���w���5�����@Y^��G���j��-�����1�������������� ����/��C��CXYWW��]��I���l7_��!���:��$fcba_[XW VV VX^��'��^_��A���c���KX WY[\]]]][X��]��G�����4��O^]_��G������(��4 YX""`&&b,,g--g//h00i))eXY��^`�� ��A_��]]]^��@�� V[$$a44k<<q==q<<p::o55l\V��^^��,���"��8_ZW WY��[��P��M\^^!!`##a""a""`&&b]W[��^Q���Z��E]Z Z_]Y[Q�����>^ZXWWV U UUV[��^��Y�� ��{��Y[ \""f22n""e \Y[W����� 9\^]X U TTUUVZ��^Z��rrr&��?��^[b<<vCCz..l^ZY��^��Q��t�� G]]][XV UUVVY��^T����@^[^00pIILL,,l`\ ZY]����MYZ[ZXW UUUVZ`��I�������I��][ f::wSSII++lc`\ Y��]��,���b��#YTWW V TUVVVV[��\��9������>]`++p//sII88w,,n##hc_[W\����&YUUUWY W WVX^��b��/�����G���J���������������|OjpRnpUpoqz~mmkjlrytzLddH__Mff ���B���;��76*S^!!m**n$$ifc]X]��Irrs&��1\YWXVWY��[��^��\��I��4�����@���0���f������""EVV҄ףɰF\\���M���t����� Pbcc[Y��]��<�� ��_][��\[��[��^]��^��C�����n���%���"������S������$$oٟ���������!c^YZ��]��>���,���8���C���z���u�����J]^^^]a��K�������������������IbbYvvh}rc���#���H��$[Y��]`��$������c %*���q v',(->R[JcoJcnqh?U_!.3��b^^^^`5.=9Wttj~¼ųӸEUUh���[��)`^`��%���.=B٣ɬ#/2o��T��^^^]��]��^jj4;9P__!((h}}씴""""v�����8��^`��&���}m ,9��[^^^b&6<r(,.T``Zhh199]mmr)008BB ~,665AAx�����_`����^^^^��J6EB쪵훦찾쯾쭻oy����Y째즸즸즸쫼맹`ll󧻻gss7??^jj.44gxx ,44u���L��:`+o_~Tpur��6^^]�b.9I綠Xef>GG쭼wfmm]cc599qxx򮷷@CCZ``>CC문쩶쨵짴즴쩷^f{��t~u񥴴줴죴죴죵좵좶맼KTT릹U__>FF$))~Wff).Orrr&��a 0e?TXOio*8;=RU9LPUkn��Q^^^��2򛱲𛭯-//hppmtt 699aff.11{JNN\bbMRRioo󏘘HMM|GKKQUUMRR y쥰죯졭졫졫젫좭')%MRS렫젫죮렫젬젭졭hoo}𡰰띬줵맸랯죶렵죺��_ :PkpYw}d)5Ha]^��]!;AAaii:>>CFF%''~來<??<@@ovvFJJKPPOUU��� $&&ouuOTTINN:>>MRR뤭롫렪젪졩졪졪졪똠TXX롩좫y잦쓜퉒/22쥯.11젮젯졶줾��]<<QU˷G_d-=@���BX]7`^^��Yalu󓢢쑞쒝U[[󖟟JNNinngmm488쎖ퟧ죬썕244Z^^􆌌좨쩯맭옝쇌cgg󥬬뢫롩젩짰맰롪렩젩졪롪롩졪졫뛥(++bjjvXbb~𣹹졶젴젵졷죿$$��Z��6{샯"$狺󇵾"#;OR7��^^^Wy된jrr~IMM+..#$$[``W[[v{{DGG졨렧렧럤녉;==PRR쟤졧졨좩좪좫짰nssekk[^^)++(EW\W젩졪졪졪졩졪졪면몸ꪺꤵ룷륻}""�� ]��D^~1ADAWZ���9LP񖺹��9Y��\^U~쑜딟&))233 .00| |svv𞣣뜡유줩+,,011뜡읡읡잢쟣젥젦죩뒗X[[􍒒rvv������e`eb󢫫렩졪졪졪졪졩졩졪졫졮젳젶죺쥿 �� ]��W#00$&Mgl`wv��:WW��^V~쓛얝앛쑗혝쏓횠뚠뜠뙝유뚞엛욞뚞욞욞돒Y[[󉋋훟뜠유읡읡읡육읢잢젥뤩뤫룪 ��r����h롪졪졪졪졪졪졩졪졫졭족뢹렼|𚷷$$�� ]\7A>L] V^:앝앞덕씝드쒛쒛쓜씜씜앜앜얜얜엜엜엜엝뛡똝뗝옝옝왞왝욞웟웟웟욠욡읣럥쓘WZS:=; @"$!졪졪젩젩젩줭럨ntmbh_bi`bi`GNL %F =������8:E>���]��Zb�� ���Plq(+ T$$b W _4~쏜쏛luu푝둝된쐝쐜됛쑜쑞뒞둞둞둞뒞득앞땝얜엜얛앚얛쑖왞둗엜쓖얚쎓픜쉑홢렦먮즭쥭죫좫좪lrr�� �������z���4����V`��.����<)+���a b++gY ^4~쐞쏞쎝don񘨩ꈖq~~GOO*./Xaa{q|}6;;NUV􏜜,./!""X]]$&&v{{%&&VYYORR799nrrbff!!핞땟땟웤쟧좪쥭짮죩��Y��^{}p�=��`�jSe| ����V_��5���!�������� ���G "-/4 d//hY ^4쏢쑣LVVVaa.55ISSyNXXt=DD_kkbmmZdd&**|���~-22doo"&&?FF:AA399juu266"$$|GLL)++VZ[Y_^󏖖씞듞쒞씟엢웥짰hnl�3u,h��U������bc|}p�������V^��O���/������������������������ 񇥥D((f--hY ]4}썠쎡쎡뎡annbppz&,,.55ess-33DMMU``t.33���XddS]]*00U``;CC\ggZddjvw]hh򎛛 T\\󕡡뒝드쓝쓝쑝쒞돜BGO=e+J7j|Z����V^��Y��L������������������������=QTBQVX++g,,gY]3|쎡썠쎢덠둤Wbb󑤤NXX6==Zff\gg-33MXX,22Q]]uZff򐣣{jxx}폢뀑퉛쏣yMWWVbb󊛛쌝쏠됟쑟쑞쑜옣RXUK���cv}���")5{N��d(55���4��g��O]��\���������������������� ++f''d++gY]8퍡쎠쏢uiww7??R\\󓧧듧덠돣둤듧됣딨됣됢둢뒢z둡됡쑡쐡쑡쐡쐡쏠쓥.44돡돡쏡쏡쏡쏠쐟\fc��0����8(��MzK?l4" �5����X��������?_^��������������������/jt� 11m `00jY\ @쎧덤덤눝',,7AAdttfuu񒧧됤됤됤됤됤됣둢돡돡땦5::될될둠쒡쑡쒡쒡쑡쒡dnnYbb󑡡둡쑡쐡쏠쎠쒥s�� zAWF�� k��  sgART�����+`^��?���u�����������4���<JPT..j^77nX]𞾾祿良什悔塚屮塚퐡쑡쑡둡둡땤녓푡둡쒠쒠쒠쒡vYP��xEdZL��ikP��/ZqjF]]���H�� a]��a��:��� ����ۦ̶ (G99t&&e]77n W��@Ysq𨹹𞮮𙪪핧앧앧듥뒤쒣쒢쑡엧}N:KgsL^E��J}�[��b}vl�����?]]_������@;;s``..jX��'𨽽𢵵젶띴뚱옭옮#E�� dCH|vM���� N_��Z�� Mgk==s))g[##b_^&1𓤤wYdd\ggsjzz]ppZppZrrZttZuvVsvZuvYtvYtv[vx[vvWrsa~댣!'7��z����8@zOrj= ��!,,�����A�� !շm22o66p]Y^Y��G.73DMM',,���������Y���&��� ���������"���"���"���"���"���"���"���"rrr&D������>���9MQ憴똲7@m����ZlXM�>����8���n$13d%>>v$$dZYZ��\�����f V &'덨<��`m����6CE!,,���6���n/?Bޮa'++j..k\ W[��W����2������J���e���~!"E]`o잿;������T��J��JCNcbCUU���_���u!"��[$$e[ZW��?�����0���C���AW\ݫ ����~+6d������x釴Xv|*, n�������8:9:���� ���,&(|5GIrrr& hirMfk���o���@������������������**iקQll���F���m���ҹ���������U'45Ց#.0���5���5���^}���3���$24u���g������<���������xca-1.3.2/img/bigcert.png���������������������������������������������������������������������������0000664�0000000�0000000�00000047523�12606205164�0015206�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-1.3.2/img/bigcrl.png����������������������������������������������������������������������������0000664�0000000�0000000�00000036624�12606205164�0015031�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-1.3.2/img/bigcsr.png����������������������������������������������������������������������������0000664�0000000�0000000�00000044705�12606205164�0015037�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-1.3.2/img/bigkey.png����������������������������������������������������������������������������0000664�0000000�0000000�00000010075�12606205164�0015031�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-1.3.2/img/bigscard.png��������������������������������������������������������������������������0000664�0000000�0000000�00000025341�12606205164�0015337�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-1.3.2/img/bigtemp.png���������������������������������������������������������������������������0000664�0000000�0000000�00000036167�12606205164�0015220�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-1.3.2/img/crl.png�������������������������������������������������������������������������������0000664�0000000�0000000�00000002616�12606205164�0014341�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-1.3.2/img/done.png������������������������������������������������������������������������������0000664�0000000�0000000�00000001367�12606205164�0014510�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-1.3.2/img/halfkey.png���������������������������������������������������������������������������0000664�0000000�0000000�00000003747�12606205164�0015212�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-1.3.2/img/imgres.rcc����������������������������������������������������������������������������0000664�0000000�0000000�00000001327�12606205164�0015030�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-1.3.2/img/invalidcert.png�����������������������������������������������������������������������0000664�0000000�0000000�00000003466�12606205164�0016071�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-1.3.2/img/invalidcertkey.png��������������������������������������������������������������������0000664�0000000�0000000�00000003750�12606205164�0016576�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-1.3.2/img/key.ico�������������������������������������������������������������������������������0000664�0000000�0000000�00000041076�12606205164�0014342�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-1.3.2/img/key.png�������������������������������������������������������������������������������0000664�0000000�0000000�00000002767�12606205164�0014360�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-1.3.2/img/key.xpm�������������������������������������������������������������������������������0000664�0000000�0000000�00000027423�12606205164�0014374�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-1.3.2/img/netscape.png��������������������������������������������������������������������������0000664�0000000�0000000�00000046575�12606205164�0015377�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-1.3.2/img/req.png�������������������������������������������������������������������������������0000664�0000000�0000000�00000003244�12606205164�0014346�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-1.3.2/img/reqkey.png����������������������������������������������������������������������������0000664�0000000�0000000�00000003566�12606205164�0015066�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-1.3.2/img/revoked.png���������������������������������������������������������������������������0000664�0000000�0000000�00000012116�12606205164�0015214�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-1.3.2/img/scard.png�����������������������������������������������������������������������������0000664�0000000�0000000�00000002146�12606205164�0014653�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-1.3.2/img/spki.png������������������������������������������������������������������������������0000664�0000000�0000000�00000002617�12606205164�0014530�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-1.3.2/img/template.png��������������������������������������������������������������������������0000664�0000000�0000000�00000003025�12606205164�0015367�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-1.3.2/img/validcert.png�������������������������������������������������������������������������0000664�0000000�0000000�00000003333�12606205164�0015533�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-1.3.2/img/validcertkey.png����������������������������������������������������������������������0000664�0000000�0000000�00000003657�12606205164�0016255�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-1.3.2/img/w32res.rc�����������������������������������������������������������������������������0000664�0000000�0000000�00000000157�12606205164�0014524�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-1.3.2/img/warn.png������������������������������������������������������������������������������0000664�0000000�0000000�00000002216�12606205164�0014524�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-1.3.2/img/xca-32x32.xpm�������������������������������������������������������������������������0000664�0000000�0000000�00000010031�12606205164�0015121�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-1.3.2/img/xca-mac-icon.icns���������������������������������������������������������������������0000664�0000000�0000000�00000147446�12606205164�0016203�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-1.3.2/img/xca.ico�������������������������������������������������������������������������������0000664�0000000�0000000�00000004276�12606205164�0014326�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-1.3.2/img/xdb.ico�������������������������������������������������������������������������������0000664�0000000�0000000�00000010276�12606205164�0014325�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-1.3.2/lang/�������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12606205164�0013213�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lang/.gitignore���������������������������������������������������������������������������0000664�0000000�0000000�00000000005�12606205164�0015176�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������*.qm ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lang/Makefile�����������������������������������������������������������������������������0000664�0000000�0000000�00000001477�12606205164�0014664�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ifeq ($(TOPDIR),) TOPDIR=.. BUILD=.. endif include $(TOPDIR)/Rules.mak PO_LANGUAGES=es tr fr LANGUAGES=de ru hr $(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)$(xca_prefix) install -m 644 $(QM_XCA) $(destdir)$(xca_prefix) 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-1.3.2/lang/es.po��������������������������������������������������������������������������������0000664�0000000�0000000�00000141073�12606205164�0014170�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 "Revocation 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 "Revocation details" msgstr "" #: Revoke#2 msgid "Invalid since" msgstr "" #: Revoke#3 msgid "Revocation 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 revocation 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 "Revocation 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 revocation list '%1'" msgstr "" #: pki_crl#2 msgid "Delete the revocation list '%1'?" msgstr "" #: pki_crl#3 msgid "Successfully created the revocation list '%1'" msgstr "" #: pki_crl#4 msgid "Delete the %1 revocation lists: %2?" msgstr "" #: pki_crl#5 msgid "" "Unable to load the revocation 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-1.3.2/lang/fr.po��������������������������������������������������������������������������������0000664�0000000�0000000�00000230673�12606205164�0014175�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # demonipuch <Unknown>, 2012, 2014, 2015. # Patrick Monnerat <pm@datasphere.ch>, 2011, 2015. # msgid "" msgstr "" "Project-Id-Version: xca 0.9.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-19 13:24+0200\n" "PO-Revision-Date: 2015-05-19 15:20+0200\n" "Last-Translator: Patrick Monnerat <pm@datasphere.ch>\n" "Language-Team: French <>\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Gtranslator 2.91.6\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: About#1 msgid "Done" msgstr "Terminé" #: 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 msgid "SHA256" msgstr "SHA256" #: CertDetail#16 msgid "A SHA-256 hashsum of the certificate" msgstr "La somme de hachage SHA-1 du certificat" #: CertDetail#17 msgctxt "CertDetail#17" msgid "Validity" msgstr "Validité" #: CertDetail#18 msgid "The time since the certificate is valid" msgstr "Le moment depuis lequel le certificat est valide" #: CertDetail#19 msgid "The time until the certificate is valid" msgstr "Le moment auquel le certificat échoit" #: CertDetail#20 msgid "&Subject" msgstr "&Sujet" #: CertDetail#21 msgctxt "CertDetail#21" msgid "&Issuer" msgstr "&Emetteur" #: CertDetail#22 msgid "Attributes" msgstr "Attributs" #: CertDetail#23 msgctxt "CertDetail#23" msgid "&Extensions" msgstr "E&xtensions" #: CertDetail#24 msgid "Show config" msgstr "Afficher la configuration" #: CertDetail#25 msgid "Show extensions" msgstr "Afficher les extensions" #: CertDetail#26 msgctxt "CertDetail#26" msgid "Not available" msgstr "Non disponible" #: CertDetail#27 msgid "Details of the certificate" msgstr "Détails du certificat" #: CertDetail#28 msgid "Signer unknown" msgstr "Signataire inconnu" #: CertDetail#29 msgid "Self signed" msgstr "Auto-signé" #: CertDetail#30 msgctxt "CertDetail#30" msgid "Not trusted" msgstr "Pas sûr" #: CertDetail#31 msgid "Trusted" msgstr "Sûr" #: CertDetail#32 msgid "Revoked: " msgstr "Révoqués: " #: CertDetail#33 msgid "Not valid" msgstr "Echu" #: CertDetail#34 msgid "Valid" msgstr "Valide" #: CertDetail#35 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 "Days" msgstr "Jours" #: CertExtend#8 msgctxt "CertExtend#8" msgid "Months" msgstr "Mois" #: CertExtend#9 msgctxt "CertExtend#9" msgid "Years" msgstr "Années" #: CertExtend#10 msgctxt "CertExtend#10" msgid "Apply" msgstr "Appliquer" #: CertExtend#11 msgid "Revoke old certificate" msgstr "Révoquer le vieux certificat" #: CertExtend#12 msgctxt "CertExtend#12" msgid "Midnight" msgstr "Minuit" #: CertExtend#13 msgctxt "CertExtend#13" msgid "Local time" msgstr "Heure locale" #: CertExtend#14 msgctxt "CertExtend#14" msgid "No well-defined expiration" msgstr "Pas de date d'expiration précise" #: CertExtend#15 msgctxt "CertExtend#15" 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#16 msgid "Edit times" msgstr "Modifier les limites de validité" #: CertExtend#17 msgctxt "CertExtend#17" msgid "Abort rollout" msgstr "Interrompre le déploiement" #: CertExtend#18 msgctxt "CertExtend#18" msgid "Continue rollout" msgstr "Continuer le déploiement" #: CertExtend#19 msgctxt "CertExtend#19" msgid "Adjust date and continue" msgstr "Ajuster la date et continuer" #: CertExtend#20 msgctxt "CertExtend#20" 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é." #: CertTreeView#1 msgid "Import PKCS#12" msgstr "Importer en PKCS#12" #: CertTreeView#2 msgid "Import from PKCS#7" msgstr "Importer en PKCS#7" #: CertTreeView#3 msgid "Request" msgstr "Requête" #: CertTreeView#4 msgctxt "CertTreeView#4" msgid "Security token" msgstr "Jeton de sécurité" #: CertTreeView#5 msgid "Other token" msgstr "Autre jeton" #: CertTreeView#6 msgid "Similar Certificate" msgstr "Certificat similaire" #: CertTreeView#7 msgid "Delete from Security token" msgstr "Détruire sur le jeton de sécurité" #: CertTreeView#8 msgctxt "CertTreeView#8" msgid "CA" msgstr "CA" #: CertTreeView#9 msgid "Properties" msgstr "Propriétés" #: CertTreeView#10 msgctxt "CertTreeView#10" msgid "Generate CRL" msgstr "Générer la liste de révocation" #: CertTreeView#11 msgctxt "CertTreeView#11" msgid "Manage revocations" msgstr "Gérer les révocations" #: CertTreeView#12 msgid "Trust" msgstr "Niveau de confiance" #: CertTreeView#13 msgid "Renewal" msgstr "Renouvellement" #: CertTreeView#14 msgid "Revoke" msgstr "Révoquer" #: CertTreeView#15 msgid "Unrevoke" msgstr "Dé-révoquer" #: 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 msgctxt "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 "Failed" msgstr "Echoué" #: CrlDetail#15 msgid "Unknown signer" msgstr "Signataire inconnu" #: CrlDetail#16 msgid "Verification not possible" msgstr "Vérification impossible" #: ExportDialog#1 msgctxt "ExportDialog#1" msgid "Name" msgstr "Nom" #: ExportDialog#2 msgctxt "ExportDialog#2" 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" #: ExportDialog#3 msgctxt "ExportDialog#3" msgid "..." msgstr "..." #: ExportDialog#4 msgid "Filename" msgstr "Nom du fichier" #: ExportDialog#5 msgid "Export Format" msgstr "Format d'exportation" #: ExportDialog#6 msgctxt "ExportDialog#6" msgid "All files ( * )" msgstr "Tous les fichiers ( * )" #: ExportDialog#7 msgid "PEM Text format with headers" msgstr "Format textuel PEM avec des en-têtes" #: ExportDialog#8 msgid "Concatenated list of all selected items in one PEM text file" msgstr "" "Concaténation de tous les éléments sélectionnés dans un seul fichier texte " "en format PEM" #: ExportDialog#9 msgid "" "Concatenated text format of the complete certificate chain in one PEM file" msgstr "" "Fichier PEM contenant la concaténation de tous les certificats de la chaîne" #: ExportDialog#10 msgid "Concatenated text format of all trusted certificates in one PEM file" msgstr "" "Fichier PEM contenant la concaténation de tous les certificats de confiance" #: ExportDialog#11 msgid "Concatenated text format of all certificates in one PEM file" msgstr "Fichier PEM contenant la concaténation de tous les certificats" #: ExportDialog#12 msgid "Binary DER encoded file" msgstr "Fichier binaire encodé en DER" #: ExportDialog#13 msgid "PKCS#7 encoded single certificate" msgstr "Un seul certificat encodé en PKCS#7" #: ExportDialog#14 msgid "PKCS#7 encoded complete certificate chain" msgstr "" "La chaîne complète de certificats encodée en PKCS#7 dans un seul fichier" #: ExportDialog#15 msgid "All trusted certificates encoded in one PKCS#7 file" msgstr "Tous les certificats de confiance encodés en un seul fichier PKCS#7" #: ExportDialog#16 msgid "All selected certificates encoded in one PKCS#7 file" msgstr "Tous les certificats sélectionnés encodés en un seul fichier PKCS#7" #: ExportDialog#17 msgid "All certificates encoded in one PKCS#7 file" msgstr "Tous les certificats encodés en un seul fichier PKCS#7" #: ExportDialog#18 msgid "The certificate and the private key as encrypted PKCS#12 file" msgstr "" "Le certificat et sa clé privée encodés dans un fichier en format PKCS#12" #: ExportDialog#19 msgid "" "The complete certificate chain and the private key as encrypted PKCS#12 file" msgstr "" "La chaîne complète des certificats et la clé privée en un seul fichier " "PKCS#12" #: ExportDialog#20 msgid "" "Concatenation of the certificate and the unencrypted private key in one PEM " "file" msgstr "" "La concaténation du certificat et de sa clé privée non-cryptée dans un seul " "fichier PEM" #: ExportDialog#21 msgid "" "Concatenation of the certificate and the encrypted private key in PKCS#8 " "format in one file" msgstr "" "La concaténation du certificat et de sa clé privée encryptée en format " "PKCS#8 dans un seul fichier" #: ExportDialog#22 msgid "Text format of the public key in one PEM file" msgstr "Formattage textuel de la clé publique dans un fichier PEM" #: ExportDialog#23 msgid "Binary DER format of the public key" msgstr "Format binaire DER de la clé publique" #: ExportDialog#24 msgid "Unencrypted private key in text format" msgstr "Clé privée non-cryptée en format texte" #: ExportDialog#25 msgid "OpenSSL specific encrypted private key in text format" msgstr "Clé privée encryptée spécifiquement par OpenSSL en format texte" #: ExportDialog#26 msgid "Unencrypted private key in binary DER format" msgstr "Clé privée non-cryptée en format binaire DER" #: ExportDialog#27 msgid "Unencrypted private key in PKCS#8 text format" msgstr "Clé privée non-cryptée en format texte PKCS#8" #: ExportDialog#28 msgid "Encrypted private key in PKCS#8 text format" msgstr "Clé privée encryptée en format texte PKCS#8" #: ExportDialog#29 msgid "The public key encoded in SSH2 format" msgstr "La clé publique encodée en format SSH2" #: ExportDialog#30 msgid "The file: '%1' already exists!" msgstr "Le fichier '%1' existe déjà!" #: ExportDialog#31 msgid "Overwrite" msgstr "Ecraser" #: ExportDialog#32 msgid "Do not overwrite" msgstr "Ne pas écraser" #: 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" #: KeyTreeView#1 msgid "Change password" msgstr "Changer le mot de passe" #: KeyTreeView#2 msgid "Reset password" msgstr "Effacer le mot de passe" #: KeyTreeView#3 msgid "Change PIN" msgstr "Changer le NIP" #: KeyTreeView#4 msgid "Init PIN with SO PIN (PUK)" msgstr "Initialiser le NIP avec le PUK" #: KeyTreeView#5 msgid "Change SO PIN (PUK)" msgstr "Changer le PUK" #: KeyTreeView#6 msgctxt "KeyTreeView#6" msgid "Security token" msgstr "Jeton de sécurité" #: KeyTreeView#7 msgid "This is not a token" msgstr "Ce n'est pas un jeton" #: KeyTreeView#8 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." #: 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 "" "Errors detected and repaired while deleting outdated items from the " "database. A backup file was created" msgstr "" "Des erreurs ont été détectées et réparées lors de la destruction des " "éléments échus de la base de données. Un fichier de sauvegarde a été créé" #: MainWindow#23 msgid "Removing deleted or outdated items from the database failed." msgstr "" "Le nettoyage des éléments détruits ou échus de la base de données a échoué." #: MainWindow#24 msgid "Recent DataBases" msgstr "Bases de données utilisées recemment" #: MainWindow#25 msgid "System" msgstr "Système" #: MainWindow#26 msgid "Croatian" msgstr "Croate" #: MainWindow#27 msgid "English" msgstr "Anglais" #: MainWindow#28 msgid "French" msgstr "Français" #: MainWindow#29 msgid "German" msgstr "Allemand" #: MainWindow#30 msgid "Russian" msgstr "Russe" #: MainWindow#31 msgid "Spanish" msgstr "Espagnol" #: MainWindow#32 msgid "Turkish" msgstr "Turc" #: MainWindow#33 msgid "Language" msgstr "Langue" #: MainWindow#34 msgid "&File" msgstr "&Fichier" #: MainWindow#35 msgid "&New DataBase" msgstr "&Nouvelle base de données" #: MainWindow#36 msgid "&Open DataBase" msgstr "&Ouvrir une base de données" #: MainWindow#37 msgid "Generate DH parameter" msgstr "Générer le paramètre DH" #: MainWindow#38 msgid "Set as default DataBase" msgstr "Définir comme base de données par défaut" #: MainWindow#39 msgid "&Close DataBase" msgstr "&Fermer la base de données" #: MainWindow#40 msgid "&Dump DataBase" msgstr "C&licher la base de données" #: MainWindow#41 msgid "C&hange DataBase password" msgstr "C&hanger le mot de passe de la base de données" #: MainWindow#42 msgid "&Import old db_dump" msgstr "&Importer un cliché de base de données en ancien format (db_dump)" #: MainWindow#43 msgid "&Undelete items" msgstr "&Récupérer des objets détruits" #: MainWindow#44 msgctxt "MainWindow#44" msgid "Options" msgstr "Options" #: MainWindow#45 msgid "Exit" msgstr "Quitter" #: MainWindow#46 msgid "I&mport" msgstr "I&mporter" #: MainWindow#47 msgid "Keys" msgstr "Clés" #: MainWindow#48 msgid "Requests" msgstr "Requêtes" #: MainWindow#49 msgid "PKCS#12" msgstr "PKCS#12" #: MainWindow#50 msgid "PKCS#7" msgstr "PKCS#7" #: MainWindow#51 msgctxt "MainWindow#51" msgid "Template" msgstr "Modèle" #: MainWindow#52 msgid "Revocation list" msgstr "Liste de révocation" #: MainWindow#53 msgid "PEM file" msgstr "Fichier PEM" #: MainWindow#54 msgid "paste PEM file" msgstr "Coller un fichier PEM" #: MainWindow#55 msgid "&Token" msgstr "&Jeton" #: MainWindow#56 msgid "&Manage Security token" msgstr "&Gérer le jeton de sécurité" #: MainWindow#57 msgid "&Init Security token" msgstr "&Initialiser le jeton de sécurité" #: MainWindow#58 msgid "&Change PIN" msgstr "&Changer le NIP" #: MainWindow#59 msgid "Change &SO PIN" msgstr "Changer le P&UK" #: MainWindow#60 msgid "Init PIN" msgstr "Initialiser le NIP" #: MainWindow#61 msgid "&Help" msgstr "&Aide" #: MainWindow#62 msgid "&Content" msgstr "&Contenu" #: MainWindow#63 msgid "About" msgstr "A propos" #: MainWindow#64 msgid "Database dump ( *.dump );;All files ( * )" msgstr "Cliché de base de données ( *.dump );;Tous les fichiers ( * )" #: MainWindow#65 msgid "Import password" msgstr "Mot de passe d'importation" #: MainWindow#66 msgid "Please enter the password of the old database" msgstr "SVP saisir le mot de passe de l'ancienne base de données" #: MainWindow#67 msgid "Password verification error. Ignore keys ?" msgstr "La vérification du mot de passe a écoué. Ignorer les clés ?" #: MainWindow#68 msgid "Import anyway" msgstr "Importer quand-même" #: MainWindow#69 msgid "no such option: %1" msgstr "'%1' n'est pas une option" #: MainWindow#70 msgid "Import PEM data" msgstr "Importer les données PEM" #: MainWindow#71 msgid "Please enter the original SO PIN (PUK) of the token '%1'" msgstr "SVP saisir le PUK original du jeton '%1'" #: MainWindow#72 msgid "Please enter the new SO PIN (PUK) of the token '%1'" msgstr "SVP saisir le nouveau PUK du jeton '%1'" #: MainWindow#73 msgid "The new label of the token '%1'" msgstr "La nouvelle étiquette du jeton '%1'" #: MainWindow#74 msgid "The token '%1' did not contain any keys or certificates" msgstr "Le jeton '%1' ne contient aucune clé ni aucun certificat" #: MainWindow#75 msgid "Current Password" msgstr "Mot de passe actuel" #: MainWindow#76 msgid "Please enter the current database password" msgstr "SVP saisir le mot de passe de la base de données" #: MainWindow#77 msgid "The entered password is wrong" msgstr "Le mot de passe renseigné est inexact" #: MainWindow#78 msgid "New Password" msgstr "Nouveau mot de passe" #: MainWindow#79 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#80 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#81 msgid "Password verify error, please try again" msgstr "La vérification du mot de passe a échoué. SVP essayez encore" #: MainWindow#82 msgctxt "MainWindow#82" msgid "Password" msgstr "Mot de passe" #: MainWindow#83 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#84 msgid "The following error occured:" msgstr "L'erreur suivante s'est produite:" #: MainWindow#85 msgid "Copy to Clipboard" msgstr "Copier dans le presse-papier" #: MainWindow#86 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#87 msgctxt "MainWindow#87" 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 "last update" msgstr "dernière mise-à-jour" #: NewCrl#3 msgid "next update" msgstr "prochaine mise-à-jour" #: NewCrl#4 msgctxt "NewCrl#4" msgid "Days" msgstr "Jours" #: NewCrl#5 msgctxt "NewCrl#5" msgid "Months" msgstr "Mois" #: NewCrl#6 msgctxt "NewCrl#6" msgid "Years" msgstr "Années" #: NewCrl#7 msgctxt "NewCrl#7" msgid "Midnight" msgstr "Minuit" #: NewCrl#8 msgctxt "NewCrl#8" msgid "Local time" msgstr "Heure locale" #: NewCrl#9 msgctxt "NewCrl#9" msgid "Apply" msgstr "Appliquer" #: NewCrl#10 msgid "Hash algorithm" msgstr "Algorithme de hachage" #: NewCrl#11 msgctxt "NewCrl#11" msgid "Authority key identifier" msgstr "Identifiant de clé de l'autorité" #: NewCrl#12 msgid "Subject alternative name" msgstr "Nom alternatif du sujet" #: NewCrl#13 msgctxt "NewCrl#13" msgid "Options" msgstr "Options" #: NewCrl#14 msgid "CRL Number" msgstr "Numéro de la liste de révocation" #: NewCrl#15 msgid "Revocation 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 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 msgid "Remember as default" msgstr "Enregistrer comme valeur par défaut" #: NewKey#12 msgid "Create" msgstr "Créer" #: NewX509#1 msgid "Source" msgstr "Source" #: NewX509#2 msgid "Signing request" msgstr "Requête de signature" #: NewX509#3 msgid "Show request" msgstr "Afficher la requête" #: NewX509#4 msgid "Sign this Certificate signing &request" msgstr "Signer cette &requête" #: NewX509#5 msgid "Copy extensions from the request" msgstr "Copier les extensions de la requête" #: NewX509#6 msgid "Modify subject of the request" msgstr "Modifier le sujet de la requête" #: NewX509#7 msgid "Signing" msgstr "Signer" #: NewX509#8 msgid "Create a &self signed certificate with the serial" msgstr "Créer un certificat auto-&signé avec le numéro de série" #: NewX509#9 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#10 msgid "1" msgstr "1" #: NewX509#11 msgid "Use &this Certificate for signing" msgstr "Utiliser &ce certificat pour signer" #: NewX509#12 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#13 msgctxt "NewX509#13" msgid "Signature algorithm" msgstr "Algorithme de signature" #: NewX509#14 msgid "Template for the new certificate" msgstr "Modèle pour le nouveau certificat" #: NewX509#15 msgid "All available templates" msgstr "Tous les modèles disponibles" #: NewX509#16 msgid "Apply extensions" msgstr "Appliquer les extensions" #: NewX509#17 msgid "Apply subject" msgstr "Appliquer le sujet" #: NewX509#18 msgid "Apply all" msgstr "Appliquer tout" #: NewX509#19 msgctxt "NewX509#19" msgid "Subject" msgstr "Sujet" #: NewX509#20 msgctxt "NewX509#20" msgid "Distinguished name" msgstr "Nom distinctif" #: NewX509#21 msgctxt "NewX509#21" msgid "Add" msgstr "Ajouter" #: NewX509#22 msgctxt "NewX509#22" msgid "Delete" msgstr "Enlever" #: NewX509#23 msgctxt "NewX509#23" msgid "Private key" msgstr "Clé privée" #: NewX509#24 msgid "This list only contains unused keys" msgstr "Cette liste ne contient que les clés inutilisées" #: NewX509#25 msgid "Used keys too" msgstr "Inclure les clés utilisées" #: NewX509#26 msgid "&Generate a new key" msgstr "&Générer une nouvelle clé" #: NewX509#27 msgid "Extensions" msgstr "Extensions" #: NewX509#28 msgctxt "NewX509#28" msgid "Type" msgstr "Type" #: NewX509#29 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#30 msgid "Not defined" msgstr "Non défini" #: NewX509#31 msgid "Certification Authority" msgstr "Autorité de Certification" #: NewX509#32 msgid "End Entity" msgstr "Entité Finale" #: NewX509#33 msgid "Path length" msgstr "Distance aux feuilles" #: NewX509#34 msgid "How much CAs may be below this." msgstr "" "Combien de niveau de sous-CA peuvent apparaître jusqu'à une entité finale." #: NewX509#35 msgid "The basic constraints should always be critical" msgstr "Les contraintes basiques doivent toujours être critiques" #: NewX509#36 msgid "Key identifier" msgstr "Identifiant de clé" #: NewX509#37 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#38 msgid "Copy the Subject Key Identifier from the issuer" msgstr "Copie l'identifiant de clé du sujet du signataire" #: NewX509#39 msgctxt "NewX509#39" msgid "Validity" msgstr "Validité" #: NewX509#40 msgctxt "NewX509#40" msgid "Not before" msgstr "Pas avant" #: NewX509#41 msgctxt "NewX509#41" msgid "Not after" msgstr "Pas après" #: NewX509#42 msgctxt "NewX509#42" msgid "Time range" msgstr "Intervalle de temps" #: NewX509#43 msgctxt "NewX509#43" msgid "Days" msgstr "Jours" #: NewX509#44 msgctxt "NewX509#44" msgid "Months" msgstr "Mois" #: NewX509#45 msgctxt "NewX509#45" msgid "Years" msgstr "Années" #: NewX509#46 msgctxt "NewX509#46" msgid "Apply" msgstr "Appliquer" #: NewX509#47 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#48 msgctxt "NewX509#48" msgid "Midnight" msgstr "Minuit" #: NewX509#49 msgctxt "NewX509#49" msgid "Local time" msgstr "Heure locale" #: NewX509#50 msgctxt "NewX509#50" msgid "No well-defined expiration" msgstr "Pas de date d'expiration précise" #: NewX509#51 msgid "DNS: IP: URI: email: RID:" msgstr "DNS: IP: URI: email: RID:" #: NewX509#52 msgid "Edit" msgstr "Modifier" #: NewX509#53 msgid "URI:" msgstr "URI:" #: NewX509#54 msgid "can be altered by the file \"aia.txt\"" msgstr "peut être altéré par le fichier \"aia.txt\"" #: NewX509#55 msgctxt "NewX509#55" msgid "Key usage" msgstr "Utilisation de la clé" #: NewX509#56 msgid "Netscape" msgstr "Netscape" #: NewX509#57 msgid "Advanced" msgstr "Avancé" #: NewX509#58 msgctxt "NewX509#58" msgid "Validate" msgstr "Valider" #: NewX509#59 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#60 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#61 msgctxt "NewX509#61" msgid "Internal name" msgstr "Nom interne" #: NewX509#62 msgid "Critical" msgstr "Critique" #: NewX509#63 msgid "Create Certificate signing request" msgstr "Créer une requête de signature de certificat" #: NewX509#64 msgid "minimum size: %1" msgstr "taille minimale: %1" #: NewX509#65 msgid "maximum size: %1" msgstr "taille maximale: %1" #: NewX509#66 msgid "only a-z A-Z 0-9 '()+,-./:=?" msgstr "seulement a-z A-Z 0-9 '()+,-./:=?" #: NewX509#67 msgid "only 7-bit clean characters" msgstr "seulement des caractères 7-bit ASCII imprimables" #: NewX509#68 msgid "Create XCA template" msgstr "Créer un modèle XCA" #: NewX509#69 msgid "Edit XCA template" msgstr "Editer un modèle XCA" #: NewX509#70 msgid "Create x509 Certificate" msgstr "Créer un certificat x509" #: NewX509#71 msgid "Other Tabs" msgstr "Autres Onglets" #: NewX509#72 msgid "Advanced Tab" msgstr "Onglet Avancé" #: NewX509#73 msgid "Errors" msgstr "Erreurs" #: NewX509#74 msgid "From PKCS#10 request" msgstr "A partir d'une requête en PKCS#10" #: NewX509#75 msgctxt "NewX509#75" msgid "Abort rollout" msgstr "Interrompre le déploiement" #: NewX509#76 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#77 msgid "Edit subject" msgstr "Modifier le sujet" #: NewX509#78 msgctxt "NewX509#78" msgid "Continue rollout" msgstr "Continuer le déploiement" #: NewX509#79 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#80 msgid "Continue anyway" msgstr "Continuer quand-même" #: NewX509#81 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#82 msgid "Edit name" msgstr "Modifier le nom" #: NewX509#83 msgid "There is no Key selected for signing." msgstr "Aucune clé n'est sélectionnée pour la signature." #: NewX509#84 msgid "Select key" msgstr "Sélectionner la clé" #: NewX509#85 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#86 msgctxt "NewX509#86" 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#87 msgid "Select other signer" msgstr "Sélectionner un autre signataire" #: NewX509#88 msgid "Select other key" msgstr "Sélectionner une autre clé" #: NewX509#89 msgctxt "NewX509#89" 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é.\n" #: NewX509#90 msgid "Edit dates" msgstr "Modifier les limites de validité" #: NewX509#91 msgctxt "NewX509#91" msgid "Adjust date and continue" msgstr "Ajuster la date et continuer" #: NewX509#92 msgctxt "NewX509#92" 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#93 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#94 msgid "" "The certificate contains invalid or duplicate extensions. Check the " "validation on the advanced tab." msgstr "" "Le certificat contient des extensions dupliquées ou invalides. Vérifier la " "validité sur l'onglet \"Avancé\"." #: NewX509#95 msgid "Edit extensions" msgstr "Modifier les extensions" #: NewX509#96 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 "Settings" msgstr "Réglages" #: Options#3 msgid "Default hash algorithm" msgstr "Algorithme de hachage par défaut" #: Options#4 msgid "String types" msgstr "Types de chaînes" #: Options#5 msgid "Suppress success messages" msgstr "Supprimer les messages en cas de succès" #: Options#6 msgid "Don't colorize expired certificates" msgstr "Ne pas coloriser les certificats expirés" #: Options#7 msgid "Translate established x509 terms (%1 -> %2)" msgstr "Traduire les termes standards définis par x509 (%1 -> %2)" #: Options#8 msgid "" "The hashing functionality of the token is not used by XCA.\n" "It may however honor a restricted hash-set propagated by the token.\n" "Especially EC and DSA are only defined with SHA1 in the PKCS#11 " "specification." msgstr "" "La fonctionalité de hachage du jeton n'est pas utilisée par XCA.\n" "Ce dernier peut néanmoins se limiter à un jeu restreint de fonctions de " "hachage reconnus par le jeton.\n" "En particulier, EC et DSA ne sont définis qu'avec SHA1 dans la spécification " "PKCS#11." #: Options#9 msgid "Only use hashes supported by the token when signing with a token key" msgstr "" "N'utiliser que des fonction de hachage supportées par le jeton lors d'une " "signature avec une clé du jeton" #: Options#10 msgid "Disable legacy Netscape extensions" msgstr "Désactiver les extensions Netscape désuètes" #: Options#11 msgctxt "Options#11" msgid "Distinguished name" msgstr "Nom distinctif" #: Options#12 msgid "Mandatory subject entries" msgstr "Inscriptions du sujet obligatoires" #: Options#13 msgctxt "Options#13" msgid "Add" msgstr "Ajouter" #: Options#14 msgctxt "Options#14" msgid "Delete" msgstr "Enlever" #: Options#15 msgid "Explicit subject entries" msgstr "Inscriptions explicites du sujet" #: Options#16 msgid "Default" msgstr "Défaut" #: Options#17 msgid "PKCS#11 provider" msgstr "Fournisseur PKCS#11" #: Options#18 msgid "Remove" msgstr "Enlever" #: Options#19 msgctxt "Options#19" msgid "Search" msgstr "Chercher" #: Options#20 msgid "Printable string or UTF8 (default)" msgstr "Chaîne imprimable ou UTF8 (défaut)" #: Options#21 msgid "PKIX recommendation in RFC2459" msgstr "La recommandation PKIX est dans la RFC2459" #: Options#22 msgid "No BMP strings, only printable and T61" msgstr "Pas de chaîne BMP, seulement imprimable et T61" #: Options#23 msgid "UTF8 strings only (RFC2459)" msgstr "Chaînes UTF8 uniquement (RFC2459)" #: Options#24 msgid "All strings" msgstr "Toutes les chaînes" #: Options#25 msgid "Load failed" msgstr "Le chargement a échoué" #: 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 "" "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#2 msgid "Take as HEX string" msgstr "Exprimé en hexadécimal" #: PwDialog#3 msgid "Repeat %1" msgstr "Répéter %1" #: PwDialog#4 msgid "%1 missmatch" msgstr "%1 ne correspond pas" #: 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 "" "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#6 msgid "E&xit" msgstr "&Quitter" #: QObject#1 msgid "Undefined" msgstr "Indéfini" #: QObject#2 msgid "Broken / Invalid" msgstr "Invalide" #: QObject#3 msgid "DB: Rename: '%1' already in use" msgstr "DB: Renommer: '%1' déjà en utilisation" #: QObject#4 msgid "DB: Entry to rename not found: %1" msgstr "DB: l'inscription à renommer n'a pas été trouvée: '%1'" #: QObject#5 msgid "DB: Write error %1 - %2" msgstr "DB: Erreur d'écriture %1 - %2" #: QObject#6 msgid "Out of data" msgstr "A court de données" #: QObject#7 msgid "Error finding endmarker of string" msgstr "Erreur: une marque de fin de chaîne n'a pas été trouvée" #: QObject#8 msgid "Out of Memory at %1:%2" msgstr "A court de mémoire à %1:%2" #: QObject#9 msgctxt "QObject#9" msgid "All files ( * )" msgstr "Tous les fichiers ( * )" #: QObject#10 msgid "" "PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;SSH Public Keys " "( *.pub );;" msgstr "" "Clés PKI ( *.pem *.der *.key );;Clés PKCS#8 ( *.p8 *.pk8 );;Clés publiques " "SSH ( *.pub );;" #: QObject#11 msgid "Import RSA key" msgstr "Importer une clé RSA" #: QObject#12 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#13 msgid "Import Request" msgstr "Importer une requête" #: QObject#14 msgid "Certificates ( *.pem *.der *.crt *.cer );;" msgstr "Certificats ( *.pem *.der *.crt *.cer );;" #: QObject#15 msgid "Import X.509 Certificate" msgstr "Importer un certificat X.509" #: QObject#16 msgid "PKCS#7 data ( *.p7s *.p7m *.p7b );;" msgstr "Données PKCS#7 ( *.p7s *.p7m *.p7b );;" #: QObject#17 msgid "Import PKCS#7 Certificates" msgstr "Importer un certificat PKCS#7" #: QObject#18 msgid "PKCS#12 Certificates ( *.p12 *.pfx );;" msgstr "Certificats PKCS#12 ( *.p12 *.pfx );;" #: QObject#19 msgid "Import PKCS#12 Private Certificate" msgstr "Importer un certificat privé PKCS#12" #: QObject#20 msgid "XCA templates ( *.xca );;" msgstr "Modèles XCA ( *.xca );;" #: QObject#21 msgid "Import XCA Templates" msgstr "Importer des modèles XCA" #: QObject#22 msgid "Revocation lists ( *.pem *.der *.crl );;" msgstr "Listes de révocation ( *.pem *.der *.crl );;" #: QObject#23 msgid "Import Certificate Revocation List" msgstr "Importer une liste de révocation de certificats" #: QObject#24 msgid "XCA Databases ( *.xdb );;" msgstr "Bases de données XCA ( *.xdb );;" #: QObject#25 msgid "Open XCA Database" msgstr "Ouvrir une Base de Données XCA" #: QObject#26 msgid "PKCS#11 library ( *.dll );;" msgstr "Bibliothèque PKCS#11 ( *.dll );;" #: QObject#27 msgid "PKCS#11 library ( *.dylib *.so );;" msgstr "Bibliothèque PKCS#11 ( *.dylib *.so );;" #: QObject#28 msgid "PKCS#11 library ( *.so );;" msgstr "Bibliothèque PKCS#11 ( *.so );;" #: QObject#29 msgid "Open PKCS#11 shared library" msgstr "Ouvrir une bibliothèque partagée PKCS#11" #: QObject#30 msgid "PEM files ( *.pem );;" msgstr "Fichiers PEM ( *.pem );;" #: QObject#31 msgid "Load PEM encoded file" msgstr "Charger un fichier encodé en PEM" #: QObject#32 msgid "Please enter the PIN on the PinPad" msgstr "Saisir le NIP sur le pavé prévu à cet effet SVP" #: QObject#33 msgid "Please enter the SO PIN (PUK) of the token %1" msgstr "SVP saisir le PUK du jeton '%1'" #: QObject#34 msgid "Please enter the PIN of the token %1" msgstr "SVP saisir le NIP du jeton '%1'" #: QObject#35 msgid "No Security token found" msgstr "Aucun jeton de sécurité trouvé" #: QObject#36 msgid "Select" msgstr "Sélectionner" #: QObject#37 msgid "Please enter the new SO PIN (PUK) for the token: '%1'" msgstr "SVP saisir le nouveau PUK pour le jeton: '%1'" #: QObject#38 msgid "Please enter the new PIN for the token: '%1'" msgstr "SVP saisir le nouveau NIP pour le jeton: '%1'" #: QObject#39 msgid "Required PIN size: %1 - %2" msgstr "Taille du NIP requise: %1 - %2" #: QObject#40 msgid "Failed to open PKCS11 library: %1" msgstr "L'ouverture de la bibliothèque PKCS#11 '%1' a échoué" #: QObject#41 msgid "PKCS#11 function '%1' failed: %2" msgstr "La fonction PKCS#11 '%1' a échoué: %2" #: QObject#42 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#43 msgid "Invalid" msgstr "Invalide" #: QObject#44 msgid "%1 is shorter than %2 bytes: '%3'" msgstr "%1 est plus court que %2 octets: '%3'" #: QObject#45 msgid "%1 is longer than %2 bytes: '%3'" msgstr "%1 est plus long que %2 octets: '%3'" #: QObject#46 msgid "Country code" msgstr "Code du pays" #: QObject#47 msgid "State or Province" msgstr "Etat ou Province" #: QObject#48 msgid "Locality" msgstr "Ville" #: QObject#49 msgid "Organisation" msgstr "Organisation" #: QObject#50 msgid "Organisational unit" msgstr "Unité organisationnelle" #: QObject#51 msgid "Common name" msgstr "Nom commun" #: QObject#52 msgid "E-Mail address" msgstr "Adresse de courriel" #: QObject#53 msgid "Serial number" msgstr "Numéro de série" #: QObject#54 msgid "Given name" msgstr "Prénom" #: QObject#55 msgid "Surname" msgstr "Nom de famille" #: QObject#56 msgid "Title" msgstr "Titre" #: QObject#57 msgid "Initials" msgstr "Initiales" #: QObject#58 msgid "Description" msgstr "Description" #: QObject#59 msgid "Role" msgstr "Rôle" #: QObject#60 msgid "Pseudonym" msgstr "Pseudonyme" #: QObject#61 msgid "Generation Qualifier" msgstr "Qualificatif de génération" #: QObject#62 msgid "x500 Unique Identifier" msgstr "Identifiant unique X500" #: QObject#63 msgctxt "QObject#63" msgid "Name" msgstr "Nom" #: QObject#64 msgid "DN Qualifier" msgstr "Qualificatif de DN" #: QObject#65 msgctxt "QObject#65" msgid "Unstructured name" msgstr "Nom non-structuré" #: QObject#66 msgctxt "QObject#66" msgid "Challenge password" msgstr "Mot de passe challenge" #: QObject#67 msgid "Basic Constraints" msgstr "Contraintes basiques" #: QObject#68 msgid "subject alternative name" msgstr "nom alternatif du sujet" #: QObject#69 msgid "issuer alternative name" msgstr "Nom alternatif du signataire" #: QObject#70 msgid "Subject key identifier" msgstr "Identifiant de clé du sujet" #: QObject#71 msgctxt "QObject#71" msgid "Authority key identifier" msgstr "Identifiant de clé de l'autorité" #: QObject#72 msgctxt "QObject#72" msgid "Key usage" msgstr "Usage de la clé" #: QObject#73 msgid "Extended key usage" msgstr "Utilisation étendue de la clé" #: QObject#74 msgid "CRL distribution points" msgstr "Points de distribution de la liste de révocation" #: QObject#75 msgid "Authority information access" msgstr "Accès à l'information de l'autorité" #: QObject#76 msgid "Certificate type" msgstr "Type de certificat" #: QObject#77 msgid "Base URL" msgstr "URL de base" #: QObject#78 msgid "Revocation URL" msgstr "URL de révocation" #: QObject#79 msgid "CA Revocation URL" msgstr "URL de révocation du certificat CA" #: QObject#80 msgid "Certificate renewal URL" msgstr "URL de renouvellement de certificat" #: QObject#81 msgid "CA policy URL" msgstr "URL des conditions générales du CA" #: QObject#82 msgid "SSL server name" msgstr "Nom du serveur SSL" #: QObject#83 msgid "Comment" msgstr "Commentaire" #: QObject#84 msgid "String '%1' for '%2' contains invalid characters" msgstr "La chaîne '%1' pour '%2' contient des caractères invalides" #: ReqTreeView#1 msgid "Sign" msgstr "Signer" #: ReqTreeView#2 msgid "Similar Request" msgstr "Requête similaire" #: RevocationList#1 msgctxt "RevocationList#1" msgid "Manage revocations" msgstr "Gérer les révocations" #: RevocationList#2 msgctxt "RevocationList#2" msgid "Add" msgstr "Ajouter" #: RevocationList#3 msgctxt "RevocationList#3" msgid "Delete" msgstr "Enlever" #: RevocationList#4 msgctxt "RevocationList#4" msgid "No." msgstr "No." #: RevocationList#5 msgctxt "RevocationList#5" msgid "Serial" msgstr "Numéro de série" #: RevocationList#6 msgctxt "RevocationList#6" msgid "Revocation" msgstr "Révocation" #: RevocationList#7 msgid "Reason" msgstr "Raison" #: RevocationList#8 msgid "Invalidation" msgstr "Invalidation" #: RevocationList#9 msgctxt "RevocationList#9" msgid "Generate CRL" msgstr "Générer la liste de révocation" #: Revoke#1 msgid "Revocation details" msgstr "Détails de la révocation" #: Revoke#2 msgid "Invalid since" msgstr "Non-valide depuis" #: Revoke#3 msgctxt "Revoke#3" msgid "Local time" msgstr "Heure locale" #: Revoke#4 msgid "Certificate revocation" msgstr "Révocation du certificat" #: Revoke#5 msgid "Revocation reason" msgstr "Raison de la révocation" #: Revoke#6 msgctxt "Revoke#6" msgid "Serial" msgstr "Numéro de série" #: SearchPkcs11#1 msgid "Dialog" msgstr "Dialogue" #: SearchPkcs11#2 msgid "Directory" msgstr "Dossier" #: SearchPkcs11#3 msgctxt "SearchPkcs11#3" msgid "..." msgstr "..." #: SearchPkcs11#4 msgid "include sub directorys" msgstr "include les sous-dossiers" #: SearchPkcs11#5 msgctxt "SearchPkcs11#5" msgid "Search" msgstr "Chercher" #: SearchPkcs11#6 msgid "The following files are possible PKCS#11 libraries" msgstr "" "Les fichiers suivants sont susceptibles d'être des bibliothèques PKCS#11" #: 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é" #: TempTreeView#1 msgid "Duplicate" msgstr "Dupliquer" #: TempTreeView#2 msgid "Create certificate" msgstr "Créer un certificat" #: TempTreeView#3 msgid "Create request" msgstr "Créer une requête" #: TempTreeView#4 msgid "copy" msgstr "copier" #: TrustState#1 msgid "Certificate trust" msgstr "Niveau de confiance au 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" #: X509SuperTreeView#1 msgid "OpenSSL config" msgstr "Configuration OpenSSL" #: X509SuperTreeView#2 msgid "Transform" msgstr "Transformer" #: X509SuperTreeView#3 msgctxt "X509SuperTreeView#3" msgid "Template" msgstr "Modèle" #: X509SuperTreeView#4 msgid "Public Key" msgstr "Clé publique" #: XcaTreeView#1 msgid "Subject entries" msgstr "Inscriptions du sujet" #: XcaTreeView#2 msgid "X509v3 Extensions" msgstr "Extensions X509v3" #: XcaTreeView#3 msgid "Netscape extensions" msgstr "Extensions Netscape" #: XcaTreeView#4 msgid "Reset" msgstr "Réinitialisation" #: XcaTreeView#5 msgid "Columns" msgstr "Colonnes" #: XcaTreeView#6 msgid "New" msgstr "Créer" #: XcaTreeView#7 msgid "Import" msgstr "Importer" #: XcaTreeView#8 msgid "Paste PEM data" msgstr "Coller les données en format PEM" #: XcaTreeView#9 msgid "Rename" msgstr "Renommer" #: XcaTreeView#10 msgctxt "XcaTreeView#10" msgid "Delete" msgstr "Enlever" #: XcaTreeView#11 msgid "Export" msgstr "Exporter" #: XcaTreeView#12 msgctxt "XcaTreeView#12" msgid "Clipboard" msgstr "Presse-papier" #: XcaTreeView#13 msgid "File" msgstr "Fichier" #: db_base#1 msgctxt "db_base#1" msgid "Internal name" msgstr "Nom interne" #: db_base#2 msgid "" "Bad database item\n" "Name: %1\n" "Type: %2\n" "Size: %3\n" "%4" msgstr "" "Elément de la base de données corrompu\n" "Nom: %1\n" "Type: %2\n" "Taille: %3\n" "%4" #: db_base#3 msgid "" "Do you want to delete the item from the database? The bad item may be " "extracted into a separate file." msgstr "" "Voulez-vous détruire l'élement de la base de données? L'élément malformé " "peut être extrait dans un fichier séparé." #: db_base#4 msgctxt "db_base#4" msgid "Delete" msgstr "Enlever" #: db_base#5 msgid "Delete and extract" msgstr "Détruire et extraire" #: db_base#6 msgid "Continue" msgstr "Continuer" #: db_base#7 msgctxt "db_base#7" msgid "Error opening file: '%1': %2" msgstr "Erreur lors de l'ouverture du fichier: '%1': %2" #: db_base#8 msgctxt "db_base#8" msgid "No." msgstr "No." #: db_base#9 msgid "How to export the %1 selected items" msgstr "Comment exporter les %1 éléments sélectionnés" #: db_base#10 msgid "All in one PEM file" msgstr "Tout dans un seul fichier PEM" #: db_base#11 msgid "Each item in one file" msgstr "Chaque élément dans un fichier" #: db_base#12 msgid "Save %1 items in one file as" msgstr "Sauvegarder %1 éléments dans un seul fichier comme" #: db_base#13 msgid "PEM Files( *.pem );; All files ( * )" msgstr "Fichiers PEM ( *.pem );; Tous les fichiers ( * )" #: 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 revocation 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 "There are no CA certificates for CRL generation" msgstr "Il n'y a pas de certificat CA for la génération de la CRL" #: db_crl#10 msgid "Select CA certificate" msgstr "Sélectionner un certificat d'autorité" #: db_crl#11 msgid "CRL ( *.pem *.der *.crl )" msgstr "Listes de révocation ( *.pem *.der *.crl )" #: db_crl#12 msgid "Revocation list export" msgstr "Exportation d'une liste de révocation" #: db_key#1 msgctxt "db_key#1" msgid "Type" msgstr "Type" #: db_key#2 msgid "Size" msgstr "Taille" #: db_key#3 msgid "EC Group" msgstr "Groupe EC" #: db_key#4 msgid "Use" msgstr "Usage" #: db_key#5 msgctxt "db_key#5" msgid "Password" msgstr "Mot de passe" #: db_key#6 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#7 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#8 msgid "Key size too small !" msgstr "Taille de clé trop petite !" #: db_key#9 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#10 msgid "Export keys to Clipboard" msgstr "Exporter les clés vers le presse-papier" #: db_key#11 msgctxt "db_key#11" msgid "Clipboard" msgstr "Presse-papier" #: db_key#12 msgid "Export public key [%1]" msgstr "Exporter la clé publique [%1]" #: db_key#13 msgid "PEM public" msgstr "clé publique PEM" #: db_key#14 msgid "SSH2 public" msgstr "Clé publique SSH2" #: db_key#15 msgid "PEM private" msgstr "Clé privée PEM" #: db_key#16 msgid "Export private key [%1]" msgstr "Exporter la clé privée [%1]" #: db_key#17 msgid "DER public" msgstr "Clé publique DER" #: db_key#18 msgid "DER private" msgstr "Clé privée DER" #: db_key#19 msgid "PEM encryped" msgstr "Encrypté en PEM" #: db_key#20 msgid "PKCS#8 encrypted" msgstr "Encryptée en PKCS#8" #: db_key#21 msgid "Private Keys ( *.pem *.der *.pk8 );; SSH Public Keys ( *.pub )" msgstr "Clés privées ( *.pem *.der *.pk8 );; Clé publiques SSH ( *.pub )" #: 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_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 "Save template as" msgstr "Enregistrer le modèle sous" #: db_temp#6 msgid "XCA templates ( *.xca);; All files ( * )" msgstr "Modèles XCA ( *.xca);; Tous les fichiers ( * )" #: db_x509#1 msgctxt "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 "sha256 fingerprint" msgstr "Empreinte sha256" #: db_x509#7 msgid "Start date" msgstr "Date de début" #: db_x509#8 msgid "not Before" msgstr "pas Avant" #: db_x509#9 msgid "Expiry date" msgstr "Date d'expiration" #: db_x509#10 msgid "not After" msgstr "pas Après" #: db_x509#11 msgid "Trust state" msgstr "État de confiance" #: db_x509#12 msgctxt "db_x509#12" msgid "Revocation" msgstr "Révocation" #: db_x509#13 msgid "CRL Expiration" msgstr "Expiration de la CRL" #: db_x509#14 msgctxt "db_x509#14" msgid "Plain View" msgstr "Vue à plat" #: db_x509#15 msgid "Tree View" msgstr "Vue arborescente" #: db_x509#16 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#17 msgid "Invalid public key" msgstr "Clé publique invalide" #: db_x509#18 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#19 msgid "The QA process has been terminated by the user." msgstr "Le processus QA a été arrêté par l'utilisateur." #: db_x509#20 msgctxt "db_x509#20" 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#21 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#22 msgid "PEM chain" msgstr "Chaîne en PEM" #: db_x509#23 msgid "PKCS #7 chain" msgstr "Chaîne PKCS#7" #: db_x509#24 msgid "PKCS #12 chain" msgstr "Chaîne PKCS#12" #: db_x509#25 msgid "PEM + key" msgstr "PEM + clé" #: db_x509#26 msgid "PKCS #7 trusted" msgstr "Certificats de confiance PKCS#7" #: db_x509#27 msgid "PKCS #7 all" msgstr "Tous les certificats en PKCS#7" #: db_x509#28 msgid "PEM trusted" msgstr "Certificats de confiance en PEM" #: db_x509#29 msgid "PEM all" msgstr "Tous les certificats en PEM" #: db_x509#30 msgid "Certificate export" msgstr "Exportation de certificat" #: db_x509#31 msgid "X509 Certificates ( *.pem *.cer *.crt *.p12 *.p7b )" msgstr "Certificats X509 ( *.pem *.cer *.crt *.p12 *.p7b)" #: db_x509#32 msgid "There was no key found for the Certificate: '%1'" msgstr "Aucune clé n'a été trouvée pour le Certificat. '%1'" #: db_x509#33 msgid "Not possible for a token key: '%1'" msgstr "Impossible pour une clé d'un jeton de sécurité: '%1'" #: db_x509#34 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#35 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 msgctxt "db_x509req#3" msgid "Unstructured name" msgstr "Nom non-structuré" #: db_x509req#4 msgctxt "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 export" msgstr "Exporter la requête de signature" #: db_x509req#7 msgid "Certificate request ( *.pem *.der *.csr )" msgstr "Requête de signature de certificat ( *.pem *.der *.csr )" #: 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 "Signature Algorithm" msgstr "Algorithme de signature" #: db_x509super#4 msgid "Save as OpenSSL config" msgstr "Enregistrer en format de configuration OpenSSL" #: db_x509super#5 msgid "Config files ( *.conf *.cnf);; All files ( * )" msgstr "Fichiers de configuration (*.conf *.cnf);; Tous les fichiers ( * )" #: db_x509super#6 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 revocation list '%1'" msgstr "La liste de révocation '%1' a été importée avec succès" #: pki_crl#2 msgid "Delete the revocation list '%1'?" msgstr "Détruire la liste de révocation '%1' ?" #: pki_crl#3 msgid "Successfully created the revocation list '%1'" msgstr "La liste de révocation '%1' a été créée avec succès" #: pki_crl#4 msgid "Delete the %1 revocation lists: %2?" msgstr "Détruire les %1 listes de révocation: %2 ?" #: pki_crl#5 msgid "" "Unable to load the revocation 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, PKCS#8 key types and SSH2 format." 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, PKCS#8 et le format SSH2 ont été " "essayés." #: pki_evp#5 msgid "Ignoring unsupported private key" msgstr "Clé privée non-supportée: ignorée" #: pki_evp#6 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#7 msgid "Password input aborted" msgstr "Saisie du mot de passe abandonnée" #: pki_evp#8 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#9 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#10 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#11 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#12 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 "Global" #: 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_key#13 msgid "Invalid SSH2 public key" msgstr "Clé publique SSH2 invalide" #: pki_key#14 msgid "Failed writing to %1" msgstr "Echec d'écriture sur %1" #: 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 "This Key is already on the token" msgstr "Cette clé est déjà sur le jeton" #: pki_scard#7 msgid "PIN input aborted" msgstr "Saisie du NIP abandonnée" #: pki_scard#8 msgid "Unable to find copied key on the token" msgstr "Impossible de trouver la clé copiée sur le jeton" #: pki_scard#9 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#10 msgid "Public Key missmatch. Please re-import card" msgstr "La clé publique ne correspond pas. Veuillez re-importer la carte" #: pki_scard#11 msgid "Illegal Key generation method" msgstr "Méthode de génération de clé illégale" #: 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 msgid "Ignoring unsupported token key" msgstr "La clé non-supportée sur le jeton est ignorée" #: pki_scard#14 msgctxt "pki_scard#14" msgid "Wrong Size %1" msgstr "Taille fausse %1" #: pki_scard#15 msgid "Token %1" msgstr "Jeton %1" #: pki_scard#16 msgid "Failed to find the key on the token" msgstr "Impossible de trouver la clé sur le jeton" #: pki_scard#17 msgid "Invalid Pin for the token" msgstr "NIP invalide pour le jeton" #: pki_scard#18 msgid "Failed to initialize the key on the token" msgstr "Impossible d'initialiser la clé sur 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)" msgstr "erreur de contenu du fichier de modèle (trop petit)" #: pki_temp#7 msgid "Template file content error (bad size)" msgstr "erreur de contenu du fichier de modèle (mauvaise taille)" #: pki_temp#8 msgid "Template file content error (too small): %1" msgstr "erreur de contenu du fichier de modèle (trop petit): %1" #: pki_temp#9 msgid "Not a PEM encoded XCA Template" msgstr "Ce n'est pas un modèle XCA encodé en PEM" #: pki_temp#10 msgid "Not an XCA Template, but '%1'" msgstr "Ce n'est pas un modèle XCA, mais '%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 "No" msgstr "Non" #: pki_x509#14 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 msgid "Cancel" msgstr "Annuler" #: 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 successful:\n" "'%1'" msgstr "" "La validation a été effectuée avec succès:\n" "'%1'" #~ msgid "0" #~ msgstr "0" #~ msgctxt "CrlDetail#15" #~ msgid "Serial" #~ msgstr "Numéro de série" #~ msgid "Unknown certificate" #~ msgstr "Certificat inconnu" #~ msgid "Dates" #~ msgstr "Dates" #~ msgctxt "NewCrl#5" #~ msgid "Days" #~ msgstr "Jours" #~ msgctxt "NewCrl#6" #~ msgid "Months" #~ msgstr "Mois" #~ msgctxt "NewCrl#7" #~ msgid "Years" #~ msgstr "Années" #~ msgctxt "NewCrl#8" #~ msgid "Midnight" #~ msgstr "Minuit" #~ msgctxt "NewCrl#9" #~ msgid "Local time" #~ msgstr "Heure locale" #~ msgctxt "NewCrl#10" #~ msgid "Apply" #~ msgstr "Appliquer" #~ msgctxt "NewX509#27" #~ msgid "Extensions" #~ msgstr "Extensions" #~ msgctxt "Options#10" #~ msgid "Distinguished name" #~ msgstr "Nom distinctif" #~ msgctxt "Options#12" #~ msgid "Add" #~ msgstr "Ajouter" #~ msgctxt "Options#13" #~ msgid "Delete" #~ msgstr "Enlever" #~ msgid "Set trustment of the Certificate" #~ msgstr "Ajuster le niveau de confiance du certificat" #~ msgctxt "db_crl#16" #~ msgid "Delete" #~ msgstr "Supprimer" #~ msgctxt "db_key#11" #~ msgid "New Key" #~ msgstr "Nouvelle Clé" #~ msgctxt "db_key#12" #~ msgid "Import" #~ msgstr "Importer" #~ msgctxt "db_key#13" #~ msgid "Rename" #~ msgstr "Renommer" #~ msgctxt "db_key#14" #~ msgid "Show Details" #~ msgstr "Afficher les Détails" #~ msgctxt "db_key#15" #~ msgid "Delete" #~ msgstr "Enlever" #~ msgctxt "db_key#16" #~ msgid "Export" #~ msgstr "Exporter" #~ msgctxt "db_key#17" #~ msgid "Clipboard" #~ msgstr "Presse-papier" #~ msgctxt "db_key#18" #~ msgid "File" #~ msgstr "Fichier" #~ msgid "Store on Security token" #~ msgstr "Enregistrer dans le jeton de sécurité" #~ msgid "Tried to change PIN of a key" #~ msgstr "Tentative de changement de NIP d'une clé" #~ msgid "Tried to init PIN of a key" #~ msgstr "Tentative d'initialisation du NIP d'une clé" #~ msgid "Tried to change SO PIN of a key" #~ msgstr "Tentative de changement de PUK d'une clé" #~ msgid "New Template" #~ msgstr "Nouveau modèle" #~ msgctxt "db_temp#9" #~ msgid "Import" #~ msgstr "Importer" #~ msgctxt "db_temp#10" #~ msgid "Rename" #~ msgstr "Renommer" #~ msgctxt "db_temp#11" #~ msgid "Export" #~ msgstr "Exporter" #~ msgid "Change" #~ msgstr "Changer" #~ msgctxt "db_temp#13" #~ msgid "Delete" #~ msgstr "Détruire" #~ msgctxt "db_x509#13" #~ msgid "Plain View" #~ msgstr "Vue à plat" #~ msgctxt "db_x509#19" #~ 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." #~ msgctxt "db_x509#22" #~ msgid "Import" #~ msgstr "Importer" #~ msgctxt "db_x509#25" #~ msgid "Rename" #~ msgstr "Renommer" #~ msgctxt "db_x509#26" #~ msgid "Show Details" #~ msgstr "Afficher les Détails" #~ msgctxt "db_x509#27" #~ msgid "Export" #~ msgstr "Exporter" #~ msgctxt "db_x509#28" #~ msgid "Clipboard" #~ msgstr "Presse-papier" #~ msgctxt "db_x509#29" #~ msgid "File" #~ msgstr "Fichier" #~ msgctxt "db_x509#31" #~ msgid "Security token" #~ msgstr "Jeton de sécurité" #~ msgctxt "db_x509#33" #~ msgid "Template" #~ msgstr "Modèle" #~ msgctxt "db_x509#38" #~ msgid "Delete" #~ msgstr "Enlever" #~ msgid "New Request" #~ msgstr "Nouvelle requête" #~ msgctxt "db_x509req#9" #~ msgid "Import" #~ msgstr "Importer" #~ msgctxt "db_x509req#10" #~ msgid "Rename" #~ msgstr "Renommer" #~ msgctxt "db_x509req#11" #~ msgid "Show Details" #~ msgstr "Afficher les Détails" #~ msgctxt "db_x509req#13" #~ msgid "Export" #~ msgstr "Exporter" #~ msgctxt "db_x509req#14" #~ msgid "Clipboard" #~ msgstr "Presse-papier" #~ msgctxt "db_x509req#15" #~ msgid "File" #~ msgstr "Fichier" #~ msgctxt "db_x509req#16" #~ msgid "Transform" #~ msgstr "Transformer" #~ msgctxt "db_x509req#17" #~ msgid "Template" #~ msgstr "Modèle" #~ msgctxt "db_x509req#18" #~ msgid "OpenSSL config" #~ msgstr "Configuration OpenSSL" #~ msgctxt "db_x509req#19" #~ msgid "Public Key" #~ msgstr "Clé publique" #~ msgctxt "db_x509req#21" #~ msgid "Delete" #~ msgstr "Enlever" #~ msgid "Template file content error (bad length) :%1" #~ msgstr "erreur de contenu du fichier de modèle (mauvaise longueur): %1" #~ msgid "CRL expires: %1" #~ msgstr "La liste de révocation expire le %1" ���������������������������������������������������������������������xca-1.3.2/lang/indent.xslt��������������������������������������������������������������������������0000664�0000000�0000000�00000000516�12606205164�0015412�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-1.3.2/lang/tr.po��������������������������������������������������������������������������������0000664�0000000�0000000�00000144403�12606205164�0014206�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 "Certificate 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 "Revocation 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 "Revocation details" msgstr "" #: Revoke#2 msgid "Invalid since" msgstr "" #: Revoke#3 msgid "Revocation 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 revocation 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 "Revocation 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 revocation list '%1'" msgstr "" #: pki_crl#2 msgid "Delete the revocation list '%1'?" msgstr "" #: pki_crl#3 msgid "Successfully created the revocation list '%1'" msgstr "" #: pki_crl#4 msgid "Delete the %1 revocation lists: %2?" msgstr "" #: pki_crl#5 msgid "" "Unable to load the revocation 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-1.3.2/lang/xca.pot������������������������������������������������������������������������������0000664�0000000�0000000�00000140660�12606205164�0014521�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-19 13:24+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.9.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 msgid "SHA256" msgstr "" #: CertDetail#16 msgid "A SHA-256 hashsum of the certificate" msgstr "" #: CertDetail#17 msgctxt "CertDetail#17" msgid "Validity" msgstr "" #: CertDetail#18 msgid "The time since the certificate is valid" msgstr "" #: CertDetail#19 msgid "The time until the certificate is valid" msgstr "" #: CertDetail#20 msgid "&Subject" msgstr "" #: CertDetail#21 msgctxt "CertDetail#21" msgid "&Issuer" msgstr "" #: CertDetail#22 msgid "Attributes" msgstr "" #: CertDetail#23 msgctxt "CertDetail#23" msgid "&Extensions" msgstr "" #: CertDetail#24 msgid "Show config" msgstr "" #: CertDetail#25 msgid "Show extensions" msgstr "" #: CertDetail#26 msgctxt "CertDetail#26" msgid "Not available" msgstr "" #: CertDetail#27 msgid "Details of the certificate" msgstr "" #: CertDetail#28 msgid "Signer unknown" msgstr "" #: CertDetail#29 msgid "Self signed" msgstr "" #: CertDetail#30 msgctxt "CertDetail#30" msgid "Not trusted" msgstr "" #: CertDetail#31 msgid "Trusted" msgstr "" #: CertDetail#32 msgid "Revoked: " msgstr "" #: CertDetail#33 msgid "Not valid" msgstr "" #: CertDetail#34 msgid "Valid" msgstr "" #: CertDetail#35 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 msgid "Revoke old certificate" msgstr "" #: CertExtend#12 msgctxt "CertExtend#12" msgid "Midnight" msgstr "" #: CertExtend#13 msgctxt "CertExtend#13" msgid "Local time" msgstr "" #: CertExtend#14 msgctxt "CertExtend#14" msgid "No well-defined expiration" msgstr "" #: CertExtend#15 msgctxt "CertExtend#15" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" #: CertExtend#16 msgid "Edit times" msgstr "" #: CertExtend#17 msgctxt "CertExtend#17" msgid "Abort rollout" msgstr "" #: CertExtend#18 msgctxt "CertExtend#18" msgid "Continue rollout" msgstr "" #: CertExtend#19 msgctxt "CertExtend#19" msgid "Adjust date and continue" msgstr "" #: CertExtend#20 msgctxt "CertExtend#20" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" #: CertTreeView#1 msgid "Import PKCS#12" msgstr "" #: CertTreeView#2 msgid "Import from PKCS#7" msgstr "" #: CertTreeView#3 msgid "Request" msgstr "" #: CertTreeView#4 msgctxt "CertTreeView#4" msgid "Security token" msgstr "" #: CertTreeView#5 msgid "Other token" msgstr "" #: CertTreeView#6 msgid "Similar Certificate" msgstr "" #: CertTreeView#7 msgid "Delete from Security token" msgstr "" #: CertTreeView#8 msgctxt "CertTreeView#8" msgid "CA" msgstr "" #: CertTreeView#9 msgid "Properties" msgstr "" #: CertTreeView#10 msgctxt "CertTreeView#10" msgid "Generate CRL" msgstr "" #: CertTreeView#11 msgctxt "CertTreeView#11" msgid "Manage revocations" msgstr "" #: CertTreeView#12 msgid "Trust" msgstr "" #: CertTreeView#13 msgid "Renewal" msgstr "" #: CertTreeView#14 msgid "Revoke" msgstr "" #: CertTreeView#15 msgid "Unrevoke" 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 msgctxt "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 "Failed" msgstr "" #: CrlDetail#15 msgid "Unknown signer" msgstr "" #: CrlDetail#16 msgid "Verification not possible" msgstr "" #: ExportDialog#1 msgctxt "ExportDialog#1" msgid "Name" msgstr "" #: ExportDialog#2 msgctxt "ExportDialog#2" msgid "The internal name of the CRL in the database" msgstr "" #: ExportDialog#3 msgctxt "ExportDialog#3" msgid "..." msgstr "" #: ExportDialog#4 msgid "Filename" msgstr "" #: ExportDialog#5 msgid "Export Format" msgstr "" #: ExportDialog#6 msgctxt "ExportDialog#6" msgid "All files ( * )" msgstr "" #: ExportDialog#7 msgid "PEM Text format with headers" msgstr "" #: ExportDialog#8 msgid "Concatenated list of all selected items in one PEM text file" msgstr "" #: ExportDialog#9 msgid "" "Concatenated text format of the complete certificate chain in one PEM file" msgstr "" #: ExportDialog#10 msgid "Concatenated text format of all trusted certificates in one PEM file" msgstr "" #: ExportDialog#11 msgid "Concatenated text format of all certificates in one PEM file" msgstr "" #: ExportDialog#12 msgid "Binary DER encoded file" msgstr "" #: ExportDialog#13 msgid "PKCS#7 encoded single certificate" msgstr "" #: ExportDialog#14 msgid "PKCS#7 encoded complete certificate chain" msgstr "" #: ExportDialog#15 msgid "All trusted certificates encoded in one PKCS#7 file" msgstr "" #: ExportDialog#16 msgid "All selected certificates encoded in one PKCS#7 file" msgstr "" #: ExportDialog#17 msgid "All certificates encoded in one PKCS#7 file" msgstr "" #: ExportDialog#18 msgid "The certificate and the private key as encrypted PKCS#12 file" msgstr "" #: ExportDialog#19 msgid "" "The complete certificate chain and the private key as encrypted PKCS#12 file" msgstr "" #: ExportDialog#20 msgid "" "Concatenation of the certificate and the unencrypted private key in one PEM " "file" msgstr "" #: ExportDialog#21 msgid "" "Concatenation of the certificate and the encrypted private key in PKCS#8 " "format in one file" msgstr "" #: ExportDialog#22 msgid "Text format of the public key in one PEM file" msgstr "" #: ExportDialog#23 msgid "Binary DER format of the public key" msgstr "" #: ExportDialog#24 msgid "Unencrypted private key in text format" msgstr "" #: ExportDialog#25 msgid "OpenSSL specific encrypted private key in text format" msgstr "" #: ExportDialog#26 msgid "Unencrypted private key in binary DER format" msgstr "" #: ExportDialog#27 msgid "Unencrypted private key in PKCS#8 text format" msgstr "" #: ExportDialog#28 msgid "Encrypted private key in PKCS#8 text format" msgstr "" #: ExportDialog#29 msgid "The public key encoded in SSH2 format" msgstr "" #: ExportDialog#30 msgid "The file: '%1' already exists!" msgstr "" #: ExportDialog#31 msgid "Overwrite" msgstr "" #: ExportDialog#32 msgid "Do not overwrite" 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 "" #: KeyTreeView#1 msgid "Change password" msgstr "" #: KeyTreeView#2 msgid "Reset password" msgstr "" #: KeyTreeView#3 msgid "Change PIN" msgstr "" #: KeyTreeView#4 msgid "Init PIN with SO PIN (PUK)" msgstr "" #: KeyTreeView#5 msgid "Change SO PIN (PUK)" msgstr "" #: KeyTreeView#6 msgctxt "KeyTreeView#6" msgid "Security token" msgstr "" #: KeyTreeView#7 msgid "This is not a token" msgstr "" #: KeyTreeView#8 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 "" #: 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 "" "Errors detected and repaired while deleting outdated items from the " "database. A backup file was created" msgstr "" #: MainWindow#23 msgid "Removing deleted or outdated items from the database failed." msgstr "" #: MainWindow#24 msgid "Recent DataBases" msgstr "" #: MainWindow#25 msgid "System" msgstr "" #: MainWindow#26 msgid "Croatian" msgstr "" #: MainWindow#27 msgid "English" msgstr "" #: MainWindow#28 msgid "French" msgstr "" #: MainWindow#29 msgid "German" msgstr "" #: MainWindow#30 msgid "Russian" msgstr "" #: MainWindow#31 msgid "Spanish" msgstr "" #: MainWindow#32 msgid "Turkish" msgstr "" #: MainWindow#33 msgid "Language" msgstr "" #: MainWindow#34 msgid "&File" msgstr "" #: MainWindow#35 msgid "&New DataBase" msgstr "" #: MainWindow#36 msgid "&Open DataBase" msgstr "" #: MainWindow#37 msgid "Generate DH parameter" msgstr "" #: MainWindow#38 msgid "Set as default DataBase" msgstr "" #: MainWindow#39 msgid "&Close DataBase" msgstr "" #: MainWindow#40 msgid "&Dump DataBase" msgstr "" #: MainWindow#41 msgid "C&hange DataBase password" msgstr "" #: MainWindow#42 msgid "&Import old db_dump" msgstr "" #: MainWindow#43 msgid "&Undelete items" msgstr "" #: MainWindow#44 msgctxt "MainWindow#44" msgid "Options" msgstr "" #: MainWindow#45 msgid "Exit" msgstr "" #: MainWindow#46 msgid "I&mport" msgstr "" #: MainWindow#47 msgid "Keys" msgstr "" #: MainWindow#48 msgid "Requests" msgstr "" #: MainWindow#49 msgid "PKCS#12" msgstr "" #: MainWindow#50 msgid "PKCS#7" msgstr "" #: MainWindow#51 msgctxt "MainWindow#51" msgid "Template" msgstr "" #: MainWindow#52 msgid "Revocation list" msgstr "" #: MainWindow#53 msgid "PEM file" msgstr "" #: MainWindow#54 msgid "paste PEM file" msgstr "" #: MainWindow#55 msgid "&Token" msgstr "" #: MainWindow#56 msgid "&Manage Security token" msgstr "" #: MainWindow#57 msgid "&Init Security token" msgstr "" #: MainWindow#58 msgid "&Change PIN" msgstr "" #: MainWindow#59 msgid "Change &SO PIN" msgstr "" #: MainWindow#60 msgid "Init PIN" msgstr "" #: MainWindow#61 msgid "&Help" msgstr "" #: MainWindow#62 msgid "&Content" msgstr "" #: MainWindow#63 msgid "About" msgstr "" #: MainWindow#64 msgid "Database dump ( *.dump );;All files ( * )" msgstr "" #: MainWindow#65 msgid "Import password" msgstr "" #: MainWindow#66 msgid "Please enter the password of the old database" msgstr "" #: MainWindow#67 msgid "Password verification error. Ignore keys ?" msgstr "" #: MainWindow#68 msgid "Import anyway" msgstr "" #: MainWindow#69 msgid "no such option: %1" msgstr "" #: MainWindow#70 msgid "Import PEM data" msgstr "" #: MainWindow#71 msgid "Please enter the original SO PIN (PUK) of the token '%1'" msgstr "" #: MainWindow#72 msgid "Please enter the new SO PIN (PUK) of the token '%1'" msgstr "" #: MainWindow#73 msgid "The new label of the token '%1'" msgstr "" #: MainWindow#74 msgid "The token '%1' did not contain any keys or certificates" msgstr "" #: MainWindow#75 msgid "Current Password" msgstr "" #: MainWindow#76 msgid "Please enter the current database password" msgstr "" #: MainWindow#77 msgid "The entered password is wrong" msgstr "" #: MainWindow#78 msgid "New Password" msgstr "" #: MainWindow#79 msgid "" "Please enter the new password to encrypt your private keys in the database-" "file" msgstr "" #: MainWindow#80 msgid "" "Please enter a password, that will be used to encrypt your private keys in " "the database file:\n" "%1" msgstr "" #: MainWindow#81 msgid "Password verify error, please try again" msgstr "" #: MainWindow#82 msgctxt "MainWindow#82" msgid "Password" msgstr "" #: MainWindow#83 msgid "" "Please enter the password for unlocking the database:\n" "%1" msgstr "" #: MainWindow#84 msgid "The following error occured:" msgstr "" #: MainWindow#85 msgid "Copy to Clipboard" msgstr "" #: MainWindow#86 msgid "" "Diffie-Hellman parameters are needed for different applications, but not " "handled by XCA.\n" "Please enter the DH parameter bits" msgstr "" #: MainWindow#87 msgctxt "MainWindow#87" msgid "Error opening file: '%1': %2" msgstr "" #: NewCrl#1 msgid "Create CRL" msgstr "" #: NewCrl#2 msgid "last update" msgstr "" #: NewCrl#3 msgid "next update" msgstr "" #: NewCrl#4 msgctxt "NewCrl#4" msgid "Days" msgstr "" #: NewCrl#5 msgctxt "NewCrl#5" msgid "Months" msgstr "" #: NewCrl#6 msgctxt "NewCrl#6" msgid "Years" msgstr "" #: NewCrl#7 msgctxt "NewCrl#7" msgid "Midnight" msgstr "" #: NewCrl#8 msgctxt "NewCrl#8" msgid "Local time" msgstr "" #: NewCrl#9 msgctxt "NewCrl#9" msgid "Apply" msgstr "" #: NewCrl#10 msgid "Hash algorithm" msgstr "" #: NewCrl#11 msgctxt "NewCrl#11" msgid "Authority key identifier" msgstr "" #: NewCrl#12 msgid "Subject alternative name" msgstr "" #: NewCrl#13 msgctxt "NewCrl#13" msgid "Options" msgstr "" #: NewCrl#14 msgid "CRL Number" msgstr "" #: NewCrl#15 msgid "Revocation 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 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 msgid "Remember as default" msgstr "" #: NewKey#12 msgid "Create" msgstr "" #: NewX509#1 msgid "Source" msgstr "" #: NewX509#2 msgid "Signing request" msgstr "" #: NewX509#3 msgid "Show request" msgstr "" #: NewX509#4 msgid "Sign this Certificate signing &request" msgstr "" #: NewX509#5 msgid "Copy extensions from the request" msgstr "" #: NewX509#6 msgid "Modify subject of the request" msgstr "" #: NewX509#7 msgid "Signing" msgstr "" #: NewX509#8 msgid "Create a &self signed certificate with the serial" msgstr "" #: NewX509#9 msgid "If you leave this blank the serial 00 will be used" msgstr "" #: NewX509#10 msgid "1" msgstr "" #: NewX509#11 msgid "Use &this Certificate for signing" msgstr "" #: NewX509#12 msgid "All certificates in your database that can create valid signatures" msgstr "" #: NewX509#13 msgctxt "NewX509#13" msgid "Signature algorithm" msgstr "" #: NewX509#14 msgid "Template for the new certificate" msgstr "" #: NewX509#15 msgid "All available templates" msgstr "" #: NewX509#16 msgid "Apply extensions" msgstr "" #: NewX509#17 msgid "Apply subject" msgstr "" #: NewX509#18 msgid "Apply all" msgstr "" #: NewX509#19 msgctxt "NewX509#19" msgid "Subject" msgstr "" #: NewX509#20 msgctxt "NewX509#20" msgid "Distinguished name" msgstr "" #: NewX509#21 msgctxt "NewX509#21" msgid "Add" msgstr "" #: NewX509#22 msgctxt "NewX509#22" msgid "Delete" msgstr "" #: NewX509#23 msgctxt "NewX509#23" msgid "Private key" msgstr "" #: NewX509#24 msgid "This list only contains unused keys" msgstr "" #: NewX509#25 msgid "Used keys too" msgstr "" #: NewX509#26 msgid "&Generate a new key" msgstr "" #: NewX509#27 msgid "Extensions" msgstr "" #: NewX509#28 msgctxt "NewX509#28" msgid "Type" msgstr "" #: NewX509#29 msgid "If this will become a CA certificate or not" msgstr "" #: NewX509#30 msgid "Not defined" msgstr "" #: NewX509#31 msgid "Certification Authority" msgstr "" #: NewX509#32 msgid "End Entity" msgstr "" #: NewX509#33 msgid "Path length" msgstr "" #: NewX509#34 msgid "How much CAs may be below this." msgstr "" #: NewX509#35 msgid "The basic constraints should always be critical" msgstr "" #: NewX509#36 msgid "Key identifier" msgstr "" #: NewX509#37 msgid "Creates a hash of the key following the PKIX guidelines" msgstr "" #: NewX509#38 msgid "Copy the Subject Key Identifier from the issuer" msgstr "" #: NewX509#39 msgctxt "NewX509#39" msgid "Validity" msgstr "" #: NewX509#40 msgctxt "NewX509#40" msgid "Not before" msgstr "" #: NewX509#41 msgctxt "NewX509#41" msgid "Not after" msgstr "" #: NewX509#42 msgctxt "NewX509#42" msgid "Time range" msgstr "" #: NewX509#43 msgctxt "NewX509#43" msgid "Days" msgstr "" #: NewX509#44 msgctxt "NewX509#44" msgid "Months" msgstr "" #: NewX509#45 msgctxt "NewX509#45" msgid "Years" msgstr "" #: NewX509#46 msgctxt "NewX509#46" msgid "Apply" msgstr "" #: NewX509#47 msgid "Set the time to 00:00:00 and 23:59:59 respectively" msgstr "" #: NewX509#48 msgctxt "NewX509#48" msgid "Midnight" msgstr "" #: NewX509#49 msgctxt "NewX509#49" msgid "Local time" msgstr "" #: NewX509#50 msgctxt "NewX509#50" msgid "No well-defined expiration" msgstr "" #: NewX509#51 msgid "DNS: IP: URI: email: RID:" msgstr "" #: NewX509#52 msgid "Edit" msgstr "" #: NewX509#53 msgid "URI:" msgstr "" #: NewX509#54 msgid "can be altered by the file \"aia.txt\"" msgstr "" #: NewX509#55 msgctxt "NewX509#55" msgid "Key usage" msgstr "" #: NewX509#56 msgid "Netscape" msgstr "" #: NewX509#57 msgid "Advanced" msgstr "" #: NewX509#58 msgctxt "NewX509#58" msgid "Validate" msgstr "" #: NewX509#59 msgid "Create a &self signed certificate with a MD5-hashed QA serial" msgstr "" #: NewX509#60 msgid "" "This name is only used internally and does not appear in the resulting " "certificate" msgstr "" #: NewX509#61 msgctxt "NewX509#61" msgid "Internal name" msgstr "" #: NewX509#62 msgid "Critical" msgstr "" #: NewX509#63 msgid "Create Certificate signing request" msgstr "" #: NewX509#64 msgid "minimum size: %1" msgstr "" #: NewX509#65 msgid "maximum size: %1" msgstr "" #: NewX509#66 msgid "only a-z A-Z 0-9 '()+,-./:=?" msgstr "" #: NewX509#67 msgid "only 7-bit clean characters" msgstr "" #: NewX509#68 msgid "Create XCA template" msgstr "" #: NewX509#69 msgid "Edit XCA template" msgstr "" #: NewX509#70 msgid "Create x509 Certificate" msgstr "" #: NewX509#71 msgid "Other Tabs" msgstr "" #: NewX509#72 msgid "Advanced Tab" msgstr "" #: NewX509#73 msgid "Errors" msgstr "" #: NewX509#74 msgid "From PKCS#10 request" msgstr "" #: NewX509#75 msgctxt "NewX509#75" msgid "Abort rollout" msgstr "" #: NewX509#76 msgid "The following length restrictions of RFC3280 are violated:" msgstr "" #: NewX509#77 msgid "Edit subject" msgstr "" #: NewX509#78 msgctxt "NewX509#78" msgid "Continue rollout" msgstr "" #: NewX509#79 msgid "" "The verification of the Certificate request failed.\n" "The rollout should be aborted." msgstr "" #: NewX509#80 msgid "Continue anyway" msgstr "" #: NewX509#81 msgid "" "The internal name and the common name are empty.\n" "Please set at least the internal name." msgstr "" #: NewX509#82 msgid "Edit name" msgstr "" #: NewX509#83 msgid "There is no Key selected for signing." msgstr "" #: NewX509#84 msgid "Select key" msgstr "" #: NewX509#85 msgid "" "The following distinguished name entries are empty:\n" "%1\n" "though you have declared them as mandatory in the options menu." msgstr "" #: NewX509#86 msgctxt "NewX509#86" msgid "The key you selected for signing is not a private one." msgstr "" #: NewX509#87 msgid "Select other signer" msgstr "" #: NewX509#88 msgid "Select other key" msgstr "" #: NewX509#89 msgctxt "NewX509#89" msgid "" "The certificate will be earlier valid than the signer. This is probably not " "what you want." msgstr "" #: NewX509#90 msgid "Edit dates" msgstr "" #: NewX509#91 msgctxt "NewX509#91" msgid "Adjust date and continue" msgstr "" #: NewX509#92 msgctxt "NewX509#92" msgid "" "The certificate will be longer valid than the signer. This is probably not " "what you want." msgstr "" #: NewX509#93 msgid "" "The certificate will be out of date before it becomes valid. You most " "probably mixed up both dates." msgstr "" #: NewX509#94 msgid "" "The certificate contains invalid or duplicate extensions. Check the " "validation on the advanced tab." msgstr "" #: NewX509#95 msgid "Edit extensions" msgstr "" #: NewX509#96 msgid "Configfile error on line %1\n" msgstr "" #: Options#1 msgid "XCA Options" msgstr "" #: Options#2 msgid "Settings" msgstr "" #: Options#3 msgid "Default hash algorithm" msgstr "" #: Options#4 msgid "String types" msgstr "" #: Options#5 msgid "Suppress success messages" msgstr "" #: Options#6 msgid "Don't colorize expired certificates" msgstr "" #: Options#7 msgid "Translate established x509 terms (%1 -> %2)" msgstr "" #: Options#8 msgid "" "The hashing functionality of the token is not used by XCA.\n" "It may however honor a restricted hash-set propagated by the token.\n" "Especially EC and DSA are only defined with SHA1 in the PKCS#11 " "specification." msgstr "" #: Options#9 msgid "Only use hashes supported by the token when signing with a token key" msgstr "" #: Options#10 msgid "Disable legacy Netscape extensions" msgstr "" #: Options#11 msgctxt "Options#11" msgid "Distinguished name" msgstr "" #: Options#12 msgid "Mandatory subject entries" msgstr "" #: Options#13 msgctxt "Options#13" msgid "Add" msgstr "" #: Options#14 msgctxt "Options#14" msgid "Delete" msgstr "" #: Options#15 msgid "Explicit subject entries" msgstr "" #: Options#16 msgid "Default" msgstr "" #: Options#17 msgid "PKCS#11 provider" msgstr "" #: Options#18 msgid "Remove" msgstr "" #: Options#19 msgctxt "Options#19" msgid "Search" msgstr "" #: Options#20 msgid "Printable string or UTF8 (default)" msgstr "" #: Options#21 msgid "PKIX recommendation in RFC2459" msgstr "" #: Options#22 msgid "No BMP strings, only printable and T61" msgstr "" #: Options#23 msgid "UTF8 strings only (RFC2459)" msgstr "" #: Options#24 msgid "All strings" msgstr "" #: Options#25 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 );;SSH Public Keys " "( *.pub );;" 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 "" #: QObject#46 msgid "Country code" msgstr "" #: QObject#47 msgid "State or Province" msgstr "" #: QObject#48 msgid "Locality" msgstr "" #: QObject#49 msgid "Organisation" msgstr "" #: QObject#50 msgid "Organisational unit" msgstr "" #: QObject#51 msgid "Common name" msgstr "" #: QObject#52 msgid "E-Mail address" msgstr "" #: QObject#53 msgid "Serial number" msgstr "" #: QObject#54 msgid "Given name" msgstr "" #: QObject#55 msgid "Surname" msgstr "" #: QObject#56 msgid "Title" msgstr "" #: QObject#57 msgid "Initials" msgstr "" #: QObject#58 msgid "Description" msgstr "" #: QObject#59 msgid "Role" msgstr "" #: QObject#60 msgid "Pseudonym" msgstr "" #: QObject#61 msgid "Generation Qualifier" msgstr "" #: QObject#62 msgid "x500 Unique Identifier" msgstr "" #: QObject#63 msgctxt "QObject#63" msgid "Name" msgstr "" #: QObject#64 msgid "DN Qualifier" msgstr "" #: QObject#65 msgctxt "QObject#65" msgid "Unstructured name" msgstr "" #: QObject#66 msgctxt "QObject#66" msgid "Challenge password" msgstr "" #: QObject#67 msgid "Basic Constraints" msgstr "" #: QObject#68 msgid "subject alternative name" msgstr "" #: QObject#69 msgid "issuer alternative name" msgstr "" #: QObject#70 msgid "Subject key identifier" msgstr "" #: QObject#71 msgctxt "QObject#71" msgid "Authority key identifier" msgstr "" #: QObject#72 msgctxt "QObject#72" msgid "Key usage" msgstr "" #: QObject#73 msgid "Extended key usage" msgstr "" #: QObject#74 msgid "CRL distribution points" msgstr "" #: QObject#75 msgid "Authority information access" msgstr "" #: QObject#76 msgid "Certificate type" msgstr "" #: QObject#77 msgid "Base URL" msgstr "" #: QObject#78 msgid "Revocation URL" msgstr "" #: QObject#79 msgid "CA Revocation URL" msgstr "" #: QObject#80 msgid "Certificate renewal URL" msgstr "" #: QObject#81 msgid "CA policy URL" msgstr "" #: QObject#82 msgid "SSL server name" msgstr "" #: QObject#83 msgid "Comment" msgstr "" #: QObject#84 msgid "String '%1' for '%2' contains invalid characters" msgstr "" #: ReqTreeView#1 msgid "Sign" msgstr "" #: ReqTreeView#2 msgid "Similar Request" msgstr "" #: RevocationList#1 msgctxt "RevocationList#1" msgid "Manage revocations" msgstr "" #: RevocationList#2 msgctxt "RevocationList#2" msgid "Add" msgstr "" #: RevocationList#3 msgctxt "RevocationList#3" msgid "Delete" msgstr "" #: RevocationList#4 msgctxt "RevocationList#4" msgid "No." msgstr "" #: RevocationList#5 msgctxt "RevocationList#5" msgid "Serial" msgstr "" #: RevocationList#6 msgctxt "RevocationList#6" msgid "Revocation" msgstr "" #: RevocationList#7 msgid "Reason" msgstr "" #: RevocationList#8 msgid "Invalidation" msgstr "" #: RevocationList#9 msgctxt "RevocationList#9" msgid "Generate CRL" msgstr "" #: Revoke#1 msgid "Revocation details" msgstr "" #: Revoke#2 msgid "Invalid since" msgstr "" #: Revoke#3 msgctxt "Revoke#3" msgid "Local time" msgstr "" #: Revoke#4 msgid "Certificate revocation" msgstr "" #: Revoke#5 msgid "Revocation reason" msgstr "" #: Revoke#6 msgctxt "Revoke#6" msgid "Serial" 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 "" #: TempTreeView#1 msgid "Duplicate" msgstr "" #: TempTreeView#2 msgid "Create certificate" msgstr "" #: TempTreeView#3 msgid "Create request" msgstr "" #: TempTreeView#4 msgid "copy" msgstr "" #: TrustState#1 msgid "Certificate trust" 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 "" #: X509SuperTreeView#1 msgid "OpenSSL config" msgstr "" #: X509SuperTreeView#2 msgid "Transform" msgstr "" #: X509SuperTreeView#3 msgctxt "X509SuperTreeView#3" msgid "Template" msgstr "" #: X509SuperTreeView#4 msgid "Public Key" msgstr "" #: XcaTreeView#1 msgid "Subject entries" msgstr "" #: XcaTreeView#2 msgid "X509v3 Extensions" msgstr "" #: XcaTreeView#3 msgid "Netscape extensions" msgstr "" #: XcaTreeView#4 msgid "Reset" msgstr "" #: XcaTreeView#5 msgid "Columns" msgstr "" #: XcaTreeView#6 msgid "New" msgstr "" #: XcaTreeView#7 msgid "Import" msgstr "" #: XcaTreeView#8 msgid "Paste PEM data" msgstr "" #: XcaTreeView#9 msgid "Rename" msgstr "" #: XcaTreeView#10 msgctxt "XcaTreeView#10" msgid "Delete" msgstr "" #: XcaTreeView#11 msgid "Export" msgstr "" #: XcaTreeView#12 msgctxt "XcaTreeView#12" msgid "Clipboard" msgstr "" #: XcaTreeView#13 msgid "File" msgstr "" #: db_base#1 msgctxt "db_base#1" msgid "Internal name" msgstr "" #: db_base#2 msgid "" "Bad database item\n" "Name: %1\n" "Type: %2\n" "Size: %3\n" "%4" msgstr "" #: db_base#3 msgid "" "Do you want to delete the item from the database? The bad item may be " "extracted into a separate file." msgstr "" #: db_base#4 msgctxt "db_base#4" msgid "Delete" msgstr "" #: db_base#5 msgid "Delete and extract" msgstr "" #: db_base#6 msgid "Continue" msgstr "" #: db_base#7 msgctxt "db_base#7" msgid "Error opening file: '%1': %2" msgstr "" #: db_base#8 msgctxt "db_base#8" msgid "No." msgstr "" #: db_base#9 msgid "How to export the %1 selected items" msgstr "" #: db_base#10 msgid "All in one PEM file" msgstr "" #: db_base#11 msgid "Each item in one file" msgstr "" #: db_base#12 msgid "Save %1 items in one file as" msgstr "" #: db_base#13 msgid "PEM Files( *.pem );; All files ( * )" 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 revocation list already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" #: db_crl#9 msgid "There are no CA certificates for CRL generation" msgstr "" #: db_crl#10 msgid "Select CA certificate" msgstr "" #: db_crl#11 msgid "CRL ( *.pem *.der *.crl )" msgstr "" #: db_crl#12 msgid "Revocation list export" msgstr "" #: db_key#1 msgctxt "db_key#1" msgid "Type" msgstr "" #: db_key#2 msgid "Size" msgstr "" #: db_key#3 msgid "EC Group" msgstr "" #: db_key#4 msgid "Use" msgstr "" #: db_key#5 msgctxt "db_key#5" msgid "Password" msgstr "" #: db_key#6 msgid "" "The key is already in the database as:\n" "'%1'\n" "and is not going to be imported" msgstr "" #: db_key#7 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#8 msgid "Key size too small !" msgstr "" #: db_key#9 msgid "You are sure to create a key of the size: %1 ?" msgstr "" #: db_key#10 msgid "Export keys to Clipboard" msgstr "" #: db_key#11 msgctxt "db_key#11" msgid "Clipboard" msgstr "" #: db_key#12 msgid "Export public key [%1]" msgstr "" #: db_key#13 msgid "PEM public" msgstr "" #: db_key#14 msgid "SSH2 public" msgstr "" #: db_key#15 msgid "PEM private" msgstr "" #: db_key#16 msgid "Export private key [%1]" msgstr "" #: db_key#17 msgid "DER public" msgstr "" #: db_key#18 msgid "DER private" msgstr "" #: db_key#19 msgid "PEM encryped" msgstr "" #: db_key#20 msgid "PKCS#8 encrypted" msgstr "" #: db_key#21 msgid "Private Keys ( *.pem *.der *.pk8 );; SSH Public Keys ( *.pub )" msgstr "" #: db_key#22 msgid "Tried to change password of a token" 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 "Save template as" msgstr "" #: db_temp#6 msgid "XCA templates ( *.xca);; All files ( * )" msgstr "" #: db_x509#1 msgctxt "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 "sha256 fingerprint" msgstr "" #: db_x509#7 msgid "Start date" msgstr "" #: db_x509#8 msgid "not Before" msgstr "" #: db_x509#9 msgid "Expiry date" msgstr "" #: db_x509#10 msgid "not After" msgstr "" #: db_x509#11 msgid "Trust state" msgstr "" #: db_x509#12 msgctxt "db_x509#12" msgid "Revocation" msgstr "" #: db_x509#13 msgid "CRL Expiration" msgstr "" #: db_x509#14 msgctxt "db_x509#14" msgid "Plain View" msgstr "" #: db_x509#15 msgid "Tree View" msgstr "" #: db_x509#16 msgid "" "The certificate already exists in the database as:\n" "'%1'\n" "and so it was not imported" msgstr "" #: db_x509#17 msgid "Invalid public key" msgstr "" #: db_x509#18 msgid "Please enter the new hexadecimal secret number for the QA process." msgstr "" #: db_x509#19 msgid "The QA process has been terminated by the user." msgstr "" #: db_x509#20 msgctxt "db_x509#20" msgid "The key you selected for signing is not a private one." msgstr "" #: db_x509#21 msgid "Store the certificate to the key on the token '%1 (#%2)' ?" msgstr "" #: db_x509#22 msgid "PEM chain" msgstr "" #: db_x509#23 msgid "PKCS #7 chain" msgstr "" #: db_x509#24 msgid "PKCS #12 chain" msgstr "" #: db_x509#25 msgid "PEM + key" msgstr "" #: db_x509#26 msgid "PKCS #7 trusted" msgstr "" #: db_x509#27 msgid "PKCS #7 all" msgstr "" #: db_x509#28 msgid "PEM trusted" msgstr "" #: db_x509#29 msgid "PEM all" msgstr "" #: db_x509#30 msgid "Certificate export" msgstr "" #: db_x509#31 msgid "X509 Certificates ( *.pem *.cer *.crt *.p12 *.p7b )" msgstr "" #: db_x509#32 msgid "There was no key found for the Certificate: '%1'" msgstr "" #: db_x509#33 msgid "Not possible for a token key: '%1'" msgstr "" #: db_x509#34 msgid "Not possible for the token-key Certificate '%1'" msgstr "" #: db_x509#35 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 msgctxt "db_x509req#3" msgid "Unstructured name" msgstr "" #: db_x509req#4 msgctxt "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 export" msgstr "" #: db_x509req#7 msgid "Certificate request ( *.pem *.der *.csr )" msgstr "" #: db_x509super#1 msgid "Key name" msgstr "" #: db_x509super#2 msgid "Internal name of the key" msgstr "" #: db_x509super#3 msgid "Signature Algorithm" msgstr "" #: db_x509super#4 msgid "Save as OpenSSL config" msgstr "" #: db_x509super#5 msgid "Config files ( *.conf *.cnf);; All files ( * )" msgstr "" #: db_x509super#6 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 revocation list '%1'" msgstr "" #: pki_crl#2 msgid "Delete the revocation list '%1'?" msgstr "" #: pki_crl#3 msgid "Successfully created the revocation list '%1'" msgstr "" #: pki_crl#4 msgid "Delete the %1 revocation lists: %2?" msgstr "" #: pki_crl#5 msgid "" "Unable to load the revocation 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, PKCS#8 key types and SSH2 format." msgstr "" #: pki_evp#5 msgid "Ignoring unsupported private key" msgstr "" #: pki_evp#6 msgid "Please enter the password to decrypt the private key: '%1'" msgstr "" #: pki_evp#7 msgid "Password input aborted" msgstr "" #: pki_evp#8 msgid "Please enter the database password for decrypting the key '%1'" msgstr "" #: pki_evp#9 msgid "Please enter the password to protect the private key: '%1'" msgstr "" #: pki_evp#10 msgid "Please enter the database password for encrypting the key" msgstr "" #: pki_evp#11 msgid "Please enter the password protecting the PKCS#8 key '%1'" msgstr "" #: pki_evp#12 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_key#13 msgid "Invalid SSH2 public key" msgstr "" #: pki_key#14 msgid "Failed writing to %1" 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 "This Key is already on the token" msgstr "" #: pki_scard#7 msgid "PIN input aborted" msgstr "" #: pki_scard#8 msgid "Unable to find copied key on the token" msgstr "" #: pki_scard#9 msgid "Please insert card: %1 %2 [%3] with Serial: %4" msgstr "" #: pki_scard#10 msgid "Public Key missmatch. Please re-import card" msgstr "" #: pki_scard#11 msgid "Illegal Key generation method" msgstr "" #: pki_scard#12 msgid "Unable to find generated key on card" msgstr "" #: pki_scard#13 msgid "Ignoring unsupported token key" msgstr "" #: pki_scard#14 msgctxt "pki_scard#14" msgid "Wrong Size %1" msgstr "" #: pki_scard#15 msgid "Token %1" msgstr "" #: pki_scard#16 msgid "Failed to find the key on the token" msgstr "" #: pki_scard#17 msgid "Invalid Pin for the token" msgstr "" #: pki_scard#18 msgid "Failed to initialize the key on 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)" msgstr "" #: pki_temp#7 msgid "Template file content error (bad size)" msgstr "" #: pki_temp#8 msgid "Template file content error (too small): %1" msgstr "" #: pki_temp#9 msgid "Not a PEM encoded XCA Template" msgstr "" #: pki_temp#10 msgid "Not an XCA Template, but '%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 "No" msgstr "" #: pki_x509#14 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 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 "" ��������������������������������������������������������������������������������xca-1.3.2/lang/xca_de.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000522667�12606205164�0015030�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="+20"/> <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="+19"/> <source>Details of the certificate signing request</source> <translation>Details des Zertifikatsantrags</translation> </message> <message> <location filename="../ui/CertDetail.ui" line="+36"/> <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="+54"/> <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="+20"/> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <location line="-14"/> <source>MD5</source> <translation>MD5</translation> </message> <message> <location line="+21"/> <source>A SHA-1 hashsum of the certificate</source> <translation>Eine SHA-1 Summe des Zertifikats</translation> </message> <message> <location line="-14"/> <source>An md5 hashsum of the certificate</source> <translation>Eine md5 Summe des Zertifikats</translation> </message> <message> <location line="+21"/> <source>SHA256</source> <translation>SHA256</translation> </message> <message> <location line="+7"/> <source>A SHA-256 hashsum of the certificate</source> <translation>Eine SHA-256 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="-124"/> <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="+26"/> <source>Validity</source> <translation>Gültigkeit</translation> </message> <message> <location line="+11"/> <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="+14"/> <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="+26"/> <source>Revoke old certificate</source> <translation>Altes Zertifikat zurückziehen</translation> </message> <message> <location line="-186"/> <source>Certificate renewal</source> <translation>Zertifikatsverlängerung</translation> </message> <message> <location line="+120"/> <source>Local time</source> <translation>Ortszeit</translation> </message> <message> <location line="+26"/> <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="+2"/> <location line="+22"/> <source>Edit times</source> <translation>Zeiten einstellen</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Abort rollout</source> <translation>Ausstellung abbrechen</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Continue rollout</source> <translation>Ausstellung fortführen</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Adjust date and continue</source> <translation>Datum anpassen und fortführen</translation> </message> <message> <location line="-5"/> <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>CertTreeView</name> <message> <location filename="../widgets/CertTreeView.cpp" line="+25"/> <source>Import PKCS#12</source> <translation>Import PKCS#12</translation> </message> <message> <location line="+1"/> <source>Import from PKCS#7</source> <translation>Import aus PKCS #7</translation> </message> <message> <location line="+28"/> <source>Request</source> <translation>Zertifikatsantrag</translation> </message> <message> <location line="+2"/> <source>Security token</source> <translation>Chipkarte</translation> </message> <message> <location line="+2"/> <source>Other token</source> <translation>Andere Chipkarte</translation> </message> <message> <location line="+4"/> <source>Similar Certificate</source> <translation>Ähnliches Zertifikat</translation> </message> <message> <location line="+3"/> <source>Delete from Security token</source> <translation>Von der Chipkarte löschen</translation> </message> <message> <location line="+3"/> <source>CA</source> <translation>CA</translation> </message> <message> <location line="+1"/> <source>Properties</source> <translation>Eigenschaften</translation> </message> <message> <location line="+1"/> <source>Generate CRL</source> <translation>CRL erstellen</translation> </message> <message> <location line="+1"/> <source>Manage revocations</source> <translation>Rückzugsliste bearbeiten</translation> </message> <message> <location line="+4"/> <source>Trust</source> <translation>Vertrauen</translation> </message> <message> <location line="+4"/> <source>Renewal</source> <translation>Verlängerung</translation> </message> <message> <location line="+2"/> <source>Revoke</source> <translation>Rücknahme</translation> </message> <message> <location line="+2"/> <source>Unrevoke</source> <translation>Rücknahme aufheben</translation> </message> </context> <context> <name>CertView</name> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Es wurde kein Schlüssel gefunden für das Zertifikat: </translation> </message> <message> <source>Import Certificate signing request</source> <translation type="obsolete">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="+159"/> <source>Name</source> <translation>Name</translation> </message> <message> <source>Serial</source> <translation type="obsolete">Seriennummer</translation> </message> <message> <source>Revocation</source> <translation type="obsolete">Rücknahme</translation> </message> <message> <source>Reason</source> <translation type="obsolete">Grund</translation> </message> <message> <source>Invalidation</source> <translation type="obsolete">Ungültig seit</translation> </message> <message> <location filename="../widgets/CrlDetail.cpp" line="+45"/> <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> <source>Unknown certificate</source> <translation type="obsolete">Unbekanntes Zertifikat</translation> </message> <message> <location filename="../ui/CrlDetail.ui" line="-129"/> <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="+48"/> <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="+9"/> <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="+13"/> <source>&Extensions</source> <translation>&Erweiterungen</translation> </message> <message> <location line="+20"/> <source>&Revocation list</source> <translation>&Rücknahmeliste</translation> </message> <message> <source>0</source> <translation type="obsolete">0</translation> </message> </context> <context> <name>ExportCert</name> <message> <source>X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )</source> <translation type="obsolete">X509 Zertifikate ( *.cer *.crt *.p12 *.p7b);;Alle Dateien ( * )</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 type="obsolete">DER ist das Binärformat des Zertifikats PEM ist ein base64 kodiertes Zertifikat PKCS#7 ist ein offizielles Zertifikatsaustauschformat PKCS#12 ist ein verschlüsseltes, offizielles Austauschformat für Zertifikats/Schlüssel paare </translation> </message> <message> <source>Please enter the filename for the certificate.</source> <translation type="obsolete">Bitte geben sie den Dateinamen des Zertifikats ein.</translation> </message> <message> <source>Certificate export</source> <translation type="obsolete">Zertifikatsexport</translation> </message> </context> <context> <name>ExportDer</name> <message> <source>All files ( * )</source> <translation type="obsolete">Alle Dateien ( * )</translation> </message> <message> <source>DER is a binary format PEM is a base64 encoded DER file </source> <translation type="obsolete">DER ist ein Binärformat PEM ist eine base64 kodierte PEM Datei im Textformat </translation> </message> </context> <context> <name>ExportDialog</name> <message> <location filename="../ui/ExportDialog.ui" line="+92"/> <source>Name</source> <translation>Name</translation> </message> <message> <location line="+7"/> <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="+43"/> <source>...</source> <translation>...</translation> </message> <message> <location line="+13"/> <source>Filename</source> <translation>Dateiname</translation> </message> <message> <source>Please enter the filename</source> <translation type="obsolete">Bitte den Dateinamen eingeben</translation> </message> <message> <location line="+40"/> <source>Export Format</source> <translation>Exportformat</translation> </message> <message> <location filename="../widgets/ExportDialog.cpp" line="+37"/> <source>All files ( * )</source> <translation>Alle Dateien ( * )</translation> </message> <message> <location line="+15"/> <source>PEM Text format with headers</source> <translation>PEM Textformat mit Kopf- und Fußzeilen</translation> </message> <message> <location line="+2"/> <source>Concatenated list of all selected items in one PEM text file</source> <translation>Aneinandergereihte Liste aller ausgewählter Einträge in eine PEM Text Datei</translation> </message> <message> <location line="+1"/> <source>Concatenated text format of the complete certificate chain in one PEM file</source> <translation>Aneinandergehängte Zertifikatskette in einer PEM Datei</translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all trusted certificates in one PEM file</source> <translation>Alle vertrauenswürdigen Zertifikate aneinandergehängt in einer PEM Datei</translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all certificates in one PEM file</source> <translation>Alle Zertifikate aneinandergehängt in einer PEM Datei</translation> </message> <message> <location line="+1"/> <source>Binary DER encoded file</source> <translation>Binäre DER formatierte Datei</translation> </message> <message> <location line="+1"/> <source>PKCS#7 encoded single certificate</source> <translation>Einzelnes Zertifikat im PKCS#7 format</translation> </message> <message> <location line="+2"/> <source>PKCS#7 encoded complete certificate chain</source> <translation>Vollständige Zertifikatskette in einer PKCS#7 Datei</translation> </message> <message> <location line="+2"/> <source>All trusted certificates encoded in one PKCS#7 file</source> <translation>Alle vertrauenswürdigen Zertifikate in einer PKCS#7 Datei</translation> </message> <message> <location line="+2"/> <source>All selected certificates encoded in one PKCS#7 file</source> <translation>Alle ausgewählten Zertifikate in einer PKCS#7 Datei</translation> </message> <message> <location line="+2"/> <source>All certificates encoded in one PKCS#7 file</source> <translation>Alle Zertifikate in einer PKCS#7 Datei</translation> </message> <message> <location line="+2"/> <source>The certificate and the private key as encrypted PKCS#12 file</source> <translation>Das Zertifikat und der zugehörige private Schlüssel als verschlüsselte PKCS#12 Datei</translation> </message> <message> <location line="+1"/> <source>The complete certificate chain and the private key as encrypted PKCS#12 file</source> <translation>Die vollständige Zertifikatskette und der private Schlüssel als verschlüsselte PKCS#12 Datei</translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the unencrypted private key in one PEM file</source> <translation>Das PEM Zertifikat und der unverschlüsselte private PEM Schlüssel in einer Textdatei</translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the encrypted private key in PKCS#8 format in one file</source> <translation>Das PEM Zertifikat und der unverschlüsselte private PKCS#8 Schlüssel in einer Textdatei</translation> </message> <message> <location line="+1"/> <source>Text format of the public key in one PEM file</source> <translation>Eine PEM Textdatei mit dem öffentlichen Schlüssel</translation> </message> <message> <location line="+1"/> <source>Binary DER format of the public key</source> <translation>Der öffentliche Schlüssel in einer binären DER Datei</translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in text format</source> <translation>Der unverschlüsselte private Schlüssel in einer PEM Textdatei</translation> </message> <message> <location line="+2"/> <source>OpenSSL specific encrypted private key in text format</source> <translation>OpenSSL spezifischer privater Schlüssel im Textformat</translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in binary DER format</source> <translation>Unverschlüsselter privater Schlüssel in einer binären DER Datei</translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in PKCS#8 text format</source> <translation>Unverschlüsselter privater Schlüssel in einer PKCS#8 Textdatei</translation> </message> <message> <location line="+2"/> <source>Encrypted private key in PKCS#8 text format</source> <translation>Verschlüsselter privater Schlüssel in einer PKCS#8 Textdatei</translation> </message> <message> <location line="+1"/> <source>The public key encoded in SSH2 format</source> <translation>Der öffentliche Schlüssel im SSH2 Format</translation> </message> <message> <location line="+39"/> <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> <source>Private Keys ( *.pem *.der *.pk8 );; SSH Public Keys ( *.pub );; All files ( * )</source> <translation type="obsolete">Private Schlüssel ( *.pem *.der *.pk8 );; Öffentliche SSH Schlüssel ( *.pub );; Alle Dateien ( * )</translation> </message> <message> <source>Please enter the filename for the key.</source> <translation type="obsolete">Bitte geben Sie den Dateinamen für den Schlüssel ein.</translation> </message> <message> <source>Export public %1 key</source> <translation type="obsolete">Öffentlichen %1 Schlüssel exportieren</translation> </message> <message> <source>Export %1 key</source> <translation type="obsolete">%1 Schlüssel exportieren</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="obsolete">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> <source>When exporting the private key it should be encrypted.</source> <translation type="obsolete">Der Private Schlüssel sollte beim Export durch ein Passwort geschützt werden.</translation> </message> <message> <source>When exporting the private part, it should be encrypted.</source> <translation type="obsolete">Wenn der private Teil mit exportiert wird, sollte er verschlüsselt werden.</translation> </message> <message> <source>E&xport the private part of the Key too</source> <translation type="obsolete">Den privaten Teil des Schlüssels mit e&xportieren</translation> </message> <message> <source>Export as PKCS#8</source> <translation type="obsolete">Exportieren als PKCS#8</translation> </message> <message> <source>&Encrypt the Key with a password</source> <translation type="obsolete">D&en Schlüssel mit einem Passwort sichern</translation> </message> <message> <source>Private keys ( *.pem *.der *.pk8 );;All files ( * )</source> <translation type="obsolete">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="+104"/> <location line="+144"/> <source>The type of the Item '%1' is not recognized</source> <translation>Unbekannter Typ bei '%1'</translation> </message> <message> <location line="+48"/> <source>Details of the item '%1' cannot be shown</source> <translation>Details von '%1' können nicht angezeigt werden</translation> </message> <message> <location line="+3"/> <source>The type of the item '%1' is not recognized</source> <translation>Unbekannter Typ bei '%1'</translation> </message> <message> <location line="+29"/> <source>The file '%1' did not contain PKI data</source> <translation>Die Datei '%1' enthielt keine verwendbaren Daten</translation> </message> <message> <location line="+3"/> <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="-271"/> <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="+52"/> <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>KeyTreeView</name> <message> <location filename="../widgets/KeyTreeView.cpp" line="+28"/> <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="+10"/> <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="+3"/> <source>Security token</source> <translation>Chipkarte</translation> </message> <message> <location line="+33"/> <location line="+18"/> <location line="+18"/> <source>This is not a token</source> <translation>Dies ist keine Smartcard</translation> </message> <message> <source>Tried to change PIN of a key</source> <translation type="obsolete">Die PIN eines Schlüssels ohne Chipkarte kann nicht geändert werden</translation> </message> <message> <location line="+28"/> <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> </context> <context> <name>MainWindow</name> <message> <location filename="../widgets/MainWindow.cpp" line="+744"/> <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="-151"/> <source>Current Password</source> <translation>Aktuelles Passwort</translation> </message> <message> <location line="+1"/> <source>Please enter the current database password</source> <translation>Bitte das aktuelle Passwort eingeben</translation> </message> <message> <location line="+14"/> <source>The entered password is wrong</source> <translation>Das angegebene Passwort war falsch</translation> </message> <message> <location line="+5"/> <location line="+105"/> <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="+2"/> <source>Copy to Clipboard</source> <translation>In die Zwischenablage</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="+97"/> <source>&Close DataBase</source> <translation>Datenbank s&chliessen</translation> </message> <message> <location line="+48"/> <source>&Content</source> <translation>&Inhalt</translation> </message> <message> <source>&About</source> <translation type="obsolete">Ü&ber</translation> </message> <message> <location line="-58"/> <source>&File</source> <translation>D&atei</translation> </message> <message> <location line="-29"/> <source>Recent DataBases</source> <translation>Zuletzt geöffnet</translation> </message> <message> <location line="+5"/> <source>System</source> <translation>System</translation> </message> <message> <location line="+1"/> <source>Croatian</source> <translation>Kroatisch</translation> </message> <message> <location line="+1"/> <source>English</source> <translation>Englisch</translation> </message> <message> <location line="+1"/> <source>French</source> <translation>Französisch</translation> </message> <message> <location line="+1"/> <source>German</source> <translation>Deutsch</translation> </message> <message> <location line="+1"/> <source>Russian</source> <translation>Russisch</translation> </message> <message> <location line="+1"/> <source>Spanish</source> <translation>Spanisch</translation> </message> <message> <location line="+1"/> <source>Turkish</source> <translation>Türkisch</translation> </message> <message> <location line="+2"/> <source>Language</source> <translation>Sprache</translation> </message> <message> <location line="+72"/> <source>&Help</source> <translation>&Hilfe</translation> </message> <message> <location filename="../ui/MainWindow.ui" line="+22"/> <source>Private Keys</source> <translation>Private Schlüssel</translation> </message> <message> <location line="+27"/> <source>&New Key</source> <translation>&Neuer Schlüssel</translation> </message> <message> <location line="+7"/> <location line="+105"/> <location line="+92"/> <location line="+138"/> <location line="+58"/> <source>&Export</source> <translation>&Export</translation> </message> <message> <location line="-386"/> <location line="+105"/> <location line="+92"/> <location line="+124"/> <location line="+72"/> <source>&Import</source> <translation>&Import</translation> </message> <message> <location line="-386"/> <source>Import PFX (PKCS#12)</source> <translation>Import PFX (PKCS#12)</translation> </message> <message> <location line="+7"/> <location line="+98"/> <location line="+92"/> <location line="+196"/> <source>&Show Details</source> <translation>Detail&s anzeigen</translation> </message> <message> <location line="-379"/> <location line="+98"/> <location line="+92"/> <location line="+103"/> <location line="+93"/> <source>&Delete</source> <translation>&Löschen</translation> </message> <message> <location line="-346"/> <source>Certificate signing requests</source> <translation>Zertifikatsanträge</translation> </message> <message> <location line="+30"/> <source>&New Request</source> <translation>&Neuer Zertifikatsantrag</translation> </message> <message> <location line="+68"/> <location filename="../widgets/MW_menu.cpp" line="-20"/> <source>Certificates</source> <translation>Zertifikate</translation> </message> <message> <location line="+24"/> <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="+28"/> <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="+168"/> <location filename="../widgets/MainWindow.cpp" line="+133"/> <source>Database</source> <translation>Datenbank</translation> </message> <message> <location line="+69"/> <source>No deleted items found</source> <translation>Keine gelöschten Einträge gefunden</translation> </message> <message> <location line="+99"/> <source>Errors detected and repaired while deleting outdated items from the database. A backup file was created</source> <translation>Beim Löschen veralteter Datenbankeinträge wurden Fehler erkannt und repariert. Eine Backup-datei wurde erstellt</translation> </message> <message> <location line="+2"/> <source>Removing deleted or outdated items from the database failed.</source> <translation>Das Entfernen gelöschter oder veralteter Elemente aus der Datenbank ist Fehlgeschlagen.</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-25"/> <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="+14"/> <source>Keys</source> <translation>Schlüssel</translation> </message> <message> <location line="+1"/> <source>Requests</source> <translation>Zertifikatsanträge</translation> </message> <message> <location line="+2"/> <source>PKCS#12</source> <translation>PKCS#12</translation> </message> <message> <location line="+1"/> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <location line="+1"/> <source>Template</source> <translation>Vorlage</translation> </message> <message> <location line="+1"/> <source>Revocation list</source> <translation>Rücknahmeliste</translation> </message> <message> <location line="+1"/> <source>PEM file</source> <translation>PEM Datei</translation> </message> <message> <source>Donations</source> <translation type="obsolete">Spenden</translation> </message> <message> <location line="+94"/> <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="+6"/> <source>Password verification error. Ignore keys ?</source> <translation>Falsches Passwort. Schlüssel ignorieren ?</translation> </message> <message> <location line="+3"/> <source>Import anyway</source> <translation>Trotzdem importieren</translation> </message> <message> <location line="-112"/> <source>I&mport</source> <translation>I&mport</translation> </message> <message> <location line="+9"/> <source>paste PEM file</source> <translation>PEM datei (copy+paste)</translation> </message> <message> <location line="+17"/> <source>About</source> <translation>Über</translation> </message> <message> <location line="+71"/> <source>Database dump ( *.dump );;All files ( * )</source> <translation>Database dump ( *.dump );;All files ( * )</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-527"/> <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="+182"/> <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="+105"/> <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="+116"/> <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="-130"/> <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="+45"/> <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="+15"/> <source>Exit</source> <translation>Beenden</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-560"/> <source>no such option: %1</source> <translation>unbekannte option: %1</translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="-172"/> <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="+345"/> <source>Error opening file: '%1': %2</source> <translation>Öffnen der Datei '%1' fehlgeschlagen: %2</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-23"/> <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="+30"/> <source>Create CRL</source> <translation>CRL erstellen</translation> </message> <message> <source>Dates</source> <translation type="obsolete">Zeiten</translation> </message> <message> <location line="+76"/> <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="+58"/> <source>Hash algorithm</source> <translation>Hash algorithmus</translation> </message> <message> <source>Hashing algorithm</source> <translation type="obsolete">Hash algorithmus</translation> </message> <message> <source>Extensions</source> <translation type="obsolete">Erweiterungen</translation> </message> <message> <location line="-10"/> <source>Authority key identifier</source> <translation>Authority key identifier</translation> </message> <message> <location line="-17"/> <source>Subject alternative name</source> <translation>Subject alternative name</translation> </message> <message> <location line="-19"/> <source>Options</source> <translation>Optionen</translation> </message> <message> <location line="+9"/> <source>CRL Number</source> <translation>CRL Nummer</translation> </message> <message> <location line="+17"/> <source>Revocation 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="+17"/> <source>Remember as default</source> <translation>Als Standard speichern</translation> </message> <message> <location line="-67"/> <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="+180"/> <source>Create</source> <translation>Erstellen</translation> </message> </context> <context> <name>NewX509</name> <message> <source>Create</source> <translation type="obsolete">Erstellen</translation> </message> <message> <location filename="../ui/NewX509.ui" line="+75"/> <source>Source</source> <translation>Herkunft</translation> </message> <message> <location line="+22"/> <source>Signing request</source> <translation>Zertifikatsantrag</translation> </message> <message> <location line="+24"/> <source>Show request</source> <translation>Request anzeigen</translation> </message> <message> <source>Country code</source> <translation type="obsolete">Länder code</translation> </message> <message> <source>State or Province</source> <translation type="obsolete">Bundesland, Kreis</translation> </message> <message> <source>Locality</source> <translation type="obsolete">Ort</translation> </message> <message> <source>Organisation</source> <translation type="obsolete">Firma</translation> </message> <message> <source>Organisational unit</source> <translation type="obsolete">Firmenabteilung</translation> </message> <message> <source>Common name</source> <translation type="obsolete">Üblicher Name</translation> </message> <message> <source>E-Mail address</source> <translation type="obsolete">E-Mail Adresse</translation> </message> <message> <location line="+7"/> <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="+33"/> <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="+406"/> <source>Apply</source> <translation>Übernehmen</translation> </message> <message> <location line="-335"/> <location filename="../widgets/NewX509.cpp" line="+602"/> <source>Subject</source> <translation>Inhaber</translation> </message> <message> <location line="-151"/> <source>Use &this Certificate for signing</source> <translation>Verwende dieses Zertifika&t zum Unterschreiben</translation> </message> <message> <location line="+157"/> <source>Distinguished name</source> <translation>Eindeutiger Name</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-466"/> <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> <source>Must be exactly 2 letter of size (DE, UK)</source> <translation type="obsolete">Muss exakt 2 Zeichen lang sein (DE,UK)</translation> </message> <message> <location line="+2"/> <source>Internal name</source> <translation>Interner Name</translation> </message> <message> <location filename="../ui/NewX509.ui" line="+39"/> <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> <source>Basic constraints</source> <translation type="obsolete">Grundsätzliche Einschränkungen</translation> </message> <message> <location line="+11"/> <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="+4"/> <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="+7"/> <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>Schlüsselkennung</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="+40"/> <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> <source>Authority Info Access</source> <translation type="obsolete">Ausstellerinformationszugang</translation> </message> <message> <source>CRL distribution point</source> <translation type="obsolete">CRL Verteilungsstelle</translation> </message> <message> <source>issuer alternative name</source> <translation type="obsolete">Alternativer Ausstellername</translation> </message> <message> <location line="+107"/> <source>URI:</source> <translation>URI:</translation> </message> <message> <location line="+36"/> <source>can be altered by the file "aia.txt"</source> <translation>Kann in der Datei "aia.txt" angepasst werden</translation> </message> <message> <location line="-79"/> <location line="+17"/> <location line="+33"/> <location line="+43"/> <location filename="../widgets/NewX509.cpp" line="+848"/> <source>Edit</source> <translation>Bearbeiten</translation> </message> <message> <location line="-100"/> <location line="+17"/> <location line="+76"/> <source>DNS: IP: URI: email: RID:</source> <translation>DNS: IP: URI: email: RID:</translation> </message> <message> <source>subject alternative name</source> <translation type="obsolete">Alternativer Eigentümername</translation> </message> <message> <location line="+39"/> <source>Key usage</source> <translation>Schlüsselverwendung</translation> </message> <message> <source>Extended key usage</source> <translation type="obsolete">Erweiterte Schlüsselverwendung</translation> </message> <message> <location line="+126"/> <source>Netscape</source> <translation>Netscape</translation> </message> <message> <source>CA Revocation URL</source> <translation type="obsolete">CA Sperrlisten URL</translation> </message> <message> <source>Revocation URL</source> <translation type="obsolete">Sperrlisten URL</translation> </message> <message> <source>SSL server name</source> <translation type="obsolete">SSL Servername</translation> </message> <message> <source>Certificate renewal URL</source> <translation type="obsolete">Zertifikatsverlängerungs URL</translation> </message> <message> <source>Comment</source> <translation type="obsolete">Kommentar</translation> </message> <message> <source>CA policy URL</source> <translation type="obsolete">CA Richtlinien URL</translation> </message> <message> <source>Base URL</source> <translation type="obsolete">Basis URL</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-887"/> <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="+180"/> <source>Create Certificate signing request</source> <translation>Erstelle einen Zertifikatsantrag</translation> </message> <message> <source>XCA template</source> <translation type="obsolete">XCA Vorlage</translation> </message> <message> <location line="+76"/> <source>Create x509 Certificate</source> <translation>Erstelle x509 Zertifikat</translation> </message> <message> <location line="+786"/> <location line="+13"/> <location line="+19"/> <location line="+12"/> <location line="+16"/> <location line="+14"/> <location line="+34"/> <location line="+11"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Abort rollout</source> <translation>Ausstellung abbrechen</translation> </message> <message> <location line="-174"/> <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="+33"/> <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="+61"/> <location line="+45"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Continue rollout</source> <translation>Ausstellung fortführen</translation> </message> <message> <location line="-23"/> <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="-909"/> <source>Modify subject of the request</source> <translation>Inhaberinformation "subject" des Zertifikatsantrags ändern</translation> </message> <message> <location line="+1079"/> <source>Advanced</source> <translation>Erweitert</translation> </message> <message> <location line="+24"/> <location filename="../widgets/NewX509.cpp" line="-306"/> <source>Validate</source> <translation>Überprüfen</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="+175"/> <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="+1"/> <source>Continue anyway</source> <translation>Trotzdem fortfahren</translation> </message> <message> <location filename="../ui/NewX509.ui" line="-502"/> <source>No well-defined expiration</source> <translation>Undefiniertes Ablaufdatum</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="+12"/> <source>Edit name</source> <translation>Namen editieren</translation> </message> <message> <location line="+16"/> <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="-59"/> <location line="+61"/> <source>Edit subject</source> <translation>Subject editieren</translation> </message> <message> <location line="+45"/> <location line="+23"/> <location line="+22"/> <source>Edit dates</source> <translation>Zeiten einstellen</translation> </message> <message> <location line="-58"/> <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="-981"/> <source>Critical</source> <translation>Wichtig</translation> </message> <message> <location line="+73"/> <source>Create XCA template</source> <translation>XCA Vorlage erstellen</translation> </message> <message> <location line="+4"/> <source>Edit XCA template</source> <translation>XCA Vorlage ändern</translation> </message> <message> <location line="+905"/> <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="+5"/> <location line="+23"/> <source>Adjust date and continue</source> <translation>Datum anpassen und fortführen</translation> </message> <message> <location line="-5"/> <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="+41"/> <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="+2"/> <source>Edit extensions</source> <translation>Extensions editieren</translation> </message> <message> <location filename="../ui/NewX509.ui" line="-408"/> <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="-1017"/> <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>Keine Sonderzeichen oder Umlaute</translation> </message> <message> <location line="+741"/> <source>From PKCS#10 request</source> <translation>Aus dem PKCS#10 Zertifikatsantrag</translation> </message> <message> <location line="-37"/> <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="+148"/> <source>Mandatory subject entries</source> <translation>Pflichtfelder im subject-name</translation> </message> <message> <location line="+24"/> <location line="+60"/> <location line="+57"/> <source>Add</source> <translation>Hinzufügen</translation> </message> <message> <location line="-110"/> <location line="+60"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="-183"/> <source>Default hash algorithm</source> <translation>Standard Hash Algorithmus</translation> </message> <message> <location line="-14"/> <source>Settings</source> <translation>Einstellungen</translation> </message> <message> <location line="+34"/> <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>Translate established x509 terms (%1 -> %2)</source> <translation>Feststehende x509 Begriffe übersetzen (%1 -> %2)</translation> </message> <message> <location line="+7"/> <source>The hashing functionality of the token is not used by XCA. It may however honor a restricted hash-set propagated by the token. Especially EC and DSA are only defined with SHA1 in the PKCS#11 specification.</source> <translation>Die Hash funktionen der Smartcard werden von XCA nicht verwendet. Die Smartcard kann einen eingeschränkten Satz an Hash-funktionen anbieten. Insbesondere sind in der PKCS#11 Spezifikation EC und DSA signaturen nur mit SHA1 definiert.</translation> </message> <message> <location line="+5"/> <source>Only use hashes supported by the token when signing with a token key</source> <translation>Verwende nur von der Smartcard angebotene Hash-funktionen</translation> </message> <message> <location line="+7"/> <source>Disable legacy Netscape extensions</source> <translation>Veraltete Netscape Erweiterungen abschalten</translation> </message> <message> <location line="+21"/> <source>Distinguished name</source> <translation>Eindeutiger Name</translation> </message> <message> <location line="+62"/> <source>Explicit subject entries</source> <translation>Besondere Namensteile</translation> </message> <message> <location line="+42"/> <source>Default</source> <translation>Standard</translation> </message> <message> <location line="+26"/> <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="+35"/> <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="+155"/> <source>Load failed</source> <translation>Laden fehlgeschlagen</translation> </message> <message> <location filename="../ui/Options.ui" line="-281"/> <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="+13"/> <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="+55"/> <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> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;</source> <translation type="obsolete">PKI Schlüssel ( *.pem *.der *.key );;PKCS#8 Schlüssel ( *.p8 *.pk8 );;</translation> </message> <message> <location line="-83"/> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;SSH Public Keys ( *.pub );;</source> <translation>PKI Schlüssel ( *.pem *.der *.key );;PKCS#8 Schlüssel ( *.p8 *.pk8 );; Öffentliche SSH2 Schlüssel ( *.pub );;</translation> </message> <message> <location line="+15"/> <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="-150"/> <source>All files ( * )</source> <translation>Alle Dateien ( * )</translation> </message> <message> <location filename="../lib/asn1time.cpp" line="+142"/> <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="+223"/> <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="+136"/> <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="+228"/> <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="+48"/> <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="+324"/> <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="+57"/> <source>Failed to open PKCS11 library: %1</source> <translation>Die PKCS#11 Bibliothek %1 konnte nicht geöffnet werden</translation> </message> <message> <location line="+219"/> <source>PKCS#11 function '%1' failed: %2</source> <translation>PKCS#11 Funktion '%1' fehlgeschlagen: %2</translation> </message> <message> <location line="+8"/> <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="+92"/> <source>Required PIN size: %1 - %2</source> <translation>Benötigte PIN länge: %1 - %2</translation> </message> <message> <location filename="../lib/func.cpp" line="+441"/> <source>Country code</source> <translation>Länder code</translation> </message> <message> <location line="+1"/> <source>State or Province</source> <translation>Bundesland, Kreis</translation> </message> <message> <location line="+1"/> <source>Locality</source> <translation>Ort</translation> </message> <message> <location line="+1"/> <source>Organisation</source> <translation>Firma</translation> </message> <message> <location line="+1"/> <source>Organisational unit</source> <translation>Firmenabteilung</translation> </message> <message> <location line="+1"/> <source>Common name</source> <translation>Allgemeine Bezeichnung</translation> </message> <message> <location line="+1"/> <source>E-Mail address</source> <translation>E-Mail Adresse</translation> </message> <message> <location line="+1"/> <source>Serial number</source> <translation>Seriennummer</translation> </message> <message> <location line="+1"/> <source>Given name</source> <translation>Vorname</translation> </message> <message> <location line="+1"/> <source>Surname</source> <translation>Nachname</translation> </message> <message> <location line="+1"/> <source>Title</source> <translation>Titel</translation> </message> <message> <location line="+1"/> <source>Initials</source> <translation>Initialien</translation> </message> <message> <location line="+1"/> <source>Description</source> <translation>Beschreibung</translation> </message> <message> <location line="+1"/> <source>Role</source> <translation>Rolle</translation> </message> <message> <location line="+1"/> <source>Pseudonym</source> <translation>Pseudonym</translation> </message> <message> <location line="+1"/> <source>Generation Qualifier</source> <translation>Generierungskennzeichnung</translation> </message> <message> <location line="+1"/> <source>x500 Unique Identifier</source> <translation>Eindeutige x500 Identifizierung</translation> </message> <message> <location line="+1"/> <source>Name</source> <translation>Name</translation> </message> <message> <location line="+1"/> <source>DN Qualifier</source> <translation>DN Kennzeichnung</translation> </message> <message> <location line="+1"/> <source>Unstructured name</source> <translation>Unstrukturierter Name</translation> </message> <message> <location line="+1"/> <source>Challenge password</source> <translation>Passwort nach Aufforderung</translation> </message> <message> <location line="+2"/> <source>Basic Constraints</source> <translation>Basiseinschränkungen</translation> </message> <message> <location line="+1"/> <source>subject alternative name</source> <translation>Alternativer Eigentümername</translation> </message> <message> <location line="+1"/> <source>issuer alternative name</source> <translation>Alternativer Ausstellername</translation> </message> <message> <location line="+1"/> <source>Subject key identifier</source> <translation>Inhaberschlüssel identifizierung</translation> </message> <message> <location line="+1"/> <source>Authority key identifier</source> <translation>Ausstellerschlüssel identifizierung</translation> </message> <message> <location line="+1"/> <source>Key usage</source> <translation>Schlüsselverwendung</translation> </message> <message> <location line="+1"/> <source>Extended key usage</source> <translation>Erweiterte Schlüsselverwendung</translation> </message> <message> <location line="+1"/> <source>CRL distribution points</source> <translation>CRL Verteilungspunkte</translation> </message> <message> <location line="+1"/> <source>Authority information access</source> <translation>Aussteller informations zugriff</translation> </message> <message> <location line="+1"/> <source>Certificate type</source> <translation>Zertifikatstyp</translation> </message> <message> <location line="+1"/> <source>Base URL</source> <translation>Basis URL</translation> </message> <message> <location line="+1"/> <source>Revocation URL</source> <translation>Sperrlisten URL</translation> </message> <message> <location line="+1"/> <source>CA Revocation URL</source> <translation>CA Sperrlisten URL</translation> </message> <message> <location line="+1"/> <source>Certificate renewal URL</source> <translation>Zertifikatsverlängerungs URL</translation> </message> <message> <location line="+1"/> <source>CA policy URL</source> <translation>CA Richtlinien URL</translation> </message> <message> <location line="+1"/> <source>SSL server name</source> <translation>SSL Servername</translation> </message> <message> <location line="+1"/> <source>Comment</source> <translation>Kommentar</translation> </message> <message> <location filename="../lib/x509v3ext.cpp" line="+75"/> <source>String '%1' for '%2' contains invalid characters</source> <translation>Der Text '%1' für '%2' enthält ungültige Zeichen</translation> </message> </context> <context> <name>ReqTreeView</name> <message> <location filename="../widgets/ReqTreeView.cpp" line="+23"/> <source>Sign</source> <translation>Unterschreiben</translation> </message> <message> <location line="+2"/> <source>Similar Request</source> <translation>Ähnlicher Zertifikatsantrag</translation> </message> </context> <context> <name>RevocationList</name> <message> <location filename="../ui/RevocationList.ui" line="+30"/> <source>Manage revocations</source> <translation>Rückzugsliste bearbeiten</translation> </message> <message> <location line="+66"/> <source>Add</source> <translation>Hinzufügen</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location filename="../widgets/RevocationList.cpp" line="+70"/> <source>No.</source> <translation>Nr.</translation> </message> <message> <location 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>Generate CRL</source> <translation>CRL erstellen</translation> </message> </context> <context> <name>Revoke</name> <message> <location filename="../ui/Revoke.ui" line="+87"/> <source>Revocation details</source> <translation>Details der Rücknahmeliste</translation> </message> <message> <location line="+30"/> <source>Invalid since</source> <translation>Ungültig seit</translation> </message> <message> <location line="-7"/> <source>Local time</source> <translation>Ortszeit</translation> </message> <message> <location line="-80"/> <source>Certificate revocation</source> <translation>Zertifikatsrückzug</translation> </message> <message> <location line="+66"/> <source>Revocation reason</source> <translation>Rücknahmegrund</translation> </message> <message> <location line="+28"/> <source>Serial</source> <translation>Seriennummer</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>TempTreeView</name> <message> <location filename="../widgets/TempTreeView.cpp" line="+20"/> <source>Duplicate</source> <translation>Duplizieren</translation> </message> <message> <location line="+1"/> <source>Create certificate</source> <translation>Zertifikat erstellen</translation> </message> <message> <location line="+1"/> <source>Create request</source> <translation>Zertifikatsantrag erstellen</translation> </message> <message> <location line="+11"/> <source>copy</source> <translation>kopie</translation> </message> </context> <context> <name>TrustState</name> <message> <location filename="../ui/TrustState.ui" line="+33"/> <source>Certificate trust</source> <translation>Zertifikatsvertrauensstatus</translation> </message> <message> <location line="+60"/> <source>Trustment</source> <translation>Vertrauen</translation> </message> <message> <location line="+9"/> <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> <source>Set trustment of the Certificate</source> <translation type="obsolete">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>X509SuperTreeView</name> <message> <location filename="../widgets/X509SuperTreeView.cpp" line="+25"/> <source>OpenSSL config</source> <translation>OpenSSL Konfiguration</translation> </message> <message> <location line="+2"/> <source>Transform</source> <translation>Umwandeln</translation> </message> <message> <location line="+1"/> <source>Template</source> <translation>Vorlage</translation> </message> <message> <location line="+2"/> <source>Public Key</source> <translation>Öffentlicher Schlüssel</translation> </message> </context> <context> <name>XcaTreeView</name> <message> <location filename="../widgets/XcaTreeView.cpp" line="+282"/> <source>Subject entries</source> <translation>Namensteile</translation> </message> <message> <location line="+1"/> <source>X509v3 Extensions</source> <translation>X509v3 Erweiterungen</translation> </message> <message> <location line="+1"/> <source>Netscape extensions</source> <translation>Netscape Erweiterungen</translation> </message> <message> <location line="+1"/> <source>Reset</source> <translation>Zurücksetzen</translation> </message> <message> <location line="+47"/> <source>Columns</source> <translation>Spalten</translation> </message> <message> <location line="+28"/> <source>New</source> <translation>Neu</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Import</translation> </message> <message> <location line="+1"/> <source>Paste PEM data</source> <translation>Einfügen (PEM)</translation> </message> <message> <location line="+3"/> <source>Rename</source> <translation>Umbenennen</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation>Löschen</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> </context> <context> <name>db_base</name> <message> <location filename="../lib/db_base.cpp" line="+211"/> <source>Internal name</source> <translation>Interner Name</translation> </message> <message> <source>Reset</source> <translation type="obsolete">Zurücksetzen</translation> </message> <message> <source>Subject entries</source> <translation type="obsolete">Namensteile</translation> </message> <message> <location line="-136"/> <source>Bad database item Name: %1 Type: %2 Size: %3 %4</source> <translation>Problematischer Datenbankeintrag Name: %1 Typ: %2 Grösse %3 %4</translation> </message> <message> <location line="+3"/> <source>Do you want to delete the item from the database? The bad item may be extracted into a separate file.</source> <translation>Soll der Eintrag aus der Datenbank gelöscht werden? Der problematische Eintrag kann in eine separate Datei extrahiert werden.</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation>Löschen</translation> </message> <message> <location line="+1"/> <source>Delete and extract</source> <translation>Löschen und extrahieren</translation> </message> <message> <location line="+1"/> <source>Continue</source> <translation>Weiter</translation> </message> <message> <location line="+19"/> <location line="+540"/> <source>Error opening file: '%1': %2</source> <translation>Fehler beim Öffnen der Datei %1: %2</translation> </message> <message> <location line="-430"/> <source>No.</source> <translation>Nr.</translation> </message> <message> <location line="+404"/> <source>How to export the %1 selected items</source> <translation>Wie sollen die %1 ausgewählten Einträge exportiert werden</translation> </message> <message> <location line="+2"/> <source>All in one PEM file</source> <translation>Alles in eine PEM Datei</translation> </message> <message> <location line="+1"/> <source>Each item in one file</source> <translation>Jeder Eintrag in eine separate Datei</translation> </message> <message> <location line="+13"/> <source>Save %1 items in one file as</source> <translation>%1 Einträge in einer Datei speichern</translation> </message> <message> <location line="+1"/> <source>PEM Files( *.pem );; All files ( * )</source> <translation>PEM Dateien ( *.pem );; Alle Dateien ( * )</translation> </message> <message> <source>X509v3 Extensions</source> <translation type="obsolete">X509v3 Erweiterungen</translation> </message> <message> <source>Netscape extensions</source> <translation type="obsolete">Netscape Erweiterungen</translation> </message> <message> <source>Paste PEM data</source> <translation type="obsolete">Einfügen (PEM)</translation> </message> <message> <source>Columns</source> <translation type="obsolete">Spalten</translation> </message> </context> <context> <name>db_crl</name> <message> <location filename="../lib/db_crl.cpp" line="+31"/> <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="+116"/> <source>CRL ( *.pem *.der *.crl )</source> <translation>CRL ( *.pem *.der *.crl )</translation> </message> <message> <location line="+59"/> <source>There are no CA certificates for CRL generation</source> <translation>Es existieren keine CA Zertifikate für eine CRL generierung</translation> </message> <message> <location line="+8"/> <source>Select CA certificate</source> <translation>CA Zertifikat wählen</translation> </message> <message> <location line="-68"/> <source>Revocation list export</source> <translation>Rücknahmeliste exportieren</translation> </message> <message> <source>Import</source> <translation type="obsolete">Import</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Umbenennen</translation> </message> <message> <source>Export</source> <translation type="obsolete">Export</translation> </message> <message> <source>Clipboard</source> <translation type="obsolete">Zwischenablage</translation> </message> <message> <source>File</source> <translation type="obsolete">Datei</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Löschen</translation> </message> <message> <location line="-40"/> <source>The revocation 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="+140"/> <source>Key size too small !</source> <translation>Schlüsselgrösse zu klein !</translation> </message> <message> <source>New Key</source> <translation type="obsolete">Neuer Schlüssel</translation> </message> <message> <source>Import</source> <translation type="obsolete">Import</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Umbenennen</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Details anzeigen</translation> </message> <message> <source>Export</source> <translation type="obsolete">Export</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Löschen</translation> </message> <message> <source>Change password</source> <translation type="obsolete">Passwort ändern</translation> </message> <message> <source>Reset password</source> <translation type="obsolete">Passwort zurücksetzen</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 type="obsolete">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="-96"/> <source>Type</source> <translation>Typ</translation> </message> <message> <location line="+1"/> <source>Size</source> <translation>Länge</translation> </message> <message> <location line="+2"/> <source>EC Group</source> <translation>EC Gruppe</translation> </message> <message> <location line="+2"/> <source>Use</source> <translation>Benutzt</translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Passwort</translation> </message> <message> <location line="+178"/> <source>Clipboard</source> <translation>Zwischenablage</translation> </message> <message> <source>File</source> <translation type="obsolete">Datei</translation> </message> <message> <source>Change PIN</source> <translation type="obsolete">PIN ändern</translation> </message> <message> <source>Init PIN with SO PIN (PUK)</source> <translation type="obsolete">PIN mithilfe der SO PIN (PUK) initialisieren</translation> </message> <message> <source>Change SO PIN (PUK)</source> <translation type="obsolete">SO PIN (PUK) ändern</translation> </message> <message> <source>Store on Security token</source> <translation type="obsolete">Auf der Chipkarte speichern</translation> </message> <message> <location line="+13"/> <source>Export public key [%1]</source> <translation>Export des öffentlichen Schlüssels [%1]</translation> </message> <message> <location line="-25"/> <location line="+35"/> <source>PEM public</source> <translation>PEM öffentlich</translation> </message> <message> <location line="+1"/> <source>DER public</source> <translation>DER öffentlich</translation> </message> <message> <location line="-33"/> <location line="+37"/> <source>SSH2 public</source> <translation>SSH2 öffentlich</translation> </message> <message> <location line="+5"/> <source>DER private</source> <translation>DER privat</translation> </message> <message> <location line="+2"/> <source>PEM encryped</source> <translation>PEM verschlüsselt</translation> </message> <message> <source>PKCS#8</source> <translation type="obsolete">PKCS#8</translation> </message> <message> <location line="-41"/> <location line="+46"/> <source>PEM private</source> <translation>PEM privat</translation> </message> <message> <location line="-43"/> <source>Export keys to Clipboard</source> <translation>Schlüssel In die Zwischenablage exportieren</translation> </message> <message> <location line="+45"/> <source>PKCS#8 encrypted</source> <translation>PKCS#8 verschlüsselt</translation> </message> <message> <location line="+1"/> <source>Export private key [%1]</source> <translation>Privaten Schlüssel exportieren [%1]</translation> </message> <message> <location line="+5"/> <source>Private Keys ( *.pem *.der *.pk8 );; SSH Public Keys ( *.pub )</source> <translation>Private Schlüssel ( *.pem *.der *.pk8 );; Öffentliche SSH Schlüssel ( *.pub )</translation> </message> <message> <location line="+56"/> <source>Tried to change password of a token</source> <translation></translation> </message> <message> <location line="-228"/> <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="+35"/> <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="+56"/> <source>Type</source> <translation>Typ</translation> </message> <message> <location line="+63"/> <source>Nothing</source> <translation>Nichts</translation> </message> <message> <location line="+5"/> <source>Preset Template values</source> <translation>Vorlagenwerte voreinstellen</translation> </message> <message> <source>copy</source> <translation type="obsolete">kopie</translation> </message> <message> <location line="+45"/> <source>Save template as</source> <translation>Vorlage speichern als</translation> </message> <message> <source>New Template</source> <translation type="obsolete">Neue Vorlage</translation> </message> <message> <source>Import</source> <translation type="obsolete">Import</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Umbenennen</translation> </message> <message> <source>Export</source> <translation type="obsolete">Export</translation> </message> <message> <source>Change</source> <translation type="obsolete">Ändern</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Löschen</translation> </message> <message> <source>Duplicate</source> <translation type="obsolete">Duplizieren</translation> </message> <message> <source>Create certificate</source> <translation type="obsolete">Zertifikat erstellen</translation> </message> <message> <source>Create request</source> <translation type="obsolete">Zertifikatsantrag erstellen</translation> </message> <message> <location line="+1"/> <source>XCA templates ( *.xca);; All files ( * )</source> <translation>XCA Vorlagen ( *.xca);; All files ( * )</translation> </message> <message> <location line="-122"/> <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="+59"/> <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>sha256 fingerprint</source> <translation>sha256 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="+1"/> <source>CRL Expiration</source> <translation>CRL Ablauf</translation> </message> <message> <location line="+103"/> <source>Plain View</source> <translation>Einfache Ansicht</translation> </message> <message> <location line="+2"/> <source>Tree View</source> <translation>Baumansicht</translation> </message> <message> <location line="+311"/> <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="+2"/> <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> <source>New Certificate</source> <translation type="obsolete">Neues Zertifikat</translation> </message> <message> <source>Import</source> <translation type="obsolete">Import</translation> </message> <message> <source>Import PKCS#12</source> <translation type="obsolete">Import PKCS#12</translation> </message> <message> <source>Import from PKCS#7</source> <translation type="obsolete">Import von PKCS #7</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Umbenennen</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Details anzeigen</translation> </message> <message> <source>Extract public Key</source> <translation type="obsolete">Öffentlichen Schlüssel extrahieren</translation> </message> <message> <source>Export</source> <translation type="obsolete">Export</translation> </message> <message> <source>Clipboard</source> <translation type="obsolete">Zwischenablage</translation> </message> <message> <source>File</source> <translation type="obsolete">Datei</translation> </message> <message> <source>Request</source> <translation type="obsolete">Zertifikatsantrag</translation> </message> <message> <source>OpenSSL config</source> <translation type="obsolete">OpenSSL Konfiguration</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Löschen</translation> </message> <message> <source>Trust</source> <translation type="obsolete">Vertrauen</translation> </message> <message> <location line="-465"/> <source>CA</source> <translation>CA</translation> </message> <message> <location line="+1"/> <source>reflects the basic Constraints extension</source> <translation>Zeigt den Inhalt der basic constraints erweiterung</translation> </message> <message> <source>Transform</source> <translation type="obsolete">Umwandeln</translation> </message> <message> <source>Public Key</source> <translation type="obsolete">Öffentlicher Schlüssel</translation> </message> <message> <source>Similar Certificate</source> <translation type="obsolete">Ähnliches Zertifikat</translation> </message> <message> <source>Properties</source> <translation type="obsolete">Eigenschaften</translation> </message> <message> <source>Generate CRL</source> <translation type="obsolete">CRL erstellen</translation> </message> <message> <source>PKCS#7</source> <translation type="obsolete">PKCS#7</translation> </message> <message> <source>Sign</source> <translation type="obsolete">Unterschreiben</translation> </message> <message> <source>Encrypt</source> <translation type="obsolete">Verschlüsseln</translation> </message> <message> <source>Renewal</source> <translation type="obsolete">Verlängerung</translation> </message> <message> <source>Unrevoke</source> <translation type="obsolete">Rücknahme aufheben</translation> </message> <message> <source>Revoke</source> <translation type="obsolete">Rücknahme</translation> </message> <message> <location line="+618"/> <source>Certificate export</source> <translation>Zertifikatsexport</translation> </message> <message> <location line="+1"/> <source>X509 Certificates ( *.pem *.cer *.crt *.p12 *.p7b )</source> <translation>X509 Zertifikate ( *.cer *.crt *.p12 *.p7b )</translation> </message> <message> <location line="+62"/> <source>Not possible for a token key: '%1'</source> <translation>Nicht möglich für einen Chipkartenschlüssel '%1'</translation> </message> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Es wurde kein Schlüssel gefunden für das Zertifikat: </translation> </message> <message> <source>File to be signed</source> <translation type="obsolete">Zu signierende Datei</translation> </message> <message> <source>All Files ( * )</source> <translation type="obsolete">Alle Dateien ( * )</translation> </message> <message> <source>File to be encrypted</source> <translation type="obsolete">Zu verschlüsselnde Datei</translation> </message> <message> <location line="+363"/> <source> days</source> <translation>Tage</translation> </message> <message> <source>Security token</source> <translation type="obsolete">Chipkarte</translation> </message> <message> <source>Template</source> <translation type="obsolete">Vorlage</translation> </message> <message> <source>Delete from Security token</source> <translation type="obsolete">Von der Chipkarte löschen</translation> </message> <message> <location line="-750"/> <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="+292"/> <source>PEM chain</source> <translation>PEM Kette</translation> </message> <message> <location line="+2"/> <source>PKCS #7 chain</source> <translation>PKCS #7 Kette</translation> </message> <message> <location line="+6"/> <source>PKCS #12 chain</source> <translation>PKCS #12 Kette</translation> </message> <message> <location line="+9"/> <source>PEM + key</source> <translation>PEM + Schlüssel</translation> </message> <message> <location line="+6"/> <source>PKCS #7 trusted</source> <translation>PKCS #7 vertrauenswürdig</translation> </message> <message> <location line="+2"/> <source>PKCS #7 all</source> <translation>PKCS #7 alle</translation> </message> <message> <location line="+2"/> <source>PEM trusted</source> <translation>PEM vertrauenswürdig</translation> </message> <message> <location line="+2"/> <source>PEM all</source> <translation>PEM alle</translation> </message> <message> <location line="+61"/> <location line="+34"/> <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="+4"/> <source>Not possible for the token-key Certificate '%1'</source> <translation>Nicht möglich für das Chipkartenzertifikat '%1'</translation> </message> <message> <location line="-201"/> <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> <source>Other token</source> <translation type="obsolete">Andere Chipkarte</translation> </message> </context> <context> <name>db_x509name</name> <message> <location filename="../lib/db_x509super.cpp" line="+23"/> <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> <message> <source>Country code</source> <translation type="obsolete">Länder code</translation> </message> <message> <source>State or Province</source> <translation type="obsolete">Bundesland, Kreis</translation> </message> <message> <source>Locality</source> <translation type="obsolete">Ort</translation> </message> <message> <source>Organisation</source> <translation type="obsolete">Firma</translation> </message> <message> <source>Organisational unit</source> <translation type="obsolete">Firmenabteilung</translation> </message> <message> <source>Common name</source> <translation type="obsolete">Allgemeine Bezeichnung</translation> </message> <message> <source>E-Mail address</source> <translation type="obsolete">E-Mail Adresse</translation> </message> <message> <source>Serial number</source> <translation type="obsolete">Seriennummer</translation> </message> <message> <source>Given name</source> <translation type="obsolete">Vorname</translation> </message> <message> <source>Surname</source> <translation type="obsolete">Nachname</translation> </message> <message> <source>Title</source> <translation type="obsolete">Titel</translation> </message> <message> <source>Initials</source> <translation type="obsolete">Initialien</translation> </message> <message> <source>Description</source> <translation type="obsolete">Beschreibung</translation> </message> <message> <source>Role</source> <translation type="obsolete">Rolle</translation> </message> <message> <source>Pseudonym</source> <translation type="obsolete">Pseudonym</translation> </message> <message> <source>Generation Qualifier</source> <translation type="obsolete">Generierungskennzeichnung</translation> </message> <message> <source>x500 Unique Identifier</source> <translation type="obsolete">Eindeutige x500 Identifizierung</translation> </message> <message> <source>Name</source> <translation type="obsolete">Name</translation> </message> <message> <source>DN Qualifier</source> <translation type="obsolete">DN Kennzeichnung</translation> </message> <message> <source>Unstructured name</source> <translation type="obsolete">Unstrukturierter Name</translation> </message> <message> <source>Challenge password</source> <translation type="obsolete">Passwort nach Aufforderung</translation> </message> <message> <source>Basic Constraints</source> <translation type="obsolete">Basiseinschränkungen</translation> </message> <message> <source>subject alternative name</source> <translation type="obsolete">Alternativer Eigentümername</translation> </message> <message> <source>issuer alternative name</source> <translation type="obsolete">Alternativer Ausstellername</translation> </message> <message> <source>Subject key identifier</source> <translation type="obsolete">Inhaberschlüssel identifizierung</translation> </message> <message> <source>Authority key identifier</source> <translation type="obsolete">Ausstellerschlüssel identifizierung</translation> </message> <message> <source>Key usage</source> <translation type="obsolete">Schlüsselverwendung</translation> </message> <message> <source>Extended key usage</source> <translation type="obsolete">Erweiterte Schlüsselverwendung</translation> </message> <message> <source>CRL distribution points</source> <translation type="obsolete">CRL Verteilungspunkte</translation> </message> <message> <source>Authority information access</source> <translation type="obsolete">Aussteller informations zugriff</translation> </message> <message> <source>Certificate type</source> <translation type="obsolete">Zertifikatstyp</translation> </message> <message> <source>Base URL</source> <translation type="obsolete">Basis URL</translation> </message> <message> <source>Revocation URL</source> <translation type="obsolete">Sperrlisten URL</translation> </message> <message> <source>CA Revocation URL</source> <translation type="obsolete">CA Sperrlisten URL</translation> </message> <message> <source>Certificate renewal URL</source> <translation type="obsolete">Zertifikatsverlängerungs URL</translation> </message> <message> <source>CA policy URL</source> <translation type="obsolete">CA Richtlinien URL</translation> </message> <message> <source>SSL server name</source> <translation type="obsolete">SSL Servername</translation> </message> <message> <source>Comment</source> <translation type="obsolete">Kommentar</translation> </message> </context> <context> <name>db_x509req</name> <message> <source>Certificate request ( *.pem *.der *.crl )</source> <translation type="obsolete">Zertifikatsantrag ( *.pem *.der *.crl )</translation> </message> <message> <location filename="../lib/db_x509req.cpp" line="+155"/> <source>Certificate request export</source> <translation>Zertifikatsantrag exportieren</translation> </message> <message> <source>New Request</source> <translation type="obsolete">Neuer Zertifikatsantrag</translation> </message> <message> <source>Import</source> <translation type="obsolete">Import</translation> </message> <message> <source>Extract public Key</source> <translation type="obsolete">Öffentlichen Schlüssel extrahieren</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Umbenennen</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Details anzeigen</translation> </message> <message> <source>Sign</source> <translation type="obsolete">Unterschreiben</translation> </message> <message> <source>Export</source> <translation type="obsolete">Export</translation> </message> <message> <source>Clipboard</source> <translation type="obsolete">Zwischenablage</translation> </message> <message> <source>OpenSSL config</source> <translation type="obsolete">OpenSSL Konfiguration</translation> </message> <message> <source>Transform</source> <translation type="obsolete">Umwandeln</translation> </message> <message> <source>Public Key</source> <translation type="obsolete">Öffentlicher Schlüssel</translation> </message> <message> <source>Similar Request</source> <translation type="obsolete">Ähnlicher Zertifikatsantrag</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Löschen</translation> </message> <message> <location line="-125"/> <source>Signed</source> <translation>Signiert</translation> </message> <message> <location line="+1"/> <source>whether the request is already signed or not</source> <translation>Ob der Zertifikatsantrag 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="+122"/> <source>Certificate request ( *.pem *.der *.csr )</source> <translation>Zertifikatsantrag ( *.pem *.der *.csr )</translation> </message> <message> <source>File</source> <translation type="obsolete">Datei</translation> </message> <message> <source>Template</source> <translation type="obsolete">Vorlage</translation> </message> <message> <location line="-106"/> <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="+35"/> <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="+1"/> <source>Signature Algorithm</source> <translation>Signatur algorithmus</translation> </message> <message> <location line="+77"/> <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="+68"/> <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 revocation list '%1'?</source> <translation>Die Sperrliste '%1' löschen?</translation> </message> <message> <location line="+1"/> <source>Successfully created the revocation list '%1'</source> <translation>Die Sperrliste '%1' wurde erfolgreich erstellt</translation> </message> <message> <location line="+2"/> <source>Delete the %1 revocation 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="+244"/> <source>unknown</source> <translation>unbekannt</translation> </message> <message> <location line="-266"/> <source>Unable to load the revocation 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 revocation list '%1'</source> <translation>Die Sperrliste '%1' wurde erfolgreich importiert</translation> </message> <message> <location line="+100"/> <location line="+217"/> <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="+177"/> <source>Failed to decrypt the key (bad password) </source> <translation>Konnte den Schlüssel nicht entschlüsseln. (Falsches Passwort)</translation> </message> <message> <location line="+195"/> <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> <source>Unable to load the private key in file %1. Tried PEM and DER private, public and PKCS#8 key types.</source> <translation type="obsolete">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="-278"/> <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="+53"/> <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="+62"/> <source>Unable to load the private key in file %1. Tried PEM and DER private, public, PKCS#8 key types and SSH2 format.</source> <translation>Der Schlüssel aus der Datei %1 konnte nicht geladen werden. Private und öffentliche, sowie SSH2 und PKCS#8 Schlüssel im PEM und DER format wurden versucht.</translation> </message> <message> <location line="+35"/> <source>Ignoring unsupported private key</source> <translation>Ignoriere nicht unterstützen privaten Schlüssel</translation> </message> <message> <location line="+32"/> <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> <source>Do you really want to export the private key unencrypted to the clipboard ?</source> <translation type="obsolete">Soll der private Schlüssel wirklich unverschlüsselt in die Zwischenablage kopiert werden ?</translation> </message> <message> <source>Only export the public key</source> <translation type="obsolete">Nur den öffentlichen Schlüssel exportieren</translation> </message> <message> <source>Export the private key unencrypted</source> <translation type="obsolete">Privaten Schlüssel unverschlüsselt exportieren</translation> </message> <message> <location filename="../lib/pki_key.cpp" line="+142"/> <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="+9"/> <source>public key</source> <translation>öffentlicher Schlüssel</translation> </message> <message> <location line="+188"/> <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="+22"/> <location line="+5"/> <location line="+3"/> <source>Invalid SSH2 public key</source> <translation>Üngültiger öffentlicher SSH2 Schlüssel</translation> </message> <message> <location line="+113"/> <source>Failed writing to %1</source> <translation>Fehler beim Schreiben von %1</translation> </message> <message> <location line="-153"/> <source>PIN</source> <translation>PIN</translation> </message> </context> <context> <name>pki_multi</name> <message> <location filename="../lib/pki_multi.cpp" line="+129"/> <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="+354"/> <source>This Key is already on the token</source> <translation>Der Schlüssel ist bereits auf der SmartCard</translation> </message> <message> <source>Only RSA and EC keys can be stored on tokens</source> <translation type="obsolete">Auf der Chipkarte können nur RSA oder EC Schlüssel gespeichert werden</translation> </message> <message> <location line="+87"/> <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="+131"/> <source>Public Key missmatch. Please re-import card</source> <translation>Öffentlicher Schlüssel passt nicht. Bitte Chipkarte neu importieren</translation> </message> <message> <location line="+73"/> <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="+75"/> <location line="+13"/> <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="-6"/> <source>Invalid Pin for the token</source> <translation>Ungültige Pin für die Chipkarte</translation> </message> <message> <location line="-438"/> <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="-230"/> <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="+366"/> <source>PIN input aborted</source> <translation>PIN Eingabe abgebrochen</translation> </message> <message> <location line="+115"/> <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="+85"/> <source>Illegal Key generation method</source> <translation>Ungültige Schlüsselgenerierungsmethode</translation> </message> <message> <location line="+67"/> <source>Ignoring unsupported token key</source> <translation>Ignoriere nicht unterstützten Chipkartenschlüssel</translation> </message> <message> <location line="+4"/> <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> <message> <location line="+28"/> <source>Failed to initialize the key on the token</source> <translation>Der Schlüssel auf der Chipkarte konnte nicht initialisiert werden</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="+278"/> <source>Template file content error (too small)</source> <translation>Fehler bei Vorlagendatei (zu klein)</translation> </message> <message> <location line="+11"/> <source>Template file content error (bad size)</source> <translation>Fehler bei Vorlagendatei (zu klein)</translation> </message> <message> <location line="+46"/> <source>Template file content error (too small): %1</source> <translation>Template zu klein: %1</translation> </message> <message> <location line="+33"/> <source>Not a PEM encoded XCA Template</source> <translation>Dies ist keine PEM formatierte XCA Vorlage</translation> </message> <message> <location line="+7"/> <source>Not an XCA Template, but '%1'</source> <translation>Dies ist keine XCA Vorlage, sondern: %1</translation> </message> <message> <source>Template file content error (bad length) :%1</source> <translation type="obsolete">Templatefile ungültig (länge): %1</translation> </message> <message> <location line="-183"/> <location line="+280"/> <source>Wrong Size %1</source> <translation>Ungültige Größe %1</translation> </message> <message> <location line="-473"/> <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> <source>Template file content error (bad size): %1 </source> <translation type="obsolete">Templatefile ungültig (Größe): %1</translation> </message> </context> <context> <name>pki_x509</name> <message> <location filename="../lib/pki_x509.cpp" line="+861"/> <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="-388"/> <source>There is no key for signing !</source> <translation>Kein Schlüssel zum Unterschreiben!</translation> </message> <message> <location line="-401"/> <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="+170"/> <source>This certificate is already on the security token</source> <translation>Dieses Zertifikat ist bereits auf der Chipkarte</translation> </message> <message> <location line="+62"/> <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> <source>CRL expires: %1</source> <translation type="obsolete">CRL ungültig ab: %1</translation> </message> <message> <location line="+549"/> <source>No</source> <translation>Nein</translation> </message> <message> <location line="+2"/> <source>Yes</source> <translation>Ja</translation> </message> <message> <location line="-824"/> <source>Successfully imported the certificate '%1'</source> <translation>Das Zertifikat '%1' wurde erfolgreich importiert</translation> </message> <message> <location line="+460"/> <location line="+533"/> <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="+281"/> <source>Signed</source> <translation>Signiert</translation> </message> <message> <location line="+0"/> <source>Unhandled</source> <translation>Unbehandelt</translation> </message> <message> <location line="+54"/> <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="+187"/> <source>Validation successful: '%1'</source> <translation>Überprüfung erfolgreich: '%1'</translation> </message> <message> <location line="-94"/> <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="+71"/> <source>Validation failed: '%1' %2</source> <translation>Überprüfung fehlgeschlagen: '%1' %2</translation> </message> </context> <context> <name>void</name> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Es wurde kein Schlüssel gefunden für das Zertifikat: </translation> </message> <message> <source>Import Certificate signing request</source> <translation type="obsolete">Zertifikatsantrag importieren</translation> </message> </context> </TS> �������������������������������������������������������������������������xca-1.3.2/lang/xca_es.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000422577�12606205164�0015046�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0"> <context> <name>About</name> <message> <location filename="../ui/About.ui" line="+89"/> <source>Done</source> <translation>Hecho</translation> </message> </context> <context> <name>CaProperties</name> <message> <location filename="../ui/CaProperties.ui" line="+30"/> <source>CA Properties</source> <translation>Propiedades de la CA</translation> </message> <message> <location line="+65"/> <source>Use random Serial numbers</source> <translation>Usar números de Serie aleatorios</translation> </message> <message> <location line="+7"/> <source>Days until next CRL issuing</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Default template</source> <translation>Plantilla predeterminada</translation> </message> <message> <location line="+10"/> <source>Next serial for signing</source> <translation type="unfinished"></translation> </message> </context> <context> <name>CertDetail</name> <message> <location filename="../ui/CertDetail.ui" line="+36"/> <source>Details of the Certificate</source> <translation>Detalles del Certificado</translation> </message> <message> <location line="+48"/> <source>S&tatus</source> <translation>Estado</translation> </message> <message> <location line="+54"/> <source>Serial</source> <translation>Número de serie</translation> </message> <message> <location line="+13"/> <source>The serial number of the certificate</source> <translation>El número de serie del certificado</translation> </message> <message> <location line="+9"/> <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> <location line="+7"/> <source>Internal name</source> <translation>Nombre interno</translation> </message> <message> <location line="+23"/> <source>Signature algorithm</source> <translation>Firma</translation> </message> <message> <location line="+7"/> <source>Signature</source> <translation>Firma</translation> </message> <message> <location line="+7"/> <source>Key</source> <translation>Clave</translation> </message> <message> <location line="+10"/> <source>Fingerprints</source> <translation>Huellas digitales</translation> </message> <message> <location line="+20"/> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <location line="-14"/> <source>MD5</source> <translation>MD5</translation> </message> <message> <location line="+21"/> <source>A SHA-1 hashsum of the certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="-14"/> <source>An md5 hashsum of the certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+21"/> <source>SHA256</source> <translation type="unfinished">SHA256</translation> </message> <message> <location line="+7"/> <source>A SHA-256 hashsum of the certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Validity</source> <translation>Validez</translation> </message> <message> <location line="+12"/> <source>The time since the certificate is valid</source> <translation>El momento desde el que el certificado es válido</translation> </message> <message> <location line="+7"/> <source>The time until the certificate is valid</source> <translation>El momento hasta el que el certificado es válido</translation> </message> <message> <location line="+34"/> <source>&Subject</source> <translation>As&unto</translation> </message> <message> <location line="+16"/> <source>&Issuer</source> <translation type="unfinished"></translation> </message> <message> <location line="+16"/> <source>Attributes</source> <translation>Atributos</translation> </message> <message> <location line="+10"/> <source>&Extensions</source> <translation>&Extensiones</translation> </message> <message> <location line="+13"/> <location filename="../widgets/CertDetail.cpp" line="+33"/> <source>Show config</source> <translation>Mostrar configuración</translation> </message> <message> <location filename="../widgets/CertDetail.cpp" line="+4"/> <source>Show extensions</source> <translation>Mostrar extensiones</translation> </message> <message> <location line="+19"/> <source>Not available</source> <translation>No disponible</translation> </message> <message> <location line="+25"/> <source>Details of the certificate</source> <translation>Detalles del certificado</translation> </message> <message> <location line="+9"/> <source>Signer unknown</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Self signed</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Not trusted</source> <translation>No fiable</translation> </message> <message> <location line="+4"/> <source>Trusted</source> <translation>Fiable</translation> </message> <message> <location line="+20"/> <source>Revoked: </source> <translation>Revocado: </translation> </message> <message> <location line="+5"/> <source>Not valid</source> <translation>No válido</translation> </message> <message> <location line="+4"/> <source>Valid</source> <translation>Válido</translation> </message> <message> <location line="+19"/> <source>Details of the certificate signing request</source> <translation>Detalles de la solicitud</translation> </message> </context> <context> <name>CertExtend</name> <message> <location filename="../ui/CertExtend.ui" line="+30"/> <source>Certificate renewal</source> <translation>Renovación de certificado</translation> </message> <message> <location line="+44"/> <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="+26"/> <source>Validity</source> <translation>Validez</translation> </message> <message> <location line="+11"/> <source>Not before</source> <translation>No antes de</translation> </message> <message> <location line="+7"/> <source>Not after</source> <translation>No después de</translation> </message> <message> <location line="+26"/> <source>Time range</source> <translation>Rango de tiempo</translation> </message> <message> <location line="+32"/> <source>No well-defined expiration</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>Apply</source> <translation>Aplicar</translation> </message> <message> <location line="+26"/> <source>Revoke old certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="-58"/> <source>Days</source> <translation>Días</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Meses</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Años</translation> </message> <message> <location line="+15"/> <source>Midnight</source> <translation>Medianoche</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="+2"/> <location line="+22"/> <source>Edit times</source> <translation type="unfinished"></translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Abort rollout</source> <translation type="unfinished"></translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Continue rollout</source> <translation type="unfinished"></translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Adjust date and continue</source> <translation type="unfinished"></translation> </message> <message> <location line="-5"/> <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 filename="../ui/CertExtend.ui" line="-33"/> <source>Local time</source> <translation type="unfinished"></translation> </message> </context> <context> <name>CertTreeView</name> <message> <location filename="../widgets/CertTreeView.cpp" line="+25"/> <source>Import PKCS#12</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import from PKCS#7</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>Request</source> <translation type="unfinished">Solicitud</translation> </message> <message> <location line="+2"/> <source>Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Other token</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Similar Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Delete from Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>CA</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Properties</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Generate CRL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Manage revocations</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Trust</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Renewal</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Revoke</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unrevoke</source> <translation type="unfinished"></translation> </message> </context> <context> <name>ClickLabel</name> <message> <location filename="../widgets/clicklabel.cpp" line="+23"/> <source>Double click for details</source> <translation>Haga doble click para obtener detalles</translation> </message> </context> <context> <name>CrlDetail</name> <message> <location filename="../ui/CrlDetail.ui" line="+30"/> <source>Details of the Revocation list</source> <translation type="unfinished"></translation> </message> <message> <location line="+48"/> <source>&Status</source> <translation type="unfinished"></translation> </message> <message> <location line="+48"/> <source>Version</source> <translation type="unfinished"></translation> </message> <message> <location line="+19"/> <source>Signature</source> <translation>Firma</translation> </message> <message> <location line="+7"/> <source>Signed by</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Name</source> <translation>Nombre</translation> </message> <message> <location line="+7"/> <source>The internal name of the CRL in the database</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>issuing dates</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <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 type="unfinished"></translation> </message> <message> <location line="+13"/> <source>&Extensions</source> <translation type="unfinished">&Extensiones</translation> </message> <message> <location line="+20"/> <source>&Revocation list</source> <translation type="unfinished"></translation> </message> <message> <source>Serial</source> <translation type="obsolete">Número de serie</translation> </message> <message> <location filename="../widgets/CrlDetail.cpp" line="+45"/> <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> </context> <context> <name>ExportDialog</name> <message> <location filename="../ui/ExportDialog.ui" line="+142"/> <source>...</source> <translation>...</translation> </message> <message> <location line="+13"/> <source>Filename</source> <translation type="unfinished"></translation> </message> <message> <location line="+40"/> <source>Export Format</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/ExportDialog.cpp" line="+37"/> <source>All files ( * )</source> <translation type="unfinished"></translation> </message> <message> <location line="+15"/> <source>PEM Text format with headers</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Concatenated list of all selected items in one PEM text file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Concatenated text format of the complete certificate chain in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all trusted certificates in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all certificates in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Binary DER encoded file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PKCS#7 encoded single certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS#7 encoded complete certificate chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All trusted certificates encoded in one PKCS#7 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All selected certificates encoded in one PKCS#7 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All certificates encoded in one PKCS#7 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>The certificate and the private key as encrypted PKCS#12 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>The complete certificate chain and the private key as encrypted PKCS#12 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the unencrypted private key in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the encrypted private key in PKCS#8 format in one file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Text format of the public key in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Binary DER format of the public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>OpenSSL specific encrypted private key in text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in binary DER format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in PKCS#8 text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Encrypted private key in PKCS#8 text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>The public key encoded in SSH2 format</source> <translation type="unfinished"></translation> </message> <message> <location line="+39"/> <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> <message> <location filename="../ui/ExportDialog.ui" line="-103"/> <source>Name</source> <translation type="unfinished">Nombre</translation> </message> <message> <location line="+7"/> <source>The internal name of the CRL in the database</source> <translation type="unfinished"></translation> </message> </context> <context> <name>ExportKey</name> <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="obsolete">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 type="obsolete">Introduzca nombre de fichero que contendrá la clave.</translation> </message> </context> <context> <name>Help</name> <message> <location filename="../ui/Help.ui" line="+36"/> <source><<</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>>></source> <translation type="unfinished"></translation> </message> <message> <location line="+26"/> <source>&Done</source> <translation type="unfinished"></translation> </message> </context> <context> <name>ImportMulti</name> <message> <location filename="../ui/ImportMulti.ui" line="+36"/> <source>Import PKI Items</source> <translation type="unfinished"></translation> </message> <message> <location line="+58"/> <source>Import &All</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>&Import</source> <translation type="unfinished">Importar</translation> </message> <message> <location line="+7"/> <source>&Done</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>&Remove from list</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Details</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <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="+60"/> <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> <message> <location line="+39"/> <location line="+144"/> <source>The type of the Item '%1' is not recognized</source> <translation type="unfinished"></translation> </message> <message> <location line="+48"/> <source>Details of the item '%1' cannot be shown</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>The type of the item '%1' is not recognized</source> <translation type="unfinished"></translation> </message> <message> <location line="+29"/> <source>The file '%1' did not contain PKI data</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>The %1 files: '%2' did not contain PKI data</source> <translation type="unfinished"></translation> </message> </context> <context> <name>KeyDetail</name> <message> <location filename="../ui/KeyDetail.ui" line="+91"/> <source>Name</source> <translation>Nombre</translation> </message> <message> <location line="+7"/> <source>The internal name of the key used by xca</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Manufacturer</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>Serial</source> <translation type="unfinished">Número de serie</translation> </message> <message> <location line="+17"/> <location filename="../widgets/KeyDetail.cpp" line="+62"/> <source>Key</source> <translation type="unfinished">Clave</translation> </message> <message> <location line="+8"/> <source>Public Exponent</source> <translation>Exponente público</translation> </message> <message> <location line="+26"/> <source>Keysize</source> <translation>Tamaño de clave</translation> </message> <message> <location line="+27"/> <source>Private Exponent</source> <translation>Exponente secreto</translation> </message> <message> <location line="+25"/> <source>Modulus</source> <translation>Módulo</translation> </message> <message> <location filename="../widgets/KeyDetail.cpp" line="-13"/> <source>Details of the %1 key</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Not available</source> <translation>Disponible</translation> </message> <message> <location line="+5"/> <source>Token</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Security token ID:%1</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Available</source> <translation>Disponible</translation> </message> <message> <location line="+9"/> <source>Sub prime</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <location line="+9"/> <source>Public key</source> <translation type="unfinished"></translation> </message> <message> <location line="-8"/> <location line="+9"/> <source>Private key</source> <translation>Exponente secreto</translation> </message> <message> <location line="+1"/> <source>Curve name</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Unknown key</source> <translation type="unfinished"></translation> </message> </context> <context> <name>KeyTreeView</name> <message> <location filename="../widgets/KeyTreeView.cpp" line="+28"/> <source>Change password</source> <translation type="unfinished">Cambiar contraseña</translation> </message> <message> <location line="+4"/> <source>Reset password</source> <translation type="unfinished">Restablecer la contraseña</translation> </message> <message> <location line="+10"/> <source>Change PIN</source> <translation type="unfinished">Cambiar 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"></translation> </message> <message> <location line="+3"/> <source>Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+33"/> <location line="+18"/> <location line="+18"/> <source>This is not a token</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <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> </context> <context> <name>MainWindow</name> <message> <location filename="../ui/MainWindow.ui" line="+22"/> <source>Private Keys</source> <translation type="unfinished"></translation> </message> <message> <location line="+27"/> <source>&New Key</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <location line="+105"/> <location line="+92"/> <location line="+138"/> <location line="+58"/> <source>&Export</source> <translation type="unfinished"></translation> </message> <message> <location line="-386"/> <location line="+105"/> <location line="+92"/> <location line="+124"/> <location line="+72"/> <source>&Import</source> <translation>Importar</translation> </message> <message> <location line="-386"/> <source>Import PFX (PKCS#12)</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <location line="+98"/> <location line="+92"/> <location line="+196"/> <source>&Show Details</source> <translation type="unfinished"></translation> </message> <message> <location line="-379"/> <location line="+98"/> <location line="+92"/> <location line="+103"/> <location line="+93"/> <source>&Delete</source> <translation type="unfinished"></translation> </message> <message> <location line="-346"/> <source>Certificate signing requests</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>&New Request</source> <translation type="unfinished"></translation> </message> <message> <location line="+68"/> <location filename="../widgets/MW_menu.cpp" line="+124"/> <source>Certificates</source> <translation type="unfinished"></translation> </message> <message> <location line="+24"/> <source>&New Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+35"/> <source>Import &PKCS#12</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Import P&KCS#7</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Plain View</source> <translation type="unfinished"></translation> </message> <message> <location line="+40"/> <source>Templates</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>&New template</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Ch&ange Template</source> <translation type="unfinished"></translation> </message> <message> <location line="+61"/> <source>Revocation lists</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="+166"/> <source>Using or exporting private keys will not be possible without providing the correct password</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <location filename="../widgets/MainWindow.cpp" line="+914"/> <source>Database</source> <translation type="unfinished"></translation> </message> <message> <location line="+69"/> <source>No deleted items found</source> <translation type="unfinished"></translation> </message> <message> <location line="+99"/> <source>Errors detected and repaired while deleting outdated items from the database. A backup file was created</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Removing deleted or outdated items from the database failed.</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-61"/> <source>System</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Croatian</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>English</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>French</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>German</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Russian</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Spanish</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Turkish</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Language</source> <translation type="unfinished"></translation> </message> <message> <location line="+15"/> <source>&File</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>&New DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Open DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Generate DH parameter</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Set as default DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Close DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Dump DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>C&hange DataBase password</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Import old db_dump</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Undelete items</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Options</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>Exit</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>I&mport</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Keys</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Requests</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS#12</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PKCS#7</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Template</source> <translation type="unfinished">Plantilla</translation> </message> <message> <location line="+1"/> <source>Revocation list</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>paste PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Token</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>&Manage Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Init Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Change PIN</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Change &SO PIN</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Init PIN</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>&Help</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>&Content</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>About</source> <translation type="unfinished"></translation> </message> <message> <location line="+71"/> <source>Database dump ( *.dump );;All files ( * )</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Import password</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Please enter the password of the old database</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Password verification error. Ignore keys ?</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Import anyway</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-613"/> <source>no such option: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+86"/> <source>Import PEM data</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>Please enter the original SO PIN (PUK) of the token '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Please enter the new SO PIN (PUK) of the token '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>The new label of the token '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+109"/> <source>The token '%1' did not contain any keys or certificates</source> <translation type="unfinished"></translation> </message> <message> <location line="+53"/> <source>Current Password</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Please enter the current database password</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>The entered password is wrong</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <location line="+105"/> <source>New Password</source> <translation type="unfinished"></translation> </message> <message> <location line="-105"/> <source>Please enter the new password to encrypt your private keys in the database-file</source> <translation type="unfinished"></translation> </message> <message> <location line="+105"/> <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="+26"/> <source>Password verify error, please try again</source> <translation>Contraeña incorrecta, inténtelo de nuevo</translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Contraseña</translation> </message> <message> <location line="+1"/> <source>Please enter the password for unlocking the database: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+34"/> <source>The following error occured:</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Copy to Clipboard</source> <translation type="unfinished"></translation> </message> <message> <location line="+80"/> <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 line="+23"/> <source>Error opening file: '%1': %2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-175"/> <source>Recent DataBases</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NewCrl</name> <message> <location filename="../ui/NewCrl.ui" line="+30"/> <source>Create CRL</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>last update</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>next update</source> <translation type="unfinished"></translation> </message> <message> <location line="+29"/> <source>Days</source> <translation type="unfinished">Días</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation type="unfinished">Meses</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation type="unfinished">Años</translation> </message> <message> <location line="+8"/> <source>Midnight</source> <translation type="unfinished">Medianoche</translation> </message> <message> <location line="+14"/> <source>Apply</source> <translation type="unfinished">Aplicar</translation> </message> <message> <location line="+58"/> <source>Hash algorithm</source> <translation type="unfinished"></translation> </message> <message> <location line="-10"/> <source>Authority key identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="-17"/> <source>Subject alternative name</source> <translation type="unfinished"></translation> </message> <message> <location line="-19"/> <source>Options</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>CRL Number</source> <translation type="unfinished"></translation> </message> <message> <location line="+17"/> <source>Revocation reasons</source> <translation type="unfinished"></translation> </message> <message> <location line="-45"/> <source>Local time</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 type="unfinished"></translation> </message> <message> <location line="+47"/> <source>Please give a name to the new key and select the desired keysize</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Key properties</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Name</source> <translation>Nombre</translation> </message> <message> <location line="+19"/> <source>The internal name of the new key</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>New Key</source> <translation>Nueva clave</translation> </message> <message> <location line="+27"/> <source>Curve</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Keysize</source> <translation>Tamaño de clave</translation> </message> <message> <location line="+13"/> <source>Usually 1024 or 2048 bit keys are used</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Keytype</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/NewKey.cpp" line="+180"/> <source>Create</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/NewKey.ui" line="+10"/> <source>Remember as default</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NewX509</name> <message> <location filename="../ui/NewX509.ui" line="+75"/> <source>Source</source> <translation type="unfinished"></translation> </message> <message> <location line="+22"/> <source>Signing request</source> <translation type="unfinished"></translation> </message> <message> <location line="+24"/> <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="+10"/> <source>Modify subject of the request</source> <translation type="unfinished"></translation> </message> <message> <location line="+41"/> <source>Signing</source> <translation type="unfinished"></translation> </message> <message> <location line="+20"/> <source>Create a &self signed certificate with the serial</source> <translation type="unfinished"></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 type="unfinished"></translation> </message> <message> <location line="+17"/> <source>Use &this Certificate for signing</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>All certificates in your database that can create valid signatures</source> <translation type="unfinished"></translation> </message> <message> <location line="+33"/> <source>Signature algorithm</source> <translation>Firma</translation> </message> <message> <location line="+28"/> <source>Template for the new certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>All available templates</source> <translation type="unfinished"></translation> </message> <message> <location line="+22"/> <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 line="+29"/> <location filename="../widgets/NewX509.cpp" line="+602"/> <source>Subject</source> <translation>Sujeto</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-466"/> <source>This name is only used internally and does not appear in the resulting certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Internal name</source> <translation type="unfinished">Nombre interno</translation> </message> <message> <location filename="../ui/NewX509.ui" line="+45"/> <source>Add</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation type="unfinished">Eliminar</translation> </message> <message> <location line="+37"/> <source>Private key</source> <translation>Exponente secreto</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 type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Type</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>If this will become a CA certificate or not</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Not defined</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Certification Authority</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>End Entity</source> <translation type="unfinished"></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="+7"/> <source>The basic constraints should always be critical</source> <translation type="unfinished"></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 type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Copy the Subject Key Identifier from the issuer</source> <translation type="unfinished"></translation> </message> <message> <location line="+40"/> <source>Validity</source> <translation>Validez</translation> </message> <message> <location line="+6"/> <source>Not before</source> <translation type="unfinished">No antes de</translation> </message> <message> <location line="+14"/> <source>Not after</source> <translation type="unfinished">No después de</translation> </message> <message> <location line="+17"/> <source>Time range</source> <translation type="unfinished">Rango de tiempo</translation> </message> <message> <location line="+10"/> <source>Days</source> <translation type="unfinished">Días</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation type="unfinished">Meses</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation type="unfinished">Años</translation> </message> <message> <location line="+14"/> <source>Apply</source> <translation type="unfinished">Aplicar</translation> </message> <message> <location line="+7"/> <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 type="unfinished">Medianoche</translation> </message> <message> <location line="+14"/> <source>No well-defined expiration</source> <translation type="unfinished"></translation> </message> <message> <location line="+100"/> <source>URI:</source> <translation type="unfinished"></translation> </message> <message> <location line="+36"/> <source>can be altered by the file "aia.txt"</source> <translation type="unfinished"></translation> </message> <message> <location line="-79"/> <location line="+17"/> <location line="+33"/> <location line="+43"/> <location filename="../widgets/NewX509.cpp" line="+848"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> <location line="-100"/> <location line="+17"/> <location line="+76"/> <source>DNS: IP: URI: email: RID:</source> <translation type="unfinished"></translation> </message> <message> <location line="+39"/> <source>Key usage</source> <translation type="unfinished"></translation> </message> <message> <location line="+126"/> <source>Netscape</source> <translation type="unfinished"></translation> </message> <message> <location line="+170"/> <source>Advanced</source> <translation type="unfinished"></translation> </message> <message> <location line="+24"/> <location filename="../widgets/NewX509.cpp" line="+10"/> <source>Validate</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-897"/> <source>Create a &self signed certificate with a MD5-hashed QA serial</source> <translation type="unfinished"></translation> </message> <message> <location line="+180"/> <source>Create Certificate signing request</source> <translation type="unfinished"></translation> </message> <message> <location line="+27"/> <source>minimum size: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>maximum size: %1</source> <translation type="unfinished"></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="+41"/> <source>Create x509 Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+700"/> <source>From PKCS#10 request</source> <translation type="unfinished"></translation> </message> <message> <location line="-37"/> <source>Other Tabs</source> <translation type="unfinished"></translation> </message> <message> <location line="-753"/> <source>Critical</source> <translation type="unfinished"></translation> </message> <message> <location line="+73"/> <source>Create XCA template</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Edit XCA template</source> <translation type="unfinished"></translation> </message> <message> <location line="+689"/> <source>Advanced Tab</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Errors</source> <translation type="unfinished"></translation> </message> <message> <location line="+103"/> <location line="+13"/> <location line="+19"/> <location line="+12"/> <location line="+16"/> <location line="+14"/> <location line="+34"/> <location line="+11"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Abort rollout</source> <translation type="unfinished"></translation> </message> <message> <location line="-174"/> <source>The following length restrictions of RFC3280 are violated:</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <location line="+61"/> <source>Edit subject</source> <translation type="unfinished"></translation> </message> <message> <location line="-59"/> <location line="+61"/> <location line="+45"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Continue rollout</source> <translation type="unfinished"></translation> </message> <message> <location line="-154"/> <source>The verification of the Certificate request failed. The rollout should be aborted.</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Continue anyway</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <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="+1"/> <source>Edit name</source> <translation type="unfinished"></translation> </message> <message> <location line="+15"/> <source>There is no Key selected for signing.</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <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="+34"/> <source>The key you selected for signing is not a private one.</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <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="+2"/> <location line="+23"/> <location line="+22"/> <source>Edit dates</source> <translation type="unfinished"></translation> </message> <message> <location line="-42"/> <location line="+23"/> <source>Adjust date and continue</source> <translation type="unfinished"></translation> </message> <message> <location line="-5"/> <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="+22"/> <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 line="+21"/> <source>Edit extensions</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"></translation> </message> <message> <location filename="../ui/NewX509.ui" line="-855"/> <source>Distinguished name</source> <translation type="unfinished"></translation> </message> <message> <location line="+346"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-2"/> <source>The certificate contains invalid or duplicate extensions. Check the validation on the advanced tab.</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Options</name> <message> <location filename="../ui/Options.ui" line="+28"/> <source>XCA Options</source> <translation type="unfinished"></translation> </message> <message> <location line="+120"/> <source>Mandatory subject entries</source> <translation type="unfinished"></translation> </message> <message> <location line="+24"/> <location line="+60"/> <location line="+57"/> <source>Add</source> <translation type="unfinished"></translation> </message> <message> <location line="-110"/> <location line="+60"/> <source>Delete</source> <translation type="unfinished">Eliminar</translation> </message> <message> <location line="-183"/> <source>Default hash algorithm</source> <translation type="unfinished"></translation> </message> <message> <location line="-14"/> <source>Settings</source> <translation type="unfinished"></translation> </message> <message> <location line="+34"/> <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="+14"/> <source>Translate established x509 terms (%1 -> %2)</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>The hashing functionality of the token is not used by XCA. It may however honor a restricted hash-set propagated by the token. Especially EC and DSA are only defined with SHA1 in the PKCS#11 specification.</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Only use hashes supported by the token when signing with a token key</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Disable legacy Netscape extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+21"/> <source>Distinguished name</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>Explicit subject entries</source> <translation type="unfinished"></translation> </message> <message> <location line="+42"/> <source>Default</source> <translation type="unfinished"></translation> </message> <message> <location line="+26"/> <source>PKCS#11 provider</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>Remove</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/Options.cpp" line="+32"/> <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="+1"/> <source>UTF8 strings only (RFC2459)</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>All strings</source> <translation type="unfinished"></translation> </message> <message> <location line="+155"/> <source>Load failed</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/Options.ui" line="-207"/> <source>Don't colorize expired certificates</source> <translation type="unfinished"></translation> </message> <message> <location line="+214"/> <source>Search</source> <translation type="unfinished"></translation> </message> </context> <context> <name>PwDialog</name> <message> <location filename="../ui/PwDialog.ui" line="+121"/> <source>Take as HEX string</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/PwDialog.cpp" line="+85"/> <source>Repeat %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>%1 missmatch</source> <translation type="unfinished"></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"></translation> </message> <message> <location line="+26"/> <source>E&xit</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/PwDialog.ui" line="-3"/> <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> </context> <context> <name>QObject</name> <message> <location filename="../lib/asn1time.cpp" line="+142"/> <location line="+10"/> <location line="+19"/> <source>Undefined</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/db.cpp" line="+223"/> <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 line="+10"/> <source>DB: Write error %1 - %2</source> <translation type="unfinished"></translation> </message> <message> <location line="+324"/> <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/exception.h" line="+55"/> <source>Out of Memory at %1:%2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/load_obj.cpp" line="+20"/> <source>All files ( * )</source> <translation type="unfinished"></translation> </message> <message> <location line="+32"/> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;SSH Public Keys ( *.pub );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Import RSA key</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Import Request</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>Certificates ( *.pem *.der *.crt *.cer );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import X.509 Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>PKCS#7 data ( *.p7s *.p7m *.p7b );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import PKCS#7 Certificates</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>PKCS#12 Certificates ( *.p12 *.pfx );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import PKCS#12 Private Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>XCA templates ( *.xca );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import XCA Templates</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>Revocation lists ( *.pem *.der *.crl );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import Certificate Revocation List</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>XCA Databases ( *.xdb );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Open XCA Database</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>PKCS#11 library ( *.dll );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS#11 library ( *.dylib *.so );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <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 line="+7"/> <source>PEM files ( *.pem );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Load PEM encoded file</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/pkcs11.cpp" line="+228"/> <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="+48"/> <source>No Security token found</source> <translation type="unfinished"></translation> </message> <message> <location 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="+92"/> <source>Required PIN size: %1 - %2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/pkcs11_lib.cpp" line="+57"/> <source>Failed to open PKCS11 library: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+219"/> <source>PKCS#11 function '%1' failed: %2</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>PKCS#11 function '%1' failed: %2 In library %3 %4</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/asn1time.cpp" line="-27"/> <location line="+10"/> <location line="+19"/> <source>Broken / Invalid</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/func.cpp" line="+441"/> <source>Country code</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>State or Province</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Locality</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Organisation</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Organisational unit</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Common name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>E-Mail address</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Serial number</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Given name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Surname</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Title</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Initials</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Description</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Role</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Pseudonym</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Generation Qualifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>x500 Unique Identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Name</source> <translation type="unfinished">Nombre</translation> </message> <message> <location line="+1"/> <source>DN Qualifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Unstructured name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Challenge password</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Basic Constraints</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>subject alternative name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>issuer alternative name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Subject key identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Authority key identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Key usage</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Extended key usage</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>CRL distribution points</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Authority information access</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Certificate type</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Base URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>CA Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Certificate renewal URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>CA policy URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>SSL server name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Comment</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/x509v3ext.cpp" line="+75"/> <source>String '%1' for '%2' contains invalid characters</source> <translation type="unfinished"></translation> </message> </context> <context> <name>ReqTreeView</name> <message> <location filename="../widgets/ReqTreeView.cpp" line="+23"/> <source>Sign</source> <translation type="unfinished">Firma</translation> </message> <message> <location line="+2"/> <source>Similar Request</source> <translation type="unfinished"></translation> </message> </context> <context> <name>RevocationList</name> <message> <location filename="../ui/RevocationList.ui" line="+30"/> <source>Manage revocations</source> <translation type="unfinished"></translation> </message> <message> <location line="+66"/> <source>Add</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation type="unfinished">Eliminar</translation> </message> <message> <location filename="../widgets/RevocationList.cpp" line="+70"/> <source>No.</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Serial</source> <translation type="unfinished">Número de serie</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>Generate CRL</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Revoke</name> <message> <location filename="../ui/Revoke.ui" line="+87"/> <source>Revocation details</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>Invalid since</source> <translation type="unfinished"></translation> </message> <message> <location line="-21"/> <source>Revocation reason</source> <translation type="unfinished"></translation> </message> <message> <location line="-66"/> <source>Certificate revocation</source> <translation type="unfinished"></translation> </message> <message> <location line="+80"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>Serial</source> <translation type="unfinished">Número de serie</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 type="unfinished"></translation> </message> <message> <location line="+25"/> <source>Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+47"/> <source>Please select the security token</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TempTreeView</name> <message> <location filename="../widgets/TempTreeView.cpp" line="+20"/> <source>Duplicate</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Create certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Create request</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>copy</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TrustState</name> <message> <location filename="../ui/TrustState.ui" line="+33"/> <source>Certificate trust</source> <translation type="unfinished"></translation> </message> <message> <location line="+60"/> <source>Trustment</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>&Never trust this certificate</source> <translation type="unfinished"></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 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"></translation> </message> </context> <context> <name>X509SuperTreeView</name> <message> <location filename="../widgets/X509SuperTreeView.cpp" line="+25"/> <source>OpenSSL config</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Transform</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Template</source> <translation type="unfinished">Plantilla</translation> </message> <message> <location line="+2"/> <source>Public Key</source> <translation type="unfinished"></translation> </message> </context> <context> <name>XcaTreeView</name> <message> <location filename="../widgets/XcaTreeView.cpp" line="+282"/> <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="+1"/> <source>Netscape extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Reset</source> <translation type="unfinished"></translation> </message> <message> <location line="+47"/> <source>Columns</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>New</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import</source> <translation type="unfinished">Importar</translation> </message> <message> <location line="+1"/> <source>Paste PEM data</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Rename</source> <translation type="unfinished">Renombrar</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation type="unfinished">Eliminar</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation type="unfinished">Portapapeles</translation> </message> <message> <location line="+2"/> <source>File</source> <translation type="unfinished">Archivo</translation> </message> </context> <context> <name>db_base</name> <message> <location filename="../lib/db_base.cpp" line="+211"/> <source>Internal name</source> <translation type="unfinished">Nombre interno</translation> </message> <message> <location line="-136"/> <source>Bad database item Name: %1 Type: %2 Size: %3 %4</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Do you want to delete the item from the database? The bad item may be extracted into a separate file.</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation type="unfinished">Eliminar</translation> </message> <message> <location line="+1"/> <source>Delete and extract</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Continue</source> <translation type="unfinished"></translation> </message> <message> <location line="+19"/> <location line="+540"/> <source>Error opening file: '%1': %2</source> <translation type="unfinished"></translation> </message> <message> <location line="-430"/> <source>No.</source> <translation type="unfinished"></translation> </message> <message> <location line="+404"/> <source>How to export the %1 selected items</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Each item in one file</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>Save %1 items in one file as</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PEM Files( *.pem );; All files ( * )</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_crl</name> <message> <location filename="../lib/db_crl.cpp" line="+31"/> <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"></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="+75"/> <source>The revocation list already exists in the database as: '%1' and so it was not imported</source> <translation type="unfinished"></translation> </message> <message> <location line="+41"/> <source>CRL ( *.pem *.der *.crl )</source> <translation type="unfinished"></translation> </message> <message> <location line="+59"/> <source>There are no CA certificates for CRL generation</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>Select CA certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="-68"/> <source>Revocation list export</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">Importar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Renombrar</translation> </message> <message> <source>Clipboard</source> <translation type="obsolete">Portapapeles</translation> </message> <message> <source>File</source> <translation type="obsolete">Archivo</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Eliminar</translation> </message> </context> <context> <name>db_key</name> <message> <location filename="../lib/db_key.cpp" line="+44"/> <source>Type</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Size</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Use</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Contraseña</translation> </message> <message> <location line="+54"/> <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="+30"/> <source>Key size too small !</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>You are sure to create a key of the size: %1 ?</source> <translation type="unfinished"></translation> </message> <message> <source>New Key</source> <translation type="obsolete">Nueva clave</translation> </message> <message> <source>Import</source> <translation type="obsolete">Importar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Renombrar</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Mostrar detalles</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Eliminar</translation> </message> <message> <source>Export</source> <translation type="obsolete">Exportar</translation> </message> <message> <source>Change password</source> <translation type="obsolete">Cambiar contraseña</translation> </message> <message> <source>Reset password</source> <translation type="obsolete">Restablecer la contraseña</translation> </message> <message> <source>Change PIN</source> <translation type="obsolete">Cambiar PIN</translation> </message> <message> <location line="+96"/> <source>Export public key [%1]</source> <translation type="unfinished"></translation> </message> <message> <location line="-25"/> <location line="+35"/> <source>PEM public</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>DER public</source> <translation type="unfinished"></translation> </message> <message> <location line="-33"/> <location line="+37"/> <source>SSH2 public</source> <translation type="unfinished"></translation> </message> <message> <location line="-31"/> <source>Export keys to Clipboard</source> <translation type="unfinished"></translation> </message> <message> <location line="+36"/> <source>DER private</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PEM encryped</source> <translation type="unfinished"></translation> </message> <message> <location line="-41"/> <location line="+46"/> <source>PEM private</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS#8 encrypted</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Export private key [%1]</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Private Keys ( *.pem *.der *.pk8 );; SSH Public Keys ( *.pub )</source> <translation type="unfinished"></translation> </message> <message> <location line="+56"/> <source>Tried to change password of a token</source> <translation type="unfinished"></translation> </message> <message> <location line="-285"/> <source>EC Group</source> <translation type="unfinished"></translation> </message> <message> <location line="+181"/> <source>Clipboard</source> <translation type="unfinished">Portapapeles</translation> </message> <message> <source>File</source> <translation type="obsolete">Archivo</translation> </message> </context> <context> <name>db_temp</name> <message> <location filename="../lib/db_temp.cpp" line="+56"/> <source>Type</source> <translation type="unfinished"></translation> </message> <message> <location line="-8"/> <source>Bad template: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+71"/> <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="+45"/> <source>Save template as</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>XCA templates ( *.xca);; All files ( * )</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">Importar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Renombrar</translation> </message> <message> <source>Export</source> <translation type="obsolete">Importar</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Eliminar</translation> </message> </context> <context> <name>db_x509</name> <message> <location filename="../lib/db_x509.cpp" line="+57"/> <source>CA</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>reflects the basic Constraints extension</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Serial</source> <translation type="unfinished">Número de serie</translation> </message> <message> <location line="+1"/> <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>sha256 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="+1"/> <source>Expiry date</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <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="+1"/> <source>CRL Expiration</source> <translation type="unfinished"></translation> </message> <message> <location line="+103"/> <source>Plain View</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Tree View</source> <translation type="unfinished"></translation> </message> <message> <location line="+178"/> <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="+133"/> <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="+2"/> <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="+49"/> <source>Store the certificate to the key on the token '%1 (#%2)' ?</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">Importar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Renombrar</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Mostrar detalles</translation> </message> <message> <source>Export</source> <translation type="obsolete">Exportar</translation> </message> <message> <source>Clipboard</source> <translation type="obsolete">Portapapeles</translation> </message> <message> <source>File</source> <translation type="obsolete">Archivo</translation> </message> <message> <source>Request</source> <translation type="obsolete">Solicitud</translation> </message> <message> <location line="+73"/> <source>PEM chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS #7 chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>PKCS #12 chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>PEM + key</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>PKCS #7 trusted</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS #7 all</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PEM trusted</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PEM all</source> <translation type="unfinished"></translation> </message> <message> <source>Template</source> <translation type="obsolete">Plantilla</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Eliminar</translation> </message> <message> <source>Sign</source> <translation type="obsolete">Firma</translation> </message> <message> <location line="+3"/> <source>Certificate export</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>X509 Certificates ( *.pem *.cer *.crt *.p12 *.p7b )</source> <translation type="unfinished"></translation> </message> <message> <location line="+57"/> <location line="+34"/> <source>There was no key found for the Certificate: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="-29"/> <source>Not possible for a token key: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+33"/> <source>Not possible for the token-key Certificate '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+330"/> <source> days</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_x509name</name> <message> <location filename="../lib/db_x509super.cpp" line="+23"/> <source>Subject</source> <translation>Sujeto</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> <message> <source>Name</source> <translation type="obsolete">Nombre</translation> </message> </context> <context> <name>db_x509req</name> <message> <location filename="../lib/db_x509req.cpp" line="+30"/> <source>Signed</source> <translation>Firma</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="+2"/> <source>Challenge password</source> <translation type="unfinished"></translation> </message> <message> <location line="+16"/> <source>The certificate signing request already exists in the database as '%1' and thus was not stored</source> <translation type="unfinished"></translation> </message> <message> <location line="+105"/> <source>Certificate request export</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Certificate request ( *.pem *.der *.csr )</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">Importar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Renombrar</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Mostrar detalles</translation> </message> <message> <source>Sign</source> <translation type="obsolete">Firma</translation> </message> <message> <source>Export</source> <translation type="obsolete">Importar</translation> </message> <message> <source>Clipboard</source> <translation type="obsolete">Portapapeles</translation> </message> <message> <source>File</source> <translation type="obsolete">Archivo</translation> </message> <message> <source>Template</source> <translation type="obsolete">Plantilla</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Eliminar</translation> </message> </context> <context> <name>db_x509super</name> <message> <location filename="../lib/db_x509super.cpp" line="+35"/> <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="+1"/> <source>Signature Algorithm</source> <translation type="unfinished"></translation> </message> <message> <location line="+77"/> <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 type="unfinished"></translation> </message> </context> <context> <name>kvView</name> <message> <location filename="../widgets/kvView.cpp" line="+164"/> <source>Type</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Content</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pass_info</name> <message> <location filename="../lib/pass_info.cpp" line="+21"/> <source>Password</source> <translation>Contraseña</translation> </message> <message> <location line="+6"/> <source>PIN</source> <translation type="unfinished"></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 type="unfinished"></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 type="unfinished"></translation> </message> <message> <location filename="../lib/pki_base.h" line="+68"/> <source>Internal error: Unexpected message: %1 %2</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_crl</name> <message> <location filename="../lib/pki_crl.cpp" line="+46"/> <source>Successfully imported the revocation list '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the revocation list '%1'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the revocation list '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete the %1 revocation lists: %2?</source> <translation type="unfinished"></translation> </message> <message> <location line="+20"/> <source>Unable to load the revocation list in file %1. Tried PEM and DER formatted CRL.</source> <translation type="unfinished"></translation> </message> <message> <location line="+22"/> <source>No issuer given</source> <translation type="unfinished"></translation> </message> <message> <location line="+54"/> <location line="+217"/> <source>Wrong Size %1</source> <translation type="unfinished"></translation> </message> <message> <location line="-27"/> <source>unknown</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_evp</name> <message> <location filename="../lib/pki_evp.cpp" line="+177"/> <source>Failed to decrypt the key (bad password) </source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Please enter the password to decrypt the private key.</source> <translation type="unfinished"></translation> </message> <message> <location line="+53"/> <source>Please enter the password to decrypt the private key from file: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>Unable to load the private key in file %1. Tried PEM and DER private, public, PKCS#8 key types and SSH2 format.</source> <translation type="unfinished"></translation> </message> <message> <location line="+67"/> <source>Please enter the password to decrypt the private key: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <location line="+11"/> <source>Password input aborted</source> <translation type="unfinished"></translation> </message> <message> <location line="-3"/> <source>Please enter the database password for decrypting the key '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+85"/> <source>Please enter the password to protect the private key: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+15"/> <source>Please enter the database password for encrypting the key</source> <translation type="unfinished"></translation> </message> <message> <location line="+83"/> <source>Please enter the password protecting the PKCS#8 key '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+35"/> <source>Please enter the export password for the private key '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="-261"/> <source>Ignoring unsupported private key</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_key</name> <message> <location filename="../lib/pki_key.cpp" line="+142"/> <source>Successfully imported the %1 public key '%2'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the %1 public key '%2'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Successfully imported the %1 private key '%2'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the %1 private key '%2'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the %1 private key '%2'</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Delete the %1 keys: %2?</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+188"/> <source>Common</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Private</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Bogus</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>PIN</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>No password</source> <translation type="unfinished"></translation> </message> <message> <location line="+22"/> <location line="+5"/> <location line="+3"/> <source>Invalid SSH2 public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+113"/> <source>Failed writing to %1</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_multi</name> <message> <location filename="../lib/pki_multi.cpp" line="+129"/> <location line="+5"/> <location line="+5"/> <source>Seek failed</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_pkcs12</name> <message> <location filename="../lib/pki_pkcs12.cpp" line="+38"/> <source>Please enter the password to decrypt the PKCS#12 file: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>Unable to load the PKCS#12 (pfx) file %1.</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>The supplied password was wrong (%1)</source> <translation type="unfinished"></translation> </message> <message> <location line="+52"/> <source>Please enter the password to encrypt the PKCS#12 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>No key or no Cert and no pkcs12</source> <translation type="unfinished"></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 type="unfinished"></translation> </message> </context> <context> <name>pki_scard</name> <message> <location filename="../lib/pki_scard.cpp" line="+59"/> <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"></translation> </message> <message> <location line="+226"/> <source>Delete the private key '%1' from the token '%2 (#%3)' ?</source> <translation type="unfinished"></translation> </message> <message> <location line="+65"/> <source>This Key is already on the token</source> <translation type="unfinished"></translation> </message> <message> <location line="+75"/> <source>PIN input aborted</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>Unable to find copied key on the token</source> <translation type="unfinished"></translation> </message> <message> <location line="+103"/> <source>Please insert card: %1 %2 [%3] with Serial: %4</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>Public Key missmatch. Please re-import card</source> <translation type="unfinished"></translation> </message> <message> <location line="+73"/> <source>Unable to find generated key on card</source> <translation type="unfinished"></translation> </message> <message> <location line="+55"/> <source>Wrong Size %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Token %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <location line="+13"/> <source>Failed to find the key on the token</source> <translation type="unfinished"></translation> </message> <message> <location line="-6"/> <source>Invalid Pin for the token</source> <translation type="unfinished"></translation> </message> <message> <location line="-98"/> <source>Illegal Key generation method</source> <translation type="unfinished"></translation> </message> <message> <location line="+67"/> <source>Ignoring unsupported token key</source> <translation type="unfinished"></translation> </message> <message> <location line="+43"/> <source>Failed to initialize the key on the token</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_temp</name> <message> <location filename="../lib/pki_temp.cpp" line="+99"/> <source>Successfully imported the XCA template '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the XCA template '%1'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the XCA template '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete the %1 XCA templates: %2?</source> <translation type="unfinished"></translation> </message> <message> <location line="+189"/> <location line="+280"/> <source>Wrong Size %1</source> <translation type="unfinished"></translation> </message> <message> <location line="-194"/> <source>Template file content error (too small)</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Template file content error (bad size)</source> <translation type="unfinished"></translation> </message> <message> <location line="+46"/> <source>Template file content error (too small): %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+33"/> <source>Not a PEM encoded XCA Template</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Not an XCA Template, but '%1'</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_x509</name> <message> <location filename="../lib/pki_x509.cpp" line="+71"/> <source>Successfully imported the certificate '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the certificate '%1'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the certificate '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificates: %2?</source> <translation type="unfinished"></translation> </message> <message> <location line="+37"/> <source>Unable to load the certificate in file %1. Tried PEM and DER certificate.</source> <translation type="unfinished"></translation> </message> <message> <location line="+170"/> <source>This certificate is already on the security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>Delete the certificate '%1' from the token '%2 (#%3)'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+129"/> <source>There is no key for signing !</source> <translation type="unfinished"></translation> </message> <message> <location line="+58"/> <location line="+533"/> <source>Wrong Size %1</source> <translation type="unfinished"></translation> </message> <message> <location line="-203"/> <source>Not trusted</source> <translation type="unfinished">No fiable</translation> </message> <message> <location line="+0"/> <source>Trust inherited</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Always Trusted</source> <translation type="unfinished"></translation> </message> <message> <location line="+32"/> <source>No</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Yes</source> <translation type="unfinished"></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"></translation> </message> <message> <location line="+1"/> <source>Delete the %1 certificate request '%2'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the %1 certificate request '%2'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificate requests: %2?</source> <translation type="unfinished"></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"></translation> </message> <message> <location line="+281"/> <source>Signed</source> <translation type="unfinished">Firma</translation> </message> <message> <location line="+0"/> <source>Unhandled</source> <translation type="unfinished"></translation> </message> <message> <location line="+54"/> <source>Wrong Size %1</source> <translation type="unfinished"></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">Eliminar</translation> </message> <message> <location line="+32"/> <source>Apply</source> <translation type="unfinished">Aplicar</translation> </message> <message> <location line="+7"/> <source>Validate</source> <translation type="unfinished"></translation> </message> <message> <location line="+29"/> <source>Cancel</source> <translation>Cancelar</translation> </message> <message> <location filename="../widgets/v3ext.cpp" line="+93"/> <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="+4"/> <source>Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>No editing. Only 'copy' allowed here</source> <translation type="unfinished"></translation> </message> <message> <location line="+67"/> <source>Validation failed: '%1' %2</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Validation successful: '%1'</source> <translation type="unfinished"></translation> </message> </context> </TS> ���������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lang/xca_fr.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000435416�12606205164�0015042�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0"> <context> <name>About</name> <message> <location filename="../ui/About.ui" line="+89"/> <source>Done</source> <translation>Terminé</translation> </message> </context> <context> <name>CaProperties</name> <message> <location filename="../ui/CaProperties.ui" line="+30"/> <source>CA Properties</source> <translation>Propriétés du CA</translation> </message> <message> <location line="+65"/> <source>Use random Serial numbers</source> <translation>Utiliser des numéros de série aléatoires</translation> </message> <message> <location line="+7"/> <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> <location line="+10"/> <source>Default template</source> <translation>Modèle par défaut</translation> </message> <message> <location line="+10"/> <source>Next serial for signing</source> <translation>Numéro de série suivant pour la signature</translation> </message> </context> <context> <name>CertDetail</name> <message> <location filename="../ui/CertDetail.ui" line="+36"/> <source>Details of the Certificate</source> <translation>Détails du Certificat</translation> </message> <message> <location line="+48"/> <source>S&tatus</source> <translation>E&tat</translation> </message> <message> <location line="+54"/> <source>Serial</source> <translation>Numéro de série</translation> </message> <message> <location line="+13"/> <source>The serial number of the certificate</source> <translation>Le numéro de série du certificat</translation> </message> <message> <location line="+9"/> <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> <location line="+7"/> <source>Internal name</source> <translation>Nom interne</translation> </message> <message> <location line="+23"/> <source>Signature algorithm</source> <translation>Algorithme de signature</translation> </message> <message> <location line="+7"/> <source>Signature</source> <translation>Signature</translation> </message> <message> <location line="+7"/> <source>Key</source> <translation>Clé</translation> </message> <message> <location line="+10"/> <source>Fingerprints</source> <translation>Empreinte</translation> </message> <message> <location line="+20"/> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <location line="-14"/> <source>MD5</source> <translation>MD5</translation> </message> <message> <location line="+21"/> <source>A SHA-1 hashsum of the certificate</source> <translation>La somme de hachage SHA-1 du certificat</translation> </message> <message> <location line="-14"/> <source>An md5 hashsum of the certificate</source> <translation>La somme de hachage MD5 du certificat</translation> </message> <message> <location line="+21"/> <source>SHA256</source> <translation>SHA256</translation> </message> <message> <location line="+7"/> <source>A SHA-256 hashsum of the certificate</source> <translation>La somme de hachage SHA-1 du certificat</translation> </message> <message> <location line="+10"/> <source>Validity</source> <translation>Validité</translation> </message> <message> <location line="+12"/> <source>The time since the certificate is valid</source> <translation>Le moment depuis lequel le certificat est valide</translation> </message> <message> <location line="+7"/> <source>The time until the certificate is valid</source> <translation>Le moment auquel le certificat échoit</translation> </message> <message> <location line="+34"/> <source>&Subject</source> <translation>&Sujet</translation> </message> <message> <location line="+16"/> <source>&Issuer</source> <translation>&Emetteur</translation> </message> <message> <location line="+16"/> <source>Attributes</source> <translation>Attributs</translation> </message> <message> <location line="+10"/> <source>&Extensions</source> <translation>E&xtensions</translation> </message> <message> <location line="+13"/> <location filename="../widgets/CertDetail.cpp" line="+33"/> <source>Show config</source> <translation>Afficher la configuration</translation> </message> <message> <location filename="../widgets/CertDetail.cpp" line="+4"/> <source>Show extensions</source> <translation>Afficher les extensions</translation> </message> <message> <location line="+19"/> <source>Not available</source> <translation>Non disponible</translation> </message> <message> <location line="+25"/> <source>Details of the certificate</source> <translation>Détails du certificat</translation> </message> <message> <location line="+9"/> <source>Signer unknown</source> <translation>Signataire inconnu</translation> </message> <message> <location line="+4"/> <source>Self signed</source> <translation>Auto-signé</translation> </message> <message> <location line="+11"/> <source>Not trusted</source> <translation>Pas sûr</translation> </message> <message> <location line="+4"/> <source>Trusted</source> <translation>Sûr</translation> </message> <message> <location line="+20"/> <source>Revoked: </source> <translation>Révoqués: </translation> </message> <message> <location line="+5"/> <source>Not valid</source> <translation>Echu</translation> </message> <message> <location line="+4"/> <source>Valid</source> <translation>Valide</translation> </message> <message> <location line="+19"/> <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> <location filename="../ui/CertExtend.ui" line="+30"/> <source>Certificate renewal</source> <translation>Renouvellement du certificat</translation> </message> <message> <location line="+44"/> <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> <location line="+26"/> <source>Validity</source> <translation>Validité</translation> </message> <message> <location line="+11"/> <source>Not before</source> <translation>Pas avant</translation> </message> <message> <location line="+7"/> <source>Not after</source> <translation>Pas après</translation> </message> <message> <location line="+26"/> <source>Time range</source> <translation>Intervalle de temps</translation> </message> <message> <location line="+14"/> <source>Days</source> <translation>Jours</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Mois</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Années</translation> </message> <message> <location line="+22"/> <source>Apply</source> <translation>Appliquer</translation> </message> <message> <location line="+26"/> <source>Revoke old certificate</source> <translation>Révoquer le vieux certificat</translation> </message> <message> <location line="-33"/> <source>Midnight</source> <translation>Minuit</translation> </message> <message> <location line="-33"/> <source>Local time</source> <translation>Heure locale</translation> </message> <message> <location line="+26"/> <source>No well-defined expiration</source> <translation>Pas de date d'expiration précise</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>Le certificat serait valide avant son signataire. Ce n'est probablement pas ce qui est désiré.</translation> </message> <message> <location line="+2"/> <location line="+22"/> <source>Edit times</source> <translation>Modifier les limites de validité</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Abort rollout</source> <translation>Interrompre le déploiement</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Continue rollout</source> <translation>Continuer le déploiement</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Adjust date and continue</source> <translation>Ajuster la date et continuer</translation> </message> <message> <location line="-5"/> <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>CertTreeView</name> <message> <location filename="../widgets/CertTreeView.cpp" line="+25"/> <source>Import PKCS#12</source> <translation>Importer en PKCS#12</translation> </message> <message> <location line="+1"/> <source>Import from PKCS#7</source> <translation>Importer en PKCS#7</translation> </message> <message> <location line="+28"/> <source>Request</source> <translation>Requête</translation> </message> <message> <location line="+2"/> <source>Security token</source> <translation>Jeton de sécurité</translation> </message> <message> <location line="+2"/> <source>Other token</source> <translation>Autre jeton</translation> </message> <message> <location line="+4"/> <source>Similar Certificate</source> <translation>Certificat similaire</translation> </message> <message> <location line="+3"/> <source>Delete from Security token</source> <translation>Détruire sur le jeton de sécurité</translation> </message> <message> <location line="+3"/> <source>CA</source> <translation>CA</translation> </message> <message> <location line="+1"/> <source>Properties</source> <translation>Propriétés</translation> </message> <message> <location line="+1"/> <source>Generate CRL</source> <translation>Générer la liste de révocation</translation> </message> <message> <location line="+1"/> <source>Manage revocations</source> <translation>Gérer les révocations</translation> </message> <message> <location line="+4"/> <source>Trust</source> <translation>Niveau de confiance</translation> </message> <message> <location line="+4"/> <source>Renewal</source> <translation>Renouvellement</translation> </message> <message> <location line="+2"/> <source>Revoke</source> <translation>Révoquer</translation> </message> <message> <location line="+2"/> <source>Unrevoke</source> <translation>Dé-révoquer</translation> </message> </context> <context> <name>ClickLabel</name> <message> <location filename="../widgets/clicklabel.cpp" line="+23"/> <source>Double click for details</source> <translation>Double-cliquer pour afficher les détails</translation> </message> </context> <context> <name>CrlDetail</name> <message> <location filename="../ui/CrlDetail.ui" line="+30"/> <source>Details of the Revocation list</source> <translation>Détails de la liste de révocation</translation> </message> <message> <location line="+48"/> <source>&Status</source> <translation>&Etat</translation> </message> <message> <location line="+48"/> <source>Version</source> <translation>Version</translation> </message> <message> <location line="+19"/> <source>Signature</source> <translation>Signature</translation> </message> <message> <location line="+7"/> <source>Signed by</source> <translation>Signé par</translation> </message> <message> <location line="+7"/> <source>Name</source> <translation>Nom</translation> </message> <message> <location line="+7"/> <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> <location line="+13"/> <source>issuing dates</source> <translation>date d'émission</translation> </message> <message> <location line="+9"/> <source>Next Update</source> <translation>Prochaine mise-à-jour</translation> </message> <message> <location line="+7"/> <source>Last Update</source> <translation>Dernière mise-à-jour</translation> </message> <message> <location line="+33"/> <source>&Issuer</source> <translation>&Emetteur</translation> </message> <message> <location line="+13"/> <source>&Extensions</source> <translation>E&xtensions</translation> </message> <message> <location line="+20"/> <source>&Revocation list</source> <translation>Liste de &révocation</translation> </message> <message> <location filename="../widgets/CrlDetail.cpp" line="+45"/> <source>Failed</source> <translation>Echoué</translation> </message> <message> <location line="+6"/> <source>Unknown signer</source> <translation>Signataire inconnu</translation> </message> <message> <location line="+3"/> <source>Verification not possible</source> <translation>Vérification impossible</translation> </message> </context> <context> <name>ExportDialog</name> <message> <location filename="../ui/ExportDialog.ui" line="+92"/> <source>Name</source> <translation>Nom</translation> </message> <message> <location line="+7"/> <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> <location line="+43"/> <source>...</source> <translation>...</translation> </message> <message> <location line="+13"/> <source>Filename</source> <translation>Nom du fichier</translation> </message> <message> <location line="+40"/> <source>Export Format</source> <translation>Format d'exportation</translation> </message> <message> <location filename="../widgets/ExportDialog.cpp" line="+37"/> <source>All files ( * )</source> <translation>Tous les fichiers ( * )</translation> </message> <message> <location line="+15"/> <source>PEM Text format with headers</source> <translation>Format textuel PEM avec des en-têtes</translation> </message> <message> <location line="+2"/> <source>Concatenated list of all selected items in one PEM text file</source> <translation>Concaténation de tous les éléments sélectionnés dans un seul fichier texte en format PEM</translation> </message> <message> <location line="+1"/> <source>Concatenated text format of the complete certificate chain in one PEM file</source> <translation>Fichier PEM contenant la concaténation de tous les certificats de la chaîne</translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all trusted certificates in one PEM file</source> <translation>Fichier PEM contenant la concaténation de tous les certificats de confiance</translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all certificates in one PEM file</source> <translation>Fichier PEM contenant la concaténation de tous les certificats</translation> </message> <message> <location line="+1"/> <source>Binary DER encoded file</source> <translation>Fichier binaire encodé en DER</translation> </message> <message> <location line="+1"/> <source>PKCS#7 encoded single certificate</source> <translation>Un seul certificat encodé en PKCS#7</translation> </message> <message> <location line="+2"/> <source>PKCS#7 encoded complete certificate chain</source> <translation>La chaîne complète de certificats encodée en PKCS#7 dans un seul fichier</translation> </message> <message> <location line="+2"/> <source>All trusted certificates encoded in one PKCS#7 file</source> <translation>Tous les certificats de confiance encodés en un seul fichier PKCS#7</translation> </message> <message> <location line="+2"/> <source>All selected certificates encoded in one PKCS#7 file</source> <translation>Tous les certificats sélectionnés encodés en un seul fichier PKCS#7</translation> </message> <message> <location line="+2"/> <source>All certificates encoded in one PKCS#7 file</source> <translation>Tous les certificats encodés en un seul fichier PKCS#7</translation> </message> <message> <location line="+2"/> <source>The certificate and the private key as encrypted PKCS#12 file</source> <translation>Le certificat et sa clé privée encodés dans un fichier en format PKCS#12</translation> </message> <message> <location line="+1"/> <source>The complete certificate chain and the private key as encrypted PKCS#12 file</source> <translation>La chaîne complète des certificats et la clé privée en un seul fichier PKCS#12</translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the unencrypted private key in one PEM file</source> <translation>La concaténation du certificat et de sa clé privée non-cryptée dans un seul fichier PEM</translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the encrypted private key in PKCS#8 format in one file</source> <translation>La concaténation du certificat et de sa clé privée encryptée en format PKCS#8 dans un seul fichier</translation> </message> <message> <location line="+1"/> <source>Text format of the public key in one PEM file</source> <translation>Formattage textuel de la clé publique dans un fichier PEM</translation> </message> <message> <location line="+1"/> <source>Binary DER format of the public key</source> <translation>Format binaire DER de la clé publique</translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in text format</source> <translation>Clé privée non-cryptée en format texte</translation> </message> <message> <location line="+2"/> <source>OpenSSL specific encrypted private key in text format</source> <translation>Clé privée encryptée spécifiquement par OpenSSL en format texte</translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in binary DER format</source> <translation>Clé privée non-cryptée en format binaire DER</translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in PKCS#8 text format</source> <translation>Clé privée non-cryptée en format texte PKCS#8</translation> </message> <message> <location line="+2"/> <source>Encrypted private key in PKCS#8 text format</source> <translation>Clé privée encryptée en format texte PKCS#8</translation> </message> <message> <location line="+1"/> <source>The public key encoded in SSH2 format</source> <translation>La clé publique encodée en format SSH2</translation> </message> <message> <location line="+39"/> <source>The file: '%1' already exists!</source> <translation>Le fichier '%1' existe déjà!</translation> </message> <message> <location line="+2"/> <source>Overwrite</source> <translation>Ecraser</translation> </message> <message> <location line="+2"/> <source>Do not overwrite</source> <translation>Ne pas écraser</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>&OK</translation> </message> </context> <context> <name>ImportMulti</name> <message> <location filename="../ui/ImportMulti.ui" line="+36"/> <source>Import PKI Items</source> <translation>Importer des objets PKI</translation> </message> <message> <location line="+58"/> <source>Import &All</source> <translation>Importer &tout</translation> </message> <message> <location line="+7"/> <source>&Import</source> <translation>&Importer</translation> </message> <message> <location line="+7"/> <source>&Done</source> <translation>&OK</translation> </message> <message> <location line="+7"/> <source>&Remove from list</source> <translation>&Retirer de la liste</translation> </message> <message> <location line="+7"/> <source>Details</source> <translation>Détails</translation> </message> <message> <location line="+7"/> <source>Delete from token</source> <translation>Enlever du jeton</translation> </message> <message> <location line="+7"/> <source>Rename on token</source> <translation>Renommer dans le jeton</translation> </message> <message> <location filename="../widgets/ImportMulti.cpp" line="+60"/> <source> Name: %1 Model: %2 Serial: %3</source> <translation> Nom: %1 Modèle: %2 Numéro de série: %3</translation> </message> <message> <location line="+5"/> <source>Manage security token</source> <translation>Gérer les jetons de sécurité</translation> </message> <message> <location line="+39"/> <location line="+144"/> <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> <location line="+48"/> <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> <location line="+3"/> <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> <location line="+29"/> <source>The file '%1' did not contain PKI data</source> <translation>Le fichier '%1' ne contient pas de données PKI</translation> </message> <message> <location line="+3"/> <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> <location filename="../ui/KeyDetail.ui" line="+91"/> <source>Name</source> <translation>Nom</translation> </message> <message> <location line="+7"/> <source>The internal name of the key used by xca</source> <translation>Le nom interne de la clé utilisé par xca</translation> </message> <message> <location line="+12"/> <source>Security token</source> <translation>Jeton de sécurité</translation> </message> <message> <location line="+6"/> <source>Manufacturer</source> <translation>Fabricant</translation> </message> <message> <location line="+14"/> <source>Serial</source> <translation>Numéro de série</translation> </message> <message> <location line="+17"/> <location filename="../widgets/KeyDetail.cpp" line="+62"/> <source>Key</source> <translation>Clé</translation> </message> <message> <location line="+8"/> <source>Public Exponent</source> <translation>Exposant public</translation> </message> <message> <location line="+26"/> <source>Keysize</source> <translation>Taille de la clé</translation> </message> <message> <location line="+27"/> <source>Private Exponent</source> <translation>Exposant privé</translation> </message> <message> <location line="+25"/> <source>Modulus</source> <translation>Modulo</translation> </message> <message> <location filename="../widgets/KeyDetail.cpp" line="-13"/> <source>Details of the %1 key</source> <translation>Détails de la clé %1</translation> </message> <message> <location line="+3"/> <source>Not available</source> <translation>Non disponible</translation> </message> <message> <location line="+5"/> <source>Token</source> <translation>Jeton</translation> </message> <message> <location line="+4"/> <source>Security token ID:%1</source> <translation>Identifiant de jeton de sécurité: %1</translation> </message> <message> <location line="+3"/> <source>Available</source> <translation>Disponible</translation> </message> <message> <location line="+9"/> <source>Sub prime</source> <translation>Sous-premier</translation> </message> <message> <location line="+1"/> <location line="+9"/> <source>Public key</source> <translation>Clé publique</translation> </message> <message> <location line="-8"/> <location line="+9"/> <source>Private key</source> <translation>Clé privée</translation> </message> <message> <location line="+1"/> <source>Curve name</source> <translation>Nom de la courbe</translation> </message> <message> <location line="+7"/> <source>Unknown key</source> <translation>Clé inconnue</translation> </message> </context> <context> <name>KeyTreeView</name> <message> <location filename="../widgets/KeyTreeView.cpp" line="+28"/> <source>Change password</source> <translation>Changer le mot de passe</translation> </message> <message> <location line="+4"/> <source>Reset password</source> <translation>Effacer le mot de passe</translation> </message> <message> <location line="+10"/> <source>Change PIN</source> <translation>Changer le NIP</translation> </message> <message> <location line="+2"/> <source>Init PIN with SO PIN (PUK)</source> <translation>Initialiser le NIP avec le PUK</translation> </message> <message> <location line="+2"/> <source>Change SO PIN (PUK)</source> <translation>Changer le PUK</translation> </message> <message> <location line="+3"/> <source>Security token</source> <translation>Jeton de sécurité</translation> </message> <message> <location line="+33"/> <location line="+18"/> <location line="+18"/> <source>This is not a token</source> <translation>Ce n'est pas un jeton</translation> </message> <message> <location line="+28"/> <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> </context> <context> <name>MainWindow</name> <message> <location filename="../ui/MainWindow.ui" line="+22"/> <source>Private Keys</source> <translation>Clés privées</translation> </message> <message> <location line="+27"/> <source>&New Key</source> <translation>&Nouvelle clé</translation> </message> <message> <location line="+7"/> <location line="+105"/> <location line="+92"/> <location line="+138"/> <location line="+58"/> <source>&Export</source> <translation>&Exporter</translation> </message> <message> <location line="-386"/> <location line="+105"/> <location line="+92"/> <location line="+124"/> <location line="+72"/> <source>&Import</source> <translation>&Importer</translation> </message> <message> <location line="-386"/> <source>Import PFX (PKCS#12)</source> <translation>Importer en PFX (PKCS#12)</translation> </message> <message> <location line="+7"/> <location line="+98"/> <location line="+92"/> <location line="+196"/> <source>&Show Details</source> <translation>&Afficher les Détails</translation> </message> <message> <location line="-379"/> <location line="+98"/> <location line="+92"/> <location line="+103"/> <location line="+93"/> <source>&Delete</source> <translation>&Détruire</translation> </message> <message> <location line="-346"/> <source>Certificate signing requests</source> <translation>Requêtes de signature de certificat</translation> </message> <message> <location line="+30"/> <source>&New Request</source> <translation>&Nouvelle requête</translation> </message> <message> <location line="+68"/> <location filename="../widgets/MW_menu.cpp" line="+124"/> <source>Certificates</source> <translation>Certificats</translation> </message> <message> <location line="+24"/> <source>&New Certificate</source> <translation>&Nouveau Certificat</translation> </message> <message> <location line="+35"/> <source>Import &PKCS#12</source> <translation>Importer en &PKCS#12</translation> </message> <message> <location line="+7"/> <source>Import P&KCS#7</source> <translation>Importer en P&KCS#7</translation> </message> <message> <location line="+7"/> <source>Plain View</source> <translation>Vue à plat</translation> </message> <message> <location line="+40"/> <source>Templates</source> <translation>Modèles</translation> </message> <message> <location line="+28"/> <source>&New template</source> <translation>&Nouveau modèle</translation> </message> <message> <location line="+7"/> <source>Ch&ange Template</source> <translation>&Modifier le Modèle</translation> </message> <message> <location line="+61"/> <source>Revocation lists</source> <translation>Listes de révocation</translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="+166"/> <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> <location line="+2"/> <location filename="../widgets/MainWindow.cpp" line="+914"/> <source>Database</source> <translation>Base de donnée</translation> </message> <message> <location line="+69"/> <source>No deleted items found</source> <translation>Aucun objet détruit n'a été trouvé</translation> </message> <message> <location line="+99"/> <source>Errors detected and repaired while deleting outdated items from the database. A backup file was created</source> <translation>Des erreurs ont été détectées et réparées lors de la destruction des éléments échus de la base de données. Un fichier de sauvegarde a été créé</translation> </message> <message> <location line="+2"/> <source>Removing deleted or outdated items from the database failed.</source> <translation>Le nettoyage des éléments détruits ou échus de la base de données a échoué.</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-66"/> <source>Recent DataBases</source> <translation>Bases de données utilisées recemment</translation> </message> <message> <location line="+5"/> <source>System</source> <translation>Système</translation> </message> <message> <location line="+1"/> <source>Croatian</source> <translation>Croate</translation> </message> <message> <location line="+1"/> <source>English</source> <translation>Anglais</translation> </message> <message> <location line="+1"/> <source>French</source> <translation>Français</translation> </message> <message> <location line="+1"/> <source>German</source> <translation>Allemand</translation> </message> <message> <location line="+1"/> <source>Russian</source> <translation>Russe</translation> </message> <message> <location line="+1"/> <source>Spanish</source> <translation>Espagnol</translation> </message> <message> <location line="+1"/> <source>Turkish</source> <translation>Turc</translation> </message> <message> <location line="+2"/> <source>Language</source> <translation>Langue</translation> </message> <message> <location line="+15"/> <source>&File</source> <translation>&Fichier</translation> </message> <message> <location line="+1"/> <source>&New DataBase</source> <translation>&Nouvelle base de données</translation> </message> <message> <location line="+2"/> <source>&Open DataBase</source> <translation>&Ouvrir une base de données</translation> </message> <message> <location line="+3"/> <source>Generate DH parameter</source> <translation>Générer le paramètre DH</translation> </message> <message> <location line="+2"/> <source>Set as default DataBase</source> <translation>Définir comme base de données par défaut</translation> </message> <message> <location line="+2"/> <source>&Close DataBase</source> <translation>&Fermer la base de données</translation> </message> <message> <location line="+2"/> <source>&Dump DataBase</source> <translation>C&licher la base de données</translation> </message> <message> <location line="+2"/> <source>C&hange DataBase password</source> <translation>C&hanger le mot de passe de la base de données</translation> </message> <message> <location line="+2"/> <source>&Import old db_dump</source> <translation>&Importer un cliché de base de données en ancien format (db_dump)</translation> </message> <message> <location line="+2"/> <source>&Undelete items</source> <translation>&Récupérer des objets détruits</translation> </message> <message> <location line="+3"/> <source>Options</source> <translation>Options</translation> </message> <message> <location line="+8"/> <source>Exit</source> <translation>Quitter</translation> </message> <message> <location line="+5"/> <source>I&mport</source> <translation>I&mporter</translation> </message> <message> <location line="+1"/> <source>Keys</source> <translation>Clés</translation> </message> <message> <location line="+1"/> <source>Requests</source> <translation>Requêtes</translation> </message> <message> <location line="+2"/> <source>PKCS#12</source> <translation>PKCS#12</translation> </message> <message> <location line="+1"/> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <location line="+1"/> <source>Template</source> <translation>Modèle</translation> </message> <message> <location line="+1"/> <source>Revocation list</source> <translation>Liste de révocation</translation> </message> <message> <location line="+1"/> <source>PEM file</source> <translation>Fichier PEM</translation> </message> <message> <location line="+1"/> <source>paste PEM file</source> <translation>Coller un fichier PEM</translation> </message> <message> <location line="+2"/> <source>&Token</source> <translation>&Jeton</translation> </message> <message> <location line="+1"/> <source>&Manage Security token</source> <translation>&Gérer le jeton de sécurité</translation> </message> <message> <location line="+2"/> <source>&Init Security token</source> <translation>&Initialiser le jeton de sécurité</translation> </message> <message> <location line="+2"/> <source>&Change PIN</source> <translation>&Changer le NIP</translation> </message> <message> <location line="+2"/> <source>Change &SO PIN</source> <translation>Changer le P&UK</translation> </message> <message> <location line="+2"/> <source>Init PIN</source> <translation>Initialiser le NIP</translation> </message> <message> <location line="+3"/> <source>&Help</source> <translation>&Aide</translation> </message> <message> <location line="+1"/> <source>&Content</source> <translation>&Contenu</translation> </message> <message> <location line="+2"/> <source>About</source> <translation>A propos</translation> </message> <message> <location line="+71"/> <source>Database dump ( *.dump );;All files ( * )</source> <translation>Cliché de base de données ( *.dump );;Tous les fichiers ( * )</translation> </message> <message> <location line="+5"/> <source>Import password</source> <translation>Mot de passe d'importation</translation> </message> <message> <location line="+1"/> <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> <location line="+6"/> <source>Password verification error. Ignore keys ?</source> <translation>La vérification du mot de passe a écoué. Ignorer les clés ?</translation> </message> <message> <location line="+3"/> <source>Import anyway</source> <translation>Importer quand-même</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-613"/> <source>no such option: %1</source> <translation>'%1' n'est pas une option</translation> </message> <message> <location line="+86"/> <source>Import PEM data</source> <translation>Importer les données PEM</translation> </message> <message> <location line="+30"/> <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> <location line="+6"/> <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> <location line="+7"/> <source>The new label of the token '%1'</source> <translation>La nouvelle étiquette du jeton '%1'</translation> </message> <message> <location line="+109"/> <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> <location line="+53"/> <source>Current Password</source> <translation>Mot de passe actuel</translation> </message> <message> <location line="+1"/> <source>Please enter the current database password</source> <translation>SVP saisir le mot de passe de la base de données</translation> </message> <message> <location line="+14"/> <source>The entered password is wrong</source> <translation>Le mot de passe renseigné est inexact</translation> </message> <message> <location line="+5"/> <location line="+105"/> <source>New Password</source> <translation>Nouveau mot de passe</translation> </message> <message> <location line="-105"/> <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> <location line="+105"/> <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> <location line="+26"/> <source>Password verify error, please try again</source> <translation>La vérification du mot de passe a échoué. SVP essayez encore</translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Mot de passe</translation> </message> <message> <location line="+1"/> <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> <location line="+34"/> <source>The following error occured:</source> <translation>L'erreur suivante s'est produite:</translation> </message> <message> <location line="+2"/> <source>Copy to Clipboard</source> <translation>Copier dans le presse-papier</translation> </message> <message> <location line="+80"/> <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> <location line="+23"/> <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> <location filename="../ui/NewCrl.ui" line="+30"/> <source>Create CRL</source> <translation>Créer une liste de révocation</translation> </message> <message> <location line="+62"/> <source>last update</source> <translation>dernière mise-à-jour</translation> </message> <message> <location line="+14"/> <source>next update</source> <translation>prochaine mise-à-jour</translation> </message> <message> <location line="+29"/> <source>Days</source> <translation>Jours</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Mois</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Années</translation> </message> <message> <location line="+8"/> <source>Midnight</source> <translation>Minuit</translation> </message> <message> <location line="+7"/> <source>Local time</source> <translation>Heure locale</translation> </message> <message> <location line="+7"/> <source>Apply</source> <translation>Appliquer</translation> </message> <message> <location line="+58"/> <source>Hash algorithm</source> <translation>Algorithme de hachage</translation> </message> <message> <location line="-10"/> <source>Authority key identifier</source> <translation>Identifiant de clé de l'autorité</translation> </message> <message> <location line="-17"/> <source>Subject alternative name</source> <translation>Nom alternatif du sujet</translation> </message> <message> <location line="-19"/> <source>Options</source> <translation>Options</translation> </message> <message> <location line="+9"/> <source>CRL Number</source> <translation>Numéro de la liste de révocation</translation> </message> <message> <location line="+17"/> <source>Revocation reasons</source> <translation>Raisons de la révocation</translation> </message> </context> <context> <name>NewKey</name> <message> <location filename="../ui/NewKey.ui" line="+14"/> <location line="+25"/> <source>New key</source> <translation>Nouvelle clé</translation> </message> <message> <location line="+47"/> <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> <location line="+10"/> <source>Key properties</source> <translation>Propriétés de la clé</translation> </message> <message> <location line="+6"/> <source>Name</source> <translation>Nom</translation> </message> <message> <location line="+19"/> <source>The internal name of the new key</source> <translation>Le nom interne de la nouvelle clé</translation> </message> <message> <location line="+3"/> <source>New Key</source> <translation>Nouvelle Clé</translation> </message> <message> <location line="+27"/> <source>Curve</source> <translation>Courbe</translation> </message> <message> <location line="+7"/> <source>Keysize</source> <translation>Taille de la clé</translation> </message> <message> <location line="+13"/> <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> <location line="+7"/> <source>Keytype</source> <translation>Type de clé</translation> </message> <message> <location line="+10"/> <source>Remember as default</source> <translation>Enregistrer comme valeur par défaut</translation> </message> <message> <location filename="../widgets/NewKey.cpp" line="+180"/> <source>Create</source> <translation>Créer</translation> </message> </context> <context> <name>NewX509</name> <message> <location filename="../ui/NewX509.ui" line="+75"/> <source>Source</source> <translation>Source</translation> </message> <message> <location line="+22"/> <source>Signing request</source> <translation>Requête de signature</translation> </message> <message> <location line="+24"/> <source>Show request</source> <translation>Afficher la requête</translation> </message> <message> <location line="+7"/> <source>Sign this Certificate signing &request</source> <translation>Signer cette &requête</translation> </message> <message> <location line="+7"/> <source>Copy extensions from the request</source> <translation>Copier les extensions de la requête</translation> </message> <message> <location line="+10"/> <source>Modify subject of the request</source> <translation>Modifier le sujet de la requête</translation> </message> <message> <location line="+41"/> <source>Signing</source> <translation>Signer</translation> </message> <message> <location line="+20"/> <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> <location line="+10"/> <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> <location line="+3"/> <source>1</source> <translation>1</translation> </message> <message> <location line="+17"/> <source>Use &this Certificate for signing</source> <translation>Utiliser &ce certificat pour signer</translation> </message> <message> <location line="+7"/> <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> <location line="+33"/> <source>Signature algorithm</source> <translation>Algorithme de signature</translation> </message> <message> <location line="+28"/> <source>Template for the new certificate</source> <translation>Modèle pour le nouveau certificat</translation> </message> <message> <location line="+12"/> <source>All available templates</source> <translation>Tous les modèles disponibles</translation> </message> <message> <location line="+22"/> <source>Apply extensions</source> <translation>Appliquer les extensions</translation> </message> <message> <location line="+7"/> <source>Apply subject</source> <translation>Appliquer le sujet</translation> </message> <message> <location line="+13"/> <source>Apply all</source> <translation>Appliquer tout</translation> </message> <message> <location line="+29"/> <location filename="../widgets/NewX509.cpp" line="+602"/> <source>Subject</source> <translation>Sujet</translation> </message> <message> <location line="+6"/> <source>Distinguished name</source> <translation>Nom distinctif</translation> </message> <message> <location line="+39"/> <source>Add</source> <translation>Ajouter</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Enlever</translation> </message> <message> <location line="+37"/> <source>Private key</source> <translation>Clé privée</translation> </message> <message> <location line="+18"/> <source>This list only contains unused keys</source> <translation>Cette liste ne contient que les clés inutilisées</translation> </message> <message> <location line="+7"/> <source>Used keys too</source> <translation>Inclure les clés utilisées</translation> </message> <message> <location line="+7"/> <source>&Generate a new key</source> <translation>&Générer une nouvelle clé</translation> </message> <message> <location line="+11"/> <source>Extensions</source> <translation>Extensions</translation> </message> <message> <location line="+11"/> <source>Type</source> <translation>Type</translation> </message> <message> <location line="+7"/> <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> <location line="+4"/> <source>Not defined</source> <translation>Non défini</translation> </message> <message> <location line="+5"/> <source>Certification Authority</source> <translation>Autorité de Certification</translation> </message> <message> <location line="+5"/> <source>End Entity</source> <translation>Entité Finale</translation> </message> <message> <location line="+8"/> <source>Path length</source> <translation>Distance aux feuilles</translation> </message> <message> <location line="+7"/> <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> <location line="+7"/> <source>The basic constraints should always be critical</source> <translation>Les contraintes basiques doivent toujours être critiques</translation> </message> <message> <location line="+13"/> <source>Key identifier</source> <translation>Identifiant de clé</translation> </message> <message> <location line="+15"/> <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> <location line="+10"/> <source>Copy the Subject Key Identifier from the issuer</source> <translation>Copie l'identifiant de clé du sujet du signataire</translation> </message> <message> <location line="+40"/> <source>Validity</source> <translation>Validité</translation> </message> <message> <location line="+6"/> <source>Not before</source> <translation>Pas avant</translation> </message> <message> <location line="+14"/> <source>Not after</source> <translation>Pas après</translation> </message> <message> <location line="+17"/> <source>Time range</source> <translation>Intervalle de temps</translation> </message> <message> <location line="+10"/> <source>Days</source> <translation>Jours</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Mois</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Années</translation> </message> <message> <location line="+14"/> <source>Apply</source> <translation>Appliquer</translation> </message> <message> <location line="+7"/> <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> <location line="+3"/> <source>Midnight</source> <translation>Minuit</translation> </message> <message> <location line="+7"/> <source>Local time</source> <translation>Heure locale</translation> </message> <message> <location line="+7"/> <source>No well-defined expiration</source> <translation>Pas de date d'expiration précise</translation> </message> <message> <location line="+50"/> <location line="+17"/> <location line="+76"/> <source>DNS: IP: URI: email: RID:</source> <translation>DNS: IP: URI: email: RID:</translation> </message> <message> <location line="-86"/> <location line="+17"/> <location line="+33"/> <location line="+43"/> <location filename="../widgets/NewX509.cpp" line="+384"/> <source>Edit</source> <translation>Modifier</translation> </message> <message> <location line="-50"/> <source>URI:</source> <translation>URI:</translation> </message> <message> <location line="+36"/> <source>can be altered by the file "aia.txt"</source> <translation>peut être altéré par le fichier "aia.txt"</translation> </message> <message> <location line="+46"/> <source>Key usage</source> <translation>Utilisation de la clé</translation> </message> <message> <location line="+126"/> <source>Netscape</source> <translation>Netscape</translation> </message> <message> <location line="+170"/> <source>Advanced</source> <translation>Avancé</translation> </message> <message> <location line="+24"/> <location filename="../widgets/NewX509.cpp" line="+10"/> <source>Validate</source> <translation>Valider</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-897"/> <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> <location line="+37"/> <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> <location line="+2"/> <source>Internal name</source> <translation>Nom interne</translation> </message> <message> <location line="+127"/> <source>Critical</source> <translation>Critique</translation> </message> <message> <location line="+14"/> <source>Create Certificate signing request</source> <translation>Créer une requête de signature de certificat</translation> </message> <message> <location line="+27"/> <source>minimum size: %1</source> <translation>taille minimale: %1</translation> </message> <message> <location line="+2"/> <source>maximum size: %1</source> <translation>taille maximale: %1</translation> </message> <message> <location line="+2"/> <source>only a-z A-Z 0-9 '()+,-./:=?</source> <translation>seulement a-z A-Z 0-9 '()+,-./:=?</translation> </message> <message> <location line="+4"/> <source>only 7-bit clean characters</source> <translation>seulement des caractères 7-bit ASCII imprimables</translation> </message> <message> <location line="+24"/> <source>Create XCA template</source> <translation>Créer un modèle XCA</translation> </message> <message> <location line="+4"/> <source>Edit XCA template</source> <translation>Editer un modèle XCA</translation> </message> <message> <location line="+13"/> <source>Create x509 Certificate</source> <translation>Créer un certificat x509</translation> </message> <message> <location line="+663"/> <source>Other Tabs</source> <translation>Autres Onglets</translation> </message> <message> <location line="+13"/> <source>Advanced Tab</source> <translation>Onglet Avancé</translation> </message> <message> <location line="+7"/> <source>Errors</source> <translation>Erreurs</translation> </message> <message> <location line="+17"/> <source>From PKCS#10 request</source> <translation>A partir d'une requête en PKCS#10</translation> </message> <message> <location line="+86"/> <location line="+13"/> <location line="+19"/> <location line="+12"/> <location line="+16"/> <location line="+14"/> <location line="+34"/> <location line="+11"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Abort rollout</source> <translation>Interrompre le déploiement</translation> </message> <message> <location line="-174"/> <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> <location line="+3"/> <location line="+61"/> <source>Edit subject</source> <translation>Modifier le sujet</translation> </message> <message> <location line="-59"/> <location line="+61"/> <location line="+45"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Continue rollout</source> <translation>Continuer le déploiement</translation> </message> <message> <location line="-154"/> <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> <location line="+1"/> <source>Continue anyway</source> <translation>Continuer quand-même</translation> </message> <message> <location line="+11"/> <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> <location line="+1"/> <source>Edit name</source> <translation>Modifier le nom</translation> </message> <message> <location line="+15"/> <source>There is no Key selected for signing.</source> <translation>Aucune clé n'est sélectionnée pour la signature.</translation> </message> <message> <location line="+1"/> <source>Select key</source> <translation>Sélectionner la clé</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>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> <location line="+34"/> <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> <location line="+1"/> <source>Select other signer</source> <translation>Sélectionner un autre signataire</translation> </message> <message> <location line="+0"/> <source>Select other key</source> <translation>Sélectionner une autre clé</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>Le certificat serait valide avant son signataire. Ce n'est probablement pas ce qui est désiré. </translation> </message> <message> <location line="+2"/> <location line="+23"/> <location line="+22"/> <source>Edit dates</source> <translation>Modifier les limites de validité</translation> </message> <message> <location line="-42"/> <location line="+23"/> <source>Adjust date and continue</source> <translation>Ajuster la date et continuer</translation> </message> <message> <location line="-5"/> <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> <location line="+22"/> <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> <location line="+19"/> <source>The certificate contains invalid or duplicate extensions. Check the validation on the advanced tab.</source> <translation>Le certificat contient des extensions dupliquées ou invalides. Vérifier la validité sur l'onglet "Avancé".</translation> </message> <message> <location line="+2"/> <source>Edit extensions</source> <translation>Modifier les extensions</translation> </message> <message> <location filename="../widgets/NewX509_ext.cpp" line="+220"/> <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> <location filename="../ui/Options.ui" line="+28"/> <source>XCA Options</source> <translation>Options de XCA</translation> </message> <message> <location line="+14"/> <source>Settings</source> <translation>Réglages</translation> </message> <message> <location line="+14"/> <source>Default hash algorithm</source> <translation>Algorithme de hachage par défaut</translation> </message> <message> <location line="+20"/> <source>String types</source> <translation>Types de chaînes</translation> </message> <message> <location line="+12"/> <source>Suppress success messages</source> <translation>Supprimer les messages en cas de succès</translation> </message> <message> <location line="+7"/> <source>Don't colorize expired certificates</source> <translation>Ne pas coloriser les certificats expirés</translation> </message> <message> <location line="+7"/> <source>Translate established x509 terms (%1 -> %2)</source> <translation>Traduire les termes standards définis par x509 (%1 -> %2)</translation> </message> <message> <location line="+7"/> <source>The hashing functionality of the token is not used by XCA. It may however honor a restricted hash-set propagated by the token. Especially EC and DSA are only defined with SHA1 in the PKCS#11 specification.</source> <translation>La fonctionalité de hachage du jeton n'est pas utilisée par XCA. Ce dernier peut néanmoins se limiter à un jeu restreint de fonctions de hachage reconnus par le jeton. En particulier, EC et DSA ne sont définis qu'avec SHA1 dans la spécification PKCS#11.</translation> </message> <message> <location line="+5"/> <source>Only use hashes supported by the token when signing with a token key</source> <translation>N'utiliser que des fonction de hachage supportées par le jeton lors d'une signature avec une clé du jeton</translation> </message> <message> <location line="+7"/> <source>Disable legacy Netscape extensions</source> <translation>Désactiver les extensions Netscape désuètes</translation> </message> <message> <location line="+21"/> <source>Distinguished name</source> <translation>Nom distinctif</translation> </message> <message> <location line="+6"/> <source>Mandatory subject entries</source> <translation>Inscriptions du sujet obligatoires</translation> </message> <message> <location line="+24"/> <location line="+60"/> <location line="+57"/> <source>Add</source> <translation>Ajouter</translation> </message> <message> <location line="-110"/> <location line="+60"/> <source>Delete</source> <translation>Enlever</translation> </message> <message> <location line="-35"/> <source>Explicit subject entries</source> <translation>Inscriptions explicites du sujet</translation> </message> <message> <location line="+42"/> <source>Default</source> <translation>Défaut</translation> </message> <message> <location line="+26"/> <source>PKCS#11 provider</source> <translation>Fournisseur PKCS#11</translation> </message> <message> <location line="+30"/> <source>Remove</source> <translation>Enlever</translation> </message> <message> <location line="+7"/> <source>Search</source> <translation>Chercher</translation> </message> <message> <location filename="../widgets/Options.cpp" line="+32"/> <source>Printable string or UTF8 (default)</source> <translation>Chaîne imprimable ou UTF8 (défaut)</translation> </message> <message> <location line="+1"/> <source>PKIX recommendation in RFC2459</source> <translation>La recommandation PKIX est dans la RFC2459</translation> </message> <message> <location line="+1"/> <source>No BMP strings, only printable and T61</source> <translation>Pas de chaîne BMP, seulement imprimable et T61</translation> </message> <message> <location line="+1"/> <source>UTF8 strings only (RFC2459)</source> <translation>Chaînes UTF8 uniquement (RFC2459)</translation> </message> <message> <location line="+1"/> <source>All strings</source> <translation>Toutes les chaînes</translation> </message> <message> <location line="+155"/> <source>Load failed</source> <translation>Le chargement a échoué</translation> </message> </context> <context> <name>PwDialog</name> <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>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> <location line="+3"/> <source>Take as HEX string</source> <translation>Exprimé en hexadécimal</translation> </message> <message> <location filename="../widgets/PwDialog.cpp" line="+85"/> <source>Repeat %1</source> <translation>Répéter %1</translation> </message> <message> <location line="+13"/> <source>%1 missmatch</source> <translation>%1 ne correspond pas</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>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> <location line="+26"/> <source>E&xit</source> <translation>&Quitter</translation> </message> </context> <context> <name>QObject</name> <message> <location filename="../lib/asn1time.cpp" line="+142"/> <location line="+10"/> <location line="+19"/> <source>Undefined</source> <translation>Indéfini</translation> </message> <message> <location line="-27"/> <location line="+10"/> <location line="+19"/> <source>Broken / Invalid</source> <translation>Invalide</translation> </message> <message> <location filename="../lib/db.cpp" line="+223"/> <source>DB: Rename: '%1' already in use</source> <translation>DB: Renommer: '%1' déjà en utilisation</translation> </message> <message> <location line="+4"/> <source>DB: Entry to rename not found: %1</source> <translation>DB: l'inscription à renommer n'a pas été trouvée: '%1'</translation> </message> <message> <location line="+10"/> <source>DB: Write error %1 - %2</source> <translation>DB: Erreur d'écriture %1 - %2</translation> </message> <message> <location line="+324"/> <location line="+17"/> <source>Out of data</source> <translation>A court de données</translation> </message> <message> <location line="+23"/> <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> <location filename="../lib/exception.h" line="+55"/> <source>Out of Memory at %1:%2</source> <translation>A court de mémoire à %1:%2</translation> </message> <message> <location filename="../lib/load_obj.cpp" line="+20"/> <source>All files ( * )</source> <translation>Tous les fichiers ( * )</translation> </message> <message> <location line="+32"/> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;SSH Public Keys ( *.pub );;</source> <translation>Clés PKI ( *.pem *.der *.key );;Clés PKCS#8 ( *.p8 *.pk8 );;Clés publiques SSH ( *.pub );;</translation> </message> <message> <location line="+3"/> <source>Import RSA key</source> <translation>Importer une clé RSA</translation> </message> <message> <location line="+12"/> <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> <location line="+2"/> <source>Import Request</source> <translation>Importer une requête</translation> </message> <message> <location line="+12"/> <source>Certificates ( *.pem *.der *.crt *.cer );;</source> <translation>Certificats ( *.pem *.der *.crt *.cer );;</translation> </message> <message> <location line="+1"/> <source>Import X.509 Certificate</source> <translation>Importer un certificat X.509</translation> </message> <message> <location line="+12"/> <source>PKCS#7 data ( *.p7s *.p7m *.p7b );;</source> <translation>Données PKCS#7 ( *.p7s *.p7m *.p7b );;</translation> </message> <message> <location line="+1"/> <source>Import PKCS#7 Certificates</source> <translation>Importer un certificat PKCS#7</translation> </message> <message> <location line="+12"/> <source>PKCS#12 Certificates ( *.p12 *.pfx );;</source> <translation>Certificats PKCS#12 ( *.p12 *.pfx );;</translation> </message> <message> <location line="+1"/> <source>Import PKCS#12 Private Certificate</source> <translation>Importer un certificat privé PKCS#12</translation> </message> <message> <location line="+13"/> <source>XCA templates ( *.xca );;</source> <translation>Modèles XCA ( *.xca );;</translation> </message> <message> <location line="+1"/> <source>Import XCA Templates</source> <translation>Importer des modèles XCA</translation> </message> <message> <location line="+12"/> <source>Revocation lists ( *.pem *.der *.crl );;</source> <translation>Listes de révocation ( *.pem *.der *.crl );;</translation> </message> <message> <location line="+1"/> <source>Import Certificate Revocation List</source> <translation>Importer une liste de révocation de certificats</translation> </message> <message> <location line="+12"/> <source>XCA Databases ( *.xdb );;</source> <translation>Bases de données XCA ( *.xdb );;</translation> </message> <message> <location line="+1"/> <source>Open XCA Database</source> <translation>Ouvrir une Base de Données XCA</translation> </message> <message> <location line="+8"/> <source>PKCS#11 library ( *.dll );;</source> <translation>Bibliothèque PKCS#11 ( *.dll );;</translation> </message> <message> <location line="+2"/> <source>PKCS#11 library ( *.dylib *.so );;</source> <translation>Bibliothèque PKCS#11 ( *.dylib *.so );;</translation> </message> <message> <location line="+2"/> <source>PKCS#11 library ( *.so );;</source> <translation>Bibliothèque PKCS#11 ( *.so );;</translation> </message> <message> <location line="+2"/> <source>Open PKCS#11 shared library</source> <translation>Ouvrir une bibliothèque partagée PKCS#11</translation> </message> <message> <location line="+7"/> <source>PEM files ( *.pem );;</source> <translation>Fichiers PEM ( *.pem );;</translation> </message> <message> <location line="+1"/> <source>Load PEM encoded file</source> <translation>Charger un fichier encodé en PEM</translation> </message> <message> <location filename="../lib/pkcs11.cpp" line="+228"/> <source>Please enter the PIN on the PinPad</source> <translation>Saisir le NIP sur le pavé prévu à cet effet SVP</translation> </message> <message> <location line="+11"/> <source>Please enter the SO PIN (PUK) of the token %1</source> <translation>SVP saisir le PUK du jeton '%1'</translation> </message> <message> <location line="+1"/> <source>Please enter the PIN of the token %1</source> <translation>SVP saisir le NIP du jeton '%1'</translation> </message> <message> <location line="+48"/> <source>No Security token found</source> <translation>Aucun jeton de sécurité trouvé</translation> </message> <message> <location line="+11"/> <source>Select</source> <translation>Sélectionner</translation> </message> <message> <location line="+22"/> <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> <location line="+2"/> <source>Please enter the new PIN for the token: '%1'</source> <translation>SVP saisir le nouveau NIP pour le jeton: '%1'</translation> </message> <message> <location filename="../lib/pkcs11.h" line="+92"/> <source>Required PIN size: %1 - %2</source> <translation>Taille du NIP requise: %1 - %2</translation> </message> <message> <location filename="../lib/pkcs11_lib.cpp" line="+57"/> <source>Failed to open PKCS11 library: %1</source> <translation>L'ouverture de la bibliothèque PKCS#11 '%1' a échoué</translation> </message> <message> <location line="+219"/> <source>PKCS#11 function '%1' failed: %2</source> <translation>La fonction PKCS#11 '%1' a échoué: %2</translation> </message> <message> <location line="+8"/> <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> <location filename="../lib/x509name.cpp" line="+106"/> <source>Invalid</source> <translation>Invalide</translation> </message> <message> <location line="+113"/> <source>%1 is shorter than %2 bytes: '%3'</source> <translation>%1 est plus court que %2 octets: '%3'</translation> </message> <message> <location line="+5"/> <source>%1 is longer than %2 bytes: '%3'</source> <translation>%1 est plus long que %2 octets: '%3'</translation> </message> <message> <location filename="../lib/func.cpp" line="+441"/> <source>Country code</source> <translation>Code du pays</translation> </message> <message> <location line="+1"/> <source>State or Province</source> <translation>Etat ou Province</translation> </message> <message> <location line="+1"/> <source>Locality</source> <translation>Ville</translation> </message> <message> <location line="+1"/> <source>Organisation</source> <translation>Organisation</translation> </message> <message> <location line="+1"/> <source>Organisational unit</source> <translation>Unité organisationnelle</translation> </message> <message> <location line="+1"/> <source>Common name</source> <translation>Nom commun</translation> </message> <message> <location line="+1"/> <source>E-Mail address</source> <translation>Adresse de courriel</translation> </message> <message> <location line="+1"/> <source>Serial number</source> <translation>Numéro de série</translation> </message> <message> <location line="+1"/> <source>Given name</source> <translation>Prénom</translation> </message> <message> <location line="+1"/> <source>Surname</source> <translation>Nom de famille</translation> </message> <message> <location line="+1"/> <source>Title</source> <translation>Titre</translation> </message> <message> <location line="+1"/> <source>Initials</source> <translation>Initiales</translation> </message> <message> <location line="+1"/> <source>Description</source> <translation>Description</translation> </message> <message> <location line="+1"/> <source>Role</source> <translation>Rôle</translation> </message> <message> <location line="+1"/> <source>Pseudonym</source> <translation>Pseudonyme</translation> </message> <message> <location line="+1"/> <source>Generation Qualifier</source> <translation>Qualificatif de génération</translation> </message> <message> <location line="+1"/> <source>x500 Unique Identifier</source> <translation>Identifiant unique X500</translation> </message> <message> <location line="+1"/> <source>Name</source> <translation>Nom</translation> </message> <message> <location line="+1"/> <source>DN Qualifier</source> <translation>Qualificatif de DN</translation> </message> <message> <location line="+1"/> <source>Unstructured name</source> <translation>Nom non-structuré</translation> </message> <message> <location line="+1"/> <source>Challenge password</source> <translation>Mot de passe challenge</translation> </message> <message> <location line="+2"/> <source>Basic Constraints</source> <translation>Contraintes basiques</translation> </message> <message> <location line="+1"/> <source>subject alternative name</source> <translation>nom alternatif du sujet</translation> </message> <message> <location line="+1"/> <source>issuer alternative name</source> <translation>Nom alternatif du signataire</translation> </message> <message> <location line="+1"/> <source>Subject key identifier</source> <translation>Identifiant de clé du sujet</translation> </message> <message> <location line="+1"/> <source>Authority key identifier</source> <translation>Identifiant de clé de l'autorité</translation> </message> <message> <location line="+1"/> <source>Key usage</source> <translation>Usage de la clé</translation> </message> <message> <location line="+1"/> <source>Extended key usage</source> <translation>Utilisation étendue de la clé</translation> </message> <message> <location line="+1"/> <source>CRL distribution points</source> <translation>Points de distribution de la liste de révocation</translation> </message> <message> <location line="+1"/> <source>Authority information access</source> <translation>Accès à l'information de l'autorité</translation> </message> <message> <location line="+1"/> <source>Certificate type</source> <translation>Type de certificat</translation> </message> <message> <location line="+1"/> <source>Base URL</source> <translation>URL de base</translation> </message> <message> <location line="+1"/> <source>Revocation URL</source> <translation>URL de révocation</translation> </message> <message> <location line="+1"/> <source>CA Revocation URL</source> <translation>URL de révocation du certificat CA</translation> </message> <message> <location line="+1"/> <source>Certificate renewal URL</source> <translation>URL de renouvellement de certificat</translation> </message> <message> <location line="+1"/> <source>CA policy URL</source> <translation>URL des conditions générales du CA</translation> </message> <message> <location line="+1"/> <source>SSL server name</source> <translation>Nom du serveur SSL</translation> </message> <message> <location line="+1"/> <source>Comment</source> <translation>Commentaire</translation> </message> <message> <location filename="../lib/x509v3ext.cpp" line="+75"/> <source>String '%1' for '%2' contains invalid characters</source> <translation>La chaîne '%1' pour '%2' contient des caractères invalides</translation> </message> </context> <context> <name>ReqTreeView</name> <message> <location filename="../widgets/ReqTreeView.cpp" line="+23"/> <source>Sign</source> <translation>Signer</translation> </message> <message> <location line="+2"/> <source>Similar Request</source> <translation>Requête similaire</translation> </message> </context> <context> <name>RevocationList</name> <message> <location filename="../ui/RevocationList.ui" line="+30"/> <source>Manage revocations</source> <translation>Gérer les révocations</translation> </message> <message> <location line="+66"/> <source>Add</source> <translation>Ajouter</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Enlever</translation> </message> <message> <location filename="../widgets/RevocationList.cpp" line="+71"/> <source>No.</source> <translation>No.</translation> </message> <message> <location line="+0"/> <source>Serial</source> <translation>Numéro de série</translation> </message> <message> <location line="+0"/> <source>Revocation</source> <translation>Révocation</translation> </message> <message> <location line="+0"/> <source>Reason</source> <translation>Raison</translation> </message> <message> <location line="+1"/> <source>Invalidation</source> <translation>Invalidation</translation> </message> <message> <location line="+25"/> <source>Generate CRL</source> <translation>Générer la liste de révocation</translation> </message> </context> <context> <name>Revoke</name> <message> <location filename="../ui/Revoke.ui" line="+87"/> <source>Revocation details</source> <translation>Détails de la révocation</translation> </message> <message> <location line="+30"/> <source>Invalid since</source> <translation>Non-valide depuis</translation> </message> <message> <location line="-7"/> <source>Local time</source> <translation>Heure locale</translation> </message> <message> <location line="-80"/> <source>Certificate revocation</source> <translation>Révocation du certificat</translation> </message> <message> <location line="+66"/> <source>Revocation reason</source> <translation>Raison de la révocation</translation> </message> <message> <location line="+28"/> <source>Serial</source> <translation>Numéro de série</translation> </message> </context> <context> <name>SearchPkcs11</name> <message> <location filename="../ui/SearchPkcs11.ui" line="+14"/> <source>Dialog</source> <translation>Dialogue</translation> </message> <message> <location line="+27"/> <source>Directory</source> <translation>Dossier</translation> </message> <message> <location line="+16"/> <source>...</source> <translation>...</translation> </message> <message> <location line="+7"/> <source>include sub directorys</source> <translation>include les sous-dossiers</translation> </message> <message> <location line="+7"/> <source>Search</source> <translation>Chercher</translation> </message> <message> <location filename="../widgets/SearchPkcs11.cpp" line="+77"/> <source>The following files are possible PKCS#11 libraries</source> <translation>Les fichiers suivants sont susceptibles d'être des bibliothèques PKCS#11</translation> </message> </context> <context> <name>SelectToken</name> <message> <location filename="../ui/SelectToken.ui" line="+14"/> <source>Select Token</source> <translation>Sélectionner un jeton</translation> </message> <message> <location line="+25"/> <source>Security token</source> <translation>Jeton de sécurité</translation> </message> <message> <location line="+47"/> <source>Please select the security token</source> <translation>SVP sélectionner le jeton de sécurité</translation> </message> </context> <context> <name>TempTreeView</name> <message> <location filename="../widgets/TempTreeView.cpp" line="+20"/> <source>Duplicate</source> <translation>Dupliquer</translation> </message> <message> <location line="+1"/> <source>Create certificate</source> <translation>Créer un certificat</translation> </message> <message> <location line="+1"/> <source>Create request</source> <translation>Créer une requête</translation> </message> <message> <location line="+11"/> <source>copy</source> <translation>copier</translation> </message> </context> <context> <name>TrustState</name> <message> <location filename="../ui/TrustState.ui" line="+33"/> <source>Certificate trust</source> <translation>Niveau de confiance au certificat</translation> </message> <message> <location line="+60"/> <source>Trustment</source> <translation>Niveau de confiance</translation> </message> <message> <location line="+9"/> <source>&Never trust this certificate</source> <translation>&Ne jamais se fier à ce certificat</translation> </message> <message> <location line="+7"/> <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> <location line="+7"/> <source>&Always trust this certificate</source> <translation>&Toujours se fier à ce certificat</translation> </message> </context> <context> <name>Validity</name> <message> <location filename="../widgets/validity.cpp" line="+94"/> <source>yyyy-MM-dd hh:mm</source> <translation>yyyy-MM-dd hh:mm</translation> </message> </context> <context> <name>X509SuperTreeView</name> <message> <location filename="../widgets/X509SuperTreeView.cpp" line="+25"/> <source>OpenSSL config</source> <translation>Configuration OpenSSL</translation> </message> <message> <location line="+2"/> <source>Transform</source> <translation>Transformer</translation> </message> <message> <location line="+1"/> <source>Template</source> <translation>Modèle</translation> </message> <message> <location line="+2"/> <source>Public Key</source> <translation>Clé publique</translation> </message> </context> <context> <name>XcaTreeView</name> <message> <location filename="../widgets/XcaTreeView.cpp" line="+282"/> <source>Subject entries</source> <translation>Inscriptions du sujet</translation> </message> <message> <location line="+1"/> <source>X509v3 Extensions</source> <translation>Extensions X509v3</translation> </message> <message> <location line="+1"/> <source>Netscape extensions</source> <translation>Extensions Netscape</translation> </message> <message> <location line="+1"/> <source>Reset</source> <translation>Réinitialisation</translation> </message> <message> <location line="+47"/> <source>Columns</source> <translation>Colonnes</translation> </message> <message> <location line="+28"/> <source>New</source> <translation>Créer</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Importer</translation> </message> <message> <location line="+1"/> <source>Paste PEM data</source> <translation>Coller les données en format PEM</translation> </message> <message> <location line="+3"/> <source>Rename</source> <translation>Renommer</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation>Enlever</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation>Exporter</translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation>Presse-papier</translation> </message> <message> <location line="+2"/> <source>File</source> <translation>Fichier</translation> </message> </context> <context> <name>db_base</name> <message> <location filename="../lib/db_base.cpp" line="+211"/> <source>Internal name</source> <translation>Nom interne</translation> </message> <message> <location line="-136"/> <source>Bad database item Name: %1 Type: %2 Size: %3 %4</source> <translation>Elément de la base de données corrompu Nom: %1 Type: %2 Taille: %3 %4</translation> </message> <message> <location line="+3"/> <source>Do you want to delete the item from the database? The bad item may be extracted into a separate file.</source> <translation>Voulez-vous détruire l'élement de la base de données? L'élément malformé peut être extrait dans un fichier séparé.</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation>Enlever</translation> </message> <message> <location line="+1"/> <source>Delete and extract</source> <translation>Détruire et extraire</translation> </message> <message> <location line="+1"/> <source>Continue</source> <translation>Continuer</translation> </message> <message> <location line="+19"/> <location line="+540"/> <source>Error opening file: '%1': %2</source> <translation>Erreur lors de l'ouverture du fichier: '%1': %2</translation> </message> <message> <location line="-430"/> <source>No.</source> <translation>No.</translation> </message> <message> <location line="+404"/> <source>How to export the %1 selected items</source> <translation>Comment exporter les %1 éléments sélectionnés</translation> </message> <message> <location line="+2"/> <source>All in one PEM file</source> <translation>Tout dans un seul fichier PEM</translation> </message> <message> <location line="+1"/> <source>Each item in one file</source> <translation>Chaque élément dans un fichier</translation> </message> <message> <location line="+13"/> <source>Save %1 items in one file as</source> <translation>Sauvegarder %1 éléments dans un seul fichier comme</translation> </message> <message> <location line="+1"/> <source>PEM Files( *.pem );; All files ( * )</source> <translation>Fichiers PEM ( *.pem );; Tous les fichiers ( * )</translation> </message> </context> <context> <name>db_crl</name> <message> <location filename="../lib/db_crl.cpp" line="+31"/> <source>Signer</source> <translation>Signataire</translation> </message> <message> <location line="+1"/> <source>Internal name of the signer</source> <translation>Nom interne du signataire</translation> </message> <message> <location line="+1"/> <source>No. revoked</source> <translation>Numéro révoqué</translation> </message> <message> <location line="+1"/> <source>Number of revoked certificates</source> <translation>Nombre de certificats révoqués</translation> </message> <message> <location line="+1"/> <source>Last update</source> <translation>Dernière mise-à-jour</translation> </message> <message> <location line="+1"/> <source>Next update</source> <translation>Prochaine mise-à-jour</translation> </message> <message> <location line="+1"/> <source>CRL number</source> <translation>Numéro de la liste de révocation</translation> </message> <message> <location line="+75"/> <source>The revocation 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> <location line="+100"/> <source>There are no CA certificates for CRL generation</source> <translation>Il n'y a pas de certificat CA for la génération de la CRL</translation> </message> <message> <location line="+8"/> <source>Select CA certificate</source> <translation>Sélectionner un certificat d'autorité</translation> </message> <message> <location line="-67"/> <source>CRL ( *.pem *.der *.crl )</source> <translation>Listes de révocation ( *.pem *.der *.crl )</translation> </message> <message> <location line="-1"/> <source>Revocation list export</source> <translation>Exportation d'une liste de révocation</translation> </message> </context> <context> <name>db_key</name> <message> <location filename="../lib/db_key.cpp" line="+44"/> <source>Type</source> <translation>Type</translation> </message> <message> <location line="+1"/> <source>Size</source> <translation>Taille</translation> </message> <message> <location line="+2"/> <source>EC Group</source> <translation>Groupe EC</translation> </message> <message> <location line="+2"/> <source>Use</source> <translation>Usage</translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Mot de passe</translation> </message> <message> <location line="+54"/> <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> <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>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> <location line="+30"/> <source>Key size too small !</source> <translation>Taille de clé trop petite !</translation> </message> <message> <location line="+5"/> <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> <location line="+80"/> <source>Export keys to Clipboard</source> <translation>Exporter les clés vers le presse-papier</translation> </message> <message> <location line="+3"/> <source>Clipboard</source> <translation>Presse-papier</translation> </message> <message> <location line="+13"/> <source>Export public key [%1]</source> <translation>Exporter la clé publique [%1]</translation> </message> <message> <location line="-25"/> <location line="+35"/> <source>PEM public</source> <translation>clé publique PEM</translation> </message> <message> <location line="-32"/> <location line="+37"/> <source>SSH2 public</source> <translation>Clé publique SSH2</translation> </message> <message> <location line="-34"/> <location line="+46"/> <source>PEM private</source> <translation>Clé privée PEM</translation> </message> <message> <location line="+3"/> <source>Export private key [%1]</source> <translation>Exporter la clé privée [%1]</translation> </message> <message> <location line="-19"/> <source>DER public</source> <translation>Clé publique DER</translation> </message> <message> <location line="+9"/> <source>DER private</source> <translation>Clé privée DER</translation> </message> <message> <location line="+2"/> <source>PEM encryped</source> <translation>Encrypté en PEM</translation> </message> <message> <location line="+7"/> <source>PKCS#8 encrypted</source> <translation>Encryptée en PKCS#8</translation> </message> <message> <location line="+6"/> <source>Private Keys ( *.pem *.der *.pk8 );; SSH Public Keys ( *.pub )</source> <translation>Clés privées ( *.pem *.der *.pk8 );; Clé publiques SSH ( *.pub )</translation> </message> <message> <location line="+56"/> <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> </context> <context> <name>db_temp</name> <message> <location filename="../lib/db_temp.cpp" line="+56"/> <source>Type</source> <translation>Type</translation> </message> <message> <location line="-8"/> <source>Bad template: %1</source> <translation>Mauvais modèle: %1</translation> </message> <message> <location line="+71"/> <source>Nothing</source> <translation>Rien</translation> </message> <message> <location line="+5"/> <source>Preset Template values</source> <translation>Initaliser les valeurs du modèle</translation> </message> <message> <location line="+45"/> <source>Save template as</source> <translation>Enregistrer le modèle sous</translation> </message> <message> <location line="+1"/> <source>XCA templates ( *.xca);; All files ( * )</source> <translation>Modèles XCA ( *.xca);; Tous les fichiers ( * )</translation> </message> </context> <context> <name>db_x509</name> <message> <location filename="../lib/db_x509.cpp" line="+57"/> <source>CA</source> <translation>CA</translation> </message> <message> <location line="+1"/> <source>reflects the basic Constraints extension</source> <translation>reflète l'extension des contraintes basiques</translation> </message> <message> <location line="+1"/> <source>Serial</source> <translation>Numéro de série</translation> </message> <message> <location line="+1"/> <source>md5 fingerprint</source> <translation>Empreinte MD5</translation> </message> <message> <location line="+1"/> <source>sha1 fingerprint</source> <translation>Empreinte sha1</translation> </message> <message> <location line="+1"/> <source>sha256 fingerprint</source> <translation>Empreinte sha256</translation> </message> <message> <location line="+1"/> <source>Start date</source> <translation>Date de début</translation> </message> <message> <location line="+1"/> <source>not Before</source> <translation>pas Avant</translation> </message> <message> <location line="+1"/> <source>Expiry date</source> <translation>Date d'expiration</translation> </message> <message> <location line="+1"/> <source>not After</source> <translation>pas Après</translation> </message> <message> <location line="+1"/> <source>Trust state</source> <translation>État de confiance</translation> </message> <message> <location line="+1"/> <source>Revocation</source> <translation>Révocation</translation> </message> <message> <location line="+1"/> <source>CRL Expiration</source> <translation>Expiration de la CRL</translation> </message> <message> <location line="+103"/> <source>Plain View</source> <translation>Vue à plat</translation> </message> <message> <location line="+2"/> <source>Tree View</source> <translation>Vue arborescente</translation> </message> <message> <location line="+178"/> <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> <location line="+133"/> <source>Invalid public key</source> <translation>Clé publique invalide</translation> </message> <message> <location line="+18"/> <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> <location line="+2"/> <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> <location line="+17"/> <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> <location line="+49"/> <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> <location line="+80"/> <source>PEM chain</source> <translation>Chaîne en PEM</translation> </message> <message> <location line="+2"/> <source>PKCS #7 chain</source> <translation>Chaîne PKCS#7</translation> </message> <message> <location line="+6"/> <source>PKCS #12 chain</source> <translation>Chaîne PKCS#12</translation> </message> <message> <location line="+9"/> <source>PEM + key</source> <translation>PEM + clé</translation> </message> <message> <location line="+6"/> <source>PKCS #7 trusted</source> <translation>Certificats de confiance PKCS#7</translation> </message> <message> <location line="+2"/> <source>PKCS #7 all</source> <translation>Tous les certificats en PKCS#7</translation> </message> <message> <location line="+2"/> <source>PEM trusted</source> <translation>Certificats de confiance en PEM</translation> </message> <message> <location line="+2"/> <source>PEM all</source> <translation>Tous les certificats en PEM</translation> </message> <message> <location line="+3"/> <source>Certificate export</source> <translation>Exportation de certificat</translation> </message> <message> <location line="+1"/> <source>X509 Certificates ( *.pem *.cer *.crt *.p12 *.p7b )</source> <translation>Certificats X509 ( *.pem *.cer *.crt *.p12 *.p7b)</translation> </message> <message> <location line="+57"/> <location line="+34"/> <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> <location line="-29"/> <source>Not possible for a token key: '%1'</source> <translation>Impossible pour une clé d'un jeton de sécurité: '%1'</translation> </message> <message> <location line="+33"/> <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> <location line="+330"/> <source> days</source> <translation> jours</translation> </message> </context> <context> <name>db_x509name</name> <message> <location filename="../lib/db_x509super.cpp" line="+23"/> <source>Subject</source> <translation>Sujet</translation> </message> <message> <location line="+1"/> <source>Complete distinguished name</source> <translation>Nom distinctif complet</translation> </message> <message> <location line="+1"/> <source>Subject hash</source> <translation>Hachage du sujet</translation> </message> <message> <location line="+1"/> <source>Hash to lookup certs in directories</source> <translation>Hachage de recherche dans un dossier</translation> </message> </context> <context> <name>db_x509req</name> <message> <location filename="../lib/db_x509req.cpp" line="+30"/> <source>Signed</source> <translation>Signé</translation> </message> <message> <location line="+1"/> <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> <location line="+1"/> <source>Unstructured name</source> <translation>Nom non-structuré</translation> </message> <message> <location line="+2"/> <source>Challenge password</source> <translation>Mot de passe challenge</translation> </message> <message> <location line="+16"/> <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> <location line="+105"/> <source>Certificate request export</source> <translation>Exporter la requête de signature</translation> </message> <message> <location line="+1"/> <source>Certificate request ( *.pem *.der *.csr )</source> <translation>Requête de signature de certificat ( *.pem *.der *.csr )</translation> </message> </context> <context> <name>db_x509super</name> <message> <location filename="../lib/db_x509super.cpp" line="+35"/> <source>Key name</source> <translation>Nom de la clé</translation> </message> <message> <location line="+1"/> <source>Internal name of the key</source> <translation>Nom interne de la clé</translation> </message> <message> <location line="+1"/> <source>Signature Algorithm</source> <translation>Algorithme de signature</translation> </message> <message> <location line="+77"/> <source>Save as OpenSSL config</source> <translation>Enregistrer en format de configuration OpenSSL</translation> </message> <message> <location line="+1"/> <source>Config files ( *.conf *.cnf);; All files ( * )</source> <translation>Fichiers de configuration (*.conf *.cnf);; Tous les fichiers ( * )</translation> </message> <message> <location line="+25"/> <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> <location filename="../widgets/kvView.cpp" line="+164"/> <source>Type</source> <translation>Type</translation> </message> <message> <location line="+0"/> <source>Content</source> <translation>Contenu</translation> </message> </context> <context> <name>pass_info</name> <message> <location filename="../lib/pass_info.cpp" line="+21"/> <source>Password</source> <translation>Mot de passe</translation> </message> <message> <location line="+6"/> <source>PIN</source> <translation>NIP</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>Erreur à l'ouverture du fichier '%1': %2</translation> </message> <message> <location line="+8"/> <source>Error writing to file: '%1': %2</source> <translation>Erreur à l'écriture du fichier '%1': %2</translation> </message> <message> <location line="+9"/> <source>Error: </source> <translation>Erreur: </translation> </message> <message> <location filename="../lib/pki_base.h" line="+68"/> <source>Internal error: Unexpected message: %1 %2</source> <translation>Erreur interne: message inattendu: %1 %2</translation> </message> </context> <context> <name>pki_crl</name> <message> <location filename="../lib/pki_crl.cpp" line="+46"/> <source>Successfully imported the revocation list '%1'</source> <translation>La liste de révocation '%1' a été importée avec succès</translation> </message> <message> <location line="+1"/> <source>Delete the revocation list '%1'?</source> <translation>Détruire la liste de révocation '%1' ?</translation> </message> <message> <location line="+1"/> <source>Successfully created the revocation list '%1'</source> <translation>La liste de révocation '%1' a été créée avec succès</translation> </message> <message> <location line="+2"/> <source>Delete the %1 revocation lists: %2?</source> <translation>Détruire les %1 listes de révocation: %2 ?</translation> </message> <message> <location line="+20"/> <source>Unable to load the revocation 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> <location line="+22"/> <source>No issuer given</source> <translation>Aucun signataire spécifié</translation> </message> <message> <location line="+54"/> <location line="+217"/> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> <message> <location line="-27"/> <source>unknown</source> <translation>inconnu</translation> </message> </context> <context> <name>pki_evp</name> <message> <location filename="../lib/pki_evp.cpp" line="+177"/> <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> <location line="+10"/> <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> <location line="+53"/> <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> <location line="+62"/> <source>Unable to load the private key in file %1. Tried PEM and DER private, public, PKCS#8 key types and SSH2 format.</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, PKCS#8 et le format SSH2 ont été essayés.</translation> </message> <message> <location line="+35"/> <source>Ignoring unsupported private key</source> <translation>Clé privée non-supportée: ignorée</translation> </message> <message> <location line="+32"/> <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> <location line="+3"/> <location line="+11"/> <source>Password input aborted</source> <translation>Saisie du mot de passe abandonnée</translation> </message> <message> <location line="-3"/> <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> <location line="+85"/> <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> <location line="+15"/> <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> <location line="+83"/> <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> <location line="+35"/> <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> <location filename="../lib/pki_key.cpp" line="+142"/> <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> <location line="+1"/> <source>Delete the %1 public key '%2'?</source> <translation>Détruire les %1 clés publiques '%2' ?</translation> </message> <message> <location line="+5"/> <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> <location line="+1"/> <source>Delete the %1 private key '%2'?</source> <translation>Détruire les %1 clés privées '%2' ?</translation> </message> <message> <location line="+1"/> <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> <location line="+6"/> <source>Delete the %1 keys: %2?</source> <translation>Détruire les %1 clés: %2?</translation> </message> <message> <location line="+9"/> <source>public key</source> <translation>clé publique</translation> </message> <message> <location line="+188"/> <source>Common</source> <translation>Global</translation> </message> <message> <location line="+0"/> <source>Private</source> <translation>Privé</translation> </message> <message> <location line="+0"/> <source>Bogus</source> <translation>Erroné</translation> </message> <message> <location line="+0"/> <source>PIN</source> <translation>NIP</translation> </message> <message> <location line="+10"/> <source>No password</source> <translation>Pas de mot de passe</translation> </message> <message> <location line="+22"/> <location line="+5"/> <location line="+3"/> <source>Invalid SSH2 public key</source> <translation>Clé publique SSH2 invalide</translation> </message> <message> <location line="+113"/> <source>Failed writing to %1</source> <translation>Echec d'écriture sur %1</translation> </message> </context> <context> <name>pki_multi</name> <message> <location filename="../lib/pki_multi.cpp" line="+129"/> <location line="+5"/> <location line="+5"/> <source>Seek failed</source> <translation>Un "seek" a échoué</translation> </message> <message> <location line="+16"/> <source>No known PEM encoded items found</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_pkcs12</name> <message> <location filename="../lib/pki_pkcs12.cpp" line="+38"/> <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> <location line="+8"/> <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> <location line="+14"/> <source>The supplied password was wrong (%1)</source> <translation>Le mot de passe renseigné était faux (%1)</translation> </message> <message> <location line="+52"/> <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> <location line="+2"/> <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> <location filename="../lib/pki_pkcs7.cpp" line="+160"/> <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> <location filename="../lib/pki_scard.cpp" line="+59"/> <source>Successfully imported the token key '%1'</source> <translation>La clé du jeton '%1' a été importée avec succès</translation> </message> <message> <location line="+1"/> <source>Delete the token key '%1'?</source> <translation>Détruire la clé du jeton '%1' ?</translation> </message> <message> <location line="+1"/> <source>Successfully created the token key '%1'</source> <translation>La clé du jeton '%1' a été créée avec succès</translation> </message> <message> <location line="+2"/> <source>Delete the %1 keys: %2?</source> <translation>Détruire les %1 clés: '%2' ?</translation> </message> <message> <location line="+226"/> <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> <location line="+65"/> <source>This Key is already on the token</source> <translation>Cette clé est déjà sur le jeton</translation> </message> <message> <location line="+75"/> <source>PIN input aborted</source> <translation>Saisie du NIP abandonnée</translation> </message> <message> <location line="+12"/> <source>Unable to find copied key on the token</source> <translation>Impossible de trouver la clé copiée sur le jeton</translation> </message> <message> <location line="+103"/> <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> <location line="+28"/> <source>Public Key missmatch. Please re-import card</source> <translation>La clé publique ne correspond pas. Veuillez re-importer la carte</translation> </message> <message> <location line="+57"/> <source>Illegal Key generation method</source> <translation>Méthode de génération de clé illégale</translation> </message> <message> <location line="+16"/> <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> <location line="+51"/> <source>Ignoring unsupported token key</source> <translation>La clé non-supportée sur le jeton est ignorée</translation> </message> <message> <location line="+4"/> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> <message> <location line="+11"/> <source>Token %1</source> <translation>Jeton %1</translation> </message> <message> <location line="+9"/> <location line="+13"/> <source>Failed to find the key on the token</source> <translation>Impossible de trouver la clé sur le jeton</translation> </message> <message> <location line="-6"/> <source>Invalid Pin for the token</source> <translation>NIP invalide pour le jeton</translation> </message> <message> <location line="+12"/> <source>Failed to initialize the key on the token</source> <translation>Impossible d'initialiser la clé sur le jeton</translation> </message> </context> <context> <name>pki_temp</name> <message> <location filename="../lib/pki_temp.cpp" line="+99"/> <source>Successfully imported the XCA template '%1'</source> <translation>Le modèle XCA '%1' a été importé avec succès</translation> </message> <message> <location line="+1"/> <source>Delete the XCA template '%1'?</source> <translation>Détruire le modèle XCA '%1' ?</translation> </message> <message> <location line="+1"/> <source>Successfully created the XCA template '%1'</source> <translation>Le modèle XCA '%1' a été créé avec succès</translation> </message> <message> <location line="+2"/> <source>Delete the %1 XCA templates: %2?</source> <translation>Détruire les %1 modèles XCA: %2 ?</translation> </message> <message> <location line="+189"/> <location line="+285"/> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> <message> <location line="-194"/> <source>Template file content error (too small)</source> <translation>erreur de contenu du fichier de modèle (trop petit)</translation> </message> <message> <location line="+11"/> <source>Template file content error (bad size)</source> <translation>erreur de contenu du fichier de modèle (mauvaise taille)</translation> </message> <message> <location line="+46"/> <source>Template file content error (too small): %1</source> <translation>erreur de contenu du fichier de modèle (trop petit): %1</translation> </message> <message> <location line="+33"/> <source>Not a PEM encoded XCA Template</source> <translation>Ce n'est pas un modèle XCA encodé en PEM</translation> </message> <message> <location line="+7"/> <source>Not an XCA Template, but '%1'</source> <translation>Ce n'est pas un modèle XCA, mais '%1'</translation> </message> </context> <context> <name>pki_x509</name> <message> <location filename="../lib/pki_x509.cpp" line="+71"/> <source>Successfully imported the certificate '%1'</source> <translation>Le certificat '%1' a été importée avec succès</translation> </message> <message> <location line="+1"/> <source>Delete the certificate '%1'?</source> <translation>Détruire le certificat '%1' ?</translation> </message> <message> <location line="+1"/> <source>Successfully created the certificate '%1'</source> <translation>Le certificat '%1' a été créé avec succès</translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificates: %2?</source> <translation>Détruire les %1 certificats: '%2' ?</translation> </message> <message> <location line="+37"/> <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> <location line="+170"/> <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> <location line="+62"/> <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> <location line="+129"/> <source>There is no key for signing !</source> <translation>Il n'y a pas de clé pour signer !</translation> </message> <message> <location line="+58"/> <location line="+533"/> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> <message> <location line="-203"/> <source>Not trusted</source> <translation>Pas sûr</translation> </message> <message> <location line="+0"/> <source>Trust inherited</source> <translation>Confiance héritée</translation> </message> <message> <location line="+0"/> <source>Always Trusted</source> <translation>Sûr</translation> </message> <message> <location line="+32"/> <source>No</source> <translation>Non</translation> </message> <message> <location line="+2"/> <source>Yes</source> <translation>Oui</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>La clé de signature n'est pas valide (c'est une clé publique)</translation> </message> <message> <location line="+42"/> <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> <location line="+1"/> <source>Delete the %1 certificate request '%2'?</source> <translation>Détruire les %1 requêtes de signature '%2' ?</translation> </message> <message> <location line="+1"/> <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> <location line="+2"/> <source>Delete the %1 certificate requests: %2?</source> <translation>Détruire les %1 requêtes de signature '%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>Impossible de charger la requête de signature du fichier %1. Les formats PEM, DER et SPKAC ont été essayés.</translation> </message> <message> <location line="+281"/> <source>Signed</source> <translation>Signé</translation> </message> <message> <location line="+0"/> <source>Unhandled</source> <translation>Non-géré</translation> </message> <message> <location line="+54"/> <source>Wrong Size %1</source> <translation>Taille fausse %1</translation> </message> </context> <context> <name>v3ext</name> <message> <location filename="../ui/v3ext.ui" line="+51"/> <source>Add</source> <translation>Ajouter</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Détruire</translation> </message> <message> <location line="+32"/> <source>Apply</source> <translation>Appliquer</translation> </message> <message> <location line="+7"/> <source>Validate</source> <translation>Valider</translation> </message> <message> <location line="+29"/> <source>Cancel</source> <translation>Annuler</translation> </message> <message> <location filename="../widgets/v3ext.cpp" line="+93"/> <source>An email address or 'copy'</source> <translation>Une adresse de courriel ou 'copy'</translation> </message> <message> <location line="+2"/> <source>An email address</source> <translation>Une adresse de courriel</translation> </message> <message> <location line="+2"/> <source>a registered ID: OBJECT IDENTIFIER</source> <translation>un IDentifiant enregistré: IDENTIFICATEUR.OBJET</translation> </message> <message> <location line="+4"/> <source>a uniform resource indicator</source> <translation>un indicateur uniforme de ressource</translation> </message> <message> <location line="+4"/> <source>a DNS domain name</source> <translation>u nom de domaine DNS</translation> </message> <message> <location line="+2"/> <source>an IP address</source> <translation>une adresse IP</translation> </message> <message> <location line="+4"/> <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> <location line="+4"/> <source>No editing. Only 'copy' allowed here</source> <translation>Pas de modification possible. Seul 'copy' est permis ici</translation> </message> <message> <location line="+67"/> <source>Validation failed: '%1' %2</source> <translation>La validation a échoué: '%1' %2</translation> </message> <message> <location line="+5"/> <source>Validation successful: '%1'</source> <translation>La validation a été effectuée avec succès: '%1'</translation> </message> </context> </TS> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lang/xca_hr.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000521304�12606205164�0015034�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0" language="hr_HR"> <context> <name>About</name> <message> <location filename="../ui/About.ui" line="+89"/> <source>Done</source> <translatorcomment>Završeno, Obavljeno</translatorcomment> <translation>Gotovo</translation> </message> </context> <context> <name>CaProperties</name> <message> <location filename="../ui/CaProperties.ui" line="+30"/> <source>CA Properties</source> <translatorcomment>Svojstva CA</translatorcomment> <translation>Osobine CA</translation> </message> <message> <location line="+65"/> <source>Use random Serial numbers</source> <translation>Koristi slučajan Serijski broj</translation> </message> <message> <location line="+7"/> <source>Days until next CRL issuing</source> <translatorcomment>Broj dana do izdavanja CRL</translatorcomment> <translation>Broj dana do sljedećeg CRL</translation> </message> <message> <location line="+10"/> <source>Default template</source> <translatorcomment>Osnovni obrazac</translatorcomment> <translation>Osnovni predložak</translation> </message> <message> <location line="+10"/> <source>Next serial for signing</source> <translation>Sljedeći Serijski broj za potpis</translation> </message> </context> <context> <name>CertDetail</name> <message> <location filename="../ui/CertDetail.ui" line="+36"/> <source>Details of the Certificate</source> <translation>Detalji Potvrde</translation> </message> <message> <location line="+48"/> <source>S&tatus</source> <translatorcomment>Status?</translatorcomment> <translation>S&tanje</translation> </message> <message> <location line="+54"/> <source>Serial</source> <translation>Serijski broj</translation> </message> <message> <location line="+13"/> <source>The serial number of the certificate</source> <translation>Serijski broj potvrde</translation> </message> <message> <location line="+9"/> <source>The internal name of the certificate in the database</source> <translation>Interno ime potvrde (u bazi)</translation> </message> <message> <location line="+7"/> <source>Internal name</source> <translation>Interno ime</translation> </message> <message> <location line="+23"/> <source>Signature algorithm</source> <translation>Algoritam potpisa</translation> </message> <message> <location line="+7"/> <source>Signature</source> <translation>Potpis</translation> </message> <message> <location line="+7"/> <source>Key</source> <translation>Ključ</translation> </message> <message> <location line="+10"/> <source>Fingerprints</source> <translation>Sažeci potvrde</translation> </message> <message> <location line="+20"/> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <location line="-14"/> <source>MD5</source> <translation>MD5</translation> </message> <message> <location line="+21"/> <source>A SHA-1 hashsum of the certificate</source> <translation>SHA-1 sažetak potvrde</translation> </message> <message> <location line="-14"/> <source>An md5 hashsum of the certificate</source> <translation>MD5 sažetak potvrde</translation> </message> <message> <location line="+21"/> <source>SHA256</source> <translation>SHA256</translation> </message> <message> <location line="+7"/> <source>A SHA-256 hashsum of the certificate</source> <translation>SHA-256 sažetak potvrde</translation> </message> <message> <location line="+10"/> <source>Validity</source> <translation>Valjanost</translation> </message> <message> <location line="+12"/> <source>The time since the certificate is valid</source> <translation>Vrijeme od kada je potvrda valjana</translation> </message> <message> <location line="+7"/> <source>The time until the certificate is valid</source> <translation>Vrijeme do kada je potvrda valjana</translation> </message> <message> <location line="+34"/> <source>&Subject</source> <translatorcomment>Nositelj?</translatorcomment> <translation>&Subjekt</translation> </message> <message> <location line="+16"/> <source>&Issuer</source> <translation>&Izdavač</translation> </message> <message> <location line="+16"/> <source>Attributes</source> <translation>Svojstva</translation> </message> <message> <location line="+10"/> <source>&Extensions</source> <translatorcomment>Ekstenzije, Produžeci, Dodaci?</translatorcomment> <translation>&Proširenja</translation> </message> <message> <location line="+13"/> <location filename="../widgets/CertDetail.cpp" line="+33"/> <source>Show config</source> <translation>Pokaži konfiguraciju</translation> </message> <message> <location filename="../widgets/CertDetail.cpp" line="+4"/> <source>Show extensions</source> <translatorcomment>Ekstenzije?</translatorcomment> <translation>Pokaži proširenja</translation> </message> <message> <location line="+19"/> <source>Not available</source> <translation>Nije dostupno</translation> </message> <message> <location line="+25"/> <source>Details of the certificate</source> <translation>Detalji potvrde</translation> </message> <message> <location line="+9"/> <source>Signer unknown</source> <translation>Potpisnik (izdavač) nepoznat</translation> </message> <message> <location line="+4"/> <source>Self signed</source> <translation>Samopotpisan</translation> </message> <message> <location line="+11"/> <source>Not trusted</source> <translatorcomment>kome se ne vjeruje</translatorcomment> <translation>Nepouzdan</translation> </message> <message> <location line="+4"/> <source>Trusted</source> <translation>Pouzdan</translation> </message> <message> <location line="+20"/> <source>Revoked: </source> <translation>Opozvan:</translation> </message> <message> <location line="+5"/> <source>Not valid</source> <translation>Nevažeći</translation> </message> <message> <location line="+4"/> <source>Valid</source> <translation>Važeći</translation> </message> <message> <location line="+19"/> <source>Details of the certificate signing request</source> <translation>Detalji zahtjeva za izdavanje potvrde</translation> </message> </context> <context> <name>CertExtend</name> <message> <location filename="../ui/CertExtend.ui" line="+30"/> <source>Certificate renewal</source> <translation>Obnova potvrde</translation> </message> <message> <location line="+44"/> <source>This will create a new certificate as a copy of the old one with a new serial number and adjusted validity values.</source> <translatorcomment>trajanja, važenja</translatorcomment> <translation>Ovo će izraditi novu potvrdu kao kopiju postojeće s novim serijskim brojem i podešenim vrijednostima valjanosti potvrde.</translation> </message> <message> <location line="+26"/> <source>Validity</source> <translatorcomment>Ispravnost, važenje,</translatorcomment> <translation>Valjanost</translation> </message> <message> <location line="+11"/> <source>Not before</source> <translatorcomment>Ne prije</translatorcomment> <translation>Od</translation> </message> <message> <location line="+7"/> <source>Not after</source> <translatorcomment>Ne nakon</translatorcomment> <translation>Do</translation> </message> <message> <location line="+26"/> <source>Time range</source> <translation>Vremensko razdoblje</translation> </message> <message> <location line="+14"/> <source>Days</source> <translation>Dana</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Mjeseci</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Godina</translation> </message> <message> <location line="+22"/> <source>Apply</source> <translation>Primjeni</translation> </message> <message> <location line="+26"/> <source>Revoke old certificate</source> <translation>Opozovi staru potvrdu</translation> </message> <message> <location line="-33"/> <source>Midnight</source> <translation>Ponoć</translation> </message> <message> <location line="-33"/> <source>Local time</source> <translation>Lokalno vrijeme</translation> </message> <message> <location line="+26"/> <source>No well-defined expiration</source> <translatorcomment>Neodređeno trajanje</translatorcomment> <translation>Nejasno definirano trajanje</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>Početak valjanosti potvrde je prije početka valjanosti potvrde potpisnika (ovjeritelja). To vjerojatno nije ono što ste htjeli.</translation> </message> <message> <location line="+2"/> <location line="+22"/> <source>Edit times</source> <translation>Uredi vremena</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Abort rollout</source> <translatorcomment>Izdavanju??? teško je reči</translatorcomment> <translation>O uvođenju</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Continue rollout</source> <translation>Nastavi uvođenje</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Adjust date and continue</source> <translation>Podesi datum i nastavi</translation> </message> <message> <location line="-5"/> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation>Kraj valjanosti potvrde je nakon isteka valjanosti potvrde potpisnika (ovjeritelja). To vjerojatno nije ono što ste htjeli.</translation> </message> </context> <context> <name>CertTreeView</name> <message> <location filename="../widgets/CertTreeView.cpp" line="+25"/> <source>Import PKCS#12</source> <translation>Uvezi PKCS#12</translation> </message> <message> <location line="+1"/> <source>Import from PKCS#7</source> <translation>Uvezi PKCS#7</translation> </message> <message> <location line="+28"/> <source>Request</source> <translation>Zahtjev</translation> </message> <message> <location line="+2"/> <source>Security token</source> <translation>Pametni token</translation> </message> <message> <location line="+2"/> <source>Other token</source> <translation>Drugi token</translation> </message> <message> <location line="+4"/> <source>Similar Certificate</source> <translation>Slična potvrda</translation> </message> <message> <location line="+3"/> <source>Delete from Security token</source> <translation>Obriši s pametnog tokena</translation> </message> <message> <location line="+3"/> <source>CA</source> <translation>CA</translation> </message> <message> <location line="+1"/> <source>Properties</source> <translation>Osobine</translation> </message> <message> <location line="+1"/> <source>Generate CRL</source> <translation>Izradi CRL</translation> </message> <message> <location line="+1"/> <source>Manage revocations</source> <translation>Upravljaj opozivima</translation> </message> <message> <location line="+4"/> <source>Trust</source> <translation>Povjerenje</translation> </message> <message> <location line="+4"/> <source>Renewal</source> <translation>Obnovi</translation> </message> <message> <location line="+2"/> <source>Revoke</source> <translation>Opozovi</translation> </message> <message> <location line="+2"/> <source>Unrevoke</source> <translation>Nemoj opozvat</translation> </message> </context> <context> <name>CertView</name> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Nije pronađen ključ za Potvrdu:</translation> </message> <message> <source>Import Certificate signing request</source> <translation type="obsolete">Uvezi zahtjev za izdavanje Potvrde (CSR)</translation> </message> </context> <context> <name>ClickLabel</name> <message> <location filename="../widgets/clicklabel.cpp" line="+23"/> <source>Double click for details</source> <translation>Dvaput kliknite za detalje</translation> </message> </context> <context> <name>CrlDetail</name> <message> <location filename="../ui/CrlDetail.ui" line="+30"/> <source>Details of the Revocation list</source> <translation>Detalji popisa opozvanih potvrda</translation> </message> <message> <location line="+48"/> <source>&Status</source> <translation>&Stanje</translation> </message> <message> <location line="+48"/> <source>Version</source> <translation>Inačica</translation> </message> <message> <location line="+19"/> <source>Signature</source> <translation>Potpis</translation> </message> <message> <location line="+7"/> <source>Signed by</source> <translation>Potpisao</translation> </message> <message> <location line="+7"/> <source>Name</source> <translation>Ime</translation> </message> <message> <location line="+7"/> <source>The internal name of the CRL in the database</source> <translation>Interno ime popisa povučenih potvrda (u bazi podataka)</translation> </message> <message> <location line="+13"/> <source>issuing dates</source> <translation>datumi izdavanja</translation> </message> <message> <location line="+9"/> <source>Next Update</source> <translation>Sljedeća obnova</translation> </message> <message> <location line="+7"/> <source>Last Update</source> <translation>Posljednja obnova</translation> </message> <message> <location line="+33"/> <source>&Issuer</source> <translation>&Izdavač</translation> </message> <message> <location line="+13"/> <source>&Extensions</source> <translation>&Proširenja</translation> </message> <message> <location line="+20"/> <source>&Revocation list</source> <translation>&Popis opoziva</translation> </message> <message> <source>0</source> <translation type="obsolete">0</translation> </message> <message> <source>Serial</source> <translation type="obsolete">Serijski broj</translation> </message> <message> <source>Revocation</source> <translation type="obsolete">Opoziv</translation> </message> <message> <source>Reason</source> <translation type="obsolete">Razlog</translation> </message> <message> <source>Invalidation</source> <translation type="obsolete">Poništenje</translation> </message> <message> <location filename="../widgets/CrlDetail.cpp" line="+45"/> <source>Failed</source> <translation>Neuspješno</translation> </message> <message> <location line="+6"/> <source>Unknown signer</source> <translation>Nepoznat potpisnik (izdavač)</translation> </message> <message> <location line="+3"/> <source>Verification not possible</source> <translation>Nije moguće obaviti provjeru</translation> </message> <message> <source>Unknown certificate</source> <translation type="obsolete">Nepoznata potvrda</translation> </message> </context> <context> <name>ExportCert</name> <message> <source>X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )</source> <translation type="obsolete">X509 Potvrda ( *.cer *.crt *.p12 *.p7b);;Sve datoteke ( * )</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 type="obsolete">DER je binarni format Potvrde PEM je base64 kodirana Potvrde PKCS#7 is službeni format za razmjenu Potvrda PKCS#12 je kriptirani format za razmjenu Ključa i Potvrde</translation> </message> <message> <source>Please enter the filename for the certificate.</source> <translation type="obsolete">Unesite ime datoteke za potvrdu.</translation> </message> <message> <source>Certificate export</source> <translation type="obsolete">Izvoz potvrde</translation> </message> </context> <context> <name>ExportDer</name> <message> <source>All files ( * )</source> <translation type="obsolete">Sve datoteke ( * )</translation> </message> <message> <source>DER is a binary format PEM is a base64 encoded DER file </source> <translation type="obsolete">DER je binarni format PEM je base64 kodirana DER datoteka</translation> </message> </context> <context> <name>ExportDialog</name> <message> <location filename="../ui/ExportDialog.ui" line="+92"/> <source>Name</source> <translation>Ime</translation> </message> <message> <location line="+7"/> <source>The internal name of the CRL in the database</source> <translation>Interno ime popisa povučenih potvrda (u bazi podataka)</translation> </message> <message> <location line="+43"/> <source>...</source> <translation>...</translation> </message> <message> <location line="+13"/> <source>Filename</source> <translation>Datoteka</translation> </message> <message> <source>Please enter the filename</source> <translation type="obsolete">Unesite ime datoteke</translation> </message> <message> <location line="+40"/> <source>Export Format</source> <translation>Format izvoza</translation> </message> <message> <location filename="../widgets/ExportDialog.cpp" line="+37"/> <source>All files ( * )</source> <translation>Sve datoteke ( * )</translation> </message> <message> <location line="+15"/> <source>PEM Text format with headers</source> <translation>PEM Tekst format sa zaglavljima</translation> </message> <message> <location line="+2"/> <source>Concatenated list of all selected items in one PEM text file</source> <translation>Lista svih odabranih stavki spojena u jednu PEM datoteku</translation> </message> <message> <location line="+1"/> <source>Concatenated text format of the complete certificate chain in one PEM file</source> <translatorcomment>Cjelokupni lanac potvrda spojen u jednu tekstualnu PEM datoteku</translatorcomment> <translation>Tekstualni format s cjelokupnim lancem potvrda spojenim u jednu PEM datoteku</translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all trusted certificates in one PEM file</source> <translation>Tekstualni format sa svim pouzdanim potvrdama u jednoj PEM datoteci</translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all certificates in one PEM file</source> <translatorcomment>Sve potvrde spojene u jednu tekstualnu PEM datoteku</translatorcomment> <translation>Tekstualni format sa svim potvrdama spojenim u jednu PEM datoteku</translation> </message> <message> <location line="+1"/> <source>Binary DER encoded file</source> <translation>Binarna datoteka kodirana u DER formatu</translation> </message> <message> <location line="+1"/> <source>PKCS#7 encoded single certificate</source> <translation>Pojedinačni certifikat kodiran u PKCS#7 formatu</translation> </message> <message> <location line="+2"/> <source>PKCS#7 encoded complete certificate chain</source> <translation>Cjelokupni lanac potvrda kodiran u PKCS#7 formatu</translation> </message> <message> <location line="+2"/> <source>All trusted certificates encoded in one PKCS#7 file</source> <translation>Sve pouzdane potvrde kodirane u jednoj PKCS#7 datoteci</translation> </message> <message> <location line="+2"/> <source>All selected certificates encoded in one PKCS#7 file</source> <translation>Sve odabrane potvrde kodirane u jednoj PKCS#7 datoteci</translation> </message> <message> <location line="+2"/> <source>All certificates encoded in one PKCS#7 file</source> <translation>Sve potvrde kodirane u jednoj PKCS#7 datoteci</translation> </message> <message> <location line="+2"/> <source>The certificate and the private key as encrypted PKCS#12 file</source> <translation>Potvrda i privatni ključ u kriptiranoj PKCS#12 datoteci</translation> </message> <message> <location line="+1"/> <source>The complete certificate chain and the private key as encrypted PKCS#12 file</source> <translation>Cjelokupni lanac potvrda i privatni ključ u kriptiranoj PKCS#12 datoteci</translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the unencrypted private key in one PEM file</source> <translation>Spajanje potvrde i nekriptiranog privatnog ključa u jednu PEM datoteku</translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the encrypted private key in PKCS#8 format in one file</source> <translation>Spajanje potvrde i kriptiranog privatnog ključa u PKCS#8 formatu u jednu datoteku</translation> </message> <message> <location line="+1"/> <source>Text format of the public key in one PEM file</source> <translation>Tekstualni format javnog ključa u jednoj PEM datoteci</translation> </message> <message> <location line="+1"/> <source>Binary DER format of the public key</source> <translation>Binarni DER format javnog ključa</translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in text format</source> <translation>Nekriptirani privatni ključ u tekstualnom formatu</translation> </message> <message> <location line="+2"/> <source>OpenSSL specific encrypted private key in text format</source> <translation>Privatni ključ kriptiran na OpenSSL način u tekstualnom formatu</translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in binary DER format</source> <translation>Nekriptirani privatni ključ u binarnom DER formatu</translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in PKCS#8 text format</source> <translation>Nekriptirani privatni ključ u PKCS#8 tekst formatu</translation> </message> <message> <location line="+2"/> <source>Encrypted private key in PKCS#8 text format</source> <translation>Kriptirani privatni ključ u PKCS#8 tekst formatu</translation> </message> <message> <location line="+1"/> <source>The public key encoded in SSH2 format</source> <translation>Javni ključ kodiran u SSH2 formatu</translation> </message> <message> <location line="+39"/> <source>The file: '%1' already exists!</source> <translation>Datoteka: '%1' već postoji!</translation> </message> <message> <location line="+2"/> <source>Overwrite</source> <translation>Prepiši</translation> </message> <message> <location line="+2"/> <source>Do not overwrite</source> <translation>Nemoj prepisati</translation> </message> </context> <context> <name>ExportKey</name> <message> <source>When exporting the private key it should be encrypted.</source> <translation type="obsolete">Kod izvoza privatni ključ bi trebao biti kriptiran.</translation> </message> <message> <source>When exporting the private part, it should be encrypted.</source> <translation type="obsolete">Kod izvoza privatni dio bi trebao biti kriptiran.</translation> </message> <message> <source>E&xport the private part of the Key too</source> <translation type="obsolete">I&zvezi i privatni dio Ključa</translation> </message> <message> <source>Export as PKCS#8</source> <translation type="obsolete">Izvezi kao PKCS#8</translation> </message> <message> <source>&Encrypt the Key with a password</source> <translation type="obsolete">&Kriptiraj Ključ sa zaporkom</translation> </message> <message> <source>Private keys ( *.pem *.der *.pk8 );;All files ( * )</source> <translation type="obsolete">Privatni ključevi ( *.pem *.der *.pk8 );;Sve datoteke ( * )</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="obsolete">DER je binarni format ključa bez kripcije PEM je base64 kodirani ključ s opcionalnom kripcijom PKCS#8 je službeni format za razmjenu ključeva</translation> </message> <message> <source>Please enter the filename for the key.</source> <translation type="obsolete">Unesite ime datoteke za ključ.</translation> </message> <message> <source>Export public %1 key</source> <translation type="obsolete">Izvezi javni %1 ključ</translation> </message> <message> <source>Export %1 key</source> <translation type="obsolete">Izvezi %1 ključ</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> <translatorcomment>Završeno, Obavljeno</translatorcomment> <translation>&Gotovo</translation> </message> </context> <context> <name>ImportMulti</name> <message> <location filename="../ui/ImportMulti.ui" line="+36"/> <source>Import PKI Items</source> <translation>Uvezi PKI stavke</translation> </message> <message> <location line="+58"/> <source>Import &All</source> <translation>Uvezi &Sve</translation> </message> <message> <location line="+7"/> <source>&Import</source> <translation>&Uvezi</translation> </message> <message> <location line="+7"/> <source>&Done</source> <translation>&Gotovo</translation> </message> <message> <location line="+7"/> <source>&Remove from list</source> <translation>&Obriši s popisa</translation> </message> <message> <location line="+7"/> <source>Details</source> <translation>Detalji</translation> </message> <message> <location line="+7"/> <source>Delete from token</source> <translation>Obriši s tokena</translation> </message> <message> <location line="+7"/> <source>Rename on token</source> <translation>Preimenuj na tokenu</translation> </message> <message> <location filename="../widgets/ImportMulti.cpp" line="+60"/> <source> Name: %1 Model: %2 Serial: %3</source> <translatorcomment>ime, naziv?</translatorcomment> <translation> Ime: %1 Model: %2 Serijski broj: %3</translation> </message> <message> <location line="+5"/> <source>Manage security token</source> <translation>Upravljaj pametnim tokenom</translation> </message> <message> <location line="+39"/> <location line="+144"/> <source>The type of the Item '%1' is not recognized</source> <translation>Vrsta stavke '%1' je nepoznata</translation> </message> <message> <location line="+48"/> <source>Details of the item '%1' cannot be shown</source> <translation>Detalji stavke '%1' ne mogu se prikazani</translation> </message> <message> <location line="+3"/> <source>The type of the item '%1' is not recognized</source> <translation>Vrsta stavke '%1' je nepoznata</translation> </message> <message> <location line="+29"/> <source>The file '%1' did not contain PKI data</source> <translation>Datoteka '%1' ne sadrži PKI podatke</translation> </message> <message> <location line="+3"/> <source>The %1 files: '%2' did not contain PKI data</source> <translation>Datoteke %1: '%2'ne sadrže PKI podatke</translation> </message> </context> <context> <name>KeyDetail</name> <message> <location filename="../ui/KeyDetail.ui" line="+91"/> <source>Name</source> <translation>Ime</translation> </message> <message> <location line="+7"/> <source>The internal name of the key used by xca</source> <translation>Interno ime ključa korištenog od strane xca</translation> </message> <message> <location line="+12"/> <source>Security token</source> <translation>Pametni token</translation> </message> <message> <location line="+6"/> <source>Manufacturer</source> <translation>Proizvođač</translation> </message> <message> <location line="+14"/> <source>Serial</source> <translation>Serijski broj</translation> </message> <message> <location line="+17"/> <location filename="../widgets/KeyDetail.cpp" line="+62"/> <source>Key</source> <translation>Ključ</translation> </message> <message> <location line="+8"/> <source>Public Exponent</source> <translation>Javni Eksponent</translation> </message> <message> <location line="+26"/> <source>Keysize</source> <translation>Dužina ključa</translation> </message> <message> <location line="+27"/> <source>Private Exponent</source> <translation>Privatni Exponent</translation> </message> <message> <location line="+25"/> <source>Modulus</source> <translation>Modul</translation> </message> <message> <location filename="../widgets/KeyDetail.cpp" line="-13"/> <source>Details of the %1 key</source> <translation>Detalji %1 ključa</translation> </message> <message> <location line="+3"/> <source>Not available</source> <translation>Nije dostupno</translation> </message> <message> <location line="+5"/> <source>Token</source> <translation>Token</translation> </message> <message> <location line="+4"/> <source>Security token ID:%1</source> <translation>Oznaka pametnog tokena:%1</translation> </message> <message> <location line="+3"/> <source>Available</source> <translation>Dostupno</translation> </message> <message> <location line="+9"/> <source>Sub prime</source> <translatorcomment>Ostaviti u orginalu?</translatorcomment> <translation>Prosti broj - 1</translation> </message> <message> <location line="+1"/> <location line="+9"/> <source>Public key</source> <translation>Javni ključ</translation> </message> <message> <location line="-8"/> <location line="+9"/> <source>Private key</source> <translation>Privatni ključ</translation> </message> <message> <location line="+1"/> <source>Curve name</source> <translation>Ime krivulje</translation> </message> <message> <location line="+7"/> <source>Unknown key</source> <translation>Nepoznati ključ</translation> </message> </context> <context> <name>KeyTreeView</name> <message> <location filename="../widgets/KeyTreeView.cpp" line="+28"/> <source>Change password</source> <translation>Promjena zaporke</translation> </message> <message> <location line="+4"/> <source>Reset password</source> <translation>Postavi početnu zaporku</translation> </message> <message> <location line="+10"/> <source>Change PIN</source> <translation>Promijeni PIN</translation> </message> <message> <location line="+2"/> <source>Init PIN with SO PIN (PUK)</source> <translation>Pripremi PIN pomoću SO PIN (PUK)</translation> </message> <message> <location line="+2"/> <source>Change SO PIN (PUK)</source> <translation>Promijeni SO PIN (PUK)</translation> </message> <message> <location line="+3"/> <source>Security token</source> <translation>Pametni token</translation> </message> <message> <location line="+33"/> <location line="+18"/> <location line="+18"/> <source>This is not a token</source> <translation>Ovo nije token</translation> </message> <message> <source>Tried to change PIN of a key</source> <translation type="obsolete">Pokušaj promjene PIN ključa</translation> </message> <message> <source>Tried to init PIN of a key</source> <translation type="obsolete">Pokušaj inicijalizacije PIN ključa</translation> </message> <message> <source>Tried to change SO PIN of a key</source> <translation type="obsolete">Pokušaj inicijalizacije SO PIN ključa</translation> </message> <message> <location line="+28"/> <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>Da li da originalni ključ '%1' treba biti zamijenjen ključem s tokena? To će obrisati ključ '%1' i zabraniti njegov izvoz </translation> </message> </context> <context> <name>MainWindow</name> <message> <location filename="../ui/MainWindow.ui" line="+22"/> <source>Private Keys</source> <translation>Privatni Ključevi</translation> </message> <message> <location line="+27"/> <source>&New Key</source> <translation>&Novi Ključ</translation> </message> <message> <location line="+7"/> <location line="+105"/> <location line="+92"/> <location line="+138"/> <location line="+58"/> <source>&Export</source> <translation>&Izvezi</translation> </message> <message> <location line="-386"/> <location line="+105"/> <location line="+92"/> <location line="+124"/> <location line="+72"/> <source>&Import</source> <translation>&Uvezi</translation> </message> <message> <location line="-386"/> <source>Import PFX (PKCS#12)</source> <translation>Uvezi PFX (PKCS#12)</translation> </message> <message> <location line="+7"/> <location line="+98"/> <location line="+92"/> <location line="+196"/> <source>&Show Details</source> <translation>&Prikaži Detalje</translation> </message> <message> <location line="-379"/> <location line="+98"/> <location line="+92"/> <location line="+103"/> <location line="+93"/> <source>&Delete</source> <translation>&Brisanje</translation> </message> <message> <location line="-346"/> <source>Certificate signing requests</source> <translation>Zahtjev za izdavanje potvrde (CSR)</translation> </message> <message> <location line="+30"/> <source>&New Request</source> <translation>&Novi Zahtjev</translation> </message> <message> <location line="+68"/> <location filename="../widgets/MW_menu.cpp" line="+124"/> <source>Certificates</source> <translation>Potvrde</translation> </message> <message> <location line="+24"/> <source>&New Certificate</source> <translation>&Nova Potvrda</translation> </message> <message> <location line="+35"/> <source>Import &PKCS#12</source> <translation>Uvezi &PKCS#12</translation> </message> <message> <location line="+7"/> <source>Import P&KCS#7</source> <translation>Uvezi &PKCS#7</translation> </message> <message> <location line="+7"/> <source>Plain View</source> <translation>Običan pregled</translation> </message> <message> <location line="+40"/> <source>Templates</source> <translation>Predlošci</translation> </message> <message> <location line="+28"/> <source>&New template</source> <translation>&Novi predložak</translation> </message> <message> <location line="+7"/> <source>Ch&ange Template</source> <translation>Pr&omijeni predložak</translation> </message> <message> <location line="+61"/> <source>Revocation lists</source> <translation>Popis opozvanih potvrda</translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="+166"/> <source>Using or exporting private keys will not be possible without providing the correct password</source> <translation>Korištenje ili izvoz privatnih ključeva neće biti moguće bez davanja ispravne zaporke</translation> </message> <message> <location line="+2"/> <location filename="../widgets/MainWindow.cpp" line="+914"/> <source>Database</source> <translation>Baza podataka</translation> </message> <message> <location line="+69"/> <source>No deleted items found</source> <translation>Nisu pronađene obrisane stavke</translation> </message> <message> <location line="+99"/> <source>Errors detected and repaired while deleting outdated items from the database. A backup file was created</source> <translation>Tijekom brisanja zastarjelih stavaka iz baze podataka otkrivene su i popravljene greške. Kreirana je rezervna kopija</translation> </message> <message> <location line="+2"/> <source>Removing deleted or outdated items from the database failed.</source> <translation>Nije uspjelo uklanjanje obrisanih ili zastarjelih stavki iz baze podataka.</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-66"/> <source>Recent DataBases</source> <translation>Nedavna baza podataka</translation> </message> <message> <location line="+5"/> <source>System</source> <translation>Sustav</translation> </message> <message> <location line="+1"/> <source>Croatian</source> <translation>Hrvatski</translation> </message> <message> <location line="+1"/> <source>English</source> <translation>Engleski</translation> </message> <message> <location line="+1"/> <source>French</source> <translation>Francuski</translation> </message> <message> <location line="+1"/> <source>German</source> <translation>Njemački</translation> </message> <message> <location line="+1"/> <source>Russian</source> <translation>Ruski</translation> </message> <message> <location line="+1"/> <source>Spanish</source> <translation>Španjolski</translation> </message> <message> <location line="+1"/> <source>Turkish</source> <translation>Turski</translation> </message> <message> <location line="+2"/> <source>Language</source> <translation>Jezik</translation> </message> <message> <location line="+15"/> <source>&File</source> <translation>&Datoteka</translation> </message> <message> <location line="+1"/> <source>&New DataBase</source> <translation>&Nova baza podataka</translation> </message> <message> <location line="+2"/> <source>&Open DataBase</source> <translation>&Otvori bazu podataka</translation> </message> <message> <location line="+3"/> <source>Generate DH parameter</source> <translation>Generiraj DH parametar</translation> </message> <message> <location line="+2"/> <source>Set as default DataBase</source> <translation>Postavi kao osnovnu bazu podataka</translation> </message> <message> <location line="+2"/> <source>&Close DataBase</source> <translation>&Zatvori bazu podataka</translation> </message> <message> <location line="+2"/> <source>&Dump DataBase</source> <translation>I&stovari bazu podataka</translation> </message> <message> <location line="+2"/> <source>C&hange DataBase password</source> <translation>P&romijeni zaporku baze podataka</translation> </message> <message> <location line="+2"/> <source>&Import old db_dump</source> <translation>&Uvezi stari istovar baze podataka</translation> </message> <message> <location line="+2"/> <source>&Undelete items</source> <translation>&Vrati obrisane stavke</translation> </message> <message> <location line="+3"/> <source>Options</source> <translation>Opcije</translation> </message> <message> <location line="+8"/> <source>Exit</source> <translation>Izlaz</translation> </message> <message> <location line="+5"/> <source>I&mport</source> <translation>U&vezi</translation> </message> <message> <location line="+1"/> <source>Keys</source> <translation>Ključevi</translation> </message> <message> <location line="+1"/> <source>Requests</source> <translation>Zahtjevi</translation> </message> <message> <location line="+2"/> <source>PKCS#12</source> <translation>PKCS#12</translation> </message> <message> <location line="+1"/> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <location line="+1"/> <source>Template</source> <translation>Predložak</translation> </message> <message> <location line="+1"/> <source>Revocation list</source> <translation>Popis opozvanih potvrda</translation> </message> <message> <location line="+1"/> <source>PEM file</source> <translation>PEM datoteka</translation> </message> <message> <location line="+1"/> <source>paste PEM file</source> <translation>zalijepi PEM datoteku</translation> </message> <message> <location line="+2"/> <source>&Token</source> <translation>&Token</translation> </message> <message> <location line="+1"/> <source>&Manage Security token</source> <translation>&Upravljaj pametnim tokenom</translation> </message> <message> <location line="+2"/> <source>&Init Security token</source> <translation>&Inicijaliziraj pametni token</translation> </message> <message> <location line="+2"/> <source>&Change PIN</source> <translation>&Promijeni PIN</translation> </message> <message> <location line="+2"/> <source>Change &SO PIN</source> <translation>Promijeni &SO PIN</translation> </message> <message> <location line="+2"/> <source>Init PIN</source> <translation>Inicijaliziraj PIN</translation> </message> <message> <location line="+3"/> <source>&Help</source> <translation>&Pomoć</translation> </message> <message> <location line="+1"/> <source>&Content</source> <translation>&Sadržaj</translation> </message> <message> <location line="+2"/> <source>About</source> <translation>O</translation> </message> <message> <source>&About</source> <translation type="obsolete">&O programu</translation> </message> <message> <source>Donations</source> <translation type="obsolete">Donacije</translation> </message> <message> <location line="+71"/> <source>Database dump ( *.dump );;All files ( * )</source> <translation>Istovari baze podataka ( *.dump );;Sve datoteke ( * )</translation> </message> <message> <location line="+5"/> <source>Import password</source> <translation>Zaporka za uvoz</translation> </message> <message> <location line="+1"/> <source>Please enter the password of the old database</source> <translation>Unesite zaporku stare baze podataka</translation> </message> <message> <location line="+6"/> <source>Password verification error. Ignore keys ?</source> <translation>Greška provjere zaporke. Ignorirati ključeve?</translation> </message> <message> <location line="+3"/> <source>Import anyway</source> <translation>Ipak uvezi</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-613"/> <source>no such option: %1</source> <translation>nema te opcije: %1</translation> </message> <message> <location line="+86"/> <source>Import PEM data</source> <translation>Uvezi PEM podatke</translation> </message> <message> <location line="+30"/> <source>Please enter the original SO PIN (PUK) of the token '%1'</source> <translation>Unesi originalni SO PIN (PUK) pametnog tokena '%1'</translation> </message> <message> <location line="+6"/> <source>Please enter the new SO PIN (PUK) of the token '%1'</source> <translation>Unesite novi SO PIN (PUK) pametnog tokena '%1'</translation> </message> <message> <location line="+7"/> <source>The new label of the token '%1'</source> <translation>Nova oznaka pametnog tokena '%1'</translation> </message> <message> <location line="+109"/> <source>The token '%1' did not contain any keys or certificates</source> <translation>Token '%1' ne sadrži ni jedan ključ ili potvrdu</translation> </message> <message> <location line="+53"/> <source>Current Password</source> <translation>Trenutna zaporka</translation> </message> <message> <location line="+1"/> <source>Please enter the current database password</source> <translation>Unesite trenutnu zaporku baze podataka</translation> </message> <message> <location line="+14"/> <source>The entered password is wrong</source> <translation>Unesena zaporka je neispravna</translation> </message> <message> <location line="+5"/> <location line="+105"/> <source>New Password</source> <translation>Nova Zaporka</translation> </message> <message> <location line="-105"/> <source>Please enter the new password to encrypt your private keys in the database-file</source> <translation>Unesite novu zaporku za kripciju privatnih ključeva u bazi podataka</translation> </message> <message> <location line="+105"/> <source>Please enter a password, that will be used to encrypt your private keys in the database file: %1</source> <translation>Unesite novu zaporku, koja će se koristiti za kripciju Vaših privatnih ključeva u datoteci baze podataka: %1</translation> </message> <message> <location line="+26"/> <source>Password verify error, please try again</source> <translation>Greška provjere zaporke, pokušajte ponovo</translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Zaporka</translation> </message> <message> <location line="+1"/> <source>Please enter the password for unlocking the database: %1</source> <translation>Unesite zaporku za otključavanje baze podataka: %1</translation> </message> <message> <location line="+34"/> <source>The following error occured:</source> <translation>Desila se sljedeća greška:</translation> </message> <message> <location line="+2"/> <source>Copy to Clipboard</source> <translation>Kopiraj u Clipboard</translation> </message> <message> <location line="+80"/> <source>Diffie-Hellman parameters are needed for different applications, but not handled by XCA. Please enter the DH parameter bits</source> <translation>Diffie-Hellman parametri su potrebni za različite aplikacije, no XCA ih nije obradila. Unesite bitove za DH parametre</translation> </message> <message> <location line="+23"/> <source>Error opening file: '%1': %2</source> <translation>Greška u otvaranju datoteke: '%1': %2</translation> </message> </context> <context> <name>NewCrl</name> <message> <location filename="../ui/NewCrl.ui" line="+30"/> <source>Create CRL</source> <translation>Izradi CRL</translation> </message> <message> <source>Dates</source> <translation type="obsolete">Datumi</translation> </message> <message> <location line="+62"/> <source>last update</source> <translation>posljednja obnova</translation> </message> <message> <location line="+14"/> <source>next update</source> <translation>sljedeća obnova</translation> </message> <message> <location line="+29"/> <source>Days</source> <translatorcomment>Dani?</translatorcomment> <translation>Dana</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Mjeseci</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Godina</translation> </message> <message> <location line="+8"/> <source>Midnight</source> <translation>Ponoć</translation> </message> <message> <location line="+7"/> <source>Local time</source> <translation>Lokal. vrijeme</translation> </message> <message> <location line="+7"/> <source>Apply</source> <translation>Primjeni</translation> </message> <message> <location line="+58"/> <source>Hash algorithm</source> <translation>Algoritam sažetka</translation> </message> <message> <source>Hashing algorithm</source> <translation type="obsolete">Algoritam sažetka</translation> </message> <message> <source>Extensions</source> <translation type="obsolete">Proširenja</translation> </message> <message> <location line="-10"/> <source>Authority key identifier</source> <translation>Oznaka ključa Autoriteta</translation> </message> <message> <location line="-17"/> <source>Subject alternative name</source> <translation>Alternativno ime subjekta</translation> </message> <message> <location line="-19"/> <source>Options</source> <translation>Opcije</translation> </message> <message> <location line="+9"/> <source>CRL Number</source> <translation>Broj CRL</translation> </message> <message> <location line="+17"/> <source>Revocation reasons</source> <translation>Razlog za opoziv</translation> </message> </context> <context> <name>NewKey</name> <message> <location filename="../ui/NewKey.ui" line="+14"/> <location line="+25"/> <source>New key</source> <translation>Novi ključ</translation> </message> <message> <location line="+47"/> <source>Please give a name to the new key and select the desired keysize</source> <translation>Unesite ime novog ključa i odaberite njegovu dužinu</translation> </message> <message> <location line="+10"/> <source>Key properties</source> <translation>Osobine ključa</translation> </message> <message> <location line="+6"/> <source>Name</source> <translation>Ime</translation> </message> <message> <location line="+19"/> <source>The internal name of the new key</source> <translation>Interno ime novog ključa</translation> </message> <message> <location line="+3"/> <source>New Key</source> <translation>Novi ključ</translation> </message> <message> <location line="+27"/> <source>Curve</source> <translation>Krivulja</translation> </message> <message> <location line="+7"/> <source>Keysize</source> <translation>Dužina ključa</translation> </message> <message> <location line="+13"/> <source>Usually 1024 or 2048 bit keys are used</source> <translation>Uobičajene dužine ključa su 1024 i 2048 bita</translation> </message> <message> <location line="+7"/> <source>Keytype</source> <translation>Vrsta ključa</translation> </message> <message> <location line="+10"/> <source>Remember as default</source> <translation>Zapamti kao osnovnu vrijednost</translation> </message> <message> <location filename="../widgets/NewKey.cpp" line="+180"/> <source>Create</source> <translation>Stvori</translation> </message> </context> <context> <name>NewX509</name> <message> <source>Create</source> <translation type="obsolete">Izradi</translation> </message> <message> <location filename="../ui/NewX509.ui" line="+75"/> <source>Source</source> <translatorcomment>Izvor, mislim da je Zahtjev više u duhu jezika</translatorcomment> <translation>Zahtjev</translation> </message> <message> <location line="+22"/> <source>Signing request</source> <translation>Zahtjev za izdavanje</translation> </message> <message> <location line="+24"/> <source>Show request</source> <translatorcomment>Prikaži</translatorcomment> <translation>Pokaži zahtjev</translation> </message> <message> <location line="+7"/> <source>Sign this Certificate signing &request</source> <translatorcomment>ovaj - da li treba?</translatorcomment> <translation>Potpiši ovaj &zahtjev za izdavanje potvrde</translation> </message> <message> <location line="+7"/> <source>Copy extensions from the request</source> <translation>Kopiraj proširenja iz zahtjeva</translation> </message> <message> <location line="+10"/> <source>Modify subject of the request</source> <translation>Promijeni Subjekt iz zahtjeva</translation> </message> <message> <location line="+41"/> <source>Signing</source> <translation>Potpisivanje</translation> </message> <message> <location line="+20"/> <source>Create a &self signed certificate with the serial</source> <translatorcomment>Stvori ili napravi ili izradi?</translatorcomment> <translation>Izradi &samopotpisanu potvrdu s ovim serijskim brojem</translation> </message> <message> <location line="+10"/> <source>If you leave this blank the serial 00 will be used</source> <translation>Ako ovo ne ispunite koristiti će se serijski broj 00</translation> </message> <message> <location line="+3"/> <source>1</source> <translation>1</translation> </message> <message> <location line="+17"/> <source>Use &this Certificate for signing</source> <translation>Koristi &ovu Potvrdu za potpisivanje</translation> </message> <message> <location line="+7"/> <source>All certificates in your database that can create valid signatures</source> <translation>Sve potvrde u vašoj bazi podataka koje mogu izraditi valjani potpis</translation> </message> <message> <location line="+33"/> <source>Signature algorithm</source> <translation>Algoritam potpisivanja</translation> </message> <message> <location line="+28"/> <source>Template for the new certificate</source> <translation>Predložak za novu potvrdu</translation> </message> <message> <location line="+12"/> <source>All available templates</source> <translation>Svi raspoloživi predlošci</translation> </message> <message> <location line="+22"/> <source>Apply extensions</source> <translation>Primijeni proširenja</translation> </message> <message> <location line="+7"/> <source>Apply subject</source> <translation>Primijeni subjekt</translation> </message> <message> <location line="+13"/> <source>Apply all</source> <translation>Primijeni sve</translation> </message> <message> <location line="+29"/> <location filename="../widgets/NewX509.cpp" line="+602"/> <source>Subject</source> <translation>Subjekt</translation> </message> <message> <location line="+6"/> <source>Distinguished name</source> <translation>Jedinstveno ime (DN)</translation> </message> <message> <source>Organisation</source> <translation type="obsolete">Organizacija</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-466"/> <source>This name is only used internally and does not appear in the resulting certificate</source> <translation>Ovo ime se samo interno koristi i neće se pojaviti u izrađenoj potvrdi</translation> </message> <message> <source>Must be exactly 2 letter of size (DE, UK)</source> <translation type="obsolete">Mora biti točno 2 velika slova (HR, UK)</translation> </message> <message> <source>Country code</source> <translation type="obsolete">Kod države</translation> </message> <message> <source>State or Province</source> <translatorcomment>U smislu savezna država</translatorcomment> <translation type="obsolete">Država ili Pokrajina</translation> </message> <message> <source>Locality</source> <translation type="obsolete">Mjesto</translation> </message> <message> <source>Organisational unit</source> <translation type="obsolete">Organizacijska jedinica</translation> </message> <message> <source>E-Mail address</source> <translation type="obsolete">E-mail adresa</translation> </message> <message> <location line="+2"/> <source>Internal name</source> <translation>Interno ime</translation> </message> <message> <source>Common name</source> <translation type="obsolete">Uobičajeno ime</translation> </message> <message> <location filename="../ui/NewX509.ui" line="+39"/> <source>Add</source> <translation>Dodaj</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Brisanje</translation> </message> <message> <location line="+37"/> <source>Private key</source> <translation>Privatni ključ</translation> </message> <message> <location line="+18"/> <source>This list only contains unused keys</source> <translation>Ovaj popis sadrži samo neiskorištene ključeve</translation> </message> <message> <location line="+7"/> <source>Used keys too</source> <translation>Korišteni ključevi također</translation> </message> <message> <location line="+7"/> <source>&Generate a new key</source> <translation>&Generiraj novi ključ</translation> </message> <message> <location line="+11"/> <source>Extensions</source> <translation>Proširenja</translation> </message> <message> <source>Basic constraints</source> <translation type="obsolete">Osnovna ograničenja</translation> </message> <message> <location line="+11"/> <source>Type</source> <translation>Vrsta</translation> </message> <message> <location line="+7"/> <source>If this will become a CA certificate or not</source> <translation>Da li će ovo postati CA potvrda ili ne</translation> </message> <message> <location line="+4"/> <source>Not defined</source> <translation>Nije definirano</translation> </message> <message> <location line="+5"/> <source>Certification Authority</source> <translation>Tijelo ovjeravanja (CA)</translation> </message> <message> <location line="+5"/> <source>End Entity</source> <translation>Krajnji subjekt</translation> </message> <message> <location line="+8"/> <source>Path length</source> <translation>Dužina puta</translation> </message> <message> <location line="+7"/> <source>How much CAs may be below this.</source> <translation>Koliko CA može biti ispod ove CA.</translation> </message> <message> <location line="+7"/> <source>The basic constraints should always be critical</source> <translation>Osnovna ograničenja bi uvijek trebala biti kritična osobina potvrde</translation> </message> <message> <location line="+13"/> <source>Key identifier</source> <translation>Oznaka ključa</translation> </message> <message> <location line="+15"/> <source>Creates a hash of the key following the PKIX guidelines</source> <translation>Izradi sažetak ključa sljedeći PKIX preporuke</translation> </message> <message> <location line="+10"/> <source>Copy the Subject Key Identifier from the issuer</source> <translation>Kopiraj Oznaku ključa Subjekta iz izdavača</translation> </message> <message> <location line="+40"/> <source>Validity</source> <translatorcomment>Nepobitnost, pravomoćnost, valjanost</translatorcomment> <translation>Ispravnost</translation> </message> <message> <location line="+6"/> <source>Not before</source> <translation>Od</translation> </message> <message> <location line="+14"/> <source>Not after</source> <translation>Do</translation> </message> <message> <location line="+17"/> <source>Time range</source> <translation>Vremensko razdoblje</translation> </message> <message> <location line="+10"/> <source>Days</source> <translation>Dana</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Mjeseci</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Godina</translation> </message> <message> <location line="+14"/> <source>Apply</source> <translation>Primjeni</translation> </message> <message> <location line="+7"/> <source>Set the time to 00:00:00 and 23:59:59 respectively</source> <translation>Postavi vrijeme na 00:00:00 odnosno 23:59:59 </translation> </message> <message> <location line="+3"/> <source>Midnight</source> <translation>Ponoć</translation> </message> <message> <location line="+7"/> <source>Local time</source> <translation>Lokalno vrijeme</translation> </message> <message> <location line="+7"/> <source>No well-defined expiration</source> <translation>Nejasno definiran istek roka</translation> </message> <message> <source>subject alternative name</source> <translation type="obsolete">Alternativno ime subjekta</translation> </message> <message> <location line="+50"/> <location line="+17"/> <location line="+76"/> <source>DNS: IP: URI: email: RID:</source> <translation>DNS: IP: URI: email: RID:</translation> </message> <message> <location line="-86"/> <location line="+17"/> <location line="+33"/> <location line="+43"/> <location filename="../widgets/NewX509.cpp" line="+848"/> <source>Edit</source> <translation>Uredi</translation> </message> <message> <source>issuer alternative name</source> <translation type="obsolete">alternativno ime izdavača</translation> </message> <message> <source>CRL distribution point</source> <translation type="obsolete">Točka objave popisa opozvanih potvrda</translation> </message> <message> <location line="-50"/> <source>URI:</source> <translation>URI:</translation> </message> <message> <source>Authority Info Access</source> <translation type="obsolete">Dohvat informacija Autoriteta (AIA)</translation> </message> <message> <location line="+36"/> <source>can be altered by the file "aia.txt"</source> <translation>može biti promijenjeno pomoću datoteke "aia.txt"</translation> </message> <message> <location line="+46"/> <source>Key usage</source> <translation>Namjena ključa</translation> </message> <message> <source>Extended key usage</source> <translation type="obsolete">Proširena upotreba ključa</translation> </message> <message> <location line="+126"/> <source>Netscape</source> <translation>Netscape</translation> </message> <message> <source>CA Revocation URL</source> <translation type="obsolete">URL opoziva CA</translation> </message> <message> <source>Revocation URL</source> <translation type="obsolete">URL opoziva</translation> </message> <message> <source>SSL server name</source> <translation type="obsolete">SSL ime poslužitelja</translation> </message> <message> <source>Certificate renewal URL</source> <translation type="obsolete">URL za obnovu potvrde</translation> </message> <message> <source>Comment</source> <translation type="obsolete">Napomena</translation> </message> <message> <source>CA policy URL</source> <translation type="obsolete">URL politike CA</translation> </message> <message> <source>Base URL</source> <translation type="obsolete">Osnovni URL</translation> </message> <message> <source>If you know a more pretty one tell me</source> <translatorcomment>!!! Ovo vrijedi i za hrvatski prijevod</translatorcomment> <translation type="obsolete">Ako znate bolje, javite mi</translation> </message> <message> <location line="+170"/> <source>Advanced</source> <translation>Napredno</translation> </message> <message> <location line="+24"/> <location filename="../widgets/NewX509.cpp" line="+10"/> <source>Validate</source> <translation>Potvrditi</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-897"/> <source>Create a &self signed certificate with a MD5-hashed QA serial</source> <translation>Izradi &samopotpisanu potvrdu s MD5 sažetkom CA serijskog broja</translation> </message> <message> <location line="+180"/> <source>Create Certificate signing request</source> <translation>Izradi zahtjev za izdavanje potvrde (CSR)</translation> </message> <message> <location line="+27"/> <source>minimum size: %1</source> <translation>najmanja veličina: %1</translation> </message> <message> <location line="+2"/> <source>maximum size: %1</source> <translation>najveća veličina: %1</translation> </message> <message> <location line="+2"/> <source>only a-z A-Z 0-9 '()+,-./:=?</source> <translation>samo a-z A-Z 0-9 '()+,-./:=?</translation> </message> <message> <location line="+4"/> <source>only 7-bit clean characters</source> <translation>samo 7 bitni znaci</translation> </message> <message> <source>XCA template</source> <translation type="obsolete">XCA predložak</translation> </message> <message> <location line="+41"/> <source>Create x509 Certificate</source> <translation>Izradi x509 Potvrdu</translation> </message> <message> <location line="+700"/> <source>From PKCS#10 request</source> <translation>Iz PKCS#10 zahtjeva</translation> </message> <message> <location line="-37"/> <source>Other Tabs</source> <translation>Druge Kartice</translation> </message> <message> <location line="-753"/> <source>Critical</source> <translation>Ključan</translation> </message> <message> <location line="+73"/> <source>Create XCA template</source> <translation>Izradi XCA predložak</translation> </message> <message> <location line="+4"/> <source>Edit XCA template</source> <translation>Uredi XCA predložak</translation> </message> <message> <location line="+689"/> <source>Advanced Tab</source> <translation>Kartica Napredno</translation> </message> <message> <location line="+7"/> <source>Errors</source> <translation>Greške</translation> </message> <message> <location line="+103"/> <location line="+13"/> <location line="+19"/> <location line="+12"/> <location line="+16"/> <location line="+14"/> <location line="+34"/> <location line="+11"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Abort rollout</source> <translation>O uvođenju</translation> </message> <message> <location line="-174"/> <source>The following length restrictions of RFC3280 are violated:</source> <translation>Sljedeća ograničenja dužine iz RFC3280 su prekršena:</translation> </message> <message> <location line="+3"/> <location line="+61"/> <source>Edit subject</source> <translation>Uredi subjekt</translation> </message> <message> <location line="-59"/> <location line="+61"/> <location line="+45"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Continue rollout</source> <translation>Nastavi uvođenje</translation> </message> <message> <location line="-154"/> <source>The verification of the Certificate request failed. The rollout should be aborted.</source> <translation>Provjera zahtjeva za izdavanje Potvrde nije uspješna. Uvođenje će biti prekinuto.</translation> </message> <message> <location line="+1"/> <source>Continue anyway</source> <translation>Nastavi bez obzira na sve</translation> </message> <message> <location line="+11"/> <source>The internal name and the common name are empty. Please set at least the internal name.</source> <translation>Interno ime i uobičajeno ime (CN) nisu popunjeni. Molimo vas popunite barem interno ime.</translation> </message> <message> <location line="+1"/> <source>Edit name</source> <translation>Uredi ime</translation> </message> <message> <location line="+15"/> <source>There is no Key selected for signing.</source> <translation>Nije odabran Ključ za potpisivanje.</translation> </message> <message> <location line="+1"/> <source>Select key</source> <translation>Odaberi ključ</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>Sljedeća polja jedinstvenog imena su nepopunjena: %1 premda ste ih označili kao obavezno prisutnima u meniju s opcijama.</translation> </message> <message> <location line="+34"/> <source>The key you selected for signing is not a private one.</source> <translation>Ključ kojeg ste odabrali za potpisivanje nije privatni ključ.</translation> </message> <message> <location line="+1"/> <source>Select other signer</source> <translation>Odaberite drugog potpisnika</translation> </message> <message> <location line="+0"/> <source>Select other key</source> <translation>Odaberite drugi ključ</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>Početak valjanosti potvrde je prije početka valjanosti potvrde potpisnika (ovjeritelja). To vjerojatno nije ono što ste htjeli.</translation> </message> <message> <location line="+2"/> <location line="+23"/> <location line="+22"/> <source>Edit dates</source> <translation>Uredi datume</translation> </message> <message> <location line="-42"/> <location line="+23"/> <source>Adjust date and continue</source> <translation>Podesi datum i nastavi</translation> </message> <message> <location line="-5"/> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation>Kraj valjanosti potvrde je nakon isteka valjanosti potvrde potpisnika (ovjeritelja). To vjerojatno nije ono što ste htjeli.</translation> </message> <message> <location line="+22"/> <source>The certificate will be out of date before it becomes valid. You most probably mixed up both dates.</source> <translation>Potvrda će prestati važiti prije nego što je izdana. Vjerojatno ste zamijenili datume.</translation> </message> <message> <location line="+19"/> <source>The certificate contains invalid or duplicate extensions. Check the validation on the advanced tab.</source> <translation>Potvrda sadrži neispravna ili duplicirana proširenja. Provjerite valjanost na Kartici Napredno.</translation> </message> <message> <location line="+2"/> <source>Edit extensions</source> <translation>Uredi proširenja</translation> </message> <message> <location filename="../widgets/NewX509_ext.cpp" line="+220"/> <source>Configfile error on line %1 </source> <translation>Greška u konfiguracijskoj datoteci u liniji %1</translation> </message> </context> <context> <name>Options</name> <message> <location filename="../ui/Options.ui" line="+28"/> <source>XCA Options</source> <translation>XCA Opcije</translation> </message> <message> <location line="+120"/> <source>Mandatory subject entries</source> <translation>Obavezne stavke subjekta </translation> </message> <message> <location line="+24"/> <location line="+60"/> <location line="+57"/> <source>Add</source> <translation>Dodaj</translation> </message> <message> <location line="-110"/> <location line="+60"/> <source>Delete</source> <translation>Obriši</translation> </message> <message> <location line="-183"/> <source>Default hash algorithm</source> <translation>Osnovni algoritam sažetka</translation> </message> <message> <location line="-14"/> <source>Settings</source> <translation>Postavke</translation> </message> <message> <location line="+34"/> <source>String types</source> <translation>Vrste nizova</translation> </message> <message> <location line="+12"/> <source>Suppress success messages</source> <translation>Izostavi poruke o uspješnoj akciji</translation> </message> <message> <location line="+7"/> <source>Don't colorize expired certificates</source> <translation>Nemoj obojiti istekle potvrde</translation> </message> <message> <location line="+7"/> <source>Translate established x509 terms (%1 -> %2)</source> <translation>Prevedi uspostavljene x509 pojmove (%1 -> %2)</translation> </message> <message> <location line="+7"/> <source>The hashing functionality of the token is not used by XCA. It may however honor a restricted hash-set propagated by the token. Especially EC and DSA are only defined with SHA1 in the PKCS#11 specification.</source> <translation>XCA ne koristi funkcionalnost sažetka tokena. XCA će možda prihvatiti ograničeni skup sažetka koje pruža token. Posebno EC i DSA su samo definirani sa SHA1 u PKCS#11 specifikaciji.</translation> </message> <message> <location line="+5"/> <source>Only use hashes supported by the token when signing with a token key</source> <translation>Kod potpisivanja ključem iz tokena koristi samo sažetke koje podržava token</translation> </message> <message> <location line="+7"/> <source>Disable legacy Netscape extensions</source> <translatorcomment>Deaktiviraj/isključi zastarjela Netscape proširenja</translatorcomment> <translation>Onemogući nasljeđena Netscape proširenja</translation> </message> <message> <location line="+21"/> <source>Distinguished name</source> <translation>Jedinstveno ime</translation> </message> <message> <location line="+62"/> <source>Explicit subject entries</source> <translation>Izričite stavke subjekta</translation> </message> <message> <location line="+42"/> <source>Default</source> <translatorcomment>Osnovno</translatorcomment> <translation>Osnovni</translation> </message> <message> <location line="+26"/> <source>PKCS#11 provider</source> <translation>PKCS#11 poslužitelj</translation> </message> <message> <location line="+30"/> <source>Remove</source> <translation>Izbaci</translation> </message> <message> <location line="+7"/> <source>Search</source> <translation>Traži</translation> </message> <message> <location filename="../widgets/Options.cpp" line="+32"/> <source>Printable string or UTF8 (default)</source> <translatorcomment>!!! Ispisljivi koja je alternativa za Čitljivi</translatorcomment> <translation>Čitljivi niz ili UTF8 (osnovni odabir)</translation> </message> <message> <location line="+1"/> <source>PKIX recommendation in RFC2459</source> <translation>PKIX preporuke iz RFC2459 </translation> </message> <message> <location line="+1"/> <source>No BMP strings, only printable and T61</source> <translation>Ne BMP nizovi, samo čitljivi i T61</translation> </message> <message> <location line="+1"/> <source>UTF8 strings only (RFC2459)</source> <translation>Samo UTF8 nizovi (RFC2459)</translation> </message> <message> <location line="+1"/> <source>All strings</source> <translation>Svi nizovi</translation> </message> <message> <location line="+155"/> <source>Load failed</source> <translation>Učitavanje nije uspjelo</translation> </message> </context> <context> <name>PwDialog</name> <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>Zaporka se rastavlja i tumači kao 2 znamenkasti heksadecimalni kod. Mora imati paran broj znamenki (0-9 and a-f)</translation> </message> <message> <location line="+3"/> <source>Take as HEX string</source> <translation>Uzmi heksadekadni niz</translation> </message> <message> <location filename="../widgets/PwDialog.cpp" line="+85"/> <source>Repeat %1</source> <translation>Ponovi %1</translation> </message> <message> <location line="+13"/> <source>%1 missmatch</source> <translation>%1 je neodgovarajući</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>Heksadecimalna zaporka smije sadržavati samo znakove '0' - '9' i 'a' - 'f' i mora se sastojati od parnog broja znakova </translation> </message> <message> <location line="+26"/> <source>E&xit</source> <translation>I&zlaz</translation> </message> </context> <context> <name>QObject</name> <message> <location filename="../lib/asn1time.cpp" line="+142"/> <location line="+10"/> <location line="+19"/> <source>Undefined</source> <translation>Nedefinirano</translation> </message> <message> <location line="-27"/> <location line="+10"/> <location line="+19"/> <source>Broken / Invalid</source> <translation>Poništen / Neispravan</translation> </message> <message> <location filename="../lib/db.cpp" line="+223"/> <source>DB: Rename: '%1' already in use</source> <translation>DB: Preimenuj: '%1' je već u upotrebi</translation> </message> <message> <location line="+4"/> <source>DB: Entry to rename not found: %1</source> <translation>DB: Stavka za preimenovati nije pronađena: %1</translation> </message> <message> <location line="+10"/> <source>DB: Write error %1 - %2</source> <translation>DB: Greška u pisanju %1 - %2</translation> </message> <message> <location line="+324"/> <location line="+17"/> <source>Out of data</source> <translation>Nema podatka</translation> </message> <message> <location line="+23"/> <source>Error finding endmarker of string</source> <translation>Greška u traženju oznake kraja niza</translation> </message> <message> <location filename="../lib/exception.h" line="+55"/> <source>Out of Memory at %1:%2</source> <translation>Ponestalo slobodne memorije u %1:%2</translation> </message> <message> <location filename="../lib/load_obj.cpp" line="+20"/> <source>All files ( * )</source> <translation>Sve datoteke ( * )</translation> </message> <message> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;</source> <translation type="obsolete">PKI ključevi ( *.pem *.der *.key );;PKCS#8 ključevi ( *.p8 *.pk8 );;</translation> </message> <message> <location line="+32"/> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;SSH Public Keys ( *.pub );;</source> <translation>PKI ključevi ( *.pem *.der *.key );;PKCS#8 ključevi ( *.p8 *.pk8 );;SSH javni ključevi ( *.pub );;</translation> </message> <message> <location line="+3"/> <source>Import RSA key</source> <translation>Uvezi RSA ključ</translation> </message> <message> <location line="+12"/> <source>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;</source> <translation>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape zahtjev ( *.spkac *.spc );;</translation> </message> <message> <location line="+2"/> <source>Import Request</source> <translation>Uvezi zahtjev</translation> </message> <message> <location line="+12"/> <source>Certificates ( *.pem *.der *.crt *.cer );;</source> <translation>Potvrde ( *.pem *.der *.crt *.cer );;</translation> </message> <message> <location line="+1"/> <source>Import X.509 Certificate</source> <translation>Uvezi x509 Potvrdu</translation> </message> <message> <location line="+12"/> <source>PKCS#7 data ( *.p7s *.p7m *.p7b );;</source> <translation>PKCS#7 podaci ( *.p7s *.p7m *.p7b );;</translation> </message> <message> <location line="+1"/> <source>Import PKCS#7 Certificates</source> <translation>Uvezi PKCS#7 Potvrde</translation> </message> <message> <location line="+12"/> <source>PKCS#12 Certificates ( *.p12 *.pfx );;</source> <translation>PKCS#12 Potvrde ( *.p12 *.pfx );;</translation> </message> <message> <location line="+1"/> <source>Import PKCS#12 Private Certificate</source> <translation>Uvezi PKCS#12 Privatne Potvrde</translation> </message> <message> <location line="+13"/> <source>XCA templates ( *.xca );;</source> <translation>XCA predloške ( *.xca );;</translation> </message> <message> <location line="+1"/> <source>Import XCA Templates</source> <translation>Uvezi XCA Predloške</translation> </message> <message> <location line="+12"/> <source>Revocation lists ( *.pem *.der *.crl );;</source> <translation>Popis opozvanih potvrda ( *.pem *.der *.crl );;</translation> </message> <message> <location line="+1"/> <source>Import Certificate Revocation List</source> <translation>Uvezi Popis Opozvanih Potvrda</translation> </message> <message> <location line="+12"/> <source>XCA Databases ( *.xdb );;</source> <translation>XCA Baze podataka ( *.xdb );;</translation> </message> <message> <location line="+1"/> <source>Open XCA Database</source> <translation>Otvori XCA Bazu podataka</translation> </message> <message> <location line="+8"/> <source>PKCS#11 library ( *.dll );;</source> <translation>PKCS#11 knjižnica ( *.dll );;</translation> </message> <message> <location line="+2"/> <source>PKCS#11 library ( *.dylib *.so );;</source> <translation>PKCS#11 knjižnica ( *.dylib *.so );;</translation> </message> <message> <location line="+2"/> <source>PKCS#11 library ( *.so );;</source> <translation>PKCS#11 knjižnica ( *.so );;</translation> </message> <message> <location line="+2"/> <source>Open PKCS#11 shared library</source> <translation>Otvori PKCS#11 zajedničku knjižnicu</translation> </message> <message> <location line="+7"/> <source>PEM files ( *.pem );;</source> <translation>PEM datoteke ( *.pem );;</translation> </message> <message> <location line="+1"/> <source>Load PEM encoded file</source> <translation>Učitaj PEM kodiranu datoteku</translation> </message> <message> <location filename="../lib/pkcs11.cpp" line="+228"/> <source>Please enter the PIN on the PinPad</source> <translation>Unesite PIN u PinPad</translation> </message> <message> <location line="+11"/> <source>Please enter the SO PIN (PUK) of the token %1</source> <translation>Unesite SO PIN (PUK) tokena %1</translation> </message> <message> <location line="+1"/> <source>Please enter the PIN of the token %1</source> <translation>Unesite PIN tokena %1</translation> </message> <message> <location line="+48"/> <source>No Security token found</source> <translation>Nije pronađen pametni token</translation> </message> <message> <location line="+11"/> <source>Select</source> <translation>Odaberi</translation> </message> <message> <location line="+22"/> <source>Please enter the new SO PIN (PUK) for the token: '%1'</source> <translation>Unesite novi SO PIN (PUK) za token: '%1'</translation> </message> <message> <location line="+2"/> <source>Please enter the new PIN for the token: '%1'</source> <translation>Unesite novi PIN za token: '%1'</translation> </message> <message> <location filename="../lib/pkcs11.h" line="+92"/> <source>Required PIN size: %1 - %2</source> <translation>Obavezna dužina PIN: %1 - %2</translation> </message> <message> <location filename="../lib/pkcs11_lib.cpp" line="+57"/> <source>Failed to open PKCS11 library: %1</source> <translation>Neuspješno otvaranje PKCS11 knjižnice: %1</translation> </message> <message> <location line="+219"/> <source>PKCS#11 function '%1' failed: %2</source> <translation>PKSC#11 funkcija '%1'prijavila grešku: %2</translation> </message> <message> <location line="+8"/> <source>PKCS#11 function '%1' failed: %2 In library %3 %4</source> <translation>PKCS#11 function '%1' failed: %2 U knjižnici %3 %4</translation> </message> <message> <location filename="../lib/x509name.cpp" line="+106"/> <source>Invalid</source> <translation>Neispravno</translation> </message> <message> <location line="+113"/> <source>%1 is shorter than %2 bytes: '%3'</source> <translation>%1 je kraće od %2 okteta: '%3'</translation> </message> <message> <location line="+5"/> <source>%1 is longer than %2 bytes: '%3'</source> <translation>%1 je duže od %2 okteta: '%3'</translation> </message> <message> <location filename="../lib/func.cpp" line="+441"/> <source>Country code</source> <translation>Kod države</translation> </message> <message> <location line="+1"/> <source>State or Province</source> <translation>Država ili Pokrajina</translation> </message> <message> <location line="+1"/> <source>Locality</source> <translation>Mjesto</translation> </message> <message> <location line="+1"/> <source>Organisation</source> <translation>Organizacija</translation> </message> <message> <location line="+1"/> <source>Organisational unit</source> <translation>Organizacijska jedinica</translation> </message> <message> <location line="+1"/> <source>Common name</source> <translation>Uobičajeno ime</translation> </message> <message> <location line="+1"/> <source>E-Mail address</source> <translation>E-mail adresa</translation> </message> <message> <location line="+1"/> <source>Serial number</source> <translation>Serijski broj</translation> </message> <message> <location line="+1"/> <source>Given name</source> <translation>Ime</translation> </message> <message> <location line="+1"/> <source>Surname</source> <translation>Prezime</translation> </message> <message> <location line="+1"/> <source>Title</source> <translation>Titula</translation> </message> <message> <location line="+1"/> <source>Initials</source> <translation>Inicijali</translation> </message> <message> <location line="+1"/> <source>Description</source> <translation>Opis</translation> </message> <message> <location line="+1"/> <source>Role</source> <translation>Funkcija</translation> </message> <message> <location line="+1"/> <source>Pseudonym</source> <translation>Pseudonim</translation> </message> <message> <location line="+1"/> <source>Generation Qualifier</source> <translation>Oznaka Generacije</translation> </message> <message> <location line="+1"/> <source>x500 Unique Identifier</source> <translation>x500 Jedinstveni Identifikator</translation> </message> <message> <location line="+1"/> <source>Name</source> <translation>Ime</translation> </message> <message> <location line="+1"/> <source>DN Qualifier</source> <translation>DN Oznaka </translation> </message> <message> <location line="+1"/> <source>Unstructured name</source> <translation>Nestrukturirano ime</translation> </message> <message> <location line="+1"/> <source>Challenge password</source> <translation>Zaporka za izazov</translation> </message> <message> <location line="+2"/> <source>Basic Constraints</source> <translation>Osnovna Ograničenja</translation> </message> <message> <location line="+1"/> <source>subject alternative name</source> <translation>alternativno ime subjekta</translation> </message> <message> <location line="+1"/> <source>issuer alternative name</source> <translation>alternativno ime izdavača</translation> </message> <message> <location line="+1"/> <source>Subject key identifier</source> <translation>Oznaka ključa Subjekta</translation> </message> <message> <location line="+1"/> <source>Authority key identifier</source> <translation>Oznaka ključa Autoriteta</translation> </message> <message> <location line="+1"/> <source>Key usage</source> <translation>Namjena ključa</translation> </message> <message> <location line="+1"/> <source>Extended key usage</source> <translation>Proširena upotreba ključa</translation> </message> <message> <location line="+1"/> <source>CRL distribution points</source> <translation>Točka objave popisa opozvanih potvrda</translation> </message> <message> <location line="+1"/> <source>Authority information access</source> <translation>Dohvat informacija Autoriteta</translation> </message> <message> <location line="+1"/> <source>Certificate type</source> <translation>Vrsta Potvrde</translation> </message> <message> <location line="+1"/> <source>Base URL</source> <translation>Osnovni URL</translation> </message> <message> <location line="+1"/> <source>Revocation URL</source> <translation>URL opoziva</translation> </message> <message> <location line="+1"/> <source>CA Revocation URL</source> <translation>URL opoziva CA</translation> </message> <message> <location line="+1"/> <source>Certificate renewal URL</source> <translation>URL za obnovu potvrde</translation> </message> <message> <location line="+1"/> <source>CA policy URL</source> <translation>URL politike CA</translation> </message> <message> <location line="+1"/> <source>SSL server name</source> <translation>SSL ime poslužitelja</translation> </message> <message> <location line="+1"/> <source>Comment</source> <translation>Napomena</translation> </message> <message> <location filename="../lib/x509v3ext.cpp" line="+75"/> <source>String '%1' for '%2' contains invalid characters</source> <translation>Niz'%1' za '%2' sadrži nevažeće znakove</translation> </message> </context> <context> <name>ReqTreeView</name> <message> <location filename="../widgets/ReqTreeView.cpp" line="+23"/> <source>Sign</source> <translation>Potpiši</translation> </message> <message> <location line="+2"/> <source>Similar Request</source> <translation>Sličan zahtjev</translation> </message> </context> <context> <name>RevocationList</name> <message> <location filename="../ui/RevocationList.ui" line="+30"/> <source>Manage revocations</source> <translation>Upravljaj opozivima</translation> </message> <message> <location line="+66"/> <source>Add</source> <translation>Dodaj</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Obriši</translation> </message> <message> <location filename="../widgets/RevocationList.cpp" line="+70"/> <source>No.</source> <translation>Br.</translation> </message> <message> <location line="+0"/> <source>Serial</source> <translation>Serijski broj</translation> </message> <message> <location line="+0"/> <source>Revocation</source> <translation>Opoziv</translation> </message> <message> <location line="+0"/> <source>Reason</source> <translation>Razlog</translation> </message> <message> <location line="+1"/> <source>Invalidation</source> <translation>Poništenje</translation> </message> <message> <location line="+25"/> <source>Generate CRL</source> <translation>Izradi CRL</translation> </message> </context> <context> <name>Revoke</name> <message> <location filename="../ui/Revoke.ui" line="+87"/> <source>Revocation details</source> <translation>Detalji opoziva</translation> </message> <message> <location line="+30"/> <source>Invalid since</source> <translation>Nevažeće od</translation> </message> <message> <location line="-7"/> <source>Local time</source> <translation>Lokalno vrijeme</translation> </message> <message> <location line="-80"/> <source>Certificate revocation</source> <translation>Opoziv potvrde</translation> </message> <message> <location line="+66"/> <source>Revocation reason</source> <translation>Razlog za opoziv</translation> </message> <message> <location line="+28"/> <source>Serial</source> <translation>Serijski broj</translation> </message> </context> <context> <name>SearchPkcs11</name> <message> <location filename="../ui/SearchPkcs11.ui" line="+14"/> <source>Dialog</source> <translation>Dijalog</translation> </message> <message> <location line="+27"/> <source>Directory</source> <translation>Mape</translation> </message> <message> <location line="+16"/> <source>...</source> <translation>...</translation> </message> <message> <location line="+7"/> <source>include sub directorys</source> <translation>Uključi podmape</translation> </message> <message> <location line="+7"/> <source>Search</source> <translation>Traži</translation> </message> <message> <location filename="../widgets/SearchPkcs11.cpp" line="+77"/> <source>The following files are possible PKCS#11 libraries</source> <translation>Sljedeće datoteke su kandidati za PKCS#11 datoteke</translation> </message> </context> <context> <name>SelectToken</name> <message> <location filename="../ui/SelectToken.ui" line="+14"/> <source>Select Token</source> <translation>Odaberi token</translation> </message> <message> <location line="+25"/> <source>Security token</source> <translation>Pametni token</translation> </message> <message> <location line="+47"/> <source>Please select the security token</source> <translation>Odaberite pametni token</translation> </message> </context> <context> <name>TempTreeView</name> <message> <location filename="../widgets/TempTreeView.cpp" line="+20"/> <source>Duplicate</source> <translation>Podvostruči</translation> </message> <message> <location line="+1"/> <source>Create certificate</source> <translation>Izradi potvrdu</translation> </message> <message> <location line="+1"/> <source>Create request</source> <translation>Izradi zahtjev</translation> </message> <message> <location line="+11"/> <source>copy</source> <translation>kopiraj</translation> </message> </context> <context> <name>TrustState</name> <message> <source>Set trustment of the Certificate</source> <translation type="obsolete">Podesi pouzdanost Potvrde</translation> </message> <message> <location filename="../ui/TrustState.ui" line="+33"/> <source>Certificate trust</source> <translation>Povjerenje u potvrdu</translation> </message> <message> <location line="+60"/> <source>Trustment</source> <translation>Pouzdanost</translation> </message> <message> <location line="+9"/> <source>&Never trust this certificate</source> <translation>&Nikad ne vjeruj ovoj potvrdi</translation> </message> <message> <location line="+7"/> <source>Only &trust this certificate, if we trust the signer</source> <translation>Uvijek &vjeruj potvrdi, ako vjerujemo izdavaču</translation> </message> <message> <location line="+7"/> <source>&Always trust this certificate</source> <translation>&Uvijek vjeruj ovoj potvrdi</translation> </message> </context> <context> <name>Validity</name> <message> <location filename="../widgets/validity.cpp" line="+94"/> <source>yyyy-MM-dd hh:mm</source> <translation>yyyy-MM-dd hh:mm</translation> </message> </context> <context> <name>X509SuperTreeView</name> <message> <location filename="../widgets/X509SuperTreeView.cpp" line="+25"/> <source>OpenSSL config</source> <translation>OpenSSL konfiguracija</translation> </message> <message> <location line="+2"/> <source>Transform</source> <translation>Preobrazi</translation> </message> <message> <location line="+1"/> <source>Template</source> <translation>Predložak</translation> </message> <message> <location line="+2"/> <source>Public Key</source> <translation>Javni ključ</translation> </message> </context> <context> <name>XcaTreeView</name> <message> <location filename="../widgets/XcaTreeView.cpp" line="+282"/> <source>Subject entries</source> <translation>Stavke subjekta</translation> </message> <message> <location line="+1"/> <source>X509v3 Extensions</source> <translation>X509v3 Proširenja</translation> </message> <message> <location line="+1"/> <source>Netscape extensions</source> <translation>Netscape proširenja</translation> </message> <message> <location line="+1"/> <source>Reset</source> <translation>Vrati na početak</translation> </message> <message> <location line="+47"/> <source>Columns</source> <translation>Stupci</translation> </message> <message> <location line="+28"/> <source>New</source> <translation>Novo</translation> </message> <message> <location line="+1"/> <source>Import</source> <translation>Uvezi</translation> </message> <message> <location line="+1"/> <source>Paste PEM data</source> <translation>Zalijepi PEM podatke</translation> </message> <message> <location line="+3"/> <source>Rename</source> <translation>Preimenuj</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation>Obriši</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation>Izvezi</translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation>Clipboard</translation> </message> <message> <location line="+2"/> <source>File</source> <translation>Datoteka</translation> </message> </context> <context> <name>db_base</name> <message> <location filename="../lib/db_base.cpp" line="+211"/> <source>Internal name</source> <translation>Interno ime</translation> </message> <message> <location line="-136"/> <source>Bad database item Name: %1 Type: %2 Size: %3 %4</source> <translation>Loša stavka baze podatka Ime: %1 Vrsta: %2 Veličina: %3 %4</translation> </message> <message> <location line="+3"/> <source>Do you want to delete the item from the database? The bad item may be extracted into a separate file.</source> <translation>Da li želite izbrisati stavku iz baze podataka? Pogrešne stavke mogu biti izdvojene u zasebnu datoteku.</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translatorcomment>Brisanje</translatorcomment> <translation>Obriši</translation> </message> <message> <location line="+1"/> <source>Delete and extract</source> <translation>Obriši i izdvoji</translation> </message> <message> <location line="+1"/> <source>Continue</source> <translation>Nastavi</translation> </message> <message> <location line="+19"/> <location line="+540"/> <source>Error opening file: '%1': %2</source> <translation>Greška u otvaranju datoteke: '%1': %2</translation> </message> <message> <location line="-430"/> <source>No.</source> <translatorcomment>Broj</translatorcomment> <translation>Br.</translation> </message> <message> <location line="+404"/> <source>How to export the %1 selected items</source> <translation>Kako da izvezemo %1 odabranih stavki</translation> </message> <message> <location line="+2"/> <source>All in one PEM file</source> <translation>Sve u jednoj PEM datoteci</translation> </message> <message> <location line="+1"/> <source>Each item in one file</source> <translation>Svaka stavka u zasebnoj datoteci</translation> </message> <message> <location line="+13"/> <source>Save %1 items in one file as</source> <translation>Spremi %1 stavki u jednoj datoteci kao</translation> </message> <message> <location line="+1"/> <source>PEM Files( *.pem );; All files ( * )</source> <translation>PEM datoteke (*.pem);; Sve datoteke ( * )</translation> </message> <message> <source>Subject entries</source> <translation type="obsolete">Stavke subjekta</translation> </message> <message> <source>X509v3 Extensions</source> <translation type="obsolete">X509v3 Proširenja</translation> </message> <message> <source>Netscape extensions</source> <translation type="obsolete">Netscape proširenja</translation> </message> <message> <source>Reset</source> <translation type="obsolete">Vrati na početak</translation> </message> <message> <source>Paste PEM data</source> <translation type="obsolete">Zalijepi PEM podatke</translation> </message> <message> <source>Columns</source> <translation type="obsolete">Stupci</translation> </message> </context> <context> <name>db_crl</name> <message> <location filename="../lib/db_crl.cpp" line="+31"/> <source>Signer</source> <translation>Potpisnik</translation> </message> <message> <location line="+1"/> <source>Internal name of the signer</source> <translation>Interno ime potpisnika</translation> </message> <message> <location line="+1"/> <source>No. revoked</source> <translation>Broj opozvanih</translation> </message> <message> <location line="+1"/> <source>Number of revoked certificates</source> <translation>Broj opozvanih potvrda</translation> </message> <message> <location line="+1"/> <source>Last update</source> <translation>Posljednja obnova</translation> </message> <message> <location line="+1"/> <source>Next update</source> <translation>Sljedeća obnova</translation> </message> <message> <location line="+1"/> <source>CRL number</source> <translation>Broj CRL</translation> </message> <message> <location line="+75"/> <source>The revocation list already exists in the database as: '%1' and so it was not imported</source> <translation>Popis opozvanih potvrda već postoji u bazi podataka kao: '%1' i zbog toga nije uvezen</translation> </message> <message> <location line="+41"/> <source>CRL ( *.pem *.der *.crl )</source> <translation>CRL ( *.pem *.der *.crl )</translation> </message> <message> <location line="+59"/> <source>There are no CA certificates for CRL generation</source> <translation>Nema CA potvrda za izradu liste opozvanih potvrda</translation> </message> <message> <location line="+8"/> <source>Select CA certificate</source> <translation>Odaberi CA potvrdu</translation> </message> <message> <location line="-68"/> <source>Revocation list export</source> <translation>Izvoz popisa opozvanih potvrda</translation> </message> <message> <source>Import</source> <translation type="obsolete">Uvezi</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Preimenuj</translation> </message> <message> <source>Export</source> <translation type="obsolete">Izvoz</translation> </message> <message> <source>Clipboard</source> <translation type="obsolete">Clipboard</translation> </message> <message> <source>File</source> <translation type="obsolete">Datoteka</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Obriši</translation> </message> </context> <context> <name>db_key</name> <message> <location filename="../lib/db_key.cpp" line="+44"/> <source>Type</source> <translation>Vrsta</translation> </message> <message> <location line="+1"/> <source>Size</source> <translation>Dužina</translation> </message> <message> <location line="+2"/> <source>EC Group</source> <translation>EC Grupa</translation> </message> <message> <location line="+2"/> <source>Use</source> <translation>Namjena</translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Zaporka</translation> </message> <message> <location line="+54"/> <source>The key is already in the database as: '%1' and is not going to be imported</source> <translation>Ključ već postoji u bazi podataka kao: '%1' i zbog toga nije uvezen</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>Baza podataka već sadrži javni dio uvezenog ključa kao '%1 i biti će nadopunjena s novim, privatnim dijelom ključa</translation> </message> <message> <location line="+30"/> <source>Key size too small !</source> <translation>Prekratki ključ!</translation> </message> <message> <location line="+5"/> <source>You are sure to create a key of the size: %1 ?</source> <translation>Da li stvarno želite izraditi ključ dužine: %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 type="obsolete">Da li da originalni ključ '%1' treba biti zamijenjen ključem s tokena? To će obrisati ključ '%1' i zabraniti njegov izvoz </translation> </message> <message> <source>New Key</source> <translation type="obsolete">Novi ključ</translation> </message> <message> <source>Import</source> <translation type="obsolete">Uvezi</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Preimenuj</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Prikaži Detalje</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Obriši</translation> </message> <message> <source>Export</source> <translation type="obsolete">Izvoz</translation> </message> <message> <location line="+83"/> <source>Clipboard</source> <translation>Clipboard</translation> </message> <message> <source>File</source> <translation type="obsolete">Datoteka</translation> </message> <message> <source>Change password</source> <translation type="obsolete">Promjena zaporke</translation> </message> <message> <source>Reset password</source> <translation type="obsolete">Postavi početnu zaporku</translation> </message> <message> <source>Change PIN</source> <translation type="obsolete">Promijeni PIN</translation> </message> <message> <source>Init PIN with SO PIN (PUK)</source> <translation type="obsolete">Pripremi PIN pomoću SO PIN (PUK)</translation> </message> <message> <source>Change SO PIN (PUK)</source> <translation type="obsolete">Promijeni SO PIN (PUK)</translation> </message> <message> <source>Store on Security token</source> <translation type="obsolete">Spremi na Pametni token</translation> </message> <message> <location line="+13"/> <source>Export public key [%1]</source> <translation>Izvezi javni ključ [%1]</translation> </message> <message> <location line="-25"/> <location line="+35"/> <source>PEM public</source> <translation>PEM javni</translation> </message> <message> <location line="+1"/> <source>DER public</source> <translation>DER javni</translation> </message> <message> <location line="-33"/> <location line="+37"/> <source>SSH2 public</source> <translation>SSH2 javni</translation> </message> <message> <location line="-31"/> <source>Export keys to Clipboard</source> <translation>Izvezi ključeve u Clipboard</translation> </message> <message> <location line="+36"/> <source>DER private</source> <translation>DER privatni</translation> </message> <message> <location line="+2"/> <source>PEM encryped</source> <translation>PEM kriptirani</translation> </message> <message> <source>PKCS#8</source> <translation type="obsolete">PKCS#8</translation> </message> <message> <location line="-41"/> <location line="+46"/> <source>PEM private</source> <translation>PEM privatni</translation> </message> <message> <location line="+2"/> <source>PKCS#8 encrypted</source> <translation>PKCS#8 kriptirani</translation> </message> <message> <location line="+1"/> <source>Export private key [%1]</source> <translation>Izvezi privatni ključ [%1]</translation> </message> <message> <location line="+5"/> <source>Private Keys ( *.pem *.der *.pk8 );; SSH Public Keys ( *.pub )</source> <translation>Privatni ključevi ( *.pem *.der *.pk8 );; SSH javni ključevi ( *.pub )</translation> </message> <message> <location line="+56"/> <source>Tried to change password of a token</source> <translation>Pokušaj promjene zaporke tokena</translation> </message> <message> <source>Tried to change PIN of a key</source> <translation type="obsolete">Pokušaj promjene PIN ključa</translation> </message> <message> <source>Tried to init PIN of a key</source> <translation type="obsolete">Pokušaj inicijalizacije PIN ključa</translation> </message> <message> <source>Tried to change SO PIN of a key</source> <translation type="obsolete">Pokušaj inicijalizacije SO PIN ključa</translation> </message> </context> <context> <name>db_temp</name> <message> <location filename="../lib/db_temp.cpp" line="+56"/> <source>Type</source> <translation>Vrsta</translation> </message> <message> <location line="-8"/> <source>Bad template: %1</source> <translation>Loš predložak: %1</translation> </message> <message> <location line="+71"/> <source>Nothing</source> <translation>Ništa</translation> </message> <message> <location line="+5"/> <source>Preset Template values</source> <translation>Postavljanje vrijednosti Predloška</translation> </message> <message> <source>copy</source> <translation type="obsolete">kopiraj</translation> </message> <message> <location line="+45"/> <source>Save template as</source> <translation>Spremi predložak kao</translation> </message> <message> <location line="+1"/> <source>XCA templates ( *.xca);; All files ( * )</source> <translation>XCA predlošci ( *.xca );; Sve datoteke ( * )</translation> </message> <message> <source>New Template</source> <translation type="obsolete">Novi Predložak</translation> </message> <message> <source>Import</source> <translation type="obsolete">Uvezi</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Preimenuj</translation> </message> <message> <source>Export</source> <translation type="obsolete">Izvoz</translation> </message> <message> <source>Change</source> <translation type="obsolete">Promijeni</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Brisanje</translation> </message> <message> <source>Duplicate</source> <translation type="obsolete">Podvostruči</translation> </message> <message> <source>Create certificate</source> <translation type="obsolete">Izradi potvrdu</translation> </message> <message> <source>Create request</source> <translation type="obsolete">Izradi zahtjev</translation> </message> </context> <context> <name>db_x509</name> <message> <location filename="../lib/db_x509.cpp" line="+57"/> <source>CA</source> <translation>CA</translation> </message> <message> <location line="+1"/> <source>reflects the basic Constraints extension</source> <translation>odražava proširenja osnovna Ograničenja</translation> </message> <message> <location line="+1"/> <source>Serial</source> <translation>Serijski broj</translation> </message> <message> <location line="+1"/> <source>md5 fingerprint</source> <translation>md5 sažetak</translation> </message> <message> <location line="+1"/> <source>sha1 fingerprint</source> <translation>sha1 sažetak</translation> </message> <message> <location line="+1"/> <source>sha256 fingerprint</source> <translation>sha256 sažetak</translation> </message> <message> <location line="+1"/> <source>Start date</source> <translation>Početni datum</translation> </message> <message> <location line="+1"/> <source>not Before</source> <translation>Od</translation> </message> <message> <location line="+1"/> <source>Expiry date</source> <translation>Datum isteka valjanosti</translation> </message> <message> <location line="+1"/> <source>not After</source> <translation>Do</translation> </message> <message> <location line="+1"/> <source>Trust state</source> <translation>Stupanj pouzdanosti</translation> </message> <message> <location line="+1"/> <source>Revocation</source> <translation>Opoziv</translation> </message> <message> <location line="+1"/> <source>CRL Expiration</source> <translation>Rok trajanja CRL</translation> </message> <message> <location line="+103"/> <source>Plain View</source> <translation>Običan pregled</translation> </message> <message> <location line="+2"/> <source>Tree View</source> <translation>Stablast pregled</translation> </message> <message> <location line="+178"/> <source>The certificate already exists in the database as: '%1' and so it was not imported</source> <translation>Potvrda već postoji u bazi podataka kao: '%1' i zbog toga nije uvezena</translation> </message> <message> <location line="+133"/> <source>Invalid public key</source> <translation>Neispravan javni ključ</translation> </message> <message> <location line="+18"/> <source>Please enter the new hexadecimal secret number for the QA process.</source> <translatorcomment>!!! Bolji rješenje za QA proces?</translatorcomment> <translation>Unesite novi heksadecimalni tajni broj za QA proces.</translation> </message> <message> <location line="+2"/> <source>The QA process has been terminated by the user.</source> <translation>QA proces je prekinut od strane korisnika.</translation> </message> <message> <location line="+17"/> <source>The key you selected for signing is not a private one.</source> <translation>Ključ kojeg ste odabrali za potpisivanje nije privatni ključ.</translation> </message> <message> <location line="+49"/> <source>Store the certificate to the key on the token '%1 (#%2)' ?</source> <translation>Spremiti potvrdu k ključu na token '%1 (#%2)' ?</translation> </message> <message> <source>New Certificate</source> <translation type="obsolete">Nova Potvrda</translation> </message> <message> <source>Import</source> <translation type="obsolete">Uvezi</translation> </message> <message> <source>Import PKCS#12</source> <translation type="obsolete">Uvezi PKCS#12</translation> </message> <message> <source>Import from PKCS#7</source> <translation type="obsolete">Uvezi PKCS#7</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Preimenuj</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Prikaži Detalje</translation> </message> <message> <location line="+73"/> <source>PEM chain</source> <translation>PEM lanac</translation> </message> <message> <location line="+2"/> <source>PKCS #7 chain</source> <translation>PKCS #7 lanac</translation> </message> <message> <location line="+6"/> <source>PKCS #12 chain</source> <translation>PKCS #12 lanac</translation> </message> <message> <location line="+9"/> <source>PEM + key</source> <translation>PEM + ključ</translation> </message> <message> <location line="+6"/> <source>PKCS #7 trusted</source> <translation>PKCS #7 pouzdan</translation> </message> <message> <location line="+2"/> <source>PKCS #7 all</source> <translation>PKCS #7 sve</translation> </message> <message> <location line="+2"/> <source>PEM trusted</source> <translation>PEM pouzdan</translation> </message> <message> <location line="+2"/> <source>PEM all</source> <translation>PEM sve</translation> </message> <message> <source>Extract public Key</source> <translation type="obsolete">Izdvoji javni ključ</translation> </message> <message> <source>Export</source> <translation type="obsolete">Izvoz</translation> </message> <message> <source>Clipboard</source> <translation type="obsolete">Clipboard</translation> </message> <message> <source>File</source> <translation type="obsolete">Datoteka</translation> </message> <message> <source>Request</source> <translation type="obsolete">Zahtjev</translation> </message> <message> <source>Security token</source> <translation type="obsolete">Pametni token</translation> </message> <message> <source>Other token</source> <translation type="obsolete">Drugi token</translation> </message> <message> <source>Template</source> <translation type="obsolete">Predložak</translation> </message> <message> <source>OpenSSL config</source> <translation type="obsolete">OpenSSL konfiguracija</translation> </message> <message> <source>Transform</source> <translation type="obsolete">Preobrazi</translation> </message> <message> <source>Public Key</source> <translation type="obsolete">Javni ključ</translation> </message> <message> <source>Similar Certificate</source> <translation type="obsolete">Slična potvrda</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Brisanje</translation> </message> <message> <source>Delete from Security token</source> <translation type="obsolete">Obriši s pametnog tokena</translation> </message> <message> <source>Trust</source> <translation type="obsolete">Povjerenje</translation> </message> <message> <source>Properties</source> <translation type="obsolete">Osobine</translation> </message> <message> <source>Generate CRL</source> <translation type="obsolete">Izradi CRL</translation> </message> <message> <source>PKCS#7</source> <translation type="obsolete">PKCS#7</translation> </message> <message> <source>Sign</source> <translation type="obsolete">Potpiši</translation> </message> <message> <source>Encrypt</source> <translation type="obsolete">Kriptiraj</translation> </message> <message> <source>Renewal</source> <translation type="obsolete">Obnovi</translation> </message> <message> <source>Unrevoke</source> <translation type="obsolete">Nemoj opozvat</translation> </message> <message> <source>Revoke</source> <translation type="obsolete">Opozovi</translation> </message> <message> <location line="+3"/> <source>Certificate export</source> <translation>Izvoz potvrde</translation> </message> <message> <location line="+1"/> <source>X509 Certificates ( *.pem *.cer *.crt *.p12 *.p7b )</source> <translation>X509 potvrde ( *.pem *.cer *.crt *.p12 *.p7b )</translation> </message> <message> <location line="+57"/> <location line="+34"/> <source>There was no key found for the Certificate: '%1'</source> <translation>Nije pronađen ključ za Potvrdu: '%1'</translation> </message> <message> <location line="-29"/> <source>Not possible for a token key: '%1'</source> <translation>Nije moguće za ključ s tokena: '%1'</translation> </message> <message> <location line="+33"/> <source>Not possible for the token-key Certificate '%1'</source> <translation>Nije moguće za potvrdu s ključem na tokenu '%1'</translation> </message> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Nije pronađen ključ za Potvrdu:</translation> </message> <message> <location line="+330"/> <source> days</source> <translation>ana</translation> </message> </context> <context> <name>db_x509name</name> <message> <location filename="../lib/db_x509super.cpp" line="+23"/> <source>Subject</source> <translation>Subjekt</translation> </message> <message> <location line="+1"/> <source>Complete distinguished name</source> <translation>Potpuno jedinstveno ime (DN)</translation> </message> <message> <location line="+1"/> <source>Subject hash</source> <translation>Sažetak subjekta</translation> </message> <message> <location line="+1"/> <source>Hash to lookup certs in directories</source> <translation>Sažmi za pregledavanje potvrda u katalogu</translation> </message> <message> <source>Country code</source> <translation type="obsolete">Kod države</translation> </message> <message> <source>State or Province</source> <translation type="obsolete">Država ili Pokrajina</translation> </message> <message> <source>Locality</source> <translation type="obsolete">Mjesto</translation> </message> <message> <source>Organisation</source> <translation type="obsolete">Organizacija</translation> </message> <message> <source>Organisational unit</source> <translation type="obsolete">Organizacijska jedinica</translation> </message> <message> <source>Common name</source> <translation type="obsolete">Uobičajeno ime</translation> </message> <message> <source>E-Mail address</source> <translation type="obsolete">E-mail adresa</translation> </message> <message> <source>Serial number</source> <translation type="obsolete">Serijski broj</translation> </message> <message> <source>Given name</source> <translation type="obsolete">Ime</translation> </message> <message> <source>Surname</source> <translation type="obsolete">Prezime</translation> </message> <message> <source>Title</source> <translation type="obsolete">Titula</translation> </message> <message> <source>Initials</source> <translation type="obsolete">Inicijali</translation> </message> <message> <source>Description</source> <translation type="obsolete">Opis</translation> </message> <message> <source>Role</source> <translatorcomment>Uloga</translatorcomment> <translation type="obsolete">Funkcija</translation> </message> <message> <source>Pseudonym</source> <translation type="obsolete">Pseudonim</translation> </message> <message> <source>Generation Qualifier</source> <translatorcomment>OID: 2.5.4.44</translatorcomment> <translation type="obsolete">Oznaka Generacije</translation> </message> <message> <source>x500 Unique Identifier</source> <translation type="obsolete">x500 Jedinstveni Identifikator</translation> </message> <message> <source>Name</source> <translation type="obsolete">Ime</translation> </message> <message> <source>DN Qualifier</source> <translation type="obsolete">DN Oznaka </translation> </message> <message> <source>Unstructured name</source> <translation type="obsolete">Nestrukturirano ime</translation> </message> <message> <source>Challenge password</source> <translation type="obsolete">Zaporka za izazov</translation> </message> <message> <source>Basic Constraints</source> <translation type="obsolete">Osnovna Ograničenja</translation> </message> <message> <source>subject alternative name</source> <translation type="obsolete">alternativno ime subjekta</translation> </message> <message> <source>issuer alternative name</source> <translation type="obsolete">alternativno ime izdavača</translation> </message> <message> <source>Subject key identifier</source> <translation type="obsolete">Oznaka ključa Subjekta</translation> </message> <message> <source>Authority key identifier</source> <translation type="obsolete">Oznaka ključa Autoriteta</translation> </message> <message> <source>Key usage</source> <translation type="obsolete">Namjena ključa</translation> </message> <message> <source>Extended key usage</source> <translation type="obsolete">Proširena upotreba ključa</translation> </message> <message> <source>CRL distribution points</source> <translation type="obsolete">Točka objave popisa opozvanih potvrda</translation> </message> <message> <source>Authority information access</source> <translation type="obsolete">Dohvat informacija Autoriteta</translation> </message> <message> <source>Certificate type</source> <translation type="obsolete">Vrsta Potvrde</translation> </message> <message> <source>Base URL</source> <translation type="obsolete">Osnovni URL</translation> </message> <message> <source>Revocation URL</source> <translation type="obsolete">URL opoziva</translation> </message> <message> <source>CA Revocation URL</source> <translation type="obsolete">URL opoziva CA</translation> </message> <message> <source>Certificate renewal URL</source> <translation type="obsolete">URL za obnovu potvrde</translation> </message> <message> <source>CA policy URL</source> <translation type="obsolete">URL politike CA</translation> </message> <message> <source>SSL server name</source> <translation type="obsolete">SSL ime poslužitelja</translation> </message> <message> <source>Comment</source> <translation type="obsolete">Napomena</translation> </message> </context> <context> <name>db_x509req</name> <message> <location filename="../lib/db_x509req.cpp" line="+30"/> <source>Signed</source> <translation>Potpisan</translation> </message> <message> <location line="+1"/> <source>whether the request is already signed or not</source> <translation>da li je zahtjev već potpisan ili ne</translation> </message> <message> <location line="+1"/> <source>Unstructured name</source> <translation>Nestrukturirano ime</translation> </message> <message> <location line="+2"/> <source>Challenge password</source> <translation>Zaporka za izazov</translation> </message> <message> <location line="+16"/> <source>The certificate signing request already exists in the database as '%1' and thus was not stored</source> <translation>Zahtjev za izdavanje potvrde već postoji u bazi podataka kao '%1' i zbog toga nije spreman</translation> </message> <message> <source>Certificate request ( *.pem *.der *.crl )</source> <translation type="obsolete">Zahtjev za izdavanje potvrde ( *.pem *.der *.crl )</translation> </message> <message> <location line="+105"/> <source>Certificate request export</source> <translation>Izvoz zahtjeva za izdavanje potvrde</translation> </message> <message> <source>New Request</source> <translation type="obsolete">Novi Zahtjev</translation> </message> <message> <source>Import</source> <translation type="obsolete">Uvezi</translation> </message> <message> <source>Extract public Key</source> <translation type="obsolete">Izdvoji javni ključ</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Preimenuj</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Prikaži Detalje</translation> </message> <message> <source>Sign</source> <translation type="obsolete">Potpiši</translation> </message> <message> <source>Export</source> <translation type="obsolete">Izvoz</translation> </message> <message> <source>Clipboard</source> <translation type="obsolete">Clipboard</translation> </message> <message> <source>File</source> <translation type="obsolete">Datoteka</translation> </message> <message> <source>Transform</source> <translation type="obsolete">Preobrazi</translation> </message> <message> <source>Template</source> <translation type="obsolete">Predložak</translation> </message> <message> <source>OpenSSL config</source> <translation type="obsolete">OpenSSL konfiguracija</translation> </message> <message> <location line="+1"/> <source>Certificate request ( *.pem *.der *.csr )</source> <translation>Zahtjev za izdavanje potvrde ( *.pem *.der *.csr )</translation> </message> <message> <source>Public Key</source> <translation type="obsolete">Javni ključ</translation> </message> <message> <source>Similar Request</source> <translation type="obsolete">Sličan zahtjev</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Brisanje</translation> </message> </context> <context> <name>db_x509super</name> <message> <location filename="../lib/db_x509super.cpp" line="+35"/> <source>Key name</source> <translation>Ime ključa</translation> </message> <message> <location line="+1"/> <source>Internal name of the key</source> <translation>Interno ime ključa</translation> </message> <message> <location line="+1"/> <source>Signature Algorithm</source> <translation>Algoritam potpisa</translation> </message> <message> <location line="+77"/> <source>Save as OpenSSL config</source> <translation>Spremi kao OpenSSL konfiguraciju</translation> </message> <message> <location line="+1"/> <source>Config files ( *.conf *.cnf);; All files ( * )</source> <translation>Konfiguracijske datoteke ( *.conf *.cnf);; Sve datoteke ( * )</translation> </message> <message> <location line="+25"/> <source>The following extensions were not ported into the template</source> <translation>Sljedeća proširenja neće biti uključena u predložak</translation> </message> </context> <context> <name>kvView</name> <message> <location filename="../widgets/kvView.cpp" line="+164"/> <source>Type</source> <translation>Vrsta</translation> </message> <message> <location line="+0"/> <source>Content</source> <translation>Sadržaj</translation> </message> </context> <context> <name>pass_info</name> <message> <location filename="../lib/pass_info.cpp" line="+21"/> <source>Password</source> <translation>Zaporka</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>Greška u otvaranju datoteke: '%1': %2</translation> </message> <message> <location line="+8"/> <source>Error writing to file: '%1': %2</source> <translation>Greška u pisanju u datoteku: '%1': %2</translation> </message> <message> <location line="+9"/> <source>Error: </source> <translation>Greška:</translation> </message> <message> <location filename="../lib/pki_base.h" line="+68"/> <source>Internal error: Unexpected message: %1 %2</source> <translation>Interna greška: Neočekivana poruka: %1 %2</translation> </message> </context> <context> <name>pki_crl</name> <message> <location filename="../lib/pki_crl.cpp" line="+46"/> <source>Successfully imported the revocation list '%1'</source> <translation>Uspješno uvezen popis opozvanih potvrda '%1'</translation> </message> <message> <location line="+1"/> <source>Delete the revocation list '%1'?</source> <translation>Obrisati listu opozvanih potvrda '%1'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the revocation list '%1'</source> <translation>Uspješno izrađen popis opozvanih potvrda '%1'</translation> </message> <message> <location line="+2"/> <source>Delete the %1 revocation lists: %2?</source> <translation>Obriši %1 popis opozvanih potvrda '%2'?</translation> </message> <message> <location line="+20"/> <source>Unable to load the revocation list in file %1. Tried PEM and DER formatted CRL.</source> <translation>Nije moguće učitati popis opozvanih potvrda %1. Proban je PEM i DER format CRL.</translation> </message> <message> <location line="+22"/> <source>No issuer given</source> <translation>Nije dan izdavač</translation> </message> <message> <location line="+54"/> <location line="+217"/> <source>Wrong Size %1</source> <translation>Pogrešna Dužina %1</translation> </message> <message> <location line="-27"/> <source>unknown</source> <translation>nepoznato</translation> </message> </context> <context> <name>pki_evp</name> <message> <location filename="../lib/pki_evp.cpp" line="+177"/> <source>Failed to decrypt the key (bad password) </source> <translation>Neuspješno dekriptiran ključ (pogrešna zaporka) </translation> </message> <message> <location line="+10"/> <source>Please enter the password to decrypt the private key.</source> <translation>Unesite zaporku za dekripciju privatnog ključa.</translation> </message> <message> <location line="+53"/> <source>Please enter the password to decrypt the private key from file: %1</source> <translation>Unesite zaporku za dekripciju privatnog ključa iz datoteke: %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 type="obsolete">Nije moguće učitati privatni ključ u datoteci %1. Probani su PEM i DER privatni, javni i PKCS#8 tip ključeva.</translation> </message> <message> <location line="+62"/> <source>Unable to load the private key in file %1. Tried PEM and DER private, public, PKCS#8 key types and SSH2 format.</source> <translation>Nije moguće učitati privatni ključ u datoteci %1. Probani su PEM i DER privatni, javni, PKCS#8 tip ključeva i SSH2 format.</translation> </message> <message> <location line="+35"/> <source>Ignoring unsupported private key</source> <translation>Ignoriram nepodržani privatni ključ</translation> </message> <message> <location line="+32"/> <source>Please enter the password to decrypt the private key: '%1'</source> <translation>Unesite zaporku za dekripciju privatnog ključa: '%1'</translation> </message> <message> <location line="+3"/> <location line="+11"/> <source>Password input aborted</source> <translation>Prekinut unos zaporke</translation> </message> <message> <location line="-3"/> <source>Please enter the database password for decrypting the key '%1'</source> <translation>Unesite zaporku baze podataka za dekripciju ključa '%1'</translation> </message> <message> <location line="+85"/> <source>Please enter the password to protect the private key: '%1'</source> <translation>Unesite zaporku za zaštitu privatnog ključa: '%1'</translation> </message> <message> <location line="+15"/> <source>Please enter the database password for encrypting the key</source> <translation>Unesite zaporku baze podataka za kripciju ključa</translation> </message> <message> <location line="+83"/> <source>Please enter the password protecting the PKCS#8 key '%1'</source> <translation>Unesite zaporku za zaštitu PKCS#8 ključa '%1'</translation> </message> <message> <location line="+35"/> <source>Please enter the export password for the private key '%1'</source> <translation>Unesite zaporku za izvoz privatnog ključa '%1'</translation> </message> </context> <context> <name>pki_key</name> <message> <source>Do you really want to export the private key unencrypted to the clipboard ?</source> <translation type="obsolete">Da li stvarno želite izvesti u clipboard nekriptirani privatni ključ?</translation> </message> <message> <source>Only export the public key</source> <translation type="obsolete">Izvezi samo javni ključ</translation> </message> <message> <source>Export the private key unencrypted</source> <translation type="obsolete">Izvezi nekriptirani privatni ključ</translation> </message> <message> <location filename="../lib/pki_key.cpp" line="+142"/> <source>Successfully imported the %1 public key '%2'</source> <translation>Uspješno uvezen %1 javni ključ '%2'</translation> </message> <message> <location line="+1"/> <source>Delete the %1 public key '%2'?</source> <translation>Obrisati %1 javni ključ '%2'?</translation> </message> <message> <location line="+5"/> <source>Successfully imported the %1 private key '%2'</source> <translation>Uspješno uvezen %1 privatni ključ '%2'</translation> </message> <message> <location line="+1"/> <source>Delete the %1 private key '%2'?</source> <translation>Obrisati %1 privatni ključ '%2'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the %1 private key '%2'</source> <translation>Uspješno izrađen %1 privatni ključ '%2'</translation> </message> <message> <location line="+6"/> <source>Delete the %1 keys: %2?</source> <translation>Obrisati %1 ključ '%2'?</translation> </message> <message> <location line="+9"/> <source>public key</source> <translation>javni ključ</translation> </message> <message> <location line="+188"/> <source>Common</source> <translation>Opće</translation> </message> <message> <location line="+0"/> <source>Private</source> <translation>Privatno</translation> </message> <message> <location line="+0"/> <source>Bogus</source> <translation>Lažno</translation> </message> <message> <location line="+0"/> <source>PIN</source> <translation>PIN</translation> </message> <message> <location line="+10"/> <source>No password</source> <translation>Bez zaporke</translation> </message> <message> <location line="+22"/> <location line="+5"/> <location line="+3"/> <source>Invalid SSH2 public key</source> <translation>Neispravan SSH2 javni ključ</translation> </message> <message> <location line="+113"/> <source>Failed writing to %1</source> <translation>Nije moguće pisati u %1 </translation> </message> </context> <context> <name>pki_multi</name> <message> <location filename="../lib/pki_multi.cpp" line="+129"/> <location line="+5"/> <location line="+5"/> <source>Seek failed</source> <translation>Neuspješno traženje</translation> </message> </context> <context> <name>pki_pkcs12</name> <message> <location filename="../lib/pki_pkcs12.cpp" line="+38"/> <source>Please enter the password to decrypt the PKCS#12 file: %1</source> <translation>Unesite zaporku za dekripciju PKCS#12 datoteke: %1</translation> </message> <message> <location line="+8"/> <source>Unable to load the PKCS#12 (pfx) file %1.</source> <translation>Nije moguće učitati PKCS#12 (pfx) datoteku %1.</translation> </message> <message> <location line="+14"/> <source>The supplied password was wrong (%1)</source> <translation>Unesena zaporka je neispravna (%1)</translation> </message> <message> <location line="+52"/> <source>Please enter the password to encrypt the PKCS#12 file</source> <translation>Unesite zaporku za kripciju PKCS#12 datoteke</translation> </message> <message> <location line="+2"/> <source>No key or no Cert and no pkcs12</source> <translation>Nema ključa ili nema Potvrde i nema PKSCS#12</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>Nije moguće učitati PKCS#7 datoteku %1. Proban je PEM i DER format.</translation> </message> </context> <context> <name>pki_scard</name> <message> <location filename="../lib/pki_scard.cpp" line="+59"/> <source>Successfully imported the token key '%1'</source> <translatorcomment>!!! Da li je ključ s tokena ili ključ za token???</translatorcomment> <translation>Uspješno uvezen ključ za token '%1'</translation> </message> <message> <location line="+1"/> <source>Delete the token key '%1'?</source> <translation>Obrisati ključ za token '%1'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the token key '%1'</source> <translation>Uspješno izrađen ključ za token '%1'</translation> </message> <message> <location line="+2"/> <source>Delete the %1 keys: %2?</source> <translation>Obrisati %1 ključ '%2'?</translation> </message> <message> <location line="+226"/> <source>Delete the private key '%1' from the token '%2 (#%3)' ?</source> <translation>Obrisati privatni ključ '%1' s tokena '%2 (#%3)' ?</translation> </message> <message> <location line="+65"/> <source>This Key is already on the token</source> <translation>Ovaj ključ se već nalazi na tokenu</translation> </message> <message> <source>Only RSA and EC keys can be stored on tokens</source> <translation type="obsolete">Samo RSA i EC ključevi mogu biti spremljeni na tokenu</translation> </message> <message> <location line="+75"/> <source>PIN input aborted</source> <translation>Prekinut unos PIN-a</translation> </message> <message> <location line="+12"/> <source>Unable to find copied key on the token</source> <translation>Nije moguće naći kopirani ključ na tokenu</translation> </message> <message> <location line="+103"/> <source>Please insert card: %1 %2 [%3] with Serial: %4</source> <translation>Umetnite karticu: %1 %2 [%3] s sa serijskim brojem: %4</translation> </message> <message> <location line="+28"/> <source>Public Key missmatch. Please re-import card</source> <translation>Neodgovarajući javni ključ. Molimo ponovo umetnite karticu</translation> </message> <message> <location line="+57"/> <source>Illegal Key generation method</source> <translation>Nedozvoljeni način generiranja Ključa</translation> </message> <message> <location line="+16"/> <source>Unable to find generated key on card</source> <translation>Nemoguće je pronaći ključ generiran na kartici</translation> </message> <message> <location line="+51"/> <source>Ignoring unsupported token key</source> <translation>Ignoriram nepodržani ključ za token</translation> </message> <message> <location line="+4"/> <source>Wrong Size %1</source> <translation>Pogrešna Dužina %1</translation> </message> <message> <location line="+11"/> <source>Token %1</source> <translation>Token %1</translation> </message> <message> <location line="+9"/> <location line="+13"/> <source>Failed to find the key on the token</source> <translation>Nije moguće naći ključ na tokenu </translation> </message> <message> <location line="-6"/> <source>Invalid Pin for the token</source> <translation>Pogrešan PIN za token</translation> </message> <message> <location line="+12"/> <source>Failed to initialize the key on the token</source> <translation>Nije moguće inicijalizirati ključ na tokenu</translation> </message> </context> <context> <name>pki_temp</name> <message> <location filename="../lib/pki_temp.cpp" line="+99"/> <source>Successfully imported the XCA template '%1'</source> <translation>Uspješno uvezen XCA predložak '%1'</translation> </message> <message> <location line="+1"/> <source>Delete the XCA template '%1'?</source> <translation>Obrisati XCA predložak '%1'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the XCA template '%1'</source> <translation>Uspješno izrađen XCA predložak '%1'</translation> </message> <message> <location line="+2"/> <source>Delete the %1 XCA templates: %2?</source> <translation>Obrisati %1 XCA predložak '%2'?</translation> </message> <message> <location line="+189"/> <location line="+280"/> <source>Wrong Size %1</source> <translation>Kriva Dužina %1</translation> </message> <message> <location line="-194"/> <source>Template file content error (too small)</source> <translation>Greška u sadržaju datoteke predloška (prekratka)</translation> </message> <message> <location line="+11"/> <source>Template file content error (bad size)</source> <translation>Greška u sadržaju datoteke predloška (pogrešna dužina)</translation> </message> <message> <location line="+46"/> <source>Template file content error (too small): %1</source> <translation>Greška u sadržaju datoteke predloška (prekratka): %1</translation> </message> <message> <location line="+33"/> <source>Not a PEM encoded XCA Template</source> <translation>To nije PEM kodirani XCA Predložak</translation> </message> <message> <location line="+7"/> <source>Not an XCA Template, but '%1'</source> <translation>To nije XCA Predložak, već '%1'</translation> </message> <message> <source>Template file content error (bad size): %1 </source> <translation type="obsolete">Greška u sadržaju datoteke predloška (pogrešna dužina): %1</translation> </message> <message> <source>Template file content error (bad length) :%1</source> <translation type="obsolete">Greška u sadržaju datoteke predloška (pogrešna veličina): %1</translation> </message> </context> <context> <name>pki_x509</name> <message> <location filename="../lib/pki_x509.cpp" line="+71"/> <source>Successfully imported the certificate '%1'</source> <translation>Uspješno uvezena potvrda '%1'</translation> </message> <message> <location line="+1"/> <source>Delete the certificate '%1'?</source> <translation>Obrisati potvrdu '%1'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the certificate '%1'</source> <translation>Uspješno izrađena potvrda '%1'</translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificates: %2?</source> <translation>Obrisati %1 potvrdu: '%2'?</translation> </message> <message> <location line="+37"/> <source>Unable to load the certificate in file %1. Tried PEM and DER certificate.</source> <translation>Nije moguće učitati potvrdu u datoteci %1. Proban je PEM i DER format.</translation> </message> <message> <location line="+170"/> <source>This certificate is already on the security token</source> <translation>Ova potvrda se već nalazi na pametnom tokenu</translation> </message> <message> <location line="+62"/> <source>Delete the certificate '%1' from the token '%2 (#%3)'?</source> <translation>Obrisati potvrdu %1 s tokena '%2 (#%3)'?</translation> </message> <message> <location line="+129"/> <source>There is no key for signing !</source> <translation>Nema ključa za potpisivanje !</translation> </message> <message> <location line="+58"/> <location line="+533"/> <source>Wrong Size %1</source> <translation>Pogrešna Dužina %1</translation> </message> <message> <location line="-203"/> <source>Not trusted</source> <translation>Nepouzdan</translation> </message> <message> <location line="+0"/> <source>Trust inherited</source> <translation>Povjerenje naslijeđeno</translation> </message> <message> <location line="+0"/> <source>Always Trusted</source> <translation>Uvijek vjeruj</translation> </message> <message> <source>CRL expires: %1</source> <translation type="obsolete">Popis opozvanih potvrda ističe: %1</translation> </message> <message> <location line="+32"/> <source>No</source> <translation>Ne</translation> </message> <message> <location line="+2"/> <source>Yes</source> <translation>Da</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>Neispravan ključ za potpisivanje (javni ključ)</translation> </message> <message> <location line="+42"/> <source>Successfully imported the %1 certificate request '%2'</source> <translation>Uspješno uvezen %1 zahtjev za izdavanje potvrde '%2'</translation> </message> <message> <location line="+1"/> <source>Delete the %1 certificate request '%2'?</source> <translation>Obriši %1 zahtjev a izdavanje potvrde '%2'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the %1 certificate request '%2'</source> <translation>Uspješno izrađen %1 zahtjev za izdavanje potvrde '%2'</translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificate requests: %2?</source> <translation>Obriši %1 zahtjev za izdavanje potvrde %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>Nije moguće učitati zahtjev za izdavanje potvrde u datoteci %1. Proban je PEM, DER SPKAC format.</translation> </message> <message> <location line="+281"/> <source>Signed</source> <translation>Potpisan</translation> </message> <message> <location line="+0"/> <source>Unhandled</source> <translation>Neobrađen</translation> </message> <message> <location line="+54"/> <source>Wrong Size %1</source> <translation>Kriva dužina %1</translation> </message> </context> <context> <name>v3ext</name> <message> <location filename="../ui/v3ext.ui" line="+51"/> <source>Add</source> <translation>Dodaj</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Obriši</translation> </message> <message> <location line="+32"/> <source>Apply</source> <translation>Primjeni</translation> </message> <message> <location line="+7"/> <source>Validate</source> <translation>Potvrdi</translation> </message> <message> <location line="+29"/> <source>Cancel</source> <translation>Odustani</translation> </message> <message> <location filename="../widgets/v3ext.cpp" line="+93"/> <source>An email address or 'copy'</source> <translation>Email adresa ili 'copy'</translation> </message> <message> <location line="+2"/> <source>An email address</source> <translation>Email adresa</translation> </message> <message> <location line="+2"/> <source>a registered ID: OBJECT IDENTIFIER</source> <translation>registriran ID: OBJECT IDENTIFIER</translation> </message> <message> <location line="+4"/> <source>a uniform resource indicator</source> <translation>jedinstveni identifikator resursa</translation> </message> <message> <location line="+4"/> <source>a DNS domain name</source> <translation>DNS domensko ime</translation> </message> <message> <location line="+2"/> <source>an IP address</source> <translation>IP adresa</translation> </message> <message> <location line="+4"/> <source>Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'</source> <translation>Sintaksa: <OID>;TIP:tekst poput '1.2.3.4:UTF8:name'</translation> </message> <message> <location line="+4"/> <source>No editing. Only 'copy' allowed here</source> <translation>Nema uređivanja. Samo kopiranje je ovdje dozvoljeno</translation> </message> <message> <location line="+67"/> <source>Validation failed: '%1' %2</source> <translation>Neuspješna provjera: '%1' %2</translation> </message> <message> <location line="+5"/> <source>Validation successful: '%1'</source> <translation>Provjera uspješna: '%1'</translation> </message> </context> <context> <name>void</name> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Nije pronađen ključ za Potvrdu:</translation> </message> <message> <source>Import Certificate signing request</source> <translation type="obsolete">Uvezi zahtjev za izdavanje Potvrde (CSR)</translation> </message> </context> </TS> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lang/xca_ru.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000507461�12606205164�0015061�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="+20"/> <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="+19"/> <source>Details of the certificate signing request</source> <translation type="unfinished">Подробная информация о пакете запроса на подпись сертификата</translation> </message> <message> <location filename="../ui/CertDetail.ui" line="+36"/> <source>Details of the Certificate</source> <translation>Подробная информация о сертификате</translation> </message> <message> <location line="+48"/> <source>S&tatus</source> <translation>С&татус</translation> </message> <message> <location line="+54"/> <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="+20"/> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <location line="-14"/> <source>MD5</source> <translation>MD5</translation> </message> <message> <location line="+21"/> <source>A SHA-1 hashsum of the certificate</source> <translation>SHA-1 хэшсумма сертификата</translation> </message> <message> <location line="-14"/> <source>An md5 hashsum of the certificate</source> <translation>MD5 хэшсумма сертификата</translation> </message> <message> <location line="+21"/> <source>SHA256</source> <translation type="unfinished">SHA256</translation> </message> <message> <location line="+7"/> <source>A SHA-256 hashsum of the certificate</source> <translation>SHA-256 хэшсумма сертификата</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="-124"/> <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="+26"/> <source>Validity</source> <translation>Действителен</translation> </message> <message> <location line="+11"/> <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="+14"/> <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="+26"/> <source>Revoke old certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="-186"/> <source>Certificate renewal</source> <translation>Сертификат обновлен</translation> </message> <message> <location line="+120"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location line="+26"/> <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="+2"/> <location line="+22"/> <source>Edit times</source> <translation>Изменить время</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Abort rollout</source> <translation>Прервать</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Continue rollout</source> <translation>Продолжить</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Adjust date and continue</source> <translation type="unfinished">Скорректировать дату и продолжить</translation> </message> <message> <location line="-5"/> <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>CertTreeView</name> <message> <location filename="../widgets/CertTreeView.cpp" line="+25"/> <source>Import PKCS#12</source> <translation type="unfinished">Ипорт PKCS#12</translation> </message> <message> <location line="+1"/> <source>Import from PKCS#7</source> <translation type="unfinished">Импорт из PKCS#7</translation> </message> <message> <location line="+28"/> <source>Request</source> <translation type="unfinished">Запрос</translation> </message> <message> <location line="+2"/> <source>Security token</source> <translation type="unfinished">Токен</translation> </message> <message> <location line="+2"/> <source>Other token</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Similar Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Delete from Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>CA</source> <translation type="unfinished">ЦС</translation> </message> <message> <location line="+1"/> <source>Properties</source> <translation type="unfinished">Свойства</translation> </message> <message> <location line="+1"/> <source>Generate CRL</source> <translation type="unfinished">Создать CRL</translation> </message> <message> <location line="+1"/> <source>Manage revocations</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Trust</source> <translation type="unfinished">Доверие</translation> </message> <message> <location line="+4"/> <source>Renewal</source> <translation type="unfinished">Обновить</translation> </message> <message> <location line="+2"/> <source>Revoke</source> <translation type="unfinished">Отозвать</translation> </message> <message> <location line="+2"/> <source>Unrevoke</source> <translation type="unfinished">Вернуть</translation> </message> </context> <context> <name>CertView</name> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Не найден ключ для сетификата: </translation> </message> <message> <source>Import Certificate signing request</source> <translation type="obsolete">Импорт запроса на подпись сертификата</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="+159"/> <source>Name</source> <translation>Имя</translation> </message> <message> <source>Serial</source> <translation type="obsolete">Серийный номер</translation> </message> <message> <source>Revocation</source> <translation type="obsolete">Аннулирован</translation> </message> <message> <location filename="../widgets/CrlDetail.cpp" line="+45"/> <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> <source>Unknown certificate</source> <translation type="obsolete">Неизвестный сертификат</translation> </message> <message> <location filename="../ui/CrlDetail.ui" line="-129"/> <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="+48"/> <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="+9"/> <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="+13"/> <source>&Extensions</source> <translation type="unfinished">&Расширения</translation> </message> <message> <location line="+20"/> <source>&Revocation list</source> <translation type="unfinished">&Аннулированные списки</translation> </message> <message> <source>0</source> <translation type="obsolete">0</translation> </message> </context> <context> <name>ExportCert</name> <message> <source>Please enter the filename for the certificate.</source> <translation type="obsolete">Введите имя файла для сертификата.</translation> </message> </context> <context> <name>ExportDer</name> <message> <source>All files ( * )</source> <translation type="obsolete">Все файлы ( * )</translation> </message> </context> <context> <name>ExportDialog</name> <message> <location filename="../ui/ExportDialog.ui" line="+92"/> <source>Name</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>The internal name of the CRL in the database</source> <translation type="unfinished">Внутреннее имя CRL в базе данных</translation> </message> <message> <location line="+43"/> <source>...</source> <translation type="unfinished">...</translation> </message> <message> <location line="+13"/> <source>Filename</source> <translation type="unfinished">Имя файла</translation> </message> <message> <location line="+40"/> <source>Export Format</source> <translation type="unfinished">Формат экспорта</translation> </message> <message> <location filename="../widgets/ExportDialog.cpp" line="+37"/> <source>All files ( * )</source> <translation type="unfinished">Все файлы ( * )</translation> </message> <message> <location line="+15"/> <source>PEM Text format with headers</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Concatenated list of all selected items in one PEM text file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Concatenated text format of the complete certificate chain in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all trusted certificates in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all certificates in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Binary DER encoded file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PKCS#7 encoded single certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS#7 encoded complete certificate chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All trusted certificates encoded in one PKCS#7 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All selected certificates encoded in one PKCS#7 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All certificates encoded in one PKCS#7 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>The certificate and the private key as encrypted PKCS#12 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>The complete certificate chain and the private key as encrypted PKCS#12 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the unencrypted private key in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the encrypted private key in PKCS#8 format in one file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Text format of the public key in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Binary DER format of the public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>OpenSSL specific encrypted private key in text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in binary DER format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in PKCS#8 text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Encrypted private key in PKCS#8 text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>The public key encoded in SSH2 format</source> <translation type="unfinished"></translation> </message> <message> <location line="+39"/> <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> <source>Please enter the filename for the key.</source> <translation type="obsolete">Пожалуйста, введите имя файла для ключа.</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="obsolete">DER - это двоичный формат без шифрования PEM - это base64 формат с обязательным шифрованием PKCS#8 - это официальный формат обмена ключами с возможностью шифрования</translation> </message> <message> <source>When exporting the private key it should be encrypted.</source> <translation type="obsolete">При экспорте закрытый ключ должен быть зашифрован.</translation> </message> <message> <source>When exporting the private part, it should be encrypted.</source> <translation type="obsolete">При экспорте закрытые части должны быть зашифрованы.</translation> </message> <message> <source>E&xport the private part of the Key too</source> <translation type="obsolete">&Экспорт закрытых частей вместе с ключем</translation> </message> <message> <source>Export as PKCS#8</source> <translation type="obsolete">Экспорт в PKCS#8</translation> </message> <message> <source>&Encrypt the Key with a password</source> <translation type="obsolete">&Шифрование ключа с помощью пароля</translation> </message> <message> <source>Private keys ( *.pem *.der *.pk8 );;All files ( * )</source> <translation type="obsolete">Закрытые ключи ( *.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="+104"/> <location line="+144"/> <source>The type of the Item '%1' is not recognized</source> <translation type="unfinished"></translation> </message> <message> <location line="+48"/> <source>Details of the item '%1' cannot be shown</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>The type of the item '%1' is not recognized</source> <translation type="unfinished"></translation> </message> <message> <location line="+29"/> <source>The file '%1' did not contain PKI data</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <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="-271"/> <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="+64"/> <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>KeyTreeView</name> <message> <location filename="../widgets/KeyTreeView.cpp" line="+28"/> <source>Change password</source> <translation type="unfinished">Задать индивидуальный пароль</translation> </message> <message> <location line="+4"/> <source>Reset password</source> <translation type="unfinished">Удалить индивидуальный пароль</translation> </message> <message> <location line="+10"/> <source>Change PIN</source> <translation type="unfinished">Сменить 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="+3"/> <source>Security token</source> <translation type="unfinished">Токен</translation> </message> <message> <location line="+33"/> <location line="+18"/> <location line="+18"/> <source>This is not a token</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <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> </context> <context> <name>MainWindow</name> <message> <location filename="../widgets/MainWindow.cpp" line="+744"/> <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="+97"/> <source>&Close DataBase</source> <translation>&Закрыть базу данных</translation> </message> <message> <location line="+48"/> <source>&Content</source> <translation>&Содержание</translation> </message> <message> <source>&About</source> <translation type="obsolete">&О программе</translation> </message> <message> <location line="-58"/> <source>&File</source> <translation>&Файл</translation> </message> <message> <location line="-29"/> <source>Recent DataBases</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>System</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Croatian</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>English</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>French</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>German</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Russian</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Spanish</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Turkish</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Language</source> <translation type="unfinished"></translation> </message> <message> <location line="+72"/> <source>&Help</source> <translation>&Помощь</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-131"/> <location line="+105"/> <source>New Password</source> <translation>Новый Пароль</translation> </message> <message> <location line="+62"/> <source>The following error occured:</source> <translation>Внимание произошла ошибка:</translation> </message> <message> <location line="+2"/> <source>Copy to Clipboard</source> <translation>Копировать в буфер обмена</translation> </message> <message> <location filename="../ui/MainWindow.ui" line="+22"/> <source>Private Keys</source> <translation>Закрытые ключи</translation> </message> <message> <location line="+27"/> <source>&New Key</source> <translation>&Новый ключ</translation> </message> <message> <location line="+7"/> <location line="+105"/> <location line="+92"/> <location line="+138"/> <location line="+58"/> <source>&Export</source> <translation>&Экспорт</translation> </message> <message> <location line="-386"/> <location line="+105"/> <location line="+92"/> <location line="+124"/> <location line="+72"/> <source>&Import</source> <translation>&Импорт</translation> </message> <message> <location line="-386"/> <source>Import PFX (PKCS#12)</source> <translation>Импорт PFX (PKCS#12)</translation> </message> <message> <location line="+7"/> <location line="+98"/> <location line="+92"/> <location line="+196"/> <source>&Show Details</source> <translation>&Посмотреть детали</translation> </message> <message> <location line="-379"/> <location line="+98"/> <location line="+92"/> <location line="+103"/> <location line="+93"/> <source>&Delete</source> <translation>&Удалить</translation> </message> <message> <location line="-346"/> <source>Certificate signing requests</source> <translation>Запросы на сертификаты</translation> </message> <message> <location line="+30"/> <source>&New Request</source> <translation>&Новый запрос</translation> </message> <message> <location line="+68"/> <location filename="../widgets/MW_menu.cpp" line="-20"/> <source>Certificates</source> <translation>Сертификаты</translation> </message> <message> <location line="+24"/> <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="+28"/> <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="+168"/> <location filename="../widgets/MainWindow.cpp" line="+133"/> <source>Database</source> <translation>База данных</translation> </message> <message> <location line="+69"/> <source>No deleted items found</source> <translation>Нет удаленных записей</translation> </message> <message> <location line="+99"/> <source>Errors detected and repaired while deleting outdated items from the database. A backup file was created</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Removing deleted or outdated items from the database failed.</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-25"/> <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="+14"/> <source>Keys</source> <translation>Ключи</translation> </message> <message> <location line="+1"/> <source>Requests</source> <translation>Запросы</translation> </message> <message> <location line="+2"/> <source>PKCS#12</source> <translation>PKCS#12</translation> </message> <message> <location line="+1"/> <source>PKCS#7</source> <translation>PKCS#7</translation> </message> <message> <location line="+1"/> <source>Template</source> <translation>Шаблоны</translation> </message> <message> <location line="+1"/> <source>Revocation list</source> <translation>Аннулированные списки</translation> </message> <message> <location line="+1"/> <source>PEM file</source> <translation>PEM файлы</translation> </message> <message> <source>Donations</source> <translation type="obsolete">Пожертвование</translation> </message> <message> <location line="+94"/> <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="+6"/> <source>Password verification error. Ignore keys ?</source> <translation>Неверный пароль. Игнорировать ключи?</translation> </message> <message> <location line="+3"/> <source>Import anyway</source> <translation type="unfinished">Импортировать в любом случае</translation> </message> <message> <location line="-112"/> <source>I&mport</source> <translation>И&мпорт</translation> </message> <message> <location line="+9"/> <source>paste PEM file</source> <translation type="unfinished">Вставить PEM данные</translation> </message> <message> <location line="+17"/> <source>About</source> <translation type="unfinished"></translation> </message> <message> <location line="+71"/> <source>Database dump ( *.dump );;All files ( * )</source> <translation>Дамп базы данных ( *.dump );;All files ( * )</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-527"/> <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="+182"/> <source>Please enter the new password to encrypt your private keys in the database-file</source> <translation>Пожалуйста, введите новый пароль для шифрования закрытых ключей в базе данных</translation> </message> <message> <location line="+105"/> <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="+116"/> <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="-130"/> <source>&New DataBase</source> <translation>&Новая база данных</translation> </message> <message> <location line="+2"/> <source>&Open DataBase</source> <translation>&Открыть базу данных</translation> </message> <message> <location line="+45"/> <source>&Init Security token</source> <translation>&Инициализировать Токен</translation> </message> <message> <location line="-34"/> <source>C&hange DataBase password</source> <translation>С&менить пароль базы данных</translation> </message> <message> <location line="+15"/> <source>Exit</source> <translation>Выход</translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-560"/> <source>no such option: %1</source> <translation type="unfinished">нет таких вариантов: %1</translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="-172"/> <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="+53"/> <source>Current Password</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Please enter the current database password</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>The entered password is wrong</source> <translation type="unfinished"></translation> </message> <message> <location line="+277"/> <source>Error opening file: '%1': %2</source> <translation type="unfinished">Ошибка открытия файла: '%1': %2</translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-23"/> <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="+30"/> <source>Create CRL</source> <translation>Создание CRL</translation> </message> <message> <source>Dates</source> <translation type="obsolete">Даты</translation> </message> <message> <location line="+76"/> <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="+58"/> <source>Hash algorithm</source> <translation type="unfinished"></translation> </message> <message> <source>Hashing algorithm</source> <translation type="obsolete">Алгоритм хэширования</translation> </message> <message> <source>Extensions</source> <translation type="obsolete">Расширения</translation> </message> <message> <location line="-10"/> <source>Authority key identifier</source> <translation type="unfinished">Идентификатор ключа ЦС</translation> </message> <message> <location line="-17"/> <source>Subject alternative name</source> <translation>Альтернативное имя владельца</translation> </message> <message> <location line="-19"/> <source>Options</source> <translation type="unfinished">Опции</translation> </message> <message> <location line="+9"/> <source>CRL Number</source> <translation type="unfinished"></translation> </message> <message> <location line="+17"/> <source>Revocation 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="+17"/> <source>Remember as default</source> <translation type="unfinished"></translation> </message> <message> <location line="-67"/> <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="+180"/> <source>Create</source> <translation type="unfinished">Создать</translation> </message> </context> <context> <name>NewX509</name> <message> <source>Create</source> <translation type="obsolete">Создать</translation> </message> <message> <location filename="../ui/NewX509.ui" line="+75"/> <source>Source</source> <translation>Источник</translation> </message> <message> <location line="+22"/> <source>Signing request</source> <translation>Подписанный запрос</translation> </message> <message> <location line="+24"/> <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="+33"/> <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="+406"/> <source>Apply</source> <translation>Применить</translation> </message> <message> <location line="-335"/> <location filename="../widgets/NewX509.cpp" line="+602"/> <source>Subject</source> <translation>Владелец</translation> </message> <message> <location line="-151"/> <source>Use &this Certificate for signing</source> <translation type="unfinished"></translation> </message> <message> <location line="+157"/> <source>Distinguished name</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-466"/> <source>This name is only used internally and does not appear in the resulting certificate</source> <translation type="unfinished"></translation> </message> <message> <source>Must be exactly 2 letter of size (DE, UK)</source> <translation type="obsolete">Код страны состоит из 2х символов (RU,BY,UK)</translation> </message> <message> <location line="+2"/> <source>Internal name</source> <translation>Внутреннее имя</translation> </message> <message> <location filename="../ui/NewX509.ui" line="+39"/> <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> <source>Basic constraints</source> <translation type="obsolete">Основные ограничения</translation> </message> <message> <location line="+11"/> <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="+4"/> <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="+7"/> <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="+40"/> <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> <source>Authority Info Access</source> <translation type="obsolete">способ доступа к информации ЦС</translation> </message> <message> <source>CRL distribution point</source> <translation type="obsolete">пункт распостраненния САС</translation> </message> <message> <source>issuer alternative name</source> <translation type="obsolete">алтернативное имя издателя</translation> </message> <message> <location line="+107"/> <source>URI:</source> <translation>URI:</translation> </message> <message> <location line="+36"/> <source>can be altered by the file "aia.txt"</source> <translation type="unfinished">может быть изменен в файле "aia.txt"</translation> </message> <message> <location line="-79"/> <location line="+17"/> <location line="+33"/> <location line="+43"/> <location filename="../widgets/NewX509.cpp" line="+848"/> <source>Edit</source> <translation>Редактировать</translation> </message> <message> <location line="-100"/> <location line="+17"/> <location line="+76"/> <source>DNS: IP: URI: email: RID:</source> <translation>DNS: IP: URI: email: RID:</translation> </message> <message> <source>subject alternative name</source> <translation type="obsolete">альтернативное имя владельца</translation> </message> <message> <location line="+39"/> <source>Key usage</source> <translation>Область применения ключа</translation> </message> <message> <source>Extended key usage</source> <translation type="obsolete">Расширенная область применения ключа</translation> </message> <message> <location line="+126"/> <source>Netscape</source> <translation>Netscape</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-887"/> <source>Create a &self signed certificate with a MD5-hashed QA serial</source> <translation type="unfinished"></translation> </message> <message> <location line="+180"/> <source>Create Certificate signing request</source> <translation>Создание запроса на сертификат</translation> </message> <message> <source>XCA template</source> <translation type="obsolete">Шаблон XCA</translation> </message> <message> <location line="+76"/> <source>Create x509 Certificate</source> <translation type="unfinished">Создание x509 сертификата</translation> </message> <message> <location line="+786"/> <location line="+13"/> <location line="+19"/> <location line="+12"/> <location line="+16"/> <location line="+14"/> <location line="+34"/> <location line="+11"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Abort rollout</source> <translation type="unfinished">Прервать</translation> </message> <message> <location line="-174"/> <source>The following length restrictions of RFC3280 are violated:</source> <translation type="unfinished"></translation> </message> <message> <location line="+33"/> <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="+61"/> <location line="+45"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Continue rollout</source> <translation type="unfinished">Продолжить</translation> </message> <message> <location line="-23"/> <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="-909"/> <source>Modify subject of the request</source> <translation type="unfinished">Изменить владельца в запросе</translation> </message> <message> <location line="+1079"/> <source>Advanced</source> <translation>Дополнительно</translation> </message> <message> <location line="+24"/> <location filename="../widgets/NewX509.cpp" line="-306"/> <source>Validate</source> <translation type="unfinished">Утвердить</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="+175"/> <source>The verification of the Certificate request failed. The rollout should be aborted.</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Continue anyway</source> <translation type="unfinished">Продолжать в любом случае</translation> </message> <message> <location filename="../ui/NewX509.ui" line="-502"/> <source>No well-defined expiration</source> <translation>Нет четко определенного срока</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="+12"/> <source>Edit name</source> <translation type="unfinished">Изменить имя</translation> </message> <message> <location line="+16"/> <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="-59"/> <location line="+61"/> <source>Edit subject</source> <translation type="unfinished">Изменить владельца</translation> </message> <message> <location line="+45"/> <location line="+23"/> <location line="+22"/> <source>Edit dates</source> <translation type="unfinished">Изменить дату</translation> </message> <message> <location line="-58"/> <source>The key you selected for signing is not a private one.</source> <translation type="unfinished"></translation> </message> <message> <location line="-981"/> <source>Critical</source> <translation type="unfinished"></translation> </message> <message> <location line="+73"/> <source>Create XCA template</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Edit XCA template</source> <translation type="unfinished"></translation> </message> <message> <location line="+905"/> <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="+5"/> <location line="+23"/> <source>Adjust date and continue</source> <translation type="unfinished">Скорректировать дату и продолжить</translation> </message> <message> <location line="-5"/> <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="+41"/> <source>The certificate contains invalid or duplicate extensions. Check the validation on the advanced tab.</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Edit extensions</source> <translation type="unfinished">Изменить расширения</translation> </message> <message> <source>Organisation</source> <translation type="obsolete">Организация (O)</translation> </message> <message> <source>Country code</source> <translation type="obsolete">Код страны (C)</translation> </message> <message> <source>State or Province</source> <translation type="obsolete">Республика, край, область (ST)</translation> </message> <message> <source>Locality</source> <translation type="obsolete">Город, поселок, село</translation> </message> <message> <source>Organisational unit</source> <translation type="obsolete">Департамент, отдел (OU)</translation> </message> <message> <source>E-Mail address</source> <translation type="obsolete">Адрес эл.почты</translation> </message> <message> <source>Common name</source> <translation type="obsolete">Общее имя (CN)</translation> </message> <message> <location filename="../ui/NewX509.ui" line="-408"/> <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="-1017"/> <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="+741"/> <source>From PKCS#10 request</source> <translation type="unfinished"></translation> </message> <message> <location line="-37"/> <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="+148"/> <source>Mandatory subject entries</source> <translation type="unfinished">Обязательные записи</translation> </message> <message> <location line="+24"/> <location line="+60"/> <location line="+57"/> <source>Add</source> <translation type="unfinished">Добавить</translation> </message> <message> <location line="-110"/> <location line="+60"/> <source>Delete</source> <translation type="unfinished">Удалить</translation> </message> <message> <location line="-183"/> <source>Default hash algorithm</source> <translation type="unfinished">Хэш-алгоритм по-умолчанию</translation> </message> <message> <location line="-14"/> <source>Settings</source> <translation type="unfinished"></translation> </message> <message> <location line="+34"/> <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>Translate established x509 terms (%1 -> %2)</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>The hashing functionality of the token is not used by XCA. It may however honor a restricted hash-set propagated by the token. Especially EC and DSA are only defined with SHA1 in the PKCS#11 specification.</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Only use hashes supported by the token when signing with a token key</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Disable legacy Netscape extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+21"/> <source>Distinguished name</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>Explicit subject entries</source> <translation type="unfinished"></translation> </message> <message> <location line="+42"/> <source>Default</source> <translation type="unfinished"></translation> </message> <message> <location line="+26"/> <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="+35"/> <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="+155"/> <source>Load failed</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/Options.ui" line="-281"/> <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="+13"/> <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="+55"/> <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> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;</source> <translation type="obsolete">PKI ключи ( *.pem *.der *.key );;PKCS#8 ключи ( *.p8 *.pk8 );;</translation> </message> <message> <location line="-96"/> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;SSH Public Keys ( *.pub );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+15"/> <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="-150"/> <source>All files ( * )</source> <translation>Все файлы ( * )</translation> </message> <message> <location filename="../lib/asn1time.cpp" line="+142"/> <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="+223"/> <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="+136"/> <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="+228"/> <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="+48"/> <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="+324"/> <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="+92"/> <source>Required PIN size: %1 - %2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/pkcs11_lib.cpp" line="+57"/> <source>Failed to open PKCS11 library: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+219"/> <source>PKCS#11 function '%1' failed: %2</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>PKCS#11 function '%1' failed: %2 In library %3 %4</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/func.cpp" line="+441"/> <source>Country code</source> <translation type="unfinished">Код страны (C)</translation> </message> <message> <location line="+1"/> <source>State or Province</source> <translation type="unfinished">Республика, край, область (ST)</translation> </message> <message> <location line="+1"/> <source>Locality</source> <translation type="unfinished">Город, поселок, село</translation> </message> <message> <location line="+1"/> <source>Organisation</source> <translation type="unfinished">Организация (O)</translation> </message> <message> <location line="+1"/> <source>Organisational unit</source> <translation type="unfinished">Департамент, отдел (OU)</translation> </message> <message> <location line="+1"/> <source>Common name</source> <translation type="unfinished">Общее имя (CN)</translation> </message> <message> <location line="+1"/> <source>E-Mail address</source> <translation type="unfinished">Адрес эл.почты</translation> </message> <message> <location line="+1"/> <source>Serial number</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Given name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Surname</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Title</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Initials</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Description</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Role</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Pseudonym</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Generation Qualifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>x500 Unique Identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>DN Qualifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Unstructured name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Challenge password</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Basic Constraints</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>subject alternative name</source> <translation type="unfinished">альтернативное имя владельца</translation> </message> <message> <location line="+1"/> <source>issuer alternative name</source> <translation type="unfinished">алтернативное имя издателя</translation> </message> <message> <location line="+1"/> <source>Subject key identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Authority key identifier</source> <translation type="unfinished">Идентификатор ключа ЦС</translation> </message> <message> <location line="+1"/> <source>Key usage</source> <translation type="unfinished">Область применения ключа</translation> </message> <message> <location line="+1"/> <source>Extended key usage</source> <translation type="unfinished">Расширенная область применения ключа</translation> </message> <message> <location line="+1"/> <source>CRL distribution points</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Authority information access</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Certificate type</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Base URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>CA Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Certificate renewal URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>CA policy URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>SSL server name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Comment</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/x509v3ext.cpp" line="+75"/> <source>String '%1' for '%2' contains invalid characters</source> <translation type="unfinished"></translation> </message> </context> <context> <name>ReqTreeView</name> <message> <location filename="../widgets/ReqTreeView.cpp" line="+23"/> <source>Sign</source> <translation type="unfinished">Подпись</translation> </message> <message> <location line="+2"/> <source>Similar Request</source> <translation type="unfinished"></translation> </message> </context> <context> <name>RevocationList</name> <message> <location filename="../ui/RevocationList.ui" line="+30"/> <source>Manage revocations</source> <translation type="unfinished"></translation> </message> <message> <location line="+66"/> <source>Add</source> <translation type="unfinished">Добавить</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation type="unfinished">Удалить</translation> </message> <message> <location filename="../widgets/RevocationList.cpp" line="+70"/> <source>No.</source> <translation type="unfinished"></translation> </message> <message> <location 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>Generate CRL</source> <translation type="unfinished">Создать CRL</translation> </message> </context> <context> <name>Revoke</name> <message> <location filename="../ui/Revoke.ui" line="+87"/> <source>Revocation details</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>Invalid since</source> <translation type="unfinished"></translation> </message> <message> <location line="-7"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location line="-80"/> <source>Certificate revocation</source> <translation type="unfinished"></translation> </message> <message> <location line="+66"/> <source>Revocation reason</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>Serial</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>TempTreeView</name> <message> <location filename="../widgets/TempTreeView.cpp" line="+20"/> <source>Duplicate</source> <translation type="unfinished">Дублировать</translation> </message> <message> <location line="+1"/> <source>Create certificate</source> <translation type="unfinished">Создать сертификат</translation> </message> <message> <location line="+1"/> <source>Create request</source> <translation type="unfinished">Создать запрос</translation> </message> <message> <location line="+11"/> <source>copy</source> <translation type="unfinished">копировать</translation> </message> </context> <context> <name>TrustState</name> <message> <location filename="../ui/TrustState.ui" line="+33"/> <source>Certificate trust</source> <translation type="unfinished"></translation> </message> <message> <location line="+60"/> <source>Trustment</source> <translation type="unfinished">Доверия</translation> </message> <message> <location line="+9"/> <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> <source>Set trustment of the Certificate</source> <translation type="obsolete">Установить доверия сертификата</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>X509SuperTreeView</name> <message> <location filename="../widgets/X509SuperTreeView.cpp" line="+25"/> <source>OpenSSL config</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Transform</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Template</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Public Key</source> <translation type="unfinished"></translation> </message> </context> <context> <name>XcaTreeView</name> <message> <location filename="../widgets/XcaTreeView.cpp" line="+282"/> <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="+1"/> <source>Netscape extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Reset</source> <translation type="unfinished"></translation> </message> <message> <location line="+47"/> <source>Columns</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>New</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import</source> <translation type="unfinished">Импорт</translation> </message> <message> <location line="+1"/> <source>Paste PEM data</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Rename</source> <translation type="unfinished">Переименовать</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation type="unfinished">Удалить</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation type="unfinished">Экспорт</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> </context> <context> <name>db_base</name> <message> <location filename="../lib/db_base.cpp" line="+211"/> <source>Internal name</source> <translation type="unfinished">Внутреннее имя</translation> </message> <message> <location line="-136"/> <source>Bad database item Name: %1 Type: %2 Size: %3 %4</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Do you want to delete the item from the database? The bad item may be extracted into a separate file.</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation type="unfinished">Удалить</translation> </message> <message> <location line="+1"/> <source>Delete and extract</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Continue</source> <translation type="unfinished"></translation> </message> <message> <location line="+19"/> <location line="+540"/> <source>Error opening file: '%1': %2</source> <translation type="unfinished"></translation> </message> <message> <location line="-430"/> <source>No.</source> <translation type="unfinished"></translation> </message> <message> <location line="+404"/> <source>How to export the %1 selected items</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Each item in one file</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>Save %1 items in one file as</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PEM Files( *.pem );; All files ( * )</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_crl</name> <message> <location filename="../lib/db_crl.cpp" line="+31"/> <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="+116"/> <source>CRL ( *.pem *.der *.crl )</source> <translation type="unfinished">CRL ( *.pem *.der *.crl )</translation> </message> <message> <location line="+59"/> <source>There are no CA certificates for CRL generation</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>Select CA certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="-68"/> <source>Revocation list export</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">Импорт</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Переименовать</translation> </message> <message> <source>Export</source> <translation type="obsolete">Экспорт</translation> </message> <message> <source>File</source> <translation type="obsolete">Файл</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Удалить</translation> </message> <message> <location line="-40"/> <source>The revocation 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="+140"/> <source>Key size too small !</source> <translation type="unfinished"></translation> </message> <message> <source>New Key</source> <translation type="obsolete">Новый ключ</translation> </message> <message> <source>Import</source> <translation type="obsolete">Импорт</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Переименовать</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Посмотреть детали</translation> </message> <message> <source>Export</source> <translation type="obsolete">Экспорт</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Удалить</translation> </message> <message> <source>Change password</source> <translation type="obsolete">Задать индивидуальный пароль</translation> </message> <message> <source>Reset password</source> <translation type="obsolete">Удалить индивидуальный пароль</translation> </message> <message> <location line="-96"/> <source>Type</source> <translation>Тип</translation> </message> <message> <location line="+1"/> <source>Size</source> <translation>Размер</translation> </message> <message> <location line="+2"/> <source>EC Group</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Use</source> <translation>Использован</translation> </message> <message> <location line="+1"/> <source>Password</source> <translation>Пароль</translation> </message> <message> <location line="+178"/> <source>Clipboard</source> <translation type="unfinished"></translation> </message> <message> <source>File</source> <translation type="obsolete">Файл</translation> </message> <message> <source>Change PIN</source> <translation type="obsolete">Сменить PIN</translation> </message> <message> <source>Change SO PIN (PUK)</source> <translation type="obsolete">Сменить SO PIN (PUK)</translation> </message> <message> <location line="+13"/> <source>Export public key [%1]</source> <translation type="unfinished"></translation> </message> <message> <location line="-25"/> <location line="+35"/> <source>PEM public</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>DER public</source> <translation type="unfinished"></translation> </message> <message> <location line="-33"/> <location line="+37"/> <source>SSH2 public</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>DER private</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PEM encryped</source> <translation type="unfinished"></translation> </message> <message> <source>PKCS#8</source> <translation type="obsolete">PKCS#8</translation> </message> <message> <location line="-41"/> <location line="+46"/> <source>PEM private</source> <translation type="unfinished"></translation> </message> <message> <location line="-43"/> <source>Export keys to Clipboard</source> <translation type="unfinished"></translation> </message> <message> <location line="+45"/> <source>PKCS#8 encrypted</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Export private key [%1]</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Private Keys ( *.pem *.der *.pk8 );; SSH Public Keys ( *.pub )</source> <translation type="unfinished"></translation> </message> <message> <location line="+56"/> <source>Tried to change password of a token</source> <translation type="unfinished"></translation> </message> <message> <location line="-228"/> <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="+35"/> <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="+56"/> <source>Type</source> <translation type="unfinished">Тип</translation> </message> <message> <location line="+63"/> <source>Nothing</source> <translation type="unfinished">Новый</translation> </message> <message> <location line="+5"/> <source>Preset Template values</source> <translation type="unfinished">Предустановленные значения шаблона</translation> </message> <message> <source>copy</source> <translation type="obsolete">копировать</translation> </message> <message> <location line="+45"/> <source>Save template as</source> <translation>Сохранить шаблон как</translation> </message> <message> <source>New Template</source> <translation type="obsolete">Новый шаблон</translation> </message> <message> <source>Import</source> <translation type="obsolete">Импорт</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Переименовать</translation> </message> <message> <source>Export</source> <translation type="obsolete">Экспорт</translation> </message> <message> <source>Change</source> <translation type="obsolete">Изменение</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Удалить</translation> </message> <message> <source>Duplicate</source> <translation type="obsolete">Дублировать</translation> </message> <message> <source>Create certificate</source> <translation type="obsolete">Создать сертификат</translation> </message> <message> <source>Create request</source> <translation type="obsolete">Создать запрос</translation> </message> <message> <location line="+1"/> <source>XCA templates ( *.xca);; All files ( * )</source> <translation>XCA шаблоны ( *.xca);; Всеl файлы ( * )</translation> </message> <message> <location line="-122"/> <source>Bad template: %1</source> <translation>Неправильный шаблон: %1</translation> </message> </context> <context> <name>db_x509</name> <message> <location filename="../lib/db_x509.cpp" line="+59"/> <source>Serial</source> <translation type="unfinished">Серийный номер</translation> </message> <message> <location line="+7"/> <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="-7"/> <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>sha256 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="+5"/> <source>CRL Expiration</source> <translation type="unfinished"></translation> </message> <message> <location line="+103"/> <source>Plain View</source> <translation>Список</translation> </message> <message> <location line="+2"/> <source>Tree View</source> <translation>Дерево</translation> </message> <message> <location line="+311"/> <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="+2"/> <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> <source>New Certificate</source> <translation type="obsolete">Новый сертификат</translation> </message> <message> <source>Import</source> <translation type="obsolete">Импорт</translation> </message> <message> <source>Import PKCS#12</source> <translation type="obsolete">Ипорт PKCS#12</translation> </message> <message> <source>Import from PKCS#7</source> <translation type="obsolete">Импорт из PKCS#7</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Переименовать</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Посмотреть детали</translation> </message> <message> <source>Export</source> <translation type="obsolete">Экспорт</translation> </message> <message> <source>File</source> <translation type="obsolete">Файл</translation> </message> <message> <source>Request</source> <translation type="obsolete">Запрос</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Удалить</translation> </message> <message> <source>Trust</source> <translation type="obsolete">Доверие</translation> </message> <message> <location line="-465"/> <source>CA</source> <translation>ЦС</translation> </message> <message> <source>Properties</source> <translation type="obsolete">Свойства</translation> </message> <message> <source>Generate CRL</source> <translation type="obsolete">Создать CRL</translation> </message> <message> <source>PKCS#7</source> <translation type="obsolete">PKCS#7</translation> </message> <message> <source>Sign</source> <translation type="obsolete">Подпись</translation> </message> <message> <source>Encrypt</source> <translation type="obsolete">Шифровать</translation> </message> <message> <source>Renewal</source> <translation type="obsolete">Обновить</translation> </message> <message> <source>Unrevoke</source> <translation type="obsolete">Вернуть</translation> </message> <message> <source>Revoke</source> <translation type="obsolete">Отозвать</translation> </message> <message> <location line="+619"/> <source>Certificate export</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>X509 Certificates ( *.pem *.cer *.crt *.p12 *.p7b )</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>Not possible for a token key: '%1'</source> <translation type="unfinished"></translation> </message> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Не найден ключ для сетификата: </translation> </message> <message> <location line="+363"/> <source> days</source> <translation type="unfinished">дней</translation> </message> <message> <source>Security token</source> <translation type="obsolete">Токен</translation> </message> <message> <source>Template</source> <translation type="obsolete">Шаблон</translation> </message> <message> <location line="-750"/> <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="+292"/> <source>PEM chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS #7 chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>PKCS #12 chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>PEM + key</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>PKCS #7 trusted</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS #7 all</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PEM trusted</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PEM all</source> <translation type="unfinished"></translation> </message> <message> <location line="+61"/> <location line="+34"/> <source>There was no key found for the Certificate: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Not possible for the token-key Certificate '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="-201"/> <source>Store the certificate to the key on the token '%1 (#%2)' ?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_x509name</name> <message> <location filename="../lib/db_x509super.cpp" line="+23"/> <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> <message> <source>Country code</source> <translation type="obsolete">Код страны (C)</translation> </message> <message> <source>State or Province</source> <translation type="obsolete">Республика, край, область (ST)</translation> </message> <message> <source>Locality</source> <translation type="obsolete">Город, поселок, село</translation> </message> <message> <source>Organisation</source> <translation type="obsolete">Организация (O)</translation> </message> <message> <source>Organisational unit</source> <translation type="obsolete">Департамент, отдел (OU)</translation> </message> <message> <source>Common name</source> <translation type="obsolete">Общее имя (CN)</translation> </message> <message> <source>E-Mail address</source> <translation type="obsolete">Адрес эл.почты</translation> </message> <message> <source>subject alternative name</source> <translation type="obsolete">альтернативное имя владельца</translation> </message> <message> <source>issuer alternative name</source> <translation type="obsolete">алтернативное имя издателя</translation> </message> <message> <source>Authority key identifier</source> <translation type="obsolete">Идентификатор ключа ЦС</translation> </message> <message> <source>Key usage</source> <translation type="obsolete">Область применения ключа</translation> </message> <message> <source>Extended key usage</source> <translation type="obsolete">Расширенная область применения ключа</translation> </message> </context> <context> <name>db_x509req</name> <message> <location filename="../lib/db_x509req.cpp" line="+34"/> <source>Challenge password</source> <translation type="unfinished"></translation> </message> <message> <source>Certificate request ( *.pem *.der *.crl )</source> <translation type="obsolete">Запросы на сертификат ( *.pem *.der *.crl )</translation> </message> <message> <location line="+121"/> <source>Certificate request export</source> <translation type="unfinished">Экспорт запроса на сертификат</translation> </message> <message> <location line="+1"/> <source>Certificate request ( *.pem *.der *.csr )</source> <translation type="unfinished"></translation> </message> <message> <source>New Request</source> <translation type="obsolete">Новый запрос</translation> </message> <message> <source>Import</source> <translation type="obsolete">Импорт</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Переименовать</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Посмотреть детали</translation> </message> <message> <source>Sign</source> <translation type="obsolete">Подпись</translation> </message> <message> <source>Export</source> <translation type="obsolete">Экспорт</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Удалить</translation> </message> <message> <location line="-126"/> <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> <source>File</source> <translation type="obsolete">Файл</translation> </message> <message> <source>Template</source> <translation type="obsolete">Шаблон</translation> </message> <message> <location line="+18"/> <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="+35"/> <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="+1"/> <source>Signature Algorithm</source> <translation type="unfinished"></translation> </message> <message> <location line="+77"/> <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="+68"/> <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="+244"/> <source>unknown</source> <translation>неизвестный</translation> </message> <message> <location line="-266"/> <source>Unable to load the revocation 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 revocation list '%1'</source> <translation>Список отзыва '%1' импортирован успешно</translation> </message> <message> <location line="+1"/> <source>Delete the revocation list '%1'?</source> <translation>Удалить список отзыва '%1'?</translation> </message> <message> <location line="+1"/> <source>Successfully created the revocation list '%1'</source> <translation>Список отзыва '%1' создан успешно</translation> </message> <message> <location line="+2"/> <source>Delete the %1 revocation lists: %2?</source> <translation>Удалить %1 списки отзыва: %2?</translation> </message> <message> <location line="+96"/> <location line="+217"/> <source>Wrong Size %1</source> <translation>Неправильный размер %1</translation> </message> </context> <context> <name>pki_evp</name> <message> <location filename="../lib/pki_evp.cpp" line="+177"/> <source>Failed to decrypt the key (bad password) </source> <translation type="unfinished">Не удалось расшифровать ключ (неверный пароль)</translation> </message> <message> <location line="+195"/> <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> <source>Unable to load the private key in file %1. Tried PEM and DER private, public and PKCS#8 key types.</source> <translation type="obsolete">Не удается загрузить закрытый ключ из файла %1. Формат файла должен быть PEM или DER.</translation> </message> <message> <location line="-278"/> <source>Please enter the password to decrypt the private key.</source> <translation type="unfinished"></translation> </message> <message> <location line="+53"/> <source>Please enter the password to decrypt the private key from file: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>Unable to load the private key in file %1. Tried PEM and DER private, public, PKCS#8 key types and SSH2 format.</source> <translation type="unfinished"></translation> </message> <message> <location line="+35"/> <source>Ignoring unsupported private key</source> <translation type="unfinished"></translation> </message> <message> <location line="+32"/> <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="+142"/> <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="+9"/> <source>public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+188"/> <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="+22"/> <location line="+5"/> <location line="+3"/> <source>Invalid SSH2 public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+113"/> <source>Failed writing to %1</source> <translation type="unfinished"></translation> </message> <message> <location line="-153"/> <source>PIN</source> <translation>ПИН</translation> </message> </context> <context> <name>pki_multi</name> <message> <location filename="../lib/pki_multi.cpp" line="+129"/> <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="+354"/> <source>This Key is already on the token</source> <translation type="unfinished">Этот ключ уже есть на Токене безопасности</translation> </message> <message> <location line="+87"/> <source>Unable to find copied key on the token</source> <translation type="unfinished">Не удается найти копию ключа на Токене безопасности</translation> </message> <message> <location line="+131"/> <source>Public Key missmatch. Please re-import card</source> <translation type="unfinished"></translation> </message> <message> <location line="+73"/> <source>Unable to find generated key on card</source> <translation type="unfinished"></translation> </message> <message> <location line="+75"/> <location line="+13"/> <source>Failed to find the key on the token</source> <translation type="unfinished"></translation> </message> <message> <location line="-6"/> <source>Invalid Pin for the token</source> <translation type="unfinished">Неверный PIN для этого Токена безопасности</translation> </message> <message> <location line="-438"/> <source>Delete the private key '%1' from the token '%2 (#%3)' ?</source> <translation type="unfinished"></translation> </message> <message> <location line="-230"/> <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="+366"/> <source>PIN input aborted</source> <translation type="unfinished"></translation> </message> <message> <location line="+115"/> <source>Please insert card: %1 %2 [%3] with Serial: %4</source> <translation type="unfinished"></translation> </message> <message> <location line="+85"/> <source>Illegal Key generation method</source> <translation type="unfinished"></translation> </message> <message> <location line="+67"/> <source>Ignoring unsupported token key</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <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> <message> <location line="+28"/> <source>Failed to initialize the key on the token</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_temp</name> <message> <location filename="../lib/pki_temp.cpp" line="+435"/> <source>Template file content error (too small): %1</source> <translation>Содержимое файл-шаблона ошибочно (слишком мал) :%1</translation> </message> <message> <source>Template file content error (bad length) :%1</source> <translation type="obsolete">Содержимое файл-шаблона ошибочно (неверная длинна) :%1</translation> </message> <message> <location line="-143"/> <location line="+280"/> <source>Wrong Size %1</source> <translation>Неправильный размер %1</translation> </message> <message> <location line="-473"/> <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="+275"/> <source>Template file content error (too small)</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Template file content error (bad size)</source> <translation type="unfinished"></translation> </message> <message> <location line="+79"/> <source>Not a PEM encoded XCA Template</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Not an XCA Template, but '%1'</source> <translation type="unfinished"></translation> </message> <message> <source>Template file content error (bad size): %1 </source> <translation type="obsolete">Содержимое файл-шаблона ошибочно (неверный размер) :%1</translation> </message> </context> <context> <name>pki_x509</name> <message> <location filename="../lib/pki_x509.cpp" line="+71"/> <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="+269"/> <source>Delete the certificate '%1' from the token '%2 (#%3)'?</source> <translation>Удалить сертификат '%1' из Токена '%2 (#%3)'?</translation> </message> <message> <location line="+517"/> <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="+32"/> <source>No</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Yes</source> <translation type="unfinished"></translation> </message> <message> <location line="-422"/> <source>There is no key for signing !</source> <translation type="unfinished">Не существует ключа для подписания !</translation> </message> <message> <location line="-361"/> <source>Unable to load the certificate in file %1. Tried PEM and DER certificate.</source> <translation>Не удается загрузить сертификат из файла %1. Формат файла должен быть PEM или DER.</translation> </message> <message> <location line="+170"/> <source>This certificate is already on the security token</source> <translation>Этот сертификат уже есть на Токене</translation> </message> <message> <source>CRL expires: %1</source> <translation type="obsolete">CRL истекает: %1</translation> </message> <message> <location line="+249"/> <location line="+533"/> <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="+281"/> <source>Signed</source> <translation>Подписан</translation> </message> <message> <location line="+0"/> <source>Unhandled</source> <translation>Необработан</translation> </message> <message> <location line="+54"/> <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="+187"/> <source>Validation successful: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="-94"/> <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="+71"/> <source>Validation failed: '%1' %2</source> <translation type="unfinished"></translation> </message> </context> <context> <name>void</name> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Не найден ключ для сетификата: </translation> </message> <message> <source>Import Certificate signing request</source> <translation type="obsolete">Импорт запроса на подпись сертификата</translation> </message> </context> </TS> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lang/xca_tr.ts����������������������������������������������������������������������������0000664�0000000�0000000�00000433126�12606205164�0015054�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0" language="tr_TR"> <context> <name>About</name> <message> <location filename="../ui/About.ui" line="+89"/> <source>Done</source> <translation>Bitti</translation> </message> </context> <context> <name>CaProperties</name> <message> <location filename="../ui/CaProperties.ui" line="+30"/> <source>CA Properties</source> <translation>CA Özellikleri</translation> </message> <message> <location line="+65"/> <source>Use random Serial numbers</source> <translation>Değişken Seri numaralar kullan</translation> </message> <message> <location line="+7"/> <source>Days until next CRL issuing</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Default template</source> <translation>Varsayılan şablon</translation> </message> <message> <location line="+10"/> <source>Next serial for signing</source> <translation>İmza için sonraki seri</translation> </message> </context> <context> <name>CertDetail</name> <message> <location filename="../ui/CertDetail.ui" line="+36"/> <source>Details of the Certificate</source> <translation>Sertifika bilgileri</translation> </message> <message> <location line="+48"/> <source>S&tatus</source> <translation>&Durum</translation> </message> <message> <location line="+54"/> <source>Serial</source> <translation>Seri</translation> </message> <message> <location line="+13"/> <source>The serial number of the certificate</source> <translation>Sertifika seri numarası</translation> </message> <message> <location line="+9"/> <source>The internal name of the certificate in the database</source> <translation>Sertifika veritabanındaki isim</translation> </message> <message> <location line="+7"/> <source>Internal name</source> <translation>Dahili adı</translation> </message> <message> <location line="+23"/> <source>Signature algorithm</source> <translation>İmza algoritması</translation> </message> <message> <location line="+7"/> <source>Signature</source> <translation>İmza</translation> </message> <message> <location line="+7"/> <source>Key</source> <translation>Anahtar</translation> </message> <message> <location line="+10"/> <source>Fingerprints</source> <translation>Parmak izleri</translation> </message> <message> <location line="+20"/> <source>SHA1</source> <translation>SHA1</translation> </message> <message> <location line="-14"/> <source>MD5</source> <translation>MD5</translation> </message> <message> <location line="+21"/> <source>A SHA-1 hashsum of the certificate</source> <translation>A SHA-1 hashsum sertifikası</translation> </message> <message> <location line="-14"/> <source>An md5 hashsum of the certificate</source> <translation>An md5 hassum sertifikası</translation> </message> <message> <location line="+21"/> <source>SHA256</source> <translation>SHA256</translation> </message> <message> <location line="+7"/> <source>A SHA-256 hashsum of the certificate</source> <translation>A SHA-256 hashsum sertifikası</translation> </message> <message> <location line="+10"/> <source>Validity</source> <translation>Geçerlilik</translation> </message> <message> <location line="+12"/> <source>The time since the certificate is valid</source> <translation>Zamana kadar geçerli sertifika</translation> </message> <message> <location line="+7"/> <source>The time until the certificate is valid</source> <translation>Bu zaman kadar sertifika geçerli</translation> </message> <message> <location line="+34"/> <source>&Subject</source> <translation>&Konu</translation> </message> <message> <location line="+16"/> <source>&Issuer</source> <translation>&veren</translation> </message> <message> <location line="+16"/> <source>Attributes</source> <translation>Nitelikler</translation> </message> <message> <location line="+10"/> <source>&Extensions</source> <translation>&Uzantıları</translation> </message> <message> <location line="+13"/> <location filename="../widgets/CertDetail.cpp" line="+33"/> <source>Show config</source> <translation>Yapılandırmayı göster</translation> </message> <message> <location filename="../widgets/CertDetail.cpp" line="+4"/> <source>Show extensions</source> <translation>Uzantıları göster</translation> </message> <message> <location line="+19"/> <source>Not available</source> <translation>Kullanılamaz</translation> </message> <message> <location line="+25"/> <source>Details of the certificate</source> <translation>Sertifika detayları</translation> </message> <message> <location line="+9"/> <source>Signer unknown</source> <translation>Bilinmeyen imzalayan makam</translation> </message> <message> <location line="+4"/> <source>Self signed</source> <translation>Kendinden imzalı</translation> </message> <message> <location line="+11"/> <source>Not trusted</source> <translation>Güvenilmeyen</translation> </message> <message> <location line="+4"/> <source>Trusted</source> <translation>Güvenilir</translation> </message> <message> <location line="+20"/> <source>Revoked: </source> <translation>İptaledilmiş </translation> </message> <message> <location line="+5"/> <source>Not valid</source> <translation>Geçersiz</translation> </message> <message> <location line="+4"/> <source>Valid</source> <translation>Geçerli</translation> </message> <message> <location line="+19"/> <source>Details of the certificate signing request</source> <translation>sertifika imzalama isteği detayları</translation> </message> </context> <context> <name>CertExtend</name> <message> <location filename="../ui/CertExtend.ui" line="+30"/> <source>Certificate renewal</source> <translation>Sertifika yenileme</translation> </message> <message> <location line="+44"/> <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> <location line="+26"/> <source>Validity</source> <translation>Geçerlilik</translation> </message> <message> <location line="+11"/> <source>Not before</source> <translation>Öncedeğil</translation> </message> <message> <location line="+7"/> <source>Not after</source> <translation>Sonradeğil</translation> </message> <message> <location line="+26"/> <source>Time range</source> <translation>Zaman aralığı</translation> </message> <message> <location line="+32"/> <source>No well-defined expiration</source> <translation>Tanımlanmamış son</translation> </message> <message> <location line="+14"/> <source>Apply</source> <translation>Uygula</translation> </message> <message> <location line="+26"/> <source>Revoke old certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="-58"/> <source>Days</source> <translation>Gün</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Ay</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Yıl</translation> </message> <message> <location line="+15"/> <source>Midnight</source> <translation>Gece Yarısı</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>Sertifika önceki imzalayandan daha geçerli olacaktır. Muhtemelen istediğiniz bu değildir.</translation> </message> <message> <location line="+2"/> <location line="+22"/> <source>Edit times</source> <translation>Zamanı düzenle</translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Abort rollout</source> <translation type="unfinished"></translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Continue rollout</source> <translation type="unfinished"></translation> </message> <message> <location line="-21"/> <location line="+22"/> <source>Adjust date and continue</source> <translation>Tarihi düzenler ve devam eder</translation> </message> <message> <location line="-5"/> <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> <message> <location filename="../ui/CertExtend.ui" line="-33"/> <source>Local time</source> <translation type="unfinished"></translation> </message> </context> <context> <name>CertTreeView</name> <message> <location filename="../widgets/CertTreeView.cpp" line="+25"/> <source>Import PKCS#12</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import from PKCS#7</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>Request</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Other token</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Similar Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Delete from Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>CA</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Properties</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Generate CRL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Manage revocations</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Trust</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Renewal</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Revoke</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unrevoke</source> <translation type="unfinished"></translation> </message> </context> <context> <name>CertView</name> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Sertifikadaki anahtar bulunamıyor. </translation> </message> <message> <source>Import Certificate signing request</source> <translation type="obsolete">Sertifika imzalama isteği</translation> </message> </context> <context> <name>ClickLabel</name> <message> <location filename="../widgets/clicklabel.cpp" line="+23"/> <source>Double click for details</source> <translation>Detaylariçin çift tıklayın</translation> </message> </context> <context> <name>CrlDetail</name> <message> <location filename="../ui/CrlDetail.ui" line="+30"/> <source>Details of the Revocation list</source> <translation>İptal listesi için çift tıklayın</translation> </message> <message> <location line="+48"/> <source>&Status</source> <translation>&Durum</translation> </message> <message> <location line="+48"/> <source>Version</source> <translation>Sürüm</translation> </message> <message> <location line="+19"/> <source>Signature</source> <translation>İmza</translation> </message> <message> <location line="+7"/> <source>Signed by</source> <translation>İmzalayan:</translation> </message> <message> <location line="+7"/> <source>Name</source> <translation>İsim</translation> </message> <message> <location line="+7"/> <source>The internal name of the CRL in the database</source> <translation>CRL veritabanındaki isim</translation> </message> <message> <location line="+13"/> <source>issuing dates</source> <translation>Verilen tarih</translation> </message> <message> <location line="+9"/> <source>Next Update</source> <translation>Sonraki Güncelleme</translation> </message> <message> <location line="+7"/> <source>Last Update</source> <translation>Son Güncelleme</translation> </message> <message> <location line="+33"/> <source>&Issuer</source> <translation>&veren</translation> </message> <message> <location line="+13"/> <source>&Extensions</source> <translation>&Uzantıları</translation> </message> <message> <location line="+20"/> <source>&Revocation list</source> <translation>&İptal listesi</translation> </message> <message> <source>0</source> <translation type="obsolete">0</translation> </message> <message> <source>Serial</source> <translation type="obsolete">Seri</translation> </message> <message> <source>Revocation</source> <translation type="obsolete">İptal</translation> </message> <message> <source>Reason</source> <translation type="obsolete">Neden</translation> </message> <message> <source>Invalidation</source> <translation type="obsolete">İptal</translation> </message> <message> <location filename="../widgets/CrlDetail.cpp" line="+45"/> <source>Failed</source> <translation>Başarısız</translation> </message> <message> <location line="+6"/> <source>Unknown signer</source> <translation>Bilinmeyen imzalayan</translation> </message> <message> <location line="+3"/> <source>Verification not possible</source> <translation>Doğrulama mümkün değil</translation> </message> <message> <source>Unknown certificate</source> <translation type="obsolete">Bilinmeyen sertifika</translation> </message> </context> <context> <name>ExportCert</name> <message> <source>X509 Certificates ( *.cer *.crt *.p12 *.p7b);;All files ( * )</source> <translation type="obsolete">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 type="obsolete">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 type="obsolete">Lütfen sertifika ismini giriniz.</translation> </message> <message> <source>Certificate export</source> <translation type="obsolete">Sertifika dışa aktar</translation> </message> </context> <context> <name>ExportDer</name> <message> <source>All files ( * )</source> <translation type="obsolete">Bütün dosyalar ( * )</translation> </message> <message> <source>DER is a binary format PEM is a base64 encoded DER file </source> <translation type="obsolete">DER ikili biçimdir PEM base64 kodlanmış DER dosyası </translation> </message> </context> <context> <name>ExportDialog</name> <message> <location filename="../ui/ExportDialog.ui" line="+142"/> <source>...</source> <translation>...</translation> </message> <message> <location line="+13"/> <source>Filename</source> <translation>Dosya adı</translation> </message> <message> <source>Please enter the filename</source> <translation type="obsolete">Lütfen dosya adını giriniz</translation> </message> <message> <location line="+40"/> <source>Export Format</source> <translation>Verme biçimi</translation> </message> <message> <location filename="../widgets/ExportDialog.cpp" line="+37"/> <source>All files ( * )</source> <translation type="unfinished">Bütün dosyalar ( * )</translation> </message> <message> <location line="+15"/> <source>PEM Text format with headers</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Concatenated list of all selected items in one PEM text file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Concatenated text format of the complete certificate chain in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all trusted certificates in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Concatenated text format of all certificates in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Binary DER encoded file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PKCS#7 encoded single certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS#7 encoded complete certificate chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All trusted certificates encoded in one PKCS#7 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All selected certificates encoded in one PKCS#7 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All certificates encoded in one PKCS#7 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>The certificate and the private key as encrypted PKCS#12 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>The complete certificate chain and the private key as encrypted PKCS#12 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the unencrypted private key in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Concatenation of the certificate and the encrypted private key in PKCS#8 format in one file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Text format of the public key in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Binary DER format of the public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>OpenSSL specific encrypted private key in text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in binary DER format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Unencrypted private key in PKCS#8 text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Encrypted private key in PKCS#8 text format</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>The public key encoded in SSH2 format</source> <translation type="unfinished"></translation> </message> <message> <location line="+39"/> <source>The file: '%1' already exists!</source> <translation>Dosya: 2%1' zaten var</translation> </message> <message> <location line="+2"/> <source>Overwrite</source> <translation>Üzerine yaz</translation> </message> <message> <location line="+2"/> <source>Do not overwrite</source> <translation>Üzerine yazmayın</translation> </message> <message> <location filename="../ui/ExportDialog.ui" line="-103"/> <source>Name</source> <translation type="unfinished">İsim</translation> </message> <message> <location line="+7"/> <source>The internal name of the CRL in the database</source> <translation type="unfinished">CRL veritabanındaki isim</translation> </message> </context> <context> <name>ExportKey</name> <message> <source>When exporting the private key it should be encrypted.</source> <translation type="obsolete">Ö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 type="obsolete">Ö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 type="obsolete">Dışa aktarılan özel bölüm anahtarı çok</translation> </message> <message> <source>Export as PKCS#8</source> <translation type="obsolete">PKCS#8 olarak aktar</translation> </message> <message> <source>Private keys ( *.pem *.der *.pk8 );;All files ( * )</source> <translation type="obsolete">Özel anatarlar (*.pem *.der *.pk8);;Tüm dosyalar ( * )</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>&Bitti</translation> </message> </context> <context> <name>ImportMulti</name> <message> <location filename="../ui/ImportMulti.ui" line="+36"/> <source>Import PKI Items</source> <translation type="unfinished"></translation> </message> <message> <location line="+58"/> <source>Import &All</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>&Import</source> <translation>&İçe Aktar</translation> </message> <message> <location line="+7"/> <source>&Done</source> <translation>&Bitti</translation> </message> <message> <location line="+7"/> <source>&Remove from list</source> <translation type="unfinished">&İptal listesi</translation> </message> <message> <location line="+7"/> <source>Details</source> <translation>Detaylar</translation> </message> <message> <location line="+7"/> <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="+60"/> <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> <message> <location line="+39"/> <location line="+144"/> <source>The type of the Item '%1' is not recognized</source> <translation type="unfinished"></translation> </message> <message> <location line="+48"/> <source>Details of the item '%1' cannot be shown</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>The type of the item '%1' is not recognized</source> <translation type="unfinished"></translation> </message> <message> <location line="+29"/> <source>The file '%1' did not contain PKI data</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>The %1 files: '%2' did not contain PKI data</source> <translation type="unfinished"></translation> </message> </context> <context> <name>KeyDetail</name> <message> <location filename="../ui/KeyDetail.ui" line="+91"/> <source>Name</source> <translation>İsim</translation> </message> <message> <location line="+7"/> <source>The internal name of the key used by xca</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Manufacturer</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>Serial</source> <translation>Seri</translation> </message> <message> <location line="+17"/> <location filename="../widgets/KeyDetail.cpp" line="+62"/> <source>Key</source> <translation type="unfinished">Anahtar</translation> </message> <message> <location line="+8"/> <source>Public Exponent</source> <translation type="unfinished"></translation> </message> <message> <location line="+26"/> <source>Keysize</source> <translation type="unfinished"></translation> </message> <message> <location line="+27"/> <source>Private Exponent</source> <translation type="unfinished"></translation> </message> <message> <location line="+25"/> <source>Modulus</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/KeyDetail.cpp" line="-13"/> <source>Details of the %1 key</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Not available</source> <translation type="unfinished">Kullanılamaz</translation> </message> <message> <location line="+5"/> <source>Token</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Security token ID:%1</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Available</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>Sub prime</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <location line="+9"/> <source>Public key</source> <translation type="unfinished"></translation> </message> <message> <location line="-8"/> <location line="+9"/> <source>Private key</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Curve name</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Unknown key</source> <translation type="unfinished"></translation> </message> </context> <context> <name>KeyTreeView</name> <message> <location filename="../widgets/KeyTreeView.cpp" line="+28"/> <source>Change password</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Reset password</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Change PIN</source> <translation type="unfinished"></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"></translation> </message> <message> <location line="+3"/> <source>Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+33"/> <location line="+18"/> <location line="+18"/> <source>This is not a token</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <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> </context> <context> <name>MainWindow</name> <message> <location filename="../ui/MainWindow.ui" line="+22"/> <source>Private Keys</source> <translation type="unfinished"></translation> </message> <message> <location line="+27"/> <source>&New Key</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <location line="+105"/> <location line="+92"/> <location line="+138"/> <location line="+58"/> <source>&Export</source> <translation type="unfinished"></translation> </message> <message> <location line="-386"/> <location line="+105"/> <location line="+92"/> <location line="+124"/> <location line="+72"/> <source>&Import</source> <translation type="unfinished">&İçe Aktar</translation> </message> <message> <location line="-386"/> <source>Import PFX (PKCS#12)</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <location line="+98"/> <location line="+92"/> <location line="+196"/> <source>&Show Details</source> <translation type="unfinished"></translation> </message> <message> <location line="-379"/> <location line="+98"/> <location line="+92"/> <location line="+103"/> <location line="+93"/> <source>&Delete</source> <translation>&Sil</translation> </message> <message> <location line="-346"/> <source>Certificate signing requests</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>&New Request</source> <translation type="unfinished"></translation> </message> <message> <location line="+68"/> <location filename="../widgets/MW_menu.cpp" line="+124"/> <source>Certificates</source> <translation>Sertifikalar</translation> </message> <message> <location line="+24"/> <source>&New Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+35"/> <source>Import &PKCS#12</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Import P&KCS#7</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Plain View</source> <translation type="unfinished"></translation> </message> <message> <location line="+40"/> <source>Templates</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>&New template</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Ch&ange Template</source> <translation type="unfinished"></translation> </message> <message> <location line="+61"/> <source>Revocation lists</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MW_database.cpp" line="+166"/> <source>Using or exporting private keys will not be possible without providing the correct password</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <location filename="../widgets/MainWindow.cpp" line="+914"/> <source>Database</source> <translation>Veri Tabanı</translation> </message> <message> <location line="+69"/> <source>No deleted items found</source> <translation type="unfinished"></translation> </message> <message> <location line="+99"/> <source>Errors detected and repaired while deleting outdated items from the database. A backup file was created</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Removing deleted or outdated items from the database failed.</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-37"/> <source>&File</source> <translation>&Dosya</translation> </message> <message> <location line="+1"/> <source>&New DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Open DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Generate DH parameter</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Set as default DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Close DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Dump DataBase</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>C&hange DataBase password</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Import old db_dump</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Undelete items</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Options</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>Exit</source> <translation>Çıkış</translation> </message> <message> <location line="+5"/> <source>I&mport</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Keys</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Requests</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS#12</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PKCS#7</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Template</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Revocation list</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>&Token</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>&Manage Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Init Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>&Change PIN</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Change &SO PIN</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Init PIN</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>&Help</source> <translation>&Yardım</translation> </message> <message> <location line="+1"/> <source>&Content</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>About</source> <translation type="unfinished"></translation> </message> <message> <source>&About</source> <translation type="obsolete">&Hakkında</translation> </message> <message> <location line="+71"/> <source>Database dump ( *.dump );;All files ( * )</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Import password</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Please enter the password of the old database</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Password verification error. Ignore keys ?</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Import anyway</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-613"/> <source>no such option: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+86"/> <source>Import PEM data</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>Please enter the original SO PIN (PUK) of the token '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Please enter the new SO PIN (PUK) of the token '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>The new label of the token '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+109"/> <source>The token '%1' did not contain any keys or certificates</source> <translation type="unfinished"></translation> </message> <message> <location line="+53"/> <source>Current Password</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Please enter the current database password</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>The entered password is wrong</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <location line="+105"/> <source>New Password</source> <translation>Yeni Parola</translation> </message> <message> <location line="-105"/> <source>Please enter the new password to encrypt your private keys in the database-file</source> <translation type="unfinished"></translation> </message> <message> <location line="+105"/> <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="+26"/> <source>Password verify error, please try again</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Password</source> <translation type="unfinished">Parola</translation> </message> <message> <location line="+1"/> <source>Please enter the password for unlocking the database: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+34"/> <source>The following error occured:</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Copy to Clipboard</source> <translation type="unfinished"></translation> </message> <message> <location line="+103"/> <source>Error opening file: '%1': %2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MW_menu.cpp" line="-175"/> <source>Recent DataBases</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>System</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Croatian</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>English</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>French</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>German</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Russian</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Spanish</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Turkish</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Language</source> <translation type="unfinished"></translation> </message> <message> <location line="+58"/> <source>paste PEM file</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/MainWindow.cpp" line="-23"/> <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> </context> <context> <name>NewCrl</name> <message> <location filename="../ui/NewCrl.ui" line="+30"/> <source>Create CRL</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>last update</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>next update</source> <translation type="unfinished"></translation> </message> <message> <location line="+29"/> <source>Days</source> <translation>Gün</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Ay</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Yıl</translation> </message> <message> <location line="+8"/> <source>Midnight</source> <translation type="unfinished">Gece Yarısı</translation> </message> <message> <location line="+14"/> <source>Apply</source> <translation>Uygula</translation> </message> <message> <location line="+58"/> <source>Hash algorithm</source> <translation type="unfinished"></translation> </message> <message> <location line="-10"/> <source>Authority key identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="-17"/> <source>Subject alternative name</source> <translation type="unfinished"></translation> </message> <message> <location line="-19"/> <source>Options</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>CRL Number</source> <translation type="unfinished"></translation> </message> <message> <location line="+17"/> <source>Revocation reasons</source> <translation type="unfinished"></translation> </message> <message> <location line="-45"/> <source>Local time</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 type="unfinished"></translation> </message> <message> <location line="+47"/> <source>Please give a name to the new key and select the desired keysize</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Key properties</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Name</source> <translation>İsim</translation> </message> <message> <location line="+19"/> <source>The internal name of the new key</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>New Key</source> <translation type="unfinished"></translation> </message> <message> <location line="+27"/> <source>Curve</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Keysize</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>Usually 1024 or 2048 bit keys are used</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Keytype</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/NewKey.cpp" line="+180"/> <source>Create</source> <translation>Oluştur</translation> </message> <message> <location filename="../ui/NewKey.ui" line="+10"/> <source>Remember as default</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NewX509</name> <message> <source>Create</source> <translation type="obsolete">Oluştur</translation> </message> <message> <location filename="../ui/NewX509.ui" line="+75"/> <source>Source</source> <translation>Kaynak</translation> </message> <message> <location line="+22"/> <source>Signing request</source> <translation type="unfinished"></translation> </message> <message> <location line="+24"/> <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="+10"/> <source>Modify subject of the request</source> <translation type="unfinished"></translation> </message> <message> <location line="+41"/> <source>Signing</source> <translation type="unfinished"></translation> </message> <message> <location line="+20"/> <source>Create a &self signed certificate with the serial</source> <translation type="unfinished"></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="+17"/> <source>Use &this Certificate for signing</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>All certificates in your database that can create valid signatures</source> <translation type="unfinished"></translation> </message> <message> <location line="+33"/> <source>Signature algorithm</source> <translation type="unfinished">İmza algoritması</translation> </message> <message> <location line="+28"/> <source>Template for the new certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>All available templates</source> <translation type="unfinished"></translation> </message> <message> <location line="+22"/> <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 line="+29"/> <location filename="../widgets/NewX509.cpp" line="+602"/> <source>Subject</source> <translation>Konu</translation> </message> <message> <source>Organisation</source> <translation type="obsolete">Organizasyon</translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-466"/> <source>This name is only used internally and does not appear in the resulting certificate</source> <translation type="unfinished"></translation> </message> <message> <source>Country code</source> <translation type="obsolete">Ülke kodu</translation> </message> <message> <source>E-Mail address</source> <translation type="obsolete">E-posta adresi</translation> </message> <message> <location line="+2"/> <source>Internal name</source> <translation>Dahili adı</translation> </message> <message> <location filename="../ui/NewX509.ui" line="+45"/> <source>Add</source> <translation>Ekle</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation>Sil</translation> </message> <message> <location line="+37"/> <source>Private key</source> <translation type="unfinished"></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 type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Type</source> <translation>Tür</translation> </message> <message> <location line="+7"/> <source>If this will become a CA certificate or not</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Not defined</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Certification Authority</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>End Entity</source> <translation type="unfinished"></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="+7"/> <source>The basic constraints should always be critical</source> <translation type="unfinished"></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 type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Copy the Subject Key Identifier from the issuer</source> <translation type="unfinished"></translation> </message> <message> <location line="+40"/> <source>Validity</source> <translation type="unfinished">Geçerlilik</translation> </message> <message> <location line="+6"/> <source>Not before</source> <translation type="unfinished">Öncedeğil</translation> </message> <message> <location line="+14"/> <source>Not after</source> <translation type="unfinished">Sonradeğil</translation> </message> <message> <location line="+17"/> <source>Time range</source> <translation type="unfinished">Zaman aralığı</translation> </message> <message> <location line="+10"/> <source>Days</source> <translation>Gün</translation> </message> <message> <location line="+5"/> <source>Months</source> <translation>Ay</translation> </message> <message> <location line="+5"/> <source>Years</source> <translation>Yıl</translation> </message> <message> <location line="+14"/> <source>Apply</source> <translation>Uygula</translation> </message> <message> <location line="+7"/> <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 type="unfinished">Gece Yarısı</translation> </message> <message> <location line="+14"/> <source>No well-defined expiration</source> <translation type="unfinished">Tanımlanmamış son</translation> </message> <message> <location line="+100"/> <source>URI:</source> <translation type="unfinished"></translation> </message> <message> <location line="+36"/> <source>can be altered by the file "aia.txt"</source> <translation type="unfinished"></translation> </message> <message> <location line="-79"/> <location line="+17"/> <location line="+33"/> <location line="+43"/> <location filename="../widgets/NewX509.cpp" line="+848"/> <source>Edit</source> <translation>Düzenle</translation> </message> <message> <location line="-100"/> <location line="+17"/> <location line="+76"/> <source>DNS: IP: URI: email: RID:</source> <translation type="unfinished"></translation> </message> <message> <location line="+39"/> <source>Key usage</source> <translation type="unfinished"></translation> </message> <message> <location line="+126"/> <source>Netscape</source> <translation type="unfinished"></translation> </message> <message> <location line="+170"/> <source>Advanced</source> <translation>Gelişmiş</translation> </message> <message> <location line="+24"/> <location filename="../widgets/NewX509.cpp" line="+10"/> <source>Validate</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-897"/> <source>Create a &self signed certificate with a MD5-hashed QA serial</source> <translation type="unfinished"></translation> </message> <message> <location line="+180"/> <source>Create Certificate signing request</source> <translation type="unfinished"></translation> </message> <message> <location line="+27"/> <source>minimum size: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>maximum size: %1</source> <translation type="unfinished"></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="+41"/> <source>Create x509 Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+700"/> <source>From PKCS#10 request</source> <translation type="unfinished"></translation> </message> <message> <location line="-37"/> <source>Other Tabs</source> <translation type="unfinished"></translation> </message> <message> <location line="-753"/> <source>Critical</source> <translation type="unfinished"></translation> </message> <message> <location line="+73"/> <source>Create XCA template</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Edit XCA template</source> <translation type="unfinished"></translation> </message> <message> <location line="+689"/> <source>Advanced Tab</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Errors</source> <translation>Hatalar</translation> </message> <message> <location line="+103"/> <location line="+13"/> <location line="+19"/> <location line="+12"/> <location line="+16"/> <location line="+14"/> <location line="+34"/> <location line="+11"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Abort rollout</source> <translation type="unfinished"></translation> </message> <message> <location line="-174"/> <source>The following length restrictions of RFC3280 are violated:</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <location line="+61"/> <source>Edit subject</source> <translation type="unfinished"></translation> </message> <message> <location line="-59"/> <location line="+61"/> <location line="+45"/> <location line="+23"/> <location line="+22"/> <location line="+19"/> <source>Continue rollout</source> <translation type="unfinished"></translation> </message> <message> <location line="-154"/> <source>The verification of the Certificate request failed. The rollout should be aborted.</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Continue anyway</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <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="+1"/> <source>Edit name</source> <translation>İsmi Düzenle</translation> </message> <message> <location line="+15"/> <source>There is no Key selected for signing.</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <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="+34"/> <source>The key you selected for signing is not a private one.</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <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">Sertifika önceki imzalayandan daha geçerli olacaktır. Muhtemelen istediğiniz bu değildir.</translation> </message> <message> <location line="+2"/> <location line="+23"/> <location line="+22"/> <source>Edit dates</source> <translation type="unfinished"></translation> </message> <message> <location line="-42"/> <location line="+23"/> <source>Adjust date and continue</source> <translation type="unfinished">Tarihi düzenler ve devam eder</translation> </message> <message> <location line="-5"/> <source>The certificate will be longer valid than the signer. This is probably not what you want.</source> <translation type="unfinished">Sertifika önceki imzalayandan daha geçerli olacaktır. Muhtemelen istediğiniz bu değildir.</translation> </message> <message> <location line="+22"/> <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 line="+21"/> <source>Edit extensions</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"></translation> </message> <message> <location filename="../ui/NewX509.ui" line="-855"/> <source>Distinguished name</source> <translation type="unfinished"></translation> </message> <message> <location line="+346"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/NewX509.cpp" line="-2"/> <source>The certificate contains invalid or duplicate extensions. Check the validation on the advanced tab.</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Options</name> <message> <location filename="../ui/Options.ui" line="+28"/> <source>XCA Options</source> <translation type="unfinished"></translation> </message> <message> <location line="+120"/> <source>Mandatory subject entries</source> <translation type="unfinished"></translation> </message> <message> <location line="+24"/> <location line="+60"/> <location line="+57"/> <source>Add</source> <translation type="unfinished">Ekle</translation> </message> <message> <location line="-110"/> <location line="+60"/> <source>Delete</source> <translation type="unfinished">Sil</translation> </message> <message> <location line="-183"/> <source>Default hash algorithm</source> <translation type="unfinished"></translation> </message> <message> <location line="-14"/> <source>Settings</source> <translation type="unfinished"></translation> </message> <message> <location line="+34"/> <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="+14"/> <source>Translate established x509 terms (%1 -> %2)</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>The hashing functionality of the token is not used by XCA. It may however honor a restricted hash-set propagated by the token. Especially EC and DSA are only defined with SHA1 in the PKCS#11 specification.</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Only use hashes supported by the token when signing with a token key</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Disable legacy Netscape extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+21"/> <source>Distinguished name</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>Explicit subject entries</source> <translation type="unfinished"></translation> </message> <message> <location line="+42"/> <source>Default</source> <translation type="unfinished"></translation> </message> <message> <location line="+26"/> <source>PKCS#11 provider</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>Remove</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/Options.cpp" line="+32"/> <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="+1"/> <source>UTF8 strings only (RFC2459)</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>All strings</source> <translation type="unfinished"></translation> </message> <message> <location line="+155"/> <source>Load failed</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/Options.ui" line="-207"/> <source>Don't colorize expired certificates</source> <translation type="unfinished"></translation> </message> <message> <location line="+214"/> <source>Search</source> <translation type="unfinished"></translation> </message> </context> <context> <name>PwDialog</name> <message> <location filename="../ui/PwDialog.ui" line="+121"/> <source>Take as HEX string</source> <translation type="unfinished"></translation> </message> <message> <location filename="../widgets/PwDialog.cpp" line="+85"/> <source>Repeat %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>%1 missmatch</source> <translation type="unfinished"></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"></translation> </message> <message> <location line="+26"/> <source>E&xit</source> <translation type="unfinished"></translation> </message> <message> <location filename="../ui/PwDialog.ui" line="-3"/> <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> </context> <context> <name>QObject</name> <message> <location filename="../lib/asn1time.cpp" line="+142"/> <location line="+10"/> <location line="+19"/> <source>Undefined</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/db.cpp" line="+223"/> <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 line="+10"/> <source>DB: Write error %1 - %2</source> <translation type="unfinished"></translation> </message> <message> <location line="+324"/> <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/exception.h" line="+55"/> <source>Out of Memory at %1:%2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/load_obj.cpp" line="+20"/> <source>All files ( * )</source> <translation type="unfinished">Bütün dosyalar ( * )</translation> </message> <message> <location line="+32"/> <source>PKI Keys ( *.pem *.der *.key );;PKCS#8 Keys ( *.p8 *.pk8 );;SSH Public Keys ( *.pub );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Import RSA key</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>PKCS#10 CSR ( *.pem *.der *.csr );;Netscape Request ( *.spkac *.spc );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Import Request</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>Certificates ( *.pem *.der *.crt *.cer );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import X.509 Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>PKCS#7 data ( *.p7s *.p7m *.p7b );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import PKCS#7 Certificates</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>PKCS#12 Certificates ( *.p12 *.pfx );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import PKCS#12 Private Certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>XCA templates ( *.xca );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import XCA Templates</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>Revocation lists ( *.pem *.der *.crl );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import Certificate Revocation List</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>XCA Databases ( *.xdb );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Open XCA Database</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>PKCS#11 library ( *.dll );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS#11 library ( *.dylib *.so );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <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 line="+7"/> <source>PEM files ( *.pem );;</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Load PEM encoded file</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/pkcs11.cpp" line="+228"/> <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="+48"/> <source>No Security token found</source> <translation type="unfinished"></translation> </message> <message> <location 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="+92"/> <source>Required PIN size: %1 - %2</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/pkcs11_lib.cpp" line="+57"/> <source>Failed to open PKCS11 library: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+219"/> <source>PKCS#11 function '%1' failed: %2</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>PKCS#11 function '%1' failed: %2 In library %3 %4</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/asn1time.cpp" line="-27"/> <location line="+10"/> <location line="+19"/> <source>Broken / Invalid</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/func.cpp" line="+441"/> <source>Country code</source> <translation type="unfinished">Ülke kodu</translation> </message> <message> <location line="+1"/> <source>State or Province</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Locality</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Organisation</source> <translation type="unfinished">Organizasyon</translation> </message> <message> <location line="+1"/> <source>Organisational unit</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Common name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>E-Mail address</source> <translation type="unfinished">E-posta adresi</translation> </message> <message> <location line="+1"/> <source>Serial number</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Given name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Surname</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Title</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Initials</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Description</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Role</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Pseudonym</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Generation Qualifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>x500 Unique Identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Name</source> <translation type="unfinished">İsim</translation> </message> <message> <location line="+1"/> <source>DN Qualifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Unstructured name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Challenge password</source> <translation type="unfinished">Yeni Parola</translation> </message> <message> <location line="+2"/> <source>Basic Constraints</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>subject alternative name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>issuer alternative name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Subject key identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Authority key identifier</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Key usage</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Extended key usage</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>CRL distribution points</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Authority information access</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Certificate type</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Base URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>CA Revocation URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Certificate renewal URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>CA policy URL</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>SSL server name</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Comment</source> <translation type="unfinished"></translation> </message> <message> <location filename="../lib/x509v3ext.cpp" line="+75"/> <source>String '%1' for '%2' contains invalid characters</source> <translation type="unfinished"></translation> </message> </context> <context> <name>ReqTreeView</name> <message> <location filename="../widgets/ReqTreeView.cpp" line="+23"/> <source>Sign</source> <translation type="unfinished">İmzalayan:</translation> </message> <message> <location line="+2"/> <source>Similar Request</source> <translation type="unfinished"></translation> </message> </context> <context> <name>RevocationList</name> <message> <location filename="../ui/RevocationList.ui" line="+30"/> <source>Manage revocations</source> <translation type="unfinished"></translation> </message> <message> <location line="+66"/> <source>Add</source> <translation type="unfinished">Ekle</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation type="unfinished">Sil</translation> </message> <message> <location filename="../widgets/RevocationList.cpp" line="+70"/> <source>No.</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Serial</source> <translation type="unfinished">Seri</translation> </message> <message> <location line="+0"/> <source>Revocation</source> <translation type="unfinished">İptal</translation> </message> <message> <location line="+0"/> <source>Reason</source> <translation type="unfinished">Neden</translation> </message> <message> <location line="+1"/> <source>Invalidation</source> <translation type="unfinished">İptal</translation> </message> <message> <location line="+25"/> <source>Generate CRL</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Revoke</name> <message> <location filename="../ui/Revoke.ui" line="+87"/> <source>Revocation details</source> <translation type="unfinished"></translation> </message> <message> <location line="+30"/> <source>Invalid since</source> <translation type="unfinished"></translation> </message> <message> <location line="-21"/> <source>Revocation reason</source> <translation type="unfinished"></translation> </message> <message> <location line="-66"/> <source>Certificate revocation</source> <translation type="unfinished"></translation> </message> <message> <location line="+80"/> <source>Local time</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>Serial</source> <translation type="unfinished">Seri</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 type="unfinished"></translation> </message> <message> <location line="+25"/> <source>Security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+47"/> <source>Please select the security token</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TempTreeView</name> <message> <location filename="../widgets/TempTreeView.cpp" line="+20"/> <source>Duplicate</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Create certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Create request</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>copy</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TrustState</name> <message> <location filename="../ui/TrustState.ui" line="+33"/> <source>Certificate trust</source> <translation type="unfinished"></translation> </message> <message> <location line="+60"/> <source>Trustment</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>&Never trust this certificate</source> <translation type="unfinished"></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 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"></translation> </message> </context> <context> <name>X509SuperTreeView</name> <message> <location filename="../widgets/X509SuperTreeView.cpp" line="+25"/> <source>OpenSSL config</source> <translation type="unfinished">Yapılandırmayı göster</translation> </message> <message> <location line="+2"/> <source>Transform</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Template</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Public Key</source> <translation type="unfinished"></translation> </message> </context> <context> <name>XcaTreeView</name> <message> <location filename="../widgets/XcaTreeView.cpp" line="+282"/> <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="+1"/> <source>Netscape extensions</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Reset</source> <translation type="unfinished"></translation> </message> <message> <location line="+47"/> <source>Columns</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>New</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Import</source> <translation type="unfinished">&İçe Aktar</translation> </message> <message> <location line="+1"/> <source>Paste PEM data</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Rename</source> <translation type="unfinished">Dosya adı</translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation type="unfinished">Sil</translation> </message> <message> <location line="+1"/> <source>Export</source> <translation type="unfinished">Verme biçimi</translation> </message> <message> <location line="+1"/> <source>Clipboard</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>File</source> <translation type="unfinished">&Dosya</translation> </message> </context> <context> <name>db_base</name> <message> <location filename="../lib/db_base.cpp" line="+211"/> <source>Internal name</source> <translation type="unfinished">Dahili adı</translation> </message> <message> <location line="-136"/> <source>Bad database item Name: %1 Type: %2 Size: %3 %4</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Do you want to delete the item from the database? The bad item may be extracted into a separate file.</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <source>Delete</source> <translation type="unfinished">Sil</translation> </message> <message> <location line="+1"/> <source>Delete and extract</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Continue</source> <translation type="unfinished"></translation> </message> <message> <location line="+19"/> <location line="+540"/> <source>Error opening file: '%1': %2</source> <translation type="unfinished"></translation> </message> <message> <location line="-430"/> <source>No.</source> <translation type="unfinished"></translation> </message> <message> <location line="+404"/> <source>How to export the %1 selected items</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>All in one PEM file</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Each item in one file</source> <translation type="unfinished"></translation> </message> <message> <location line="+13"/> <source>Save %1 items in one file as</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>PEM Files( *.pem );; All files ( * )</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_crl</name> <message> <location filename="../lib/db_crl.cpp" line="+31"/> <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"></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="+75"/> <source>The revocation list already exists in the database as: '%1' and so it was not imported</source> <translation type="unfinished"></translation> </message> <message> <location line="+41"/> <source>CRL ( *.pem *.der *.crl )</source> <translation type="unfinished"></translation> </message> <message> <location line="+59"/> <source>There are no CA certificates for CRL generation</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>Select CA certificate</source> <translation type="unfinished"></translation> </message> <message> <location line="-68"/> <source>Revocation list export</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">&İçe Aktar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Dosya adı</translation> </message> <message> <source>Export</source> <translation type="obsolete">Verme biçimi</translation> </message> <message> <source>File</source> <translation type="obsolete">&Dosya</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Sil</translation> </message> </context> <context> <name>db_key</name> <message> <location filename="../lib/db_key.cpp" line="+44"/> <source>Type</source> <translation type="unfinished">Tür</translation> </message> <message> <location line="+1"/> <source>Size</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>Use</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Password</source> <translation type="unfinished">Parola</translation> </message> <message> <location line="+54"/> <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="+30"/> <source>Key size too small !</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>You are sure to create a key of the size: %1 ?</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">&İçe Aktar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Dosya adı</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Detaylar</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Sil</translation> </message> <message> <source>Export</source> <translation type="obsolete">Verme biçimi</translation> </message> <message> <location line="+96"/> <source>Export public key [%1]</source> <translation type="unfinished"></translation> </message> <message> <location line="-25"/> <location line="+35"/> <source>PEM public</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>DER public</source> <translation type="unfinished"></translation> </message> <message> <location line="-33"/> <location line="+37"/> <source>SSH2 public</source> <translation type="unfinished"></translation> </message> <message> <location line="-31"/> <source>Export keys to Clipboard</source> <translation type="unfinished"></translation> </message> <message> <location line="+36"/> <source>DER private</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PEM encryped</source> <translation type="unfinished"></translation> </message> <message> <location line="-41"/> <location line="+46"/> <source>PEM private</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS#8 encrypted</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Export private key [%1]</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Private Keys ( *.pem *.der *.pk8 );; SSH Public Keys ( *.pub )</source> <translation type="unfinished"></translation> </message> <message> <location line="+56"/> <source>Tried to change password of a token</source> <translation type="unfinished"></translation> </message> <message> <location line="-285"/> <source>EC Group</source> <translation type="unfinished"></translation> </message> <message> <location line="+181"/> <source>Clipboard</source> <translation type="unfinished"></translation> </message> <message> <source>File</source> <translation type="obsolete">&Dosya</translation> </message> </context> <context> <name>db_temp</name> <message> <location filename="../lib/db_temp.cpp" line="+56"/> <source>Type</source> <translation type="unfinished">Tür</translation> </message> <message> <location line="-8"/> <source>Bad template: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+71"/> <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="+45"/> <source>Save template as</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>XCA templates ( *.xca);; All files ( * )</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">&İçe Aktar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Dosya adı</translation> </message> <message> <source>Export</source> <translation type="obsolete">Verme biçimi</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Sil</translation> </message> </context> <context> <name>db_x509</name> <message> <location filename="../lib/db_x509.cpp" line="+57"/> <source>CA</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>reflects the basic Constraints extension</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Serial</source> <translation type="unfinished">Seri</translation> </message> <message> <location line="+1"/> <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>sha256 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="+1"/> <source>Expiry date</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <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">İptal</translation> </message> <message> <location line="+1"/> <source>CRL Expiration</source> <translation type="unfinished"></translation> </message> <message> <location line="+103"/> <source>Plain View</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Tree View</source> <translation type="unfinished"></translation> </message> <message> <location line="+178"/> <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="+133"/> <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="+2"/> <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="+49"/> <source>Store the certificate to the key on the token '%1 (#%2)' ?</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">&İçe Aktar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Dosya adı</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Detaylar</translation> </message> <message> <source>Export</source> <translation type="obsolete">Verme biçimi</translation> </message> <message> <source>File</source> <translation type="obsolete">&Dosya</translation> </message> <message> <location line="+73"/> <source>PEM chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS #7 chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>PKCS #12 chain</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>PEM + key</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>PKCS #7 trusted</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PKCS #7 all</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PEM trusted</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>PEM all</source> <translation type="unfinished"></translation> </message> <message> <source>OpenSSL config</source> <translation type="obsolete">Yapılandırmayı göster</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Sil</translation> </message> <message> <source>Sign</source> <translation type="obsolete">İmzalayan:</translation> </message> <message> <location line="+3"/> <source>Certificate export</source> <translation type="unfinished">Sertifika dışa aktar</translation> </message> <message> <location line="+1"/> <source>X509 Certificates ( *.pem *.cer *.crt *.p12 *.p7b )</source> <translation type="unfinished"></translation> </message> <message> <location line="+57"/> <location line="+34"/> <source>There was no key found for the Certificate: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="-29"/> <source>Not possible for a token key: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+33"/> <source>Not possible for the token-key Certificate '%1'</source> <translation type="unfinished"></translation> </message> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Sertifikadaki anahtar bulunamıyor. </translation> </message> <message> <location line="+330"/> <source> days</source> <translation type="unfinished"></translation> </message> </context> <context> <name>db_x509name</name> <message> <location filename="../lib/db_x509super.cpp" line="+23"/> <source>Subject</source> <translation type="unfinished">Konu</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> <message> <source>Country code</source> <translation type="obsolete">Ülke kodu</translation> </message> <message> <source>Organisation</source> <translation type="obsolete">Organizasyon</translation> </message> <message> <source>E-Mail address</source> <translation type="obsolete">E-posta adresi</translation> </message> <message> <source>Name</source> <translation type="obsolete">İsim</translation> </message> <message> <source>Challenge password</source> <translation type="obsolete">Yeni Parola</translation> </message> </context> <context> <name>db_x509req</name> <message> <location filename="../lib/db_x509req.cpp" line="+30"/> <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="+2"/> <source>Challenge password</source> <translation type="unfinished">Yeni Parola</translation> </message> <message> <location line="+16"/> <source>The certificate signing request already exists in the database as '%1' and thus was not stored</source> <translation type="unfinished"></translation> </message> <message> <location line="+105"/> <source>Certificate request export</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Certificate request ( *.pem *.der *.csr )</source> <translation type="unfinished"></translation> </message> <message> <source>Import</source> <translation type="obsolete">&İçe Aktar</translation> </message> <message> <source>Rename</source> <translation type="obsolete">Dosya adı</translation> </message> <message> <source>Show Details</source> <translation type="obsolete">Detaylar</translation> </message> <message> <source>Sign</source> <translation type="obsolete">İmzalayan:</translation> </message> <message> <source>Export</source> <translation type="obsolete">Verme biçimi</translation> </message> <message> <source>File</source> <translation type="obsolete">&Dosya</translation> </message> <message> <source>OpenSSL config</source> <translation type="obsolete">Yapılandırmayı göster</translation> </message> <message> <source>Delete</source> <translation type="obsolete">Sil</translation> </message> </context> <context> <name>db_x509super</name> <message> <location filename="../lib/db_x509super.cpp" line="+35"/> <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="+1"/> <source>Signature Algorithm</source> <translation type="unfinished"></translation> </message> <message> <location line="+77"/> <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">X509 sertifikası (*cer *.crt *.p12 *.p7b);;Tüm dosyalar (*)</translation> </message> <message> <location line="+25"/> <source>The following extensions were not ported into the template</source> <translation type="unfinished"></translation> </message> </context> <context> <name>kvView</name> <message> <location filename="../widgets/kvView.cpp" line="+164"/> <source>Type</source> <translation type="unfinished">Tür</translation> </message> <message> <location line="+0"/> <source>Content</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pass_info</name> <message> <location filename="../lib/pass_info.cpp" line="+21"/> <source>Password</source> <translation type="unfinished">Parola</translation> </message> <message> <location line="+6"/> <source>PIN</source> <translation type="unfinished"></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 type="unfinished"></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 type="unfinished"></translation> </message> <message> <location filename="../lib/pki_base.h" line="+68"/> <source>Internal error: Unexpected message: %1 %2</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_crl</name> <message> <location filename="../lib/pki_crl.cpp" line="+46"/> <source>Successfully imported the revocation list '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the revocation list '%1'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the revocation list '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete the %1 revocation lists: %2?</source> <translation type="unfinished"></translation> </message> <message> <location line="+20"/> <source>Unable to load the revocation list in file %1. Tried PEM and DER formatted CRL.</source> <translation type="unfinished"></translation> </message> <message> <location line="+22"/> <source>No issuer given</source> <translation type="unfinished"></translation> </message> <message> <location line="+54"/> <location line="+217"/> <source>Wrong Size %1</source> <translation type="unfinished"></translation> </message> <message> <location line="-27"/> <source>unknown</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_evp</name> <message> <location filename="../lib/pki_evp.cpp" line="+177"/> <source>Failed to decrypt the key (bad password) </source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>Please enter the password to decrypt the private key.</source> <translation type="unfinished"></translation> </message> <message> <location line="+53"/> <source>Please enter the password to decrypt the private key from file: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>Unable to load the private key in file %1. Tried PEM and DER private, public, PKCS#8 key types and SSH2 format.</source> <translation type="unfinished"></translation> </message> <message> <location line="+67"/> <source>Please enter the password to decrypt the private key: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+3"/> <location line="+11"/> <source>Password input aborted</source> <translation type="unfinished"></translation> </message> <message> <location line="-3"/> <source>Please enter the database password for decrypting the key '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+85"/> <source>Please enter the password to protect the private key: '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+15"/> <source>Please enter the database password for encrypting the key</source> <translation type="unfinished"></translation> </message> <message> <location line="+83"/> <source>Please enter the password protecting the PKCS#8 key '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+35"/> <source>Please enter the export password for the private key '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="-261"/> <source>Ignoring unsupported private key</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_key</name> <message> <location filename="../lib/pki_key.cpp" line="+142"/> <source>Successfully imported the %1 public key '%2'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the %1 public key '%2'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Successfully imported the %1 private key '%2'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the %1 private key '%2'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the %1 private key '%2'</source> <translation type="unfinished"></translation> </message> <message> <location line="+6"/> <source>Delete the %1 keys: %2?</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <source>public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+188"/> <source>Common</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Private</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Bogus</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>PIN</source> <translation type="unfinished"></translation> </message> <message> <location line="+10"/> <source>No password</source> <translation type="unfinished"></translation> </message> <message> <location line="+22"/> <location line="+5"/> <location line="+3"/> <source>Invalid SSH2 public key</source> <translation type="unfinished"></translation> </message> <message> <location line="+113"/> <source>Failed writing to %1</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_multi</name> <message> <location filename="../lib/pki_multi.cpp" line="+129"/> <location line="+5"/> <location line="+5"/> <source>Seek failed</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_pkcs12</name> <message> <location filename="../lib/pki_pkcs12.cpp" line="+38"/> <source>Please enter the password to decrypt the PKCS#12 file: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+8"/> <source>Unable to load the PKCS#12 (pfx) file %1.</source> <translation type="unfinished"></translation> </message> <message> <location line="+14"/> <source>The supplied password was wrong (%1)</source> <translation type="unfinished"></translation> </message> <message> <location line="+52"/> <source>Please enter the password to encrypt the PKCS#12 file</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>No key or no Cert and no pkcs12</source> <translation type="unfinished"></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 type="unfinished"></translation> </message> </context> <context> <name>pki_scard</name> <message> <location filename="../lib/pki_scard.cpp" line="+59"/> <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"></translation> </message> <message> <location line="+226"/> <source>Delete the private key '%1' from the token '%2 (#%3)' ?</source> <translation type="unfinished"></translation> </message> <message> <location line="+65"/> <source>This Key is already on the token</source> <translation type="unfinished"></translation> </message> <message> <location line="+75"/> <source>PIN input aborted</source> <translation type="unfinished"></translation> </message> <message> <location line="+12"/> <source>Unable to find copied key on the token</source> <translation type="unfinished"></translation> </message> <message> <location line="+103"/> <source>Please insert card: %1 %2 [%3] with Serial: %4</source> <translation type="unfinished"></translation> </message> <message> <location line="+28"/> <source>Public Key missmatch. Please re-import card</source> <translation type="unfinished"></translation> </message> <message> <location line="+73"/> <source>Unable to find generated key on card</source> <translation type="unfinished"></translation> </message> <message> <location line="+55"/> <source>Wrong Size %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Token %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+9"/> <location line="+13"/> <source>Failed to find the key on the token</source> <translation type="unfinished"></translation> </message> <message> <location line="-6"/> <source>Invalid Pin for the token</source> <translation type="unfinished"></translation> </message> <message> <location line="-98"/> <source>Illegal Key generation method</source> <translation type="unfinished"></translation> </message> <message> <location line="+67"/> <source>Ignoring unsupported token key</source> <translation type="unfinished"></translation> </message> <message> <location line="+43"/> <source>Failed to initialize the key on the token</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_temp</name> <message> <location filename="../lib/pki_temp.cpp" line="+99"/> <source>Successfully imported the XCA template '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the XCA template '%1'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the XCA template '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete the %1 XCA templates: %2?</source> <translation type="unfinished"></translation> </message> <message> <location line="+189"/> <location line="+280"/> <source>Wrong Size %1</source> <translation type="unfinished"></translation> </message> <message> <location line="-194"/> <source>Template file content error (too small)</source> <translation type="unfinished"></translation> </message> <message> <location line="+11"/> <source>Template file content error (bad size)</source> <translation type="unfinished"></translation> </message> <message> <location line="+46"/> <source>Template file content error (too small): %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+33"/> <source>Not a PEM encoded XCA Template</source> <translation type="unfinished"></translation> </message> <message> <location line="+7"/> <source>Not an XCA Template, but '%1'</source> <translation type="unfinished"></translation> </message> </context> <context> <name>pki_x509</name> <message> <location filename="../lib/pki_x509.cpp" line="+71"/> <source>Successfully imported the certificate '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Delete the certificate '%1'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the certificate '%1'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificates: %2?</source> <translation type="unfinished"></translation> </message> <message> <location line="+37"/> <source>Unable to load the certificate in file %1. Tried PEM and DER certificate.</source> <translation type="unfinished"></translation> </message> <message> <location line="+170"/> <source>This certificate is already on the security token</source> <translation type="unfinished"></translation> </message> <message> <location line="+62"/> <source>Delete the certificate '%1' from the token '%2 (#%3)'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+129"/> <source>There is no key for signing !</source> <translation type="unfinished"></translation> </message> <message> <location line="+58"/> <location line="+533"/> <source>Wrong Size %1</source> <translation type="unfinished"></translation> </message> <message> <location line="-203"/> <source>Not trusted</source> <translation type="unfinished">Güvenilmeyen</translation> </message> <message> <location line="+0"/> <source>Trust inherited</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Always Trusted</source> <translation type="unfinished"></translation> </message> <message> <location line="+32"/> <source>No</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Yes</source> <translation type="unfinished"></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"></translation> </message> <message> <location line="+1"/> <source>Delete the %1 certificate request '%2'?</source> <translation type="unfinished"></translation> </message> <message> <location line="+1"/> <source>Successfully created the %1 certificate request '%2'</source> <translation type="unfinished"></translation> </message> <message> <location line="+2"/> <source>Delete the %1 certificate requests: %2?</source> <translation type="unfinished"></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"></translation> </message> <message> <location line="+281"/> <source>Signed</source> <translation type="unfinished"></translation> </message> <message> <location line="+0"/> <source>Unhandled</source> <translation type="unfinished"></translation> </message> <message> <location line="+54"/> <source>Wrong Size %1</source> <translation type="unfinished"></translation> </message> </context> <context> <name>v3ext</name> <message> <location filename="../ui/v3ext.ui" line="+51"/> <source>Add</source> <translation type="unfinished">Ekle</translation> </message> <message> <location line="+7"/> <source>Delete</source> <translation type="unfinished">Sil</translation> </message> <message> <location line="+32"/> <source>Apply</source> <translation type="unfinished">Uygula</translation> </message> <message> <location line="+7"/> <source>Validate</source> <translation type="unfinished"></translation> </message> <message> <location line="+29"/> <source>Cancel</source> <translation type="unfinished">İptal</translation> </message> <message> <location filename="../widgets/v3ext.cpp" line="+93"/> <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="+4"/> <source>Syntax: <OID>;TYPE:text like '1.2.3.4:UTF8:name'</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> <source>No editing. Only 'copy' allowed here</source> <translation type="unfinished"></translation> </message> <message> <location line="+67"/> <source>Validation failed: '%1' %2</source> <translation type="unfinished"></translation> </message> <message> <location line="+5"/> <source>Validation successful: '%1'</source> <translation type="unfinished"></translation> </message> </context> <context> <name>void</name> <message> <source>There was no key found for the Certificate: </source> <translation type="obsolete">Sertifikadaki anahtar bulunamıyor. </translation> </message> <message> <source>Import Certificate signing request</source> <translation type="obsolete">Sertifika imzalama isteği</translation> </message> </context> </TS> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/��������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12606205164�0013040�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/Makefile������������������������������������������������������������������������������0000664�0000000�0000000�00000001306�12606205164�0014500�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 main NAMES=$(MOCNAMES) asn1int oid x509rev asn1time \ x509v3ext func load_obj x509name db import \ pk11_attribute pkcs11 pkcs11_lib Passwd builtin_curves entropy OBJS=$(patsubst %, %.o, $(NAMES)) $(patsubst %, moc_%.o, $(MOCNAMES)) include $(TOPDIR)/Rules.mak sinclude .depend xca_db_stat$(SUFFIX): xca_db_stat.o db.o db.h @$(PRINT) " LINK $@" $(CC) $(CPPFLAGS) $(LDFLAGS) $(CFLAGS) $(CFLAGS_XCA_DB_STAT) xca_db_stat.o db.o $(LIBS) -g -o $@ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/Passwd.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000000527�12606205164�0015011�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2012 Christian Hohnstaedt. * * All rights reserved. */ #include <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-1.3.2/lib/Passwd.h������������������������������������������������������������������������������0000664�0000000�0000000�00000000727�12606205164�0014460�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 <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-1.3.2/lib/asn1int.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000005723�12606205164�0015130�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.toLatin1())) 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.toLatin1())) 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); } QByteArray a1int::i2d() { return i2d_bytearray(I2D_VOID(i2d_ASN1_INTEGER), in); } int a1int::derSize() const { return i2d_ASN1_INTEGER(in, NULL); } ���������������������������������������������xca-1.3.2/lib/asn1int.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000002021�12606205164�0014561�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 <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; QByteArray i2d(); 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-1.3.2/lib/asn1time.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000006706�12606205164�0015276�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 <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::fromLatin1((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.toLatin1(), 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-1.3.2/lib/asn1time.h����������������������������������������������������������������������������0000664�0000000�0000000�00000001563�12606205164�0014737�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 <QString> #include <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-1.3.2/lib/base.h��������������������������������������������������������������������������������0000664�0000000�0000000�00000003337�12606205164�0014131�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __BASE_H #define __BASE_H #define QT_NO_CAST_TO_ASCII 1 #ifndef PACKAGE_NAME #define XCA_TITLE "X Certificate and Key management" #else #define XCA_TITLE PACKAGE_NAME #endif #include <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__); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) #define nativeSeparator(s) QDir::toNativeSeparators(s) #define XCA_INFO(msg) QMessageBox::information(NULL, XCA_TITLE, msg.toHtmlEscaped()) #define XCA_WARN(msg) QMessageBox::warning(NULL, XCA_TITLE, msg.toHtmlEscaped()) #define XCA_YESNO(msg) (QMessageBox::question(NULL, XCA_TITLE, msg.toHtmlEscaped(), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) #define XCA_OKCANCEL(msg) (QMessageBox::warning(NULL, XCA_TITLE, msg.toHtmlEscaped(), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) #else #define nativeSeparator(s) QDir::convertSeparators(s) #define XCA_INFO(msg) QMessageBox::information(NULL, XCA_TITLE, Qt::escape(msg)) #define XCA_WARN(msg) QMessageBox::warning(NULL, XCA_TITLE, Qt::escape(msg)) #define XCA_YESNO(msg) (QMessageBox::question(NULL, XCA_TITLE, Qt::escape(msg), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) #define XCA_OKCANCEL(msg) (QMessageBox::warning(NULL, XCA_TITLE, Qt::escape(msg), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) #endif #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) #define MIN(a,b) ((a)<(b)) ? (a) : (b) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/builtin_curves.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000006676�12606205164�0016620�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 2014 Christian Hohnstaedt. * * All rights reserved. */ #include <openssl/evp.h> #include "builtin_curves.h" #include "exception.h" #include "func.h" #ifndef OPENSSL_NO_EC #include <openssl/ec.h> #include "opensc-pkcs11.h" 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_sect113r1, NID_sect113r2, NID_sect131r1, NID_sect131r2, NID_sect163k1, NID_sect163r1, NID_sect163r2, NID_sect193r1, NID_sect193r2, NID_sect233k1, NID_sect233r1, NID_sect239k1, NID_sect283k1, NID_sect283r1, NID_sect409k1, NID_sect409r1, NID_sect571k1, NID_sect571r1, NID_secp112r1, NID_secp112r2, NID_secp128r1, NID_secp128r2, NID_secp160k1, NID_secp160r1, NID_secp160r2, NID_secp192k1, NID_secp224k1, NID_secp224r1, NID_secp256k1, NID_secp384r1, NID_secp521r1, NID_wap_wsg_idm_ecid_wtls1, NID_wap_wsg_idm_ecid_wtls3, NID_wap_wsg_idm_ecid_wtls4, NID_wap_wsg_idm_ecid_wtls5, NID_wap_wsg_idm_ecid_wtls6, NID_wap_wsg_idm_ecid_wtls7, NID_wap_wsg_idm_ecid_wtls8, NID_wap_wsg_idm_ecid_wtls9, NID_wap_wsg_idm_ecid_wtls10, NID_wap_wsg_idm_ecid_wtls11, NID_wap_wsg_idm_ecid_wtls12, #ifdef NID_brainpoolP160r1 NID_brainpoolP160r1, NID_brainpoolP160t1, NID_brainpoolP192r1, NID_brainpoolP192t1, NID_brainpoolP224r1, NID_brainpoolP224t1, NID_brainpoolP256r1, NID_brainpoolP256t1, NID_brainpoolP320r1, NID_brainpoolP320t1, NID_brainpoolP384r1, NID_brainpoolP384t1, NID_brainpoolP512r1, NID_brainpoolP512t1 #endif }; builtin_curves::builtin_curves() { int i, num_curves = EC_get_builtin_curves(NULL, 0); EC_builtin_curve *curves = (EC_builtin_curve*)OPENSSL_malloc( (int)(sizeof(EC_builtin_curve) *num_curves)); check_oom(curves); BIGNUM *order = BN_new(); check_oom(order); EC_get_builtin_curves(curves, num_curves); for (i=0; i< num_curves; i++) { size_t j; int flag = 0, nid = curves[i].nid; unsigned long type = 0; for (j=0; j<ARRAY_SIZE(x962_curve_nids); j++) { if (x962_curve_nids[j] == nid) { flag = CURVE_X962; break; } } if (!flag) { for (j=0; j<ARRAY_SIZE(other_curve_nids); j++) { if (other_curve_nids[j] == nid) { flag = CURVE_OTHER; break; } } } if (!flag) continue; EC_GROUP *group = EC_GROUP_new_by_curve_name(nid); EC_GROUP_get_order(group, order, NULL); switch (EC_METHOD_get_field_type(EC_GROUP_method_of(group))) { case NID_X9_62_prime_field: type = CKF_EC_F_P; break; case NID_X9_62_characteristic_two_field: type = CKF_EC_F_2M; break; default: continue; } #undef PRINT_KNOWN_CURVES #ifdef PRINT_KNOWN_CURVES fprintf(stderr, "%50s %27s %20s %s\n", curves[i].comment, OBJ_nid2sn(nid), CCHAR(OBJ_obj2QString(OBJ_nid2obj(nid), 1)), type == CKF_EC_F_P ? "Fp" : "F2m"); #endif append(builtin_curve(nid, QString(curves[i].comment), BN_num_bits(order), flag, type)); EC_GROUP_free(group); } BN_free(order); } #else builtin_curves::builtin_curves() { } #endif ������������������������������������������������������������������xca-1.3.2/lib/builtin_curves.h����������������������������������������������������������������������0000664�0000000�0000000�00000001160�12606205164�0016244�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 2014 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __BUILTIN_EC_CURVES_H #define __BUILTIN_EC_CURVES_H #include <QString> #include <QList> #include "base.h" #define CURVE_X962 1 #define CURVE_OTHER 2 class builtin_curve { public: int nid; QString comment; unsigned order_size; int flags; /* type: CKF_EC_F_P || CKF_EC_F_2M */ unsigned long type; builtin_curve(int n, QString c, int s, int f, int t) { nid = n; comment = c; order_size = s; flags = f; type = t; }; }; class builtin_curves: public QList<builtin_curve> { public: builtin_curves(); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db.cpp��������������������������������������������������������������������������������0000664�0000000�0000000�00000030241�12606205164�0014131�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 <QStringList> #include <QDebug> #include <QDateTime> #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 #define XNUM(n) CCHAR(QString::number((n), 16)) 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) { return false; } return true; } bool db::eof() { return head_offset == file.size(); } 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 = file.size(); return; } if (!verify_magic()) return; if (ntohs(head.flags) & flag) next(flag); } int db::next(int flag) { qint64 ret; qint64 garbage = -1; int result = 1; if (eof()) return 1; head_offset += ntohl(head.len); if (head_offset >= file.size()) { head_offset = file.size(); return 1; } while (1) { file.seek(head_offset); ret = file.read((char*)&head, sizeof head); if (ret==0) { head_offset = file.size(); break; } if (ret < 0) { fileIOerr("read"); return -1; } if (ret != sizeof head) { qWarning("next(): Short read: 0x%s of 0x%s @ 0x%s", XNUM(ret), XNUM(sizeof head), XNUM(head_offset)); if (garbage != -1) { ret += head_offset - garbage; head_offset = garbage; } qWarning("next(): Truncating 0x%s garbage bytes @ 0x%s", XNUM(ret), XNUM(head_offset)); if (backup()) file.resize(head_offset); head_offset = file.size(); return -1; } qint64 hlen = ntohl(head.len); if (!verify_magic()) { if (garbage == -1) garbage = head_offset; head_offset += 1; continue; } else { if (garbage != -1) { qWarning("next(): 0x%s bytes garbage skipped at 0x%s", XNUM(head_offset - garbage), XNUM(garbage)); } garbage = -1; if (file.size() < head_offset + hlen) { qWarning("next(): Short item (%s of %s) at 0x%s", XNUM(ntohl(head.len)), XNUM(file.size() - head_offset), XNUM(head_offset)); garbage = head_offset; /* invalidate the header */ qWarning("Invalidate short item @ 0x%s\n", XNUM(head_offset)); file.seek(head_offset); char inval = 0xcb; // 0xca +1 file.write(&inval, 1); head_offset += 4; continue; } } if (!(ntohs(head.flags) & flag)) { result = 0; break; } else { head_offset += hlen; } } if (garbage != -1) { qWarning("next(): 0x%s bytes garbage skipped at 0x%s", XNUM(head_offset - garbage), XNUM(garbage)); } return result; } void db::rename(enum pki_type type, QString name, QString n) { qint64 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 head; init_header(&head, ver, len, type, name); file.seek(file.size()); if (file.write((char*)&head, sizeof head) != sizeof head) { 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) { qint64 ret; first(); ret = find(type, name); if (ret != 0) { return add(p, len, ver, type, name); } else { file.seek(head_offset); if (len != (int)(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 head) != sizeof head) { 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 head); if (ret != sizeof head) fileIOerr("write"); } return 0; } head.version = htons(ver); if (file.write((char*)&head, sizeof head) != sizeof head) { 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; qint64 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 == (qint64)size) { if (u_header) convert_header(u_header); return data; } else { free(data); if (ret < 0) 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) { qint64 ret, garbage = -1; uint32_t offs; char buf[BUFSIZ]; QFile new_file; int result = 0; new_file.setFileName(name + "{shrink}"); if (!new_file.open(QIODevice::ReadWrite)) { fileIOerr("open"); return 1; } file.reset(); while ((ret = file.read((char*)&head, sizeof head)) > 0) { if (ret < (qint64)sizeof head) { qWarning("shrink(): Short read: 0x%s instead of 0x%s", XNUM(ret), XNUM(sizeof head)); result = 1; break; } if (!verify_magic()) { file.seek(file.pos() - sizeof(head) +1); if (garbage == -1) garbage = file.pos() -1; result = 1; continue; } if (garbage != -1) qWarning("shrink(): 0x%s garbage found at %s", XNUM(file.pos() - sizeof head - garbage), XNUM(garbage)); garbage = -1; head_offset = ntohl(head.len) - sizeof(head); if ((ntohs(head.flags) & flags)) { /* FF to the next entry */ if (!file.seek(head_offset + file.pos())) { result = 1; break; } continue; } if (head_offset + file.pos() > file.size()) { file.seek(file.pos() - sizeof(head) +4); if (garbage == -1) garbage = file.pos() -4; continue; } ret = new_file.write((char*)&head, sizeof(head)); if (ret != sizeof(head)) { result = 2; break; } offs = head_offset; while (offs) { ret = file.read((char*)buf, (offs > BUFSIZ) ? BUFSIZ : offs); if (ret <= 0) { result = 3; break; } if (new_file.write(buf, ret) != ret) { result = 4; break; } offs -= ret; } if (offs) break; } new_file.close(); file.close(); QString backup, orig; switch (result) { case 0: /* everything is fine */ result = mv(new_file); break; case 1: /* Some repaireable errors in the database occured. * Keep the original as backup */ backup = backup_name(); QFile::remove(backup); orig = file.fileName(); if (file.rename(backup)) { new_file.rename(orig); } else { QFile::remove(new_file.fileName()); result = 2; } break; case 2: case 3: case 4: QFile::remove(new_file.fileName()); result = 2; break; } return result; } QString db::backup_name() { return file.fileName() + "_backup_" + QDateTime::currentDateTime() .toString("yyyyMMdd_hhmmss") + ".xdb"; } bool db::backup() { QFile this_file, new_file; QString backup = backup_name(); qint64 ret, wret; char buf[BUFSIZ]; this_file.setFileName(file.fileName()); if (!this_file.open(QIODevice::ReadOnly)) { return false; } new_file.setFileName(backup); if (!new_file.open(QIODevice::ReadWrite)) { this_file.close(); return false; } while (1) { ret = this_file.read(buf, sizeof buf); if (ret <= 0) break; wret = new_file.write(buf, ret); if (wret != ret) break; } this_file.close(); new_file.close(); return ret == 0; } // Move "new_file" to this database 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 + "{mv_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()); printf("%s file.error(%d)\n", CCHAR(name), file.error()); return 2; } } else { printf("%s file.error(%d)\n", CCHAR(tempn), file.error()); return 2; } 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 == 0 ? 0 : 2; #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-1.3.2/lib/db.h����������������������������������������������������������������������������������0000664�0000000�0000000�00000003751�12606205164�0013604�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 <QString> #include <QFile> #define XCA_MAGIC 0xcadb1969 #define NAMELEN 80 #define FNAMLEN 256 #define DBFLAG_DELETED 0x1 #define DBFLAG_OUTDATED 0x2 enum pki_type { none, asym_key, x509_req, x509, revocation, 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); QString backup_name(); bool backup(); public: bool verify_magic(void); qint64 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-1.3.2/lib/db_base.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000033630�12606205164�0015130�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifdef WIN32 #include <windows.h> #else #include <netinet/in.h> #endif #include "db_base.h" #include "func.h" #include "exception.h" #include <QMessageBox> #include <QListView> #include <QClipboard> #include <QDir> #include <QDebug> #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"; } 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; XCA_INFO(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(); } int db_base::handleBadEntry(unsigned char *p, db_header_t *head) { QString name = QString::fromUtf8(head->name); QString txt = tr("Bad database item\nName: %1\nType: %2\nSize: %3\n%4") .arg(name).arg(class_name) .arg(head->len - sizeof(db_header_t)) .arg(tr("Do you want to delete the item from the database? The bad item may be extracted into a separate file.")); xcaWarning msg(mainwin, txt); msg.addButton(QMessageBox::Ok)->setText(tr("Delete")); msg.addButton(QMessageBox::Apply)->setText(tr("Delete and extract")); msg.addButton(QMessageBox::Cancel)->setText(tr("Continue")); switch (msg.exec()) { case QMessageBox::Ok: return 1; case QMessageBox::Cancel: default: return 0; case QMessageBox::Apply: break; } QString s = QFileDialog::getSaveFileName(mainwin, QString(), name, QString(), NULL, QFileDialog::DontConfirmOverwrite); size_t l; db_header_t h; FILE *fp = fopen_write(s); if (!fp) { throw errorEx(tr("Error opening file: '%1': %2"). arg(s).arg(strerror(errno)), class_name); } 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); l = fwrite(&h, sizeof h, 1, fp); l += fwrite(p, head->len - sizeof h, 1, fp); fclose(fp); return (l == 2); } 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) { qWarning("Load was empty !"); goto next; } pki = newPKI(&head); if (pki->getVersion() < head.version) { qWarning("Item[%s]: Version %d " "> known version: %d -> ignored", 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; try { if (handleBadEntry(p, &head)) { mydb.erase(); } } catch (errorEx &err) { mainwin->Error(err); } } 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::updateHeaders() { QByteArray ba = allHeaders.toData(); foreach(dbheader *h, allHeaders) delete h; allHeaders = getHeaders(); allHeaders.fromData(ba); } dbheaderList db_base::getHeaders() { dbheaderList h; /* "No." handled in XcaProxyModel */ h << new dbheader(HD_internal_name, true, tr("Internal name")) << new dbheader(HD_counter, false, tr("No.")); return h; } void db_base::saveHeaderState() { if (dbName.isEmpty()) return; QByteArray 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(); } QString db_base::pem2QString(QModelIndexList indexes) { exportType::etype format; QString msg; format = clipboardFormat(indexes); foreach(QModelIndex idx, indexes) { long l; const char *p; BIO *bio = BIO_new(BIO_s_mem()); pki_base *pki = static_cast<pki_base*> (idx.internalPointer()); pki->pem(bio, format); openssl_error(); l = BIO_get_mem_data(bio, &p); msg += QString::fromUtf8(p, l); BIO_free(bio); } return msg; } void db_base::pem2clipboard(QModelIndexList indexes) { QString msg = pem2QString(indexes); QClipboard *cb = QApplication::clipboard(); if (cb->supportsSelection()) cb->setText(msg, QClipboard::Selection); else cb->setText(msg); } void db_base::deletePKI(QModelIndex idx) { pki_base *pki = static_cast<pki_base*>(idx.internalPointer()); try { try { pki->deleteFromToken(); } catch (errorEx &err) { MainWindow::Error(err); } remFromCont(idx); 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::showItem(const QModelIndex &index) { showPki(static_cast<pki_base*>(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 { if (!pki) return QModelIndex(); 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 (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()); 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: return QVariant(XCA_application::tableFont); case Qt::BackgroundRole: return item->bg_color(hd); case Qt::UserRole: return item->visible(); } return QVariant(); } static QVariant getHeaderViewInfo(dbheader *h) { return QVariant( #if 0 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) #else h->getTooltip() #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]->getName()); case Qt::ToolTipRole: return getHeaderViewInfo(allHeaders[section]); } } 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::store(QModelIndexList indexes) { int ret; xcaWarning msg(mainwin, tr("How to export the %1 selected items"). arg(indexes.size())); msg.addButton(QMessageBox::Ok)->setText(tr("All in one PEM file")); msg.addButton(QMessageBox::Apply)->setText(tr("Each item in one file")); msg.addButton(QMessageBox::Cancel); ret = msg.exec(); if (ret == QMessageBox::Apply) { foreach(QModelIndex i, indexes) store(i); return; } else if (ret != QMessageBox::Ok) { return; } QString fn = mainwin->getPath() + QDir::separator() + "export.pem"; QString s = QFileDialog::getSaveFileName(mainwin, tr("Save %1 items in one file as").arg(indexes.size()), fn, tr("PEM Files( *.pem );; All files ( * )")); if (s.isEmpty()) return; s = nativeSeparator(s); mainwin->setPath(s.mid(0, s.lastIndexOf(QRegExp("[/\\\\]")) )); try { QString pem = pem2QString(indexes); FILE *fp = fopen_write(s); if (!fp) { throw errorEx(tr("Error opening file: '%1': %2"). arg(s).arg(strerror(errno)), class_name); } fwrite(pem.toLatin1(), pem.size(), 1, fp); fclose(fp); } catch (errorEx &err) { MainWindow::Error(err); } } bool db_base::columnHidden(int col) const { if (pki_x509::disable_netscape && allHeaders[col]->type == dbheader::hd_v3ext_ns) return true; 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(); } ��������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_base.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000007073�12606205164�0014577�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 <QListView> #include <QPixmap> #include <QContextMenuEvent> #include <QStringList> #include <QAbstractItemModel> #include "widgets/ExportDialog.h" #include "pki_base.h" #include "headerlist.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; virtual dbheaderList getHeaders(); int colResizing; int handleBadEntry(unsigned char *p, db_header_t *head); virtual exportType::etype clipboardFormat(QModelIndexList indexes) { (void)indexes; return exportType::Separator; } public: pki_base *rootItem; db_base(QString db, MainWindow *mw); virtual void updateHeaders(); 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); 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(QModelIndexList indexes); void load_default(load_base &load); void insertChild(pki_base *parent, pki_base *child); void createSuccess(pki_base *pki); bool columnHidden(int col) const; bool isNumericCol(int col) const; void saveHeaderState(); void initHeaderView(QHeaderView *hv); void setVisualIndex(int i, int visualIndex); bool fixedHeaderSize(int sect); void colResizeStart() { colResizing++; } void colResizeEnd() { colResizing--; } virtual void store(QModelIndexList indexes); virtual void store(QModelIndex index) { (void)index; }; dbheaderList getAllHeaders() { return allHeaders; } void pem2clipboard(QModelIndexList indexes); QString pem2QString(QModelIndexList indexes); void deletePKI(QModelIndex idx); public slots: virtual void newItem() { } virtual void load() { } void columnResetDefaults(); 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, Qt::SortOrder); signals: void connNewX509(NewX509 *dlg); void resetHeader(); void updateHeader(); void columnsContentChanged(); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_crl.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000014166�12606205164�0015001�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 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 <QMessageBox> #include <QContextMenuEvent> #include <QInputDialog> #include "ui_NewCrl.h" db_crl::db_crl(QString db, MainWindow *mw) :db_x509name(db,mw) { class_name = "crls"; pkitype << revocation; updateHeaders(); loadContainer(); } dbheaderList db_crl::getHeaders() { dbheaderList h = db_x509name::getHeaders(); h << 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")); return h; } 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) { x509revList revlist; if (!mainwin->certs) return; pki_x509 *signer = crl->getIssuer(); if (!signer) return; revlist = crl->getRevList(); signer->mergeRevList(revlist); foreach(x509rev revok, revlist) { pki_x509 *crt = signer->getBySerial(revok.getSerial()); if (crt) crt->setRevoked(revok); } } 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, *newest = NULL; x509name issname = crl->getSubject(); while (1) { iss = mainwin->certs->getBySubject(issname, last); if (!iss) break; last = iss; pki_key *key = iss->getPubKey(); if (!key) continue; if (!crl->verify(key)) { delete key; continue; } delete key; if (!newest) { newest = iss; } else { if (newest->getNotAfter() < iss->getNotAfter()) newest = iss; } } crl->setIssuer(newest); } 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) { XCA_INFO(tr("The revocation list already exists in the database as:\n'%1'\nand so it was not imported").arg(oldcrl->getIntName())); delete(crl); return NULL; } insertPKI(crl); revokeCerts(crl); pki_x509 *issuer = crl->getIssuer(); if (issuer) mainwin->certs->updateAfterCrlLoad(issuer); 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(QModelIndex index) { QList<exportType> types; if (!index.isValid()) return; pki_crl *crl = static_cast<pki_crl*>(index.internalPointer()); if (!crl) return; types << exportType(exportType::PEM, "pem", "PEM") << exportType(exportType::DER, "der", "DER"); ExportDialog *dlg = new ExportDialog(mainwin, tr("Revocation list export"), tr("CRL ( *.pem *.der *.crl )"), crl, MainWindow::revImg, types); if (!dlg->exec()) { delete dlg; return; } QString fname = dlg->filename->text(); try { crl->writeCrl(fname, dlg->type() == exportType::PEM); } catch (errorEx &err) { mainwin->Error(err); } delete dlg; } void db_crl::updateRevocations(pki_x509 *cert) { x509name issname = cert->getSubject(); x509revList revlist; pki_crl *latest = NULL; FOR_ALL_pki(crl, pki_crl) { if (!(issname == crl->getSubject())) continue; pki_key *key = cert->getPubKey(); if (!key) continue; if (!crl->verify(key)) { delete key; continue; } delete key; pki_x509 *old = crl->getIssuer(); if (!old) { crl->setIssuer(cert); } else if (old != cert) { if (old->getNotAfter() < cert->getNotAfter()) crl->setIssuer(cert); } if (!latest || (latest->getCrlNumber() < crl->getCrlNumber())) latest = crl; } if (latest) { revlist = latest->getRevList(); cert->mergeRevList(revlist); cert->setCrlNumber(latest->getCrlNumber()); } } void db_crl::newItem() { bool ok = false; QStringList sl = mainwin->certs->getSignerDesc(); QString ca; switch (sl.size()) { case 0: XCA_INFO(tr("There are no CA certificates for CRL generation")); break; case 1: ca = sl[0]; ok = true; break; default: ca = QInputDialog::getItem(mainwin, XCA_TITLE, tr("Select CA certificate"), sl, 0, false, &ok, 0); } if (!ok) return; pki_x509 *cert = static_cast<pki_x509*> (mainwin->certs->getByName(ca)); newItem(cert); } void db_crl::newItem(pki_x509 *cert) { if (!cert) return; pki_crl *crl = NULL; NewCrl *dlg = new NewCrl(mainwin, cert); if (!dlg->exec()) { delete dlg; return; } 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); bool withReason = dlg->revocationReasons->isChecked(); foreach(x509rev rev, cert->revList) crl->addRev(rev, withReason); 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->setCrlNumber->isChecked()) { a1int num; num.setDec(dlg->crlNumber->text()); crl->setCrlNumber(num); cert->setCrlNumber(num); } 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; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_crl.h������������������������������������������������������������������������������0000664�0000000�0000000�00000001527�12606205164�0014443�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 <QObject> #include <QPixmap> #include <QContextMenuEvent> class db_crl: public db_x509name { Q_OBJECT protected: QPixmap *crlicon; dbheaderList getHeaders(); 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); void removeSigner(pki_base *signer); void store(QModelIndex index); void load(); void showPki(pki_base *pki); void updateCertView(); void updateRevocations(pki_x509 *cert); public slots: void newItem(); void newItem(pki_x509 *cert); }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_key.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000017343�12606205164�0015011�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "db_key.h" #include "pki_evp.h" #include "pki_scard.h" #include <QDialog> #include <QLabel> #include <QPushButton> #include <QMessageBox> #include <QProgressBar> #include <QStatusBar> #include <QContextMenuEvent> #include "exception.h" #include "ui_NewKey.h" #include "pkcs11.h" #include "widgets/PwDialog.h" #include "widgets/ExportDialog.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; updateHeaders(); loadContainer(); } dbheaderList db_key::getHeaders() { dbheaderList h = db_base::getHeaders(); h << new dbheader(HD_key_type, true, tr("Type")) << new dbheader(HD_key_size, true, tr("Size")) << #ifndef OPENSSL_NO_EC new dbheader(HD_key_curve, false,tr("EC Group")) << #endif new dbheader(HD_key_use, true, tr("Use")) << new dbheader(HD_key_passwd, true, tr("Password")); return h; } 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*>(idx.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()){ XCA_INFO( 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 { XCA_INFO( 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()); deletePKI(index(oldkey->row(), 0, 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) { XCA_WARN(tr("Key size too small !")); delete dlg; return; } if (ksize < 1024 || ksize > 8192) if (!XCA_YESNO(tr("You are sure to create a key of the size: %1 ?").arg(ksize))) { 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->getKeytype(), dlg->getKeyCardSlot(), ksize, dlg->getKeyCurve_nid(), 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); } if (dlg->rememberDefault->isChecked()) { QString def = dlg->getAsString(); if (dlg->setDefault(def) == 0) mainwin->setDefaultKey(def); } status->removeWidget(bar); delete bar; delete dlg; } void db_key::load(void) { load_key l; load_default(l); } 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; } } exportType::etype db_key::clipboardFormat(QModelIndexList indexes) { QList<exportType> types; bool allPriv = true; bool allRSADSA = true; foreach(QModelIndex idx, indexes) { pki_key *key = static_cast<pki_key*> (idx.internalPointer()); if (key->isPubKey() || key->isToken()) allPriv = false; if (key->getKeyType() != EVP_PKEY_RSA && key->getKeyType() != EVP_PKEY_DSA) allRSADSA = false; } if (!allPriv && !allRSADSA) return exportType::PEM_key; types << exportType(exportType::PEM_key, "pem", tr("PEM public")); if (allRSADSA) types << exportType(exportType::SSH2_public, "pub", tr("SSH2 public")); if (allPriv) types << exportType(exportType::PEM_private, "pem", tr("PEM private")); ExportDialog *dlg = new ExportDialog(mainwin, tr("Export keys to Clipboard"), QString(), NULL, MainWindow::keyImg, types); dlg->filename->setText(tr("Clipboard")); dlg->filename->setEnabled(false); dlg->fileBut->setEnabled(false); if (!dlg->exec()) { delete dlg; return exportType::Separator; } return dlg->type(); } void db_key::store(QModelIndex index) { const EVP_CIPHER *enc = NULL; QString title = tr("Export public key [%1]"); QList<exportType> types; if (!index.isValid()) return; pki_key *key =static_cast<pki_evp*>(index.internalPointer()); pki_evp *privkey = (pki_evp *)key; types << exportType(exportType::PEM_key, "pem", tr("PEM public")) << exportType(exportType::DER_key, "der", tr("DER public")); if (key->getKeyType() == EVP_PKEY_RSA || key->getKeyType() == EVP_PKEY_DSA) types << exportType(exportType::SSH2_public, "pub", tr("SSH2 public")); if (!key->isPubKey() && !key->isToken()) { QList<exportType> usual; types << exportType(exportType::DER_private, "der", tr("DER private")) << exportType(exportType::PEM_private_encrypt, "pem", tr("PEM encryped")) << exportType(exportType::PKCS8, "pk8", "PKCS#8"); usual << exportType(exportType::PEM_private, "pem", tr("PEM private")) << exportType(exportType::PKCS8_encrypt, "pk8", tr("PKCS#8 encrypted")); title = tr("Export private key [%1]"); types = usual << exportType() << types; } ExportDialog *dlg = new ExportDialog(mainwin, title.arg(key->getTypeString()), tr("Private Keys ( *.pem *.der *.pk8 );; " "SSH Public Keys ( *.pub )"), key, key->isToken() ? MainWindow::scardImg : MainWindow::keyImg, types); if (!dlg->exec()) { delete dlg; return; } QString fname = dlg->filename->text(); try { exportType::etype type = dlg->type(); switch (type) { case exportType::DER_key: key->writePublic(fname, false); break; case exportType::DER_private: privkey->writeKey(fname, NULL, NULL, false); break; case exportType::PEM_key: key->writePublic(fname, true); break; case exportType::PEM_private_encrypt: enc = EVP_des_ede3_cbc(); /* fall */ case exportType::PEM_private: privkey->writeKey(fname, enc, PwDialog::pwCallback, true); break; case exportType::PKCS8_encrypt: enc = EVP_des_ede3_cbc(); /* fall */ case exportType::PKCS8: privkey->writePKCS8(fname, enc, PwDialog::pwCallback, true); break; case exportType::SSH2_public: key->writeSSH2public(fname); break; default: exit(1); } } catch (errorEx &err) { mainwin->Error(err); } delete dlg; } void db_key::setOwnPass(QModelIndex idx, enum pki_key::passType x) { pki_evp *targetKey; if (!idx.isValid()) return; targetKey = static_cast<pki_evp*>(idx.internalPointer()); if (targetKey->isToken()) { throw errorEx(tr("Tried to change password of a token")); } targetKey->setOwnPass(x); updatePKI(targetKey); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_key.h������������������������������������������������������������������������������0000664�0000000�0000000�00000002046�12606205164�0014450�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 <QStringList> #include <QObject> class MainWindow; class QModelIndex; class QContextMenuEvent; class db_key: public db_base { Q_OBJECT protected: virtual dbheaderList getHeaders(); exportType::etype clipboardFormat(QModelIndexList indexes); 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 setOwnPass(QModelIndex idx, enum pki_key::passType); public slots: void newItem(); void newItem(QString name); void load(); void store(QModelIndex index); void showPki(pki_base *pki); signals: void delKey(pki_key *delkey); void newKey(pki_key *newkey); void keyDone(QString name); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_temp.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000007211�12606205164�0015157�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "db_temp.h" #include "func.h" #include <widgets/NewX509.h> #include <widgets/MainWindow.h> #include <QFileDialog> #include <QDir> #include <QContextMenuEvent> #include <QAction> #include <QInputDialog> #include <QMessageBox> db_temp::db_temp(QString DBfile, MainWindow *mw) :db_x509name(DBfile, mw) { class_name = "templates"; pkitype << tmpl; updateHeaders(); 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) { XCA_WARN(tr("Bad template: %1").arg(name)); } } } dbheaderList db_temp::getHeaders() { dbheaderList h = db_x509name::getHeaders(); h << new dbheader(HD_temp_type, true, tr("Type")); return h; } 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, 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::showPki(pki_base *pki) { alterTemp(static_cast<pki_temp *>(pki)); } void db_temp::load() { load_temp l; load_default(l); } void db_temp::store(QModelIndex index) { if (!index.isValid()) return; pki_temp *temp = static_cast<pki_temp*>(index.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 = nativeSeparator(s); mainwin->setPath(s.mid(0, s.lastIndexOf(QRegExp("[/\\\\]")) )); try { temp->writeTemp(s); } catch (errorEx &err) { MainWindow::Error(err); } } bool db_temp::alterTemp(pki_temp *temp) { if (!runTempDlg(temp)) return false; updatePKI(temp); return true; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_temp.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000001436�12606205164�0014627�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 <QObject> #include <QPixmap> class db_temp: public db_x509name { Q_OBJECT protected: QPixmap *keyicon; pki_base *predefs; dbheaderList getHeaders(); 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 fillContextMenu(QMenu *menu, const QModelIndex &index); pki_base *getByName(QString desc); QStringList getDescPredefs(); void newItem(); void showPki(pki_base *pki); void load(); void store(QModelIndex index); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_token.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000001317�12606205164�0015333�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"; updateHeaders(); } 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-1.3.2/lib/db_token.h����������������������������������������������������������������������������0000664�0000000�0000000�00000000773�12606205164�0015005�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 <QObject> #include <QPixmap> #include <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-1.3.2/lib/db_x509.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000063540�12606205164�0014726�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 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 "widgets/RevocationList.h" #include "ui_TrustState.h" #include "ui_CaProperties.h" #include "ui_About.h" #include <QMessageBox> #include <QContextMenuEvent> #include <QAction> bool db_x509::treeview = true; db_x509::db_x509(QString DBfile, MainWindow *mw) :db_x509super(DBfile, mw) { rootItem->setIntName("[x509 root]"); class_name = "certificates"; pkitype << x509; updateHeaders(); loadContainer(); } void db_x509::updateAfterCrlLoad(pki_x509 *pki) { if (pki->revList.merged) { updatePKI(pki); pki->revList.merged = false; } } void db_x509::updateAfterDbLoad() { FOR_ALL_pki(pki, pki_x509) { updateAfterCrlLoad(pki); } } dbheaderList db_x509::getHeaders() { dbheaderList h = db_x509super::getHeaders(); h << 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_sha256fp, false,tr("sha256 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_revocation,false, tr("Revocation")) << new dbheader(HD_cert_crl_expire,true, tr("CRL Expiration")); return h; } 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*>(idx.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(); 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; } void db_x509::calcEffTrust() { FOR_ALL_pki(pki, pki_x509) pki->calcEffTrust(); } static bool recursiveSigning(pki_x509 *cert, pki_x509 *client) { /* recursive signing check */ for (pki_x509 *s = cert->getSigner(); s; s = s->getSigner()) { if (s == s->getSigner()) { return false; } if (s == client) { printf("Recursive signing: '%s' <-> '%s'\n", CCHAR(s->getIntName()), CCHAR(cert->getIntName())); return true; } } return false; } 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 == NULL) root = rootItem; insertChild(root, cert); QList<pki_x509 *> childs; /* Search for another certificate (name and key) * and use its childs if we are newer */ FOR_ALL_pki(client, pki_x509) { if (client == cert) continue; if (!client->compareNameAndKey(cert)) continue; if (cert->getNotAfter() < client->getNotAfter()) continue; foreach(pki_base *_child, client->childItems) { pki_x509 *child = static_cast<pki_x509*>(_child); child->delSigner(client); childs << child; } } /* Search rootItem childs, whether they are ours */ foreach(pki_base *_child, rootItem->childItems) { pki_x509 *child = static_cast<pki_x509*>(_child); if (child == cert || child->getSigner() == child) continue; if (child->verify_only(cert)) childs << child; } /* move collected childs to us */ foreach(pki_x509 *child, childs) { int row; if (recursiveSigning(cert, child)) continue; if (!child->verify(cert)) continue; row = child->row(); beginRemoveRows(index(child), row, row); child->getParent()->takeChild(child); endRemoveRows(); if (treeview) insertChild(cert, child); else insertChild(rootItem, child); } 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(); } 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::writeAllCerts(const QString fname, bool onlyTrusted) { bool append = false; FOR_ALL_pki(pki, pki_x509) { if (onlyTrusted && pki->getTrust() != 2) continue; pki->writeCert(fname.toLatin1(), 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; x509rev rev; while (true) { serial = signer->getIncCaSerial(); rev.setSerial(serial); if (signer->revList.contains(rev)) continue; if (signer->getBySerial(serial)) continue; break; } 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) { XCA_INFO(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); } if (mainwin->crls) { mainwin->crls->updateRevocations(cert); } updatePKI(cert); return cert; } void db_x509::load(void) { load_cert c; load_default(c); } 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(pki_x509 *cert) { NewX509 *dlg = new NewX509(mainwin); emit connNewX509(dlg); dlg->setCert(); dlg->defineCert(cert); 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 (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 // apply all extensions to the subject cert in the context dlg->getAllExt(); // apply extensions from CSR if requested 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], true); } 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 (XCA_YESNO(tr("Store the certificate to the key on the token '%1 (#%2)' ?"). arg(card->getCardLabel()).arg(card->getSerial()))) { 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::store(QModelIndex idx) { QModelIndexList l; l << idx; store(l); } void db_x509::store(QModelIndexList list) { QStringList filt; bool append, chain; QList<exportType> types, usual; if (list.size() == 0) return; pki_x509 *crt = static_cast<pki_x509*>(list[0].internalPointer()); pki_x509 *oldcrt = NULL; if (!crt) return; pki_key *privkey = crt->getRefKey(); pki_evp *pkey; chain = crt->getSigner() && crt->getSigner() != crt; usual << exportType(exportType::PEM, "crt", "PEM") << exportType(exportType::PKCS7, "p7b", "PKCS #7"); types << exportType(exportType::DER, "cer", "DER"); if (list.size() > 1) { usual << exportType(exportType::PEM_selected, "pem", "PEM selected") << exportType(exportType::PKCS7_selected, "pem", "PKCS7 selected"); } if (chain) { types << exportType(exportType::PEM_chain, "pem", tr("PEM chain")) << exportType(exportType::PKCS7_chain, "p7b", tr("PKCS #7 chain")); } if (privkey && privkey->isPrivKey() && !privkey->isToken()) { if (chain) { usual << exportType(exportType::PKCS12_chain, "p12", tr("PKCS #12 chain")); types << exportType(exportType::PKCS12, "p12", "PKCS #12"); } else { usual << exportType(exportType::PKCS12, "p12", "PKCS #12"); } types << exportType(exportType::PEM_cert_key, "pem", tr("PEM + key")) << exportType(exportType::PEM_cert_pk8, "pem", "PEM + PKCS#8"); } types << exportType() << exportType(exportType::PKCS7_trusted, "p7b", tr("PKCS #7 trusted")) << exportType(exportType::PKCS7_all, "p7b", tr("PKCS #7 all")) << exportType(exportType::PEM_trusted, "pem", tr("PEM trusted")) << exportType(exportType::PEM_all, "pem", tr("PEM all")); types = usual << exportType() << types; ExportDialog *dlg = new ExportDialog(mainwin, tr("Certificate export"), tr("X509 Certificates ( *.pem *.cer *.crt *.p12 *.p7b )"), crt, MainWindow::certImg, types); if (!dlg->exec()) { delete dlg; return; } QString fname = dlg->filename->text(); enum exportType::etype type = dlg->type(); delete dlg; try { switch (type) { case exportType::PEM: crt->writeCert(fname, true, false); break; case exportType::PEM_chain: append = false; while(crt && crt != oldcrt) { crt->writeCert(fname, true, append); append = true; oldcrt = crt; crt = crt->getSigner(); } break; case exportType::PEM_selected: append = false; foreach(QModelIndex idx, list) { crt = static_cast<pki_x509*>(idx.internalPointer()); crt->writeCert(fname, true, append); append = true; } break; case exportType::PEM_trusted: writeAllCerts(fname,true); break; case exportType::PEM_all: writeAllCerts(fname,false); break; case exportType::DER: crt->writeCert(fname,false,false); break; case exportType::PKCS7: case exportType::PKCS7_chain: case exportType::PKCS7_trusted: case exportType::PKCS7_selected: case exportType::PKCS7_all: writePKCS7(crt, fname, type, list); break; case exportType::PKCS12: writePKCS12(crt, fname,false); break; case exportType::PKCS12_chain: writePKCS12(crt, fname,true); break; case exportType::PEM_cert_pk8: case exportType::PEM_cert_key: pkey = (pki_evp *)crt->getRefKey(); if (!pkey || pkey->isPubKey()) { XCA_WARN(tr("There was no key found for the Certificate: '%1'"). arg(crt->getIntName())); return; } if (pkey->isToken()) { XCA_WARN(tr("Not possible for a token key: '%1'"). arg(crt->getIntName())); return; } if (type == exportType::PEM_cert_pk8) { pkey->writePKCS8(fname, EVP_des_ede3_cbc(), PwDialog::pwCallback, true); } else { pkey->writeKey(fname, NULL, NULL, true); } crt->writeCert(fname, true, true); break; default: exit(1); } } catch (errorEx &err) { MainWindow::Error(err); } } 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()) { XCA_WARN(tr("There was no key found for the Certificate: '%1'").arg(cert->getIntName())); return; } if (privkey->isToken()) { XCA_WARN(tr("Not possible for the token-key Certificate '%1'"). arg(cert->getIntName())); return; } if (s.isEmpty()) return; s = nativeSeparator(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, exportType::etype type, QModelIndexList list) { pki_pkcs7 *p7 = NULL; try { p7 = new pki_pkcs7(""); switch (type) { case exportType::PKCS7_chain: while (cert != NULL) { p7->addCert(cert); if (cert->getSigner() == cert) cert = NULL; else cert = cert->getSigner(); } break; case exportType::PKCS7: p7->addCert(cert); break; case exportType::PKCS7_selected: foreach(QModelIndex idx, list) { cert = static_cast<pki_x509*>(idx.internalPointer()); p7->addCert(cert); } break; case exportType::PKCS7_trusted: case exportType::PKCS7_all: FOR_ALL_pki(cer, pki_x509) { if ((type == exportType::PKCS7_all) || (cer->getTrust() == 2)) p7->addCert(cer); } break; default: exit(1); } p7->writeP7(s, false); } catch (errorEx &err) { MainWindow::Error(err); } if (p7 != NULL ) delete p7; } void db_x509::manageRevocations(QModelIndex idx) { pki_x509 *cert = static_cast<pki_x509*>(idx.internalPointer()); if (!cert) return; RevocationList *dlg = new RevocationList(mainwin); dlg->setRevList(cert->revList, cert); connect(dlg, SIGNAL(genCRL(pki_x509*)), mainwin->crls, SLOT(newItem(pki_x509*))); if (dlg->exec()) { cert->setRevocations(dlg->getRevList()); updatePKI(cert); emit columnsContentChanged(); } } void db_x509::setTrust(QModelIndexList indexes) { int newstate = -1; Ui::TrustState ui; pki_x509 *cert = NULL; if (indexes.size() == 0) return; if (indexes.size() == 1) cert = static_cast<pki_x509*>(indexes[0].internalPointer()); QDialog *dlg = new QDialog(mainwin); ui.setupUi(dlg); ui.image->setPixmap(*MainWindow::certImg); if (cert) { int 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); } if (!dlg->exec()) { delete dlg; return; } if (ui.trust0->isChecked()) newstate = 0; if (ui.trust1->isChecked()) newstate = 1; if (ui.trust2->isChecked()) newstate = 2; delete dlg; if (newstate == -1) { return; } foreach(QModelIndex idx, indexes) { cert = static_cast<pki_x509*>(idx.internalPointer()); if (newstate != cert->getTrust()) { cert->setTrust(newstate); updatePKI(cert); } } } void db_x509::certRenewal(QModelIndexList indexes) { pki_x509 *oldcert = NULL, *signer = NULL, *newcert =NULL; pki_key *signkey = NULL; a1time time; a1int serial; CertExtend *dlg = NULL; x509rev r; bool doRevoke = false; if (indexes.size() == 0) return; QModelIndex idx = indexes[0]; try { oldcert = static_cast<pki_x509*>(idx.internalPointer()); if (!oldcert || !(signer = oldcert->getSigner()) || !(signkey = signer->getRefKey()) || signkey->isPubKey()) return; CertExtend *dlg = new CertExtend(mainwin, signer); if (!dlg->exec()) { delete dlg; return; } if (dlg->revoke->isChecked()) { Revocation *revoke = new Revocation(mainwin, indexes); doRevoke = revoke->exec(); r = revoke->getRevocation(); delete revoke; } foreach(idx, indexes) { oldcert = static_cast<pki_x509*> (idx.internalPointer()); newcert = new pki_x509(oldcert); serial = getUniqueSerial(signer); newcert->setRevoked(x509rev()); // 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); } if (doRevoke) do_revoke(indexes, r); } catch (errorEx &err) { MainWindow::Error(err); if (newcert) delete newcert; } if (dlg) delete dlg; emit columnsContentChanged(); } void db_x509::revoke(QModelIndexList indexes) { if (indexes.size() == 0) return; Revocation *revoke = new Revocation(mainwin, indexes); if (revoke->exec()) { do_revoke(indexes, revoke->getRevocation()); } emit columnsContentChanged(); } void db_x509::do_revoke(QModelIndexList indexes, const x509rev &r) { pki_x509 *parent = NULL, *cert, *iss; x509revList revlist; foreach(QModelIndex idx, indexes) { cert = static_cast<pki_x509*>(idx.internalPointer()); iss = cert->getSigner(); if (parent == NULL) { parent = iss; } else if (parent != iss) { parent = NULL; break; } } if (!parent) { qWarning("%s(%d): Certs have different/no signer\n", __func__, __LINE__); } foreach(QModelIndex idx, indexes) { pki_x509 *cert = static_cast<pki_x509*>(idx.internalPointer()); x509rev rev(r); rev.setSerial(cert->getSerial()); cert->setRevoked(rev); revlist << rev; } parent->mergeRevList(revlist); updatePKI(parent); } void db_x509::unRevoke(QModelIndexList indexes) { pki_x509 *parent = NULL; foreach(QModelIndex idx, indexes) { pki_x509 *cert = static_cast<pki_x509*>(idx.internalPointer()); if (!cert) return; pki_x509 *iss = cert->getSigner(); if (parent == NULL) { parent = iss; } else if (parent != iss) { parent = NULL; break; } } if (!parent) { qWarning("%s(%d): Certs have different/no signer\n", __func__, __LINE__); } foreach(QModelIndex idx, indexes) { pki_x509 *cert = static_cast<pki_x509*>(idx.internalPointer()); int i; x509rev rev; cert->setRevoked(x509rev()); rev.setSerial(cert->getSerial()); i = parent->revList.indexOf(rev); if (i != -1) parent->revList.takeAt(i); } updatePKI(parent); emit columnsContentChanged(); } void db_x509::toCertificate(QModelIndex index) { pki_x509 *cert = static_cast<pki_x509*>(index.internalPointer()); if (!cert) return; if (!cert->getRefKey() && cert->getSigner() != cert) extractPubkey(index); newCert(cert); } void db_x509::toRequest(QModelIndex idx) { pki_x509 *cert = static_cast<pki_x509*>(idx.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::toToken(QModelIndex idx, bool alwaysSelect) { pki_x509 *cert = static_cast<pki_x509*>(idx.internalPointer()); if (!cert) return; try { cert->store_token(alwaysSelect); } catch (errorEx &err) { mainwin->Error(err); } } void db_x509::caProperties(QModelIndex idx) { Ui::CaProperties ui; int i; pki_x509 *cert = static_cast<pki_x509*>(idx.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-1.3.2/lib/db_x509.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000004377�12606205164�0014376�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 <QListView> #include <QPixmap> #include <QTreeWidget> #include "widgets/ExportDialog.h" #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(); dbheaderList getHeaders(); public: static bool treeview; db_x509(QString DBfile, MainWindow *mw); pki_base *newPKI(db_header_t *head = NULL); pki_x509 *findSigner(pki_x509 *client); void updateAfterDbLoad(); void updateAfterCrlLoad(pki_x509 *pki); bool updateView(); void updateViewAll(); void updateViewPKI(pki_base *pki); void remFromCont(QModelIndex &idx); QStringList getPrivateDesc(); QStringList getSignerDesc(); void calcEffTrust(); 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 newCert(pki_x509 *cert); void writePKCS12(pki_x509 *cert, QString s, bool chain); void writePKCS7(pki_x509 *cert, QString s, exportType::etype type, QModelIndexList list); void fillContextMenu(QMenu *menu, const QModelIndex &index); void inToCont(pki_base *pki); void changeView(); a1int getUniqueSerial(pki_x509 *signer); void toToken(QModelIndex idx, bool alwaysSelect); void toRequest(QModelIndex idx); void store(QModelIndex idx); void store(QModelIndexList list); void showPki(pki_base *pki); void load(); void caProperties(QModelIndex idx); void toCertificate(QModelIndex index); void manageRevocations(QModelIndex idx); void certRenewal(QModelIndexList indexes); void revoke(QModelIndexList indexes); void do_revoke(QModelIndexList indexes, const x509rev &r); void unRevoke(QModelIndexList indexes); void setTrust(QModelIndexList indexes); public slots: void newItem(); void newCert(pki_temp *); void newCert(pki_x509req *); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_x509req.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000007320�12606205164�0015430�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "db_x509req.h" #include "pki_x509req.h" #include "widgets/CertDetail.h" #include "widgets/MainWindow.h" #include <QMessageBox> #include <QContextMenuEvent> #include <QAction> db_x509req::db_x509req(QString DBfile, MainWindow *mw) :db_x509super(DBfile, mw) { class_name = "requests"; pkitype << x509_req; updateHeaders(); loadContainer(); } dbheaderList db_x509req::getHeaders() { dbheaderList h = db_x509super::getHeaders(); h << 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))); return h; } 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) { XCA_INFO(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() { newItem(NULL, NULL); } void db_x509req::newItem(pki_temp *temp, pki_x509req *orig) { pki_x509req *req = NULL; NewX509 *dlg = new NewX509(mainwin); emit connNewX509(dlg); if (temp) { dlg->defineTemplate(temp); } else if (orig) { dlg->fromX509super(orig); } 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->getReqAttributes(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::toRequest(QModelIndex index) { pki_x509req *req = static_cast<pki_x509req*>(index.internalPointer()); if (!req) return; newItem(NULL, 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(QModelIndex index) { QList<exportType> types; pki_x509req *req = static_cast<pki_x509req*>(index.internalPointer()); if (!req) return; types << exportType(exportType::PEM, "pem", "PEM") << exportType(exportType::DER, "der", "DER"); ExportDialog *dlg = new ExportDialog(mainwin, tr("Certificate request export"), tr("Certificate request ( *.pem *.der *.csr )"), req, MainWindow::csrImg, types); if (!dlg->exec()) { delete dlg; return; } QString fname = dlg->filename->text(); try { req->writeReq(fname, dlg->type() == exportType::PEM); } catch (errorEx &err) { mainwin->Error(err); } delete dlg; } void db_x509req::signReq(QModelIndex index) { pki_x509req *req = static_cast<pki_x509req*>(index.internalPointer()); emit newCert(req); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_x509req.h��������������������������������������������������������������������������0000664�0000000�0000000�00000001551�12606205164�0015075�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 protected: dbheaderList getHeaders(); public: db_x509req(QString DBfile, MainWindow *mw); pki_base* insert(pki_base *item); pki_base *newPKI(db_header_t *head = NULL); void fillContextMenu(QMenu *menu, const QModelIndex &index); void inToCont(pki_base *pki); void store(QModelIndex index); void signReq(QModelIndex index); void toRequest(QModelIndex index); void load(); void showPki(pki_base *pki); public slots: void newItem(pki_temp *temp, pki_x509req *orig = NULL); void newItem(); signals: void newCert(pki_x509req *req); }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/db_x509super.cpp����������������������������������������������������������������������0000664�0000000�0000000�00000010450�12606205164�0015775�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_base.h" #include "db_x509super.h" #include "widgets/MainWindow.h" #include "ui_About.h" #include "oid.h" #include <QMessageBox> db_x509name::db_x509name(QString db, MainWindow *mw) :db_base(db, mw) { } dbheaderList db_x509name::getHeaders() { dbheaderList h = db_base::getHeaders(); h << 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")); foreach(int nid, *MainWindow::dn_nid) h << new nid_dbheader(nid, dbheader::hd_x509name); return h; } db_x509super::db_x509super(QString db, MainWindow *mw) :db_x509name(db, mw) { } dbheaderList db_x509super::getHeaders() { dbheaderList h = db_x509name::getHeaders(); NIDlist v3nid, v3ns_nid; 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; v3ns_nid << 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; h << new dbheader(HD_x509key_name, false, tr("Key name"), tr("Internal name of the key")) << new dbheader(HD_x509_sigalg, false, tr("Signature Algorithm")); foreach(int nid, v3nid) h << new nid_dbheader(nid, dbheader::hd_v3ext); foreach(int nid, v3ns_nid) h << new nid_dbheader(nid, dbheader::hd_v3ext_ns); return 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(QModelIndex index) { pki_key *key; pki_x509super *pki = static_cast<pki_x509super*> (index.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; XCA_INFO(key->getMsg(pki_base::msg_import).arg(pki->getIntName())); } void db_x509super::toOpenssl(QModelIndex index) const { pki_x509super *pki = static_cast<pki_x509super*>(index.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 = nativeSeparator(fname); mainwin->setPath(fname.mid(0, fname.lastIndexOf(QRegExp("[/\\\\]")) )); pki->opensslConf(fname); } void db_x509super::toTemplate(QModelIndex index) { pki_x509super *pki = static_cast<pki_x509super*>(index.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-1.3.2/lib/db_x509super.h������������������������������������������������������������������������0000664�0000000�0000000�00000001510�12606205164�0015437�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 <QList> #include <QMap> class db_x509name: public db_base { Q_OBJECT protected: dbheaderList getHeaders(); public: db_x509name(QString db, MainWindow *mw); }; class db_x509super: public db_x509name { Q_OBJECT protected: dbheaderList getHeaders(); public: db_x509super(QString db, MainWindow *mw); pki_key *findKey(pki_x509super *ref); QList<pki_x509super *> findByPubKey(pki_key *refkey); void extractPubkey(QModelIndex index); void toTemplate(QModelIndex index); void toOpenssl(QModelIndex index) const; public slots: void delKey(pki_key *delkey); void newKey(pki_key *newKey); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/entropy.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000005625�12606205164�0015254�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <QFile> #include <QDir> #include <openssl/rand.h> #include "func.h" #include "entropy.h" #ifdef WIN32 /* On Windows O_NONBLOCK is an unknown concept :-) * We don't need it anyway on that platform .... */ #define EWOULDBLOCK EAGAIN #define O_NONBLOCK 0 #endif #undef DEBUG_ENTROPY #define pool_siz (sizeof(pool)/sizeof(pool[0])) unsigned char Entropy::pool[512]; unsigned Entropy::pool_pos = 0; QTime Entropy::timer; unsigned Entropy::seed_strength = 0; void Entropy::add(int rand) { unsigned char entropy = (rand ^ timer.elapsed()) & 0xff; pool[pool_pos++ % pool_siz] = entropy; } void Entropy::add_buf(const unsigned char *buf, int buflen) { RAND_seed(buf, buflen); seed_strength += buflen; } int Entropy::get(unsigned char *buf, int num) { seed_rng(); return RAND_bytes(buf, num); } void Entropy::seed_rng() { if (pool_pos > pool_siz) pool_pos = pool_siz; RAND_seed(pool, pool_pos); seed_strength += pool_pos; #ifdef WIN32 if (seed_strength < 16) { RAND_screen(); seed_strength += 8; } #else random_from_file("/dev/random", 64); random_from_file("/dev/hwrng", 64); #endif #ifdef DEBUG_ENTROPY fprintf(stderr, "Seeding %d bytes:", pool_pos); for (unsigned i=0; i<pool_pos; i++) fprintf(stderr, " %02x", pool[i]); fprintf(stderr, "\nEntropy strength: %d\n", seed_strength); #endif pool_pos = 0; } int Entropy::random_from_file(QString fname, unsigned amount, int weakness) { char buf[256]; const char *file; int fd, sum; QByteArray ba; ba = filename2bytearray(fname); file = ba.constData(); fd = open(file, O_RDONLY | O_NONBLOCK); if (fd == -1) return 0; for (sum=0; amount > 0;) { int len = read(fd, buf, amount > sizeof buf ? sizeof buf : amount); if (len > 0) { RAND_seed(buf, len); seed_strength += len / weakness; amount -= len; sum += len; } if (len == -1) { if (errno != EWOULDBLOCK) qWarning("Error '%s' while reading '%s'\n", strerror(errno), file); len = 0; } if (len == 0) break; } close(fd); #ifdef DEBUG_ENTROPY fprintf(stderr, "Entropy from file '%s' = %d bytes\n", file, sum); #endif return sum; } unsigned Entropy::strength() { return seed_strength; } Entropy::Entropy() { timer.start(); rnd = getUserSettingsDir() + QDir::separator() + ".rnd"; random_from_file(rnd, 1024, 128); QFile::remove(rnd); // don't use it again } Entropy::~Entropy() { QFile f(rnd); if (f.open(QIODevice::ReadWrite)) { unsigned char buf[1024]; seed_rng(); f.setPermissions(QFile::ReadOwner|QFile::WriteOwner); RAND_pseudo_bytes(buf, sizeof buf); f.write((char*)buf, sizeof buf); f.close(); } #ifdef DEBUG_ENTROPY fprintf(stderr, "Seed strength: %d\n", seed_strength); #endif } �����������������������������������������������������������������������������������������������������������xca-1.3.2/lib/entropy.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000001255�12606205164�0014714�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __ENTROPY_H #define __ENTROPY_H #include <QString> #include <QByteArray> #include <QTime> class Entropy { protected: QString rnd; static QTime timer; static unsigned char pool[512]; static unsigned pool_pos; static unsigned seed_strength; static int random_from_file(QString fname, unsigned amount, int weakness=1); public: Entropy(); ~Entropy(); static void add(int rand); static void add_buf(const unsigned char *buf, int buflen); static int get(unsigned char *buf, int num); static void seed_rng(); static unsigned strength(); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/exception.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001624�12606205164�0015212�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 <QString> #include <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.toLatin1(); } 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-1.3.2/lib/func.cpp������������������������������������������������������������������������������0000664�0000000�0000000�00000030453�12606205164�0014504�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 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 <QDesktopServices> #endif #include <QDir> #include <QFile> #include <QStringList> #include <QLabel> #include <QLineEdit> #include <QComboBox> #include <QMessageBox> #include <QApplication> #include <QPushButton> #include <QProgressBar> #include <QTextEdit> #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); } 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) { XCA_WARN("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){ XCA_WARN("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 #ifndef XCA_PREFIX #define XCA_PREFIX PREFIX "/share/xca" #endif return QString(XCA_PREFIX); #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(const ASN1_OBJECT *a, int no_name) { char buf[512]; int len; len = OBJ_obj2txt(buf, 256, a, no_name); openssl_error(); return QString::fromLatin1(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)); #else (void)txt; (void)file; (void)line; #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; } bool translate_dn = false; QMap<int, QString> dn_translations; void dn_translations_setup() { dn_translations[NID_countryName] = QObject::tr("Country code"); dn_translations[NID_stateOrProvinceName] = QObject::tr("State or Province"); dn_translations[NID_localityName] = QObject::tr("Locality"); dn_translations[NID_organizationName] = QObject::tr("Organisation"); dn_translations[NID_organizationalUnitName] = QObject::tr("Organisational unit"); dn_translations[NID_commonName] = QObject::tr("Common name"); dn_translations[NID_pkcs9_emailAddress] = QObject::tr("E-Mail address"); dn_translations[NID_serialNumber] = QObject::tr("Serial number"); dn_translations[NID_givenName] = QObject::tr("Given name"); dn_translations[NID_surname] = QObject::tr("Surname"); dn_translations[NID_title] = QObject::tr("Title"); dn_translations[NID_initials] = QObject::tr("Initials"); dn_translations[NID_description] = QObject::tr("Description"); dn_translations[NID_role] = QObject::tr("Role"); dn_translations[NID_pseudonym] = QObject::tr("Pseudonym"); dn_translations[NID_generationQualifier] = QObject::tr("Generation Qualifier"); dn_translations[NID_x500UniqueIdentifier] = QObject::tr("x500 Unique Identifier"); dn_translations[NID_name] = QObject::tr("Name"); dn_translations[NID_dnQualifier] = QObject::tr("DN Qualifier"); dn_translations[NID_pkcs9_unstructuredName] = QObject::tr("Unstructured name"); dn_translations[NID_pkcs9_challengePassword] = QObject::tr("Challenge password"); dn_translations[NID_basic_constraints] = QObject::tr("Basic Constraints"); dn_translations[NID_subject_alt_name] = QObject::tr("subject alternative name"); dn_translations[NID_issuer_alt_name] = QObject::tr("issuer alternative name"); dn_translations[NID_subject_key_identifier] = QObject::tr("Subject key identifier"); dn_translations[NID_authority_key_identifier] = QObject::tr("Authority key identifier"); dn_translations[NID_key_usage] = QObject::tr("Key usage"); dn_translations[NID_ext_key_usage] = QObject::tr("Extended key usage"); dn_translations[NID_crl_distribution_points] = QObject::tr("CRL distribution points"); dn_translations[NID_info_access] = QObject::tr("Authority information access"); dn_translations[NID_netscape_cert_type] = QObject::tr("Certificate type"); dn_translations[NID_netscape_base_url] = QObject::tr("Base URL"); dn_translations[NID_netscape_revocation_url] = QObject::tr("Revocation URL"); dn_translations[NID_netscape_ca_revocation_url] = QObject::tr("CA Revocation URL"); dn_translations[NID_netscape_renewal_url] = QObject::tr("Certificate renewal URL"); dn_translations[NID_netscape_ca_policy_url] = QObject::tr("CA policy URL"); dn_translations[NID_netscape_ssl_server_name] = QObject::tr("SSL server name"); dn_translations[NID_netscape_comment] = QObject::tr("Comment"); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/func.h��������������������������������������������������������������������������������0000664�0000000�0000000�00000003753�12606205164�0014154�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 <stdio.h> #include <openssl/asn1.h> #include <QPixmap> #include <QByteArray> #include <QMap> #include "base.h" class Validity; QPixmap *loadImg(const char *name); QString getPrefix(); QString getHomeDir(); QString getLibDir(); QString getDocDir(); QString getUserSettingsDir(); 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(const ASN1_OBJECT *a, int no_name = 0); void inc_progress_bar(int, int, void *p); extern bool translate_dn; extern QMap<int, QString> dn_translations; void dn_translations_setup(); #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() static inline FILE *fopen_read(QString s) { return fopen(QString2filename(s), "rb"); } static inline FILE *fopen_write(QString s) { return fopen(QString2filename(s), "wb"); } #endif ���������������������xca-1.3.2/lib/headerlist.h��������������������������������������������������������������������������0000664�0000000�0000000�00000011246�12606205164�0015341�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2010 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __HEADERLIST_H #define __HEADERLIST_H #include <QString> #include <QList> #include <QAction> #include <QHeaderView> #include <openssl/objects.h> #include "db.h" #include "func.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_counter -6 #define HD_x509_sigalg -7 #define HD_cert_serial -10 #define HD_cert_notBefore -11 #define HD_cert_notAfter -12 #define HD_cert_trust -13 #define HD_cert_revocation -14 #define HD_cert_ca -15 #define HD_cert_md5fp -16 #define HD_cert_sha1fp -17 #define HD_cert_sha256fp -18 #define HD_cert_crl_expire -19 #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 #define HD_key_curve -54 class dbheader { protected: void init() { id = HD_undef; action = NULL; show = showDefault = false; size = -1; visualIndex = -1; sortIndicator = -1; type = hd_default; } QString name, tooltip; public: enum hdr_type { hd_default, hd_x509name, hd_v3ext, hd_v3ext_ns, }; int id; bool show; bool showDefault; virtual QString getName() { return name; } virtual QString getTooltip() { return tooltip; } QAction *action; int size; int visualIndex; int sortIndicator; enum hdr_type type; #if 1 dbheader(QString aname = QString()) { init(); name = aname; } #endif dbheader(int aid, bool ashow, QString aname = QString(), QString atip = QString()) { init(); id = aid; name = aname; tooltip = atip; show = showDefault = ashow; } virtual ~dbheader() { } 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_counter: 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 HD_cert_sha256fp: 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 nid_dbheader : public dbheader { private: QString sn; public: nid_dbheader(int aid, enum hdr_type atype) : dbheader(aid, aid == NID_commonName) { type = atype; tooltip = dn_translations[id]; name = OBJ_nid2ln(id); sn = OBJ_nid2sn(id); if (tooltip.isEmpty()) tooltip = name; } QString getName() { return translate_dn ? tooltip : name; } QString getTooltip() { return QString("[%1] %2").arg(sn) .arg(translate_dn ? name : tooltip); } }; class dbheaderList: public QList<dbheader*> { public: dbheaderList(dbheader *h) :QList<dbheader*>() { append(h); } dbheaderList() :QList<dbheader*>() { } 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); } } } }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/import.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000006527�12606205164�0015070�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 <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-1.3.2/lib/load_obj.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000006317�12606205164�0015324�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 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 );;" "SSH Public Keys ( *.pub );;") + 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-1.3.2/lib/load_obj.h����������������������������������������������������������������������������0000664�0000000�0000000�00000002273�12606205164�0014766�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 <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-1.3.2/lib/main.cpp������������������������������������������������������������������������������0000664�0000000�0000000�00000015034�12606205164�0014473�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #include <signal.h> #include <QApplication> #include <QTranslator> #include <QTextCodec> #include <QDir> #include <QDirIterator> #include <QFile> #include <QDebug> #include <openssl/rand.h> #include "widgets/MainWindow.h" #include "lib/func.h" #include "lib/db.h" #include "lib/main.h" #include "lib/entropy.h" #ifdef WIN32 #include <windows.h> #endif QLocale XCA_application::lang = QLocale::system(); QFont XCA_application::tableFont; QList<QLocale> XCA_application::langAvail; void XCA_application::setMainwin(MainWindow *m) { mainw = m; } bool XCA_application::languageAvailable(QLocale l) { return langAvail.contains(l); } XCA_application::XCA_application(int &argc, char *argv[]) :QApplication(argc, argv) { qtTr = NULL; xcaTr = NULL; mainw = NULL; QFile file(getUserSettingsDir() + QDir::separator() + "defaultlang"); if (file.open(QIODevice::ReadOnly)) { lang = QLocale(QString(file.read(128))); } langAvail << QLocale::system(); langAvail << QString("en"); QDirIterator qmIt(getPrefix(), QStringList() << "*.qm", QDir::Files); while (qmIt.hasNext()) { XcaTranslator t; qmIt.next(); QString language = qmIt.fileInfo().baseName().mid(4, -1); if (t.load(language, "xca", getPrefix())) langAvail << QLocale(language); } setupLanguage(lang); #ifdef Q_WS_MAC QStringList libp = libraryPaths(); libp.prepend(applicationDirPath() + "/../Plugins"); setLibraryPaths(libp); #endif tableFont = QFont("Courier", QApplication::font().pointSize() #if defined(_WIN32) || defined(USE_CYGWIN) +1 #else +2 #endif ); installEventFilter(this); } void XCA_application::setupLanguage(QLocale l) { QStringList dirs; lang = l; if (qtTr) { removeTranslator(qtTr); delete qtTr; } qtTr = new XcaTranslator(); if (xcaTr) { removeTranslator(xcaTr); delete xcaTr; } xcaTr = new XcaTranslator(); dirs #ifdef XCA_DEFAULT_QT_TRANSLATE << XCA_DEFAULT_QT_TRANSLATE #endif << getPrefix() #ifndef WIN32 #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) << "/usr/local/share/qt5/translations/" << "/usr/share/qt5/translations/" #else << "/usr/local/share/qt4/translations/" << "/usr/share/qt4/translations/" #endif << "/usr/share/qt/translations/" #endif ; foreach(QString dir, dirs) { if (qtTr->load(lang, "qt", dir)) { break; } } xcaTr->load(lang, "xca", getPrefix()); installTranslator(qtTr); installTranslator(xcaTr); } void XCA_application::switchLanguage(QAction* a) { QLocale lang = a->data().toLocale(); setupLanguage(lang); QString dir = getUserSettingsDir(); QFile file(dir +QDir::separator() +"defaultlang"); if (lang == QLocale::system()) { file.remove(); return; } QDir d; d.mkpath(dir); if (file.open(QIODevice::WriteOnly)) { file.write(lang.name().toUtf8()); } } bool XCA_application::eventFilter(QObject *watched, QEvent *ev) { static int mctr; QMouseEvent *me; QStringList l; int key; (void)watched; switch (ev->type()) { case QEvent::FileOpen: l << static_cast<QFileOpenEvent *>(ev)->file(); mainw->openURLs(l); return true; case QEvent::MouseMove: case QEvent::NonClientAreaMouseMove: if (mctr++ > 8) { me = static_cast<QMouseEvent *>(ev); entropy.add(me->globalX()); entropy.add(me->globalY()); mctr = 0; } break; case QEvent::KeyPress: key = static_cast<QKeyEvent *>(ev)->key(); if (key < 0x100) { entropy.add(key); } break; default: break; } return false; } XCA_application::~XCA_application() { } int usage_extract(char *argv[]) { fprintf(stderr, "Usage: %s %s <database> <type> <name>\n" " database : the filename of the database\n" " type : one of 'crl' 'cert' 'req'\n", argv[0], argv[1]); return 1; } int main_extract(int argc, char *argv[]) { QFile dbfile; enum pki_type pkitype = none; unsigned char *p; db_header_t head; QString pkiname, name, fname; pki_base *pki; BIO *b; Entropy e; if (argc != 5) { fprintf(stderr, "Wrong number of arguments\n"); return usage_extract(argv); } fname = filename2QString(argv[2]); dbfile.setFileName(fname); if (!dbfile.exists()) { fprintf(stderr, "Database '%s' not found\n",argv[2]); return usage_extract(argv); } pkiname = argv[3]; if (pkiname == "cert") pkitype = x509; else if (pkiname == "crl") pkitype = revocation; else if (pkiname == "req") pkitype = x509_req; else { fprintf(stderr, "Invalid type: '%s'\n", argv[3]); return usage_extract(argv); } db mydb(fname); name = argv[4]; if (mydb.find(pkitype, name)) { fprintf(stderr, "Item of type %s with name '%s' not found.\n", argv[3], argv[4]); return usage_extract(argv); } p = mydb.load(&head); if (!p) { fprintf(stderr, "Load was empty !"); return usage_extract(argv); } name = QString::fromUtf8(head.name); switch (pkitype) { case x509: pki = new pki_x509(name); break; case x509_req: pki = new pki_x509req(name); break; case revocation: pki = new pki_crl(name); break; default: return usage_extract(argv); } if (pki->getVersion() < head.version) { fprintf(stderr, "Item[%s]: Version %d > known version: %d", head.name, head.version, pki->getVersion()); free(p); delete pki; return usage_extract(argv); } pki->setIntName(QString::fromUtf8(head.name)); try { pki->fromData(p, &head); } catch (errorEx &err) { fprintf(stderr, "Failed to load item from database: %s", CCHAR(err.getString())); } b = BIO_new_fp(stdout, BIO_NOCLOSE); pki->pem(b); BIO_free(b); return 0; } char segv_data[1024]; #ifdef WIN32 static LONG CALLBACK w32_segfault(LPEXCEPTION_POINTERS e) { if (e->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { if (segv_data[0]) { XCA_WARN(QString(segv_data)); abort(); } return EXCEPTION_CONTINUE_EXECUTION; } else return EXCEPTION_CONTINUE_SEARCH; } #else static void segv_handler_gui(int) { if (segv_data[0]) XCA_WARN(QString(segv_data)); abort(); } #endif int main( int argc, char *argv[] ) { int ret = 0, pkictr; MainWindow *mw; #ifdef WIN32 SetUnhandledExceptionFilter(w32_segfault); #else signal(SIGSEGV, segv_handler_gui); #endif if (QString(argv[1]) == "extract") { return main_extract(argc, argv); } XCA_application a(argc, argv); mw = new MainWindow(NULL); try { a.setMainwin(mw); mw->read_cmdline(argc, argv); if (mw->exitApp == 0) { mw->load_history(); 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-1.3.2/lib/main.h��������������������������������������������������������������������������������0000664�0000000�0000000�00000002424�12606205164�0014137�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __MAIN_H #define __MAIN_H #include <QApplication> #include <QAction> #include <QTranslator> #include <QLocale> #include "widgets/MainWindow.h" #ifdef WIN32 #include <windows.h> #endif #include "entropy.h" extern char segv_data[1024]; class XcaTranslator : public QTranslator { Q_OBJECT public: XcaTranslator(QObject *p = NULL) : QTranslator(p) { } bool load(const QLocale &locale, const QString &filename, const QString &dir) { #if 0 return QTranslator::load(locale, filename, "_", dir, ".qm"); #else return QTranslator::load(QString("%1_%2").arg(filename).arg(locale.name()), dir); #endif } }; class XCA_application : public QApplication { Q_OBJECT private: MainWindow *mainw; XcaTranslator *qtTr; XcaTranslator *xcaTr; static QLocale lang; Entropy entropy; static QList<QLocale> langAvail; public: XCA_application(int &argc, char *argv[]); virtual ~XCA_application(); void setMainwin(MainWindow *m); void setupLanguage(QLocale lang); static QLocale language() { return lang; } static QFont tableFont; static bool languageAvailable(QLocale l); bool eventFilter(QObject *watched, QEvent *ev); public slots: void switchLanguage(QAction* a); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/oid.cpp�������������������������������������������������������������������������������0000664�0000000�0000000�00000004764�12606205164�0014332�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 Christian Hohnstaedt. * * All rights reserved. */ /* here we have the possibility to add our own OIDS */ #include <openssl/objects.h> #include <QStringList> #include <QMessageBox> #include <QTextEdit> #include <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_read(fname); 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) { XCA_WARN(QString("Error reading config file: ") + fname + " Line: " + QString::number(line)); fclose(fp); return; } else { QByteArray oid = sl[0].trimmed().toLatin1(); QByteArray sn = sl[1].trimmed().toLatin1(); QByteArray ln = sl[2].trimmed().toLatin1(); 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_read(fname); 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) XCA_WARN(QString("Unknown (flying:-) Object: ") + fname + " Line: " + QString::number(line)); else nl += nid; } fclose(fp); return nl; } ������������xca-1.3.2/lib/oid.h���������������������������������������������������������������������������������0000664�0000000�0000000�00000001055�12606205164�0013765�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 <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-1.3.2/lib/opensc-pkcs11.h�����������������������������������������������������������������������0000664�0000000�0000000�00000123516�12606205164�0015610�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 CKF_EC_F_P (1 << 20) #define CKF_EC_F_2M (1 << 21) #define CKF_EC_ECPARAMETERS (1 << 22) #define CKF_EC_NAMEDCURVE (1 << 23) #define CKF_EC_UNCOMPRESS (1 << 24) #define CKF_EC_COMPRESS (1 << 25) #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-1.3.2/lib/pass_info.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000000740�12606205164�0015526�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #include <QString> #include <QWidget> #include <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-1.3.2/lib/pass_info.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001542�12606205164�0015174�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 <QString> #include <QObject> #include <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-1.3.2/lib/pk11_attribute.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000006371�12606205164�0016412�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 <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::setConstBignum(const BIGNUM *bn) { 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); } void pk11_attr_data::setBignum(BIGNUM *bn, bool consume) { setConstBignum(bn); 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++) { memset(attributes[i].pValue, 0, attributes[i].ulValueLen); 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-1.3.2/lib/pk11_attribute.h����������������������������������������������������������������������0000664�0000000�0000000�00000012326�12606205164�0016054�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 <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::fromLatin1((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, const BIGNUM *bn) :pk11_attribute(type) { setConstBignum(bn); } 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) { memset(attr.pValue, 0, attr.ulValueLen); 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 setConstBignum(const BIGNUM *bn); 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-1.3.2/lib/pkcs11.cpp����������������������������������������������������������������������������0000664�0000000�0000000�00000056730�12606205164�0014661�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2014 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 "entropy.h" #include <openssl/rand.h> #include <openssl/engine.h> #include <openssl/evp.h> #include <QMessageBox> #include <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()) { CK_RV rv; CALL_P11_C(p11slot.lib, C_CloseSession, session); (void)rv; } } 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) { CALL_P11_C(slot.lib, C_CloseSession, session); session = CK_INVALID_HANDLE; if (rv != CKR_OK) pk11error(slot, "C_CloseSession", rv); } CALL_P11_C(slot.lib, C_OpenSession, slot.id, flags, NULL, NULL, &session); if (rv != CKR_OK) pk11error(slot, "C_OpenSession", rv); p11slot = slot; } void pkcs11::getRandom() { CK_BYTE buf[64]; CK_ULONG len = sizeof buf; CK_RV rv; if (Entropy::get(buf, len)) { CALL_P11_C(p11slot.lib, C_SeedRandom, session, buf, len); } CALL_P11_C(p11slot.lib, C_GenerateRandom, session, buf, len); if (rv == CKR_OK) Entropy::add_buf(buf, len); else qDebug("C_GenerateRandom: %s", pk11errorString(rv)); } QList<CK_MECHANISM_TYPE> pkcs11::mechanismList(slotid slot) { CK_RV rv; CK_MECHANISM_TYPE *m; QList<CK_MECHANISM_TYPE> ml; unsigned long count; CALL_P11_C(slot.lib, C_GetMechanismList, slot.id, NULL, &count); if (count != 0) { m = (CK_MECHANISM_TYPE *)malloc(count *sizeof(*m)); check_oom(m); CALL_P11_C(slot.lib, C_GetMechanismList, slot.id, m, &count); 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; CALL_P11_C(slot.lib, C_GetMechanismInfo, slot.id, m, info); if (rv != CKR_OK) { pk11error(slot, "C_GetMechanismInfo", rv); } } void pkcs11::logout() { CK_RV rv; p11slot.isValid(); CALL_P11_C(p11slot.lib, C_Logout, session); 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(); CALL_P11_C(p11slot.lib, C_GetSessionInfo, session, &sinfo); 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(); CALL_P11_C(p11slot.lib, C_Login, session, user, pin, pinlen); 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) { XCA_WARN(QString("Error: %1").arg(e.getString())); } } switch (slotnames.count()) { case 0: XCA_WARN(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) { CK_RV rv; p11slot.isValid(); CALL_P11_C(p11slot.lib, C_SetPIN, session, oldPin, oldPinLen, pin, pinLen); 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.toLatin1(); 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) { CK_RV rv; CALL_P11_C(p11slot.lib, C_InitPIN, session, pinp.constUchar(), pinp.size()); if (rv != CKR_OK) pk11error("C_InitPIN", rv); } logout(); } void pkcs11::initToken(slotid slot, unsigned char *pin, int pinlen, QString label) { CK_RV rv; unsigned char clabel[32]; QByteArray ba = label.toUtf8().left(32); memset(clabel, ' ', 32); memcpy(clabel, ba.constData(), ba.size()); CALL_P11_C(slot.lib, C_InitToken, slot.id, pin, pinlen, clabel); if (rv != CKR_OK) pk11error(slot, "C_InitToken", rv); } tkInfo pkcs11::tokenInfo(slotid slot) { CK_TOKEN_INFO token_info; CK_RV rv; CALL_P11_C(slot.lib, C_GetTokenInfo, slot.id, &token_info); 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(); CALL_P11_C(p11slot.lib, C_CreateObject, session, attrs.getAttributes(), attrs.length(), &obj); 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++) { CALL_P11_C(p11slot.lib, C_DestroyObject, session, objects[i]); 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::generateKey(QString name, unsigned long mech, unsigned long bits, int nid) { #ifdef OPENSSL_NO_EC (void)nid; #endif CK_RV rv; CK_OBJECT_HANDLE pubkey, privkey, dsa_param_obj; pk11_attlist priv_atts, pub_atts, dsa_param; CK_MECHANISM mechanism = {mech, NULL_PTR, 0}; pk11_attr_data label(CKA_LABEL, name.toUtf8()); pk11_attr_data new_id = findUniqueID(CKO_PUBLIC_KEY); pub_atts << label << new_id << 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); priv_atts << label << new_id << 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); switch (mech) { case CKM_RSA_PKCS_KEY_PAIR_GEN: pub_atts << pk11_attr_ulong(CKA_MODULUS_BITS, bits) << pk11_attr_data(CKA_PUBLIC_EXPONENT, 0x10001); break; case CKM_DSA_KEY_PAIR_GEN: { //DSA: Spec Seite 191 (175) C_GenerateKey CK_MECHANISM mechanism = {CKM_DSA_PARAMETER_GEN, NULL_PTR, 0}; dsa_param << label << pk11_attr_ulong(CKA_CLASS, CKO_DOMAIN_PARAMETERS) << pk11_attr_ulong(CKA_KEY_TYPE, CKK_DSA) << pk11_attr_bool(CKA_TOKEN, true) << pk11_attr_bool(CKA_PRIVATE, false) << pk11_attr_ulong(CKA_PRIME_BITS, bits); p11slot.isValid(); CALL_P11_C(p11slot.lib, C_GenerateKey, session, &mechanism, dsa_param.getAttributes(), dsa_param.length(), &dsa_param_obj); if (rv != CKR_OK) pk11error("C_GenerateKey(DSA_PARAMETER)", rv); pk11_attr_data p(CKA_PRIME), q(CKA_SUBPRIME), g(CKA_BASE); loadAttribute(p, dsa_param_obj); loadAttribute(q, dsa_param_obj); loadAttribute(g, dsa_param_obj); pub_atts << p << q << g; break; } #ifndef OPENSSL_NO_EC case CKM_EC_KEY_PAIR_GEN: { CK_MECHANISM_INFO info; mechanismInfo(p11slot, CKM_EC_KEY_PAIR_GEN, &info); EC_GROUP *group = EC_GROUP_new_by_curve_name(nid); EC_GROUP_set_asn1_flag(group, info.flags & CKF_EC_NAMEDCURVE ? OPENSSL_EC_NAMED_CURVE : 0); // Workaround for "www.CardContact.de" bug if (tokenInfo().manufacturerID() == "www.CardContact.de") { EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); } priv_atts << pk11_attr_bool(CKA_DERIVE, true); pub_atts << pk11_attr_data(CKA_EC_PARAMS, i2d_bytearray(I2D_VOID(i2d_ECPKParameters), group)); EC_GROUP_free(group); break; } #endif default: throw errorEx(("Unsupported Key generation mechanism")); } p11slot.isValid(); CALL_P11_C(p11slot.lib, C_GenerateKeyPair, session, &mechanism, pub_atts.getAttributes(), pub_atts.length(), priv_atts.getAttributes(), priv_atts.length(), &pubkey, &privkey); 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(); CALL_P11_C(p11slot.lib, C_FindObjectsInit, session, attribute, att_num); if (rv != CKR_OK) pk11error("C_FindObjectsInit", rv); do { CALL_P11_C(p11slot.lib, C_FindObjects, session, objects, 256, &len); if (rv != CKR_OK) pk11error("C_FindObjects", rv); for (i=0; i<len; i++) list += objects[i]; } while (len); CALL_P11_C(p11slot.lib, C_FindObjectsFinal, session); if (rv != CKR_OK) pk11error("C_FindObjectsFinal", rv); return list; } int pkcs11::decrypt(int flen, const unsigned char *from, unsigned char *to, int tolen, unsigned long m) { CK_MECHANISM mech; CK_ULONG size = tolen; CK_RV rv; memset(&mech, 0, sizeof(mech)); mech.mechanism = m; CALL_P11_C(p11slot.lib, C_DecryptInit, session, &mech, p11obj); if (rv == CKR_OK) CALL_P11_C(p11slot.lib, C_Decrypt, session, (CK_BYTE *)from, flen, to, &size); 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, unsigned long m) { CK_MECHANISM mech; CK_ULONG size = tolen; CK_RV rv; memset(&mech, 0, sizeof(mech)); mech.mechanism = m; CALL_P11_C(p11slot.lib, C_SignInit, session, &mech, p11obj); if (rv == CKR_OK) CALL_P11_C(p11slot.lib, C_Sign, session, (CK_BYTE *)from, flen, to, &size); if (rv != CKR_OK) { fprintf(stderr, "Error: C_Sign(init): %s\n", pk11errorString(rv)); return -1; } return size; } #if OPENSSL_VERSION_NUMBER < 0x10000000L 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), CKM_RSA_PKCS); } 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, CKM_RSA_PKCS); } EVP_PKEY *pkcs11::getPrivateKey(EVP_PKEY *pub, CK_OBJECT_HANDLE obj) { static RSA_METHOD rsa_meth, *ops = NULL; RSA *rsa; EVP_PKEY *evp; p11slot.isValid(); switch (EVP_PKEY_type(pub->type)) { case EVP_PKEY_RSA: 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; case EVP_PKEY_EC: return NULL; } return NULL; } #else static int eng_idx = -1; static EVP_PKEY_METHOD *p11_rsa_method; static EVP_PKEY_METHOD *p11_dsa_method; #ifndef OPENSSL_NO_EC static EVP_PKEY_METHOD *p11_ec_method; #endif static int eng_finish(ENGINE *e) { pkcs11 *p11 = (pkcs11 *)ENGINE_get_ex_data(e, eng_idx); delete p11; ENGINE_set_ex_data(e, eng_idx, NULL); return 1; } static int eng_pmeth_ctrl_rsa(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { switch (type) { case EVP_PKEY_CTRL_RSA_PADDING: return p1 == RSA_PKCS1_PADDING ? 1 : -2; #ifndef OPENSSL_NO_EC case EVP_PKEY_CTRL_GET_RSA_PADDING: *(int *)p2 = RSA_PKCS1_PADDING; return 1; #endif case EVP_PKEY_CTRL_MD: EVP_PKEY_CTX_set_data(ctx, p2); return 1; case EVP_PKEY_CTRL_DIGESTINIT: return 1; } return -2; } static int eng_pmeth_ctrl_dsa(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { (void)p1; switch (type) { case EVP_PKEY_CTRL_MD: EVP_PKEY_CTX_set_data(ctx, NULL); switch (EVP_MD_type((const EVP_MD *)p2)) { case NID_sha1: case NID_sha256: EVP_PKEY_CTX_set_data(ctx, p2); return 1; } EVP_PKEY_CTX_set_data(ctx, p2); return 0; case EVP_PKEY_CTRL_DIGESTINIT: return 1; } return -2; } #ifndef OPENSSL_NO_EC static int eng_pmeth_ctrl_ec(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { (void)p1; switch (type) { case EVP_PKEY_CTRL_MD: EVP_PKEY_CTX_set_data(ctx, NULL); switch (EVP_MD_type((const EVP_MD *)p2)) { case NID_ecdsa_with_SHA1: fprintf(stderr, "%s: NID_ecdsa_with_SHA1 unexpected\n", __func__); case NID_sha1: case NID_sha224: case NID_sha256: case NID_sha384: case NID_sha512: EVP_PKEY_CTX_set_data(ctx, p2); return 1; } return 0; case EVP_PKEY_CTRL_DIGESTINIT: return 1; } fprintf(stderr, "EC Don't call me %d\n", type); return -2; } #endif static unsigned char *create_x509_sig(EVP_PKEY_CTX *ctx, const unsigned char *m, size_t m_len, unsigned int *x509_siglen) { X509_SIG sig; ASN1_TYPE parameter; X509_ALGOR algor; ASN1_OCTET_STRING digest; EVP_MD *md = (EVP_MD *)EVP_PKEY_CTX_get_data(ctx); int i; unsigned char *p, *tmps; *x509_siglen = 0; sig.algor = &algor; sig.algor->algorithm = OBJ_nid2obj(EVP_MD_type(md)); if (!sig.algor->algorithm) return NULL; if (sig.algor->algorithm->length == 0) return NULL; parameter.type=V_ASN1_NULL; parameter.value.ptr = NULL; sig.algor->parameter= ¶meter; sig.digest = &digest; sig.digest->data = (unsigned char *)m; sig.digest->length = (unsigned int)m_len; i = i2d_X509_SIG(&sig, NULL); if (i <= 0) return NULL; p = tmps = (unsigned char *)malloc(i); check_oom(tmps); if (i2d_X509_SIG(&sig, &p) <= 0) { free(tmps); return NULL; } *x509_siglen = i; return tmps; } static int eng_pmeth_sign_rsa(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, const unsigned char *tbs, size_t tbslen) { EVP_PKEY *pkey; unsigned int x509_len; unsigned char *sigbuf; int len; sigbuf = create_x509_sig(ctx, tbs, tbslen, &x509_len); pkey = EVP_PKEY_CTX_get0_pkey(ctx); if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) return -1; if ((int)x509_len > (RSA_size(pkey->pkey.rsa) - RSA_PKCS1_PADDING_SIZE)) return -1; pkcs11 *p11 = (pkcs11 *)ENGINE_get_ex_data(pkey->engine, eng_idx); // siglen is unsigned and can't cope with -1 as return value len = p11->encrypt(x509_len, sigbuf, sig, *siglen, CKM_RSA_PKCS); *siglen = len; free(sigbuf); return (len < 0) ? -1 : 1; } static int eng_pmeth_sign_dsa(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, const unsigned char *tbs, size_t tbslen) { EVP_PKEY *pkey; int len, rs_len, ret = -1; unsigned char rs_buf[128]; DSA_SIG *dsa_sig = DSA_SIG_new(); pkey = EVP_PKEY_CTX_get0_pkey(ctx); if (EVP_PKEY_type(pkey->type) != EVP_PKEY_DSA) return -1; pkcs11 *p11 = (pkcs11 *)ENGINE_get_ex_data(pkey->engine, eng_idx); // siglen is unsigned and can't cope with -1 as return value len = p11->encrypt(tbslen, tbs, rs_buf, sizeof rs_buf, CKM_DSA); if (len & 0x01) // Must be even goto out; rs_len = len/2; dsa_sig->r = BN_bin2bn(rs_buf, rs_len, NULL); dsa_sig->s = BN_bin2bn(rs_buf + rs_len, rs_len, NULL); if (!dsa_sig->s || !dsa_sig->r) goto out; len = i2d_DSA_SIG(dsa_sig, &sig); openssl_error(); if (len <= 0) goto out; *siglen = len; ret = 1; out: DSA_SIG_free(dsa_sig); ign_openssl_error(); return ret; } #ifndef OPENSSL_NO_EC static int eng_pmeth_sign_ec(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, const unsigned char *tbs, size_t tbslen) { int len, rs_len, ret = -1; unsigned char rs_buf[512]; ECDSA_SIG *ec_sig = ECDSA_SIG_new(); EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx); pkcs11 *p11 = (pkcs11 *)ENGINE_get_ex_data(pkey->engine, eng_idx); // siglen is unsigned and can' cope with -1 as return value len = p11->encrypt(tbslen, tbs, rs_buf, sizeof rs_buf, CKM_ECDSA); if (len & 0x01) // Must be even goto out; /* The buffer contains r and s concatenated * Both of equal size * pkcs-11v2-20.pdf chapter 12.13.1, page 232 */ rs_len = len/2; if (!BN_bin2bn(rs_buf, rs_len, ec_sig->r)) goto out; if (!BN_bin2bn(rs_buf + rs_len, rs_len, ec_sig->s)) goto out; len = i2d_ECDSA_SIG(ec_sig, &sig); if (len <= 0) goto out; *siglen = len; ret = 1; out: ECDSA_SIG_free(ec_sig); ign_openssl_error(); return ret; } #endif static int eng_pmeth_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { void *p = EVP_PKEY_CTX_get_app_data(src); EVP_PKEY_CTX_set_app_data(dst, p); return 1; } static int eng_meths(ENGINE *e, EVP_PKEY_METHOD **m, const int **nids, int nid) { static const int my_nids[] = { EVP_PKEY_EC, EVP_PKEY_RSA }; (void)e; if (m) { switch (nid) { #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: *m = p11_ec_method; return 1; #endif case EVP_PKEY_RSA: *m = p11_rsa_method; return 1; case EVP_PKEY_DSA: *m = p11_dsa_method; return 1; } return 0; } if (nids) { *nids = my_nids; return ARRAY_SIZE(my_nids); } return -1; } EVP_PKEY *pkcs11::getPrivateKey(EVP_PKEY *pub, CK_OBJECT_HANDLE obj) { static ENGINE *e = NULL; if (!e) { e = ENGINE_new(); check_oom(e); ENGINE_set_pkey_meths(e, eng_meths); ENGINE_set_finish_function(e, eng_finish); if (eng_idx == -1) eng_idx = ENGINE_get_ex_new_index(0, NULL, NULL, NULL, 0); ENGINE_set_ex_data(e, eng_idx, NULL); CRYPTO_add(&pub->references, 1, CRYPTO_LOCK_EVP_PKEY); pub->engine = e; if (!p11_rsa_method) { p11_rsa_method = EVP_PKEY_meth_new(EVP_PKEY_RSA, 0); EVP_PKEY_meth_set_sign(p11_rsa_method, NULL, eng_pmeth_sign_rsa); EVP_PKEY_meth_set_ctrl(p11_rsa_method, eng_pmeth_ctrl_rsa, NULL); EVP_PKEY_meth_set_copy(p11_rsa_method, eng_pmeth_copy); } if (!p11_dsa_method) { p11_dsa_method = EVP_PKEY_meth_new(EVP_PKEY_RSA, 0); EVP_PKEY_meth_set_sign(p11_dsa_method, NULL, eng_pmeth_sign_dsa); EVP_PKEY_meth_set_ctrl(p11_dsa_method, eng_pmeth_ctrl_dsa, NULL); EVP_PKEY_meth_set_copy(p11_dsa_method, eng_pmeth_copy); } #ifndef OPENSSL_NO_EC if (!p11_ec_method) { p11_ec_method = EVP_PKEY_meth_new(EVP_PKEY_EC, 0); EVP_PKEY_meth_set_sign(p11_ec_method, NULL, eng_pmeth_sign_ec); EVP_PKEY_meth_set_ctrl(p11_ec_method, eng_pmeth_ctrl_ec, NULL); EVP_PKEY_meth_set_copy(p11_ec_method, eng_pmeth_copy); } #endif } if (ENGINE_get_ex_data(e, eng_idx)) fprintf(stderr, "Christian forgot to free the previous Card key. Blame him"); ENGINE_set_ex_data(e, eng_idx, this); p11obj = obj; switch (EVP_PKEY_type(pub->type)) { case EVP_PKEY_RSA: case EVP_PKEY_DSA: #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: #endif /* The private key is a copy of the public * key with an engine attached */ QByteArray ba = i2d_bytearray(I2D_VOID(i2d_PUBKEY), pub); EVP_PKEY *priv = (EVP_PKEY*)d2i_bytearray(D2I_VOID(d2i_PUBKEY), ba); ENGINE_init(e); priv->engine = e; return priv; } return NULL; } #endif ����������������������������������������xca-1.3.2/lib/pkcs11.h������������������������������������������������������������������������������0000664�0000000�0000000�00000011173�12606205164�0014316�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 <QStringList> #include <QString> #include <QList> #include <ltdl.h> #include "pk11_attribute.h" #define WAITCURSOR_START do { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); ign_openssl_error(); } while(0); #define WAITCURSOR_END do { QApplication::restoreOverrideCursor(); ign_openssl_error(); } while(0); #define CALL_P11_C(l, func, ...) do { \ snprintf(segv_data, sizeof segv_data, "Crashed in %s in %s from %s:%d\n" \ "This looks like a bug in the PKC#11 library and not in XCA\n", \ #func, CCHAR((l)->filename()), __func__, __LINE__); \ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); \ rv = l->ptr()->func(__VA_ARGS__); \ segv_data[0] = 0; \ QApplication::restoreOverrideCursor(); \ ign_openssl_error(); \ } while(0); 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 getRandom(); 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 generateKey(QString name, unsigned long ec_rsa_mech, unsigned long bits, int nid); 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, unsigned long m); int decrypt(int flen, const unsigned char *from, unsigned char *to, int tolen, unsigned long m); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pkcs11_lib.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000016301�12606205164�0015475�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 <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; qDebug("Trying to load PKCS#11 provider %s", QString2filename(file)); if (c_get_function_list(&p11) != CKR_OK) goto how_bad; CALL_P11_C(this, C_Initialize, NULL); if (rv != CKR_OK && rv != CKR_CRYPTOKI_ALREADY_INITIALIZED) pk11error("C_Initialize", rv); qDebug("Successfully loaded PKCS#11 provider %s", QString2filename(file)); return; how_bad: WAITCURSOR_END; if (dl_handle) lt_dlclose(dl_handle); lt_dlexit(); qDebug("Failed to load PKCS#11 provider %s", QString2filename(file)); throw errorEx(QObject::tr("Failed to open PKCS11 library: %1"). arg(file)); } pkcs11_lib::~pkcs11_lib() { CK_RV rv; qDebug("Unloading PKCS#11 provider %s", QString2filename(file)); CALL_P11_C(this, C_Finalize, NULL); (void)rv; lt_dlclose(dl_handle); lt_dlexit(); qDebug("Unloaded PKCS#11 provider %s", QString2filename(file)); } 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 */ CALL_P11_C(this, C_GetSlotList, CK_TRUE, p11_slots, &num_slots); while (1) { CALL_P11_C(this, 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; CALL_P11_C(this, C_GetInfo, &info); 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) { WAITCURSOR_END 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) { WAITCURSOR_END 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-1.3.2/lib/pkcs11_lib.h��������������������������������������������������������������������������0000664�0000000�0000000�00000002515�12606205164�0015144�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 <QString> #include <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-1.3.2/lib/pki_base.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000006714�12606205164�0015331�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2013 Christian Hohnstaedt. * * All rights reserved. */ #include "func.h" #include "pki_base.h" #include "exception.h" #include <QString> int pki_base::pki_counter = 0; int pki_base::suppress_messages = 0; QRegExp pki_base::limitPattern; 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 (childItems.size() > 0) delete takeFirst(); pki_counter--; } QString pki_base::getIntName() const { return desc; } QString pki_base::getUnderlinedName() const { return getIntName().replace(QRegExp("[ &;`/\\\\]+"), "_"); } bool pki_base::visible() { if (limitPattern.isEmpty()) return true; return getIntName().contains(limitPattern); } 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.toLatin1().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.size(); } 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) { (void)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-1.3.2/lib/pki_base.h����������������������������������������������������������������������������0000664�0000000�0000000�00000005347�12606205164�0014777�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 <QString> #include <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; static QRegExp limitPattern; 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 bool visible(); 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 *, int format=0) { (void)format; return NULL; } void fwrite_ba(FILE *fp, QByteArray ba, QString fname); virtual QVariant bg_color(dbheader *hd) { (void)hd; return QVariant(); } }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pki_crl.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000015650�12606205164�0015176�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 <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=revocation; } 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 revocation list '%1'"); case msg_delete: return tr("Delete the revocation list '%1'?"); case msg_create: return tr("Successfully created the revocation list '%1'"); /* %1: Number of CRLs; %2: list of CRL names */ case msg_delete_multi: return tr("Delete the %1 revocation lists: %2?"); } return pki_base::getMsg(msg); } void pki_crl::fload(const QString fname) { FILE *fp = fopen_read(fname); 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 revocation 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, bool withReason) { X509_CRL_add0_revoked(crl, xrev.get(withReason)); 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(); } bool pki_crl::visible() { extList el; if (pki_x509name::visible()) return true; if (getSigAlg().contains(limitPattern)) return true; el.setStack(crl->crl->extensions); return el.search(limitPattern); } 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_write(fname); 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, int format) { (void)format; 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); return 0; } x509revList pki_crl::getRevList() { x509revList ret; int i, num = numRev(); for (i=0; i<num; i++) { x509rev r(sk_X509_REVOKED_value(crl->crl->revoked, i)); pki_openssl_error(); ret << r; } 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(); } a1int pki_crl::getCrlNumber() { a1int num; if (!getCrlNumber(&num)) num.set(0L); return num; } 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-1.3.2/lib/pki_crl.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000003446�12606205164�0014643�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, bool withReason=true); 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(); bool verify(pki_key *pkey); int numRev(); x509revList getRevList(); 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); a1int getCrlNumber(); BIO *pem(BIO *, int); bool visible(); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pki_evp.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000043367�12606205164�0015216�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_evp.h" #include "pass_info.h" #include "Passwd.h" #include "func.h" #include "db.h" #include "entropy.h" #include "widgets/PwDialog.h" #include <openssl/rand.h> #include <openssl/evp.h> #include <openssl/pem.h> #include <QProgressDialog> #include <QApplication> #include <QDir> Passwd pki_evp::passwd; Passwd pki_evp::oldpasswd; QString pki_evp::passHash = QString(); QPixmap *pki_evp::icon[2]= { NULL, NULL }; 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) { Entropy::seed_rng(); #ifdef OPENSSL_NO_EC (void)curve_nid; #endif 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; } 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 */ foreach(builtin_curve curve, pki_key::builtinCurves) { builtin = EC_GROUP_new_by_curve_name(curve.nid); if (EC_GROUP_cmp(builtin, ec_group, NULL) == 0) { EC_GROUP_set_curve_name((EC_GROUP *)ec_group, curve.nid); EC_GROUP_set_asn1_flag((EC_GROUP *)ec_group, 1); EC_GROUP_free(builtin); break; } EC_GROUP_free(builtin); } #else (void)pkey; #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_read(fname); 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); } if (!pkey) { pki_ign_openssl_error(); rewind(fp); try { pkey = load_ssh2_key(fp); } catch (errorEx &err) { fclose(fp); throw err; } } fclose(fp); if (!pkey || 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, PKCS#8 key types and SSH2 format.").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; if (key) EVP_PKEY_free(key); key = NULL; size = head->len - sizeof(db_header_t); version = head->version; QByteArray ba((const char*)p, size); type = db::intFromData(ba); ownPass = db::intFromData(ba); if (version < 2) { d2i_old(ba, type); } else { d2i(ba); } pki_openssl_error(); if (!key || !key->pkey.ptr) { throw errorEx(tr("Ignoring unsupported private key")); } 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); Entropy::get(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_write(fname); 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_write(fname); 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.toLatin1() + 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-1.3.2/lib/pki_evp.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000003535�12606205164�0014654�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 <QString> #include <QProgressBar> #include <openssl/rsa.h> #include <openssl/bn.h> #include <openssl/pem.h> #include <openssl/evp.h> #include "pki_key.h" #include "Passwd.h" 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); 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(); 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-1.3.2/lib/pki_key.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000024177�12606205164�0015212�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "pki_key.h" #include "func.h" #include "db.h" #include <openssl/rand.h> #include <openssl/pem.h> #include <QProgressDialog> #include <QApplication> #include <QDir> #include "widgets/PwDialog.h" builtin_curves pki_key::builtinCurves; 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) { ucount = pk->ucount; key = EVP_PKEY_new(); if (pk->key) { QByteArray ba = i2d_bytearray(I2D_VOID(i2d_PUBKEY), pk->key); d2i(ba); } } 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); pki_openssl_error(); if (k) { if (key) EVP_PKEY_free(key); key = k; } } void pki_key::d2i_old(QByteArray &ba, int type) { const unsigned char *p, *p1; p = p1 = (const unsigned char *)ba.constData(); EVP_PKEY *k = d2i_PublicKey(type, NULL, &p1, ba.count()); pki_openssl_error(); if (k) { if (key) EVP_PKEY_free(key); key = k; } ba = ba.mid(p1-p); } QByteArray pki_key::i2d() { return i2d_bytearray(I2D_VOID(i2d_PUBKEY), key); } BIO *pki_key::pem(BIO *b, int format) { EVP_PKEY *pkey; QByteArray ba; if (!b) b = BIO_new(BIO_s_mem()); switch (format) { case exportType::SSH2_public: ba = SSH2publicQByteArray(); BIO_write(b, ba.data(), ba.size()); break; case exportType::PEM_private: pkey = decryptKey(); PEM_write_bio_PrivateKey(b, pkey, NULL, NULL, 0, NULL, NULL); EVP_PKEY_free(pkey); break; case exportType::PEM_key: PEM_write_bio_PUBKEY(b, key); break; } return b; } 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() const { 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%4)").arg(getIntName()).arg(getTypeString()). arg(length()).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 NID_undef; 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 QList<int> pki_key::possibleHashNids() { QList<int> nids; switch (EVP_PKEY_type(key->type)) { case EVP_PKEY_RSA: nids << NID_md5 << NID_sha1 << NID_sha224 << NID_sha256 << NID_sha384 << NID_sha512 << NID_ripemd160; break; case EVP_PKEY_DSA: nids << NID_sha1; #if OPENSSL_VERSION_NUMBER >= 0x10000000L nids << NID_sha256; #endif break; case EVP_PKEY_EC: nids << NID_sha1; #if OPENSSL_VERSION_NUMBER >= 0x10000000L nids << NID_sha224 << NID_sha256 << NID_sha384 << NID_sha512; #endif break; } return nids; }; 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_write(fname); 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]); case HD_key_curve: QString r; #ifndef OPENSSL_NO_EC if (key->type == EVP_PKEY_EC) r = OBJ_nid2sn(ecParamNid()); #endif return QVariant(r); } return pki_base::column_data(hd); } BIGNUM *pki_key::ssh_key_data2bn(QByteArray *ba, bool skip) { const unsigned char *d = (const unsigned char *)ba->constData(); uint32_t len; BIGNUM *bn = NULL; if (ba->size() < 4) throw errorEx(tr("Invalid SSH2 public key")); len = (d[0] << 24) + (d[1] << 16) + (d[2] << 8) + d[3]; if (!skip) { bn = BN_bin2bn(d+4, len, NULL); if (!ba) throw errorEx(tr("Invalid SSH2 public key")); } if (ba->size() < (ssize_t)len + 4) throw errorEx(tr("Invalid SSH2 public key")); ba->remove(0, len+4); return bn; } EVP_PKEY *pki_key::load_ssh2_key(FILE *fp) { /* See RFC 4253 Section 6.6 */ QByteArray ba; QStringList sl; int type; EVP_PKEY *pk = NULL; ba.resize(4096); if (!fgets(ba.data(), ba.size(), fp)) { return NULL; } sl = QString(ba).split(" ", QString::SkipEmptyParts); if (sl.size() < 2) return NULL; if (sl[0].startsWith("ssh-rsa")) type = EVP_PKEY_RSA; else if (sl[0].startsWith("ssh-dss")) type = EVP_PKEY_DSA; else return NULL; ba = QByteArray::fromBase64(sl[1].toLatin1()); switch (type) { case EVP_PKEY_RSA: { RSA *rsa = RSA_new(); /* Skip "ssh-rsa..." */ ssh_key_data2bn(&ba, true); rsa->e = ssh_key_data2bn(&ba); rsa->n = ssh_key_data2bn(&ba); pk = EVP_PKEY_new(); EVP_PKEY_assign_RSA(pk, rsa); break; } case EVP_PKEY_DSA: { DSA *dsa = DSA_new(); /* Skip "ssh-dsa..." */ ssh_key_data2bn(&ba, true); dsa->p = ssh_key_data2bn(&ba); dsa->q = ssh_key_data2bn(&ba); dsa->g = ssh_key_data2bn(&ba); dsa->pub_key = ssh_key_data2bn(&ba); pk = EVP_PKEY_new(); EVP_PKEY_assign_DSA(pk, dsa); } } return pk; } void pki_key::ssh_key_QBA2data(QByteArray &ba, QByteArray *data) { int size = ba.size(); unsigned char p[4]; p[0] = (size >> 24) & 0xff; p[1] = (size >> 16) & 0xff; p[2] = (size >> 8) & 0xff; p[3] = size & 0xff; data->append((char*)p, sizeof p); data->append(ba); } void pki_key::ssh_key_bn2data(BIGNUM *bn, QByteArray *data) { QByteArray big; big.resize(BN_num_bytes(bn)); BN_bn2bin(bn, (unsigned char *)big.data()); pki_openssl_error(); if ((unsigned char)big[0] >= 0x80) big.prepend('\0'); ssh_key_QBA2data(big, data); } QByteArray pki_key::SSH2publicQByteArray() { QByteArray txt, data; switch (key->type) { case EVP_PKEY_RSA: txt = "ssh-rsa"; ssh_key_QBA2data(txt, &data); ssh_key_bn2data(key->pkey.rsa->e, &data); ssh_key_bn2data(key->pkey.rsa->n, &data); break; case EVP_PKEY_DSA: txt = "ssh-dss"; ssh_key_QBA2data(txt, &data); ssh_key_bn2data(key->pkey.dsa->p, &data); ssh_key_bn2data(key->pkey.dsa->q, &data); ssh_key_bn2data(key->pkey.dsa->g, &data); ssh_key_bn2data(key->pkey.dsa->pub_key, &data); break; default: return QByteArray(); } return txt + " " + data.toBase64() + "\n"; } void pki_key::writeSSH2public(QString fname) { QFile f(fname); if (!f.open(QIODevice::ReadWrite)) fopen_error(fname); else { QByteArray txt = SSH2publicQByteArray(); if (f.write(txt) != txt.size()) throw errorEx(tr("Failed writing to %1").arg(fname)); f.close(); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pki_key.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000004121�12606205164�0014642�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __PKI_KEY_H #define __PKI_KEY_H #include <QString> #include <QProgressBar> #include <openssl/rsa.h> #include <openssl/bn.h> #include <openssl/pem.h> #include <openssl/evp.h> #include "pki_base.h" #include "builtin_curves.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; QByteArray SSH2publicQByteArray(); private: BIGNUM *ssh_key_data2bn(QByteArray *ba, bool skip = false); void ssh_key_QBA2data(QByteArray &ba, QByteArray *data); void ssh_key_bn2data(BIGNUM *bn, QByteArray *data); int ucount; // usage counter public: pki_key(const QString name = ""); pki_key(const pki_key *pk); virtual ~pki_key(); static builtin_curves builtinCurves; 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) const; virtual QString getIntNameWithType(void); virtual QList<int> possibleHashNids(); 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; } BIO *pem(BIO *, int); 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(); EVP_PKEY *load_ssh2_key(FILE *fp); void writeSSH2public(QString fname); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pki_multi.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000007576�12606205164�0015560�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 "pki_temp.h" #include "load_obj.h" #include "exception.h" #include "func.h" #include "widgets/MainWindow.h" #include <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(); } #define D5 "-----" #define BEGIN D5 "BEGIN " /* General PEM loader */ static pki_base *pkiByPEM(QString text, int *skip) { int pos; 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_XCA_TEMPLATE D5)) return new pki_temp(); 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_read(fname); 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; } } if (multi.size() == 0) throw errorEx(tr("No known PEM encoded items found")); } void pki_multi::probeAnything(const QString fname) { pki_base *item = NULL; load_base *lb; QList<load_base *> lbs; lbs << new load_pem() << 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-1.3.2/lib/pki_multi.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001155�12606205164�0015210�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-1.3.2/lib/pki_pkcs12.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000007271�12606205164�0015521�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 <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_read(fname); 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.toLatin1()); } 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_write(fname); 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-1.3.2/lib/pki_pkcs12.h��������������������������������������������������������������������������0000664�0000000�0000000�00000001536�12606205164�0015164�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-1.3.2/lib/pki_pkcs7.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000007503�12606205164�0015443�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_write(fname); 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_read(fname); 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-1.3.2/lib/pki_pkcs7.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001541�12606205164�0015104�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-1.3.2/lib/pki_scard.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000043222�12606205164�0015506�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2009 -2014 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 <QProgressDialog> #include <QApplication> #include <QDir> #include <QMessageBox> #include <QThread> #include <ltdl.h> QPixmap *pki_scard::icon[1] = { NULL }; bool pki_scard::only_token_hashes = false; 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: { QByteArray ba; EC_GROUP *group; ASN1_OCTET_STRING *os; EC_KEY *ec = EC_KEY_new(); pk11_attr_data grp(CKA_EC_PARAMS); p11.loadAttribute(grp, object); ba = grp.getData(); group = (EC_GROUP *) d2i_bytearray(D2I_VOID(d2i_ECPKParameters), ba); pki_openssl_error(); 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); ba = pt.getData(); os = (ASN1_OCTET_STRING *) d2i_bytearray(D2I_VOID(d2i_ASN1_OCTET_STRING), ba); pki_openssl_error(); BIGNUM *bn = BN_bin2bn(os->data, os->length, NULL); pki_openssl_error(); EC_POINT *point = EC_POINT_bn2point(group, bn, NULL, NULL); BN_free(bn); ASN1_OCTET_STRING_free(os); pki_openssl_error(); EC_KEY_set_public_key(ec, point); 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::objectAttributesNoId(EVP_PKEY *pk, bool priv) const { QByteArray ba; RSA *rsa = pk->pkey.rsa; DSA *dsa = pk->pkey.dsa; #ifndef OPENSSL_NO_EC EC_KEY *ec = pk->pkey.ec; #endif pk11_attlist attrs(pk11_attr_ulong(CKA_CLASS, priv ? CKO_PRIVATE_KEY : CKO_PUBLIC_KEY)); switch (EVP_PKEY_type(pk->type)) { case EVP_PKEY_RSA: attrs << pk11_attr_ulong(CKA_KEY_TYPE, CKK_RSA) << pk11_attr_data(CKA_MODULUS, rsa->n, false) << pk11_attr_data(CKA_PUBLIC_EXPONENT, rsa->e, false); break; case EVP_PKEY_DSA: attrs << pk11_attr_ulong(CKA_KEY_TYPE, CKK_DSA) << pk11_attr_data(CKA_PRIME, dsa->p, false) << pk11_attr_data(CKA_SUBPRIME, dsa->q, false) << pk11_attr_data(CKA_BASE, dsa->g, false); break; #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: ba = i2d_bytearray(I2D_VOID(i2d_ECPKParameters), EC_KEY_get0_group(ec)); attrs << pk11_attr_ulong(CKA_KEY_TYPE, CKK_EC) << pk11_attr_data(CKA_EC_PARAMS, ba); break; #endif default: throw errorEx(QString("Unkown Keytype %d").arg(pk->type)); } return attrs; } pk11_attlist pki_scard::objectAttributes(bool priv) const { pk11_attlist attrs = objectAttributesNoId(key, priv); attrs << getIdAttr(); return attrs; } void pki_scard::deleteFromToken(slotid slot) { pkcs11 p11; p11.startSession(slot, true); tkInfo ti = p11.tokenInfo(); if (!XCA_YESNO(tr("Delete the private key '%1' from the token '%2 (#%3)' ?"). arg(getIntName()).arg(ti.label()).arg(ti.serial()))) 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) { QByteArray ba; RSA *rsa = pkey->pkey.rsa; DSA *dsa = pkey->pkey.dsa; #ifndef OPENSSL_NO_EC EC_KEY *ec = pkey->pkey.ec; #endif pk11_attlist pub_atts; pk11_attlist priv_atts; QList<CK_OBJECT_HANDLE> objects; pub_atts = objectAttributesNoId(pkey, false); priv_atts = objectAttributesNoId(pkey, true); 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) { XCA_INFO(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 << new_id << pk11_attr_bool(CKA_TOKEN, true) << pk11_attr_data(CKA_LABEL, getIntName().toUtf8()) << pk11_attr_bool(CKA_PRIVATE, false) << pk11_attr_bool(CKA_WRAP, true) << pk11_attr_bool(CKA_ENCRYPT, true) << pk11_attr_bool(CKA_VERIFY, true); priv_atts << new_id << pk11_attr_bool(CKA_TOKEN, true) << pk11_attr_data(CKA_LABEL, desc.toUtf8()) << pk11_attr_bool(CKA_PRIVATE, true) << pk11_attr_bool(CKA_UNWRAP, true) << pk11_attr_bool(CKA_DECRYPT, true) << pk11_attr_bool(CKA_SIGN, true); switch (EVP_PKEY_type(pkey->type)) { case EVP_PKEY_RSA: priv_atts << pk11_attr_data(CKA_PRIVATE_EXPONENT, rsa->d, false) << pk11_attr_data(CKA_PRIME_1, rsa->p, false) << pk11_attr_data(CKA_PRIME_2, rsa->q, false) << pk11_attr_data(CKA_EXPONENT_1, rsa->dmp1, false) << pk11_attr_data(CKA_EXPONENT_2, rsa->dmq1, false) << pk11_attr_data(CKA_COEFFICIENT, rsa->iqmp, false); break; case EVP_PKEY_DSA: priv_atts << pk11_attr_data(CKA_VALUE, dsa->priv_key, false); pub_atts << pk11_attr_data(CKA_VALUE, dsa->pub_key, false); break; #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: { /* Public Key */ BIGNUM *point; int size; unsigned char *buf; ASN1_OCTET_STRING *os; point = EC_POINT_point2bn(EC_KEY_get0_group(ec), EC_KEY_get0_public_key(ec), EC_KEY_get_conv_form(ec), NULL, NULL); pki_openssl_error(); size = BN_num_bytes(point); buf = (unsigned char *)OPENSSL_malloc(size); check_oom(buf); BN_bn2bin(point, buf); os = ASN1_OCTET_STRING_new(); /* set0 -> ASN1_OCTET_STRING_free() also free()s buf */ ASN1_STRING_set0(os, buf, size); ba = i2d_bytearray(I2D_VOID(i2d_ASN1_OCTET_STRING), os); ASN1_OCTET_STRING_free(os); BN_free(point); pki_openssl_error(); pub_atts << pk11_attr_data(CKA_EC_POINT, ba); /* Private key */ priv_atts << pk11_attr_data(CKA_VALUE, EC_KEY_get0_private_key(ec)); break; } #endif default: throw errorEx(QString("Unkown Keytype %d").arg(pkey->type)); } 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 = objectAttributesNoId(pkey, false); pub_atts << new_id; 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; if (!only_token_hashes) return pki_key::possibleHashNids(); foreach(CK_MECHANISM_TYPE mechanism, mech_list) { switch (EVP_PKEY_type(key->type)) { case EVP_PKEY_RSA: switch (mechanism) { case CKM_MD5_RSA_PKCS: nids << NID_md5; break; 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; } break; case EVP_PKEY_DSA: switch (mechanism) { case CKM_DSA_SHA1: nids << NID_sha1; break; } break; #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: switch (mechanism) { case CKM_ECDSA_SHA1: nids << NID_sha1; break; } break; #endif } } if (nids.count() == 0) { 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: #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: #endif nids << NID_sha1; break; } } 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); if (!XCA_OKCANCEL(msg)) { 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()) XCA_WARN(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; int curve_nid; int method; pkcs11 *p11; void run() { try { id = p11->generateKey(name, method, size, curve_nid); } catch (errorEx &e) { err = e; } } }; void pki_scard::generateKey_card(int type, slotid slot, int size, int curve_nid, QProgressBar *bar) { pk11_attlist atts; pkcs11 p11; p11.startSession(slot, true); p11.getRandom(); tkInfo ti = p11.tokenInfo(); if (p11.tokenLogin(ti.label(), false).isNull()) return; keygenThread kt; kt.name = getIntName(); kt.size = size; kt.curve_nid = curve_nid; switch (type) { case EVP_PKEY_RSA: kt.method = CKM_RSA_PKCS_KEY_PAIR_GEN; break; case EVP_PKEY_DSA: kt.method = CKM_DSA_KEY_PAIR_GEN; break; #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: kt.method = CKM_EC_KEY_PAIR_GEN; break; #endif default: throw errorEx(tr("Illegal Key generation method")); } 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 (!key || !key->pkey.ptr) { throw errorEx(tr("Ignoring unsupported token key")); } 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) const { 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) { delete p11; throw errorEx(tr("Failed to find the key on the token")); } EVP_PKEY *pkey = p11->getPrivateKey(key, priv_objects[0]); if (!pkey) { delete p11; throw errorEx(tr("Failed to initialize the key on the token")); } 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(); } bool pki_scard::visible() { QStringList sl; if (pki_base::visible()) return true; sl << card_serial << card_manufacturer << card_model << card_label << slot_label << object_id; foreach(QString s, sl) { if (s.contains(limitPattern)) return true; } return false; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pki_scard.h���������������������������������������������������������������������������0000664�0000000�0000000�00000004304�12606205164�0015151�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 <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]; static bool only_token_hashes; 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) const; 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; pk11_attlist objectAttributesNoId(EVP_PKEY *pk, 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(int type, slotid slot, int size, int curve_nid, QProgressBar *bar); void deleteFromToken(); void deleteFromToken(slotid slot); void store_token(slotid slot, EVP_PKEY *pkey); int renameOnToken(slotid slot, QString name); QString getMsg(msg_type msg); bool visible(); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pki_temp.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000033053�12606205164�0015360�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 <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) { x509name n; extList el = cert_or_req->getV3ext(); nsComment = ""; n = cert_or_req->getSubject(); foreach(QString sn, MainWindow::explicit_dn) { int nid =OBJ_sn2nid(CCHAR(sn)); 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; } QByteArray pki_temp::toExportData() { QByteArray data, header; data = toData(); header = db::intToData(data.count()); header += db::intToData(dataVersion); header += data; return header; } void pki_temp::writeTemp(QString fname) { FILE *fp = fopen_write(fname); if (fp == NULL) { fopen_error(fname); return; } fwrite_ba(fp, toExportData(), fname); fclose(fp); } void pki_temp::writeDefault(const QString fname) { writeTemp(fname + QDir::separator() + getIntName() + ".xca"); } BIO *pki_temp::pem(BIO *b, int format) { (void)format; QByteArray ba = toExportData(); if (!b) b = BIO_new(BIO_s_mem()); #if OPENSSL_VERSION_NUMBER < 0x10002000L PEM_write_bio(b, PEM_STRING_XCA_TEMPLATE, (char*)"", (unsigned char*)(ba.data()), ba.size()); #else PEM_write_bio(b, PEM_STRING_XCA_TEMPLATE, "", (const unsigned char*)(ba.constData()), ba.size()); #endif pki_openssl_error(); return b; } void pki_temp::fromExportData(QByteArray data) { int size, version; const int hsize = sizeof(uint32_t); bool oldimport = false; if (data.size() < hsize) { my_error(tr("Template file content error (too small)")); } QByteArray header = data.mid(0, hsize); size = db::intFromData(header); if (size > 65535 || size <0) { /* oldimport templates are prepended by its size in * host endianess. Recover the size */ size = intFromData(data); if (size > 65535 || size <0) { my_error(tr("Template file content error (bad size)")); } oldimport = true; } if (oldimport) { oldFromData((const unsigned char*)data.constData(), data.size()); } else { size = db::intFromData(data); version = db::intFromData(data); fromData((const unsigned char*)data.constData(), data.size(), version); } } void pki_temp::try_fload(QString fname, const char *mode) { FILE *fp = fopen(QString2filename(fname), mode); char buf[4096]; QByteArray ba; BIO *b; if (fp == NULL) { fopen_error(fname); return; } b = BIO_new(BIO_s_file()); pki_openssl_error(); BIO_set_fp(b,fp,BIO_NOCLOSE); try { fromPEM_BIO(b, fname); BIO_free(b); return; } catch (errorEx &err) { BIO_free(b); fseek(fp, 0, SEEK_SET); } while (1) { size_t ret = fread(buf, 1, sizeof buf, fp); ba.append(buf, ret); if (ret < sizeof buf) break; } int err = ferror(fp); fclose(fp); if (err) { my_error(tr("Template file content error (too small): %1"). arg(fname)); } fromExportData(ba); setIntName(rmslashdot(fname)); } void pki_temp::fload(QString fname) { try { try_fload(fname, "rb"); } catch (errorEx &err) { #if defined(_WIN32) /* Try again in ascii mode on Windows * to support pre 1.1.0 template exports */ try_fload(fname, "r"); #else throw err; #endif } } void pki_temp::fromPEM_BIO(BIO *bio, QString name) { QByteArray ba; QString msg; char *nm = NULL, *header = NULL; unsigned char *data = NULL; long len; PEM_read_bio(bio, &nm, &header, &data, &len); if (ign_openssl_error()) throw errorEx(tr("Not a PEM encoded XCA Template"), class_name); if (!strcmp(nm, PEM_STRING_XCA_TEMPLATE)) { ba = QByteArray::fromRawData((char*)data, len); fromExportData(ba); setIntName(rmslashdot(name)); } else { msg = tr("Not an XCA Template, but '%1'").arg(nm); } OPENSSL_free(nm); OPENSSL_free(header); OPENSSL_free(data); if (!msg.isEmpty()) my_error(msg); } 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(const 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-1.3.2/lib/pki_temp.h����������������������������������������������������������������������������0000664�0000000�0000000�00000003144�12606205164�0015023�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" #define D5 "-----" #define PEM_STRING_XCA_TEMPLATE "XCA TEMPLATE" class pki_temp: public pki_x509name { Q_OBJECT protected: int dataSize(); void try_fload(QString fname, const char *mode); 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(const 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; BIO *pem(BIO *b, int format); QByteArray toExportData(); void fromPEM_BIO(BIO *, QString); void fromExportData(QByteArray data); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pki_x509.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000053411�12606205164�0015120�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 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 <QMessageBox> #include <QDir> #include <openssl/rand.h> bool pki_x509::dont_colorize_expiries = false; bool pki_x509::disable_netscape = 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; caSerial = crt->caSerial; caTemplate = crt->caTemplate; revocation = crt->revocation; crlDays = crt->crlDays; crlExpiry = crt->crlExpiry; 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); pki_openssl_error(); 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_read(fname); 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; caSerial = 1; caTemplate = ""; crlDays = 30; crlExpiry.setUndefined(); class_name = "pki_x509"; cert = NULL; dataVersion = 4; pkiType = x509; randomSerial = false; } 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)); pki_openssl_error(); return a; } pki_x509 *pki_x509::getBySerial(const a1int &a) const { foreach(pki_base *p, childItems) { pki_x509 *pki = static_cast<pki_x509 *>(p); if (a == pki->getSerial()) return pki; } return NULL; } #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; } 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; } pki_openssl_error(); } 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) { XCA_WARN(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_ISSUER, getIssuer().i2d()) << pk11_attr_data(CKA_SERIAL_NUMBER, getSerial().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 (!XCA_YESNO(tr("Delete the certificate '%1' from the token '%2 (#%3)'?"). arg(getIntName()).arg(ti.label()).arg(ti.serial()))) { 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; } void pki_x509::setNotBefore(const a1time &a) { a1time t(a); X509_set_notBefore(cert, t.get_utc()); pki_openssl_error(); } void pki_x509::setNotAfter(const a1time &a) { a1time t(a); X509_set_notAfter(cert, t.get_utc()); pki_openssl_error(); } 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(); pki_openssl_error(); } 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(); pki_openssl_error(); } bool pki_x509::addV3ext(const x509v3ext &e, bool skip_existing) { if (!e.isValid()) return false; if (skip_existing && X509_get_ext_by_NID(cert, e.nid(), -1) != -1) return false; X509_EXTENSION *ext = e.get(); X509_add_ext(cert, ext, -1); X509_EXTENSION_free(ext); pki_openssl_error(); return true; } 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; bool isRevoked = false; version = head->version; size = head->len - sizeof(db_header_t); QByteArray ba((const char*)p, size); d2i(ba); pki_openssl_error(); trust = db::intFromData(ba); if (version < 4) { a1time revoked; isRevoked = db::boolFromData(ba); revoked.d2i(ba); if (isRevoked) { revocation.setDate(revoked); revocation.setSerial(getSerial()); } } 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)); if (version > 2 && version < 4) { // load own revocation info, to tell daddy about it a1time invalDate; QString revoke_reason = db::stringFromData(ba); invalDate.d2i(ba); if (isRevoked) { revocation.setReason(revoke_reason); revocation.setInvalDate(invalDate); } } if (version > 3) { x509revList curr(revList); revList.fromBA(ba); revList.merge(curr); } if (ba.count() > 0) { my_error(tr("Wrong Size %1").arg(ba.count())); } pki_openssl_error(); } QByteArray pki_x509::toData() { QByteArray ba; ba += i2d(); // cert ba += db::intToData(trust); // version 4: don't store isrevoked, revoked // 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()); // version 4: don't store own revocation but client revocations ba += revList.toBA(); 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 = "wb"; if (append) p = "ab"; 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, int format) { (void)format; 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_only(pki_x509 *signer) { 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(); return i>0; } bool pki_x509::verify(pki_x509 *signer) { if (psigner == signer) return true; if ((psigner != NULL) || (signer == NULL)) return false; if (verify_only(signer)) { int idx; x509rev r; r.setSerial(getSerial()); psigner = signer; psigner->revList.merge(x509revList(revocation)); idx = psigner->revList.indexOf(r); if (idx != -1) revocation = psigner->revList[idx]; return true; } return false; } void pki_x509::setRevocations(const x509revList &rl) { revList = rl; x509rev rev; foreach(pki_base *p, childItems) { pki_x509 *pki = static_cast<pki_x509 *>(p); rev.setSerial(pki->getSerial()); int idx = revList.indexOf(rev); if (idx != -1) pki->revocation = revList[idx]; else pki->revocation = x509rev(); } } 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; } bool pki_x509::compareNameAndKey(pki_x509 *other) { int r; X509_NAME *s1, *s2; EVP_PKEY *pub1, *pub2; if (!cert || !other->cert) return false; s1 = X509_get_subject_name(cert); s2 = X509_get_subject_name(other->cert); pki_openssl_error(); if (!s1 || !s2) return false; /* X509_NAME_cmp returns 0 if they match */ r = X509_NAME_cmp(s1, s2); pki_openssl_error(); if (r) return false; pub1 = X509_get_pubkey(cert); pub2 = X509_get_pubkey(other->cert); pki_ign_openssl_error(); if (!pub1 || !pub2) return false; /* EVP_PKEY_cmp() return 1 if the keys match */ r = EVP_PKEY_cmp(pub1, pub2); pki_openssl_error(); return r == 1; } void pki_x509::setPubKey(pki_key *key) { X509_set_pubkey(cert, key->getPubKey()); pki_openssl_error(); } QString pki_x509::fingerprint(const EVP_MD *digest) { QString fp=""; char zs[4]; unsigned int n, j; unsigned char md[EVP_MAX_MD_SIZE]; pki_openssl_error(); if (X509_digest(cert, digest, md, &n)) { for (j=0; j<n; j++) { sprintf(zs, "%02X%c",md[j], (j+1 == n) ?'\0':':'); fp += zs; } } pki_openssl_error(); return fp; } bool pki_x509::checkDate() { a1time n, b, a; n = a1time::now(), b = getNotBefore(); a = getNotAfter(); pki_openssl_error(); 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); try { pki_openssl_error(); } catch(errorEx &err) { XCA_WARN(err.getString()); } if (i == -1) return x509v3ext(); return el[i]; } ASN1_OBJECT *pki_x509::sigAlg() { return cert->sig_alg->algorithm; } 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 revocation.isValid(); } void pki_x509::setRevoked(const x509rev &revok) { revocation = revok; if (revok.isValid()) { setEffTrust(0); setTrust(0); } } 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(); } 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); pki_openssl_error(); 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_revocation: return QVariant(isRevoked() ? revocation.getDate().toSortable() : ""); case HD_cert_crl_expire: if (canSign() && !crlExpiry.isUndefined()) return QVariant(crlExpiry.toSortable()); else return QVariant(); case HD_cert_md5fp: return QVariant(fingerprint(EVP_md5())); case HD_cert_sha1fp: return QVariant(fingerprint(EVP_sha1())); case HD_cert_sha256fp: return QVariant(fingerprint(EVP_sha256())); 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]); } bool pki_x509::visible() { if (pki_x509super::visible()) return true; if (getIssuer().search(limitPattern)) return true; if (fingerprint(EVP_md5()).contains(limitPattern)) return true; if (fingerprint(EVP_sha1()).contains(limitPattern)) return true; if (fingerprint(EVP_sha256()).contains(limitPattern)) return true; if (getSerial().toHex().contains(limitPattern)) return true; return false; } 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_crl_expire: if (canSign()) { QDateTime crlwarn, crlex; crlex = crlExpiry; if (!crlExpiry.isUndefined()) { 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) { a1time r; r.d2i(ba); if (version != 3) { revocation.setSerial(getSerial()); revocation.setDate(r); } } else { revocation = x509rev(); } if (version == 1) { caTemplate=""; caSerial=1; crlExpiry.setUndefined(); 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); 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-1.3.2/lib/pki_x509.h����������������������������������������������������������������������������0000664�0000000�0000000�00000007660�12606205164�0014572�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 crlExpiry; bool randomSerial; int trust; int efftrust; a1int caSerial; a1int crlNumber; int crlDays; QString caTemplate; X509 *cert; void init(); x509rev revocation; protected: ASN1_OBJECT *sigAlg(); public: static QPixmap *icon[6]; static bool dont_colorize_expiries; static bool disable_netscape; x509revList revList; 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; 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); bool verify_only(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(); bool addV3ext(const x509v3ext &e, bool skip_existing = false); 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 x509rev &revok); bool isRevoked(); pki_x509 *getBySerial(const a1int &a) const; int calcEffTrust(); a1int getIncCaSerial(); a1int getCaSerial() { return caSerial; } void setCaSerial(a1int s) { caSerial = s; } a1int getCrlNumber() { return crlNumber; } void setCrlNumber(a1int n) { if (n > crlNumber) crlNumber = n; } 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; } x509rev getRevocation() { return revocation; } pk11_attlist objectAttributes(); void setCrlExpiry(const a1time &time); bool hasExtension(int nid); bool cmpIssuerAndSerial(pki_x509 *refcert); bool visible(); void updateView(); x509v3ext getExtByNid(int nid); 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 *, int); virtual QVariant bg_color(dbheader *hd); void mergeRevList(x509revList l) { revList.merge(l); } void setRevocations(const x509revList &rl); bool compareNameAndKey(pki_x509 *other); }; #endif ��������������������������������������������������������������������������������xca-1.3.2/lib/pki_x509req.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000023400�12606205164�0015623�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 <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_read(fname); 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; } ASN1_OBJECT *pki_x509req::sigAlg() { return request->sig_alg->algorithm; } 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_write(fname); 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, int format) { (void)format; 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; } QString pki_x509req::getAttribute(int nid) { int n; n = X509_REQ_get_attr_by_NID(request, nid, -1); if (n == -1) return QString(""); X509_ATTRIBUTE *att = X509_REQ_get_attr(request, 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(NID_pkcs9_unstructuredName); case HD_req_chall_pass: return getAttribute(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]); } bool pki_x509req::visible() { if (pki_x509super::visible()) return true; if (getAttribute(NID_pkcs9_unstructuredName).contains(limitPattern)) return true; if (getAttribute(NID_pkcs9_challengePassword).contains(limitPattern)) return true; return false; } 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-1.3.2/lib/pki_x509req.h�������������������������������������������������������������������������0000664�0000000�0000000�00000003511�12606205164�0015271�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; ASN1_OBJECT *sigAlg(); 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); QString getAttribute(int nid); 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 *, int); bool visible(); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pki_x509super.cpp���������������������������������������������������������������������0000664�0000000�0000000�00000007016�12606205164�0016177�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; } QString pki_x509super::getSigAlg() { QString alg = OBJ_nid2ln(OBJ_obj2nid(sigAlg())); pki_openssl_error(); return alg; } const EVP_MD *pki_x509super::getDigest() { return EVP_get_digestbyobj(sigAlg()); } QVariant pki_x509super::column_data(dbheader *hd) { if (hd->id == HD_x509key_name) { if (!privkey) return QVariant(""); return QVariant(privkey->getIntName()); } if (hd->id == HD_x509_sigalg) { return QVariant(getSigAlg()); } if (hd->type == dbheader::hd_v3ext || hd->type == dbheader::hd_v3ext_ns) { 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_write(fname); if (fp == NULL) { fopen_error(fname); return; } QByteArray ba = final.toUtf8(); fwrite_ba(fp, ba, fname); fclose(fp); } bool pki_x509super::visible() { if (pki_x509name::visible()) return true; if (getSigAlg().contains(limitPattern)) return true; return getV3ext().search(limitPattern); } // 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); } bool pki_x509name::visible() { if (pki_base::visible()) return true; return getSubject().search(limitPattern); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/pki_x509super.h�����������������������������������������������������������������������0000664�0000000�0000000�00000002304�12606205164�0015637�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); bool visible(); }; class pki_x509super : public pki_x509name { Q_OBJECT protected: pki_key *privkey; virtual ASN1_OBJECT *sigAlg() { return NULL; } 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(); virtual const EVP_MD *getDigest(); virtual bool isSpki() const { return false; } pki_key *getRefKey() const; void setRefKey(pki_key *ref); void delRefKey(pki_key *ref); QVariant column_data(dbheader *hd); void opensslConf(QString fname); bool visible(); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/x509name.cpp��������������������������������������������������������������������������0000664�0000000�0000000�00000011702�12606205164�0015113�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2010 Christian Hohnstaedt. * * All rights reserved. */ #include <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.toLatin1()); } 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; } bool x509name::search(const QRegExp &pattern) { int i, max = entryCount(); for (i=0; i<max; i++) { if (getEntry(i).contains(pattern)) return true; } return false; } 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-1.3.2/lib/x509name.h����������������������������������������������������������������������������0000664�0000000�0000000�00000002300�12606205164�0014552�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 <QString> #include <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; bool search(const QRegExp &pattern); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/x509rev.cpp���������������������������������������������������������������������������0000664�0000000�0000000�00000011455�12606205164�0014774�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 "db.h" #include "base.h" #include "func.h" #include "exception.h" #include <openssl/x509v3.h> #include <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; } QString x509rev::getReason() const { return crl_reasons[reason_idx].lname; } void x509rev::fromREVOKED(const X509_REVOKED *rev) { ASN1_ENUMERATED *reason; ASN1_TIME *at; int j = -1, r; if (!rev) return; serial = a1int(rev->serialNumber); date = a1time(rev->revocationDate); reason = (ASN1_ENUMERATED *)X509_REVOKED_get_ext_d2i( (X509_REVOKED *)rev, NID_crl_reason, &j, NULL); openssl_error(); reason_idx = 0; if (reason) { r = ASN1_ENUMERATED_get(reason); openssl_error(); for (int i=0; crl_reasons[i].lname; i++) { if (r == crl_reasons[i].bitnum) { reason_idx = i; } } ASN1_ENUMERATED_free(reason); } ivalDate.setUndefined(); at = (ASN1_TIME *)X509_REVOKED_get_ext_d2i((X509_REVOKED *)rev, NID_invalidity_date, &j, NULL); openssl_error(); if (at) { ivalDate = a1time(at); ASN1_GENERALIZEDTIME_free(at); } //dump(); } X509_REVOKED *x509rev::toREVOKED(bool withReason) const { a1time i = ivalDate; a1time d = date; X509_REVOKED *rev = X509_REVOKED_new(); check_oom(rev); rev->serialNumber = serial.get(); X509_REVOKED_set_revocationDate(rev, d.get_utc()); X509_REVOKED_add1_ext_i2d(rev, NID_invalidity_date, i.get(), 0, 0); /* RFC says to not add the extension if it is "unspecified" */ if (reason_idx != 0 && withReason) { ASN1_ENUMERATED *a = ASN1_ENUMERATED_new(); ASN1_ENUMERATED_set(a, crl_reasons[reason_idx].bitnum); X509_REVOKED_add1_ext_i2d(rev, NID_crl_reason, a, 0, 0); ASN1_ENUMERATED_free(a); } openssl_error(); //dump(); return rev; } void x509rev::d2i(QByteArray &ba) { X509_REVOKED *r; r = (X509_REVOKED *)d2i_bytearray(D2I_VOID(d2i_X509_REVOKED), ba); if (!r) return; fromREVOKED(r); X509_REVOKED_free(r); } QByteArray x509rev::i2d() const { QByteArray ba; X509_REVOKED *r = toREVOKED(); ba = i2d_bytearray(I2D_VOID(i2d_X509_REVOKED), r); X509_REVOKED_free(r); return ba; } void x509rev::set(const x509rev &x) { serial = x.serial; date = x.date; ivalDate = x.ivalDate; reason_idx = x.reason_idx; } bool x509rev::identical(const x509rev &x) const { return serial == x.serial && date == x.date && ivalDate == x.ivalDate && reason_idx == x.reason_idx; } void x509rev::dump() const { fprintf(stderr, "Rev: %s D:%s I:%s Reason: %d '%s'\n", CCHAR(serial.toHex()), CCHAR(date.toSortable()), CCHAR(ivalDate.toSortable()), reason_idx, crl_reasons[reason_idx].lname); } void x509revList::fromBA(QByteArray &ba) { int i, num = db::intFromData(ba); x509rev r; clear(); merged = false; for (i=0; i<num; i++) { r.d2i(ba); append(r); } } QByteArray x509revList::toBA() { int i, len = size(); QByteArray ba(db::intToData(len)); for (i=0; i<len; i++) { ba += at(i).i2d(); } return ba; } void x509revList::merge(const x509revList &other) { foreach(x509rev r, other) { if (r.isValid() && !contains(r)) { merged = true; append(r); } } } bool x509revList::identical(const x509revList &other) const { if (size() != other.size()) return false; for (int i=0; i<size(); i++) { x509rev r = at(i); int c = other.indexOf(r); if (c == -1) return false; if (!r.identical(other.at(c))) return false; } return true; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/x509rev.h�����������������������������������������������������������������������������0000664�0000000�0000000�00000004151�12606205164�0014434�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 <QStringList> #include <openssl/x509.h> #include "asn1time.h" #include "asn1int.h" class x509rev { private: a1int serial; a1time date, ivalDate; int reason_idx; void set(const x509rev &x); X509_REVOKED *toREVOKED(bool withReason=true) const; void fromREVOKED(const X509_REVOKED *rev); void dump() const; public: static QStringList crlreasons(); void d2i(QByteArray &ba); QByteArray i2d() const; QString getReason() const; bool identical(const x509rev &x) const; x509rev() { reason_idx = 0; date.setUndefined(); } x509rev(X509_REVOKED *n) { fromREVOKED(n); } x509rev(const x509rev &n) { set(n); } bool isValid() const { return serial.getLong() != 0 && !date.isUndefined(); } x509rev &set(const X509_REVOKED *r) { fromREVOKED(r); return *this; } bool operator == (const x509rev &x) const { return serial == x.serial; } x509rev &operator = (const x509rev &x) { set(x); return *this; } void setSerial(const a1int &i) { serial = i; } void setDate(const a1time &t) { date = t; } void setInvalDate(const a1time &t) { ivalDate = t; } void setReason(const QString &reason) { reason_idx = crlreasons().indexOf(reason); } a1int getSerial() const { return serial; } a1time getDate() const { return date; } a1time getInvalDate() const { return ivalDate; } X509_REVOKED *get(bool withReason=true) const { return toREVOKED(withReason); } }; class x509revList : public QList<x509rev> { public: bool merged; QByteArray toBA(); void fromBA(QByteArray &ba); void merge(const x509revList &other); bool identical(const x509revList &other) const; x509revList() : QList<x509rev>() { merged = false; } x509revList(const x509revList &r) : QList<x509rev>(r) { merged = r.merged; } x509revList(const x509rev &r) : QList<x509rev>() { if (r.isValid()) { merged = false; append(r); } } }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/x509v3ext.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000061647�12606205164�0015261�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 "exception.h" #include <openssl/x509v3.h> #include <openssl/stack.h> #include <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 = X509_EXTENSION_new(); if (n.ext && n.ext->value && n.ext->value->length > 0) 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()) { QByteArray ba = et.toLocal8Bit(); ext = X509V3_EXT_conf_nid(NULL, ctx, nid, ba.data()); } 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; } x509v3ext &x509v3ext::create_ia5(int nid, const QString &et, X509V3_CTX *ctx) { QByteArray ba = et.toLocal8Bit(); for (int i=0; i<ba.size(); i++) { if (ba[i] & 0x80) throw errorEx(QObject::tr("String '%1' for '%2' contains invalid characters").arg(et).arg(OBJ_nid2ln(nid))); } return create(nid, et, ctx); } const ASN1_OBJECT *x509v3ext::object() const { ASN1_OBJECT *obj = X509_EXTENSION_get_object(ext); try { openssl_error(); } catch (errorEx e) { return NULL; } return obj; } int x509v3ext::nid() const { const ASN1_OBJECT *obj = object(); return obj ? OBJ_obj2nid(obj) : NID_undef; } void *x509v3ext::d2i() const { void *r = X509V3_EXT_d2i(ext); ign_openssl_error(); return r; } x509v3ext &x509v3ext::operator = (const x509v3ext &x) { set(x.ext); return *this; } QString x509v3ext::getObject() const { const ASN1_OBJECT *obj = object(); return obj ? OBJ_obj2QString(obj) : QString("<ERROR>"); } 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 (ign_openssl_error() || !ret) { ret = M_ASN1_OCTET_STRING_print(bio, ext->value); } if (!ign_openssl_error() && 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); } static QString obj2SnOid(const ASN1_OBJECT *a) { QString obj; int nid = OBJ_obj2nid(a); if (nid == NID_undef) obj = OBJ_obj2QString(a); else obj = OBJ_nid2sn(nid); return obj; } 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 "UNKNOWN"; } 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 == 8) { *single = QString("IP:%1.%2.%3.%4/%5.%6.%7.%8"). arg(p[0]).arg(p[1]).arg(p[2]).arg(p[3]). arg(p[4]).arg(p[5]).arg(p[6]).arg(p[7]); return true; } else if(gen->d.ip->length == 16) { *single = "IP:" + ipv6_from_binary(gen->d.ip->data); return true; } else if(gen->d.ip->length == 32) { *single = "IP:" + ipv6_from_binary(gen->d.ip->data) + "/" + ipv6_from_binary(gen->d.ip->data +16); return true; } return false; case GEN_RID: *single = QString("RID:%1"). arg(obj2SnOid(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(obj2SnOid(gen->d.otherName->type_id)). arg(asn1Type2Name(type)). arg(asn1ToQString(a, true)); } else { *single = QString("otherName:%1;FORMAT:HEX,%2"). arg(obj2SnOid(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," : ""); } #define TEXTS (\ B_ASN1_TIME | B_ASN1_DIRECTORYSTRING | B_ASN1_DISPLAYTEXT | \ B_ASN1_NUMERICSTRING | B_ASN1_T61STRING | B_ASN1_UNIVERSALSTRING) bool x509v3ext::parse_ia5(QString *single, QString *adv) const { ASN1_STRING *str = (ASN1_STRING *)d2i(); QString ret; if (!str) { const unsigned char *p = ext->value->data; str = d2i_ASN1_type_bytes(NULL, &p, ext->value->length, TEXTS); if (ign_openssl_error() || !str) return false; ret = QString("<ERROR: NOT IA5 but %1>%2"). arg(asn1Type2Name(str->type)). arg(QString(asn1ToQString(str))); } else { 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; } bool x509v3ext::parse_generalName(QString *single, QString *adv) const { bool retval = true; QString sect, ret; STACK_OF(GENERAL_NAME) *gens = (STACK_OF(GENERAL_NAME) *)d2i(); if (!gens) return false; QString tag = OBJ_nid2sn(nid()); 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; if (!eku) return false; 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(); if (!ainfo) return false; 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 (!crld) return false; 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 (!quals) return false; if (!adv) adv = &_adv; polsect += QString("policyIdentifier=%1\n"). arg(obj2SnOid(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; int i; STACK_OF(POLICYINFO) *pol = (STACK_OF(POLICYINFO) *)d2i(); if (!pol) return false; for (i = 0; i < sk_POLICYINFO_num(pol); i++) { POLICYINFO *pinfo = sk_POLICYINFO_value(pol, i); if (!pinfo->qualifiers) { pols << obj2SnOid(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=%1ia5org,%2\n"). arg(parse_critical()).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(); if (!bc) return false; 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(); if (!bs) return false; 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) return false; 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 { const ASN1_OBJECT *o = object(); QString der, obj = o ? obj2SnOid(o) : QString("<ERROR>"); 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::parse_inhibitAnyPolicy(QString *, QString *adv) const { ASN1_INTEGER *a = (ASN1_INTEGER *)d2i(); if (!a) return false; a1int val(a); if (adv) { *adv = QString("%1=%2%3\n").arg(OBJ_nid2sn(nid())). arg(parse_critical()).arg(val.toDec()) + *adv; } ASN1_INTEGER_free(a); return true; } bool x509v3ext::parse_policyConstraints(QString *, QString *adv) const { QStringList v; a1int a1null(0L), a; POLICY_CONSTRAINTS *pol = (POLICY_CONSTRAINTS *)d2i(); if (!pol) return false; a = a1int(pol->requireExplicitPolicy); if (a != a1null) v << QString("requireExplicitPolicy:%1").arg(a.toDec()); a = a1int(pol->inhibitPolicyMapping); if (a != a1null) v << QString("inhibitPolicyMapping:%1").arg(a.toDec()); if (adv) *adv = QString("%1=%2%3\n").arg(OBJ_nid2sn(nid())). arg(parse_critical()).arg(v.join(", ")) + *adv; POLICY_CONSTRAINTS_free(pol); return true; } bool x509v3ext::parse_policyMappings(QString *, QString *adv) const { bool retval = true; QStringList polMaps; QString myadv; POLICY_MAPPINGS *pmaps = (POLICY_MAPPINGS *)d2i(); if (!pmaps) return false; for (int i = 0; i < sk_POLICY_MAPPING_num(pmaps); i++) { POLICY_MAPPING *pmap = sk_POLICY_MAPPING_value(pmaps, i); polMaps << QString("%1 = %2"). arg(obj2SnOid(pmap->issuerDomainPolicy)). arg(obj2SnOid(pmap->subjectDomainPolicy)); } if (polMaps.size() > 0 && adv) { *adv = QString("policyMappings=%1@policyMappings_sect\n"). arg(parse_critical()) + *adv + QString("[policyMappings_sect]\n") + polMaps.join("\n"); } sk_POLICY_MAPPING_free(pmaps); return retval; } static bool nameConstraint(STACK_OF(GENERAL_SUBTREE) *trees, QString prefix, QString tag, QString *single, QString *sect) { QStringList sl; for (int i = 0; i < sk_GENERAL_SUBTREE_num(trees); i++) { QString one; GENERAL_SUBTREE *tree = sk_GENERAL_SUBTREE_value(trees, i); if (!genName2conf(tree->base, QString("%1_%2").arg(tag).arg(i), &one, sect)) { return false; } fprintf(stderr, "%s: %d '%s'\n", __func__, i, CCHAR(one)); sl << prefix + ";" + one; } *single = vlist2Section(sl, tag+prefix, sect); fprintf(stderr, "Single: '%s'\n", CCHAR(*single)); return true; } bool x509v3ext::parse_nameConstraints(QString *, QString *adv) const { bool retval = true; QString sect, ret; QStringList permEx; QString tag = OBJ_nid2sn(nid()); NAME_CONSTRAINTS *cons = (NAME_CONSTRAINTS *)d2i(); if (!cons) return false; if (!nameConstraint(cons->permittedSubtrees, "permitted", tag, &ret, §)) retval = false; if (ret.size() > 0) permEx << ret; if (!nameConstraint(cons->excludedSubtrees, "excluded", tag, &ret, §)) retval = false; if (ret.size() > 0) permEx << ret; if (adv && retval &&permEx.size() > 0) { ret = permEx.join(", "); fprintf(stderr, "%s %d '%s'\n", __func__, retval, CCHAR(ret)); *adv = QString("%1=%2\n").arg(tag). arg(parse_critical() +ret) + *adv + sect; } NAME_CONSTRAINTS_free(cons); return retval; } 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); case NID_inhibit_any_policy: return parse_inhibitAnyPolicy(single, adv); case NID_policy_constraints: return parse_policyConstraints(single, adv); case NID_policy_mappings: return parse_policyMappings(single, adv); case NID_name_constraints: return parse_nameConstraints(single, adv); case NID_id_pkix_OCSP_noCheck: if (adv) *adv = "noCheck = ignored\n" + *adv; return true; 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 && ext->value && 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; } bool extList::search(const QRegExp &pattern) { for (int i=0; i < size(); i++) if (at(i).getValue(false).contains(pattern)) return true; return false; } 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-1.3.2/lib/x509v3ext.h���������������������������������������������������������������������������0000664�0000000�0000000�00000004441�12606205164�0014713�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 <QList> #include <QStringList> #include <openssl/x509.h> #include <openssl/x509v3.h> class QString; class x509v3ext { private: X509_EXTENSION *ext; const ASN1_OBJECT *object() const; 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 &create_ia5(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; bool parse_inhibitAnyPolicy(QString *, QString *adv) const; bool parse_policyConstraints(QString *, QString *adv) const; bool parse_policyMappings(QString *, QString *adv) const; bool parse_nameConstraints(QString *, 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); bool search(const QRegExp &pattern); }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/lib/xca_db_stat.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000004602�12606205164�0016021�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "db.h" #include "exception.h" #include <stdlib.h> #include <QByteArray> 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 void usage(const char *me) { printf("%s <DatabaseFile>: Dump database statistics\n" " Prints details about the chunks in the database\n", me); } int main(int argc, char *argv[]) { if (argc != 2 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")){ usage(argv[0]); return 1; } QString database = filename2QString(argv[1]); if (!QFile::exists(database)) { printf("Database file '%s' not found\n", argv[1]); usage(argv[0]); return 1; } try { db mydb(database); unsigned char *p; db_header_t h; int i=0; size_t last_end = 0; QList<size_t> errs; int format=16; const char *type[] = { "(none)", "Software Key", "Request", "Certificate", "Revocation", "Template", "Setting", "Token key" }; #define FW_IDX 5 #define FW_TYPE -13 #define FW_VER 3 #define FW_SIZE 6 #define FW_FLAGS 6 mydb.first(0); //QString fmt = QString("%1 %2 %3 %4 %5 %6 %7"); QString fmt = QString("%1 | %2 | %3 | %4 | %5 | %6 | %7 | %8"); puts(CCHAR(fmt .arg("Index", FW_IDX) .arg("Type", FW_TYPE) .arg("Ver", FW_VER) .arg("Offset", FW_SIZE) .arg("Length", FW_SIZE) .arg("End", FW_SIZE) .arg("Flags", FW_SIZE) .arg("Name"))); while (!mydb.eof()) { p = mydb.load(&h); free(p); if (last_end != (size_t)mydb.head_offset) errs << mydb.head_offset; last_end = mydb.head_offset + h.len; if (h.type > smartCard) h.type = 0; puts(CCHAR(fmt .arg(i++, FW_IDX) .arg(type[h.type], FW_TYPE) .arg(h.version, FW_VER) .arg(mydb.head_offset, FW_SIZE, format) .arg(h.len, FW_SIZE, format) .arg(last_end -1, FW_SIZE, format) .arg(h.flags, FW_SIZE) .arg(h.name))); if (mydb.next(0)) break; } if (errs.size() > 0) { fputs("Garbage found at offset:", stdout); foreach(size_t e, errs) puts(CCHAR(QString(" %1").arg(e))); puts(""); } } catch (errorEx &ex) { printf("Exception: '%s'\n", ex.getCString()); return 1; } return 0; } ������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/local.h.in��������������������������������������������������������������������������������0000664�0000000�0000000�00000000276�12606205164�0014147�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Filled in version number from the VERSION file */ #undef PACKAGE_VERSION /* usually "xca" */ #undef PACKAGE_TARNAME /* usually "X Certificate and Key management" */ #undef PACKAGE_NAME ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/m4/���������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12606205164�0012612�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/m4/ax_check_gnu_make.m4�������������������������������������������������������������������0000664�0000000�0000000�00000005457�12606205164�0016502�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_check_gnu_make.html # =========================================================================== # # SYNOPSIS # # AX_CHECK_GNU_MAKE() # # DESCRIPTION # # This macro searches for a GNU version of make. If a match is found, the # makefile variable `ifGNUmake' is set to the empty string, otherwise it # is set to "#". This is useful for including a special features in a # Makefile, which cannot be handled by other versions of make. The # variable _cv_gnu_make_command is set to the command to invoke GNU make # if it exists, the empty string otherwise. # # Here is an example of its use: # # Makefile.in might contain: # # # A failsafe way of putting a dependency rule into a makefile # $(DEPEND): # $(CC) -MM $(srcdir)/*.c > $(DEPEND) # # @ifGNUmake@ ifeq ($(DEPEND),$(wildcard $(DEPEND))) # @ifGNUmake@ include $(DEPEND) # @ifGNUmake@ endif # # Then configure.in would normally contain: # # AX_CHECK_GNU_MAKE() # AC_OUTPUT(Makefile) # # Then perhaps to cause gnu make to override any other make, we could do # something like this (note that GNU make always looks for GNUmakefile # first): # # if ! test x$_cv_gnu_make_command = x ; then # mv Makefile GNUmakefile # echo .DEFAULT: > Makefile ; # echo \ $_cv_gnu_make_command \$@ >> Makefile; # fi # # Then, if any (well almost any) other make is called, and GNU make also # exists, then the other make wraps the GNU make. # # LICENSE # # Copyright (c) 2008 John Darrington <j.darrington@elvis.murdoch.edu.au> # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 7 AC_DEFUN([AX_CHECK_GNU_MAKE], [ AC_CACHE_CHECK( for GNU make,_cv_gnu_make_command, _cv_gnu_make_command='' ; dnl Search all the common names for GNU make for a in "$MAKE" make gmake gnumake ; do if test -z "$a" ; then continue ; fi ; if ( sh -c "$a --version" 2> /dev/null | grep GNU 2>&1 > /dev/null ) ; then _cv_gnu_make_command=$a ; break; fi done ; ) ; dnl If there was a GNU version print its full path, otherwise a Warning if test "x$_cv_gnu_make_command" != "x" ; then mak="`which ${_cv_gnu_make_command}`" AC_MSG_NOTICE([A usable 'make' executable was found in ${mak}]) else AC_MSG_WARN([No usable 'make' executable found.]) fi ] ) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/m4/xca_compile_test.m4��������������������������������������������������������������������0000664�0000000�0000000�00000003306�12606205164�0016400�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������AC_DEFUN([XCA_COMPILE_TEST], [ # Try to compile a little application ##################################### AC_TRY_RUN([ #include <stdio.h> #include <string.h> #include <ltdl.h> #include <openssl/opensslv.h> #include <openssl/opensslconf.h> #include <openssl/crypto.h> #include <openssl/objects.h> #include <qglobal.h> #define C "configure: " #define WARN C"###################### WARNING ######################\n" int main(){ char buf[2048] = ""; int r = lt_dlinit(); printf(C"The Versions of the used libraries are:\n" C"Header:\n" C"\t%s 0x%lxL\n" C"\tQT: %s\n" C"Libraries:\n" C"\t%s\n" C"\tQT: %s\n", OPENSSL_VERSION_TEXT, OPENSSL_VERSION_NUMBER, QT_VERSION_STR, SSLeay_version(SSLEAY_VERSION), qVersion() ); if (strcmp(QT_VERSION_STR, qVersion())) strcat(buf, C"The versions of the QT headers and library differ\n"); if (strcmp(OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION))) strcat(buf, C"The versions of the OpenSSL headers and library differ\n"); if (r) strcat(buf, C"lt_dlinit() returned != 0\n"); #ifdef OPENSSL_NO_EC strcat(buf, C"This OpenSSL installation has no EC cryptography support\n"); #else #ifdef NID_brainpoolP160r1 printf(C"ECC With RFC 5639 Brainpool curves enabled\n" #if OPENSSL_VERSION_NUMBER < 0x10002001L C" (Backported to " OPENSSL_VERSION_TEXT ")\n" #endif ); #endif #endif if (*buf) printf(WARN "%s" WARN, buf); return 0; } ], [ ], [echo "Unable to execute a freshly compiled application, maybe you have to adjust your LD_LIBRARY_PATH or /etc/ld.so.conf"], [echo "Skipping the compile test because of cross-compiling"]) ]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/�������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12606205164�0013225�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/CA.xca�������������������������������������������������������������������������������0000664�0000000�0000000�00000000104�12606205164�0014200�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������<�������������� ������`����p���xca certificate�������0������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/HTTPS_client.xca���������������������������������������������������������������������0000664�0000000�0000000�00000000104�12606205164�0016155�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������<�������������m������� �������xca certificate�������0������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/HTTPS_server.xca���������������������������������������������������������������������0000664�0000000�0000000�00000000104�12606205164�0016205�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������<�������������m��������������xca certificate�������0������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/Info.plist���������������������������������������������������������������������������0000664�0000000�0000000�00000003145�12606205164�0015200�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>NSHighResolutionCapable</key> <string>True</string> <key>CFBundleIconFile</key> <string>xca-mac-icon.icns</string> <key>CFBundleIdentifier</key> <string>de.hohnstaedt.xca</string> <key>CFBundleName</key> <string>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-1.3.2/misc/Makefile�����������������������������������������������������������������������������0000664�0000000�0000000�00000001310�12606205164�0014660�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ SRCPATH=$(VPATH)/ all: include $(TOPDIR)/Rules.mak install: install -m 755 -d $(destdir)$(xca_prefix) \ $(destdir)$(datarootdir)/applications \ $(destdir)$(datarootdir)/mime/packages install -m 644 $(SRCPATH)*.txt $(SRCPATH)*.xca \ $(destdir)$(xca_prefix) install -m 644 $(SRCPATH)xca.desktop $(destdir)$(datarootdir)/applications install -m 644 $(SRCPATH)xca.xml $(destdir)$(datarootdir)/mime/packages if test -z "$(destdir)"; then \ update-mime-database $(datarootdir)/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-1.3.2/misc/PkgInfo������������������������������������������������������������������������������0000664�0000000�0000000�00000000011�12606205164�0014475�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������APPLcxca �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/aia.txt������������������������������������������������������������������������������0000664�0000000�0000000�00000000132�12606205164�0014514�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-1.3.2/misc/build-mac.sh�������������������������������������������������������������������������0000775�0000000�0000000�00000002420�12606205164�0015417�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh -e do_openssl() { openssl="openssl-1.0.2d" test -f "$openssl".tar.gz || curl http://www.openssl.org/source/"$openssl".tar.gz > "$openssl".tar.gz tar zxf "$openssl".tar.gz (cd $openssl #./Configure darwin64-x86_64-cc shared --prefix=$INSTALL_DIR ./config shared --prefix=$INSTALL_DIR make && make install_sw ) chmod 755 $INSTALL_DIR/lib/*.dylib } do_libtool() {( libtool="libtool-2.2.6b" test -f "$libtool".tar.gz || curl http://ftp.gnu.org/gnu/libtool/"$libtool".tar.gz > "$libtool".tar.gz tar zxf "$libtool".tar.gz cd "$libtool" export CFLAGS="-arch i386" ./configure --prefix ${INSTALL_DIR} make && make install )} XCA_DIR="`dirname $0`" XCA_DIR="`cd $XCA_DIR/.. && pwd`" # define the installation dir and the path to the new library # it will be installed locally in the home directory export EXTRA_VERSION="$i" export INSTALL_DIR="`pwd`"/install export DYLD_LIBRARY_PATH=$INSTALL_DIR/lib export QTDIR=$HOME/src/install/Qt485 do_libtool do_openssl XCA_BUILD="xca-macbuild" # configure XCA and build the DMG file rm -rf "$XCA_BUILD" mkdir -p "$XCA_BUILD" cd "$XCA_BUILD" export CXXFLAGS="-arch i386 -I${INSTALL_DIR}/include -L${INSTALL_DIR}/lib -F$QTDIR" (cd $XCA_DIR && ./bootstrap) $XCA_DIR/configure --with-openssl="$INSTALL_DIR" --with-qt="$QTDIR" make -j5 cp *.dmg .. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/build-w32.sh�������������������������������������������������������������������������0000775�0000000�0000000�00000002542�12606205164�0015277�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh -e XCA_DIR="`dirname $0`" XCA_DIR="`cd $XCA_DIR/.. && pwd`" 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.2d" OPENSSL_GZ="${OPENSSL_DIR}".tar.gz OPENSSL_DL="http://www.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 cp setup*.exe .. )} 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 XCA_BUILD="`pwd`"/xca_build export INSTALL_DIR=`pwd`/install do_openssl do_libtool do_XCA ��������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/delspace.sh��������������������������������������������������������������������������0000775�0000000�0000000�00000000153�12606205164�0015343�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-1.3.2/misc/dn.txt�������������������������������������������������������������������������������0000664�0000000�0000000�00000000350�12606205164�0014365�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 serialNumber givenName surname title initials description role pseudonym name dnQualifier generationQualifier x500UniqueIdentifier ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/eku.txt������������������������������������������������������������������������������0000664�0000000�0000000�00000000505�12606205164�0014552�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 id-pkkdcekuoid �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/git.release.something����������������������������������������������������������������0000775�0000000�0000000�00000001300�12606205164�0017343�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh set -e type git || exit 1 export TVERSION="$1" commit=master test -z "$2" || commit="$2" if test -z "$TVERSION"; then echo "usage: $0 <VERSION> [commit]" echo " if commit is ommitted, 'master' is used" exit 1 fi if git status -s | grep -v '??'; then echo "You have local changes, please commit, reset or stash them" exit 1 fi branchname="build-$TVERSION" git checkout -b "$branchname" "$commit" echo "$TVERSION" > VERSION git commit VERSION -m "$TVERSION" git tag RELEASE.$TVERSION # Create the tar.gz make dist # Return to master git checkout master # Cleanup # Delete temporary branch git branch -D "$branchname" # Delete the temporary tag git tag -d RELEASE.$TVERSION ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/oids.txt�����������������������������������������������������������������������������0000664�0000000�0000000�00000001705�12606205164�0014727�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 1.3.6.1.5.2.3.5: id-pkkdcekuoid: KDC Authentication �����������������������������������������������������������xca-1.3.2/misc/openssl-0.9.8-mingw32-cross.patch����������������������������������������������������0000664�0000000�0000000�00000013374�12606205164�0021026�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-1.3.2/misc/openssl-1.0.0-mingw32-cross.patch����������������������������������������������������0000664�0000000�0000000�00000006656�12606205164�0021013�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-1.3.2/misc/openssl-1.0.1-brainpool.patch��������������������������������������������������������0000664�0000000�0000000�00000107152�12606205164�0020355�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������From 3ee1ac6a0961eb3b97739fb86717e246a45e2743 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" <steve@openssl.org> Date: Sat, 22 Nov 2014 09:19:47 +0100 Subject: [PATCH] PR: 2239 Submitted by: Dominik Oepen <oepen@informatik.hu-berlin.de> Add Brainpool curves from RFC5639. Original patch by Annie Yousar <a.yousar@informatik.hu-berlin.de> Backported to OpenSSL 1.0.1j by Christian Hohnstaedt <christian@hohnstaedt.de> --- crypto/ec/ec_curve.c | 443 ++++++++++++++++++++++++++++++++++++++++++++ crypto/objects/obj_dat.h | 99 +++++++++- crypto/objects/obj_mac.h | 61 ++++++ crypto/objects/obj_mac.num | 15 ++ crypto/objects/objects.txt | 22 +++ 5 files changed, 635 insertions(+), 5 deletions(-) diff --git a/crypto/ec/ec_curve.c b/crypto/ec/ec_curve.c index c72fb26..a36efb2 100644 --- a/crypto/ec/ec_curve.c +++ b/crypto/ec/ec_curve.c @@ -1822,6 +1822,434 @@ static const struct { EC_CURVE_DATA h; unsigned char data[0+24*6]; } #endif +/* These curves were added by Annie Yousar <a.yousar@informatik.hu-berlin.de> + * For the definition of RFC 5639 curves see + * http://www.ietf.org/rfc/rfc5639.txt + * These curves are generated verifiable at random, nevertheless the seed is + * omitted as parameter because the generation mechanism is different from + * those defined in ANSI X9.62. + */ + +static const struct { EC_CURVE_DATA h; unsigned char data[0+20*6]; } + _EC_brainpoolP160r1 = { + { NID_X9_62_prime_field, 0,20,1 }, + { /* no seed */ + 0xE9,0x5E,0x4A,0x5F,0x73,0x70,0x59,0xDC,0x60,0xDF, /* p */ + 0xC7,0xAD,0x95,0xB3,0xD8,0x13,0x95,0x15,0x62,0x0F, + 0x34,0x0E,0x7B,0xE2,0xA2,0x80,0xEB,0x74,0xE2,0xBE, /* a */ + 0x61,0xBA,0xDA,0x74,0x5D,0x97,0xE8,0xF7,0xC3,0x00, + 0x1E,0x58,0x9A,0x85,0x95,0x42,0x34,0x12,0x13,0x4F, /* b */ + 0xAA,0x2D,0xBD,0xEC,0x95,0xC8,0xD8,0x67,0x5E,0x58, + 0xBE,0xD5,0xAF,0x16,0xEA,0x3F,0x6A,0x4F,0x62,0x93, /* x */ + 0x8C,0x46,0x31,0xEB,0x5A,0xF7,0xBD,0xBC,0xDB,0xC3, + 0x16,0x67,0xCB,0x47,0x7A,0x1A,0x8E,0xC3,0x38,0xF9, /* y */ + 0x47,0x41,0x66,0x9C,0x97,0x63,0x16,0xDA,0x63,0x21, + 0xE9,0x5E,0x4A,0x5F,0x73,0x70,0x59,0xDC,0x60,0xDF, /* order */ + 0x59,0x91,0xD4,0x50,0x29,0x40,0x9E,0x60,0xFC,0x09 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+20*6]; } + _EC_brainpoolP160t1 = { + { NID_X9_62_prime_field, 0,20,1 }, + { /* no seed */ + 0xE9,0x5E,0x4A,0x5F,0x73,0x70,0x59,0xDC,0x60,0xDF, /* p */ + 0xC7,0xAD,0x95,0xB3,0xD8,0x13,0x95,0x15,0x62,0x0F, + 0xE9,0x5E,0x4A,0x5F,0x73,0x70,0x59,0xDC,0x60,0xDF, /* a */ + 0xC7,0xAD,0x95,0xB3,0xD8,0x13,0x95,0x15,0x62,0x0C, + 0x7A,0x55,0x6B,0x6D,0xAE,0x53,0x5B,0x7B,0x51,0xED, /* b */ + 0x2C,0x4D,0x7D,0xAA,0x7A,0x0B,0x5C,0x55,0xF3,0x80, + 0xB1,0x99,0xB1,0x3B,0x9B,0x34,0xEF,0xC1,0x39,0x7E, /* x */ + 0x64,0xBA,0xEB,0x05,0xAC,0xC2,0x65,0xFF,0x23,0x78, + 0xAD,0xD6,0x71,0x8B,0x7C,0x7C,0x19,0x61,0xF0,0x99, /* y */ + 0x1B,0x84,0x24,0x43,0x77,0x21,0x52,0xC9,0xE0,0xAD, + 0xE9,0x5E,0x4A,0x5F,0x73,0x70,0x59,0xDC,0x60,0xDF, /* order */ + 0x59,0x91,0xD4,0x50,0x29,0x40,0x9E,0x60,0xFC,0x09 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+24*6]; } + _EC_brainpoolP192r1 = { + { NID_X9_62_prime_field, 0,24,1 }, + { /* no seed */ + 0xC3,0x02,0xF4,0x1D,0x93,0x2A,0x36,0xCD,0xA7,0xA3, /* p */ + 0x46,0x30,0x93,0xD1,0x8D,0xB7,0x8F,0xCE,0x47,0x6D, + 0xE1,0xA8,0x62,0x97, + 0x6A,0x91,0x17,0x40,0x76,0xB1,0xE0,0xE1,0x9C,0x39, /* a */ + 0xC0,0x31,0xFE,0x86,0x85,0xC1,0xCA,0xE0,0x40,0xE5, + 0xC6,0x9A,0x28,0xEF, + 0x46,0x9A,0x28,0xEF,0x7C,0x28,0xCC,0xA3,0xDC,0x72, /* b */ + 0x1D,0x04,0x4F,0x44,0x96,0xBC,0xCA,0x7E,0xF4,0x14, + 0x6F,0xBF,0x25,0xC9, + 0xC0,0xA0,0x64,0x7E,0xAA,0xB6,0xA4,0x87,0x53,0xB0, /* x */ + 0x33,0xC5,0x6C,0xB0,0xF0,0x90,0x0A,0x2F,0x5C,0x48, + 0x53,0x37,0x5F,0xD6, + 0x14,0xB6,0x90,0x86,0x6A,0xBD,0x5B,0xB8,0x8B,0x5F, /* y */ + 0x48,0x28,0xC1,0x49,0x00,0x02,0xE6,0x77,0x3F,0xA2, + 0xFA,0x29,0x9B,0x8F, + 0xC3,0x02,0xF4,0x1D,0x93,0x2A,0x36,0xCD,0xA7,0xA3, /* order */ + 0x46,0x2F,0x9E,0x9E,0x91,0x6B,0x5B,0xE8,0xF1,0x02, + 0x9A,0xC4,0xAC,0xC1 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+24*6]; } + _EC_brainpoolP192t1 = { + { NID_X9_62_prime_field, 0,24,1 }, + { /* no seed */ + 0xC3,0x02,0xF4,0x1D,0x93,0x2A,0x36,0xCD,0xA7,0xA3, /* p */ + 0x46,0x30,0x93,0xD1,0x8D,0xB7,0x8F,0xCE,0x47,0x6D, + 0xE1,0xA8,0x62,0x97, + 0xC3,0x02,0xF4,0x1D,0x93,0x2A,0x36,0xCD,0xA7,0xA3, /* a */ + 0x46,0x30,0x93,0xD1,0x8D,0xB7,0x8F,0xCE,0x47,0x6D, + 0xE1,0xA8,0x62,0x94, + 0x13,0xD5,0x6F,0xFA,0xEC,0x78,0x68,0x1E,0x68,0xF9, /* b */ + 0xDE,0xB4,0x3B,0x35,0xBE,0xC2,0xFB,0x68,0x54,0x2E, + 0x27,0x89,0x7B,0x79, + 0x3A,0xE9,0xE5,0x8C,0x82,0xF6,0x3C,0x30,0x28,0x2E, /* x */ + 0x1F,0xE7,0xBB,0xF4,0x3F,0xA7,0x2C,0x44,0x6A,0xF6, + 0xF4,0x61,0x81,0x29, + 0x09,0x7E,0x2C,0x56,0x67,0xC2,0x22,0x3A,0x90,0x2A, /* y */ + 0xB5,0xCA,0x44,0x9D,0x00,0x84,0xB7,0xE5,0xB3,0xDE, + 0x7C,0xCC,0x01,0xC9, + 0xC3,0x02,0xF4,0x1D,0x93,0x2A,0x36,0xCD,0xA7,0xA3, /* order */ + 0x46,0x2F,0x9E,0x9E,0x91,0x6B,0x5B,0xE8,0xF1,0x02, + 0x9A,0xC4,0xAC,0xC1 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+28*6]; } + _EC_brainpoolP224r1 = { + { NID_X9_62_prime_field, 0,28,1 }, + { /* no seed */ + 0xD7,0xC1,0x34,0xAA,0x26,0x43,0x66,0x86,0x2A,0x18, /* p */ + 0x30,0x25,0x75,0xD1,0xD7,0x87,0xB0,0x9F,0x07,0x57, + 0x97,0xDA,0x89,0xF5,0x7E,0xC8,0xC0,0xFF, + 0x68,0xA5,0xE6,0x2C,0xA9,0xCE,0x6C,0x1C,0x29,0x98, /* a */ + 0x03,0xA6,0xC1,0x53,0x0B,0x51,0x4E,0x18,0x2A,0xD8, + 0xB0,0x04,0x2A,0x59,0xCA,0xD2,0x9F,0x43, + 0x25,0x80,0xF6,0x3C,0xCF,0xE4,0x41,0x38,0x87,0x07, /* b */ + 0x13,0xB1,0xA9,0x23,0x69,0xE3,0x3E,0x21,0x35,0xD2, + 0x66,0xDB,0xB3,0x72,0x38,0x6C,0x40,0x0B, + 0x0D,0x90,0x29,0xAD,0x2C,0x7E,0x5C,0xF4,0x34,0x08, /* x */ + 0x23,0xB2,0xA8,0x7D,0xC6,0x8C,0x9E,0x4C,0xE3,0x17, + 0x4C,0x1E,0x6E,0xFD,0xEE,0x12,0xC0,0x7D, + 0x58,0xAA,0x56,0xF7,0x72,0xC0,0x72,0x6F,0x24,0xC6, /* y */ + 0xB8,0x9E,0x4E,0xCD,0xAC,0x24,0x35,0x4B,0x9E,0x99, + 0xCA,0xA3,0xF6,0xD3,0x76,0x14,0x02,0xCD, + 0xD7,0xC1,0x34,0xAA,0x26,0x43,0x66,0x86,0x2A,0x18, /* order */ + 0x30,0x25,0x75,0xD0,0xFB,0x98,0xD1,0x16,0xBC,0x4B, + 0x6D,0xDE,0xBC,0xA3,0xA5,0xA7,0x93,0x9F } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+28*6]; } + _EC_brainpoolP224t1 = { + { NID_X9_62_prime_field, 0,28,1 }, + { /* no seed */ + 0xD7,0xC1,0x34,0xAA,0x26,0x43,0x66,0x86,0x2A,0x18, /* p */ + 0x30,0x25,0x75,0xD1,0xD7,0x87,0xB0,0x9F,0x07,0x57, + 0x97,0xDA,0x89,0xF5,0x7E,0xC8,0xC0,0xFF, + 0xD7,0xC1,0x34,0xAA,0x26,0x43,0x66,0x86,0x2A,0x18, /* a */ + 0x30,0x25,0x75,0xD1,0xD7,0x87,0xB0,0x9F,0x07,0x57, + 0x97,0xDA,0x89,0xF5,0x7E,0xC8,0xC0,0xFC, + 0x4B,0x33,0x7D,0x93,0x41,0x04,0xCD,0x7B,0xEF,0x27, /* b */ + 0x1B,0xF6,0x0C,0xED,0x1E,0xD2,0x0D,0xA1,0x4C,0x08, + 0xB3,0xBB,0x64,0xF1,0x8A,0x60,0x88,0x8D, + 0x6A,0xB1,0xE3,0x44,0xCE,0x25,0xFF,0x38,0x96,0x42, /* x */ + 0x4E,0x7F,0xFE,0x14,0x76,0x2E,0xCB,0x49,0xF8,0x92, + 0x8A,0xC0,0xC7,0x60,0x29,0xB4,0xD5,0x80, + 0x03,0x74,0xE9,0xF5,0x14,0x3E,0x56,0x8C,0xD2,0x3F, /* y */ + 0x3F,0x4D,0x7C,0x0D,0x4B,0x1E,0x41,0xC8,0xCC,0x0D, + 0x1C,0x6A,0xBD,0x5F,0x1A,0x46,0xDB,0x4C, + 0xD7,0xC1,0x34,0xAA,0x26,0x43,0x66,0x86,0x2A,0x18, /* order */ + 0x30,0x25,0x75,0xD0,0xFB,0x98,0xD1,0x16,0xBC,0x4B, + 0x6D,0xDE,0xBC,0xA3,0xA5,0xA7,0x93,0x9F } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+32*6]; } + _EC_brainpoolP256r1 = { + { NID_X9_62_prime_field, 0,32,1 }, + { /* no seed */ + 0xA9,0xFB,0x57,0xDB,0xA1,0xEE,0xA9,0xBC,0x3E,0x66, /* p */ + 0x0A,0x90,0x9D,0x83,0x8D,0x72,0x6E,0x3B,0xF6,0x23, + 0xD5,0x26,0x20,0x28,0x20,0x13,0x48,0x1D,0x1F,0x6E, + 0x53,0x77, + 0x7D,0x5A,0x09,0x75,0xFC,0x2C,0x30,0x57,0xEE,0xF6, /* a */ + 0x75,0x30,0x41,0x7A,0xFF,0xE7,0xFB,0x80,0x55,0xC1, + 0x26,0xDC,0x5C,0x6C,0xE9,0x4A,0x4B,0x44,0xF3,0x30, + 0xB5,0xD9, + 0x26,0xDC,0x5C,0x6C,0xE9,0x4A,0x4B,0x44,0xF3,0x30, /* b */ + 0xB5,0xD9,0xBB,0xD7,0x7C,0xBF,0x95,0x84,0x16,0x29, + 0x5C,0xF7,0xE1,0xCE,0x6B,0xCC,0xDC,0x18,0xFF,0x8C, + 0x07,0xB6, + 0x8B,0xD2,0xAE,0xB9,0xCB,0x7E,0x57,0xCB,0x2C,0x4B, /* x */ + 0x48,0x2F,0xFC,0x81,0xB7,0xAF,0xB9,0xDE,0x27,0xE1, + 0xE3,0xBD,0x23,0xC2,0x3A,0x44,0x53,0xBD,0x9A,0xCE, + 0x32,0x62, + 0x54,0x7E,0xF8,0x35,0xC3,0xDA,0xC4,0xFD,0x97,0xF8, /* y */ + 0x46,0x1A,0x14,0x61,0x1D,0xC9,0xC2,0x77,0x45,0x13, + 0x2D,0xED,0x8E,0x54,0x5C,0x1D,0x54,0xC7,0x2F,0x04, + 0x69,0x97, + 0xA9,0xFB,0x57,0xDB,0xA1,0xEE,0xA9,0xBC,0x3E,0x66, /* order */ + 0x0A,0x90,0x9D,0x83,0x8D,0x71,0x8C,0x39,0x7A,0xA3, + 0xB5,0x61,0xA6,0xF7,0x90,0x1E,0x0E,0x82,0x97,0x48, + 0x56,0xA7 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+32*6]; } + _EC_brainpoolP256t1 = { + { NID_X9_62_prime_field, 0,32,1 }, + { /* no seed */ + 0xA9,0xFB,0x57,0xDB,0xA1,0xEE,0xA9,0xBC,0x3E,0x66, /* p */ + 0x0A,0x90,0x9D,0x83,0x8D,0x72,0x6E,0x3B,0xF6,0x23, + 0xD5,0x26,0x20,0x28,0x20,0x13,0x48,0x1D,0x1F,0x6E, + 0x53,0x77, + 0xA9,0xFB,0x57,0xDB,0xA1,0xEE,0xA9,0xBC,0x3E,0x66, /* a */ + 0x0A,0x90,0x9D,0x83,0x8D,0x72,0x6E,0x3B,0xF6,0x23, + 0xD5,0x26,0x20,0x28,0x20,0x13,0x48,0x1D,0x1F,0x6E, + 0x53,0x74, + 0x66,0x2C,0x61,0xC4,0x30,0xD8,0x4E,0xA4,0xFE,0x66, /* b */ + 0xA7,0x73,0x3D,0x0B,0x76,0xB7,0xBF,0x93,0xEB,0xC4, + 0xAF,0x2F,0x49,0x25,0x6A,0xE5,0x81,0x01,0xFE,0xE9, + 0x2B,0x04, + 0xA3,0xE8,0xEB,0x3C,0xC1,0xCF,0xE7,0xB7,0x73,0x22, /* x */ + 0x13,0xB2,0x3A,0x65,0x61,0x49,0xAF,0xA1,0x42,0xC4, + 0x7A,0xAF,0xBC,0x2B,0x79,0xA1,0x91,0x56,0x2E,0x13, + 0x05,0xF4, + 0x2D,0x99,0x6C,0x82,0x34,0x39,0xC5,0x6D,0x7F,0x7B, /* y */ + 0x22,0xE1,0x46,0x44,0x41,0x7E,0x69,0xBC,0xB6,0xDE, + 0x39,0xD0,0x27,0x00,0x1D,0xAB,0xE8,0xF3,0x5B,0x25, + 0xC9,0xBE, + 0xA9,0xFB,0x57,0xDB,0xA1,0xEE,0xA9,0xBC,0x3E,0x66, /* order */ + 0x0A,0x90,0x9D,0x83,0x8D,0x71,0x8C,0x39,0x7A,0xA3, + 0xB5,0x61,0xA6,0xF7,0x90,0x1E,0x0E,0x82,0x97,0x48, + 0x56,0xA7 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+40*6]; } + _EC_brainpoolP320r1 = { + { NID_X9_62_prime_field, 0,40,1 }, + { /* no seed */ + 0xD3,0x5E,0x47,0x20,0x36,0xBC,0x4F,0xB7,0xE1,0x3C, /* p */ + 0x78,0x5E,0xD2,0x01,0xE0,0x65,0xF9,0x8F,0xCF,0xA6, + 0xF6,0xF4,0x0D,0xEF,0x4F,0x92,0xB9,0xEC,0x78,0x93, + 0xEC,0x28,0xFC,0xD4,0x12,0xB1,0xF1,0xB3,0x2E,0x27, + 0x3E,0xE3,0x0B,0x56,0x8F,0xBA,0xB0,0xF8,0x83,0xCC, /* a */ + 0xEB,0xD4,0x6D,0x3F,0x3B,0xB8,0xA2,0xA7,0x35,0x13, + 0xF5,0xEB,0x79,0xDA,0x66,0x19,0x0E,0xB0,0x85,0xFF, + 0xA9,0xF4,0x92,0xF3,0x75,0xA9,0x7D,0x86,0x0E,0xB4, + 0x52,0x08,0x83,0x94,0x9D,0xFD,0xBC,0x42,0xD3,0xAD, /* b */ + 0x19,0x86,0x40,0x68,0x8A,0x6F,0xE1,0x3F,0x41,0x34, + 0x95,0x54,0xB4,0x9A,0xCC,0x31,0xDC,0xCD,0x88,0x45, + 0x39,0x81,0x6F,0x5E,0xB4,0xAC,0x8F,0xB1,0xF1,0xA6, + 0x43,0xBD,0x7E,0x9A,0xFB,0x53,0xD8,0xB8,0x52,0x89, /* x */ + 0xBC,0xC4,0x8E,0xE5,0xBF,0xE6,0xF2,0x01,0x37,0xD1, + 0x0A,0x08,0x7E,0xB6,0xE7,0x87,0x1E,0x2A,0x10,0xA5, + 0x99,0xC7,0x10,0xAF,0x8D,0x0D,0x39,0xE2,0x06,0x11, + 0x14,0xFD,0xD0,0x55,0x45,0xEC,0x1C,0xC8,0xAB,0x40, /* y */ + 0x93,0x24,0x7F,0x77,0x27,0x5E,0x07,0x43,0xFF,0xED, + 0x11,0x71,0x82,0xEA,0xA9,0xC7,0x78,0x77,0xAA,0xAC, + 0x6A,0xC7,0xD3,0x52,0x45,0xD1,0x69,0x2E,0x8E,0xE1, + 0xD3,0x5E,0x47,0x20,0x36,0xBC,0x4F,0xB7,0xE1,0x3C, /* order */ + 0x78,0x5E,0xD2,0x01,0xE0,0x65,0xF9,0x8F,0xCF,0xA5, + 0xB6,0x8F,0x12,0xA3,0x2D,0x48,0x2E,0xC7,0xEE,0x86, + 0x58,0xE9,0x86,0x91,0x55,0x5B,0x44,0xC5,0x93,0x11 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+40*6]; } + _EC_brainpoolP320t1 = { + { NID_X9_62_prime_field, 0,40,1 }, + { /* no seed */ + 0xD3,0x5E,0x47,0x20,0x36,0xBC,0x4F,0xB7,0xE1,0x3C, /* p */ + 0x78,0x5E,0xD2,0x01,0xE0,0x65,0xF9,0x8F,0xCF,0xA6, + 0xF6,0xF4,0x0D,0xEF,0x4F,0x92,0xB9,0xEC,0x78,0x93, + 0xEC,0x28,0xFC,0xD4,0x12,0xB1,0xF1,0xB3,0x2E,0x27, + 0xD3,0x5E,0x47,0x20,0x36,0xBC,0x4F,0xB7,0xE1,0x3C, /* a */ + 0x78,0x5E,0xD2,0x01,0xE0,0x65,0xF9,0x8F,0xCF,0xA6, + 0xF6,0xF4,0x0D,0xEF,0x4F,0x92,0xB9,0xEC,0x78,0x93, + 0xEC,0x28,0xFC,0xD4,0x12,0xB1,0xF1,0xB3,0x2E,0x24, + 0xA7,0xF5,0x61,0xE0,0x38,0xEB,0x1E,0xD5,0x60,0xB3, /* b */ + 0xD1,0x47,0xDB,0x78,0x20,0x13,0x06,0x4C,0x19,0xF2, + 0x7E,0xD2,0x7C,0x67,0x80,0xAA,0xF7,0x7F,0xB8,0xA5, + 0x47,0xCE,0xB5,0xB4,0xFE,0xF4,0x22,0x34,0x03,0x53, + 0x92,0x5B,0xE9,0xFB,0x01,0xAF,0xC6,0xFB,0x4D,0x3E, /* x */ + 0x7D,0x49,0x90,0x01,0x0F,0x81,0x34,0x08,0xAB,0x10, + 0x6C,0x4F,0x09,0xCB,0x7E,0xE0,0x78,0x68,0xCC,0x13, + 0x6F,0xFF,0x33,0x57,0xF6,0x24,0xA2,0x1B,0xED,0x52, + 0x63,0xBA,0x3A,0x7A,0x27,0x48,0x3E,0xBF,0x66,0x71, /* y */ + 0xDB,0xEF,0x7A,0xBB,0x30,0xEB,0xEE,0x08,0x4E,0x58, + 0xA0,0xB0,0x77,0xAD,0x42,0xA5,0xA0,0x98,0x9D,0x1E, + 0xE7,0x1B,0x1B,0x9B,0xC0,0x45,0x5F,0xB0,0xD2,0xC3, + 0xD3,0x5E,0x47,0x20,0x36,0xBC,0x4F,0xB7,0xE1,0x3C, /* order */ + 0x78,0x5E,0xD2,0x01,0xE0,0x65,0xF9,0x8F,0xCF,0xA5, + 0xB6,0x8F,0x12,0xA3,0x2D,0x48,0x2E,0xC7,0xEE,0x86, + 0x58,0xE9,0x86,0x91,0x55,0x5B,0x44,0xC5,0x93,0x11 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+48*6]; } + _EC_brainpoolP384r1 = { + { NID_X9_62_prime_field, 0,48,1 }, + { /* no seed */ + 0x8C,0xB9,0x1E,0x82,0xA3,0x38,0x6D,0x28,0x0F,0x5D, /* p */ + 0x6F,0x7E,0x50,0xE6,0x41,0xDF,0x15,0x2F,0x71,0x09, + 0xED,0x54,0x56,0xB4,0x12,0xB1,0xDA,0x19,0x7F,0xB7, + 0x11,0x23,0xAC,0xD3,0xA7,0x29,0x90,0x1D,0x1A,0x71, + 0x87,0x47,0x00,0x13,0x31,0x07,0xEC,0x53, + 0x7B,0xC3,0x82,0xC6,0x3D,0x8C,0x15,0x0C,0x3C,0x72, /* a */ + 0x08,0x0A,0xCE,0x05,0xAF,0xA0,0xC2,0xBE,0xA2,0x8E, + 0x4F,0xB2,0x27,0x87,0x13,0x91,0x65,0xEF,0xBA,0x91, + 0xF9,0x0F,0x8A,0xA5,0x81,0x4A,0x50,0x3A,0xD4,0xEB, + 0x04,0xA8,0xC7,0xDD,0x22,0xCE,0x28,0x26, + 0x04,0xA8,0xC7,0xDD,0x22,0xCE,0x28,0x26,0x8B,0x39, /* b */ + 0xB5,0x54,0x16,0xF0,0x44,0x7C,0x2F,0xB7,0x7D,0xE1, + 0x07,0xDC,0xD2,0xA6,0x2E,0x88,0x0E,0xA5,0x3E,0xEB, + 0x62,0xD5,0x7C,0xB4,0x39,0x02,0x95,0xDB,0xC9,0x94, + 0x3A,0xB7,0x86,0x96,0xFA,0x50,0x4C,0x11, + 0x1D,0x1C,0x64,0xF0,0x68,0xCF,0x45,0xFF,0xA2,0xA6, /* x */ + 0x3A,0x81,0xB7,0xC1,0x3F,0x6B,0x88,0x47,0xA3,0xE7, + 0x7E,0xF1,0x4F,0xE3,0xDB,0x7F,0xCA,0xFE,0x0C,0xBD, + 0x10,0xE8,0xE8,0x26,0xE0,0x34,0x36,0xD6,0x46,0xAA, + 0xEF,0x87,0xB2,0xE2,0x47,0xD4,0xAF,0x1E, + 0x8A,0xBE,0x1D,0x75,0x20,0xF9,0xC2,0xA4,0x5C,0xB1, /* y */ + 0xEB,0x8E,0x95,0xCF,0xD5,0x52,0x62,0xB7,0x0B,0x29, + 0xFE,0xEC,0x58,0x64,0xE1,0x9C,0x05,0x4F,0xF9,0x91, + 0x29,0x28,0x0E,0x46,0x46,0x21,0x77,0x91,0x81,0x11, + 0x42,0x82,0x03,0x41,0x26,0x3C,0x53,0x15, + 0x8C,0xB9,0x1E,0x82,0xA3,0x38,0x6D,0x28,0x0F,0x5D, /* order */ + 0x6F,0x7E,0x50,0xE6,0x41,0xDF,0x15,0x2F,0x71,0x09, + 0xED,0x54,0x56,0xB3,0x1F,0x16,0x6E,0x6C,0xAC,0x04, + 0x25,0xA7,0xCF,0x3A,0xB6,0xAF,0x6B,0x7F,0xC3,0x10, + 0x3B,0x88,0x32,0x02,0xE9,0x04,0x65,0x65 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+48*6]; } + _EC_brainpoolP384t1 = { + { NID_X9_62_prime_field, 0,48,1 }, + { /* no seed */ + 0x8C,0xB9,0x1E,0x82,0xA3,0x38,0x6D,0x28,0x0F,0x5D, /* p */ + 0x6F,0x7E,0x50,0xE6,0x41,0xDF,0x15,0x2F,0x71,0x09, + 0xED,0x54,0x56,0xB4,0x12,0xB1,0xDA,0x19,0x7F,0xB7, + 0x11,0x23,0xAC,0xD3,0xA7,0x29,0x90,0x1D,0x1A,0x71, + 0x87,0x47,0x00,0x13,0x31,0x07,0xEC,0x53, + 0x8C,0xB9,0x1E,0x82,0xA3,0x38,0x6D,0x28,0x0F,0x5D, /* a */ + 0x6F,0x7E,0x50,0xE6,0x41,0xDF,0x15,0x2F,0x71,0x09, + 0xED,0x54,0x56,0xB4,0x12,0xB1,0xDA,0x19,0x7F,0xB7, + 0x11,0x23,0xAC,0xD3,0xA7,0x29,0x90,0x1D,0x1A,0x71, + 0x87,0x47,0x00,0x13,0x31,0x07,0xEC,0x50, + 0x7F,0x51,0x9E,0xAD,0xA7,0xBD,0xA8,0x1B,0xD8,0x26, /* b */ + 0xDB,0xA6,0x47,0x91,0x0F,0x8C,0x4B,0x93,0x46,0xED, + 0x8C,0xCD,0xC6,0x4E,0x4B,0x1A,0xBD,0x11,0x75,0x6D, + 0xCE,0x1D,0x20,0x74,0xAA,0x26,0x3B,0x88,0x80,0x5C, + 0xED,0x70,0x35,0x5A,0x33,0xB4,0x71,0xEE, + 0x18,0xDE,0x98,0xB0,0x2D,0xB9,0xA3,0x06,0xF2,0xAF, /* x */ + 0xCD,0x72,0x35,0xF7,0x2A,0x81,0x9B,0x80,0xAB,0x12, + 0xEB,0xD6,0x53,0x17,0x24,0x76,0xFE,0xCD,0x46,0x2A, + 0xAB,0xFF,0xC4,0xFF,0x19,0x1B,0x94,0x6A,0x5F,0x54, + 0xD8,0xD0,0xAA,0x2F,0x41,0x88,0x08,0xCC, + 0x25,0xAB,0x05,0x69,0x62,0xD3,0x06,0x51,0xA1,0x14, /* y */ + 0xAF,0xD2,0x75,0x5A,0xD3,0x36,0x74,0x7F,0x93,0x47, + 0x5B,0x7A,0x1F,0xCA,0x3B,0x88,0xF2,0xB6,0xA2,0x08, + 0xCC,0xFE,0x46,0x94,0x08,0x58,0x4D,0xC2,0xB2,0x91, + 0x26,0x75,0xBF,0x5B,0x9E,0x58,0x29,0x28, + 0x8C,0xB9,0x1E,0x82,0xA3,0x38,0x6D,0x28,0x0F,0x5D, /* order */ + 0x6F,0x7E,0x50,0xE6,0x41,0xDF,0x15,0x2F,0x71,0x09, + 0xED,0x54,0x56,0xB3,0x1F,0x16,0x6E,0x6C,0xAC,0x04, + 0x25,0xA7,0xCF,0x3A,0xB6,0xAF,0x6B,0x7F,0xC3,0x10, + 0x3B,0x88,0x32,0x02,0xE9,0x04,0x65,0x65 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+64*6]; } + _EC_brainpoolP512r1 = { + { NID_X9_62_prime_field, 0,64,1 }, + { /* no seed */ + 0xAA,0xDD,0x9D,0xB8,0xDB,0xE9,0xC4,0x8B,0x3F,0xD4, /* p */ + 0xE6,0xAE,0x33,0xC9,0xFC,0x07,0xCB,0x30,0x8D,0xB3, + 0xB3,0xC9,0xD2,0x0E,0xD6,0x63,0x9C,0xCA,0x70,0x33, + 0x08,0x71,0x7D,0x4D,0x9B,0x00,0x9B,0xC6,0x68,0x42, + 0xAE,0xCD,0xA1,0x2A,0xE6,0xA3,0x80,0xE6,0x28,0x81, + 0xFF,0x2F,0x2D,0x82,0xC6,0x85,0x28,0xAA,0x60,0x56, + 0x58,0x3A,0x48,0xF3, + 0x78,0x30,0xA3,0x31,0x8B,0x60,0x3B,0x89,0xE2,0x32, /* a */ + 0x71,0x45,0xAC,0x23,0x4C,0xC5,0x94,0xCB,0xDD,0x8D, + 0x3D,0xF9,0x16,0x10,0xA8,0x34,0x41,0xCA,0xEA,0x98, + 0x63,0xBC,0x2D,0xED,0x5D,0x5A,0xA8,0x25,0x3A,0xA1, + 0x0A,0x2E,0xF1,0xC9,0x8B,0x9A,0xC8,0xB5,0x7F,0x11, + 0x17,0xA7,0x2B,0xF2,0xC7,0xB9,0xE7,0xC1,0xAC,0x4D, + 0x77,0xFC,0x94,0xCA, + 0x3D,0xF9,0x16,0x10,0xA8,0x34,0x41,0xCA,0xEA,0x98, /* b */ + 0x63,0xBC,0x2D,0xED,0x5D,0x5A,0xA8,0x25,0x3A,0xA1, + 0x0A,0x2E,0xF1,0xC9,0x8B,0x9A,0xC8,0xB5,0x7F,0x11, + 0x17,0xA7,0x2B,0xF2,0xC7,0xB9,0xE7,0xC1,0xAC,0x4D, + 0x77,0xFC,0x94,0xCA,0xDC,0x08,0x3E,0x67,0x98,0x40, + 0x50,0xB7,0x5E,0xBA,0xE5,0xDD,0x28,0x09,0xBD,0x63, + 0x80,0x16,0xF7,0x23, + 0x81,0xAE,0xE4,0xBD,0xD8,0x2E,0xD9,0x64,0x5A,0x21, /* x */ + 0x32,0x2E,0x9C,0x4C,0x6A,0x93,0x85,0xED,0x9F,0x70, + 0xB5,0xD9,0x16,0xC1,0xB4,0x3B,0x62,0xEE,0xF4,0xD0, + 0x09,0x8E,0xFF,0x3B,0x1F,0x78,0xE2,0xD0,0xD4,0x8D, + 0x50,0xD1,0x68,0x7B,0x93,0xB9,0x7D,0x5F,0x7C,0x6D, + 0x50,0x47,0x40,0x6A,0x5E,0x68,0x8B,0x35,0x22,0x09, + 0xBC,0xB9,0xF8,0x22, + 0x7D,0xDE,0x38,0x5D,0x56,0x63,0x32,0xEC,0xC0,0xEA, /* y */ + 0xBF,0xA9,0xCF,0x78,0x22,0xFD,0xF2,0x09,0xF7,0x00, + 0x24,0xA5,0x7B,0x1A,0xA0,0x00,0xC5,0x5B,0x88,0x1F, + 0x81,0x11,0xB2,0xDC,0xDE,0x49,0x4A,0x5F,0x48,0x5E, + 0x5B,0xCA,0x4B,0xD8,0x8A,0x27,0x63,0xAE,0xD1,0xCA, + 0x2B,0x2F,0xA8,0xF0,0x54,0x06,0x78,0xCD,0x1E,0x0F, + 0x3A,0xD8,0x08,0x92, + 0xAA,0xDD,0x9D,0xB8,0xDB,0xE9,0xC4,0x8B,0x3F,0xD4, /* order */ + 0xE6,0xAE,0x33,0xC9,0xFC,0x07,0xCB,0x30,0x8D,0xB3, + 0xB3,0xC9,0xD2,0x0E,0xD6,0x63,0x9C,0xCA,0x70,0x33, + 0x08,0x70,0x55,0x3E,0x5C,0x41,0x4C,0xA9,0x26,0x19, + 0x41,0x86,0x61,0x19,0x7F,0xAC,0x10,0x47,0x1D,0xB1, + 0xD3,0x81,0x08,0x5D,0xDA,0xDD,0xB5,0x87,0x96,0x82, + 0x9C,0xA9,0x00,0x69 } + }; + +static const struct { EC_CURVE_DATA h; unsigned char data[0+64*6]; } + _EC_brainpoolP512t1 = { + { NID_X9_62_prime_field, 0,64,1 }, + { /* no seed */ + 0xAA,0xDD,0x9D,0xB8,0xDB,0xE9,0xC4,0x8B,0x3F,0xD4, /* p */ + 0xE6,0xAE,0x33,0xC9,0xFC,0x07,0xCB,0x30,0x8D,0xB3, + 0xB3,0xC9,0xD2,0x0E,0xD6,0x63,0x9C,0xCA,0x70,0x33, + 0x08,0x71,0x7D,0x4D,0x9B,0x00,0x9B,0xC6,0x68,0x42, + 0xAE,0xCD,0xA1,0x2A,0xE6,0xA3,0x80,0xE6,0x28,0x81, + 0xFF,0x2F,0x2D,0x82,0xC6,0x85,0x28,0xAA,0x60,0x56, + 0x58,0x3A,0x48,0xF3, + 0xAA,0xDD,0x9D,0xB8,0xDB,0xE9,0xC4,0x8B,0x3F,0xD4, /* a */ + 0xE6,0xAE,0x33,0xC9,0xFC,0x07,0xCB,0x30,0x8D,0xB3, + 0xB3,0xC9,0xD2,0x0E,0xD6,0x63,0x9C,0xCA,0x70,0x33, + 0x08,0x71,0x7D,0x4D,0x9B,0x00,0x9B,0xC6,0x68,0x42, + 0xAE,0xCD,0xA1,0x2A,0xE6,0xA3,0x80,0xE6,0x28,0x81, + 0xFF,0x2F,0x2D,0x82,0xC6,0x85,0x28,0xAA,0x60,0x56, + 0x58,0x3A,0x48,0xF0, + 0x7C,0xBB,0xBC,0xF9,0x44,0x1C,0xFA,0xB7,0x6E,0x18, /* b */ + 0x90,0xE4,0x68,0x84,0xEA,0xE3,0x21,0xF7,0x0C,0x0B, + 0xCB,0x49,0x81,0x52,0x78,0x97,0x50,0x4B,0xEC,0x3E, + 0x36,0xA6,0x2B,0xCD,0xFA,0x23,0x04,0x97,0x65,0x40, + 0xF6,0x45,0x00,0x85,0xF2,0xDA,0xE1,0x45,0xC2,0x25, + 0x53,0xB4,0x65,0x76,0x36,0x89,0x18,0x0E,0xA2,0x57, + 0x18,0x67,0x42,0x3E, + 0x64,0x0E,0xCE,0x5C,0x12,0x78,0x87,0x17,0xB9,0xC1, /* x */ + 0xBA,0x06,0xCB,0xC2,0xA6,0xFE,0xBA,0x85,0x84,0x24, + 0x58,0xC5,0x6D,0xDE,0x9D,0xB1,0x75,0x8D,0x39,0xC0, + 0x31,0x3D,0x82,0xBA,0x51,0x73,0x5C,0xDB,0x3E,0xA4, + 0x99,0xAA,0x77,0xA7,0xD6,0x94,0x3A,0x64,0xF7,0xA3, + 0xF2,0x5F,0xE2,0x6F,0x06,0xB5,0x1B,0xAA,0x26,0x96, + 0xFA,0x90,0x35,0xDA, + 0x5B,0x53,0x4B,0xD5,0x95,0xF5,0xAF,0x0F,0xA2,0xC8, /* y */ + 0x92,0x37,0x6C,0x84,0xAC,0xE1,0xBB,0x4E,0x30,0x19, + 0xB7,0x16,0x34,0xC0,0x11,0x31,0x15,0x9C,0xAE,0x03, + 0xCE,0xE9,0xD9,0x93,0x21,0x84,0xBE,0xEF,0x21,0x6B, + 0xD7,0x1D,0xF2,0xDA,0xDF,0x86,0xA6,0x27,0x30,0x6E, + 0xCF,0xF9,0x6D,0xBB,0x8B,0xAC,0xE1,0x98,0xB6,0x1E, + 0x00,0xF8,0xB3,0x32, + 0xAA,0xDD,0x9D,0xB8,0xDB,0xE9,0xC4,0x8B,0x3F,0xD4, /* order */ + 0xE6,0xAE,0x33,0xC9,0xFC,0x07,0xCB,0x30,0x8D,0xB3, + 0xB3,0xC9,0xD2,0x0E,0xD6,0x63,0x9C,0xCA,0x70,0x33, + 0x08,0x70,0x55,0x3E,0x5C,0x41,0x4C,0xA9,0x26,0x19, + 0x41,0x86,0x61,0x19,0x7F,0xAC,0x10,0x47,0x1D,0xB1, + 0xD3,0x81,0x08,0x5D,0xDA,0xDD,0xB5,0x87,0x96,0x82, + 0x9C,0xA9,0x00,0x69 } + }; + typedef struct _ec_list_element_st { int nid; const EC_CURVE_DATA *data; @@ -1928,6 +2356,21 @@ static const ec_list_element curve_list[] = { { NID_ipsec4, &_EC_IPSEC_185_ID4.h, 0, "\n\tIPSec/IKE/Oakley curve #4 over a 185 bit binary field.\n" "\tNot suitable for ECDSA.\n\tQuestionable extension field!" }, #endif + /* brainpool curves */ + { NID_brainpoolP160r1, &_EC_brainpoolP160r1.h, 0, "RFC 5639 curve over a 160 bit prime field"}, + { NID_brainpoolP160t1, &_EC_brainpoolP160t1.h, 0, "RFC 5639 curve over a 160 bit prime field"}, + { NID_brainpoolP192r1, &_EC_brainpoolP192r1.h, 0, "RFC 5639 curve over a 192 bit prime field"}, + { NID_brainpoolP192t1, &_EC_brainpoolP192t1.h, 0, "RFC 5639 curve over a 192 bit prime field"}, + { NID_brainpoolP224r1, &_EC_brainpoolP224r1.h, 0, "RFC 5639 curve over a 224 bit prime field"}, + { NID_brainpoolP224t1, &_EC_brainpoolP224t1.h, 0, "RFC 5639 curve over a 224 bit prime field"}, + { NID_brainpoolP256r1, &_EC_brainpoolP256r1.h, 0, "RFC 5639 curve over a 256 bit prime field"}, + { NID_brainpoolP256t1, &_EC_brainpoolP256t1.h, 0, "RFC 5639 curve over a 256 bit prime field"}, + { NID_brainpoolP320r1, &_EC_brainpoolP320r1.h, 0, "RFC 5639 curve over a 320 bit prime field"}, + { NID_brainpoolP320t1, &_EC_brainpoolP320t1.h, 0, "RFC 5639 curve over a 320 bit prime field"}, + { NID_brainpoolP384r1, &_EC_brainpoolP384r1.h, 0, "RFC 5639 curve over a 384 bit prime field"}, + { NID_brainpoolP384t1, &_EC_brainpoolP384t1.h, 0, "RFC 5639 curve over a 384 bit prime field"}, + { NID_brainpoolP512r1, &_EC_brainpoolP512r1.h, 0, "RFC 5639 curve over a 512 bit prime field"}, + { NID_brainpoolP512t1, &_EC_brainpoolP512t1.h, 0, "RFC 5639 curve over a 512 bit prime field"}, }; #define curve_list_length (sizeof(curve_list)/sizeof(ec_list_element)) diff --git a/crypto/objects/obj_dat.h b/crypto/objects/obj_dat.h index bc69665..cbc8d2c 100644 --- a/crypto/objects/obj_dat.h +++ b/crypto/objects/obj_dat.h @@ -62,12 +62,12 @@ * [including the GNU Public Licence.] */ -#define NUM_NID 920 -#define NUM_SN 913 -#define NUM_LN 913 -#define NUM_OBJ 857 +#define NUM_NID 935 +#define NUM_SN 928 +#define NUM_LN 928 +#define NUM_OBJ 872 -static const unsigned char lvalues[5974]={ +static const unsigned char lvalues[6107]={ 0x2A,0x86,0x48,0x86,0xF7,0x0D, /* [ 0] OBJ_rsadsi */ 0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01, /* [ 6] OBJ_pkcs */ 0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x02, /* [ 13] OBJ_md2 */ @@ -919,6 +919,21 @@ static const unsigned char lvalues[5974]={ 0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x08,/* [5946] OBJ_mgf1 */ 0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0A,/* [5955] OBJ_rsassaPss */ 0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x07,/* [5964] OBJ_rsaesOaep */ +0x2A,0x86,0x48,0xCE,0x3E,0x02,0x01, /* [5973] OBJ_dhpublicnumber */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x01,/* [5980] OBJ_brainpoolP160r1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x02,/* [5989] OBJ_brainpoolP160t1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x03,/* [5998] OBJ_brainpoolP192r1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x04,/* [6007] OBJ_brainpoolP192t1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x05,/* [6016] OBJ_brainpoolP224r1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x06,/* [6025] OBJ_brainpoolP224t1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x07,/* [6034] OBJ_brainpoolP256r1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x08,/* [6043] OBJ_brainpoolP256t1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x09,/* [6052] OBJ_brainpoolP320r1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0A,/* [6061] OBJ_brainpoolP320t1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0B,/* [6070] OBJ_brainpoolP384r1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0C,/* [6079] OBJ_brainpoolP384t1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0D,/* [6088] OBJ_brainpoolP512r1 */ +0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0E,/* [6097] OBJ_brainpoolP512t1 */ }; static const ASN1_OBJECT nid_objs[NUM_NID]={ @@ -2399,6 +2414,35 @@ static const ASN1_OBJECT nid_objs[NUM_NID]={ {"AES-256-CBC-HMAC-SHA1","aes-256-cbc-hmac-sha1", NID_aes_256_cbc_hmac_sha1,0,NULL,0}, {"RSAES-OAEP","rsaesOaep",NID_rsaesOaep,9,&(lvalues[5964]),0}, +{"dhpublicnumber","X9.42 DH",NID_dhpublicnumber,7,&(lvalues[5973]),0}, +{"brainpoolP160r1","brainpoolP160r1",NID_brainpoolP160r1,9, + &(lvalues[5980]),0}, +{"brainpoolP160t1","brainpoolP160t1",NID_brainpoolP160t1,9, + &(lvalues[5989]),0}, +{"brainpoolP192r1","brainpoolP192r1",NID_brainpoolP192r1,9, + &(lvalues[5998]),0}, +{"brainpoolP192t1","brainpoolP192t1",NID_brainpoolP192t1,9, + &(lvalues[6007]),0}, +{"brainpoolP224r1","brainpoolP224r1",NID_brainpoolP224r1,9, + &(lvalues[6016]),0}, +{"brainpoolP224t1","brainpoolP224t1",NID_brainpoolP224t1,9, + &(lvalues[6025]),0}, +{"brainpoolP256r1","brainpoolP256r1",NID_brainpoolP256r1,9, + &(lvalues[6034]),0}, +{"brainpoolP256t1","brainpoolP256t1",NID_brainpoolP256t1,9, + &(lvalues[6043]),0}, +{"brainpoolP320r1","brainpoolP320r1",NID_brainpoolP320r1,9, + &(lvalues[6052]),0}, +{"brainpoolP320t1","brainpoolP320t1",NID_brainpoolP320t1,9, + &(lvalues[6061]),0}, +{"brainpoolP384r1","brainpoolP384r1",NID_brainpoolP384r1,9, + &(lvalues[6070]),0}, +{"brainpoolP384t1","brainpoolP384t1",NID_brainpoolP384t1,9, + &(lvalues[6079]),0}, +{"brainpoolP512r1","brainpoolP512r1",NID_brainpoolP512r1,9, + &(lvalues[6088]),0}, +{"brainpoolP512t1","brainpoolP512t1",NID_brainpoolP512t1,9, + &(lvalues[6097]),0}, }; static const unsigned int sn_objs[NUM_SN]={ @@ -2613,6 +2657,20 @@ static const unsigned int sn_objs[NUM_SN]={ 87, /* "basicConstraints" */ 365, /* "basicOCSPResponse" */ 285, /* "biometricInfo" */ +921, /* "brainpoolP160r1" */ +922, /* "brainpoolP160t1" */ +923, /* "brainpoolP192r1" */ +924, /* "brainpoolP192t1" */ +925, /* "brainpoolP224r1" */ +926, /* "brainpoolP224t1" */ +927, /* "brainpoolP256r1" */ +928, /* "brainpoolP256t1" */ +929, /* "brainpoolP320r1" */ +930, /* "brainpoolP320t1" */ +931, /* "brainpoolP384r1" */ +932, /* "brainpoolP384t1" */ +933, /* "brainpoolP512r1" */ +934, /* "brainpoolP512t1" */ 494, /* "buildingName" */ 860, /* "businessCategory" */ 691, /* "c2onb191v4" */ @@ -2668,6 +2726,7 @@ static const unsigned int sn_objs[NUM_SN]={ 107, /* "description" */ 871, /* "destinationIndicator" */ 28, /* "dhKeyAgreement" */ +920, /* "dhpublicnumber" */ 382, /* "directory" */ 887, /* "distinguishedName" */ 892, /* "dmdName" */ @@ -3451,6 +3510,7 @@ static const unsigned int ln_objs[NUM_LN]={ 85, /* "X509v3 Subject Alternative Name" */ 769, /* "X509v3 Subject Directory Attributes" */ 82, /* "X509v3 Subject Key Identifier" */ +920, /* "X9.42 DH" */ 184, /* "X9.57" */ 185, /* "X9.57 CM ?" */ 478, /* "aRecord" */ @@ -3502,6 +3562,20 @@ static const unsigned int ln_objs[NUM_LN]={ 93, /* "bf-cfb" */ 92, /* "bf-ecb" */ 94, /* "bf-ofb" */ +921, /* "brainpoolP160r1" */ +922, /* "brainpoolP160t1" */ +923, /* "brainpoolP192r1" */ +924, /* "brainpoolP192t1" */ +925, /* "brainpoolP224r1" */ +926, /* "brainpoolP224t1" */ +927, /* "brainpoolP256r1" */ +928, /* "brainpoolP256t1" */ +929, /* "brainpoolP320r1" */ +930, /* "brainpoolP320t1" */ +931, /* "brainpoolP384r1" */ +932, /* "brainpoolP384t1" */ +933, /* "brainpoolP512r1" */ +934, /* "brainpoolP512t1" */ 494, /* "buildingName" */ 860, /* "businessCategory" */ 691, /* "c2onb191v4" */ @@ -4608,6 +4682,7 @@ static const unsigned int obj_objs[NUM_OBJ]={ 416, /* OBJ_ecdsa_with_SHA1 1 2 840 10045 4 1 */ 791, /* OBJ_ecdsa_with_Recommended 1 2 840 10045 4 2 */ 792, /* OBJ_ecdsa_with_Specified 1 2 840 10045 4 3 */ +920, /* OBJ_dhpublicnumber 1 2 840 10046 2 1 */ 258, /* OBJ_id_pkix_mod 1 3 6 1 5 5 7 0 */ 175, /* OBJ_id_pe 1 3 6 1 5 5 7 1 */ 259, /* OBJ_id_qt 1 3 6 1 5 5 7 2 */ @@ -4886,6 +4961,20 @@ static const unsigned int obj_objs[NUM_OBJ]={ 373, /* OBJ_id_pkix_OCSP_valid 1 3 6 1 5 5 7 48 1 9 */ 374, /* OBJ_id_pkix_OCSP_path 1 3 6 1 5 5 7 48 1 10 */ 375, /* OBJ_id_pkix_OCSP_trustRoot 1 3 6 1 5 5 7 48 1 11 */ +921, /* OBJ_brainpoolP160r1 1 3 36 3 3 2 8 1 1 1 */ +922, /* OBJ_brainpoolP160t1 1 3 36 3 3 2 8 1 1 2 */ +923, /* OBJ_brainpoolP192r1 1 3 36 3 3 2 8 1 1 3 */ +924, /* OBJ_brainpoolP192t1 1 3 36 3 3 2 8 1 1 4 */ +925, /* OBJ_brainpoolP224r1 1 3 36 3 3 2 8 1 1 5 */ +926, /* OBJ_brainpoolP224t1 1 3 36 3 3 2 8 1 1 6 */ +927, /* OBJ_brainpoolP256r1 1 3 36 3 3 2 8 1 1 7 */ +928, /* OBJ_brainpoolP256t1 1 3 36 3 3 2 8 1 1 8 */ +929, /* OBJ_brainpoolP320r1 1 3 36 3 3 2 8 1 1 9 */ +930, /* OBJ_brainpoolP320t1 1 3 36 3 3 2 8 1 1 10 */ +931, /* OBJ_brainpoolP384r1 1 3 36 3 3 2 8 1 1 11 */ +932, /* OBJ_brainpoolP384t1 1 3 36 3 3 2 8 1 1 12 */ +933, /* OBJ_brainpoolP512r1 1 3 36 3 3 2 8 1 1 13 */ +934, /* OBJ_brainpoolP512t1 1 3 36 3 3 2 8 1 1 14 */ 418, /* OBJ_aes_128_ecb 2 16 840 1 101 3 4 1 1 */ 419, /* OBJ_aes_128_cbc 2 16 840 1 101 3 4 1 2 */ 420, /* OBJ_aes_128_ofb128 2 16 840 1 101 3 4 1 3 */ diff --git a/crypto/objects/obj_mac.h b/crypto/objects/obj_mac.h index b5ea7cd..704697e 100644 --- a/crypto/objects/obj_mac.h +++ b/crypto/objects/obj_mac.h @@ -4030,3 +4030,64 @@ #define LN_aes_256_cbc_hmac_sha1 "aes-256-cbc-hmac-sha1" #define NID_aes_256_cbc_hmac_sha1 918 +#define SN_dhpublicnumber "dhpublicnumber" +#define LN_dhpublicnumber "X9.42 DH" +#define NID_dhpublicnumber 920 +#define OBJ_dhpublicnumber OBJ_ISO_US,10046L,2L,1L + +#define SN_brainpoolP160r1 "brainpoolP160r1" +#define NID_brainpoolP160r1 921 +#define OBJ_brainpoolP160r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,1L + +#define SN_brainpoolP160t1 "brainpoolP160t1" +#define NID_brainpoolP160t1 922 +#define OBJ_brainpoolP160t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,2L + +#define SN_brainpoolP192r1 "brainpoolP192r1" +#define NID_brainpoolP192r1 923 +#define OBJ_brainpoolP192r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,3L + +#define SN_brainpoolP192t1 "brainpoolP192t1" +#define NID_brainpoolP192t1 924 +#define OBJ_brainpoolP192t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,4L + +#define SN_brainpoolP224r1 "brainpoolP224r1" +#define NID_brainpoolP224r1 925 +#define OBJ_brainpoolP224r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,5L + +#define SN_brainpoolP224t1 "brainpoolP224t1" +#define NID_brainpoolP224t1 926 +#define OBJ_brainpoolP224t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,6L + +#define SN_brainpoolP256r1 "brainpoolP256r1" +#define NID_brainpoolP256r1 927 +#define OBJ_brainpoolP256r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,7L + +#define SN_brainpoolP256t1 "brainpoolP256t1" +#define NID_brainpoolP256t1 928 +#define OBJ_brainpoolP256t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,8L + +#define SN_brainpoolP320r1 "brainpoolP320r1" +#define NID_brainpoolP320r1 929 +#define OBJ_brainpoolP320r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,9L + +#define SN_brainpoolP320t1 "brainpoolP320t1" +#define NID_brainpoolP320t1 930 +#define OBJ_brainpoolP320t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,10L + +#define SN_brainpoolP384r1 "brainpoolP384r1" +#define NID_brainpoolP384r1 931 +#define OBJ_brainpoolP384r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,11L + +#define SN_brainpoolP384t1 "brainpoolP384t1" +#define NID_brainpoolP384t1 932 +#define OBJ_brainpoolP384t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,12L + +#define SN_brainpoolP512r1 "brainpoolP512r1" +#define NID_brainpoolP512r1 933 +#define OBJ_brainpoolP512r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,13L + +#define SN_brainpoolP512t1 "brainpoolP512t1" +#define NID_brainpoolP512t1 934 +#define OBJ_brainpoolP512t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,14L + diff --git a/crypto/objects/obj_mac.num b/crypto/objects/obj_mac.num index 1d0a7c8..9297435 100644 --- a/crypto/objects/obj_mac.num +++ b/crypto/objects/obj_mac.num @@ -917,3 +917,18 @@ aes_128_cbc_hmac_sha1 916 aes_192_cbc_hmac_sha1 917 aes_256_cbc_hmac_sha1 918 rsaesOaep 919 +dhpublicnumber 920 +brainpoolP160r1 921 +brainpoolP160t1 922 +brainpoolP192r1 923 +brainpoolP192t1 924 +brainpoolP224r1 925 +brainpoolP224t1 926 +brainpoolP256r1 927 +brainpoolP256t1 928 +brainpoolP320r1 929 +brainpoolP320t1 930 +brainpoolP384r1 931 +brainpoolP384t1 932 +brainpoolP512r1 933 +brainpoolP512t1 934 diff --git a/crypto/objects/objects.txt b/crypto/objects/objects.txt index d3bfad7..23a955d 100644 --- a/crypto/objects/objects.txt +++ b/crypto/objects/objects.txt @@ -1290,3 +1290,25 @@ kisa 1 6 : SEED-OFB : seed-ofb : AES-128-CBC-HMAC-SHA1 : aes-128-cbc-hmac-sha1 : AES-192-CBC-HMAC-SHA1 : aes-192-cbc-hmac-sha1 : AES-256-CBC-HMAC-SHA1 : aes-256-cbc-hmac-sha1 + +ISO-US 10046 2 1 : dhpublicnumber : X9.42 DH + +# RFC 5639 curve OIDs (see http://www.ietf.org/rfc/rfc5639.txt) +# versionOne OBJECT IDENTIFIER ::= { +# iso(1) identifified-organization(3) teletrust(36) algorithm(3) +# signature-algorithm(3) ecSign(2) ecStdCurvesAndGeneration(8) +# ellipticCurve(1) 1 } +1 3 36 3 3 2 8 1 1 1 : brainpoolP160r1 +1 3 36 3 3 2 8 1 1 2 : brainpoolP160t1 +1 3 36 3 3 2 8 1 1 3 : brainpoolP192r1 +1 3 36 3 3 2 8 1 1 4 : brainpoolP192t1 +1 3 36 3 3 2 8 1 1 5 : brainpoolP224r1 +1 3 36 3 3 2 8 1 1 6 : brainpoolP224t1 +1 3 36 3 3 2 8 1 1 7 : brainpoolP256r1 +1 3 36 3 3 2 8 1 1 8 : brainpoolP256t1 +1 3 36 3 3 2 8 1 1 9 : brainpoolP320r1 +1 3 36 3 3 2 8 1 1 10 : brainpoolP320t1 +1 3 36 3 3 2 8 1 1 11 : brainpoolP384r1 +1 3 36 3 3 2 8 1 1 12 : brainpoolP384t1 +1 3 36 3 3 2 8 1 1 13 : brainpoolP512r1 +1 3 36 3 3 2 8 1 1 14 : brainpoolP512t1 -- 1.7.9.5 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/release.txt��������������������������������������������������������������������������0000664�0000000�0000000�00000001416�12606205164�0015410�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-1.3.2/misc/xca.desktop��������������������������������������������������������������������������0000664�0000000�0000000�00000001306�12606205164�0015373�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 Comment[hr]=Grafičko korisničko sučelje za upravljanje životnim ciklusom X.509 sukladnih potvrda Exec=xca %F Icon=xca-32x32 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-1.3.2/misc/xca.nsi������������������������������������������������������������������������������0000775�0000000�0000000�00000027200�12606205164�0014517�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}${EXTRA_VERSION} Setup" OutFile "setup_xca-${VERSION}${EXTRA_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_Finish) !define MUI_FINISHPAGE_NOREBOOTSUPPORT !define MUI_FINISHPAGE_RUN "$INSTDIR\xca.exe" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "${TOPDIR}/img\bigcert.bmp" !define MUI_HEADERIMAGE_RIGHT !define MUI_ICON "${TOPDIR}/img\key.ico" ;----------------------------------- ; 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" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "Croatian" ;----------------------------------- ; 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 "xca_db_stat.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 (X Certificate and Key Management)" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "DisplayIcon" "$INSTDIR\xca.exe" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "UninstallString" "$INSTDIR\uninstall.exe" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "DisplayVersion" "${VERSION}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "Version" "${VERSION}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "URLUpdateInfo" "http://sourceforge.net/projects/xca/" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "URLInfoAbout" "http://xca.sf.net" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "HelpLink" "http://xca.sf.net" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "Publisher" "Christian Hohnstaedt <christian@hohnstaedt.de>" WriteRegDWord HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "NoModify" '1' WriteRegDWord HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xca" "NoRepair" '1' 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 ;---------------------------------------- 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" File /nonfatal "${QTDIR}\translations\qt_hr.qm" File /nonfatal "${QTDIR}\translations\qt_tr.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\xca_db_stat.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_SecMain ${LANG_FRENCH} "application XCA." LangString DESC_SecMain ${LANG_CROATIAN} "XCA aplikacija." 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_SecShortcut ${LANG_FRENCH} "Raccourcis sur le bureau et dans le menu." LangString DESC_SecShortcut ${LANG_CROATIAN} "Precac na radnoj površini i izborniku." 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 'Öffnen mit' für *.crt *.crl *.pfx *.p7b *.cer" LangString DESC_SecFiles ${LANG_FRENCH} "Application par défault pour *.xdb *.xca *.pem et 'Ouvrir avec' pour *.crt *.crl *.pfx *.p7b *.cer" LangString DESC_SecFiles ${LANG_CROATIAN} "Osnovna aplikacija za datoteke *.xdb *.xca *.pem i 'Otvori s' za *.crt *.crl *.pfx *.p7b *.cer" LangString DESC_SecTrans ${LANG_ENGLISH} "Translations for german, russian, spanish, french and croatian." LangString DESC_SecTrans ${LANG_GERMAN} "Übersetzungen in deutsch, russisch, spanisch kroatisch und französisch." LangString DESC_SecTrans ${LANG_FRENCH} "Traductions pour l'allemand, le russe, l'espagnol, le français et le croate." LangString DESC_SecTrans ${LANG_CROATIAN} "Prijevodi na njemacki, ruski, španjolski, francuski i hrvatski jezik." ;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 ${SecFiles} $(DESC_SecFiles) !insertmacro MUI_DESCRIPTION_TEXT ${SecTrans} $(DESC_SecTrans) !insertmacro MUI_FUNCTION_DESCRIPTION_END LangString DESC_Finish ${LANG_ENGLISH} "\r\nEnjoy XCA and free Software" LangString DESC_Finish ${LANG_GERMAN} "\r\nViel Spass mit XCA und freier Software" LangString DESC_Finish ${LANG_FRENCH} "\r\nAmusez-vous bien avec XCA et les logiciels libres" LangString DESC_Finish ${LANG_CROATIAN} "\r\nUživajte u XCA i slobodnom softveru" ;----------------------------------- Function .onInit !insertMacro MUI_LANGDLL_DISPLAY FunctionEnd Function un.onInit !insertMacro MUI_UNGETLANGUAGE FunctionEnd ; eof ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/xca.rc�������������������������������������������������������������������������������0000775�0000000�0000000�00000000101�12606205164�0014321�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������IDI_APPICON ICON DISCARDABLE "img\key.ico" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/misc/xca.xml������������������������������������������������������������������������������0000664�0000000�0000000�00000000560�12606205164�0014523�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-1.3.2/test/�������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12606205164�0013251�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/test/create_key.pl������������������������������������������������������������������������0000775�0000000�0000000�00000001765�12606205164�0015735�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-1.3.2/test/im_export_key.pl���������������������������������������������������������������������0000775�0000000�0000000�00000002136�12606205164�0016471�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-1.3.2/test/opendb.pl����������������������������������������������������������������������������0000775�0000000�0000000�00000001271�12606205164�0015061�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-1.3.2/ui/���������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12606205164�0012707�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/ui/.gitignore�����������������������������������������������������������������������������0000664�0000000�0000000�00000000004�12606205164�0014671�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������*.h ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/ui/About.ui�������������������������������������������������������������������������������0000664�0000000�0000000�00000007003�12606205164�0014320�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-1.3.2/ui/CaProperties.ui������������������������������������������������������������������������0000664�0000000�0000000�00000011647�12606205164�0015657�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-1.3.2/ui/CertDetail.ui��������������������������������������������������������������������������0000664�0000000�0000000�00000030116�12606205164�0015267�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>450</height> </rect> </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" 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>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"> <item row="0" column="0"> <widget class="QLabel" name="TextLabel1_2"> <property name="text"> <string>MD5</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> <item row="1" column="0"> <widget class="QLabel" name="TextLabel2_2"> <property name="text"> <string>SHA1</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="2" column="0"> <widget class="QLabel" name="TextLabel2_3"> <property name="text"> <string>SHA256</string> </property> </widget> </item> <item row="2" column="1"> <widget class="CopyLabel" name="fpSHA256"> <property name="toolTip"> <string>A SHA-256 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-1.3.2/ui/CertExtend.ui��������������������������������������������������������������������������0000664�0000000�0000000�00000022745�12606205164�0015325�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>411</width> <height>416</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> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>Validity</string> </property> <layout class="QVBoxLayout"> <property name="margin"> <number>8</number> </property> <item> <layout class="QGridLayout"> <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="1" column="1"> <widget class="QCheckBox" name="checkBox"> <property name="text"> <string>Local time</string> </property> </widget> </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="2" colspan="2"> <widget class="QCheckBox" name="noWellDefinedExpDate"> <property name="text"> <string>No well-defined expiration</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="0" column="3"> <widget class="QPushButton" name="applyTime"> <property name="text"> <string>Apply</string> </property> </widget> </item> <item row="0" column="0" colspan="2"> <widget class="QLineEdit" name="validNumber"/> </item> </layout> </widget> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>2</height> </size> </property> </spacer> </item> <item> <widget class="QCheckBox" name="revoke"> <property name="text"> <string>Revoke old certificate</string> </property> <property name="checked"> <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> <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>453</x> <y>197</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>331</x> <y>200</y> </hint> </hints> </connection> <connection> <sender>midnightCB</sender> <signal>stateChanged(int)</signal> <receiver>notBefore</receiver> <slot>hideTimeCheck(int)</slot> <hints> <hint type="sourcelabel"> <x>453</x> <y>197</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>544</x> <y>197</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>331</x> <y>164</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>331</x> <y>200</y> </hint> </hints> </connection> </connections> </ui> ���������������������������xca-1.3.2/ui/CrlDetail.ui���������������������������������������������������������������������������0000664�0000000�0000000�00000022101�12606205164�0015105�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>530</width> <height>381</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout"> <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="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> <item row="2" column="1"> <layout class="QHBoxLayout"> <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> <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="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="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="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> <column> <property name="text"> <string notr="true">1</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>355</x> <y>376</y> </hint> <hint type="destinationlabel"> <x>169</x> <y>308</y> </hint> </hints> </connection> </connections> </ui> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/ui/ExportDialog.ui������������������������������������������������������������������������0000664�0000000�0000000�00000015674�12606205164�0015664�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>589</width> <height>267</height> </rect> </property> <property name="windowTitle"> <string/> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout"> <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> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QLabel" name="TextLabel2"> <property name="text"> <string>Name</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="descr"> <property name="toolTip"> <string>The internal name of the CRL in the database</string> </property> </widget> </item> </layout> </item> <item> <widget class="QFrame" name="fileNameFrame"> <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> <item row="0" column="1" colspan="2"> <widget class="QLineEdit" name="filename"/> </item> <item row="0" 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="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>Filename</string> </property> </widget> </item> </layout> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QFrame" name="exportFormatFrame"> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QLabel" name="infoBox"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string notr="true"/> </property> <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> </property> <property name="wordWrap"> <bool>true</bool> </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" name="verticalLayout"> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>10</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="TextLabel1"> <property name="text"> <string>Export Format</string> </property> </widget> </item> <item> <widget class="focusCombo" name="exportFormat"/> </item> <item> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>11</height> </size> </property> </spacer> </item> </layout> </widget> </item> </layout> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <customwidgets> <customwidget> <class>focusCombo</class> <extends>QComboBox</extends> <header>widgets/FocusCombo.h</header> </customwidget> </customwidgets> <tabstops> <tabstop>filename</tabstop> <tabstop>fileBut</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-1.3.2/ui/Help.ui��������������������������������������������������������������������������������0000664�0000000�0000000�00000006006�12606205164�0014140�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-1.3.2/ui/ImportMulti.ui�������������������������������������������������������������������������0000664�0000000�0000000�00000011735�12606205164�0015542�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-1.3.2/ui/KeyDetail.ui���������������������������������������������������������������������������0000664�0000000�0000000�00000017742�12606205164�0015134�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="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-1.3.2/ui/MainWindow.ui��������������������������������������������������������������������������0000664�0000000�0000000�00000062626�12606205164�0015336�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"> <item> <widget class="QTabWidget" name="tabView"> <property name="currentIndex"> <number>2</number> </property> <widget class="QWidget" name="RSATab"> <attribute name="title"> <string>Private Keys</string> </attribute> <layout class="QHBoxLayout"> <property name="margin"> <number>8</number> </property> <item> <widget class="KeyTreeView" 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="margin"> <number>8</number> </property> <item> <widget class="ReqTreeView" 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="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="margin"> <number>8</number> </property> <item> <widget class="CertTreeView" 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="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="margin"> <number>8</number> </property> <item> <widget class="TempTreeView" 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="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"> <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"> <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> <slots> <slot>newItem()</slot> <slot>load()</slot> <slot>storeItems()</slot> <slot>showItems()</slot> <slot>deleteItems()</slot> </slots> </customwidget> <customwidget> <class>KeyTreeView</class> <extends>QTreeView</extends> <header>widgets/KeyTreeView.h</header> </customwidget> <customwidget> <class>TempTreeView</class> <extends>QTreeView</extends> <header>widgets/TempTreeView.h</header> </customwidget> <customwidget> <class>ReqTreeView</class> <extends>QTreeView</extends> <header>widgets/ReqTreeView.h</header> </customwidget> <customwidget> <class>CertTreeView</class> <extends>QTreeView</extends> <header>widgets/CertTreeView.h</header> <slots> <slot>loadPKCS12()</slot> <slot>loadPKCS7()</slot> <slot>changeView()</slot> </slots> </customwidget> </customwidgets> <resources/> <connections> <connection> <sender>BNimportKey</sender> <signal>clicked()</signal> <receiver>keyView</receiver> <slot>load()</slot> <hints> <hint type="sourcelabel"> <x>505</x> <y>129</y> </hint> <hint type="destinationlabel"> <x>382</x> <y>135</y> </hint> </hints> </connection> <connection> <sender>BNnewKey</sender> <signal>clicked()</signal> <receiver>keyView</receiver> <slot>newItem()</slot> <hints> <hint type="sourcelabel"> <x>488</x> <y>67</y> </hint> <hint type="destinationlabel"> <x>392</x> <y>67</y> </hint> </hints> </connection> <connection> <sender>BNexportKey</sender> <signal>clicked()</signal> <receiver>keyView</receiver> <slot>storeItems()</slot> <hints> <hint type="sourcelabel"> <x>526</x> <y>99</y> </hint> <hint type="destinationlabel"> <x>393</x> <y>99</y> </hint> </hints> </connection> <connection> <sender>BNdetailsKey</sender> <signal>clicked()</signal> <receiver>keyView</receiver> <slot>showItems()</slot> <hints> <hint type="sourcelabel"> <x>473</x> <y>200</y> </hint> <hint type="destinationlabel"> <x>405</x> <y>200</y> </hint> </hints> </connection> <connection> <sender>BNdeleteKey</sender> <signal>clicked()</signal> <receiver>keyView</receiver> <slot>deleteItems()</slot> <hints> <hint type="sourcelabel"> <x>470</x> <y>229</y> </hint> <hint type="destinationlabel"> <x>404</x> <y>230</y> </hint> </hints> </connection> <connection> <sender>BNnewReq</sender> <signal>clicked()</signal> <receiver>reqView</receiver> <slot>newItem()</slot> <hints> <hint type="sourcelabel"> <x>496</x> <y>57</y> </hint> <hint type="destinationlabel"> <x>371</x> <y>58</y> </hint> </hints> </connection> <connection> <sender>BNexportReq</sender> <signal>clicked()</signal> <receiver>reqView</receiver> <slot>storeItems()</slot> <hints> <hint type="sourcelabel"> <x>489</x> <y>91</y> </hint> <hint type="destinationlabel"> <x>400</x> <y>95</y> </hint> </hints> </connection> <connection> <sender>BNimportReq</sender> <signal>clicked()</signal> <receiver>reqView</receiver> <slot>load()</slot> <hints> <hint type="sourcelabel"> <x>500</x> <y>123</y> </hint> <hint type="destinationlabel"> <x>412</x> <y>130</y> </hint> </hints> </connection> <connection> <sender>BNdetailsReq</sender> <signal>clicked()</signal> <receiver>reqView</receiver> <slot>showItems()</slot> <hints> <hint type="sourcelabel"> <x>497</x> <y>157</y> </hint> <hint type="destinationlabel"> <x>419</x> <y>166</y> </hint> </hints> </connection> <connection> <sender>BNdeleteReq</sender> <signal>clicked()</signal> <receiver>reqView</receiver> <slot>deleteItems()</slot> <hints> <hint type="sourcelabel"> <x>475</x> <y>196</y> </hint> <hint type="destinationlabel"> <x>399</x> <y>196</y> </hint> </hints> </connection> <connection> <sender>BNnewCert</sender> <signal>clicked()</signal> <receiver>certView</receiver> <slot>newItem()</slot> <hints> <hint type="sourcelabel"> <x>478</x> <y>63</y> </hint> <hint type="destinationlabel"> <x>398</x> <y>63</y> </hint> </hints> </connection> <connection> <sender>BNexportCert</sender> <signal>clicked()</signal> <receiver>certView</receiver> <slot>storeItems()</slot> <hints> <hint type="sourcelabel"> <x>499</x> <y>97</y> </hint> <hint type="destinationlabel"> <x>401</x> <y>99</y> </hint> </hints> </connection> <connection> <sender>BNimportCert</sender> <signal>clicked()</signal> <receiver>certView</receiver> <slot>load()</slot> <hints> <hint type="sourcelabel"> <x>475</x> <y>127</y> </hint> <hint type="destinationlabel"> <x>401</x> <y>128</y> </hint> </hints> </connection> <connection> <sender>BNdetailsCert</sender> <signal>clicked()</signal> <receiver>certView</receiver> <slot>showItems()</slot> <hints> <hint type="sourcelabel"> <x>486</x> <y>162</y> </hint> <hint type="destinationlabel"> <x>395</x> <y>165</y> </hint> </hints> </connection> <connection> <sender>BNdeleteCert</sender> <signal>clicked()</signal> <receiver>certView</receiver> <slot>deleteItems()</slot> <hints> <hint type="sourcelabel"> <x>482</x> <y>203</y> </hint> <hint type="destinationlabel"> <x>357</x> <y>207</y> </hint> </hints> </connection> <connection> <sender>BNnewTemp</sender> <signal>clicked()</signal> <receiver>tempView</receiver> <slot>newItem()</slot> <hints> <hint type="sourcelabel"> <x>513</x> <y>60</y> </hint> <hint type="destinationlabel"> <x>363</x> <y>62</y> </hint> </hints> </connection> <connection> <sender>BNchangeTemp</sender> <signal>clicked()</signal> <receiver>tempView</receiver> <slot>showItems()</slot> <hints> <hint type="sourcelabel"> <x>481</x> <y>94</y> </hint> <hint type="destinationlabel"> <x>415</x> <y>97</y> </hint> </hints> </connection> <connection> <sender>BNdeleteTemp</sender> <signal>clicked()</signal> <receiver>tempView</receiver> <slot>deleteItems()</slot> <hints> <hint type="sourcelabel"> <x>482</x> <y>126</y> </hint> <hint type="destinationlabel"> <x>428</x> <y>126</y> </hint> </hints> </connection> <connection> <sender>BNimportTemp</sender> <signal>clicked()</signal> <receiver>tempView</receiver> <slot>load()</slot> <hints> <hint type="sourcelabel"> <x>487</x> <y>165</y> </hint> <hint type="destinationlabel"> <x>407</x> <y>165</y> </hint> </hints> </connection> <connection> <sender>BNexportTemp</sender> <signal>clicked()</signal> <receiver>tempView</receiver> <slot>storeItems()</slot> <hints> <hint type="sourcelabel"> <x>488</x> <y>201</y> </hint> <hint type="destinationlabel"> <x>428</x> <y>201</y> </hint> </hints> </connection> <connection> <sender>BNexportCrl</sender> <signal>clicked()</signal> <receiver>crlView</receiver> <slot>storeItems()</slot> <hints> <hint type="sourcelabel"> <x>472</x> <y>70</y> </hint> <hint type="destinationlabel"> <x>381</x> <y>70</y> </hint> </hints> </connection> <connection> <sender>BNimportCrl</sender> <signal>clicked()</signal> <receiver>crlView</receiver> <slot>load()</slot> <hints> <hint type="sourcelabel"> <x>496</x> <y>99</y> </hint> <hint type="destinationlabel"> <x>382</x> <y>99</y> </hint> </hints> </connection> <connection> <sender>BNdetailsCrl</sender> <signal>clicked()</signal> <receiver>crlView</receiver> <slot>showItems()</slot> <hints> <hint type="sourcelabel"> <x>477</x> <y>131</y> </hint> <hint type="destinationlabel"> <x>391</x> <y>131</y> </hint> </hints> </connection> <connection> <sender>BNdeleteCrl</sender> <signal>clicked()</signal> <receiver>crlView</receiver> <slot>deleteItems()</slot> <hints> <hint type="sourcelabel"> <x>471</x> <y>173</y> </hint> <hint type="destinationlabel"> <x>386</x> <y>172</y> </hint> </hints> </connection> <connection> <sender>BNimportPKCS12</sender> <signal>clicked()</signal> <receiver>certView</receiver> <slot>loadPKCS12()</slot> <hints> <hint type="sourcelabel"> <x>504</x> <y>239</y> </hint> <hint type="destinationlabel"> <x>420</x> <y>234</y> </hint> </hints> </connection> <connection> <sender>BNimportPKCS7</sender> <signal>clicked()</signal> <receiver>certView</receiver> <slot>loadPKCS7()</slot> <hints> <hint type="sourcelabel"> <x>544</x> <y>265</y> </hint> <hint type="destinationlabel"> <x>406</x> <y>260</y> </hint> </hints> </connection> <connection> <sender>BNimportPFX</sender> <signal>clicked()</signal> <receiver>certView</receiver> <slot>loadPKCS12()</slot> <hints> <hint type="sourcelabel"> <x>483</x> <y>170</y> </hint> <hint type="destinationlabel"> <x>230</x> <y>263</y> </hint> </hints> </connection> <connection> <sender>BNviewState</sender> <signal>clicked()</signal> <receiver>certView</receiver> <slot>changeView()</slot> <hints> <hint type="sourcelabel"> <x>472</x> <y>304</y> </hint> <hint type="destinationlabel"> <x>402</x> <y>301</y> </hint> </hints> </connection> </connections> </ui> ����������������������������������������������������������������������������������������������������������xca-1.3.2/ui/Makefile�������������������������������������������������������������������������������0000664�0000000�0000000�00000000664�12606205164�0014355�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_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 \ ui_RevocationList.h ui_OidResolver.h include $(TOPDIR)/Rules.mak ui: $(UI_H) ����������������������������������������������������������������������������xca-1.3.2/ui/NewCrl.ui������������������������������������������������������������������������������0000664�0000000�0000000�00000023565�12606205164�0014453�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>478</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout"> <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="dateBox"> <property name="title"> <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_2"> <property name="title"> <string>Options</string> </property> <layout class="QGridLayout" name="gridLayout_3"> <item row="3" column="1"> <widget class="QLineEdit" name="crlNumber"/> </item> <item row="3" column="0"> <widget class="QCheckBox" name="setCrlNumber"> <property name="text"> <string>CRL Number</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item row="2" column="0"> <widget class="QCheckBox" name="subAltName"> <property name="text"> <string>Subject alternative name</string> </property> </widget> </item> <item row="4" column="0"> <widget class="QCheckBox" name="revocationReasons"> <property name="text"> <string>Revocation reasons</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item row="2" column="1"> <widget class="QCheckBox" name="authKeyId"> <property name="text"> <string>Authority key identifier</string> </property> </widget> </item> <item row="0" column="1"> <widget class="hashBox" name="hashAlgo"/> </item> <item row="0" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Hash algorithm</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </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>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>104</x> <y>243</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>124</x> <y>243</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>316</x> <y>538</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>410</x> <y>538</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>291</x> <y>243</y> </hint> <hint type="destinationlabel"> <x>418</x> <y>160</y> </hint> </hints> </connection> <connection> <sender>checkBox</sender> <signal>stateChanged(int)</signal> <receiver>lastUpdate</receiver> <slot>localTime(int)</slot> <hints> <hint type="sourcelabel"> <x>291</x> <y>243</y> </hint> <hint type="destinationlabel"> <x>422</x> <y>124</y> </hint> </hints> </connection> <connection> <sender>midnightCB</sender> <signal>clicked(bool)</signal> <receiver>checkBox</receiver> <slot>setDisabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>81</x> <y>243</y> </hint> <hint type="destinationlabel"> <x>291</x> <y>243</y> </hint> </hints> </connection> <connection> <sender>setCrlNumber</sender> <signal>clicked(bool)</signal> <receiver>crlNumber</receiver> <slot>setEnabled(bool)</slot> <hints> <hint type="sourcelabel"> <x>158</x> <y>424</y> </hint> <hint type="destinationlabel"> <x>220</x> <y>428</y> </hint> </hints> </connection> </connections> </ui> �������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/ui/NewKey.ui������������������������������������������������������������������������������0000664�0000000�0000000�00000015011�12606205164�0014446�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>320</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> <widget class="QCheckBox" name="rememberDefault"> <property name="text"> <string>Remember as default</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>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-1.3.2/ui/NewX509.ui�����������������������������������������������������������������������������0000664�0000000�0000000�00000135110�12606205164�0014366�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>634</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> </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>2</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"/> </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> </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> </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" name="verticalLayout_7"> <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="verticalLayout_6"> <item> <widget class="QWidget" name="dnWidget" native="true"/> </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> <attribute name="horizontalHeaderStretchLastSection"> <bool>true</bool> </attribute> <attribute name="horizontalHeaderDefaultSectionSize"> <number>200</number> </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="bcBox"> <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> <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> </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="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="DoubleClickLabel" name="sanLbl"/> </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> </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="DoubleClickLabel" name="ianLbl"/> </item> <item row="1" column="2" colspan="2"> <widget class="QLineEdit" name="issAltName"> <property name="toolTip"> <string>DNS: IP: URI: email: RID:</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="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> </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="DoubleClickLabel" name="aiaLbl"/> </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> </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> <item row="2" column="0"> <widget class="DoubleClickLabel" name="crldpLbl"/> </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="kuBox"> <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="ekuBox"> <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">Critical</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" name="verticalLayout_8"> <item> <layout class="QHBoxLayout" name="horizontalLayout_5"> <item> <widget class="QGroupBox" name="nsCertTypeBox"> <layout class="QHBoxLayout" name="horizontalLayout_4"> <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> </layout> </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="DoubleClickLabel" name="nsCaRevLbl"/> </item> <item row="5" column="1"> <widget class="QLineEdit" name="nsSslServerName"/> </item> <item row="1" column="0"> <widget class="DoubleClickLabel" name="nsRevLbl"/> </item> <item row="5" column="0"> <widget class="DoubleClickLabel" name="nsSslServerLbl"/> </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="DoubleClickLabel" name="nsRenewLbl"/> </item> <item row="6" column="0"> <widget class="DoubleClickLabel" name="nsCommentLbl"/> </item> <item row="4" column="0"> <widget class="DoubleClickLabel" name="nsCaPolicyLbl"/> </item> <item row="0" column="0"> <widget class="DoubleClickLabel" name="nsBaseLbl"/> </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 notr="true">If you know a more pretty one tell me</string> </property> </widget> </item> </layout> </item> </layout> </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>hashBox</class> <extends>QComboBox</extends> <header>widgets/hashBox.h</header> </customwidget> <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>kvView</class> <extends>QTableView</extends> <header>widgets/kvView.h</header> <slots> <slot>addKvRow()</slot> <slot>deleteCurrentRow()</slot> </slots> </customwidget> <customwidget> <class>DoubleClickLabel</class> <extends>QLabel</extends> <header location="global">widgets/clicklabel.h</header> </customwidget> </customwidgets> <tabstops> <tabstop>fromReqCB</tabstop> <tabstop>reqList</tabstop> <tabstop>copyReqExtCB</tabstop> <tabstop>showReqBut</tabstop> <tabstop>reqSubChange</tabstop> <tabstop>selfSignRB</tabstop> <tabstop>serialNr</tabstop> <tabstop>foreignSignRB</tabstop> <tabstop>certList</tabstop> <tabstop>hashAlgo</tabstop> <tabstop>tempList</tabstop> <tabstop>applyExtensions</tabstop> <tabstop>applySubject</tabstop> <tabstop>applyTemplate</tabstop> <tabstop>extDNlist</tabstop> <tabstop>extDNadd</tabstop> <tabstop>extDNdel</tabstop> <tabstop>keyList</tabstop> <tabstop>usedKeysToo</tabstop> <tabstop>genKeyBut</tabstop> <tabstop>basicCA</tabstop> <tabstop>basicPath</tabstop> <tabstop>bcCritical</tabstop> <tabstop>subKey</tabstop> <tabstop>authKey</tabstop> <tabstop>notBefore</tabstop> <tabstop>notAfter</tabstop> <tabstop>validNumber</tabstop> <tabstop>midnightCB</tabstop> <tabstop>checkBox</tabstop> <tabstop>noWellDefinedExpDate</tabstop> <tabstop>validRange</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> <tabstop>nconf_data</tabstop> <tabstop>adv_validate</tabstop> <tabstop>buttonBox</tabstop> <tabstop>tabWidget</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-1.3.2/ui/OidResolver.ui�������������������������������������������������������������������������0000664�0000000�0000000�00000012641�12606205164�0015507�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>OidResolver</class> <widget class="QWidget" name="OidResolver"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>401</width> <height>241</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <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>OID Resolver</string> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> <item> <widget class="QLabel" name="label_5"> <property name="text"> <string>Enter the OID, the Nid, or one of the textual representations</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QLabel" name="label_7"> <property name="text"> <string>Search</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="input"/> </item> </layout> </item> <item> <widget class="Line" name="line"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <layout class="QFormLayout" name="formLayout"> <property name="fieldGrowthPolicy"> <enum>QFormLayout::AllNonFixedFieldsGrow</enum> </property> <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>OID</string> </property> </widget> </item> <item row="0" column="1"> <widget class="CopyLabel" name="oid"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>0</width> <height>18</height> </size> </property> <property name="text"> <string notr="true"/> </property> </widget> </item> <item row="1" column="1"> <widget class="CopyLabel" name="sn"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>0</width> <height>18</height> </size> </property> <property name="text"> <string/> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Long name</string> </property> </widget> </item> <item row="2" column="1"> <widget class="CopyLabel" name="ln"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>0</width> <height>18</height> </size> </property> <property name="text"> <string/> </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="label_4"> <property name="toolTip"> <string>OpenSSL internal ID</string> </property> <property name="text"> <string>Nid</string> </property> </widget> </item> <item row="3" column="1"> <widget class="CopyLabel" name="nid"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>0</width> <height>18</height> </size> </property> <property name="toolTip"> <string>OpenSSL internal ID</string> </property> <property name="text"> <string/> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Short name</string> </property> </widget> </item> </layout> </item> </layout> </widget> <customwidgets> <customwidget> <class>CopyLabel</class> <extends>QLabel</extends> <header location="global">widgets/clicklabel.h</header> </customwidget> </customwidgets> <resources/> <connections> <connection> <sender>input</sender> <signal>textChanged(QString)</signal> <receiver>OidResolver</receiver> <slot>searchOid(QString)</slot> <hints> <hint type="sourcelabel"> <x>207</x> <y>103</y> </hint> <hint type="destinationlabel"> <x>144</x> <y>47</y> </hint> </hints> </connection> </connections> <slots> <slot>searchOid(QString)</slot> </slots> </ui> �����������������������������������������������������������������������������������������������xca-1.3.2/ui/Options.ui�����������������������������������������������������������������������������0000664�0000000�0000000�00000026037�12606205164�0014711�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>635</width> <height>500</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="QTabWidget" name="tabWidget"> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="tab"> <attribute name="title"> <string>Settings</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_6"> <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="QCheckBox" name="transDnEntries"> <property name="text"> <string>Translate established x509 terms (%1 -> %2)</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="onlyTokenHashes"> <property name="toolTip"> <string>The hashing functionality of the token is not used by XCA. It may however honor a restricted hash-set propagated by the token. Especially EC and DSA are only defined with SHA1 in the PKCS#11 specification.</string> </property> <property name="text"> <string>Only use hashes supported by the token when signing with a token key</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="disableNetscape"> <property name="text"> <string>Disable legacy Netscape extensions</string> </property> </widget> </item> <item> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>241</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>Distinguished name</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_5"> <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> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>Explicit subject entries</string> </property> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <layout class="QVBoxLayout" name="_2"> <property name="spacing"> <number>6</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="QComboBox" name="expDNobj"/> </item> <item> <widget class="QListWidget" name="expDNlist"> <property name="dragDropMode"> <enum>QAbstractItemView::InternalMove</enum> </property> </widget> </item> </layout> </item> <item> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <widget class="QPushButton" name="expDNadd"> <property name="text"> <string>Add</string> </property> </widget> </item> <item> <widget class="QPushButton" name="expDNdel"> <property name="text"> <string>Delete</string> </property> </widget> </item> <item> <widget class="QPushButton" name="expDNdefault"> <property name="text"> <string>Default</string> </property> </widget> </item> <item> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>18</height> </size> </property> </spacer> </item> </layout> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="tab_3"> <attribute name="title"> <string>PKCS#11 provider</string> </attribute> <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> </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-1.3.2/ui/PwDialog.ui����������������������������������������������������������������������������0000664�0000000�0000000�00000010172�12606205164�0014755�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-1.3.2/ui/RevocationList.ui����������������������������������������������������������������������0000664�0000000�0000000�00000010064�12606205164�0016214�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>RevocationList</class> <widget class="QDialog" name="RevocationList"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>628</width> <height>320</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QLabel" name="label_3"> <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>Manage revocations</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_2"> <item> <widget class="QTreeWidget" name="certList"> <property name="alternatingRowColors"> <bool>true</bool> </property> <property name="selectionMode"> <enum>QAbstractItemView::MultiSelection</enum> </property> <property name="selectionBehavior"> <enum>QAbstractItemView::SelectRows</enum> </property> <column> <property name="text"> <string notr="true">1</string> </property> </column> </widget> </item> <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPushButton" name="addRev"> <property name="text"> <string>Add</string> </property> </widget> </item> <item> <widget class="QPushButton" name="delRev"> <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="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>RevocationList</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>RevocationList</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-1.3.2/ui/Revoke.ui������������������������������������������������������������������������������0000664�0000000�0000000�00000011760�12606205164�0014506�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>417</width> <height>282</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 revocation</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> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>10</height> </size> </property> </spacer> </item> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Revocation details</string> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="1"> <widget class="QLineEdit" name="serial"/> </item> <item row="3" column="0"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Revocation reason</string> </property> </widget> </item> <item row="1" column="1"> <widget class="Validity" name="invalid"> <property name="calendarPopup"> <bool>true</bool> </property> </widget> </item> <item row="2" column="1"> <widget class="QCheckBox" name="checkBox"> <property name="text"> <string>Local time</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>Invalid since</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Serial</string> </property> </widget> </item> <item row="3" 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::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> </customwidgets> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>Revoke</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>242</x> <y>277</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>398</x> <y>194</y> </hint> <hint type="destinationlabel"> <x>389</x> <y>167</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>Revoke</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>97</x> <y>268</y> </hint> <hint type="destinationlabel"> <x>109</x> <y>59</y> </hint> </hints> </connection> </connections> </ui> ����������������xca-1.3.2/ui/SearchPkcs11.ui������������������������������������������������������������������������0000664�0000000�0000000�00000007755�12606205164�0015454�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-1.3.2/ui/SelectToken.ui�������������������������������������������������������������������������0000664�0000000�0000000�00000007113�12606205164�0015470�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-1.3.2/ui/TrustState.ui��������������������������������������������������������������������������0000664�0000000�0000000�00000010006�12606205164�0015365�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>211</height> </rect> </property> <property name="windowTitle"> <string/> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout"> <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>Certificate trust</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="QGroupBox" name="groupBox"> <property name="title"> <string>Trustment</string> </property> <layout class="QVBoxLayout"> <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> <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-1.3.2/ui/v3ext.ui�������������������������������������������������������������������������������0000664�0000000�0000000�00000010752�12606205164�0014324�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-1.3.2/widgets/����������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12606205164�0013740�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/CertDetail.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000013655�12606205164�0016476�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "CertDetail.h" #include "MainWindow.h" #include "distname.h" #include "clicklabel.h" #include "lib/func.h" #include <QLabel> #include <QPushButton> #include <QLineEdit> #include <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()) { x509rev rev = cert->getRevocation(); dateValid->setText(tr("Revoked: ") + rev.getDate().toPretty()); dateValid->setRed(); dateValid->setToolTip(rev.getDate().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())); QString fp = cert->fingerprint(EVP_sha256()); int x = fp.size() / 2; fp = fp.mid(0,x) + "\n" + fp.mid(x+1, -1); fpSHA256->setText(fp); openssl_error(); } catch (errorEx &err) { XCA_WARN(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; QString trans; 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); trans = dn_translations[nid]; if (translate_dn && !trans.isEmpty()) { label->setText(trans); label->setToolTip(QString(OBJ_nid2sn(nid))); } else { label->setText(QString(OBJ_nid2ln(nid))); label->setToolTip(trans); } 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) { XCA_WARN(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-1.3.2/widgets/CertDetail.h����������������������������������������������������������������������0000664�0000000�0000000�00000001145�12606205164�0016132�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-1.3.2/widgets/CertExtend.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000004445�12606205164�0016520�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 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 <QLabel> #include <QLineEdit> #include <QComboBox> #include <QCheckBox> #include <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."); xcaWarning msg(this, text); 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."); xcaWarning msg(this, text); 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-1.3.2/widgets/CertExtend.h����������������������������������������������������������������������0000664�0000000�0000000�00000000673�12606205164�0016164�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-1.3.2/widgets/CertTreeView.cpp������������������������������������������������������������������0000664�0000000�0000000�00000010147�12606205164�0017017�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "lib/pki_x509.h" #include "CertTreeView.h" #include "MainWindow.h" #include <QAbstractItemModel> #include <QAbstractItemView> #include <QMenu> void CertTreeView::fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes) { QMenu *subCa; bool parentCanSign, multi, hasScard, sameParent, allRevoked, allUnrevoked; pki_key *privkey; X509SuperTreeView::fillContextMenu(menu, subExport, index, indexes); menu->addAction(tr("Import PKCS#12"), this, SLOT(loadPKCS12())); menu->addAction(tr("Import from PKCS#7"), this, SLOT(loadPKCS7())); if (indexes.size() == 0) return; pki_x509 *cert = static_cast<pki_x509*>(index.internalPointer()); pki_x509 *parent; privkey = cert->getRefKey(); parent = cert->getSigner(); parentCanSign = parent && parent->canSign() && (parent != cert); hasScard = pkcs11::loaded(); multi = indexes.size() > 1; allUnrevoked = allRevoked = sameParent = true; foreach(QModelIndex i, indexes) { pki_x509 *c = static_cast<pki_x509*> (i.internalPointer()); if (c->getSigner() != parent) sameParent = false; if (c->isRevoked()) allUnrevoked = false; else allRevoked = false; } if (!multi) { transform->addAction(tr("Request"), this, SLOT(toRequest()))-> setEnabled(privkey && privkey->isPrivKey()); subExport->addAction(tr("Security token"), this, SLOT(toToken()))->setEnabled(hasScard); subExport->addAction(tr("Other token"), this, SLOT(toOtherToken()))->setEnabled( hasScard && privkey && privkey->isToken()); transform->addAction(tr("Similar Certificate"), this, SLOT(toCertificate())); menu->addAction(tr("Delete from Security token"), this, SLOT(deleteFromToken()))->setEnabled(hasScard); subCa = menu->addMenu(tr("CA")); subCa->addAction(tr("Properties"), this, SLOT(caProperties())); subCa->addAction(tr("Generate CRL"), this, SLOT(genCrl())); subCa->addAction(tr("Manage revocations"), this, SLOT(manageRevocations())); subCa->setEnabled(cert->canSign()); } menu->addAction(tr("Trust"), this, SLOT(setTrust()))->setEnabled(allUnrevoked); if (sameParent && parentCanSign) { QString n = multi ? QString(" [%1]").arg(indexes.size()) : ""; menu->addAction(tr("Renewal") +n, this, SLOT(certRenewal())); if (allUnrevoked) menu->addAction(tr("Revoke") +n, this, SLOT(revoke())); if (allRevoked) menu->addAction(tr("Unrevoke") +n, this, SLOT(unRevoke())); } } void CertTreeView::changeView() { if (!certs) return; db_x509 *c = certs; hide(); setModel(); c->changeView(); setModel(c); show(); setRootIsDecorated(db_x509::treeview); } void CertTreeView::toRequest() { if (certs) certs->toRequest(currentIndex()); } void CertTreeView::toToken() { if (certs) certs->toToken(currentIndex(), false); } void CertTreeView::toOtherToken() { if (certs) certs->toToken(currentIndex(), true); } void CertTreeView::loadPKCS12() { if (certs) { load_pkcs12 l; certs->load_default(l); } } void CertTreeView::loadPKCS7() { if (certs) { load_pkcs7 l; certs->load_default(l); } } void CertTreeView::genCrl() { pki_x509 *cert = static_cast<pki_x509*> (currentIndex().internalPointer()); mainwin->crls->newItem(cert); } void CertTreeView::toCertificate() { if (certs) certs->toCertificate(currentIndex()); } void CertTreeView::deleteFromToken() { pki_x509 *cert = static_cast<pki_x509*> (currentIndex().internalPointer()); try { cert->deleteFromToken(); } catch (errorEx &err) { mainwin->Error(err); } } void CertTreeView::manageRevocations() { if (certs) certs->manageRevocations(currentIndex()); } void CertTreeView::caProperties() { if (certs) certs->caProperties(currentIndex()); } void CertTreeView::certRenewal() { if (certs) certs->certRenewal(getSelectedIndexes()); } void CertTreeView::revoke() { if (certs) certs->revoke(getSelectedIndexes()); } void CertTreeView::unRevoke() { if (certs) certs->unRevoke(getSelectedIndexes()); } void CertTreeView::setTrust() { if (certs) certs->setTrust(getSelectedIndexes()); proxy->invalidate(); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/CertTreeView.h��������������������������������������������������������������������0000664�0000000�0000000�00000001622�12606205164�0016462�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __CERTTREEVIEW_H #define __CERTTREEVIEW_H #include "X509SuperTreeView.h" #include "lib/db_x509.h" class CertTreeView: public X509SuperTreeView { Q_OBJECT db_x509 *certs; public: CertTreeView(QWidget *parent) : X509SuperTreeView(parent) { certs = NULL; } void fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes); void setModel(db_x509 *model=NULL) { certs = model; X509SuperTreeView::setModel(model); } public slots: void changeView(); void toRequest(); void toCertificate(); void toToken(); void toOtherToken(); void genCrl(); void loadPKCS7(); void loadPKCS12(); void deleteFromToken(); void manageRevocations(); void certRenewal(); void caProperties(); void revoke(); void unRevoke(); void setTrust(); }; #endif ��������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/CrlDetail.cpp���������������������������������������������������������������������0000664�0000000�0000000�00000003232�12606205164�0016307�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 "widgets/RevocationList.h" #include <QLabel> #include <QTextEdit> #include <QLineEdit> CrlDetail::CrlDetail(MainWindow *mainwin) :QDialog(mainwin) { mw = mainwin; setupUi(this); setWindowTitle(tr(XCA_TITLE)); image->setPixmap(*MainWindow::revImg); descr->setReadOnly(true); } void CrlDetail::setCrl(pki_crl *crl) { pki_x509 *iss; x509v3ext e1, e2; 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()); RevocationList::setupRevocationView(certList, crl->getRevList(), iss); v3extensions->document()->setHtml(crl->printV3ext()); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/CrlDetail.h�����������������������������������������������������������������������0000664�0000000�0000000�00000000606�12606205164�0015756�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-1.3.2/widgets/ExportDialog.cpp������������������������������������������������������������������0000664�0000000�0000000�00000012111�12606205164�0017041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "ExportDialog.h" #include "MainWindow.h" #include "lib/base.h" #include <QComboBox> #include <QLineEdit> #include <QFileDialog> #include <QPushButton> #include <QMessageBox> #include <QStringList> ExportDialog::ExportDialog(MainWindow *mw, QString title, QString filt, pki_base *pki, QPixmap *img, QList<exportType> types) :QDialog(mw) { setupUi(this); mainwin = mw; setWindowTitle(XCA_TITLE); if (pki) descr->setText(pki->getIntName()); descr->setReadOnly(true); image->setPixmap(*img); label->setText(title); if (pki) { QString fn = mainwin->getPath() + QDir::separator() + pki->getUnderlinedName() + "." + types[0].extension; filename->setText(fn); } filter = filt + ";;" + tr("All files ( * )"); foreach(exportType t, types) { QVariant q; q.setValue(t); if (t.type == exportType::Separator) exportFormat->insertSeparator(exportFormat->count()); else exportFormat->addItem(QString("%1 (*.%2)"). arg(t.desc).arg(t.extension), q); } for (int i=0; i < exportType::ETYPE_max; i++) help.append(QString()); help[exportType::Separator] = "What the heck!?"; help[exportType::PEM] = tr("PEM Text format with headers"); help[exportType::PEM_selected] = tr("Concatenated list of all selected items in one PEM text file"); help[exportType::PEM_chain] = tr("Concatenated text format of the complete certificate chain in one PEM file"); help[exportType::PEM_trusted] = tr("Concatenated text format of all trusted certificates in one PEM file"); help[exportType::PEM_all] = tr("Concatenated text format of all certificates in one PEM file"); help[exportType::DER] = tr("Binary DER encoded file"); help[exportType::PKCS7] = tr("PKCS#7 encoded single certificate"); help[exportType::PKCS7_chain] = tr("PKCS#7 encoded complete certificate chain"); help[exportType::PKCS7_trusted] = tr("All trusted certificates encoded in one PKCS#7 file"); help[exportType::PKCS7_selected] = tr("All selected certificates encoded in one PKCS#7 file"); help[exportType::PKCS7_all] = tr("All certificates encoded in one PKCS#7 file"); help[exportType::PKCS12] = tr("The certificate and the private key as encrypted PKCS#12 file"); help[exportType::PKCS12_chain] = tr("The complete certificate chain and the private key as encrypted PKCS#12 file"); help[exportType::PEM_cert_key] = tr("Concatenation of the certificate and the unencrypted private key in one PEM file"); help[exportType::PEM_cert_pk8] = tr("Concatenation of the certificate and the encrypted private key in PKCS#8 format in one file"); help[exportType::PEM_key] = tr("Text format of the public key in one PEM file"); help[exportType::DER_key] = tr("Binary DER format of the public key"); help[exportType::PEM_private] = tr("Unencrypted private key in text format"); help[exportType::PEM_private_encrypt] = tr("OpenSSL specific encrypted private key in text format"); help[exportType::DER_private] = tr("Unencrypted private key in binary DER format"); help[exportType::PKCS8] = tr("Unencrypted private key in PKCS#8 text format"); help[exportType::PKCS8_encrypt] = tr("Encrypted private key in PKCS#8 text format"); help[exportType::SSH2_public] = tr("The public key encoded in SSH2 format"); on_exportFormat_highlighted(0); } void ExportDialog::on_fileBut_clicked() { QString s = QFileDialog::getSaveFileName(this, QString(), filename->text(), filter, NULL, QFileDialog::DontConfirmOverwrite); if (!s.isEmpty()) { nativeSeparator(s); filename->setText(s); } } void ExportDialog::on_exportFormat_activated(int selected) { QString fn = filename->text(); exportType form = exportFormat->itemData(selected).value<exportType>(); for (int i=0; i< exportFormat->count(); i++) { exportType t = exportFormat->itemData(i).value<exportType>(); if (fn.endsWith(QString(".") + t.extension)) { fn = fn.left(fn.length() - t.extension.length()) + form.extension; break; } } if (filename->isEnabled()) filename->setText(fn); on_exportFormat_highlighted(selected); } bool ExportDialog::mayWriteFile(const QString &fname) { if (QFile::exists(fname)) { xcaWarning msg(NULL, 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() { QString fn = filename->text(); if (!filename->isEnabled()) { QDialog::accept(); return; } if (fn.isEmpty()) { reject(); return; } if (mayWriteFile(fn)) { mainwin->setPath(fn.mid(0, fn.lastIndexOf(QRegExp("[/\\\\]")))); QDialog::accept(); } } enum exportType::etype ExportDialog::type() { int selected = exportFormat->currentIndex(); exportType form = exportFormat->itemData(selected).value<exportType>(); return form.type; } void ExportDialog::on_exportFormat_highlighted(int index) { exportType form = exportFormat->itemData(index).value<exportType>(); infoBox->setText(help[form.type]); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/ExportDialog.h��������������������������������������������������������������������0000664�0000000�0000000�00000002454�12606205164�0016517�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2014 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __EXPORTDIALOG_H #define __EXPORTDIALOG_H #include "ui_ExportDialog.h" #include "lib/pki_base.h" class MainWindow; class QPixmap; class exportType { public: enum etype { Separator, PEM, PEM_chain, PEM_trusted, PEM_all, DER, PKCS7, PKCS7_chain, PKCS7_trusted, PKCS7_all, PKCS12, PKCS12_chain, PEM_cert_key, PEM_cert_pk8, PEM_key, PEM_private, PEM_private_encrypt, DER_private, DER_key, PKCS8, PKCS8_encrypt, SSH2_public, PEM_selected, PKCS7_selected, ETYPE_max }; enum etype type; QString desc; QString extension; exportType(enum etype t, QString e, QString d) { type = t; extension = e; desc = d; } exportType() { type = Separator; } }; Q_DECLARE_METATYPE(exportType); class ExportDialog: public QDialog, public Ui::ExportDialog { Q_OBJECT protected: QString filter; MainWindow *mainwin; QVector<QString> help; public: ExportDialog(MainWindow *mw, QString title, QString filt, pki_base *pki, QPixmap *img, QList<exportType> types); static bool mayWriteFile(const QString &fname); enum exportType::etype type(); public slots: void on_fileBut_clicked(); void on_exportFormat_activated(int); void on_exportFormat_highlighted(int index); void accept(); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/FocusCombo.h����������������������������������������������������������������������0000664�0000000�0000000�00000000562�12606205164�0016153�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2014 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __FOCUSCOMBO_H #define __FOCUSCOMBO_H #include <QComboBox> class focusCombo : public QComboBox { public: focusCombo(QWidget *parent) : QComboBox(parent) { } void hidePopup() { QComboBox::hidePopup(); emit highlighted(currentIndex()); } }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/ImportMulti.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000020014�12606205164�0016726�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 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 <QPushButton> #include <QMessageBox> #include <QLabel> #include <QInputDialog> #include <QUrl> #include <QMimeData> 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 { XCA_WARN(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) { XCA_WARN(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") { XCA_WARN(tr("Details of the item '%1' cannot be shown"). arg(cn)); } else XCA_WARN(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) { XCA_INFO(tr("The file '%1' did not contain PKI data"). arg(failed[0])); } else if (failed.count() > 1) { XCA_INFO(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) XCA_INFO(pki->getMsg(pki_base::msg_import). arg(pki->getIntName())); accept(); return; } /* the behaviour for more than one item */ exec(); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/ImportMulti.h���������������������������������������������������������������������0000664�0000000�0000000�00000002011�12606205164�0016370�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 <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-1.3.2/widgets/KeyDetail.cpp���������������������������������������������������������������������0000664�0000000�0000000�00000004737�12606205164�0016332�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/main.h" #include "lib/pki_evp.h" #include "lib/pki_scard.h" #include "widgets/distname.h" #include "widgets/clicklabel.h" #include <QLabel> #include <QPushButton> #include <QLineEdit> KeyDetail::KeyDetail(QWidget *parent) :QDialog(parent) { setupUi(this); setWindowTitle(tr(XCA_TITLE)); image->setPixmap(*MainWindow::keyImg); keyDesc->setReadOnly(true); keyModulus->setFont(XCA_application::tableFont); } #ifndef OPENSSL_NO_EC static QString CurveComment(int nid) { foreach(builtin_curve curve, pki_key::builtinCurves) { if (curve.nid == nid) return curve.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)); connect(keyPubEx, SIGNAL(doubleClicked(QString)), MainWindow::getResolver(), SLOT(searchOid(QString))); keyPubEx->setToolTip(CurveComment(nid)); keyModulus->setText(key->ecPubKey()); break; #endif default: tlHeader->setText(tr("Unknown key")); } } ���������������������������������xca-1.3.2/widgets/KeyDetail.h�����������������������������������������������������������������������0000664�0000000�0000000�00000000527�12606205164�0015770�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-1.3.2/widgets/KeyTreeView.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000006511�12606205164�0016652�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "lib/pki_scard.h" #include "XcaTreeView.h" #include "MainWindow.h" #include <QAbstractItemModel> #include <QAbstractItemView> #include <QMenu> void KeyTreeView::fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes) { bool multi = indexes.size() > 1; pki_key *key = static_cast<pki_key*>(index.internalPointer()); if (indexes.size() == 0) return; if (!multi && key && 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 (!pkcs11::loaded() || multi) return; if (key->isToken()) { 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())); } else if (subExport) { subExport->addAction(tr("Security token"), this, SLOT(toToken())); } } void KeyTreeView::setOwnPass() { try { keys->setOwnPass(currentIndex(), pki_key::ptPrivate); } catch (errorEx &err) { mainwin->Error(err); } } void KeyTreeView::resetOwnPass() { try { keys->setOwnPass(currentIndex(), pki_key::ptCommon); } catch (errorEx &err) { mainwin->Error(err); } } void KeyTreeView::changePin() { pki_scard *scard; QModelIndex currentIdx = currentIndex(); if (!currentIdx.isValid()) return; scard = static_cast<pki_scard*>(currentIdx.internalPointer()); try { if (!scard->isToken()) { throw errorEx(tr("This is not a token")); } scard->changePin(); } catch (errorEx &err) { mainwin->Error(err); } } void KeyTreeView::initPin() { pki_scard *scard; QModelIndex currentIdx = currentIndex(); if (!currentIdx.isValid()) return; scard = static_cast<pki_scard*>(currentIdx.internalPointer()); try { if (!scard->isToken()) { throw errorEx(tr("This is not a token")); } scard->initPin(); } catch (errorEx &err) { mainwin->Error(err); } } void KeyTreeView::changeSoPin() { pki_scard *scard; QModelIndex currentIdx = currentIndex(); if (!currentIdx.isValid()) return; scard = static_cast<pki_scard*>(currentIdx.internalPointer()); try { if (!scard->isToken()) { throw errorEx(tr("This is not a token")); } scard->changeSoPin(); } catch (errorEx &err) { mainwin->Error(err); } } void KeyTreeView::toToken() { QModelIndex currentIdx = currentIndex(); if (!currentIdx.isValid()) return; 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 (XCA_YESNO(msg)) { keys->deletePKI(currentIdx); keys->insertPKI(card); card = NULL; } } catch (errorEx &err) { mainwin->Error(err); } if (card) delete card; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/KeyTreeView.h���������������������������������������������������������������������0000664�0000000�0000000�00000001273�12606205164�0016317�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2006 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __KEYTREEVIEW_H #define __KEYTREEVIEW_H #include "XcaTreeView.h" #include "lib/db_key.h" class KeyTreeView: public XcaTreeView { Q_OBJECT db_key *keys; public: KeyTreeView(QWidget *parent) : XcaTreeView(parent) { keys = NULL; } void fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes); void setModel(db_key *model=NULL) { keys = model; XcaTreeView::setModel(model); } public slots: void resetOwnPass(); void setOwnPass(); void changePin(); void initPin(); void changeSoPin(); void toToken(); }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/MW_database.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000022215�12606205164�0016615�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "MainWindow.h" #include "lib/exception.h" #include "lib/pki_evp.h" #include "lib/pki_scard.h" #include "lib/entropy.h" #include <QDir> #include <QDebug> #include <QStatusBar> #include <QMessageBox> #include "lib/db_base.h" #include "lib/func.h" #include "widgets/ImportMulti.h" #include "widgets/NewKey.h" void MainWindow::set_geometry(char *p, db_header_t *head) { if (head->version != 1) return; QByteArray ba = QByteArray::fromRawData(p, head->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); } int MainWindow::init_database() { int ret = 2; qDebug("Opening database: %s", QString2filename(dbfile)); keys = NULL; reqs = NULL; certs = NULL; temps = NULL; crls = NULL; Entropy::seed_rng(); 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); certs->updateAfterDbLoad(); } catch (errorEx &err) { Error(err); dbfile = ""; return ret; } searchEdit->setText(""); searchEdit->show(); statusBar()->addWidget(searchEdit, 1); mandatory_dn = ""; explicit_dn = explicit_dn_default; string_opt = QString("MASK:0x2002"); ASN1_STRING_set_default_mask_asc((char*)CCHAR(string_opt)); hashBox::resetDefault(); pkcs11path = QString(); workingdir = QDir::currentPath(); setOptFlags((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( tempView, SIGNAL(newCert(pki_temp *)), certs, SLOT(newCert(pki_temp *)) ); connect( tempView, 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); while (mydb.find(setting, QString()) == 0) { QString key; db_header_t head; char *p = (char *)mydb.load(&head); if (!p) { if (mydb.next()) break; continue; } key = head.name; if (key == "workingdir") workingdir = p; else if (key == "pkcs11path") pkcs11path = p; else if (key == "default_hash") hashBox::setDefault(p); else if (key == "mandatory_dn") mandatory_dn = p; else if (key == "explicit_dn") explicit_dn = p; /* what a stupid idea.... */ else if (key == "multiple_key_use") mydb.erase(); else if (key == "string_opt") string_opt = p; else if (key == "suppress") mydb.erase(); else if (key == "optionflags1") setOptFlags((QString(p))); /* Different optionflags, since setOptFlags() * does an abort() for unknown flags in * older versions. *Another stupid idea* * This is for backward compatibility */ else if (key == "optionflags") setOptFlags_old((QString(p))); else if (key == "defaultkey") NewKey::setDefault((QString(p))); else if (key == "mw_geometry") set_geometry(p, &head); free(p); if (mydb.next()) break; } } catch (errorEx &err) { Error(err); return ret; } ASN1_STRING_set_default_mask_asc((char*)CCHAR(string_opt)); if (explicit_dn.isEmpty()) explicit_dn = explicit_dn_default; setWindowTitle(tr(XCA_TITLE)); setItemEnabled(true); if (pki_evp::passwd.isNull()) XCA_INFO(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 revocation: 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 { XCA_INFO(tr("No deleted items found")); } delete dlgi; } int MainWindow::open_default_db() { if (!dbfile.isEmpty()) return 0; FILE *fp = fopen_read(getUserSettingsDir() + QDir::separator() + "defaultdb"); 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(); dbfile = QString(); return 0; } void MainWindow::default_database() { QFileInfo fi(dbfile); QString dir = getUserSettingsDir(); QString file = dir +QDir::separator() +"defaultdb"; FILE *fp; QDir d; if (dbfile.isEmpty()) { QFile::remove(file); return; } d.mkpath(dir); fp = fopen_write(file); 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); statusBar()->removeWidget(searchEdit); dbindex->clear(); keyView->setModel(); reqView->setModel(); certView->setModel(); tempView->setModel(); crlView->setModel(); 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 { int ret; db mydb(dbfile); ret = mydb.shrink( DBFLAG_OUTDATED | DBFLAG_DELETED ); if (ret == 1) XCA_INFO(tr("Errors detected and repaired while deleting outdated items from the database. A backup file was created")); if (ret == 2) XCA_INFO(tr("Removing deleted or outdated items from the database failed.")); } catch (errorEx &err) { MainWindow::Error(err); } update_history(dbfile); pkcs11::remove_libs(); enableTokenMenu(pkcs11::loaded()); dbfile.clear(); } void MainWindow::load_history() { QFile file; QString name = getUserSettingsDir() + QDir::separator() + "dbhistory"; file.setFileName(name); if (!file.open(QIODevice::ReadOnly)) return; history.clear(); while (!file.atEnd()) { QString name; char buf[1024]; ssize_t size = file.readLine(buf, sizeof buf); if (size <= 0) break; name = filename2QString(buf); name = name.trimmed(); if (name.size() == 0) continue; if (history.indexOf(name) == -1) history << name; } file.close(); update_history_menu(); } void MainWindow::update_history(QString fname) { QFile file; int pos; QString name, dir = getUserSettingsDir(); QDir d; pos = history.indexOf(fname); if (pos == 0) return; /* no changes */ d.mkpath(dir); if (pos > 0) history.removeAt(pos); history.prepend(fname); while (history.size() > 10) history.removeLast(); name = dir + QDir::separator() + "dbhistory"; file.setFileName(name); if (!file.open(QIODevice::ReadWrite)) return; for (pos = 0; pos < history.size(); pos++) { QByteArray ba = filename2bytearray(history[pos]); ba.append('\n'); if (file.write(ba) <= 0) break; } file.close(); update_history_menu(); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/MW_help.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000010026�12606205164�0015776�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "MainWindow.h" #include <QApplication> #include <QMimeData> #include <QPixmap> #include <QLabel> #ifndef OPENSSL_NO_EC #include <openssl/ec.h> #endif #include "ui_About.h" #include "ui_Help.h" #include "lib/func.h" #include "lib/entropy.h" void MainWindow::cmd_version() { fprintf(stderr, XCA_TITLE " Version " PACKAGE_VERSION "\n"); exitApp = 1; } void MainWindow::cmd_help(const char* msg) { exitApp = 1; fprintf(stderr, XCA_TITLE " Version " PACKAGE_VERSION "\n" "\n" " -v show version information and exit\n" " -h shows this help screen and exit\n" " -e <type>:<name> extract entry.\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, brainpool; #ifndef OPENSSL_NO_EC #ifdef NID_brainpoolP160r1 EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_brainpoolP160r1); ign_openssl_error(); if (group) { EC_GROUP_free(group); brainpool = "<p>ECC With RFC 5639 Brainpool curves" #if OPENSSL_VERSION_NUMBER < 0x10002001L "<br/>(Backported to " OPENSSL_VERSION_TEXT ")" #endif ; } #endif #else brainpool = "(Elliptic Curve Cryptography support disabled)"; #endif 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); Entropy::seed_rng(); cont = QString( "<p><h3><center><u>XCA</u></center></h3>" "<p>Copyright 2001 - 2015 by Christian Hohnstädt\n" "<p>Version: <b>" PACKAGE_VERSION "</b>" "<p>%1<p>%2" "<p>http://sourceforge.net/projects/xca" "<p>Entropy strength: %3" "<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>" "</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>" "<tr><td><b>Helmut Strobl</b></td><td><u><helmut.strobl@t-online.de></u></td></tr>" "</table><hr><center><u><b>Maintained Translations</b></u></center>" "<p><table>" "<tr><td><b>German</b></td><td>Christian Hohnstädt <christian@hohnstaedt.de></td></tr>" "<tr><td><b>French</b></td><td>Patrick Monnerat <Patrick.Monnerat@datasphere.ch></td></tr>" "<tr><td><b>Croatian</b></td><td>Nevenko Bartolincic <nevenko.bartolincic@gmail.com></td></tr>" "</table>").arg(brainpool).arg(version).arg(Entropy::strength()); about->setWindowTitle(XCA_TITLE); ui.image->setPixmap( *keyImg ); ui.image1->setPixmap( *certImg ); ui.textbox->setHtml(cont); about->exec(); delete about; } 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-1.3.2/widgets/MW_menu.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000027245�12606205164�0016025�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 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 "lib/db_x509super.h" #include "ui_Options.h" #include "hashBox.h" #include "OidResolver.h" #include <QApplication> #include <QClipboard> #include <QMenuBar> #include <QMessageBox> class myLang { public: QString english, native; QLocale locale; myLang(QString e, QString n, QLocale l) { english = e; native = n, locale = l; } }; void MainWindow::init_menu() { static QMenu *file = NULL, *help = NULL, *import = NULL, *token = NULL, *languageMenu = NULL, *extra = NULL; static QActionGroup * langGroup = NULL; QAction *a; QList<myLang> languages; if (file) delete file; if (help) delete help; if (import) delete import; if (token) delete token; if (extra) delete extra; if (languageMenu) delete languageMenu; if (historyMenu) delete historyMenu; if (langGroup) delete langGroup; wdMenuList.clear(); scardList.clear(); acList.clear(); langGroup = new QActionGroup(this); historyMenu = new tipMenu(tr("Recent DataBases") + " ...", this); connect(historyMenu, SIGNAL(triggered(QAction*)), this, SLOT(open_database(QAction*))); languages << myLang("System", tr("System"), QLocale::system()) << myLang("Croatian", tr("Croatian"), QLocale("hr")) << myLang("English", tr("English"), QLocale("en")) << myLang("French", tr("French"), QLocale("fr")) << myLang("German", tr("German"), QLocale("de")) << myLang("Russian", tr("Russian"), QLocale("ru")) << myLang("Spanish", tr("Spanish"), QLocale("es")) << myLang("Turkish", tr("Turkish"), QLocale("tr")); languageMenu = new tipMenu(tr("Language"), this); connect(languageMenu, SIGNAL(triggered(QAction*)), qApp, SLOT(switchLanguage(QAction*))); foreach(myLang l, languages) { QAction *a = new QAction(l.english, langGroup); a->setToolTip(l.native); a->setData(QVariant(l.locale)); a->setDisabled(!XCA_application::languageAvailable(l.locale)); a->setCheckable(true); langGroup->addAction(a); languageMenu->addAction(a); if (l.locale == XCA_application::language()) a->setChecked(true); } 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->addMenu(historyMenu); file->addAction(tr("Set as default DataBase"), this, SLOT(default_database())); acList += file->addAction(tr("&Close DataBase"), this, SLOT(close_database()), QKeySequence(QKeySequence::Close)); a = new QAction(tr("Options"), this); connect(a, SIGNAL(triggered()), this, SLOT(setOptions())); a->setMenuRole(QAction::PreferencesRole); file->addAction(a); acList += a; file->addMenu(languageMenu); file->addSeparator(); a = new QAction(tr("Exit"), this); connect(a, SIGNAL(triggered()), qApp, SLOT(quit())); a->setMenuRole(QAction::QuitRole); file->addAction(a); import = menuBar()->addMenu(tr("I&mport")); import->addAction(tr("Keys"), keyView, SLOT(load()) ); import->addAction(tr("Requests"), reqView, SLOT(load()) ); import->addAction(tr("Certificates"), certView, SLOT(load()) ); import->addAction(tr("PKCS#12"), certView, SLOT(loadPKCS12()) ); import->addAction(tr("PKCS#7"), certView, SLOT(loadPKCS7()) ); import->addAction(tr("Template"), tempView, SLOT(load()) ); import->addAction(tr("Revocation list"), crlView, SLOT(load())); 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()) ); extra = menuBar()->addMenu(tr("Extra")); acList += extra->addAction(tr("&Dump DataBase"), this, SLOT(dump_database())); acList += extra->addAction(tr("C&hange DataBase password"), this, SLOT(changeDbPass())); acList += extra->addAction(tr("&Import old db_dump"), this, SLOT(import_dbdump())); acList += extra->addAction(tr("&Undelete items"), this, SLOT(undelete())); extra->addAction(tr("Generate DH parameter"), this, SLOT(generateDHparam())); extra->addAction(tr("OID Resolver"), resolver, SLOT(show())); help = menuBar()->addMenu(tr("&Help") ); help->addAction(tr("&Content"), this, SLOT(help()), QKeySequence::HelpContents); a = new QAction(tr("About"), this); connect(a, SIGNAL(triggered()), this, SLOT(about())); a->setMenuRole(QAction::AboutRole); help->addAction(a); wdMenuList += import; scardList += token; setItemEnabled(!dbfile.isEmpty()); } 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::update_history_menu() { historyMenu->clear(); for (int i = 0; i < history.size(); i++) { QAction *a; QString txt = history[i]; txt = txt.remove(0, txt.lastIndexOf(QDir::separator()) +1); if (txt.size() > 20) txt = QString("...") + txt.mid(txt.size() - 20); a = historyMenu->addAction(QString("%1 %2").arg(i).arg(txt)); a->setData(QVariant(history[i])); a->setToolTip(history[i]); } } void MainWindow::open_database(QAction* a) { changeDB(a->data().toString()); } 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) { xcaWarning msg(this, tr("Password verification error. Ignore keys ?")); msg.addButton(QMessageBox::Cancel); msg.addButton(QMessageBox::Ok)->setText( tr("Import anyway")); if (msg.exec() == QMessageBox::Cancel) return; } pki_evp::oldpasswd = pass; read_dump(CCHAR(file), dbl, NULL, 0); pki_evp::oldpasswd.cleanse(); } catch (errorEx &err) { Error(err); } } void MainWindow::setOptions() { if (dbfile.isEmpty()) return; Options *opt = new Options(this); opt->setExtDnString(mandatory_dn); opt->setExpDnString(explicit_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); opt->transDnEntries->setCheckState( translate_dn ? Qt::Checked : Qt::Unchecked); opt->onlyTokenHashes->setCheckState( pki_scard::only_token_hashes ? Qt::Checked : Qt::Unchecked); opt->disableNetscape->setCheckState( pki_x509::disable_netscape ? 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->getExtDnString(); explicit_dn = opt->getExpDnString(); mydb.set((const unsigned char *)CCHAR(mandatory_dn), mandatory_dn.length()+1, 1, setting, "mandatory_dn"); if (explicit_dn.isEmpty()) explicit_dn = explicit_dn_default; if (explicit_dn != explicit_dn_default) { mydb.set((const unsigned char *)CCHAR(explicit_dn), explicit_dn.length()+1, 1, setting, "explicit_dn"); } else { mydb.first(); if (!mydb.find(setting, "explicit_dn")) { mydb.erase(); } } QString flags = getOptFlags(); pki_base::suppress_messages = opt->suppress->checkState(); pki_x509::dont_colorize_expiries = opt->noColorize->checkState(); translate_dn = opt->transDnEntries->checkState(); pki_scard::only_token_hashes = opt->onlyTokenHashes->checkState(); pki_x509::disable_netscape = opt->disableNetscape->checkState(); if (flags != getOptFlags()) { flags = getOptFlags(); mydb.set((const unsigned char *)(CCHAR(flags)), flags.length()+1, 1, setting, "optionflags1"); mydb.first(); if (!mydb.find(setting, "suppress")) mydb.erase(); certView->showHideSections(); reqView->showHideSections(); } 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_old(QString flags) { int s = flags.size(), i; QByteArray b = flags.toLatin1(); pki_base::suppress_messages = false; pki_x509::dont_colorize_expiries = false; translate_dn = 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; case 'T': translate_dn = true; break; } } } void MainWindow::setOptFlags(QString flags) { bool old_disable_netscape = pki_x509::disable_netscape; pki_base::suppress_messages = false; pki_x509::dont_colorize_expiries = false; translate_dn = false; pki_scard::only_token_hashes = false; pki_x509::disable_netscape = false; foreach(QString flag, flags.split(",")) { if (flag == "suppress_messages") pki_base::suppress_messages = true; else if (flag == "dont_colorize_expiries") pki_x509::dont_colorize_expiries = true; else if (flag == "translate_dn") translate_dn = true; else if (flag == "only_token_hashes") pki_scard::only_token_hashes = true; else if (flag == "disable_netscape") pki_x509::disable_netscape = true; else if (!flag.isEmpty()) fprintf(stderr, "Unkown flag '%s'\n", CCHAR(flag)); } if (old_disable_netscape != pki_x509::disable_netscape) { certView->showHideSections(); reqView->showHideSections(); } } QString MainWindow::getOptFlags() { QStringList flags; if (pki_base::suppress_messages) flags << "suppress_messages"; if (pki_x509::dont_colorize_expiries) flags << "dont_colorize_expiries"; if (translate_dn) flags << "translate_dn"; if (pki_scard::only_token_hashes) flags << "only_token_hashes"; if (pki_x509::disable_netscape) flags << "disable_netscape"; return flags.join(","); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/MainWindow.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000052014�12606205164�0016522�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ //#define MDEBUG #include "MainWindow.h" #include "ImportMulti.h" #include "lib/Passwd.h" #include "lib/entropy.h" #include <openssl/rand.h> #include <QApplication> #include <QClipboard> #include <QMessageBox> #include <QLabel> #include <QPushButton> #include <QListView> #include <QLineEdit> #include <QTextBrowser> #include <QStatusBar> #include <QList> #include <QTimer> #include <QMimeData> #include <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 "lib/builtin_curves.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; QString MainWindow::explicit_dn; QString MainWindow::explicit_dn_default = QString("C,ST,L,O,OU,CN,emailAddress"); OidResolver *MainWindow::resolver = NULL; 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()); } MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent) { dbindex = new QLabel(); dbindex->setFrameStyle(QFrame::Plain | QFrame::NoFrame); dbindex->setMargin(6); dn_translations_setup(); statusBar()->addWidget(dbindex, 1); setupUi(this); setWindowTitle(XCA_TITLE); resolver = new OidResolver(NULL); resolver->setWindowTitle(XCA_TITLE); wdList << keyButtons << reqButtons << certButtons << tempButtons << crlButtons; historyMenu = NULL; init_menu(); setItemEnabled(false); init_images(); homedir = getHomeDir(); #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(); EVP_add_digest_alias(SN_sha1,SN_ecdsa_with_SHA1); EVP_add_digest_alias(SN_sha224,SN_ecdsa_with_SHA224); EVP_add_digest_alias(SN_sha256,SN_ecdsa_with_SHA256); EVP_add_digest_alias(SN_sha256,SN_dsa_with_SHA256); EVP_add_digest_alias(SN_sha384,SN_ecdsa_with_SHA384); EVP_add_digest_alias(SN_sha512,SN_ecdsa_with_SHA512); /* 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); searchEdit = new QLineEdit(); keyView->setMainwin(this, searchEdit); reqView->setMainwin(this, searchEdit); certView->setMainwin(this, searchEdit); tempView->setMainwin(this, searchEdit); crlView->setMainwin(this, searchEdit); } void MainWindow::dropEvent(QDropEvent *event) { QList<QUrl> urls = event->mimeData()->urls(); QUrl u; QStringList files; foreach(u, urls) { QString s = u.toLocalFile(); files << s; } openURLs(files); event->acceptProposedAction(); } void MainWindow::openURLs(QStringList &files) { urlsToOpen = files; QTimer::singleShot(100, this, SLOT(openURLs())); } void MainWindow::openURLs() { QStringList failed; QString s; ImportMulti *dlgi = new ImportMulti(this); foreach(s, urlsToOpen) { pki_multi *pki = probeAnything(s); if (pki && !pki->count()) failed << s; dlgi->addItem(pki); } urlsToOpen.clear(); dlgi->execute(1, failed); delete dlgi; } void MainWindow::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) event->acceptProposedAction(); } void MainWindow::setItemEnabled(bool enable) { foreach(QWidget *w, wdList) { w->setEnabled(enable); } foreach(QWidget *w, wdMenuList) { 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 argc, char *argv[]) { int cnt = 1, opt = 0, force_load = 0; char *arg = NULL; exitApp = 0; QStringList failed; ImportMulti *dlgi = new ImportMulti(this); while (cnt < argc) { arg = 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.toLatin1(); 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); p11.getRandom(); 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(); XCA_INFO(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 } void MainWindow::closeEvent(QCloseEvent *e) { if (resolver) { delete resolver; } QMainWindow::closeEvent(e); } QString makeSalt(void) { unsigned char rand[2]; char saltbuf[10]; Entropy::get(rand, 2); snprintf(saltbuf, 10, "S%02X%02X", rand[0], rand[1]); return QString(saltbuf); } int MainWindow::checkOldGetNewPass(Passwd &pass) { QString passHash; db mydb(dbfile); if (!mydb.find(setting, "pwhash")) { char *cpass; pass_info p(tr("Current Password"), tr("Please enter the current database password"), this); if ((cpass = (char *)mydb.load(NULL))) { passHash = cpass; free(cpass); } /* Try empty password */ if (pki_evp::sha512passwd(pass, passHash) != passHash) { /* Not the empty password, check it */ if (PwDialog::execute(&p, &pass, false) != 1) return 0; } if (pki_evp::sha512passwd(pass, passHash) != passHash) { XCA_WARN(tr("The entered password is wrong")); return 0; } } pass_info p(tr("New Password"), tr("Please enter the new password " "to encrypt your private keys in the database-file"), this); return PwDialog::execute(&p, &pass, true) != 1 ? 0 : 1; } void MainWindow::changeDbPass() { Passwd pass; QString tempn = dbfile + "{recrypt}"; if (!checkOldGetNewPass(pass)) return; try { if (!QFile::copy(dbfile, tempn)) throw errorEx("Could not create temporary file: " + tempn); QString passhash = updateDbPassword(tempn, pass); QFile new_file(tempn); /* closing the database erases 'dbfile' */ QString dbfile_bkup = dbfile; close_database(); db mydb(dbfile_bkup); if (mydb.mv(new_file)) throw errorEx(QString("Failed to rename %1 to %2"). arg(tempn).arg(dbfile_bkup)); dbfile = dbfile_bkup; 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) throw errorEx("Failed to load item"); key = new pki_evp(); if (key->getVersion() < head.version) { int v = key->getVersion(); free(p); delete key; throw errorEx(QString("Item[%1]: Version %2 " "> known version: %3 -> ignored") .arg(head.name).arg(head.version).arg(v) ); } key->setIntName(QString::fromUtf8(head.name)); try { key->fromData(p, &head); } catch (errorEx &err) { err.appendString(key->getIntName()); free(p); delete key; throw err; } 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; 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) XCA_WARN( 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(); xcaWarning box(NULL, msg); box.addButton(QMessageBox::Apply)->setText(tr("Copy to Clipboard")); box.addButton(QMessageBox::Ok); 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::setDefaultKey(QString str) { db mydb(dbfile); mydb.set((const unsigned char *)CCHAR(str), str.length()+1, 1, setting, "defaultkey"); } 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 = new db(file); mydb->verify_magic(); delete mydb; 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; /* * 1024: 6 sec * 2048: 38 sec * 4096: 864 sec */ Entropy::seed_rng(); 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_write(fname); 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; } void MainWindow::changeEvent(QEvent *event) { if (event->type() == QEvent::LanguageChange) { QList<db_base*> models; retranslateUi(this); dn_translations_setup(); init_menu(); update_history_menu(); models << keys << reqs << certs << crls << temps; foreach(db_base *model, models) { if (model) model->updateHeaders(); } if (!dbfile.isEmpty()) dbindex->setText(tr("Database") + ": " + dbfile); } QMainWindow::changeEvent(event); } void MainWindow::keyPressEvent(QKeyEvent *e) { if (e->modifiers() != Qt::ControlModifier) { QMainWindow::keyPressEvent(e); return; } int siz = XCA_application::tableFont.pointSize(); QList<XcaTreeView*> views; switch (e->key()) { case Qt::Key_Plus: XCA_application::tableFont.setPointSize(siz +1); break; case Qt::Key_Minus: if (siz > 4) { XCA_application::tableFont.setPointSize(siz -1); } break; default: QMainWindow::keyPressEvent(e); return; } views << keyView << reqView << certView << crlView << tempView; foreach(XcaTreeView *v, views) { if (v) { v->header()->resizeSections( QHeaderView::ResizeToContents); v->reset(); } } update(); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/MainWindow.h����������������������������������������������������������������������0000664�0000000�0000000�00000010170�12606205164�0016164�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __MAINWINDOW_H #define __MAINWINDOW_H #include "NewX509.h" #include "OidResolver.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 "lib/main.h" #include <QPixmap> #include <QFileDialog> #include <QMenuBar> #include <QList> #include <QMessageBox> #include <QMenu> #include <QToolTip> #include <QLocale> #define DBFILE "xca.xdb" class db_x509; class pki_multi; class xcaWarning: public QMessageBox { public: xcaWarning(QWidget *w, QString txt) : QMessageBox(QMessageBox::Warning, XCA_TITLE, txt, QMessageBox::NoButton, w) { setTextFormat(Qt::PlainText); } }; class tipMenu : public QMenu { Q_OBJECT public: tipMenu(QString n, QWidget *w) : QMenu(n, w) {} bool event (QEvent * e) { const QHelpEvent *helpEvent = static_cast <QHelpEvent *>(e); if (helpEvent->type() == QEvent::ToolTip && activeAction() && activeAction()->toolTip() != activeAction()->text()) { QToolTip::showText(helpEvent->globalPos(), activeAction()->toolTip()); } else { QToolTip::hideText(); } return QMenu::event(e); } }; class MainWindow: public QMainWindow, public Ui::MainWindow { Q_OBJECT private: static OidResolver *resolver; QString workingdir; QString string_opt; QString pkcs11path; QList<QWidget*> wdList; QList<QWidget*> wdMenuList; QList<QWidget*> scardList; QList<QAction*> acList; QStringList history; tipMenu *historyMenu; void update_history_menu(); void set_geometry(char *p, db_header_t *head); QLineEdit *searchEdit; QStringList urlsToOpen; int checkOldGetNewPass(Passwd &pass); QString updateDbPassword(QString newdb, Passwd pass); 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); void setOptFlags_old(QString flags); QString getOptFlags(); void keyPressEvent(QKeyEvent *e); 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; static QString explicit_dn; static QString explicit_dn_default; int exitApp; QString dbfile; QLabel *dbindex; MainWindow(QWidget *parent); virtual ~MainWindow(); void loadSettings(); void saveSettings(); int initPass(); void read_cmdline(int argc, char *argv[]); void load_engine(); static OidResolver *getResolver() { return resolver; } 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); 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(); void setDefaultKey(QString def); void load_history(); void update_history(QString file); 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 help(); void import_dbdump(); void undelete(); void loadPem(); bool pastePem(QString text); void pastePem(); void changeDbPass(); void openURLs(QStringList &files); void openURLs(); void changeEvent(QEvent *event); protected slots: void closeEvent(QCloseEvent * event); private slots: void setOptions(); void manageToken(); void initToken(); void changePin(bool so=false); void changeSoPin(); void initPin(); void generateDHparam(); void open_database(QAction* a); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/Makefile��������������������������������������������������������������������������0000664�0000000�0000000�00000001056�12606205164�0015402�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ifeq ($(TOPDIR),) TOPDIR=.. BUILD=.. endif MOC_NAMES=MainWindow KeyDetail clicklabel XcaTreeView NewX509 \ validity v3ext distname CertDetail CertExtend PwDialog \ ImportMulti CrlDetail ExportDialog hashBox Options NewKey kvView \ NewCrl SearchPkcs11 RevocationList XcaProxyModel XcaHeaderView \ KeyTreeView TempTreeView ReqTreeView X509SuperTreeView CertTreeView \ OidResolver 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-1.3.2/widgets/NewCrl.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000002204�12606205164�0015634�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 <QLabel> #include <QLineEdit> #include <QComboBox> #include <QCheckBox> #include <QMessageBox> NewCrl::NewCrl(QWidget *parent, pki_x509 *signer) :QDialog(parent) { setupUi(this); setWindowTitle(XCA_TITLE); image->setPixmap(*MainWindow::revImg); dateBox->setTitle(signer->getIntName()); 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()); a1int num = signer->getCrlNumber(); num++; crlNumber->setText(num.toDec()); 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-1.3.2/widgets/NewCrl.h��������������������������������������������������������������������������0000664�0000000�0000000�00000000574�12606205164�0015311�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-1.3.2/widgets/NewKey.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000016045�12606205164�0015654�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 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 <QLabel> #include <QPushButton> #include <QLineEdit> #include <QStringList> 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 }; int NewKey::defaultType = EVP_PKEY_RSA; int NewKey::defaultEcNid = NID_undef; int NewKey::defaultSize = 2048; class keyListItem { protected: const struct typelist *tl; public: bool card; QString printname; slotid slot; unsigned minKeySize; unsigned maxKeySize; unsigned long ec_flags; keyListItem(pkcs11 *p11, slotid nslot, CK_MECHANISM_TYPE m) { slot = nslot; CK_MECHANISM_INFO mechinfo; p11->mechanismInfo(slot, m, &mechinfo); minKeySize = mechinfo.ulMinKeySize; maxKeySize = mechinfo.ulMaxKeySize; if (maxKeySize == 0) { /* Fallback for libraries not filling in the maxKeySize */ maxKeySize = INT_MAX; } tkInfo ti = p11->tokenInfo(slot); switch (m) { case CKM_RSA_PKCS_KEY_PAIR_GEN: tl = typeList; //idx of EVP_PKEY_RSA break; case CKM_DSA_KEY_PAIR_GEN: tl = typeList +1; break; #ifndef OPENSSL_NO_EC case CKM_EC_KEY_PAIR_GEN: tl = typeList +2; CK_MECHANISM_INFO info; p11->mechanismInfo(slot, m, &info); ec_flags = info.flags & (CKF_EC_F_P | CKF_EC_F_2M); if (!ec_flags) { /* Fallback: Assume to support both for * libraries leaving this flag empty */ ec_flags = CKF_EC_F_P | CKF_EC_F_2M; } #endif } printname = QString("%1 #%2 (%3 Key of %4 - %5 bits)"). arg(ti.label()).arg(ti.serial()). arg(tl->name). arg(minKeySize). arg(maxKeySize); card = true; } keyListItem(const struct typelist *t=typeList) { tl = t; printname = QString(tl->name); card = false; slot = slotid(); minKeySize = 0; maxKeySize = INT_MAX; ec_flags = 0; } keyListItem(const keyListItem &k) { tl = k.tl; printname = k.printname; card = k.card; slot = k.slot; minKeySize = k.minKeySize; maxKeySize = k.maxKeySize; ec_flags = k.ec_flags; } int type() { return tl->type; } QString typeName() { return QString(tl->name); } }; Q_DECLARE_METATYPE(keyListItem); NewKey::NewKey(QWidget *parent, QString name) :QDialog(parent) { static const char* const sizeList[] = { "1024", "2048", "4096" }; size_t i; 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; } updateCurves(); keyLength->setEditText(QString::number(defaultSize) + " bit"); 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; } if (ml.contains(CKM_DSA_KEY_PAIR_GEN)) { keyListItem tk(&p11, slot, CKM_DSA_KEY_PAIR_GEN); keytypes << tk; } #ifndef OPENSSL_NO_EC if (ml.contains(CKM_EC_KEY_PAIR_GEN)) { keyListItem tk(&p11, slot, CKM_EC_KEY_PAIR_GEN); keytypes << tk; } #endif } } 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); if (!keytypes[i].card && keytypes[i].type() == defaultType) keyType->setCurrentIndex(i); } buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Create")); } void NewKey::updateCurves(unsigned min, unsigned max, unsigned long ec_flags) { #ifndef OPENSSL_NO_EC QString ec_default; QStringList curve_x962, curve_other; foreach(builtin_curve curve, pki_key::builtinCurves) { const char *sn = OBJ_nid2sn(curve.nid); QString comment = curve.comment; if (!sn || curve.order_size < min || curve.order_size > max) continue; if (ec_flags) { if ((curve.type & ec_flags) == 0) continue; } if (comment.isEmpty()) comment = "---"; QString p = QString(sn) + ": " + comment; if (curve.nid == defaultEcNid) ec_default = p; switch (curve.flags) { case CURVE_X962: curve_x962 << p; break; case CURVE_OTHER: curve_other << p; break; } } curveBox->clear(); curveBox->addItems(curve_x962); curveBox->addItems(curve_other); curveBox->setCurrentIndex(curveBox->findText(ec_default)); if (curveBox->currentIndex() == -1) curveBox->setCurrentIndex(0); #else (void)min; (void)max; (void)ec_flags; #endif } void NewKey::on_keyType_currentIndexChanged(int idx) { bool curve_enabled; keyListItem ki = keyType->itemData(idx).value<keyListItem>(); curve_enabled = (ki.type() == EVP_PKEY_EC); curveBox->setVisible(curve_enabled); curveLabel->setVisible(curve_enabled); keySizeLabel->setVisible(!curve_enabled); keyLength->setVisible(!curve_enabled); rememberDefault->setEnabled(!ki.card); if (curve_enabled && ki.card) { updateCurves(ki.minKeySize, ki.maxKeySize, ki.ec_flags); } } 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 NID_undef; 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; } QString NewKey::getAsString() { keyListItem k = currentKey(keyType); QString data; if (k.card) return QString(); if (k.type() == EVP_PKEY_EC) { data = OBJ_obj2QString(OBJ_nid2obj(getKeyCurve_nid()), 1); } else { data = QString::number(getKeysize()); } return QString("%1:%2").arg(currentKey(keyType).typeName()).arg(data); } int NewKey::setDefault(QString def) { int type = -1, size = 0, nid = NID_undef; QStringList sl = def.split(':'); if (sl.size() != 2) return -1; for (unsigned i=0; i < ARRAY_SIZE(typeList); i++ ) { if (sl[0] == typeList[i].name) { type = typeList[i].type; } } if (type == -1) return -2; if (type == EVP_PKEY_EC) { nid = OBJ_txt2nid(sl[1].toLatin1()); if (nid == NID_undef) return -3; defaultEcNid = nid; } else { size = sl[1].toInt(); if (size <= 0) return -4; defaultSize = size; } defaultType = type; return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/NewKey.h��������������������������������������������������������������������������0000664�0000000�0000000�00000001360�12606205164�0015313�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __NEWKEY_H #define __NEWKEY_H #include "ui_NewKey.h" #include "lib/pkcs11_lib.h" #include <QStringList> class NewKey: public QDialog, public Ui::NewKey { Q_OBJECT private: static int defaultType; static int defaultEcNid; static int defaultSize; void updateCurves(unsigned min=0, unsigned max=INT_MAX, unsigned long ec_flags=0); public: NewKey(QWidget *parent, QString name); int getKeytype(); int getKeysize(); int getKeyCurve_nid(); slotid getKeyCardSlot(); bool isToken(); QString getAsString(); static int setDefault(QString def); public slots: void on_keyType_currentIndexChanged(int); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/NewX509.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000103006�12606205164�0015563�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "NewX509.h" #include <QCheckBox> #include <QComboBox> #include <QRadioButton> #include <QMessageBox> #include <QLineEdit> #include <QLabel> #include <QPixmap> #include <QPushButton> #include <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" 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; foreach(QString dn, MainWindow::explicit_dn.split(",")) expl_dn_nid << OBJ_sn2nid(CCHAR(dn)); QStringList keys; setupUi(this); /* temporary storage for creating temporary X509V3_CTX */ ctx_cert = NULL; foreach(int nid, dn_nid) keys << QString(OBJ_nid2ln(nid)); 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 foreach(int nid, eku_nid) ekeyUsage->addItem(OBJ_nid2ln(nid)); // setup Authority Info Access foreach(int nid, aia_nid) aiaOid->addItem(OBJ_nid2ln(nid)); // init the X509 v3 context X509V3_set_ctx(&ext_ctx, NULL , NULL, NULL, NULL, 0); X509V3_set_ctx_nodb(&ext_ctx); // Setup dnWidget if (dnWidget->layout()) delete dnWidget->layout(); QGridLayout *dnLayout = new QGridLayout(dnWidget); dnLayout->setAlignment(Qt::AlignTop); dnLayout->setSpacing(6); dnLayout->setMargin(0); int n = 1, col = 0; description = new QLineEdit(this); description->setToolTip(tr("This name is only used internally and does not appear in the resulting certificate")); QLabel *label = new QLabel(this); label->setText(tr("Internal name")); dnLayout->addWidget(label, 0, 0); dnLayout->addWidget(description, 0, 1); QWidget::setTabOrder(description, extDNlist); QWidget *old = description; foreach(int nid, expl_dn_nid) { DoubleClickLabel *label; QLineEdit *edit; QString trans = dn_translations[nid]; label = new DoubleClickLabel(this); if (translate_dn && !trans.isEmpty()) { label->setText(trans); label->setToolTip(QString("[%1] %2") .arg(OBJ_nid2sn(nid)).arg(OBJ_nid2ln(nid))); } else { label->setText(OBJ_nid2ln(nid)); label->setToolTip(QString("[%1] %2") .arg(OBJ_nid2sn(nid)).arg(trans)); } label->setClickText(OBJ_nid2sn(nid)); connect(label, SIGNAL(doubleClicked(QString)), MainWindow::getResolver(), SLOT(searchOid(QString))); edit = new QLineEdit(this); setupLineEditByNid(nid, edit); nameEdits << nameEdit(nid, edit, label); dnLayout->addWidget(label, n, col); dnLayout->addWidget(edit, n, col +1); n++; if (n > expl_dn_nid.size()/2 && col == 0) { col = 2; n = expl_dn_nid.size() & 1 ? 0 : 1; } QWidget::setTabOrder(old, edit); old = edit; } // Setup Request Attributes if (attrWidget->layout()) delete attrWidget->layout(); QGridLayout *attrLayout = new QGridLayout(attrWidget); attrLayout->setAlignment(Qt::AlignTop); attrLayout->setSpacing(6); attrLayout->setMargin(0); old = reqSubChange; n = 0; foreach(int nid, attr_nid) { DoubleClickLabel *label; QLineEdit *edit; QString trans = dn_translations[nid]; label = new DoubleClickLabel(this); if (translate_dn && !trans.isEmpty()) { label->setText(trans); label->setToolTip(QString(OBJ_nid2sn(nid))); } else { label->setText(QString(OBJ_nid2ln(nid))); label->setToolTip(trans); } label->setClickText(OBJ_nid2sn(nid)); connect(label, SIGNAL(doubleClicked(QString)), MainWindow::getResolver(), SLOT(searchOid(QString))); edit = new QLineEdit(this); attrEdits << nameEdit(nid, edit, label); setupLineEditByNid(nid, edit); attrLayout->addWidget(label, n, 0); attrLayout->addWidget(edit, n, 1); QWidget::setTabOrder(old, edit); old = edit; n++; } // last polish on_certList_currentIndexChanged(0); certList->setDisabled(true); tabWidget->setCurrentIndex(0); attrWidget->hide(); pt = none; notAfter->setEndDate(true); QMap<int, DoubleClickLabel*> nidLabel; nidLabel[NID_subject_alt_name] = sanLbl; nidLabel[NID_issuer_alt_name] = ianLbl; nidLabel[NID_crl_distribution_points] = crldpLbl; nidLabel[NID_info_access] = aiaLbl; nidLabel[NID_netscape_base_url] = nsBaseLbl; nidLabel[NID_netscape_revocation_url] = nsRevLbl; nidLabel[NID_netscape_ca_revocation_url] = nsCaRevLbl; nidLabel[NID_netscape_renewal_url] = nsRenewLbl; nidLabel[NID_netscape_ca_policy_url] = nsCaPolicyLbl; nidLabel[NID_netscape_ssl_server_name] = nsSslServerLbl; nidLabel[NID_netscape_comment] = nsCommentLbl; foreach(int nid, nidLabel.keys()) { DoubleClickLabel *l = nidLabel[nid]; l->setText(translate_dn ? dn_translations[nid] : OBJ_nid2ln(nid)); if (l->toolTip().isEmpty()) { l->setToolTip(translate_dn ? OBJ_nid2ln(nid) : dn_translations[nid]); } l->setClickText(OBJ_nid2sn(nid)); connect(l, SIGNAL(doubleClicked(QString)), MainWindow::getResolver(), SLOT(searchOid(QString))); } QMap<int, QGroupBox*> nidGroupBox; nidGroupBox[NID_basic_constraints] = bcBox; nidGroupBox[NID_key_usage] = kuBox; nidGroupBox[NID_ext_key_usage] = ekuBox; nidGroupBox[NID_netscape_cert_type] = nsCertTypeBox; foreach(int nid, nidGroupBox.keys()) { QGroupBox *g = nidGroupBox[nid]; g->setTitle(translate_dn ? dn_translations[nid] : OBJ_nid2ln(nid)); if (g->toolTip().isEmpty()) { g->setToolTip(translate_dn ? OBJ_nid2ln(nid) : dn_translations[nid]); } } if (translate_dn) { QList<QGroupBox*> gb; gb << distNameBox << keyIdentBox; foreach(QGroupBox *g, gb) { QString tt = g->toolTip(); g->setToolTip(g->title()); g->setTitle(tt); } QList<QCheckBox*> cbList; cbList << bcCritical << kuCritical << ekuCritical; foreach(QCheckBox* cb, cbList) { cb->setText(tr("Critical")); } } if (pki_x509::disable_netscape) tabWidget->removeTab(4); } 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::getReqAttributes(pki_x509req *req) { foreach(nameEdit e, attrEdits) { req->addAttribute(e.nid, e.edit->text()); } } void NewX509::setReqAttributes(pki_x509req *req) { foreach(nameEdit e, attrEdits) { e.edit->setText(req->getAttribute(e.nid)); } } /* Initialize dialog for Template creation */ void NewX509::setTemp(pki_temp *temp) { QString text = tr("Create XCA template"); if (temp->getIntName() != "--") { description->setText(temp->getIntName()); description->setDisabled(true); text = tr("Edit XCA template"); } capt->setText(text); tabWidget->removeTab(0); privKeyBox->setEnabled(false); validityBox->setEnabled(false); setImage(MainWindow::tempImg); pt = tmpl; } /* Initialize dialog for Certificate creation */ void NewX509::setCert() { capt->setText(tr("Create x509 Certificate")); setImage(MainWindow::certImg); pt = x509; } void NewX509::setImage(QPixmap *img) { image->setPixmap(*img); } /* Select a template and apply it */ void NewX509::defineTemplate(pki_temp *temp) { fromTemplate(temp); templateChanged(temp); } /* Select a Request for signing it */ 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(); } /* Preset all values from another request to create a aimilar one */ void NewX509::fromX509super(pki_x509super *cert_or_req) { pki_temp *temp = new pki_temp(""); temp->fromCert(cert_or_req); defineTemplate(temp); delete temp; description->setText(cert_or_req->getIntName()); pki_key *key = cert_or_req->getRefKey(); if (key) { usedKeysToo->setChecked(true); keyList->setCurrentIndex(private_keys.indexOf( key->getIntNameWithType())); } hashAlgo->setCurrentMD(cert_or_req->getDigest()); switch(cert_or_req->getType()) { case x509: { pki_x509 *cert = (pki_x509*)cert_or_req; pki_x509 *signer = cert->getSigner(); if (signer == cert) { foreignSignRB->setChecked(false); } else if (signer) { defineSigner(signer); } notBefore->setDate(cert->getNotBefore()); notAfter->setDate(cert->getNotAfter()); break; } case x509_req: { pki_x509req *req = (pki_x509req*)cert_or_req; setReqAttributes(req); break; } default: break; } } /* Preset all values from another cert to create a aimilar one */ void NewX509::defineCert(pki_x509 *cert) { fromX509super(cert); pki_x509 *signer = cert->getSigner(); if (signer == cert) { foreignSignRB->setChecked(false); } else if (signer) { defineSigner(signer); } notBefore->setDate(cert->getNotBefore()); notAfter->setDate(cert->getNotAfter()); } /* Preset the signing certificate */ 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 = dnEntryByNid(NID_commonName); if (name.isEmpty()) name = dnEntryByNid(NID_pkcs9_emailAddress); 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 { foreach(nameEdit ne, nameEdits) { x.addEntryByNid(ne.nid, ne.edit->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 XCA_WARN(err.getString()); } } return x; } QString NewX509::dnEntryByNid(int nid) { foreach(nameEdit ne, nameEdits) { if (ne.nid == nid && !ne.edit->text().isEmpty()) return ne.edit->text(); } for (int j=0; j<extDNlist->rowCount(); j++) { QStringList l = extDNlist->getRow(j); if (OBJ_txt2nid(CCHAR(l[0])) == nid && !l[1].isEmpty()) return l[1]; } return QString(); } void NewX509::setX509name(const x509name &n) { extDNlist->deleteAllRows(); foreach(nameEdit ne, nameEdits) { ne.edit->setText(""); } for (int i=0; i< n.entryCount(); i++) { int nid = n.nid(i); bool done = false; QStringList sl = n.entryList(i); foreach(nameEdit ne, nameEdits) { if (nid == ne.nid && ne.edit->text().isEmpty()) { ne.edit->setText(sl[2]); done = true; break; } } if (!done) { 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(); if (n == NID_info_access) { int nid, idx = aiaOid->currentIndex(); if (idx >= 0 && idx < aia_nid.size()) { nid = aia_nid[idx]; dlg->setPrefix(QString(OBJ_nid2sn(nid)) + ";"); } } 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, req_el; ign_openssl_error(); setupTmpCtx(); (void)nconf; try { el = getGuiExt(); if (!pki_x509::disable_netscape) el += getNetscapeExt(); el.delInvalid(); } catch (errorEx &err) { errors += err.getString(); el.clear(); } if (el.size() > 0) { 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.clear(); if (fromReqCB->isChecked() && copyReqExtCB->isChecked()) { req_el = getSelectedReq()->getV3ext(); for (int i=0; i<req_el.count(); i++) { if (ctx_cert && ctx_cert->addV3ext(req_el[i], true)) el += req_el[i]; } } if (el.size() > 0) { if (!result.isEmpty()) result += "\n<hr>\n"; result += "<h2><center>"; result += tr("From PKCS#10 request") +"</center></h2><p>\n"; result += el.getHtml("<br>"); } 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); xcaWarning msg(this, err.getString()); 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; xcaWarning msg(this, lenErr); 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); xcaWarning msg(this, tr("The verification of the Certificate request failed.\nThe rollout should be aborted.")); 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()) { QString cn = dnEntryByNid(NID_commonName); if (cn.isEmpty()) { gotoTab(1); xcaWarning msg(this, tr("The internal name and the common name are empty.\nPlease set at least the internal name.")); 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(cn); } } if (keyList->count() == 0 && keyList->isEnabled() && !fromReqCB->isChecked()) { gotoTab(1); xcaWarning msg(this, tr("There is no Key selected for signing.")); 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); xcaWarning msg(this, text); 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_key *signkey = NULL; pki_x509 *signer = NULL; if (foreignSignRB->isChecked()) { signer = getSelectedSigner(); if (signer) signkey = signer->getRefKey(); } else if (fromReqCB->isChecked()) { pki_x509req *req = getSelectedReq(); if (req) signkey = req->getRefKey(); } else { signkey = getSelectedKey(); } if ((!signkey || signkey->isPubKey()) && pt != tmpl) { QString txt; gotoTab(signer ? 0 : 1); xcaWarning msg(this, tr("The key you selected for signing is not a private one.")); 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."); xcaWarning msg(this, text); 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."); xcaWarning msg(this, text); 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 (validityBox->isEnabled() && 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."); xcaWarning msg(this, text); msg.addButton(QMessageBox::Ok)->setText(tr("Edit dates")); 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 (do_validateExtensions()) { gotoTab(5); QString text = tr("The certificate contains invalid or duplicate extensions. Check the validation on the advanced tab."); xcaWarning msg(this, text); 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-1.3.2/widgets/NewX509.h�������������������������������������������������������������������������0000664�0000000�0000000�00000010164�12606205164�0015232�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 <QListWidget> class MainWindow; class extList; class pki_temp; class pki_x509req; class pki_x509super; class pki_x509; class pki_key; class QPixmap; class QListbox; class x509name; class x509v3ext; class extList; class nameEdit { public: int nid; QLineEdit *edit; QLabel *label; nameEdit(int n, QLineEdit *e, QLabel *l) { nid = n; edit = e; label = l; } }; class NewX509: public QDialog, public Ui::NewX509 { Q_OBJECT private: NIDlist eku_nid; NIDlist dn_nid; NIDlist aia_nid; NIDlist attr_nid; NIDlist expl_dn_nid; QList<nameEdit> attrEdits; QList<nameEdit> nameEdits; 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); QString dnEntryByNid(int nid); public: QRadioButton *selfQASignRB; QLineEdit *description; 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 defineCert(pki_x509 *cert); void defineRequest(pki_x509req *req); void defineSigner(pki_x509 *defcert); void fromX509super(pki_x509super *cert_or_req); 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 switchHashAlgo(); void setReqAttributes(pki_x509req *req); void getReqAttributes(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-1.3.2/widgets/NewX509_ext.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000016505�12606205164�0016452�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 <QCheckBox> #include <QComboBox> #include <QRadioButton> #include <QLineEdit> #include <QListWidget> #include <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.toLatin1(); 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(); if (!pki_x509::disable_netscape) 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_ia5(NID_netscape_base_url, nsBaseUrl->text(), &ext_ctx); el << ext.create_ia5(NID_netscape_revocation_url, nsRevocationUrl->text(), &ext_ctx); el << ext.create_ia5(NID_netscape_ca_revocation_url, nsCARevocationUrl->text(), &ext_ctx); el << ext.create_ia5(NID_netscape_renewal_url, nsRenewalUrl->text(), &ext_ctx); el << ext.create_ia5(NID_netscape_ca_policy_url, nsCaPolicyUrl->text(), &ext_ctx); el << ext.create_ia5(NID_netscape_ssl_server_name, nsSslServerName->text(), &ext_ctx); el << ext.create_ia5(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); 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; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/OidResolver.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000001664�12606205164�0016710�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2012 Christian Hohnstaedt. * * All rights reserved. */ #include <openssl/objects.h> #include "OidResolver.h" #include "lib/base.h" #include "lib/func.h" #include "lib/exception.h" OidResolver::OidResolver(QWidget *parent) :QWidget(parent) { setWindowTitle(tr(XCA_TITLE)); setupUi(this); } void OidResolver::searchOid(QString s) { bool ok; int n; input->setText(s); s = s.trimmed(); n = s.toUInt(&ok); if (!ok) n = OBJ_txt2nid(CCHAR(s)); ign_openssl_error(); if (n == NID_undef) { ln->clear(); sn->clear(); oid->clear(); nid->clear(); } else { const ASN1_OBJECT *a = OBJ_nid2obj(n); ln->setText(OBJ_nid2ln(n)); sn->setText(OBJ_nid2sn(n)); nid->setText(QString("%1").arg(n)); if (a) { try { oid->setText(OBJ_obj2QString(a, 1)); } catch (errorEx &e) { oid->clear(); } } else { oid->clear(); } } ign_openssl_error(); show(); raise(); } ����������������������������������������������������������������������������xca-1.3.2/widgets/OidResolver.h���������������������������������������������������������������������0000664�0000000�0000000�00000000532�12606205164�0016346�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __OID_RESOLVER_H #define __OID_RESOLVER_H #include "ui_OidResolver.h" class OidResolver: public QWidget, public Ui::OidResolver { Q_OBJECT public: OidResolver(QWidget *w); public slots: void searchOid(QString s); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/Options.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000010307�12606205164�0016100�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 <QMessageBox> #include <QToolTip> Options::Options(MainWindow *parent) :QDialog(parent) { mw = parent; setWindowTitle(tr(XCA_TITLE)); setupUi(this); foreach(int nid, *MainWindow::dn_nid) { QString n = OBJ_nid2ln(nid); extDNobj->addItem(n); expDNobj->addItem(n); } 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; transDnEntries->setText(transDnEntries->text() .arg(OBJ_nid2ln(NID_commonName)) .arg(dn_translations[NID_commonName])); } 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::on_expDNadd_clicked() { expDNlist->addItem(expDNobj->currentText()); } void Options::on_expDNdel_clicked() { expDNlist->takeItem(expDNlist->currentRow()); } void Options::on_expDNdefault_clicked() { setDnString(MainWindow::explicit_dn_default, expDNlist); } void Options::setDnString(QString dn, QListWidget *w) { QStringList dnl; if (!dn.isEmpty()) dnl = dn.split(","); w->clear(); for (int i=0; i < dnl.count(); i++) { int nid = OBJ_sn2nid(CCHAR(dnl[i])); w->addItem(OBJ_nid2ln(nid)); } } QString Options::getDnString(QListWidget *w) { QStringList dn; for (int j=0; j<w->count(); j++) { int nid = OBJ_ln2nid(CCHAR(w->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-1.3.2/widgets/Options.h�������������������������������������������������������������������������0000664�0000000�0000000�00000002412�12606205164�0015543�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 <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; QString getDnString(QListWidget *w); void setDnString(QString dn, QListWidget *w); MainWindow *mw; public: Options(MainWindow *parent); ~Options(); void setupPkcs11Provider(QString list); void setStringOpt(const QString string_opt); QString getExtDnString() { return getDnString(extDNlist); } QString getExpDnString() { return getDnString(expDNlist); } QString getStringOpt(); QString getPkcs11Provider(); void setExpDnString(QString dn) { setDnString(dn, expDNlist); } void setExtDnString(QString dn) { setDnString(dn, extDNlist); } public slots: void on_extDNadd_clicked(); void on_extDNdel_clicked(); void on_expDNadd_clicked(); void on_expDNdel_clicked(); void on_expDNdefault_clicked(); void on_addButton_clicked(void); void on_removeButton_clicked(void); void on_searchPkcs11_clicked(void); void addLib(QString); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/PwDialog.cpp����������������������������������������������������������������������0000664�0000000�0000000�00000005043�12606205164�0016154�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "PwDialog.h" #include "lib/base.h" #include "lib/Passwd.h" #include "widgets/MainWindow.h" #include <QLabel> #include <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())) { XCA_WARN(tr("%1 missmatch").arg(pi->getType())); return; } QString pw = passB->text(); if (takeHex->isChecked()) { int ret = hex2bin(pw, &final); if (ret == -1) { XCA_WARN(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.toLatin1(); } 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-1.3.2/widgets/PwDialog.h������������������������������������������������������������������������0000664�0000000�0000000�00000001427�12606205164�0015623�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 <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-1.3.2/widgets/ReqTreeView.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000001432�12606205164�0016646�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "lib/pki_x509req.h" #include "ReqTreeView.h" #include "MainWindow.h" #include <QAbstractItemModel> #include <QAbstractItemView> #include <QMenu> void ReqTreeView::fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes) { X509SuperTreeView::fillContextMenu(menu, subExport, index, indexes); if (indexes.size() != 1) return; menu->addAction(tr("Sign"), this, SLOT(signReq())); if (transform) { transform->addAction(tr("Similar Request"), this, SLOT(toRequest())); } } void ReqTreeView::toRequest() { if (reqs) reqs->toRequest(currentIndex()); } void ReqTreeView::signReq() { if (reqs) reqs->signReq(currentIndex()); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/ReqTreeView.h���������������������������������������������������������������������0000664�0000000�0000000�00000001211�12606205164�0016306�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __REQTREEVIEW_H #define __REQTREEVIEW_H #include "X509SuperTreeView.h" #include "lib/db_x509req.h" class ReqTreeView: public X509SuperTreeView { Q_OBJECT db_x509req *reqs; public: ReqTreeView(QWidget *parent) : X509SuperTreeView(parent) { reqs = NULL; } void fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes); void setModel(db_x509req *model=NULL) { reqs = model; X509SuperTreeView::setModel(model); } public slots: void toRequest(); void signReq(); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/RevocationList.cpp����������������������������������������������������������������0000664�0000000�0000000�00000011124�12606205164�0017410�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "RevocationList.h" #include "MainWindow.h" #include "lib/asn1int.h" #include "lib/pki_x509.h" enum revCol { Cnumber, Cserial, Cdate, Creason, CiDate, Cmax }; class revListItem : public QTreeWidgetItem { public: revListItem(QTreeWidget *w) : QTreeWidgetItem(w) { }; bool operator < (const QTreeWidgetItem &other) const { int col = treeWidget()->sortColumn(); switch (col) { case Cserial: { a1int ithis, iother; ithis.setHex(text(Cserial)); iother.setHex(other.text(Cserial)); return ithis < iother; } case Cnumber: return text(Cnumber).toLong() < other.text(Cnumber).toLong(); default: return QTreeWidgetItem::operator < (other); } } }; static void addRevItem(QTreeWidget *certList, const x509rev &revit, int no, const pki_x509 *iss) { revListItem *current; pki_x509 *rev; a1time a; rev = iss ? iss->getBySerial(revit.getSerial()) : NULL; current = new revListItem(certList); if (rev != NULL) { for (int i = 0; i < Cmax; i++) current->setToolTip(i, rev->getIntName()); } current->setText(Cnumber, QString("%1").arg(no)); current->setText(Cserial, revit.getSerial().toHex()); current->setText(Cdate, revit.getDate().toSortable()); current->setText(Creason, revit.getReason()); current->setTextAlignment(Cnumber, Qt::AlignRight); current->setTextAlignment(Cserial, Qt::AlignRight); a = revit.getInvalDate(); if (!a.isUndefined()) current->setText(CiDate, a.toSortable()); } void RevocationList::setupRevocationView(QTreeWidget *certList, const x509revList &revList, const pki_x509 *iss) { QStringList sl; int cols, i; certList->clear(); sl << tr("No.") << tr("Serial") << tr("Revocation") << tr("Reason") << tr("Invalidation"); cols = sl.size(); certList->setColumnCount(cols); certList->setHeaderLabels(sl); certList->setItemsExpandable(false); certList->setRootIsDecorated(false); certList->sortItems(Cnumber, Qt::AscendingOrder); i=1; foreach(x509rev revit, revList) { addRevItem(certList, revit, i++, iss); } for (i=0; i<cols; i++) certList->resizeColumnToContents(i); certList->setSortingEnabled(true); } RevocationList::RevocationList(QWidget *w) : QDialog(w) { QPushButton *genCrl; setupUi(this); setWindowTitle(XCA_TITLE); image->setPixmap(*MainWindow::revImg); genCrl = buttonBox->addButton(tr("Generate CRL"), QDialogButtonBox::ActionRole); connect(genCrl, SIGNAL(clicked(void)), this, SLOT(gencrl(void))); } void RevocationList::gencrl(void) { issuer->setRevocations(getRevList()); emit genCRL(issuer); } void RevocationList::setRevList(const x509revList &rl, pki_x509 *iss) { issuer = iss; revList = rl; setupRevocationView(certList, revList, issuer); } const x509revList &RevocationList::getRevList() { return revList; } void RevocationList::on_addRev_clicked(void) { Revocation *revoke = new Revocation(this, QModelIndexList()); if (revoke->exec()) { x509rev revit = revoke->getRevocation(); revList << revit; addRevItem(certList, revit, revList.size(), issuer); } } void RevocationList::on_delRev_clicked(void) { QTreeWidgetItem *current = certList->currentItem(); x509rev rev; int idx; a1int a1_serial; if (!current) return; idx = certList->indexOfTopLevelItem(current); certList->takeTopLevelItem(idx); a1_serial.setHex(current->text(Cserial)); rev.setSerial(a1_serial); idx = revList.indexOf(rev); if (idx != -1) revList.takeAt(idx); } Revocation::Revocation(QWidget *w, QModelIndexList indexes) : QDialog(w) { setupUi(this); setWindowTitle(XCA_TITLE); reason->addItems(x509rev::crlreasons()); invalid->setNow(); if (indexes.size() > 1) { QList<a1int> serials; QStringList sl; serial->setText(QString("Batch revocation of %1 Certificates"). arg(indexes.size())); foreach(QModelIndex idx, indexes) { pki_x509 *cert = static_cast<pki_x509*> (idx.internalPointer()); serials << cert->getSerial(); } qSort(serials.begin(), serials.end()); foreach(a1int a, serials) sl << a.toHex(); serial->setToolTip(sl.join("\n")); serial->setEnabled(false); } else if (indexes.size() == 1) { pki_x509 *cert = static_cast<pki_x509*> (indexes[0].internalPointer()); serial->setText(cert->getSerial().toHex()); serial->setEnabled(false); } else { serial->setValidator( new QRegExpValidator(QRegExp("[A-Fa-f0-9]+"), serial)); } } x509rev Revocation::getRevocation() { x509rev r; a1int i; i.setHex(serial->text()); r.setSerial(i); r.setDate(a1time::now()); r.setInvalDate(invalid->getDate()); r.setReason(reason->currentText()); return r; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/RevocationList.h������������������������������������������������������������������0000664�0000000�0000000�00000001676�12606205164�0017070�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __REVOCATIONLIST_H #define __REVOCATIONLIST_H #include "ui_RevocationList.h" #include "ui_Revoke.h" #include "lib/x509rev.h" #include <QModelIndex> class pki_x509; class RevocationList: public QDialog, public Ui::RevocationList { Q_OBJECT private: x509revList revList; pki_x509 *issuer; public: static void setupRevocationView(QTreeWidget *certList, const x509revList &revList, const pki_x509 *iss); RevocationList(QWidget *w); void setRevList(const x509revList &rl, pki_x509 *issuer); const x509revList &getRevList(); public slots: void on_addRev_clicked(void); void on_delRev_clicked(void); void gencrl(void); signals: void genCRL(pki_x509 *iss); }; class Revocation: public QDialog, public Ui::Revoke { Q_OBJECT public: Revocation(QWidget *w, QModelIndexList indexes); x509rev getRevocation(); }; #endif ������������������������������������������������������������������xca-1.3.2/widgets/SearchPkcs11.cpp������������������������������������������������������������������0000664�0000000�0000000�00000007302�12606205164�0016636�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 <QComboBox> #include <QLineEdit> #include <QFileDialog> #include <QPushButton> #include <QMessageBox> #include <QStringList> #include <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()) { nativeSeparator(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-1.3.2/widgets/SearchPkcs11.h��������������������������������������������������������������������0000664�0000000�0000000�00000002236�12606205164�0016304�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 <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-1.3.2/widgets/TempTreeView.cpp������������������������������������������������������������������0000664�0000000�0000000�00000002565�12606205164�0017034�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "lib/pki_temp.h" #include "XcaTreeView.h" #include "MainWindow.h" #include <QAbstractItemModel> #include <QAbstractItemView> #include <QMenu> void TempTreeView::fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes) { (void)subExport; (void)index; if (indexes.size() != 1) return; menu->addAction(tr("Duplicate"), this, SLOT(duplicateTemp())); menu->addAction(tr("Create certificate"), this, SLOT(certFromTemp())); menu->addAction(tr("Create request"), this, SLOT(reqFromTemp())); } void TempTreeView::duplicateTemp() { QModelIndex currentIdx = currentIndex(); 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")); temps->insertPKI(newtemp); } void TempTreeView::certFromTemp() { QModelIndex currentIdx = currentIndex(); if (!currentIdx.isValid()) return; pki_temp *temp = static_cast<pki_temp*>(currentIdx.internalPointer()); emit newCert(temp); } void TempTreeView::reqFromTemp() { QModelIndex currentIdx = currentIndex(); if (!currentIdx.isValid()) return; pki_temp *temp = static_cast<pki_temp*>(currentIdx.internalPointer()); emit newReq(temp); } �������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/TempTreeView.h��������������������������������������������������������������������0000664�0000000�0000000�00000001325�12606205164�0016472�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2006 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __TEMPTREEVIEW_H #define __TEMPTREEVIEW_H #include "XcaTreeView.h" #include "lib/db_temp.h" class TempTreeView: public XcaTreeView { Q_OBJECT db_temp *temps; public: TempTreeView(QWidget *parent) : XcaTreeView(parent) { temps = NULL; } void fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes); void setModel(db_temp *model=NULL) { temps = model; XcaTreeView::setModel(model); } public slots: void certFromTemp(); void reqFromTemp(); void duplicateTemp(); signals: void newReq(pki_temp *); void newCert(pki_temp *); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/X509SuperTreeView.cpp�������������������������������������������������������������0000664�0000000�0000000�00000002425�12606205164�0017606�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "lib/pki_x509req.h" #include "X509SuperTreeView.h" #include "MainWindow.h" #include <QAbstractItemModel> #include <QAbstractItemView> #include <QMenu> void X509SuperTreeView::fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes) { pki_x509super *x = static_cast<pki_x509super *> (index.internalPointer()); transform = NULL; if (indexes.size() != 1) return; subExport->addAction(tr("OpenSSL config"), this, SLOT(toOpenssl())); subExport->setEnabled(!x->isSpki()); transform = menu->addMenu(tr("Transform")); transform->addAction(tr("Template"), this, SLOT(toTemplate()))->setEnabled(!x->isSpki()); transform->addAction(tr("Public Key"), this, SLOT(extractPubkey()))->setEnabled(!x->getRefKey()); } void X509SuperTreeView::extractPubkey() { QModelIndex idx = currentIndex(); if (idx.isValid() && x509super) x509super->extractPubkey(idx); } void X509SuperTreeView::toTemplate() { QModelIndex idx = currentIndex(); if (idx.isValid() && x509super) x509super->toTemplate(idx); } void X509SuperTreeView::toOpenssl() { QModelIndex idx = currentIndex(); if (idx.isValid() && x509super) x509super->toOpenssl(idx); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/X509SuperTreeView.h���������������������������������������������������������������0000664�0000000�0000000�00000001320�12606205164�0017244�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2006 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __X509SUPERTREEVIEW_H #define __X509SUPERTREEVIEW_H #include "XcaTreeView.h" #include "lib/db_x509req.h" class X509SuperTreeView: public XcaTreeView { Q_OBJECT db_x509super *x509super; public: QMenu *transform; X509SuperTreeView(QWidget *parent) : XcaTreeView(parent) { x509super = NULL; } void fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes); void setModel(db_x509super *model=NULL) { x509super = model; XcaTreeView::setModel(model); } public slots: void extractPubkey(); void toTemplate(); void toOpenssl(); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/XcaHeaderView.cpp�����������������������������������������������������������������0000664�0000000�0000000�00000001302�12606205164�0017117�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "XcaHeaderView.h" #include "XcaTreeView.h" XcaHeaderView::XcaHeaderView() :QHeaderView(Qt::Horizontal) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) setSectionsMovable(true); #else setMovable(true); #endif } void XcaHeaderView::contextMenuEvent(QContextMenuEvent *e) { XcaTreeView *tv = static_cast<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; } } resizeSections(QHeaderView::ResizeToContents); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/XcaHeaderView.h�������������������������������������������������������������������0000664�0000000�0000000�00000000544�12606205164�0016573�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __XCAHEADERVIEW_H #define __XCAHEADERVIEW_H #include <QHeaderView> class XcaHeaderView: public QHeaderView { Q_OBJECT public: XcaHeaderView(); void contextMenuEvent(QContextMenuEvent *e); public slots: void resetMoves(); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/XcaProxyModel.cpp�����������������������������������������������������������������0000664�0000000�0000000�00000002643�12606205164�0017207�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2006 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "XcaProxyModel.h" #include "lib/db_base.h" 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); } bool XcaProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { QModelIndex idx = sourceModel()->index(sourceRow, 0, sourceParent); return sourceModel()->data(idx, Qt::UserRole).toBool(); } QVariant XcaProxyModel::data(const QModelIndex &index, int role) const { QModelIndex i; QString number; if (index.column() != 1) return QSortFilterProxyModel::data(index, role); /* Row number */ switch (role) { case Qt::EditRole: case Qt::DisplayRole: for (i = index; i.isValid(); i = i.parent()) number += QString(" %1").arg(i.row()+1); return QVariant(number); default: return QSortFilterProxyModel::data(index, role); } return QVariant(); } ���������������������������������������������������������������������������������������������xca-1.3.2/widgets/XcaProxyModel.h�������������������������������������������������������������������0000664�0000000�0000000�00000001146�12606205164�0016651�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2006 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __XCAPROXYMODEL_H #define __XCAPROXYMODEL_H #include <QWidget> #include <QItemSelectionModel> #include <QSortFilterProxyModel> class XcaProxyModel: public QSortFilterProxyModel { Q_OBJECT public: XcaProxyModel(QWidget *parent = 0) :QSortFilterProxyModel(parent) { } bool lessThan(const QModelIndex &left, const QModelIndex &right) const; bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; QVariant data(const QModelIndex &index, int role) const; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/XcaTreeView.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000022051�12606205164�0016632�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2006 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #include "XcaHeaderView.h" #include "XcaTreeView.h" #include "XcaProxyModel.h" #include "MainWindow.h" #include <QAbstractItemModel> #include <QAbstractItemView> #include <QContextMenuEvent> #include <QMenu> #include <QVariant> #include <QRegExp> XcaTreeView::XcaTreeView(QWidget *parent) :QTreeView(parent) { mainwin = NULL; 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))); connect(this, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(doubleClick(const QModelIndex &))); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) header()->setSectionsClickable(true); #else header()->setClickable(true); #endif } XcaTreeView::~XcaTreeView() { delete proxy; } void XcaTreeView::contextMenuEvent(QContextMenuEvent * e) { QModelIndex index; if (!basemodel) return; index = indexAt(e->pos()); showContextMenu(e, getIndex(index)); } 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::setMainwin(MainWindow *mw, QLineEdit *filter) { mainwin = mw; connect(filter, SIGNAL(textChanged(const QString &)), this, SLOT(setFilter(const QString&))); } 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(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())); basemodel->initHeaderView(header()); } showHideSections(); } void XcaTreeView::headerEvent(QContextMenuEvent *e, int col) { contextMenu(e, NULL, col); } QModelIndex XcaTreeView::getIndex(const QModelIndex &index) { return proxy->mapToSource(index); } QModelIndex XcaTreeView::getProxyIndex(const QModelIndex &index) { return proxy->mapFromSource(index); } QModelIndexList XcaTreeView::getSelectedIndexes() { QModelIndexList list; QItemSelection indexes = selectionModel()->selection(); list = proxy->mapSelectionToSource(indexes).indexes(); /* Reduce list to column 0 items */ QModelIndexList::iterator it = list.begin(); while (it != list.end()) { if ((*it).column() != 0) it = list.erase(it); else ++it; } return list; } 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)); } } QModelIndex XcaTreeView::currentIndex() { QModelIndex idx = QTreeView::currentIndex(); idx = getIndex(idx); idx = basemodel->index(idx.row(), 0, idx.parent()); if (!idx.isValid()) { QModelIndexList l = getSelectedIndexes(); if (l.size() > 0) idx = l[0]; } return idx; } void XcaTreeView::editIdx() { edit(getProxyIndex(currentIndex())); } void XcaTreeView::setFilter(const QString &pattern) { pki_base::limitPattern = QRegExp(pattern, Qt::CaseInsensitive, QRegExp::Wildcard); // Only to tell the model about the changed filter proxy->setFilterFixedString(pattern); } void XcaTreeView::deleteItems(void) { QModelIndex index; QModelIndexList indexes = getSelectedIndexes(); QString items, msg; int count = 0; pki_base *pki = NULL; if (indexes.count() == 0 || !basemodel) return; foreach(index, indexes) { 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 (!XCA_OKCANCEL(msg)) return; foreach(index, indexes) { basemodel->deletePKI(index); } } void XcaTreeView::storeItems(void) { QModelIndexList indexes = getSelectedIndexes(); if (basemodel) { try { switch (indexes.size()) { case 0: return; case 1: basemodel->store(indexes[0]); return; default: basemodel->store(getSelectedIndexes()); return; } } catch (errorEx &err) { MainWindow::Error(err); } } } void XcaTreeView::showItems(void) { if (basemodel) { QModelIndexList indexes = getSelectedIndexes(); foreach(QModelIndex index, indexes) basemodel->showItem(index); } } void XcaTreeView::newItem(void) { if (basemodel) basemodel->newItem(); } void XcaTreeView::load(void) { if (basemodel) basemodel->load(); } void XcaTreeView::doubleClick(const QModelIndex &m) { if (basemodel) basemodel->showItem(getIndex(m)); } void XcaTreeView::pem2clipboard(void) { if (basemodel) basemodel->pem2clipboard(getSelectedIndexes()); } void XcaTreeView::headerDetails(void) { if (curr_hd && curr_hd->id > 0 && mainwin) mainwin->getResolver()->searchOid(QString::number(curr_hd->id)); } void XcaTreeView::columnRemove(void) { if (curr_hd->action) curr_hd->action->setChecked(false); } void XcaTreeView::contextMenu(QContextMenuEvent *e, QMenu *parent, int col) { int shown = 0; tipMenu *menu, *dn, *v3ext, *current, *v3ns; QAction *a, *sep; dbheader *hd; dbheaderList allHeaders = basemodel->getAllHeaders(); menu = new tipMenu(QString(), mainwin); dn = new tipMenu(tr("Subject entries"), mainwin); v3ext = new tipMenu(tr("X509v3 Extensions"), mainwin); v3ns = new tipMenu(tr("Netscape extensions"), mainwin); menu->addAction(tr("Reset"), basemodel, SLOT(columnResetDefaults())); if (col >= 0 && col < allHeaders.size()) { curr_hd = allHeaders[col]; menu->addAction(tr("Remove Column"), this,SLOT(columnRemove())); if (curr_hd->id > 0) menu->addAction(tr("Details"), this, SLOT(headerDetails())); } else { curr_hd = NULL; } sep = menu->addSeparator(); foreach(hd, allHeaders) { switch (hd->type) { case dbheader::hd_x509name: current = dn; break; case dbheader::hd_v3ext: current = v3ext; break; case dbheader::hd_v3ext_ns: if (pki_x509::disable_netscape) continue; current = v3ns; break; default: current = menu; break; } a = current->addAction(hd->getName()); a->setCheckable(true); a->setChecked(hd->show); a->setToolTip(hd->getTooltip()); hd->action = a; } if (!dn->isEmpty() || !v3ext->isEmpty()) menu->insertSeparator(sep); if (!dn->isEmpty()) menu->insertMenu(sep, dn); else delete dn; if (!v3ext->isEmpty()) { if (!v3ns->isEmpty()) { v3ext->addSeparator(); v3ext->addMenu(v3ns); } else { delete v3ns; } menu->insertMenu(sep, v3ext); } else { delete v3ext; delete v3ns; } if (parent) { parent->addSeparator(); 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; showHideSections(); } void XcaTreeView::showContextMenu(QContextMenuEvent *e, const QModelIndex &idx) { QMenu *menu = new QMenu(mainwin); QMenu *subExport = NULL; QModelIndexList indexes = getSelectedIndexes(); QModelIndex index; index = idx.isValid() ? idx : currentIndex(); menu->addAction(tr("New"), this, SLOT(newItem())); menu->addAction(tr("Import"), this, SLOT(load())); menu->addAction(tr("Paste PEM data"), mainwin, SLOT(pastePem())); if (indexes.size() == 1) menu->addAction(tr("Rename"), this, SLOT(editIdx())); if (indexes.size() > 0) { menu->addAction(tr("Delete"), this, SLOT(deleteItems())); subExport = menu->addMenu(tr("Export")); subExport->addAction(tr("Clipboard"), this, SLOT(pem2clipboard())); subExport->addAction(tr("File"), this, SLOT(storeItems())); } fillContextMenu(menu, subExport, index, indexes); contextMenu(e, menu, -1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/XcaTreeView.h���������������������������������������������������������������������0000664�0000000�0000000�00000003161�12606205164�0016300�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2006 - 2015 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __XCATREEVIEW_H #define __XCATREEVIEW_H #include <QTreeView> #include <QHeaderView> #include <QItemSelectionModel> #include <QSortFilterProxyModel> #include "lib/db_base.h" class XcaTreeView: public QTreeView { Q_OBJECT dbheader *curr_hd; protected: db_base *basemodel; QSortFilterProxyModel *proxy; MainWindow *mainwin; public: XcaTreeView(QWidget *parent = 0); virtual ~XcaTreeView(); void contextMenuEvent(QContextMenuEvent *e); virtual void setModel(QAbstractItemModel *model=NULL); void setMainwin(MainWindow *mw, QLineEdit *filter); QModelIndex getIndex(const QModelIndex &index); QModelIndex getProxyIndex(const QModelIndex &index); QModelIndexList getSelectedIndexes(); void headerEvent(QContextMenuEvent *e, int col); QModelIndex currentIndex(); void showContextMenu(QContextMenuEvent *e, const QModelIndex &index); virtual void fillContextMenu(QMenu *menu, QMenu *subExport, const QModelIndex &index, QModelIndexList indexes) { (void)menu; (void)subExport; (void)index; (void)indexes; } void contextMenu(QContextMenuEvent *e, QMenu *parent = NULL, int sect = -1); public slots: void showHideSections(); void sectionMoved(int idx, int oldI, int newI); void columnsResize(); void editIdx(); void setFilter(const QString &pattern); void deleteItems(void); void storeItems(void); void showItems(void); void newItem(void); void doubleClick(const QModelIndex &m); void load(void); void pem2clipboard(void); void headerDetails(void); void columnRemove(void); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/clicklabel.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000003261�12606205164�0016533�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 <QToolTip> #include <QPalette> #include <QColor> void DoubleClickLabel::mouseDoubleClickEvent(QMouseEvent * e) { QWidget::mouseDoubleClickEvent(e); if (clicktext.isEmpty()) emit doubleClicked(text()); else emit doubleClicked(clicktext); } void DoubleClickLabel::setClickText(QString s) { clicktext = s; } ClickLabel::ClickLabel(QWidget *parent) :DoubleClickLabel(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::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) :DoubleClickLabel(parent) { setFrameShape(QFrame::Panel); setFrameShadow(QFrame::Sunken); setTextFormat(Qt::PlainText); #if QT_VERSION >= 0x040200 setTextInteractionFlags( Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard ); #endif } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/clicklabel.h����������������������������������������������������������������������0000664�0000000�0000000�00000001430�12606205164�0016174�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 <QLabel> class QMouseEvent; class DoubleClickLabel : public QLabel { Q_OBJECT QString clicktext; public: DoubleClickLabel(QWidget *parent) : QLabel(parent) { } void setClickText(QString s); protected: void mouseDoubleClickEvent ( QMouseEvent * e ); signals: void doubleClicked(QString text); }; class ClickLabel : public DoubleClickLabel { Q_OBJECT public: ClickLabel(QWidget *parent); void setRed(); void setGreen(); void disableToolTip(); protected: void setColor(const QColor &col); }; class CopyLabel : public DoubleClickLabel { Q_OBJECT public: CopyLabel(QWidget *parent); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/distname.cpp����������������������������������������������������������������������0000664�0000000�0000000�00000004052�12606205164�0016251�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 <QLabel> #include <QPushButton> #include <QLineEdit> #include "lib/x509name.h" #include "lib/db_x509super.h" #include "lib/base.h" #include "clicklabel.h" #include "MainWindow.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) { DoubleClickLabel *l1; QLabel *l2; QStringList sl; for (int i=0; i<n.entryCount(); i++) { QString toolt, label, trans; int nid = n.nid(i); trans = dn_translations[nid]; sl = n.entryList(i); if (translate_dn && !trans.isEmpty()) { label = trans; toolt = sl[1]; } else { toolt = trans; label = sl[1]; } l1 = new DoubleClickLabel(this); l2 = new CopyLabel(this); l1->setTextFormat(Qt::PlainText); l1->setText(label); l1->setClickText(sl[1]); if (l1->text().isEmpty()) l1->setText(sl[0]); l2->setText(sl[2]); l1->setToolTip(QString("[%1] %2").arg(sl[0]).arg(toolt)); l2->setToolTip(sl[3]); connect(l1, SIGNAL(doubleClicked(QString)), MainWindow::getResolver(), SLOT(searchOid(QString))); 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-1.3.2/widgets/distname.h������������������������������������������������������������������������0000664�0000000�0000000�00000000764�12606205164�0015724�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 <QWidget> #include <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-1.3.2/widgets/hashBox.cpp�����������������������������������������������������������������������0000664�0000000�0000000�00000011213�12606205164�0016036�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2007 - 2015 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 224", EVP_sha224() }, { "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() { #if OPENSSL_VERSION_NUMBER < 0x10000000L switch(key_type) { case EVP_PKEY_DSA: return EVP_dss1(); #ifndef OPENSSL_NO_EC case EVP_PKEY_EC: return EVP_ecdsa(); #endif } #endif QString hash = currentText(); for (unsigned i=0; i<ARRAY_SIZE(hashalgos); i++) { if (hash == hashalgos[i].name) return hashalgos[i].md; } return hashalgos[4].md; /* SHA-256 as fallback */ } void hashBox::setCurrentString(QString md) { int idx = findText(md); if (idx != -1) { setCurrentIndex(idx); wanted_md = ""; } else { wanted_md = md; } } #if OPENSSL_VERSION_NUMBER < 0x10000000L struct nid_triple { int alg; int hash; int sig; }; static const nid_triple sigoid_srt[] = { {NID_md2WithRSAEncryption, NID_md2, NID_rsaEncryption}, {NID_md5WithRSAEncryption, NID_md5, NID_rsaEncryption}, {NID_shaWithRSAEncryption, NID_sha, NID_rsaEncryption}, {NID_sha1WithRSAEncryption, NID_sha1, NID_rsaEncryption}, {NID_dsaWithSHA, NID_sha, NID_dsa}, {NID_dsaWithSHA1_2, NID_sha1, NID_dsa_2}, {NID_mdc2WithRSA, NID_mdc2, NID_rsaEncryption}, {NID_md5WithRSA, NID_md5, NID_rsa}, {NID_dsaWithSHA1, NID_sha1, NID_dsa}, {NID_sha1WithRSA, NID_sha1, NID_rsa}, {NID_ripemd160WithRSA, NID_ripemd160, NID_rsaEncryption}, {NID_md4WithRSAEncryption, NID_md4, NID_rsaEncryption}, {NID_ecdsa_with_SHA1, NID_sha1, NID_X9_62_id_ecPublicKey}, {NID_sha256WithRSAEncryption, NID_sha256, NID_rsaEncryption}, {NID_sha384WithRSAEncryption, NID_sha384, NID_rsaEncryption}, {NID_sha512WithRSAEncryption, NID_sha512, NID_rsaEncryption}, {NID_sha224WithRSAEncryption, NID_sha224, NID_rsaEncryption}, {NID_ecdsa_with_Recommended, NID_undef, NID_X9_62_id_ecPublicKey}, {NID_ecdsa_with_Specified, NID_undef, NID_X9_62_id_ecPublicKey}, {NID_ecdsa_with_SHA224, NID_sha224, NID_X9_62_id_ecPublicKey}, {NID_ecdsa_with_SHA256, NID_sha256, NID_X9_62_id_ecPublicKey}, {NID_ecdsa_with_SHA384, NID_sha384, NID_X9_62_id_ecPublicKey}, {NID_ecdsa_with_SHA512, NID_sha512, NID_X9_62_id_ecPublicKey}, {NID_dsa_with_SHA224, NID_sha224, NID_dsa}, {NID_dsa_with_SHA256, NID_sha256, NID_dsa}, {NID_id_GostR3411_94_with_GostR3410_2001, NID_id_GostR3411_94, NID_id_GostR3410_2001}, {NID_id_GostR3411_94_with_GostR3410_94, NID_id_GostR3411_94, NID_id_GostR3410_94}, {NID_id_GostR3411_94_with_GostR3410_94_cc, NID_id_GostR3411_94, NID_id_GostR3410_94_cc}, {NID_id_GostR3411_94_with_GostR3410_2001_cc, NID_id_GostR3411_94, NID_id_GostR3410_2001_cc}, }; static int OBJ_find_sigid_algs(int alg, int *hash, int *sig) { unsigned i; for (i=0; i< ARRAY_SIZE(sigoid_srt); i++) { if (sigoid_srt[i].alg == alg) { if (hash) *hash = sigoid_srt[i].hash; if (sig) *sig = sigoid_srt[i].sig; return 1; } } return 0; } #endif void hashBox::setCurrentMD(const EVP_MD *md) { int hash_nid; unsigned idx; if (!md) return; if (!OBJ_find_sigid_algs(EVP_MD_type(md), &hash_nid, NULL)) hash_nid = EVP_MD_type(md); for (idx = 0; idx<ARRAY_SIZE(hashalgos); idx++) { if (hash_nid == EVP_MD_type(hashalgos[idx].md)) { setCurrentString(hashalgos[idx].name); return; } } } 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-1.3.2/widgets/hashBox.h�������������������������������������������������������������������������0000664�0000000�0000000�00000001334�12606205164�0015506�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 <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 setCurrentMD(const EVP_MD *md); 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-1.3.2/widgets/kvView.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000013250�12606205164�0015720�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 <QHeaderView> #include <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); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) verticalHeader()->setSectionsMovable(true); #else verticalHeader()->setMovable(true); #endif 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-1.3.2/widgets/kvView.h��������������������������������������������������������������������������0000664�0000000�0000000�00000007325�12606205164�0015373�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 <QAbstractItemModel> #include <QTableView> #include <QComboBox> #include <QItemDelegate> #include <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-1.3.2/widgets/v3ext.cpp�������������������������������������������������������������������������0000664�0000000�0000000�00000011777�12606205164�0015532�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2005 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "v3ext.h" #include <QLabel> #include <QListWidget> #include <QComboBox> #include <QLineEdit> #include <QHeaderView> #include <QStringList> #include <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; QString type, value; line = line.trimmed(); idx = line.indexOf(':'); 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() { __validate(false); if (le) le->setText(toString()); accept(); } bool v3ext::__validate(bool showSuccess) { x509v3ext ext; QString str, error; validate->setFocus(Qt::OtherFocusReason); str = prefix + toString(); ext.create(nid, str, ext_ctx); while (int i = ERR_get_error() ) { error += ERR_error_string(i ,NULL); error += "\n"; } if (!error.isEmpty()) { XCA_WARN(tr("Validation failed:\n'%1'\n%2"). arg(str).arg(error)); return false; } if (showSuccess) { XCA_INFO(tr("Validation successful:\n'%1'"). arg(ext.getValue())); } return true; } void v3ext::on_validate_clicked() { __validate(true); } �xca-1.3.2/widgets/v3ext.h���������������������������������������������������������������������������0000664�0000000�0000000�00000001616�12606205164�0015166�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi: set sw=4 ts=4: * * Copyright (C) 2005 - 2014 Christian Hohnstaedt. * * All rights reserved. */ #ifndef __V3EXT_H #define __V3EXT_H #include "ui_v3ext.h" #include "lib/pki_base.h" #include <QLineEdit> #include <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; QString prefix; 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); void setPrefix(QString p) { prefix = p; } public slots: void on_apply_clicked(); void on_validate_clicked(); void setupLineEdit(const QString &s, QLineEdit *l); }; #endif ������������������������������������������������������������������������������������������������������������������xca-1.3.2/widgets/validity.cpp����������������������������������������������������������������������0000664�0000000�0000000�00000004752�12606205164�0016301�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 <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-1.3.2/widgets/validity.h������������������������������������������������������������������������0000664�0000000�0000000�00000001344�12606205164�0015740�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 <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-1.3.2/xca.pro�����������������������������������������������������������������������������������0000664�0000000�0000000�00000013222�12606205164�0013567�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 lang/xca_ru.qm lang/xca_fr.qm lang/xca_hr.qm XCA_RESOURCES.path = Contents/Resources QMAKE_BUNDLE_DATA += XCA_RESOURCES } LIBS += -lcrypto -lltdl QMAKE_CXXFLAGS = -DPREFIX=\\\"/usr/local\\\" -DETC=\\\"/etc\\\" -DDOCDIR=\\\"/usr/local/doc/xca\\\" -Werror # 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/main.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 \ lib/builtin_curves.h \ lib/entropy.h \ widgets/CertDetail.h \ widgets/CertExtend.h \ widgets/clicklabel.h \ widgets/CrlDetail.h \ widgets/distname.h \ widgets/ExportDialog.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/RevocationList.h \ widgets/XcaTreeView.h \ widgets/CertTreeView.h \ widgets/KeyTreeView.h \ widgets/ReqTreeView.h \ widgets/TempTreeView.h \ widgets/X509SuperTreeView.h \ widgets/XcaHeaderView.h \ widgets/OidResolver.h \ widgets/XcaProxyModel.h FORMS += ui/About.ui \ ui/CaProperties.ui \ ui/CertDetail.ui \ ui/CertExtend.ui \ ui/CrlDetail.ui \ ui/ExportDialog.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 \ ui/OidResolver.ui \ ui/RevocationList.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 \ lib/builtin_curves.cpp \ lib/entropy.cpp \ widgets/CertDetail.cpp \ widgets/CertExtend.cpp \ widgets/clicklabel.cpp \ widgets/CrlDetail.cpp \ widgets/distname.cpp \ widgets/ExportDialog.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/RevocationList.cpp \ widgets/XcaTreeView.cpp \ widgets/CertTreeView.cpp \ widgets/KeyTreeView.cpp \ widgets/ReqTreeView.cpp \ widgets/TempTreeView.cpp \ widgets/X509SuperTreeView.cpp \ widgets/XcaHeaderView.cpp \ widgets/OidResolver.cpp \ widgets/XcaProxyModel.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 lang/xca_hr.ts ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/xcf/��������������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12606205164�0013052�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/xcf/cert.xcf������������������������������������������������������������������������������0000664�0000000�0000000�00001153600�12606205164�0014517�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-1.3.2/xcf/icons.xcf�����������������������������������������������������������������������������0000664�0000000�0000000�00000040411�12606205164�0014667�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-1.3.2/xcf/key.xcf�������������������������������������������������������������������������������0000664�0000000�0000000�00000172514�12606205164�0014356�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-1.3.2/xcf/smartcard.xcf�������������������������������������������������������������������������0000664�0000000�0000000�00000062241�12606205164�0015541�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����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xca-1.3.2/configure���������������������������������������������������������������������������������0000755�0001751�0001751�00000473325�12606205166�014525� 0����������������������������������������������������������������������������������������������������ustar�00chris���������������������������chris���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.67 for X Certificate and Key management 1.3.2. # # Report bugs to <christian@hohnstaedt.de>. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: christian@hohnstaedt.de about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 </dev/null exec 6>&1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='X Certificate and Key management' PACKAGE_TARNAME='xca' PACKAGE_VERSION='1.3.2' PACKAGE_STRING='X Certificate and Key management 1.3.2' PACKAGE_BUGREPORT='christian@hohnstaedt.de' PACKAGE_URL='http://xca.hohnstaedt.de' # Factoring default headers for most tests. ac_includes_default="\ #include <stdio.h> #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif #ifdef HAVE_SYS_STAT_H # include <sys/stat.h> #endif #ifdef STDC_HEADERS # include <stdlib.h> # include <stddef.h> #else # ifdef HAVE_STDLIB_H # include <stdlib.h> # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include <memory.h> # endif # include <string.h> #endif #ifdef HAVE_STRINGS_H # include <strings.h> #endif #ifdef HAVE_INTTYPES_H # include <inttypes.h> #endif #ifdef HAVE_STDINT_H # include <stdint.h> #endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif" ac_subst_vars='LTLIBOBJS LIBOBJS DOCTOOL EGREP GREP CXXCPP QT_UIC QT_MOC QT_RCC QT_RCCQT QT_LRELEASE QT_LRELEASEQT QT_LIBS QT_CFLAGS Qt4_LIBS Qt4_CFLAGS Qt5_LIBS Qt5_CFLAGS OpenSSL_LIBS OpenSSL_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG MACDEPLOYQT DARWIN STRIP OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_openssl with_qt ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR OpenSSL_CFLAGS OpenSSL_LIBS Qt5_CFLAGS Qt5_LIBS Qt4_CFLAGS Qt4_LIBS CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures X Certificate and Key management 1.3.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/xca] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of X Certificate and Key management 1.3.2:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-openssl Select the OpenSSL installation directory --with-qt Select the Qt installation directory Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path OpenSSL_CFLAGS C compiler flags for OpenSSL, overriding pkg-config OpenSSL_LIBS linker flags for OpenSSL, overriding pkg-config Qt5_CFLAGS C compiler flags for Qt5, overriding pkg-config Qt5_LIBS linker flags for Qt5, overriding pkg-config Qt4_CFLAGS C compiler flags for Qt4, overriding pkg-config Qt4_LIBS linker flags for Qt4, overriding pkg-config CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to <christian@hohnstaedt.de>. X Certificate and Key management home page: <http://xca.hohnstaedt.de>. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF X Certificate and Key management configure 1.3.2 generated by GNU Autoconf 2.67 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## -------------------------------------- ## ## Report this to christian@hohnstaedt.de ## ## -------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_cxx_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by X Certificate and Key management $as_me 1.3.2, which was generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5 ; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: ***************************************************" >&5 $as_echo "$as_me: ***************************************************" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: * ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: * ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: ***************************************************" >&5 $as_echo "$as_me: ***************************************************" >&6;} ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5 ; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdio.h> int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5 ; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi DVERSION="`${CXX} --version | grep apple-darwin || :`" case "$DVERSION" in *-apple-darwin14*) DARWIN="Yosemite" ;; *-apple-darwin13*) DARWIN="Mavericks" ;; *-apple-darwin12*) DARWIN="Mountain Lion" ;; *-apple-darwin11*) DARWIN="Lion" ;; *-apple-darwin10*) DARWIN="SnowLeopard" ;; *-apple-darwin9*) DARWIN="Leopard" ;; *-apple-darwin?) as_fn_error $? "echo Unsupported Mac OSX version $DVERSION" "$LINENO" 5 ;; esac if test -n "${DARWIN}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: Mac OSX ${DARWIN} detected" >&5 $as_echo "$as_me: Mac OSX ${DARWIN} detected" >&6;} CXXFLAGS="${CXXFLAGS} -pipe -gdwarf-2" fi export PKG_CONFIG_PATH export LD_LIBRARY_PATH if test -n "$DARWIN"; then export DYLD_LIBRARY_PATH fi if test "$srcdir" != "."; then if test -r "$srcdir"/Local.mak || test -r "$srcdir"/local.h; then as_fn_error $? "The source directory (${srcdir}) contains a 'Local.mak' or 'local.h' file. They must be removed before building here." "$LINENO" 5 fi fi # Detect the OpenSSL libraries and header ######################################### # Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; if test -d "$withval"; then _OPENSSLDIR="$withval" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL directory '$withval' does not exist or is not a directory" >&5 $as_echo "$as_me: WARNING: OpenSSL directory '$withval' does not exist or is not a directory" >&2;} fi else _OPENSSLDIR="$OPENSSLDIR" fi if test -n "${_OPENSSLDIR}" && test -d "${_OPENSSLDIR}"; then _OPENSSLDIR=`cd ${_OPENSSLDIR} && pwd` PKG_CONFIG_PATH="${_OPENSSLDIR}/lib/pkgconfig:${PKG_CONFIG_PATH}" LD_LIBRARY_PATH="${_OPENSSLDIR}/lib:${LD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="${_OPENSSLDIR}/lib:${DYLD_LIBRARY_PATH}" fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenSSL" >&5 $as_echo_n "checking for OpenSSL... " >&6; } if test -n "$OpenSSL_CFLAGS"; then pkg_cv_OpenSSL_CFLAGS="$OpenSSL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcrypto >= 0.9.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcrypto >= 0.9.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OpenSSL_CFLAGS=`$PKG_CONFIG --cflags "libcrypto >= 0.9.8" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$OpenSSL_LIBS"; then pkg_cv_OpenSSL_LIBS="$OpenSSL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcrypto >= 0.9.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcrypto >= 0.9.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OpenSSL_LIBS=`$PKG_CONFIG --libs "libcrypto >= 0.9.8" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then OpenSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "libcrypto >= 0.9.8" 2>&1` else OpenSSL_PKG_ERRORS=`$PKG_CONFIG --print-errors "libcrypto >= 0.9.8" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$OpenSSL_PKG_ERRORS" >&5 OpenSSL_LIBS=" -lcrypto "; { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL pkg-config failed, using fallback defaults (${OpenSSL_LIBS})" >&5 $as_echo "$as_me: WARNING: OpenSSL pkg-config failed, using fallback defaults (${OpenSSL_LIBS})" >&2;}; elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } OpenSSL_LIBS=" -lcrypto "; { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL pkg-config failed, using fallback defaults (${OpenSSL_LIBS})" >&5 $as_echo "$as_me: WARNING: OpenSSL pkg-config failed, using fallback defaults (${OpenSSL_LIBS})" >&2;}; else OpenSSL_CFLAGS=$pkg_cv_OpenSSL_CFLAGS OpenSSL_LIBS=$pkg_cv_OpenSSL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi OPENSSL_LIBS="$OpenSSL_LIBS" OPENSSL_CFLAGS="$OpenSSL_CFLAGS" # Detect the Qt libraries and header #################################### # Check whether --with-qt was given. if test "${with_qt+set}" = set; then : withval=$with_qt; if test -d "$withval"; then _QTDIR="$withval" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Qt directory '$withval' does not exist or is not a directory" >&5 $as_echo "$as_me: WARNING: Qt directory '$withval' does not exist or is not a directory" >&2;} fi else _QTDIR="${QTDIR}" fi if test -n "${_QTDIR}" && test -d "${_QTDIR}"; then _QTDIR=`cd ${_QTDIR} && pwd` PKG_CONFIG_PATH="${_QTDIR}/lib/pkgconfig:${PKG_CONFIG_PATH}" LD_LIBRARY_PATH="${_QTDIR}/lib:${LD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="${_QTDIR}/lib:${DYLD_LIBRARY_PATH}" fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5" >&5 $as_echo_n "checking for Qt5... " >&6; } if test -n "$Qt5_CFLAGS"; then pkg_cv_Qt5_CFLAGS="$Qt5_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.0, Qt5Widgets >= 5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.0, Qt5Widgets >= 5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_Qt5_CFLAGS=`$PKG_CONFIG --cflags "Qt5Core >= 5.0, Qt5Widgets >= 5.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$Qt5_LIBS"; then pkg_cv_Qt5_LIBS="$Qt5_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.0, Qt5Widgets >= 5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.0, Qt5Widgets >= 5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_Qt5_LIBS=`$PKG_CONFIG --libs "Qt5Core >= 5.0, Qt5Widgets >= 5.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then Qt5_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "Qt5Core >= 5.0, Qt5Widgets >= 5.0" 2>&1` else Qt5_PKG_ERRORS=`$PKG_CONFIG --print-errors "Qt5Core >= 5.0, Qt5Widgets >= 5.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$Qt5_PKG_ERRORS" >&5 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt4" >&5 $as_echo_n "checking for Qt4... " >&6; } if test -n "$Qt4_CFLAGS"; then pkg_cv_Qt4_CFLAGS="$Qt4_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_Qt4_CFLAGS=`$PKG_CONFIG --cflags "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$Qt4_LIBS"; then pkg_cv_Qt4_LIBS="$Qt4_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_Qt4_LIBS=`$PKG_CONFIG --libs "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then Qt4_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0" 2>&1` else Qt4_PKG_ERRORS=`$PKG_CONFIG --print-errors "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$Qt4_PKG_ERRORS" >&5 if test -z "$DARWIN"; then QT_LIBS=" -lQtCore -lQtGui " else QT_LIBS=" -framework QtGui -framework QtCore " fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Qt pkg-config failed, using fallback defaults (${QT_LIBS})" >&5 $as_echo "$as_me: WARNING: Qt pkg-config failed, using fallback defaults (${QT_LIBS})" >&2;}; elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test -z "$DARWIN"; then QT_LIBS=" -lQtCore -lQtGui " else QT_LIBS=" -framework QtGui -framework QtCore " fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Qt pkg-config failed, using fallback defaults (${QT_LIBS})" >&5 $as_echo "$as_me: WARNING: Qt pkg-config failed, using fallback defaults (${QT_LIBS})" >&2;}; else Qt4_CFLAGS=$pkg_cv_Qt4_CFLAGS Qt4_LIBS=$pkg_cv_Qt4_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } QT_MOC="`pkg-config --variable=moc_location QtCore`" QT_UIC="`pkg-config --variable=uic_location QtCore`" if test -n "${QT_MOC}"; then _QT_HOST_BINS="`dirname ${QT_MOC}`" fi if test -n "$DARWIN"; then FRAMEDIR=`pkg-config --variable=libdir QtCore` Qt4_CFLAGS="$Qt4_CFLAGS -F${FRAMEDIR} -I${FRAMEDIR}/QtCore.framework/Headers -I${FRAMEDIR}/QtGui.framework/Headers" fi QT_VERSION=4 QT_CFLAGS="${Qt4_CFLAGS}" QT_LIBS="${Qt4_LIBS}" fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt4" >&5 $as_echo_n "checking for Qt4... " >&6; } if test -n "$Qt4_CFLAGS"; then pkg_cv_Qt4_CFLAGS="$Qt4_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_Qt4_CFLAGS=`$PKG_CONFIG --cflags "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$Qt4_LIBS"; then pkg_cv_Qt4_LIBS="$Qt4_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_Qt4_LIBS=`$PKG_CONFIG --libs "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then Qt4_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0" 2>&1` else Qt4_PKG_ERRORS=`$PKG_CONFIG --print-errors "QtCore >= 4.6, QtCore < 5.0, QtGui >= 4.6, QtGui < 5.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$Qt4_PKG_ERRORS" >&5 if test -z "$DARWIN"; then QT_LIBS=" -lQtCore -lQtGui " else QT_LIBS=" -framework QtGui -framework QtCore " fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Qt pkg-config failed, using fallback defaults (${QT_LIBS})" >&5 $as_echo "$as_me: WARNING: Qt pkg-config failed, using fallback defaults (${QT_LIBS})" >&2;}; elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test -z "$DARWIN"; then QT_LIBS=" -lQtCore -lQtGui " else QT_LIBS=" -framework QtGui -framework QtCore " fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Qt pkg-config failed, using fallback defaults (${QT_LIBS})" >&5 $as_echo "$as_me: WARNING: Qt pkg-config failed, using fallback defaults (${QT_LIBS})" >&2;}; else Qt4_CFLAGS=$pkg_cv_Qt4_CFLAGS Qt4_LIBS=$pkg_cv_Qt4_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } QT_MOC="`pkg-config --variable=moc_location QtCore`" QT_UIC="`pkg-config --variable=uic_location QtCore`" if test -n "${QT_MOC}"; then _QT_HOST_BINS="`dirname ${QT_MOC}`" fi if test -n "$DARWIN"; then FRAMEDIR=`pkg-config --variable=libdir QtCore` Qt4_CFLAGS="$Qt4_CFLAGS -F${FRAMEDIR} -I${FRAMEDIR}/QtCore.framework/Headers -I${FRAMEDIR}/QtGui.framework/Headers" fi QT_VERSION=4 QT_CFLAGS="${Qt4_CFLAGS}" QT_LIBS="${Qt4_LIBS}" fi else Qt5_CFLAGS=$pkg_cv_Qt5_CFLAGS Qt5_LIBS=$pkg_cv_Qt5_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } _QT_HOST_BINS="`pkg-config --variable=host_bins Qt5Core`" QT_MOC="${_QT_HOST_BINS}/moc" QT_UIC="${_QT_HOST_BINS}/uic" if test -n "$DARWIN"; then FRAMEDIR=`pkg-config --variable=libdir Qt5Core` Qt5_CFLAGS="$Qt5_CFLAGS -F${FRAMEDIR} -I${FRAMEDIR}/QtCore.framework/Headers -I${FRAMEDIR}/QtGui.framework/Headers -I${FRAMEDIR}/QtWdgets.framework/Headers" fi QT_VERSION=5 QT_CFLAGS="${Qt5_CFLAGS} -fPIC" QT_LIBS="${Qt5_LIBS}" fi # Setup MOC UIC RCC LRELEASE with absolute PATH if test "x${QT_MOC}" = "x"; then QT_MOC="`which moc-qt${QT_VERSION} || which moc`" fi if test "x${QT_UIC}" = "x"; then QT_UIC="`which uic-qt${QT_VERSION} || which uic`" fi QT_BIN_PATH="${_QT_HOST_BINS}:$PATH" # Extract the first word of "lrelease-qt${QT_VERSION}", so it can be a program name with args. set dummy lrelease-qt${QT_VERSION}; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_QT_LRELEASEQT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $QT_LRELEASEQT in [\\/]* | ?:[\\/]*) ac_cv_path_QT_LRELEASEQT="$QT_LRELEASEQT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QT_BIN_PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_QT_LRELEASEQT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi QT_LRELEASEQT=$ac_cv_path_QT_LRELEASEQT if test -n "$QT_LRELEASEQT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_LRELEASEQT" >&5 $as_echo "$QT_LRELEASEQT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x${QT_LRELEASEQT}" = "x"; then # Extract the first word of "lrelease", so it can be a program name with args. set dummy lrelease; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_QT_LRELEASE+set}" = set; then : $as_echo_n "(cached) " >&6 else case $QT_LRELEASE in [\\/]* | ?:[\\/]*) ac_cv_path_QT_LRELEASE="$QT_LRELEASE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QT_BIN_PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_QT_LRELEASE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_QT_LRELEASE" && ac_cv_path_QT_LRELEASE="lrelease" ;; esac fi QT_LRELEASE=$ac_cv_path_QT_LRELEASE if test -n "$QT_LRELEASE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_LRELEASE" >&5 $as_echo "$QT_LRELEASE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else QT_LRELEASE="$QT_LRELEASEQT" fi # Extract the first word of "rcc-qt${QT_VERSION}", so it can be a program name with args. set dummy rcc-qt${QT_VERSION}; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_QT_RCCQT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $QT_RCCQT in [\\/]* | ?:[\\/]*) ac_cv_path_QT_RCCQT="$QT_RCCQT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QT_BIN_PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_QT_RCCQT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi QT_RCCQT=$ac_cv_path_QT_RCCQT if test -n "$QT_RCCQT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_RCCQT" >&5 $as_echo "$QT_RCCQT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x${QT_RCCQT}" = "x"; then # Extract the first word of "rcc", so it can be a program name with args. set dummy rcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_QT_RCC+set}" = set; then : $as_echo_n "(cached) " >&6 else case $QT_RCC in [\\/]* | ?:[\\/]*) ac_cv_path_QT_RCC="$QT_RCC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QT_BIN_PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_QT_RCC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_QT_RCC" && ac_cv_path_QT_RCC="rcc" ;; esac fi QT_RCC=$ac_cv_path_QT_RCC if test -n "$QT_RCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_RCC" >&5 $as_echo "$QT_RCC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else QT_RCC="$QT_RCCQT" fi if test -n "$DARWIN"; then # Extract the first word of "macdeployqt", so it can be a program name with args. set dummy macdeployqt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MACDEPLOYQT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MACDEPLOYQT in [\\/]* | ?:[\\/]*) ac_cv_path_MACDEPLOYQT="$MACDEPLOYQT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $QT_BIN_PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MACDEPLOYQT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_MACDEPLOYQT" && ac_cv_path_MACDEPLOYQT="macdeployqt" ;; esac fi MACDEPLOYQT=$ac_cv_path_MACDEPLOYQT if test -n "$MACDEPLOYQT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MACDEPLOYQT" >&5 $as_echo "$MACDEPLOYQT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # The dyn_loader library libltdl ################################## { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lt_dlopen in -lltdl" >&5 $as_echo_n "checking for lt_dlopen in -lltdl... " >&6; } if test "${ac_cv_lib_ltdl_lt_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lltdl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lt_dlopen (); int main () { return lt_dlopen (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_ltdl_lt_dlopen=yes else ac_cv_lib_ltdl_lt_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ltdl_lt_dlopen" >&5 $as_echo "$ac_cv_lib_ltdl_lt_dlopen" >&6; } if test "x$ac_cv_lib_ltdl_lt_dlopen" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBLTDL 1 _ACEOF LIBS="-lltdl $LIBS" else echo "ERROR: Library 'ltdl' with symbol 'lt_dlopen' not found." echo " Try installing the package 'libltdl-dev' or 'libtool'" exit 1 fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5 ; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <float.h> int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ctype.h> #include <stdlib.h> #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_cxx_check_header_mongrel "$LINENO" "ltdl.h" "ac_cv_header_ltdl_h" "$ac_includes_default" if test "x$ac_cv_header_ltdl_h" = x""yes; then : else echo "ERROR: Header 'ltdl.h' not found." echo " Try installing the package 'libltdl-dev' or 'libtool'" exit 1 fi # Finally collect the compiler flags ##################################### CXXFLAGS="${CXXFLAGS} ${OPENSSL_CFLAGS} ${QT_CFLAGS}" LIBS="${LIBS} ${OPENSSL_LIBS} ${QT_LIBS}" # Just give it a try ..... ########################## # Try to compile a little application ##################################### if test "$cross_compiling" = yes; then : echo "Skipping the compile test because of cross-compiling" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdio.h> #include <string.h> #include <ltdl.h> #include <openssl/opensslv.h> #include <openssl/opensslconf.h> #include <openssl/crypto.h> #include <openssl/objects.h> #include <qglobal.h> #define C "configure: " #define WARN C"###################### WARNING ######################\n" int main(){ char buf[2048] = ""; int r = lt_dlinit(); printf(C"The Versions of the used libraries are:\n" C"Header:\n" C"\t%s 0x%lxL\n" C"\tQT: %s\n" C"Libraries:\n" C"\t%s\n" C"\tQT: %s\n", OPENSSL_VERSION_TEXT, OPENSSL_VERSION_NUMBER, QT_VERSION_STR, SSLeay_version(SSLEAY_VERSION), qVersion() ); if (strcmp(QT_VERSION_STR, qVersion())) strcat(buf, C"The versions of the QT headers and library differ\n"); if (strcmp(OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION))) strcat(buf, C"The versions of the OpenSSL headers and library differ\n"); if (r) strcat(buf, C"lt_dlinit() returned != 0\n"); #ifdef OPENSSL_NO_EC strcat(buf, C"This OpenSSL installation has no EC cryptography support\n"); #else #ifdef NID_brainpoolP160r1 printf(C"ECC With RFC 5639 Brainpool curves enabled\n" #if OPENSSL_VERSION_NUMBER < 0x10002001L C" (Backported to " OPENSSL_VERSION_TEXT ")\n" #endif ); #endif #endif if (*buf) printf(WARN "%s" WARN, buf); return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else echo "Unable to execute a freshly compiled application, maybe you have to adjust your LD_LIBRARY_PATH or /etc/ld.so.conf" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU make" >&5 $as_echo_n "checking for GNU make... " >&6; } if test "${_cv_gnu_make_command+set}" = set; then : $as_echo_n "(cached) " >&6 else _cv_gnu_make_command='' ; for a in "$MAKE" make gmake gnumake ; do if test -z "$a" ; then continue ; fi ; if ( sh -c "$a --version" 2> /dev/null | grep GNU 2>&1 > /dev/null ) ; then _cv_gnu_make_command=$a ; break; fi done ; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_gnu_make_command" >&5 $as_echo "$_cv_gnu_make_command" >&6; } ; if test "x$_cv_gnu_make_command" != "x" ; then mak="`which ${_cv_gnu_make_command}`" { $as_echo "$as_me:${as_lineno-$LINENO}: A usable 'make' executable was found in ${mak}" >&5 $as_echo "$as_me: A usable 'make' executable was found in ${mak}" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No usable 'make' executable found." >&5 $as_echo "$as_me: WARNING: No usable 'make' executable found." >&2;} fi # linuxdoc application detection ################################## for ac_prog in linuxdoc sgml2html do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DOCTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DOCTOOL"; then ac_cv_prog_DOCTOOL="$DOCTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DOCTOOL="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DOCTOOL=$ac_cv_prog_DOCTOOL if test -n "$DOCTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOCTOOL" >&5 $as_echo "$DOCTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DOCTOOL" && break done test -n "$DOCTOOL" || DOCTOOL="":"" case "$DOCTOOL" in linuxdoc) DOCTOOL="linuxdoc -B html";; sgml2html) DOCTOOL="sgml2html -s 1";; :) if test "${srcdir}" != "."; then mkdir -p doc cp ${srcdir}/doc/xca-doc.tgz doc/ fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'linuxdoc' or 'sgml2html' not found, using pre-compiled documentation" >&5 $as_echo "$as_me: WARNING: 'linuxdoc' or 'sgml2html' not found, using pre-compiled documentation" >&2;} ;; esac # Setup done. Write local.h and Local.mak ############################################ ac_config_headers="$ac_config_headers local.h" ac_config_links="$ac_config_links Makefile:Makefile" ac_config_files="$ac_config_files Local.mak" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by X Certificate and Key management $as_me 1.3.2, which was generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_links="$ac_config_links" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration links: $config_links Report bugs to <christian@hohnstaedt.de>. X Certificate and Key management home page: <http://xca.hohnstaedt.de>." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ X Certificate and Key management config.status 1.3.2 configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "local.h") CONFIG_HEADERS="$CONFIG_HEADERS local.h" ;; "Makefile") CONFIG_LINKS="$CONFIG_LINKS Makefile:Makefile" ;; "Local.mak") CONFIG_FILES="$CONFIG_FILES Local.mak" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' <conf$$subs.awk | sed ' /^[^""]/{ N s/\n// } ' >>$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' <confdefs.h | sed ' s/'"$ac_delim"'/"\\\ "/g' >>$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; :L) # # CONFIG_LINK # if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then : else # Prefer the file from the source tree if names are identical. if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then ac_source=$srcdir/$ac_source fi { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} if test ! -r "$ac_source"; then as_fn_error $? "$ac_source: file not found" "$LINENO" 5 fi rm -f "$ac_file" # Try a relative symlink, then a hard link, then a copy. case $ac_source in [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; *) ac_rel_source=$ac_top_build_prefix$ac_source ;; esac ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || ln "$ac_source" "$ac_file" 2>/dev/null || cp -p "$ac_source" "$ac_file" || as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������